@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":"artifacts.js","sources":["../../../../src/features/design/doc/artifacts.ts"],"sourcesContent":["/**\n * Saved designs - native twin of canvas-surface `state/artifacts.ts` for the\n * two kinds the Design Studio writes (`deck`, `flyer`).\n *\n * One SurfaceChannel row per design on the `canvas` surface, keyed\n * `<kind>:<uuid>`, the whole `{ artifact }` in `metadata`. That is exactly\n * what the web Design Studio writes and lists, so a design saved on the phone\n * is in the web's \"Recent designs\" and the reverse.\n *\n * `registerSurfaceChannel` is the idempotent upsert and `metadata` is replaced\n * wholesale: a save sends the complete artifact, never a patch. Reads are\n * best-effort (an error string, never a throw) like `canvas/surfaceIndex.ts`.\n *\n * Pure apart from `fetch`: runs under jest as-is.\n */\nimport { artifactTitle, type CanvasArtifactKind, type DesignDoc, type DesignKind } from './types';\n\nexport const DESIGN_KINDS: readonly DesignKind[] = ['deck', 'flyer'];\n\n/** One saved design (web `CanvasArtifact<CarouselDoc>`). */\nexport interface DesignArtifact {\n /** Row id AND artifact id: `<kind>:<uuid>`. */\n id: string;\n kind: DesignKind;\n sessionId?: string;\n title: string;\n updatedAt: number;\n doc: DesignDoc;\n /** First page as an image, for a grid tile - written by web; native keeps it through saves. */\n thumbUrl?: string;\n exportUrl?: string;\n}\n\nexport interface IndexOptions {\n url: string;\n token?: string | null;\n signal?: AbortSignal;\n}\n\nfunction uuid(): string {\n const bytes = new Uint8Array(16);\n let filled = false;\n try {\n (globalThis.crypto as Crypto | undefined)?.getRandomValues?.(bytes);\n filled = bytes.some((b) => b !== 0);\n } catch {\n filled = false;\n }\n if (!filled) for (let i = 0; i < 16; i += 1) bytes[i] = Math.floor(Math.random() * 256);\n bytes[6] = (bytes[6] & 0x0f) | 0x40;\n bytes[8] = (bytes[8] & 0x3f) | 0x80;\n const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, '0')).join('');\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n}\n\n/** Mint an artifact id. The kind rides in the id, so a row classifies without decoding its metadata. */\nexport function newArtifactId(kind: CanvasArtifactKind): string {\n return `${kind}:${uuid()}`;\n}\n\n/** Is this a saved-design id (`deck:…` / `flyer:…`), as a link or chat card carries it? */\nexport function isDesignArtifactId(id: unknown): id is string {\n return typeof id === 'string' && /^(deck|flyer):[0-9A-Za-z-]{8,}$/.test(id.trim());\n}\n\n/** Is this a rich-text doc id (`doc:…`, the web docs editor's rows)? Docs are not designs: they open in the docs editor. */\nexport function isDocArtifactId(id: unknown): id is string {\n return typeof id === 'string' && /^doc:[0-9A-Za-z-]{8,}$/.test(id.trim());\n}\n\nconst stripDataUrl = (src: string | null | undefined): string | null => (src && !src.startsWith('data:') ? src : null);\n\n/**\n * The document as a save writes it (web `slimDoc`): no inline data: images,\n * no page rasters - the index body is capped, and a phone's local file URI\n * means nothing on another device.\n */\nexport function slimDoc(doc: DesignDoc): DesignDoc {\n const hosted = (src: string | null | undefined) => {\n const kept = stripDataUrl(src);\n return kept && !/^(file|ph|assets-library|content):/i.test(kept) ? kept : null;\n };\n return {\n ...doc,\n brandKit: doc.brandKit\n ? { ...doc.brandKit, logos: doc.brandKit.logos.filter((l) => !l.startsWith('data:')) }\n : undefined,\n pages: doc.pages.map((p) => ({\n ...p,\n dataBase64: undefined,\n src: hosted(p.src),\n status: p.status === 'generating' ? 'empty' : p.src && p.src.startsWith('data:') ? 'empty' : p.status,\n background: p.background\n ? {\n ...p.background,\n src: hosted(p.background.src),\n imageStatus: hosted(p.background.src) ? p.background.imageStatus : 'empty',\n }\n : undefined,\n layers: p.layers?.map((l) =>\n l.kind === 'image'\n ? {\n ...l,\n src: hosted(l.src),\n imageStatus: hosted(l.src) ? l.imageStatus : 'empty',\n uploadError: undefined,\n }\n : l,\n ),\n })),\n };\n}\n\n/** Does a document still hold a picture only this phone can see (an upload that has not finished)? */\nexport function hasLocalMedia(doc: DesignDoc): boolean {\n const local = (src: string | null | undefined) =>\n Boolean(src && /^(file|ph|assets-library|content|data):/i.test(src));\n return doc.pages.some(\n (p) => local(p.background?.src) || (p.layers ?? []).some((l) => l.kind === 'image' && local(l.src)),\n );\n}\n\n/** `metadata` arrives decoded, or as text from a backend that types it a String. */\nexport function decodeMetadata(value: unknown): unknown {\n if (typeof value !== 'string') return value;\n try {\n return JSON.parse(value);\n } catch {\n return null;\n }\n}\n\n/** Validate a decoded row (untrusted JSON from the index); null for anything but a design. */\nexport function coerceDesignArtifact(metadata: unknown): DesignArtifact | null {\n const meta = decodeMetadata(metadata) as { artifact?: DesignArtifact } | null;\n const artifact = meta?.artifact;\n if (!artifact || typeof artifact.id !== 'string' || !artifact.id) return null;\n if (!DESIGN_KINDS.includes(artifact.kind)) return null;\n const doc = artifact.doc as DesignDoc | undefined;\n if (!doc || !Array.isArray(doc.pages) || !(doc.pageWidth > 0) || !(doc.pageHeight > 0)) return null;\n return artifact;\n}\n\n/** Build the row a save writes. */\nexport function buildDesignArtifact(\n id: string,\n kind: DesignKind,\n doc: DesignDoc,\n keep: Pick<DesignArtifact, 'sessionId' | 'thumbUrl' | 'exportUrl'> = {},\n now: number = Date.now(),\n): DesignArtifact {\n const slim = slimDoc(doc);\n return {\n id,\n kind,\n ...(keep.sessionId ? { sessionId: keep.sessionId } : {}),\n title: artifactTitle(slim),\n updatedAt: now,\n doc: slim,\n ...(keep.thumbUrl ? { thumbUrl: keep.thumbUrl } : {}),\n ...(keep.exportUrl ? { exportUrl: keep.exportUrl } : {}),\n };\n}\n\nexport interface GqlResult<T> {\n data: T | null;\n error: string | null;\n}\n\n/** One GraphQL call to the index (shared with `features/docs/docArtifacts`). */\nexport async function gql<T>(\n opts: IndexOptions,\n query: string,\n variables: Record<string, unknown>,\n): Promise<GqlResult<T>> {\n if (!opts.url) return { data: null, error: 'No design index configured for this build.' };\n try {\n const response = await fetch(opts.url, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n ...(opts.token ? { authorization: `Bearer ${opts.token}` } : {}),\n },\n body: JSON.stringify({ query, variables }),\n signal: opts.signal,\n });\n if (response.status === 401 || response.status === 403) {\n return { data: null, error: 'Your session expired. Sign in again to see your designs.' };\n }\n if (response.status === 413) {\n return { data: null, error: 'This design is too big to save. Remove a few pictures or pages.' };\n }\n if (!response.ok) return { data: null, error: `The design index is unreachable (HTTP ${response.status}).` };\n const payload = (await response.json()) as { data?: T; errors?: Array<{ message?: string }> };\n if (payload?.errors?.length) {\n const raw = payload.errors[0]?.message || '';\n const isAuth = /tenantid|unauthenticated|unauthorized|not authorised|forbidden/i.test(raw);\n return {\n data: null,\n error: isAuth ? 'Your session expired. Sign in again to see your designs.' : raw || 'Request rejected.',\n };\n }\n return { data: payload?.data ?? null, error: null };\n } catch (err) {\n if (err instanceof Error && err.name === 'AbortError') return { data: null, error: null };\n return { data: null, error: 'Could not reach the design index. Check your connection.' };\n }\n}\n\nconst ROW_FIELDS = 'channelId title metadata updatedAt';\n\n/** Write one design (web `saveArtifact`). `ok: false` is lost work: say so. */\nexport async function saveDesignArtifact(\n opts: IndexOptions,\n artifact: DesignArtifact,\n): Promise<{ ok: boolean; error: string | null }> {\n const { data, error } = await gql<{ registerSurfaceChannel?: { channelId?: string } | null }>(\n opts,\n `mutation RegisterSurfaceChannel($input: RegisterSurfaceChannelInput!) {\n registerSurfaceChannel(input: $input) { ${ROW_FIELDS} }\n }`,\n {\n input: {\n surface: 'canvas',\n channelId: artifact.id,\n // Top-level AND inside the payload: the column is what lists filter on\n // server-side, the metadata copy is what the reader validates.\n ...(artifact.sessionId ? { sessionId: artifact.sessionId } : {}),\n ...(artifact.title ? { title: artifact.title } : {}),\n metadata: { artifact },\n },\n },\n );\n if (error) return { ok: false, error };\n return data?.registerSurfaceChannel?.channelId\n ? { ok: true, error: null }\n : { ok: false, error: 'Could not save. Recent edits are not stored yet.' };\n}\n\ninterface ChannelsPage {\n surfaceChannels?: { data?: Array<Record<string, unknown>> | null; totalCount?: number } | null;\n}\n\nexport async function channelsMatching(\n opts: IndexOptions,\n search: string,\n limit: number,\n): Promise<{ rows: Array<Record<string, unknown>>; total: number; error: string | null }> {\n const { data, error } = await gql<ChannelsPage>(\n opts,\n `query SurfaceChannels($filter: SurfaceChannelFilter, $offset: Int, $limit: Int) {\n surfaceChannels(filter: $filter, offset: $offset, limit: $limit) { data { ${ROW_FIELDS} } totalCount }\n }`,\n { filter: { surface: 'canvas', search }, offset: 0, limit },\n );\n const page = data?.surfaceChannels;\n return { rows: page?.data ?? [], total: page?.totalCount ?? 0, error };\n}\n\nexport interface DesignListResult {\n designs: DesignArtifact[];\n /** A kind had rows past `limit`. */\n more: boolean;\n error: string | null;\n}\n\n/**\n * The caller's designs, newest first (web `listArtifactsOfKinds(['deck', 'flyer'])`):\n * `search: '<kind>:'` narrows each kind server-side; the kind is checked again\n * here because the search also matches titles.\n */\nexport async function listDesignArtifacts(opts: IndexOptions, limit = 24): Promise<DesignListResult> {\n const pages = await Promise.all(DESIGN_KINDS.map((kind) => channelsMatching(opts, `${kind}:`, limit)));\n const designs: DesignArtifact[] = [];\n for (const [i, page] of pages.entries()) {\n for (const row of page.rows) {\n const artifact = coerceDesignArtifact(row.metadata);\n if (artifact?.kind === DESIGN_KINDS[i] && artifact.id === row.channelId) designs.push(artifact);\n }\n }\n designs.sort((a, b) => (b.updatedAt ?? 0) - (a.updatedAt ?? 0));\n const error = designs.length === 0 ? (pages.find((p) => p.error)?.error ?? null) : null;\n return {\n designs: designs.slice(0, limit),\n more: pages.some((p) => p.total > limit) || designs.length > limit,\n error,\n };\n}\n\n/**\n * One of the CALLER'S OWN designs (web `loadOwnedArtifact`): the list is\n * scoped server-side to the bearer, the single-row read is not - so an id\n * from outside (a link, a chat card) opens only when the list returns it.\n */\nexport async function loadOwnedDesignArtifact(\n opts: IndexOptions,\n id: string,\n): Promise<{ artifact: DesignArtifact | null; error: string | null }> {\n if (!isDesignArtifactId(id)) return { artifact: null, error: null };\n const page = await channelsMatching(opts, id.trim(), 5);\n const row = page.rows.find((r) => r.channelId === id.trim());\n if (!row) return { artifact: null, error: page.error };\n const artifact = coerceDesignArtifact(row.metadata);\n return { artifact: artifact && artifact.id === id.trim() ? artifact : null, error: null };\n}\n\n/** Hard-delete one design row (its exported files in storage are not touched). */\nexport async function deleteDesignArtifact(opts: IndexOptions, id: string): Promise<boolean> {\n const { data } = await gql<{ deleteSurfaceChannel?: boolean | null }>(\n opts,\n `mutation DeleteSurfaceChannel($surface: SurfaceType!, $channelId: String!) {\n deleteSurfaceChannel(surface: $surface, channelId: $channelId)\n }`,\n { surface: 'canvas', channelId: id },\n );\n return Boolean(data?.deleteSurfaceChannel);\n}\n"],"names":["_a","_b"],"mappings":"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"}
@@ -0,0 +1,98 @@
1
+ const num = (v) => {
2
+ const n = typeof v === "number" ? v : Number(v);
3
+ return Number.isFinite(n) ? n : 0;
4
+ };
5
+ function readChartData(layer) {
6
+ var _a, _b, _c;
7
+ const legacy = (_a = layer.data) != null ? _a : [];
8
+ const rawCats = ((_b = layer.categories) == null ? void 0 : _b.length) ? layer.categories : legacy.map((d) => {
9
+ var _a2;
10
+ return String((_a2 = d == null ? void 0 : d.label) != null ? _a2 : "");
11
+ });
12
+ const rawSeries = ((_c = layer.series) == null ? void 0 : _c.length) ? layer.series : [{
13
+ name: "",
14
+ values: legacy.map((d) => num(d == null ? void 0 : d.value))
15
+ }];
16
+ const len = Math.max(rawCats.length, ...rawSeries.map((s) => {
17
+ var _a2, _b2;
18
+ return (_b2 = (_a2 = s.values) == null ? void 0 : _a2.length) != null ? _b2 : 0;
19
+ }), 0);
20
+ return {
21
+ categories: Array.from({
22
+ length: len
23
+ }, (_, i) => {
24
+ var _a2;
25
+ return (_a2 = rawCats[i]) != null ? _a2 : "";
26
+ }),
27
+ series: rawSeries.map((s) => {
28
+ var _a2;
29
+ return {
30
+ name: (_a2 = s.name) != null ? _a2 : "",
31
+ values: Array.from({
32
+ length: len
33
+ }, (_, i) => {
34
+ var _a3;
35
+ return num((_a3 = s.values) == null ? void 0 : _a3[i]);
36
+ })
37
+ };
38
+ })
39
+ };
40
+ }
41
+ function chartMax(data, stacked) {
42
+ var _a;
43
+ let max = 0;
44
+ for (let i = 0; i < data.categories.length; i += 1) {
45
+ if (stacked) max = Math.max(max, data.series.reduce((sum, s) => {
46
+ var _a2;
47
+ return sum + Math.max(0, (_a2 = s.values[i]) != null ? _a2 : 0);
48
+ }, 0));
49
+ else for (const s of data.series) max = Math.max(max, (_a = s.values[i]) != null ? _a : 0);
50
+ }
51
+ return max > 0 ? max : 1;
52
+ }
53
+ function pieSlices(values) {
54
+ const positive = values.map((v) => Math.max(0, v));
55
+ const total = positive.reduce((a, b) => a + b, 0);
56
+ if (total <= 0) return [];
57
+ let at = 0;
58
+ return positive.map((v, index) => {
59
+ const sweep = v / total * Math.PI * 2;
60
+ const slice = {
61
+ start: at,
62
+ sweep,
63
+ index
64
+ };
65
+ at += sweep;
66
+ return slice;
67
+ });
68
+ }
69
+ function slicePath(cx, cy, r, start, sweep, inner = 0) {
70
+ const pt = (radius, a) => [cx + radius * Math.sin(a), cy - radius * Math.cos(a)];
71
+ const s = Math.min(sweep, Math.PI * 2 - 1e-4);
72
+ const large = s > Math.PI ? 1 : 0;
73
+ const [x0, y0] = pt(r, start);
74
+ const [x1, y1] = pt(r, start + s);
75
+ if (inner <= 0) return `M${cx} ${cy}L${x0} ${y0}A${r} ${r} 0 ${large} 1 ${x1} ${y1}Z`;
76
+ const [x2, y2] = pt(inner, start + s);
77
+ const [x3, y3] = pt(inner, start);
78
+ return `M${x0} ${y0}A${r} ${r} 0 ${large} 1 ${x1} ${y1}L${x2} ${y2}A${inner} ${inner} 0 ${large} 0 ${x3} ${y3}Z`;
79
+ }
80
+ function writeChartData(data) {
81
+ var _a, _b;
82
+ const first = (_b = (_a = data.series[0]) == null ? void 0 : _a.values) != null ? _b : [];
83
+ return {
84
+ categories: [...data.categories],
85
+ series: data.series.map((s) => ({
86
+ name: s.name,
87
+ values: [...s.values]
88
+ })),
89
+ data: data.categories.map((label, i) => ({
90
+ label,
91
+ value: num(first[i])
92
+ }))
93
+ };
94
+ }
95
+ function parseCell(text) {
96
+ const n = Number(text.replace(/[\s,]/g, ""));
97
+ return Number.isFinite(n) ? n : 0;
98
+ }export{chartMax,parseCell,pieSlices,readChartData,slicePath,writeChartData};//# sourceMappingURL=chart.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chart.js","sources":["../../../../src/features/design/doc/chart.ts"],"sourcesContent":["/**\n * Chart data as the renderer reads it - native twin of canvas-surface\n * `utils/chart.ts` `readChartData`: `categories`/`series` when present, else\n * the legacy single-series `data` rows, and `writeChartData` for the chart\n * data sheet (editor/ChartDataPanel.tsx).\n *\n * Pure: runs under jest as-is.\n */\nimport type { ChartLayer } from './types';\n\nexport interface ChartData {\n categories: string[];\n series: { name: string; values: number[] }[];\n}\n\nconst num = (v: unknown): number => {\n const n = typeof v === 'number' ? v : Number(v);\n return Number.isFinite(n) ? n : 0;\n};\n\nexport function readChartData(layer: Pick<ChartLayer, 'data' | 'categories' | 'series'>): ChartData {\n const legacy = layer.data ?? [];\n const rawCats = layer.categories?.length ? layer.categories : legacy.map((d) => String(d?.label ?? ''));\n const rawSeries = layer.series?.length ? layer.series : [{ name: '', values: legacy.map((d) => num(d?.value)) }];\n const len = Math.max(rawCats.length, ...rawSeries.map((s) => s.values?.length ?? 0), 0);\n return {\n categories: Array.from({ length: len }, (_, i) => rawCats[i] ?? ''),\n series: rawSeries.map((s) => ({\n name: s.name ?? '',\n values: Array.from({ length: len }, (_, i) => num(s.values?.[i])),\n })),\n };\n}\n\n/** The largest value an axis has to reach: per bar, or per stacked column. */\nexport function chartMax(data: ChartData, stacked: boolean): number {\n let max = 0;\n for (let i = 0; i < data.categories.length; i += 1) {\n if (stacked)\n max = Math.max(\n max,\n data.series.reduce((sum, s) => sum + Math.max(0, s.values[i] ?? 0), 0),\n );\n else for (const s of data.series) max = Math.max(max, s.values[i] ?? 0);\n }\n return max > 0 ? max : 1;\n}\n\n/** Pie / donut slices of the first series: start and sweep in radians, clockwise from 12 o'clock. */\nexport function pieSlices(values: readonly number[]): Array<{ start: number; sweep: number; index: number }> {\n const positive = values.map((v) => Math.max(0, v));\n const total = positive.reduce((a, b) => a + b, 0);\n if (total <= 0) return [];\n let at = 0;\n return positive.map((v, index) => {\n const sweep = (v / total) * Math.PI * 2;\n const slice = { start: at, sweep, index };\n at += sweep;\n return slice;\n });\n}\n\n/** An SVG arc path for one slice of a circle of radius `r` at (cx, cy); `inner` > 0 makes a donut ring. */\nexport function slicePath(cx: number, cy: number, r: number, start: number, sweep: number, inner = 0): string {\n const pt = (radius: number, a: number) => [cx + radius * Math.sin(a), cy - radius * Math.cos(a)];\n // A full circle cannot be one arc; draw it a hair short.\n const s = Math.min(sweep, Math.PI * 2 - 1e-4);\n const large = s > Math.PI ? 1 : 0;\n const [x0, y0] = pt(r, start);\n const [x1, y1] = pt(r, start + s);\n if (inner <= 0) return `M${cx} ${cy}L${x0} ${y0}A${r} ${r} 0 ${large} 1 ${x1} ${y1}Z`;\n const [x2, y2] = pt(inner, start + s);\n const [x3, y3] = pt(inner, start);\n return `M${x0} ${y0}A${r} ${r} 0 ${large} 1 ${x1} ${y1}L${x2} ${y2}A${inner} ${inner} 0 ${large} 0 ${x3} ${y3}Z`;\n}\n\n/** The fields a data edit writes (web `writeChartData`): series 0 mirrored into `data` for older readers. */\nexport function writeChartData(data: ChartData): Pick<ChartLayer, 'categories' | 'series' | 'data'> {\n const first = data.series[0]?.values ?? [];\n return {\n categories: [...data.categories],\n series: data.series.map((s) => ({ name: s.name, values: [...s.values] })),\n data: data.categories.map((label, i) => ({ label, value: num(first[i]) })),\n };\n}\n\n/** A typed cell as a number: commas and spaces dropped; anything unreadable is 0. */\nexport function parseCell(text: string): number {\n const n = Number(text.replace(/[\\s,]/g, ''));\n return Number.isFinite(n) ? n : 0;\n}\n"],"names":["_a","_b"],"mappings":"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"}
@@ -0,0 +1,104 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defProps = Object.defineProperties;
3
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
7
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
+ var __spreadValues = (a, b) => {
9
+ for (var prop in b || (b = {}))
10
+ if (__hasOwnProp.call(b, prop))
11
+ __defNormalProp(a, prop, b[prop]);
12
+ if (__getOwnPropSymbols)
13
+ for (var prop of __getOwnPropSymbols(b)) {
14
+ if (__propIsEnum.call(b, prop))
15
+ __defNormalProp(a, prop, b[prop]);
16
+ }
17
+ return a;
18
+ };
19
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
+ const FULL = {
21
+ x: 0,
22
+ y: 0,
23
+ w: 1,
24
+ h: 1
25
+ };
26
+ const MIN_SIDE = 16;
27
+ const clamp = (v, lo, hi) => Math.min(hi, Math.max(lo, v));
28
+ function displayCrop(c, flipX, flipY) {
29
+ return {
30
+ x: flipX ? 1 - c.x - c.w : c.x,
31
+ y: flipY ? 1 - c.y - c.h : c.y,
32
+ w: c.w,
33
+ h: c.h
34
+ };
35
+ }
36
+ function cropStart(box, crop, flipX, flipY) {
37
+ const c = displayCrop(crop != null ? crop : FULL, flipX, flipY);
38
+ const w = box.w / c.w;
39
+ const h = box.h / c.h;
40
+ return {
41
+ img: {
42
+ x: box.x - c.x * w,
43
+ y: box.y - c.y * h,
44
+ w,
45
+ h
46
+ },
47
+ win: __spreadValues({}, box)
48
+ };
49
+ }
50
+ function cropPan({
51
+ img,
52
+ win
53
+ }, dx, dy) {
54
+ const x = clamp(img.x + dx, win.x + win.w - img.w, win.x);
55
+ const y = clamp(img.y + dy, win.y + win.h - img.h, win.y);
56
+ return {
57
+ img: __spreadProps(__spreadValues({}, img), {
58
+ x,
59
+ y
60
+ }),
61
+ win
62
+ };
63
+ }
64
+ function cropResize({
65
+ img,
66
+ win
67
+ }, handle, dx, dy) {
68
+ let l = win.x;
69
+ let t = win.y;
70
+ let r = win.x + win.w;
71
+ let b = win.y + win.h;
72
+ if (handle.includes("w")) l = clamp(l + dx, img.x, r - MIN_SIDE);
73
+ if (handle.includes("e")) r = clamp(r + dx, l + MIN_SIDE, img.x + img.w);
74
+ if (handle.includes("n")) t = clamp(t + dy, img.y, b - MIN_SIDE);
75
+ if (handle.includes("s")) b = clamp(b + dy, t + MIN_SIDE, img.y + img.h);
76
+ return {
77
+ img,
78
+ win: {
79
+ x: l,
80
+ y: t,
81
+ w: r - l,
82
+ h: b - t
83
+ }
84
+ };
85
+ }
86
+ function cropCommit({
87
+ img,
88
+ win
89
+ }, pageW, pageH, flipX, flipY) {
90
+ const d = {
91
+ x: (win.x - img.x) / img.w,
92
+ y: (win.y - img.y) / img.h,
93
+ w: win.w / img.w,
94
+ h: win.h / img.h
95
+ };
96
+ const full = d.x < 1e-3 && d.y < 1e-3 && d.w > 1 - 1e-3 && d.h > 1 - 1e-3;
97
+ return {
98
+ x: win.x / pageW,
99
+ y: win.y / pageH,
100
+ w: win.w / pageW,
101
+ h: win.h / pageH,
102
+ crop: full ? void 0 : displayCrop(d, flipX, flipY)
103
+ };
104
+ }export{cropCommit,cropPan,cropResize,cropStart,displayCrop};//# sourceMappingURL=crop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crop.js","sources":["../../../../src/features/design/doc/crop.ts"],"sourcesContent":["/**\n * Crop mode geometry in page px - native twin of canvas-surface\n * `carousel-editor/utils/crop.ts`: `img` is the whole image, `win` the frame\n * that shows part of it.\n *\n * Pure: runs under jest as-is.\n */\nimport type { Rect } from './types';\n\nexport interface CropState {\n img: Rect;\n win: Rect;\n}\n\nexport type CropHandle = 'nw' | 'n' | 'ne' | 'e' | 'se' | 's' | 'sw' | 'w';\n\nconst FULL: Rect = { x: 0, y: 0, w: 1, h: 1 };\n/** Smallest frame side, in page px. */\nconst MIN_SIDE = 16;\n\nconst clamp = (v: number, lo: number, hi: number) => Math.min(hi, Math.max(lo, v));\n\n/** Source crop <-> what the frame shows; a flipped layer mirrors its source. Self-inverse. */\nexport function displayCrop(c: Rect, flipX?: boolean, flipY?: boolean): Rect {\n return { x: flipX ? 1 - c.x - c.w : c.x, y: flipY ? 1 - c.y - c.h : c.y, w: c.w, h: c.h };\n}\n\nexport function cropStart(box: Rect, crop: Rect | undefined, flipX?: boolean, flipY?: boolean): CropState {\n const c = displayCrop(crop ?? FULL, flipX, flipY);\n const w = box.w / c.w;\n const h = box.h / c.h;\n return { img: { x: box.x - c.x * w, y: box.y - c.y * h, w, h }, win: { ...box } };\n}\n\n/** Pan the image under a fixed frame without uncovering it. */\nexport function cropPan({ img, win }: CropState, dx: number, dy: number): CropState {\n const x = clamp(img.x + dx, win.x + win.w - img.w, win.x);\n const y = clamp(img.y + dy, win.y + win.h - img.h, win.y);\n return { img: { ...img, x, y }, win };\n}\n\n/** Drag a frame edge or corner, staying inside the image. */\nexport function cropResize({ img, win }: CropState, handle: CropHandle, dx: number, dy: number): CropState {\n let l = win.x;\n let t = win.y;\n let r = win.x + win.w;\n let b = win.y + win.h;\n if (handle.includes('w')) l = clamp(l + dx, img.x, r - MIN_SIDE);\n if (handle.includes('e')) r = clamp(r + dx, l + MIN_SIDE, img.x + img.w);\n if (handle.includes('n')) t = clamp(t + dy, img.y, b - MIN_SIDE);\n if (handle.includes('s')) b = clamp(b + dy, t + MIN_SIDE, img.y + img.h);\n return { img, win: { x: l, y: t, w: r - l, h: b - t } };\n}\n\n/** The layer patch: the frame becomes the box; `crop` is undefined when the whole image shows. */\nexport function cropCommit(\n { img, win }: CropState,\n pageW: number,\n pageH: number,\n flipX?: boolean,\n flipY?: boolean,\n): Rect & { crop: Rect | undefined } {\n const d = { x: (win.x - img.x) / img.w, y: (win.y - img.y) / img.h, w: win.w / img.w, h: win.h / img.h };\n const full = d.x < 1e-3 && d.y < 1e-3 && d.w > 1 - 1e-3 && d.h > 1 - 1e-3;\n return {\n x: win.x / pageW,\n y: win.y / pageH,\n w: win.w / pageW,\n h: win.h / pageH,\n crop: full ? undefined : displayCrop(d, flipX, flipY),\n };\n}\n\n/** The centred crop that fills a box with an image of another shape; undefined when the shapes match. */\nexport function coverCrop(imgW: number, imgH: number, boxW: number, boxH: number): Rect | undefined {\n if (!(imgW > 0 && imgH > 0 && boxW > 0 && boxH > 0)) return undefined;\n const imgAspect = imgW / imgH;\n const boxAspect = boxW / boxH;\n if (Math.abs(imgAspect / boxAspect - 1) < 1e-3) return undefined;\n if (imgAspect > boxAspect) {\n const w = boxAspect / imgAspect;\n return { x: (1 - w) / 2, y: 0, w, h: 1 };\n }\n const h = imgAspect / boxAspect;\n return { x: 0, y: (1 - h) / 2, w: 1, h };\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import {curveAngle}from'./textEffects.js';function curveArc(total, curve, ascent, descent) {
2
+ const turn = curveAngle(curve);
3
+ if (!turn || !(total > 0)) return null;
4
+ const r = total / turn;
5
+ const half = turn / 2;
6
+ const sign = (curve != null ? curve : 0) > 0 ? 1 : -1;
7
+ const at = (phi) => ({
8
+ x: r * Math.sin(phi),
9
+ y: sign * r * (1 - Math.cos(phi))
10
+ });
11
+ const up = (phi) => sign > 0 ? {
12
+ x: Math.sin(phi),
13
+ y: -Math.cos(phi)
14
+ } : {
15
+ x: -Math.sin(phi),
16
+ y: -Math.cos(phi)
17
+ };
18
+ let minX = Infinity;
19
+ let maxX = -Infinity;
20
+ let minY = Infinity;
21
+ let maxY = -Infinity;
22
+ const steps = 32;
23
+ for (let i = 0; i <= steps; i += 1) {
24
+ const phi = -half + turn * i / steps;
25
+ const p = at(phi);
26
+ const u = up(phi);
27
+ for (const k of [ascent, -descent]) {
28
+ const x = p.x + u.x * k;
29
+ const y = p.y + u.y * k;
30
+ minX = Math.min(minX, x);
31
+ maxX = Math.max(maxX, x);
32
+ minY = Math.min(minY, y);
33
+ maxY = Math.max(maxY, y);
34
+ }
35
+ }
36
+ const s = at(-half);
37
+ const e = at(half);
38
+ const large = turn > Math.PI ? 1 : 0;
39
+ const sweep = sign > 0 ? 1 : 0;
40
+ const n = (v) => Number(v.toFixed(3));
41
+ return {
42
+ d: `M${n(s.x)} ${n(s.y)}A${n(r)} ${n(r)} 0 ${large} ${sweep} ${n(e.x)} ${n(e.y)}`,
43
+ radius: r,
44
+ minX,
45
+ minY,
46
+ width: maxX - minX,
47
+ height: maxY - minY
48
+ };
49
+ }export{curveArc};//# sourceMappingURL=curve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"curve.js","sources":["../../../../src/features/design/doc/curve.ts"],"sourcesContent":["/**\n * Curved text geometry - the arc web `layoutArc` (shared/textRaster.ts) lays\n * glyphs along, as one SVG path native text can follow (`<TextPath>`).\n *\n * The text's own width spans `curveAngle(curve)` of a circle: a rainbow for a\n * positive curve, a smile for a negative one. The arc's midpoint is the\n * origin; the glyphs stand upright on it with their baseline on the path.\n *\n * Pure: runs under jest as-is.\n */\nimport { curveAngle } from './textEffects';\n\nexport interface CurveArc {\n /** The baseline path, in arc coordinates (midpoint at the origin), drawn left to right. */\n d: string;\n radius: number;\n /** The ink's bounds in arc coordinates. */\n minX: number;\n minY: number;\n width: number;\n height: number;\n}\n\n/** The arc for one line `total` wide at a curve amount; null when the text runs straight. */\nexport function curveArc(total: number, curve: number | undefined, ascent: number, descent: number): CurveArc | null {\n const turn = curveAngle(curve);\n if (!turn || !(total > 0)) return null;\n const r = total / turn;\n const half = turn / 2;\n const sign = (curve ?? 0) > 0 ? 1 : -1;\n const at = (phi: number) => ({ x: r * Math.sin(phi), y: sign * r * (1 - Math.cos(phi)) });\n // The glyph's \"up\" at a point: away from the centre on a rainbow, towards it on a smile.\n const up = (phi: number) =>\n sign > 0 ? { x: Math.sin(phi), y: -Math.cos(phi) } : { x: -Math.sin(phi), y: -Math.cos(phi) };\n let minX = Infinity;\n let maxX = -Infinity;\n let minY = Infinity;\n let maxY = -Infinity;\n const steps = 32;\n for (let i = 0; i <= steps; i += 1) {\n const phi = -half + (turn * i) / steps;\n const p = at(phi);\n const u = up(phi);\n for (const k of [ascent, -descent]) {\n const x = p.x + u.x * k;\n const y = p.y + u.y * k;\n minX = Math.min(minX, x);\n maxX = Math.max(maxX, x);\n minY = Math.min(minY, y);\n maxY = Math.max(maxY, y);\n }\n }\n const s = at(-half);\n const e = at(half);\n const large = turn > Math.PI ? 1 : 0;\n const sweep = sign > 0 ? 1 : 0;\n const n = (v: number) => Number(v.toFixed(3));\n return {\n d: `M${n(s.x)} ${n(s.y)}A${n(r)} ${n(r)} 0 ${large} ${sweep} ${n(e.x)} ${n(e.y)}`,\n radius: r,\n minX,\n minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n}\n"],"names":[],"mappings":"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"}