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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (360) hide show
  1. package/lib/compute.js +57 -1
  2. package/lib/compute.js.map +1 -1
  3. package/lib/features/agent-chat/NativeAgentChat.js +3 -2
  4. package/lib/features/agent-chat/NativeAgentChat.js.map +1 -1
  5. package/lib/features/apps/AppsCatalog.js +10 -0
  6. package/lib/features/apps/AppsCatalog.js.map +1 -1
  7. package/lib/features/apps/mobileAppCatalog.js +11 -0
  8. package/lib/features/apps/mobileAppCatalog.js.map +1 -1
  9. package/lib/features/canvas/AudioEditorExperience.js +448 -105
  10. package/lib/features/canvas/AudioEditorExperience.js.map +1 -1
  11. package/lib/features/canvas/CanvasAgentChatPane.js +33 -14
  12. package/lib/features/canvas/CanvasAgentChatPane.js.map +1 -1
  13. package/lib/features/canvas/CanvasBoardsGrid.js +493 -41
  14. package/lib/features/canvas/CanvasBoardsGrid.js.map +1 -1
  15. package/lib/features/canvas/CanvasChatResultCard.js.map +1 -1
  16. package/lib/features/canvas/CanvasEditToolsPanel.js +37 -1
  17. package/lib/features/canvas/CanvasEditToolsPanel.js.map +1 -1
  18. package/lib/features/canvas/CanvasExperience.js +237 -22
  19. package/lib/features/canvas/CanvasExperience.js.map +1 -1
  20. package/lib/features/canvas/CanvasGeneratePanel.js +119 -26
  21. package/lib/features/canvas/CanvasGeneratePanel.js.map +1 -1
  22. package/lib/features/canvas/CanvasLooksPanel.js +17 -6
  23. package/lib/features/canvas/CanvasLooksPanel.js.map +1 -1
  24. package/lib/features/canvas/CanvasTasksPanel.js +18 -1
  25. package/lib/features/canvas/CanvasTasksPanel.js.map +1 -1
  26. package/lib/features/canvas/DesignCategoryGallery.js +423 -0
  27. package/lib/features/canvas/DesignCategoryGallery.js.map +1 -0
  28. package/lib/features/canvas/ImageEditorExperience.js +763 -187
  29. package/lib/features/canvas/ImageEditorExperience.js.map +1 -1
  30. package/lib/features/canvas/SetStudioExperience.js +199 -11
  31. package/lib/features/canvas/SetStudioExperience.js.map +1 -1
  32. package/lib/features/canvas/VideoEditorExperience.js +59 -40
  33. package/lib/features/canvas/VideoEditorExperience.js.map +1 -1
  34. package/lib/features/canvas/VideoGeneratorExperience.js +134 -34
  35. package/lib/features/canvas/VideoGeneratorExperience.js.map +1 -1
  36. package/lib/features/canvas/aiEdit.js +4 -2
  37. package/lib/features/canvas/aiEdit.js.map +1 -1
  38. package/lib/features/canvas/audioEditor/AudioWaveform.js +96 -0
  39. package/lib/features/canvas/audioEditor/AudioWaveform.js.map +1 -0
  40. package/lib/features/canvas/audioEditor/audioPeaks.js +93 -0
  41. package/lib/features/canvas/audioEditor/audioPeaks.js.map +1 -0
  42. package/lib/features/canvas/canvasTaskSync.js +34 -7
  43. package/lib/features/canvas/canvasTaskSync.js.map +1 -1
  44. package/lib/features/canvas/canvasTasks.js +23 -3
  45. package/lib/features/canvas/canvasTasks.js.map +1 -1
  46. package/lib/features/canvas/canvasTheme.js +10 -24
  47. package/lib/features/canvas/canvasTheme.js.map +1 -1
  48. package/lib/features/canvas/canvasUi.js +1 -1
  49. package/lib/features/canvas/canvasUi.js.map +1 -1
  50. package/lib/features/canvas/createTiles.js +17 -9
  51. package/lib/features/canvas/createTiles.js.map +1 -1
  52. package/lib/features/canvas/deepLinks.js +35 -5
  53. package/lib/features/canvas/deepLinks.js.map +1 -1
  54. package/lib/features/canvas/designCatalog.js +165 -0
  55. package/lib/features/canvas/designCatalog.js.map +1 -0
  56. package/lib/features/canvas/designCategories.js +262 -0
  57. package/lib/features/canvas/designCategories.js.map +1 -0
  58. package/lib/features/canvas/editorControls.js +406 -0
  59. package/lib/features/canvas/editorControls.js.map +1 -0
  60. package/lib/features/canvas/generationModels.js +5 -3
  61. package/lib/features/canvas/generationModels.js.map +1 -1
  62. package/lib/features/canvas/generationTasks.js +162 -0
  63. package/lib/features/canvas/generationTasks.js.map +1 -0
  64. package/lib/features/canvas/generator/BottomSheet.js +167 -0
  65. package/lib/features/canvas/generator/BottomSheet.js.map +1 -0
  66. package/lib/features/canvas/generator/BusinessCardChatCard.js +155 -0
  67. package/lib/features/canvas/generator/BusinessCardChatCard.js.map +1 -0
  68. package/lib/features/canvas/generator/DirectorSheet.js +163 -0
  69. package/lib/features/canvas/generator/DirectorSheet.js.map +1 -0
  70. package/lib/features/canvas/generator/ReframePreview.js +122 -0
  71. package/lib/features/canvas/generator/ReframePreview.js.map +1 -0
  72. package/lib/features/canvas/generator/RunLogCard.js +119 -0
  73. package/lib/features/canvas/generator/RunLogCard.js.map +1 -0
  74. package/lib/features/canvas/generator/ShotPanel.js +261 -0
  75. package/lib/features/canvas/generator/ShotPanel.js.map +1 -0
  76. package/lib/features/canvas/generator/businessCardWidget.js +117 -0
  77. package/lib/features/canvas/generator/businessCardWidget.js.map +1 -0
  78. package/lib/features/canvas/generator/cameraVocabulary.js +142 -0
  79. package/lib/features/canvas/generator/cameraVocabulary.js.map +1 -0
  80. package/lib/features/canvas/generator/cinematicVocabulary.js +416 -0
  81. package/lib/features/canvas/generator/cinematicVocabulary.js.map +1 -0
  82. package/lib/features/canvas/generator/direction.js +41 -0
  83. package/lib/features/canvas/generator/direction.js.map +1 -0
  84. package/lib/features/canvas/generator/reframeGeometry.js +108 -0
  85. package/lib/features/canvas/generator/reframeGeometry.js.map +1 -0
  86. package/lib/features/canvas/generator/runLog.js +71 -0
  87. package/lib/features/canvas/generator/runLog.js.map +1 -0
  88. package/lib/features/canvas/generator/shot.js +133 -0
  89. package/lib/features/canvas/generator/shot.js.map +1 -0
  90. package/lib/features/canvas/generator/useShotSpec.js +87 -0
  91. package/lib/features/canvas/generator/useShotSpec.js.map +1 -0
  92. package/lib/features/canvas/home/HeroComposer.js +214 -0
  93. package/lib/features/canvas/home/HeroComposer.js.map +1 -0
  94. package/lib/features/canvas/home/HeroMonitor.js +225 -0
  95. package/lib/features/canvas/home/HeroMonitor.js.map +1 -0
  96. package/lib/features/canvas/home/LookDetail.js +185 -0
  97. package/lib/features/canvas/home/LookDetail.js.map +1 -0
  98. package/lib/features/canvas/home/LoopingVideo.js +37 -0
  99. package/lib/features/canvas/home/LoopingVideo.js.map +1 -0
  100. package/lib/features/canvas/home/TemplatesGallery.js +253 -0
  101. package/lib/features/canvas/home/TemplatesGallery.js.map +1 -0
  102. package/lib/features/canvas/home/heroShots.js +100 -0
  103. package/lib/features/canvas/home/heroShots.js.map +1 -0
  104. package/lib/features/canvas/homeWork.js +62 -3
  105. package/lib/features/canvas/homeWork.js.map +1 -1
  106. package/lib/features/canvas/imageEditor/ImageMarkup.js +195 -0
  107. package/lib/features/canvas/imageEditor/ImageMarkup.js.map +1 -0
  108. package/lib/features/canvas/imageEditor/imageEditOps.js +367 -0
  109. package/lib/features/canvas/imageEditor/imageEditOps.js.map +1 -0
  110. package/lib/features/canvas/nativeViewerRegistry.js.map +1 -1
  111. package/lib/features/canvas/rankedCatalogSearch.js +375 -0
  112. package/lib/features/canvas/rankedCatalogSearch.js.map +1 -0
  113. package/lib/features/canvas/recorder/CameraRecorderExperience.js +68 -20
  114. package/lib/features/canvas/recorder/CameraRecorderExperience.js.map +1 -1
  115. package/lib/features/canvas/recorder/RecordingReview.js +272 -0
  116. package/lib/features/canvas/recorder/RecordingReview.js.map +1 -0
  117. package/lib/features/canvas/recorder/RecordingsList.js +179 -0
  118. package/lib/features/canvas/recorder/RecordingsList.js.map +1 -0
  119. package/lib/features/canvas/recorder/recorderOps.js +99 -0
  120. package/lib/features/canvas/recorder/recorderOps.js.map +1 -0
  121. package/lib/features/canvas/seedanceShowcase.js +314 -0
  122. package/lib/features/canvas/seedanceShowcase.js.map +1 -0
  123. package/lib/features/canvas/serverTasks.js +149 -15
  124. package/lib/features/canvas/serverTasks.js.map +1 -1
  125. package/lib/features/canvas/sessionRenewal.js +114 -0
  126. package/lib/features/canvas/sessionRenewal.js.map +1 -0
  127. package/lib/features/canvas/set/SetViewportWebView.js +34 -1
  128. package/lib/features/canvas/set/SetViewportWebView.js.map +1 -1
  129. package/lib/features/canvas/set/agent/setTurn.js +4 -2
  130. package/lib/features/canvas/set/agent/setTurn.js.map +1 -1
  131. package/lib/features/canvas/set/setPresets.js +85 -0
  132. package/lib/features/canvas/set/setPresets.js.map +1 -0
  133. package/lib/features/canvas/set/setProject.js +4 -1
  134. package/lib/features/canvas/set/setProject.js.map +1 -1
  135. package/lib/features/canvas/studioCatalog.js +59 -4
  136. package/lib/features/canvas/studioCatalog.js.map +1 -1
  137. package/lib/features/canvas/studioLooks.js +31 -4
  138. package/lib/features/canvas/studioLooks.js.map +1 -1
  139. package/lib/features/canvas/surfaceIndex.js +1 -14
  140. package/lib/features/canvas/surfaceIndex.js.map +1 -1
  141. package/lib/features/canvas/templateSearch.js +489 -0
  142. package/lib/features/canvas/templateSearch.js.map +1 -0
  143. package/lib/features/canvas/useCanvasSession.js +28 -6
  144. package/lib/features/canvas/useCanvasSession.js.map +1 -1
  145. package/lib/features/canvas/useStudioCatalogTemplates.js +41 -5
  146. package/lib/features/canvas/useStudioCatalogTemplates.js.map +1 -1
  147. package/lib/features/canvas/videoEditor/EditorPanels.js +531 -0
  148. package/lib/features/canvas/videoEditor/EditorPanels.js.map +1 -0
  149. package/lib/features/canvas/videoEditor/agent/AgentCutPane.js +48 -4
  150. package/lib/features/canvas/videoEditor/agent/AgentCutPane.js.map +1 -1
  151. package/lib/features/canvas/videoEditor/agent/agentLoop.js +2 -0
  152. package/lib/features/canvas/videoEditor/agent/agentLoop.js.map +1 -1
  153. package/lib/features/canvas/videoEditor/agent/brainClient.js +97 -27
  154. package/lib/features/canvas/videoEditor/agent/brainClient.js.map +1 -1
  155. package/lib/features/canvas/videoEditor/agent/cutTools.js +707 -3
  156. package/lib/features/canvas/videoEditor/agent/cutTools.js.map +1 -1
  157. package/lib/features/canvas/videoEditor/audioServices.js +165 -0
  158. package/lib/features/canvas/videoEditor/audioServices.js.map +1 -0
  159. package/lib/features/canvas/videoEditor/captions.js +144 -0
  160. package/lib/features/canvas/videoEditor/captions.js.map +1 -0
  161. package/lib/features/canvas/videoEditor/compileTimeline.js +24 -16
  162. package/lib/features/canvas/videoEditor/compileTimeline.js.map +1 -1
  163. package/lib/features/canvas/videoEditor/editorModel.js +12 -2
  164. package/lib/features/canvas/videoEditor/editorModel.js.map +1 -1
  165. package/lib/features/canvas/videoEditor/exportTask.js +89 -7
  166. package/lib/features/canvas/videoEditor/exportTask.js.map +1 -1
  167. package/lib/features/canvas/videoEditor/layers.js +117 -0
  168. package/lib/features/canvas/videoEditor/layers.js.map +1 -0
  169. package/lib/features/canvas/videoEditor/remoteMediaClient.js +45 -18
  170. package/lib/features/canvas/videoEditor/remoteMediaClient.js.map +1 -1
  171. package/lib/features/canvas/videoEditor/renderTimeline.js +18 -6
  172. package/lib/features/canvas/videoEditor/renderTimeline.js.map +1 -1
  173. package/lib/features/canvas/videoEditor/revoice.js +138 -0
  174. package/lib/features/canvas/videoEditor/revoice.js.map +1 -0
  175. package/lib/features/canvas/videoEditor/storageUpload.js +34 -0
  176. package/lib/features/canvas/videoEditor/storageUpload.js.map +1 -0
  177. package/lib/features/canvas/videoEditor/textMotion.js +109 -0
  178. package/lib/features/canvas/videoEditor/textMotion.js.map +1 -0
  179. package/lib/features/canvas/videoEditor/transitions.js +31 -0
  180. package/lib/features/canvas/videoEditor/transitions.js.map +1 -0
  181. package/lib/features/chat/TemplatesChatCards.js +8 -3
  182. package/lib/features/chat/TemplatesChatCards.js.map +1 -1
  183. package/lib/features/design/DesignEditorExperience.js +674 -644
  184. package/lib/features/design/DesignEditorExperience.js.map +1 -1
  185. package/lib/features/design/DesignExperience.js +285 -538
  186. package/lib/features/design/DesignExperience.js.map +1 -1
  187. package/lib/features/design/designCore.js +2 -212
  188. package/lib/features/design/designCore.js.map +1 -1
  189. package/lib/features/design/designIndex.js +1 -50
  190. package/lib/features/design/designIndex.js.map +1 -1
  191. package/lib/features/design/doc/aiDesign.js +247 -0
  192. package/lib/features/design/doc/aiDesign.js.map +1 -0
  193. package/lib/features/design/doc/artifacts.js +280 -0
  194. package/lib/features/design/doc/artifacts.js.map +1 -0
  195. package/lib/features/design/doc/chart.js +98 -0
  196. package/lib/features/design/doc/chart.js.map +1 -0
  197. package/lib/features/design/doc/crop.js +104 -0
  198. package/lib/features/design/doc/crop.js.map +1 -0
  199. package/lib/features/design/doc/curve.js +49 -0
  200. package/lib/features/design/doc/curve.js.map +1 -0
  201. package/lib/features/design/doc/docOps.js +397 -0
  202. package/lib/features/design/doc/docOps.js.map +1 -0
  203. package/lib/features/design/doc/findReplace.js +112 -0
  204. package/lib/features/design/doc/findReplace.js.map +1 -0
  205. package/lib/features/design/doc/fonts.js +79 -0
  206. package/lib/features/design/doc/fonts.js.map +1 -0
  207. package/lib/features/design/doc/frames.js +17 -0
  208. package/lib/features/design/doc/frames.js.map +1 -0
  209. package/lib/features/design/doc/geometry.js +133 -0
  210. package/lib/features/design/doc/geometry.js.map +1 -0
  211. package/lib/features/design/doc/imageAdjust.js +203 -0
  212. package/lib/features/design/doc/imageAdjust.js.map +1 -0
  213. package/lib/features/design/doc/legacyDoc.js +107 -0
  214. package/lib/features/design/doc/legacyDoc.js.map +1 -0
  215. package/lib/features/design/doc/newDoc.js +335 -0
  216. package/lib/features/design/doc/newDoc.js.map +1 -0
  217. package/lib/features/design/doc/pageRange.js +17 -0
  218. package/lib/features/design/doc/pageRange.js.map +1 -0
  219. package/lib/features/design/doc/pathScale.js +68 -0
  220. package/lib/features/design/doc/pathScale.js.map +1 -0
  221. package/lib/features/design/doc/qr.js +62 -0
  222. package/lib/features/design/doc/qr.js.map +1 -0
  223. package/lib/features/design/doc/shapes.js +366 -0
  224. package/lib/features/design/doc/shapes.js.map +1 -0
  225. package/lib/features/design/doc/sizes.js +230 -0
  226. package/lib/features/design/doc/sizes.js.map +1 -0
  227. package/lib/features/design/doc/textEffects.js +134 -0
  228. package/lib/features/design/doc/textEffects.js.map +1 -0
  229. package/lib/features/design/doc/textLayout.js +182 -0
  230. package/lib/features/design/doc/textLayout.js.map +1 -0
  231. package/lib/features/design/doc/types.js +30 -0
  232. package/lib/features/design/doc/types.js.map +1 -0
  233. package/lib/features/design/editor/AiPanel.js +194 -0
  234. package/lib/features/design/editor/AiPanel.js.map +1 -0
  235. package/lib/features/design/editor/ChartDataPanel.js +182 -0
  236. package/lib/features/design/editor/ChartDataPanel.js.map +1 -0
  237. package/lib/features/design/editor/CropOverlay.js +199 -0
  238. package/lib/features/design/editor/CropOverlay.js.map +1 -0
  239. package/lib/features/design/editor/DesignCanvas.js +363 -0
  240. package/lib/features/design/editor/DesignCanvas.js.map +1 -0
  241. package/lib/features/design/editor/ExportSheet.js +123 -0
  242. package/lib/features/design/editor/ExportSheet.js.map +1 -0
  243. package/lib/features/design/editor/FindReplacePanel.js +93 -0
  244. package/lib/features/design/editor/FindReplacePanel.js.map +1 -0
  245. package/lib/features/design/editor/ImageTools.js +188 -0
  246. package/lib/features/design/editor/ImageTools.js.map +1 -0
  247. package/lib/features/design/editor/LayerTools.js +485 -0
  248. package/lib/features/design/editor/LayerTools.js.map +1 -0
  249. package/lib/features/design/editor/PageStrip.js +203 -0
  250. package/lib/features/design/editor/PageStrip.js.map +1 -0
  251. package/lib/features/design/editor/Slideshow.js +97 -0
  252. package/lib/features/design/editor/Slideshow.js.map +1 -0
  253. package/lib/features/design/editor/ToolPanels.js +695 -0
  254. package/lib/features/design/editor/ToolPanels.js.map +1 -0
  255. package/lib/features/design/editor/controls.js +630 -0
  256. package/lib/features/design/editor/controls.js.map +1 -0
  257. package/lib/features/design/editor/useDesignSave.js +91 -0
  258. package/lib/features/design/editor/useDesignSave.js.map +1 -0
  259. package/lib/features/design/export/exportDesign.js +170 -0
  260. package/lib/features/design/export/exportDesign.js.map +1 -0
  261. package/lib/features/design/export/pdf.js +143 -0
  262. package/lib/features/design/export/pdf.js.map +1 -0
  263. package/lib/features/design/home/DesignHome.js +688 -0
  264. package/lib/features/design/home/DesignHome.js.map +1 -0
  265. package/lib/features/design/home/studioHome.js +61 -0
  266. package/lib/features/design/home/studioHome.js.map +1 -0
  267. package/lib/features/design/pickDesignImage.js +60 -0
  268. package/lib/features/design/pickDesignImage.js.map +1 -0
  269. package/lib/features/design/render/DesignPageView.js +69 -0
  270. package/lib/features/design/render/DesignPageView.js.map +1 -0
  271. package/lib/features/design/render/PageCapture.js +288 -0
  272. package/lib/features/design/render/PageCapture.js.map +1 -0
  273. package/lib/features/design/render/TextMeasure.js +115 -0
  274. package/lib/features/design/render/TextMeasure.js.map +1 -0
  275. package/lib/features/design/render/fontRegistry.js +110 -0
  276. package/lib/features/design/render/fontRegistry.js.map +1 -0
  277. package/lib/features/design/render/layers.js +392 -0
  278. package/lib/features/design/render/layers.js.map +1 -0
  279. package/lib/features/design/render/svg.js +35 -0
  280. package/lib/features/design/render/svg.js.map +1 -0
  281. package/lib/features/design/render/svgParts.js +435 -0
  282. package/lib/features/design/render/svgParts.js.map +1 -0
  283. package/lib/features/design/surface/BoardScreen.js +529 -0
  284. package/lib/features/design/surface/BoardScreen.js.map +1 -0
  285. package/lib/features/design/surface/CompareView.js +138 -0
  286. package/lib/features/design/surface/CompareView.js.map +1 -0
  287. package/lib/features/design/surface/CreationScreen.js +294 -0
  288. package/lib/features/design/surface/CreationScreen.js.map +1 -0
  289. package/lib/features/design/surface/DesignAgentChatPane.js +444 -0
  290. package/lib/features/design/surface/DesignAgentChatPane.js.map +1 -0
  291. package/lib/features/design/surface/DesignBoards.js +441 -0
  292. package/lib/features/design/surface/DesignBoards.js.map +1 -0
  293. package/lib/features/design/surface/DesignPreview.js +159 -0
  294. package/lib/features/design/surface/DesignPreview.js.map +1 -0
  295. package/lib/features/design/surface/DesignSurfaceExperience.js +80 -0
  296. package/lib/features/design/surface/DesignSurfaceExperience.js.map +1 -0
  297. package/lib/features/design/surface/FullScreenPreview.js +59 -0
  298. package/lib/features/design/surface/FullScreenPreview.js.map +1 -0
  299. package/lib/features/design/surface/NewSystemDialog.js +122 -0
  300. package/lib/features/design/surface/NewSystemDialog.js.map +1 -0
  301. package/lib/features/design/surface/PickerSheet.js +175 -0
  302. package/lib/features/design/surface/PickerSheet.js.map +1 -0
  303. package/lib/features/design/surface/TemplatesGallery.js +156 -0
  304. package/lib/features/design/surface/TemplatesGallery.js.map +1 -0
  305. package/lib/features/design/surface/WetPaint.js +140 -0
  306. package/lib/features/design/surface/WetPaint.js.map +1 -0
  307. package/lib/features/design/surface/agentTurn.js +229 -0
  308. package/lib/features/design/surface/agentTurn.js.map +1 -0
  309. package/lib/features/design/surface/designBoard.js +218 -0
  310. package/lib/features/design/surface/designBoard.js.map +1 -0
  311. package/lib/features/design/surface/designChannel.js +186 -0
  312. package/lib/features/design/surface/designChannel.js.map +1 -0
  313. package/lib/features/design/surface/designChat.js +141 -0
  314. package/lib/features/design/surface/designChat.js.map +1 -0
  315. package/lib/features/design/surface/designConnector.js +266 -0
  316. package/lib/features/design/surface/designConnector.js.map +1 -0
  317. package/lib/features/design/surface/designDocument.js +40 -0
  318. package/lib/features/design/surface/designDocument.js.map +1 -0
  319. package/lib/features/design/surface/designExport.js +55 -0
  320. package/lib/features/design/surface/designExport.js.map +1 -0
  321. package/lib/features/design/surface/designLinks.js +64 -0
  322. package/lib/features/design/surface/designLinks.js.map +1 -0
  323. package/lib/features/design/surface/designPalette.js +24 -0
  324. package/lib/features/design/surface/designPalette.js.map +1 -0
  325. package/lib/features/design/surface/designRun.js +161 -0
  326. package/lib/features/design/surface/designRun.js.map +1 -0
  327. package/lib/features/design/surface/designTheme.js +119 -0
  328. package/lib/features/design/surface/designTheme.js.map +1 -0
  329. package/lib/features/design/surface/execStream.js +206 -0
  330. package/lib/features/design/surface/execStream.js.map +1 -0
  331. package/lib/features/design/surface/metaball.js +48 -0
  332. package/lib/features/design/surface/metaball.js.map +1 -0
  333. package/lib/features/design/surface/pickReferenceFiles.js +35 -0
  334. package/lib/features/design/surface/pickReferenceFiles.js.map +1 -0
  335. package/lib/features/design/surface/useDesignSurface.js +379 -0
  336. package/lib/features/design/surface/useDesignSurface.js.map +1 -0
  337. package/lib/features/docs/DocBlockRow.js +336 -0
  338. package/lib/features/docs/DocBlockRow.js.map +1 -0
  339. package/lib/features/docs/DocsEditorExperience.js +949 -0
  340. package/lib/features/docs/DocsEditorExperience.js.map +1 -0
  341. package/lib/features/docs/DocsToolbar.js +247 -0
  342. package/lib/features/docs/DocsToolbar.js.map +1 -0
  343. package/lib/features/docs/blocks.js +560 -0
  344. package/lib/features/docs/blocks.js.map +1 -0
  345. package/lib/features/docs/docArtifacts.js +129 -0
  346. package/lib/features/docs/docArtifacts.js.map +1 -0
  347. package/lib/features/docs/docEdits.js +201 -0
  348. package/lib/features/docs/docEdits.js.map +1 -0
  349. package/lib/features/docs/docExport.js +235 -0
  350. package/lib/features/docs/docExport.js.map +1 -0
  351. package/lib/features/docs/docShare.js +62 -0
  352. package/lib/features/docs/docShare.js.map +1 -0
  353. package/lib/features/links/openInApp.js +38 -2
  354. package/lib/features/links/openInApp.js.map +1 -1
  355. package/lib/routes.json +54 -0
  356. package/lib/screens/DesignNative/index.js +35 -0
  357. package/lib/screens/DesignNative/index.js.map +1 -0
  358. package/package.json +3 -3
  359. package/lib/features/design/exportDesign.js +0 -133
  360. package/lib/features/design/exportDesign.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"CanvasEditToolsPanel.js","sources":["../../../src/features/canvas/CanvasEditToolsPanel.tsx"],"sourcesContent":["/**\n * Edit tools sheet — native twin of canvas-surface EditToolPanel.\n * Runs on the selected board item and writes the result back in place.\n */\nimport React, { useMemo, useState } from 'react';\nimport { ActivityIndicator, Image as RNImage, ScrollView, StyleSheet, Text, TextInput, View } from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport type { CanvasItem } from './canvasCore';\nimport { friendlyMediaError, type RunMediaAction } from './videoEditor/mediaActions';\nimport {\n KEY_COLOR_CHOICES,\n normalizeHex,\n removeBackgroundDefaults,\n runExtendVideo,\n runTrackedLipSync,\n runMatchLook,\n runReframeChoice,\n runRemoveBackground,\n runUpscale,\n upscalePlan,\n UPSCALE_TARGETS,\n type Dims,\n type KeyColorChoice,\n type UpscaleTarget,\n} from './canvasEditOps';\nimport { EDIT_TOOL_META, editToolsForItem, type EditTool } from './editTools';\nimport {\n REFRAME_BARS,\n REFRAME_FORMATS,\n describeReframe,\n formatName,\n stillReframeNote,\n type ReframeBars,\n type ReframeFit,\n} from './reframe';\nimport { useCanvasTheme, themedStyles, type CanvasPalette } from './canvasTheme';\nimport { Pressable, HIT, RADIUS, SPACE, Segmented, TYPE, pressedStyle } from './canvasUi';\n\n/** RN gives a horizontal ScrollView flexGrow 1: on a fixed-height screen a chip row swells into empty space. */\nconst HSCROLL = { flexGrow: 0 } as const;\n\nconst FOCUS_STOPS = [0, 0.5, 1] as const;\nconst SIMILARITY_STEPS = [0.05, 0.1, 0.12, 0.2, 0.3] as const;\nconst BLEND_STEPS = [0, 0.04, 0.08, 0.15, 0.25] as const;\nconst pct = (v: number) => `${Math.round(v * 100)}%`;\n\nexport function CanvasEditToolsPanel({\n item,\n runAction,\n videoToVideo = true,\n onReplaced,\n onEditVideo,\n initialTool = null,\n onToolChange,\n showTitle = true,\n}: {\n item: CanvasItem;\n runAction?: RunMediaAction;\n videoToVideo?: boolean;\n onReplaced: (url: string) => void;\n onEditVideo?: () => void;\n /** The tool to open on (the dock remembers the last one, like web `lastEditTool`). */\n initialTool?: EditTool | null;\n onToolChange?: (tool: EditTool | null) => void;\n showTitle?: boolean;\n}) {\n const theme = useCanvasTheme();\n const styles = useMemo(() => makeStyles(theme), [theme]);\n const kind = item.type === 'video' ? 'video' : item.type === 'image' ? 'image' : null;\n const tools = useMemo(() => (kind ? editToolsForItem(kind, { videoToVideo }) : []), [kind, videoToVideo]);\n const [tool, setToolState] = useState<EditTool | null>(() =>\n initialTool && tools.includes(initialTool) ? initialTool : null,\n );\n const setTool = (next: EditTool | null) => {\n setToolState(next);\n onToolChange?.(next);\n };\n const [busy, setBusy] = useState(false);\n const [notice, setNotice] = useState<string | null>(null);\n const [receipt, setReceipt] = useState<string | null>(null);\n const [formatId, setFormatId] = useState(REFRAME_FORMATS[0].id);\n const [fit, setFit] = useState<ReframeFit>('crop');\n const [bars, setBars] = useState<ReframeBars>('match');\n const [focus, setFocus] = useState(0.5);\n const [keyChoice, setKeyChoice] = useState<KeyColorChoice>(kind === 'video' ? 'green' : 'auto');\n const [customHex, setCustomHex] = useState('');\n const [similarity, setSimilarity] = useState(\n removeBackgroundDefaults(kind === 'video' ? 'video' : 'image').similarity,\n );\n const [blend, setBlend] = useState(removeBackgroundDefaults(kind === 'video' ? 'video' : 'image').blend);\n const [upscaleTarget, setUpscaleTarget] = useState<UpscaleTarget>('1080p');\n const [lipText, setLipText] = useState('');\n const [extendPrompt, setExtendPrompt] = useState('');\n\n if (!kind || tools.length === 0) {\n return <Text style={styles.hint}>Select an image or video on the board to edit.</Text>;\n }\n const reframeFormat = REFRAME_FORMATS.find((f) => f.id === formatId) ?? REFRAME_FORMATS[0];\n const fits: ReframeFit[] = kind === 'video' ? ['crop', 'fit', 'stack'] : ['crop', 'fit'];\n const pendingStillNote = kind === 'image' ? stillReframeNote({ fit, bars }) : null;\n\n const measure = (): Promise<Dims> =>\n new Promise((resolve, reject) => {\n if (kind === 'image') {\n RNImage.getSize(\n item.src,\n (width, height) => resolve({ width, height }),\n () => reject(new Error('Could not read image size')),\n );\n return;\n }\n // Video: assume 16:9 HD when we cannot probe on device.\n resolve({ width: 1920, height: 1080 });\n });\n\n const run = async () => {\n if (!runAction || !tool || busy) return;\n if (tool === 'edit-video') {\n onEditVideo?.();\n return;\n }\n setBusy(true);\n setNotice(null);\n setReceipt(null);\n try {\n let url = '';\n let note: string | null = null;\n if (tool === 'reframe') {\n const dims = await measure();\n const choice = { format: reframeFormat, fit, bars, focus };\n const out = await runReframeChoice(runAction, kind, item.src, choice, dims);\n url = out.url;\n note = out.note\n ? `${formatName(reframeFormat)}: ${out.note}`\n : `${formatName(reframeFormat)}: ${describeReframe(choice, dims)}.`;\n } else if (tool === 'remove-background') {\n if (keyChoice === 'custom' && !normalizeHex(customHex))\n throw new Error('Type a hex colour like #00ff00');\n url = await runRemoveBackground(runAction, kind, item.src, {\n key: keyChoice,\n customHex,\n similarity,\n blend,\n });\n } else if (tool === 'upscale') {\n const dims = await measure();\n const out = upscalePlan(dims, upscaleTarget);\n if (!out) throw new Error('Already at or above that size');\n url = await runUpscale(runAction, kind, item.src, out);\n } else if (tool === 'match-look') {\n url = await runMatchLook(runAction, kind, item.src);\n } else if (tool === 'lip-sync') {\n if (!lipText.trim()) throw new Error('Type a line for the mouth to follow');\n url = await runTrackedLipSync(runAction, item.src, { text: lipText });\n } else if (tool === 'extend-video') {\n url = await runExtendVideo(runAction, item.src, extendPrompt);\n }\n if (url) onReplaced(url);\n setReceipt(note);\n setTool(null);\n } catch (err: unknown) {\n setNotice(friendlyMediaError(err, 'edit'));\n } finally {\n setBusy(false);\n }\n };\n\n return (\n <View style={styles.root}>\n {showTitle ? <Text style={styles.title}>Edit selected</Text> : null}\n <ScrollView\n style={HSCROLL}\n horizontal\n showsHorizontalScrollIndicator={false}\n contentContainerStyle={styles.chips}\n >\n {tools.map((id) => {\n const meta = EDIT_TOOL_META[id];\n const on = tool === id;\n return (\n <Pressable\n key={id}\n onPress={() => setTool(on ? null : id)}\n style={({ pressed }) => [styles.chip, on && styles.chipOn, pressedStyle(pressed)]}\n >\n <MaterialCommunityIcons\n name={meta.icon as React.ComponentProps<typeof MaterialCommunityIcons>['name']}\n size={14}\n color={on ? theme.background : theme.foreground}\n />\n <Text style={[styles.chipLabel, on && styles.chipLabelOn]}>{meta.label}</Text>\n </Pressable>\n );\n })}\n </ScrollView>\n {tool ? <Text style={styles.blurb}>{EDIT_TOOL_META[tool].blurb}</Text> : null}\n\n {tool === 'reframe' ? (\n <View style={styles.opts}>\n <View style={styles.chips}>\n {REFRAME_FORMATS.map((f) => (\n <Pressable\n key={f.id}\n onPress={() => setFormatId(f.id)}\n style={({ pressed }) => [\n styles.chip,\n formatId === f.id && styles.chipOn,\n pressedStyle(pressed),\n ]}\n accessibilityLabel={`${f.label}, ${f.uses}`}\n >\n <Text style={[styles.chipLabel, formatId === f.id && styles.chipLabelOn]}>\n {f.size ? f.label : `${f.label} ${f.ratio}`}\n </Text>\n </Pressable>\n ))}\n </View>\n <Text style={styles.blurb}>\n {reframeFormat.uses}\n {reframeFormat.size ? ` · ${reframeFormat.size.width}x${reframeFormat.size.height}` : ''}\n </Text>\n <Segmented\n options={fits.map((f) => ({\n id: f,\n label: f === 'crop' ? 'Crop' : f === 'fit' ? 'Fit' : 'Stack',\n }))}\n value={fit}\n onChange={setFit}\n style={styles.segmented}\n />\n {fit === 'fit' ? (\n <View style={styles.chips}>\n {REFRAME_BARS.map((b) => (\n <Pressable\n key={b.id}\n onPress={() => setBars(b.id)}\n style={({ pressed }) => [\n styles.chip,\n bars === b.id && styles.chipOn,\n pressedStyle(pressed),\n ]}\n accessibilityHint={b.title}\n >\n <Text style={[styles.chipLabel, bars === b.id && styles.chipLabelOn]}>\n {b.label}\n </Text>\n </Pressable>\n ))}\n </View>\n ) : null}\n {fit === 'crop' ? (\n <View style={styles.chips}>\n {FOCUS_STOPS.map((f) => (\n <Pressable\n key={f}\n onPress={() => setFocus(f)}\n style={({ pressed }) => [\n styles.chip,\n focus === f && styles.chipOn,\n pressedStyle(pressed),\n ]}\n >\n <Text style={[styles.chipLabel, focus === f && styles.chipLabelOn]}>\n {f === 0 ? 'Start' : f === 1 ? 'End' : 'Centre'}\n </Text>\n </Pressable>\n ))}\n </View>\n ) : null}\n {pendingStillNote ? <Text style={styles.blurb}>{pendingStillNote}</Text> : null}\n </View>\n ) : null}\n\n {tool === 'remove-background' ? (\n <View style={styles.opts}>\n <View style={styles.chips}>\n {KEY_COLOR_CHOICES.filter((c) => kind === 'image' || c.id !== 'auto').map((c) => (\n <Pressable\n key={c.id}\n onPress={() => setKeyChoice(c.id)}\n style={({ pressed }) => [\n styles.chip,\n keyChoice === c.id && styles.chipOn,\n pressedStyle(pressed),\n ]}\n >\n {c.hex ? <View style={[styles.swatch, { backgroundColor: c.hex }]} /> : null}\n <Text style={[styles.chipLabel, keyChoice === c.id && styles.chipLabelOn]}>\n {c.label}\n </Text>\n </Pressable>\n ))}\n </View>\n {keyChoice === 'custom' ? (\n <View style={styles.hexRow}>\n <View\n style={[\n styles.swatch,\n styles.swatchLg,\n { backgroundColor: normalizeHex(customHex) ?? '#ffffff' },\n ]}\n />\n <TextInput\n value={customHex}\n onChangeText={setCustomHex}\n placeholder=\"#00ff00\"\n placeholderTextColor={theme.mutedForeground}\n autoCapitalize=\"none\"\n autoCorrect={false}\n style={[styles.field, styles.hexField]}\n />\n </View>\n ) : null}\n <Text style={styles.blurb}>Tolerance · {pct(similarity)}</Text>\n <View style={styles.chips}>\n {SIMILARITY_STEPS.map((v) => (\n <Pressable\n key={v}\n onPress={() => setSimilarity(v)}\n style={({ pressed }) => [\n styles.chip,\n similarity === v && styles.chipOn,\n pressedStyle(pressed),\n ]}\n >\n <Text style={[styles.chipLabel, similarity === v && styles.chipLabelOn]}>{pct(v)}</Text>\n </Pressable>\n ))}\n </View>\n <Text style={styles.blurb}>Edge softness · {pct(blend)}</Text>\n <View style={styles.chips}>\n {BLEND_STEPS.map((v) => (\n <Pressable\n key={v}\n onPress={() => setBlend(v)}\n style={({ pressed }) => [\n styles.chip,\n blend === v && styles.chipOn,\n pressedStyle(pressed),\n ]}\n >\n <Text style={[styles.chipLabel, blend === v && styles.chipLabelOn]}>{pct(v)}</Text>\n </Pressable>\n ))}\n </View>\n <Text style={styles.blurb}>\n {kind === 'image'\n ? 'The result is a PNG with transparency where the background was.'\n : 'MP4 carries no transparency, so the keyed area turns black.'}\n </Text>\n </View>\n ) : null}\n\n {tool === 'upscale' ? (\n <Segmented\n options={UPSCALE_TARGETS.map((t) => ({ id: t.id, label: t.label }))}\n value={upscaleTarget}\n onChange={setUpscaleTarget}\n style={styles.segmented}\n />\n ) : null}\n\n {tool === 'lip-sync' ? (\n <TextInput\n value={lipText}\n onChangeText={setLipText}\n placeholder=\"Line to speak…\"\n placeholderTextColor={theme.mutedForeground}\n style={styles.field}\n />\n ) : null}\n\n {tool === 'extend-video' ? (\n <TextInput\n value={extendPrompt}\n onChangeText={setExtendPrompt}\n placeholder=\"What should happen next? (optional)\"\n placeholderTextColor={theme.mutedForeground}\n style={styles.field}\n />\n ) : null}\n\n {notice ? <Text style={styles.notice}>{notice}</Text> : null}\n {receipt ? <Text style={styles.blurb}>{receipt}</Text> : null}\n\n {tool ? (\n <Pressable\n onPress={() => void run()}\n disabled={busy || !runAction}\n style={({ pressed }) => [\n styles.cta,\n (busy || !runAction) && styles.ctaOff,\n pressedStyle(pressed && !busy && Boolean(runAction)),\n ]}\n >\n {busy ? (\n <ActivityIndicator color={theme.primaryForeground} />\n ) : (\n <Text style={styles.ctaLabel}>{tool === 'edit-video' ? 'Open editor' : 'Apply'}</Text>\n )}\n </Pressable>\n ) : null}\n </View>\n );\n}\n\nconst makeStyles = themedStyles((theme: CanvasPalette) =>\n StyleSheet.create({\n root: { paddingHorizontal: SPACE.lg, paddingBottom: SPACE.md, gap: SPACE.md },\n title: { ...TYPE.title, color: theme.foreground },\n hint: { ...TYPE.body, fontSize: 14, padding: SPACE.lg, color: theme.mutedForeground },\n chips: { flexDirection: 'row', flexWrap: 'wrap', gap: SPACE.sm - 2 },\n chip: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: SPACE.sm - 2,\n minHeight: 36,\n paddingHorizontal: SPACE.md + 2,\n borderRadius: RADIUS.pill,\n backgroundColor: theme.card,\n },\n chipOn: { backgroundColor: theme.foreground },\n chipLabel: { ...TYPE.label, color: theme.foreground },\n chipLabelOn: { color: theme.background },\n segmented: { flexGrow: 0, alignSelf: 'flex-start' },\n blurb: { ...TYPE.caption, fontWeight: '400', lineHeight: 17, color: theme.mutedForeground },\n opts: { gap: SPACE.sm + 2 },\n field: {\n minHeight: HIT + 4,\n borderRadius: RADIUS.lg,\n paddingHorizontal: SPACE.lg,\n paddingVertical: SPACE.md - 1,\n fontSize: 15,\n color: theme.foreground,\n backgroundColor: theme.card,\n },\n notice: { ...TYPE.caption, color: theme.destructiveText },\n swatch: {\n width: 14,\n height: 14,\n borderRadius: 7,\n borderWidth: StyleSheet.hairlineWidth,\n borderColor: theme.borderStrong,\n },\n swatchLg: { width: 36, height: 36, borderRadius: 18 },\n hexRow: { flexDirection: 'row', alignItems: 'center', gap: SPACE.sm + 2 },\n hexField: { flex: 1 },\n cta: {\n alignSelf: 'stretch',\n minHeight: HIT + 4,\n alignItems: 'center',\n justifyContent: 'center',\n paddingHorizontal: SPACE.xl,\n borderRadius: RADIUS.pill,\n backgroundColor: theme.primary,\n },\n ctaOff: { opacity: 0.4 },\n ctaLabel: { ...TYPE.label, fontSize: 15, color: theme.primaryForeground },\n }),\n);\n"],"names":["RNImage"],"mappings":"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"}
1
+ {"version":3,"file":"CanvasEditToolsPanel.js","sources":["../../../src/features/canvas/CanvasEditToolsPanel.tsx"],"sourcesContent":["/**\n * Edit tools sheet — native twin of canvas-surface EditToolPanel.\n * Runs on the selected board item and writes the result back in place.\n */\nimport React, { useEffect, useMemo, useState } from 'react';\nimport { ActivityIndicator, Image as RNImage, ScrollView, StyleSheet, Text, TextInput, View } from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport type { CanvasItem } from './canvasCore';\nimport { friendlyMediaError, resultUrl, type RunMediaAction } from './videoEditor/mediaActions';\nimport { unwrapProxyUrl } from './videoEditor/remoteMediaClient';\nimport { ReframePreview } from './generator/ReframePreview';\nimport { dimsFromShape } from './generator/reframeGeometry';\nimport {\n KEY_COLOR_CHOICES,\n normalizeHex,\n removeBackgroundDefaults,\n runExtendVideo,\n runTrackedLipSync,\n runMatchLook,\n runReframeChoice,\n runRemoveBackground,\n runUpscale,\n upscalePlan,\n UPSCALE_TARGETS,\n type Dims,\n type KeyColorChoice,\n type UpscaleTarget,\n} from './canvasEditOps';\nimport { EDIT_TOOL_META, editToolsForItem, type EditTool } from './editTools';\nimport {\n REFRAME_BARS,\n REFRAME_FORMATS,\n describeReframe,\n formatName,\n stillReframeNote,\n type ReframeBars,\n type ReframeFit,\n} from './reframe';\nimport { useCanvasTheme, themedStyles, type CanvasPalette } from './canvasTheme';\nimport { Pressable, HIT, RADIUS, SPACE, Segmented, TYPE, pressedStyle } from './canvasUi';\n\n/** RN gives a horizontal ScrollView flexGrow 1: on a fixed-height screen a chip row swells into empty space. */\nconst HSCROLL = { flexGrow: 0 } as const;\n\nconst FOCUS_STOPS = [0, 0.5, 1] as const;\nconst SIMILARITY_STEPS = [0.05, 0.1, 0.12, 0.2, 0.3] as const;\nconst BLEND_STEPS = [0, 0.04, 0.08, 0.15, 0.25] as const;\nconst pct = (v: number) => `${Math.round(v * 100)}%`;\n\nexport function CanvasEditToolsPanel({\n item,\n runAction,\n videoToVideo = true,\n onReplaced,\n onEditVideo,\n initialTool = null,\n onToolChange,\n showTitle = true,\n}: {\n item: CanvasItem;\n runAction?: RunMediaAction;\n videoToVideo?: boolean;\n onReplaced: (url: string) => void;\n onEditVideo?: () => void;\n /** The tool to open on (the dock remembers the last one, like web `lastEditTool`). */\n initialTool?: EditTool | null;\n onToolChange?: (tool: EditTool | null) => void;\n showTitle?: boolean;\n}) {\n const theme = useCanvasTheme();\n const styles = useMemo(() => makeStyles(theme), [theme]);\n const kind = item.type === 'video' ? 'video' : item.type === 'image' ? 'image' : null;\n const tools = useMemo(() => (kind ? editToolsForItem(kind, { videoToVideo }) : []), [kind, videoToVideo]);\n const [tool, setToolState] = useState<EditTool | null>(() =>\n initialTool && tools.includes(initialTool) ? initialTool : null,\n );\n const setTool = (next: EditTool | null) => {\n setToolState(next);\n onToolChange?.(next);\n };\n const [busy, setBusy] = useState(false);\n const [notice, setNotice] = useState<string | null>(null);\n const [receipt, setReceipt] = useState<string | null>(null);\n const [formatId, setFormatId] = useState(REFRAME_FORMATS[0].id);\n const [fit, setFit] = useState<ReframeFit>('crop');\n const [bars, setBars] = useState<ReframeBars>('match');\n const [focus, setFocus] = useState(0.5);\n const [keyChoice, setKeyChoice] = useState<KeyColorChoice>(kind === 'video' ? 'green' : 'auto');\n const [customHex, setCustomHex] = useState('');\n const [similarity, setSimilarity] = useState(\n removeBackgroundDefaults(kind === 'video' ? 'video' : 'image').similarity,\n );\n const [blend, setBlend] = useState(removeBackgroundDefaults(kind === 'video' ? 'video' : 'image').blend);\n const [upscaleTarget, setUpscaleTarget] = useState<UpscaleTarget>('1080p');\n const [lipText, setLipText] = useState('');\n const [extendPrompt, setExtendPrompt] = useState('');\n // Reframe live preview (web EditToolPanel ReframePreview): the source's size and a still of it.\n const [previewDims, setPreviewDims] = useState<Dims | null>(null);\n const [previewUri, setPreviewUri] = useState<string | null>(null);\n const reframeOpen = tool === 'reframe';\n\n useEffect(() => {\n if (!reframeOpen || !kind) return undefined;\n let cancelled = false;\n if (kind === 'image') {\n setPreviewUri(item.src);\n RNImage.getSize(\n item.src,\n (width, height) => {\n if (!cancelled) setPreviewDims({ width, height });\n },\n () => {\n if (!cancelled) setPreviewDims(dimsFromShape(item.width, item.height));\n },\n );\n } else {\n // A clip cannot be probed on the phone: its board shape stands in, a frame grab is the picture.\n setPreviewDims(dimsFromShape(item.width, item.height));\n setPreviewUri(null);\n runAction?.('yantra-video-editing', 'YANTRA_VIDEO_EDIT_THUMBNAIL', {\n input_url: unwrapProxyUrl(item.src),\n time_secs: 1,\n })\n .then((result) => {\n if (!cancelled) setPreviewUri(resultUrl(result, 'YANTRA_VIDEO_EDIT_THUMBNAIL') || null);\n })\n .catch(() => undefined);\n }\n return () => {\n cancelled = true;\n };\n }, [reframeOpen, kind, item.src, item.width, item.height, runAction]);\n\n if (!kind || tools.length === 0) {\n return <Text style={styles.hint}>Select an image or video on the board to edit.</Text>;\n }\n const reframeFormat = REFRAME_FORMATS.find((f) => f.id === formatId) ?? REFRAME_FORMATS[0];\n const fits: ReframeFit[] = kind === 'video' ? ['crop', 'fit', 'stack'] : ['crop', 'fit'];\n const pendingStillNote = kind === 'image' ? stillReframeNote({ fit, bars }) : null;\n\n const measure = (): Promise<Dims> =>\n new Promise((resolve, reject) => {\n if (kind === 'image') {\n RNImage.getSize(\n item.src,\n (width, height) => resolve({ width, height }),\n () => reject(new Error('Could not read image size')),\n );\n return;\n }\n // Video: assume 16:9 HD when we cannot probe on device.\n resolve({ width: 1920, height: 1080 });\n });\n\n const run = async () => {\n if (!runAction || !tool || busy) return;\n if (tool === 'edit-video') {\n onEditVideo?.();\n return;\n }\n setBusy(true);\n setNotice(null);\n setReceipt(null);\n try {\n let url = '';\n let note: string | null = null;\n if (tool === 'reframe') {\n const dims = await measure();\n const choice = { format: reframeFormat, fit, bars, focus };\n const out = await runReframeChoice(runAction, kind, item.src, choice, dims);\n url = out.url;\n note = out.note\n ? `${formatName(reframeFormat)}: ${out.note}`\n : `${formatName(reframeFormat)}: ${describeReframe(choice, dims)}.`;\n } else if (tool === 'remove-background') {\n if (keyChoice === 'custom' && !normalizeHex(customHex))\n throw new Error('Type a hex colour like #00ff00');\n url = await runRemoveBackground(runAction, kind, item.src, {\n key: keyChoice,\n customHex,\n similarity,\n blend,\n });\n } else if (tool === 'upscale') {\n const dims = await measure();\n const out = upscalePlan(dims, upscaleTarget);\n if (!out) throw new Error('Already at or above that size');\n url = await runUpscale(runAction, kind, item.src, out);\n } else if (tool === 'match-look') {\n url = await runMatchLook(runAction, kind, item.src);\n } else if (tool === 'lip-sync') {\n if (!lipText.trim()) throw new Error('Type a line for the mouth to follow');\n url = await runTrackedLipSync(runAction, item.src, { text: lipText });\n } else if (tool === 'extend-video') {\n url = await runExtendVideo(runAction, item.src, extendPrompt);\n }\n if (url) onReplaced(url);\n setReceipt(note);\n setTool(null);\n } catch (err: unknown) {\n setNotice(friendlyMediaError(err, 'edit'));\n } finally {\n setBusy(false);\n }\n };\n\n return (\n <View style={styles.root}>\n {showTitle ? <Text style={styles.title}>Edit selected</Text> : null}\n <ScrollView\n style={HSCROLL}\n horizontal\n showsHorizontalScrollIndicator={false}\n contentContainerStyle={styles.chips}\n >\n {tools.map((id) => {\n const meta = EDIT_TOOL_META[id];\n const on = tool === id;\n return (\n <Pressable\n key={id}\n onPress={() => setTool(on ? null : id)}\n style={({ pressed }) => [styles.chip, on && styles.chipOn, pressedStyle(pressed)]}\n >\n <MaterialCommunityIcons\n name={meta.icon as React.ComponentProps<typeof MaterialCommunityIcons>['name']}\n size={14}\n color={on ? theme.background : theme.foreground}\n />\n <Text style={[styles.chipLabel, on && styles.chipLabelOn]}>{meta.label}</Text>\n </Pressable>\n );\n })}\n </ScrollView>\n {tool ? <Text style={styles.blurb}>{EDIT_TOOL_META[tool].blurb}</Text> : null}\n\n {tool === 'reframe' ? (\n <View style={styles.opts}>\n <View style={styles.chips}>\n {REFRAME_FORMATS.map((f) => (\n <Pressable\n key={f.id}\n onPress={() => setFormatId(f.id)}\n style={({ pressed }) => [\n styles.chip,\n formatId === f.id && styles.chipOn,\n pressedStyle(pressed),\n ]}\n accessibilityLabel={`${f.label}, ${f.uses}`}\n >\n <Text style={[styles.chipLabel, formatId === f.id && styles.chipLabelOn]}>\n {f.size ? f.label : `${f.label} ${f.ratio}`}\n </Text>\n </Pressable>\n ))}\n </View>\n <Text style={styles.blurb}>\n {reframeFormat.uses}\n {reframeFormat.size ? ` · ${reframeFormat.size.width}x${reframeFormat.size.height}` : ''}\n </Text>\n <Segmented\n options={fits.map((f) => ({\n id: f,\n label: f === 'crop' ? 'Crop' : f === 'fit' ? 'Fit' : 'Stack',\n }))}\n value={fit}\n onChange={setFit}\n style={styles.segmented}\n />\n {fit === 'fit' ? (\n <View style={styles.chips}>\n {REFRAME_BARS.map((b) => (\n <Pressable\n key={b.id}\n onPress={() => setBars(b.id)}\n style={({ pressed }) => [\n styles.chip,\n bars === b.id && styles.chipOn,\n pressedStyle(pressed),\n ]}\n accessibilityHint={b.title}\n >\n <Text style={[styles.chipLabel, bars === b.id && styles.chipLabelOn]}>\n {b.label}\n </Text>\n </Pressable>\n ))}\n </View>\n ) : null}\n {fit === 'crop' ? (\n <View style={styles.chips}>\n {FOCUS_STOPS.map((f) => (\n <Pressable\n key={f}\n onPress={() => setFocus(f)}\n style={({ pressed }) => [\n styles.chip,\n focus === f && styles.chipOn,\n pressedStyle(pressed),\n ]}\n >\n <Text style={[styles.chipLabel, focus === f && styles.chipLabelOn]}>\n {f === 0 ? 'Start' : f === 1 ? 'End' : 'Centre'}\n </Text>\n </Pressable>\n ))}\n </View>\n ) : null}\n <ReframePreview\n kind={kind}\n uri={previewUri}\n src={previewDims}\n choice={{ format: reframeFormat, fit, bars, focus }}\n />\n {pendingStillNote ? <Text style={styles.blurb}>{pendingStillNote}</Text> : null}\n </View>\n ) : null}\n\n {tool === 'remove-background' ? (\n <View style={styles.opts}>\n <View style={styles.chips}>\n {KEY_COLOR_CHOICES.filter((c) => kind === 'image' || c.id !== 'auto').map((c) => (\n <Pressable\n key={c.id}\n onPress={() => setKeyChoice(c.id)}\n style={({ pressed }) => [\n styles.chip,\n keyChoice === c.id && styles.chipOn,\n pressedStyle(pressed),\n ]}\n >\n {c.hex ? <View style={[styles.swatch, { backgroundColor: c.hex }]} /> : null}\n <Text style={[styles.chipLabel, keyChoice === c.id && styles.chipLabelOn]}>\n {c.label}\n </Text>\n </Pressable>\n ))}\n </View>\n {keyChoice === 'custom' ? (\n <View style={styles.hexRow}>\n <View\n style={[\n styles.swatch,\n styles.swatchLg,\n { backgroundColor: normalizeHex(customHex) ?? '#ffffff' },\n ]}\n />\n <TextInput\n value={customHex}\n onChangeText={setCustomHex}\n placeholder=\"#00ff00\"\n placeholderTextColor={theme.mutedForeground}\n autoCapitalize=\"none\"\n autoCorrect={false}\n style={[styles.field, styles.hexField]}\n />\n </View>\n ) : null}\n <Text style={styles.blurb}>Tolerance · {pct(similarity)}</Text>\n <View style={styles.chips}>\n {SIMILARITY_STEPS.map((v) => (\n <Pressable\n key={v}\n onPress={() => setSimilarity(v)}\n style={({ pressed }) => [\n styles.chip,\n similarity === v && styles.chipOn,\n pressedStyle(pressed),\n ]}\n >\n <Text style={[styles.chipLabel, similarity === v && styles.chipLabelOn]}>{pct(v)}</Text>\n </Pressable>\n ))}\n </View>\n <Text style={styles.blurb}>Edge softness · {pct(blend)}</Text>\n <View style={styles.chips}>\n {BLEND_STEPS.map((v) => (\n <Pressable\n key={v}\n onPress={() => setBlend(v)}\n style={({ pressed }) => [\n styles.chip,\n blend === v && styles.chipOn,\n pressedStyle(pressed),\n ]}\n >\n <Text style={[styles.chipLabel, blend === v && styles.chipLabelOn]}>{pct(v)}</Text>\n </Pressable>\n ))}\n </View>\n <Text style={styles.blurb}>\n {kind === 'image'\n ? 'The result is a PNG with transparency where the background was.'\n : 'MP4 carries no transparency, so the keyed area turns black.'}\n </Text>\n </View>\n ) : null}\n\n {tool === 'upscale' ? (\n <Segmented\n options={UPSCALE_TARGETS.map((t) => ({ id: t.id, label: t.label }))}\n value={upscaleTarget}\n onChange={setUpscaleTarget}\n style={styles.segmented}\n />\n ) : null}\n\n {tool === 'lip-sync' ? (\n <TextInput\n value={lipText}\n onChangeText={setLipText}\n placeholder=\"Line to speak…\"\n placeholderTextColor={theme.mutedForeground}\n style={styles.field}\n />\n ) : null}\n\n {tool === 'extend-video' ? (\n <TextInput\n value={extendPrompt}\n onChangeText={setExtendPrompt}\n placeholder=\"What should happen next? (optional)\"\n placeholderTextColor={theme.mutedForeground}\n style={styles.field}\n />\n ) : null}\n\n {notice ? <Text style={styles.notice}>{notice}</Text> : null}\n {receipt ? <Text style={styles.blurb}>{receipt}</Text> : null}\n\n {tool ? (\n <Pressable\n onPress={() => void run()}\n disabled={busy || !runAction}\n style={({ pressed }) => [\n styles.cta,\n (busy || !runAction) && styles.ctaOff,\n pressedStyle(pressed && !busy && Boolean(runAction)),\n ]}\n >\n {busy ? (\n <ActivityIndicator color={theme.primaryForeground} />\n ) : (\n <Text style={styles.ctaLabel}>{tool === 'edit-video' ? 'Open editor' : 'Apply'}</Text>\n )}\n </Pressable>\n ) : null}\n </View>\n );\n}\n\nconst makeStyles = themedStyles((theme: CanvasPalette) =>\n StyleSheet.create({\n root: { paddingHorizontal: SPACE.lg, paddingBottom: SPACE.md, gap: SPACE.md },\n title: { ...TYPE.title, color: theme.foreground },\n hint: { ...TYPE.body, fontSize: 14, padding: SPACE.lg, color: theme.mutedForeground },\n chips: { flexDirection: 'row', flexWrap: 'wrap', gap: SPACE.sm - 2 },\n chip: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: SPACE.sm - 2,\n minHeight: 36,\n paddingHorizontal: SPACE.md + 2,\n borderRadius: RADIUS.pill,\n backgroundColor: theme.card,\n },\n chipOn: { backgroundColor: theme.foreground },\n chipLabel: { ...TYPE.label, color: theme.foreground },\n chipLabelOn: { color: theme.background },\n segmented: { flexGrow: 0, alignSelf: 'flex-start' },\n blurb: { ...TYPE.caption, fontWeight: '400', lineHeight: 17, color: theme.mutedForeground },\n opts: { gap: SPACE.sm + 2 },\n field: {\n minHeight: HIT + 4,\n borderRadius: RADIUS.lg,\n paddingHorizontal: SPACE.lg,\n paddingVertical: SPACE.md - 1,\n fontSize: 15,\n color: theme.foreground,\n backgroundColor: theme.card,\n },\n notice: { ...TYPE.caption, color: theme.destructiveText },\n swatch: {\n width: 14,\n height: 14,\n borderRadius: 7,\n borderWidth: StyleSheet.hairlineWidth,\n borderColor: theme.borderStrong,\n },\n swatchLg: { width: 36, height: 36, borderRadius: 18 },\n hexRow: { flexDirection: 'row', alignItems: 'center', gap: SPACE.sm + 2 },\n hexField: { flex: 1 },\n cta: {\n alignSelf: 'stretch',\n minHeight: HIT + 4,\n alignItems: 'center',\n justifyContent: 'center',\n paddingHorizontal: SPACE.xl,\n borderRadius: RADIUS.pill,\n backgroundColor: theme.primary,\n },\n ctaOff: { opacity: 0.4 },\n ctaLabel: { ...TYPE.label, fontSize: 15, color: theme.primaryForeground },\n }),\n);\n"],"names":["RNImage"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import {jsx,jsxs,Fragment}from'react/jsx-runtime';import {useMemo,useState,useRef,useEffect,useCallback}from'react';import {Image,View,Text,ActivityIndicator,StyleSheet}from'react-native';import {NativeCanvasViewer}from'./NativeCanvasViewer.js';import {CanvasBoardsGrid}from'./CanvasBoardsGrid.js';import {CanvasAgentChatPane}from'./CanvasAgentChatPane.js';import {VideoEditorExperience}from'./VideoEditorExperience.js';import {ImageEditorExperience}from'./ImageEditorExperience.js';import {AudioEditorExperience}from'./AudioEditorExperience.js';import {friendlyMediaError}from'./videoEditor/mediaActions.js';import {createRemoteRunAction,createRemoteUploadMedia,proxiedMediaUrl,unwrapProxyUrl}from'./videoEditor/remoteMediaClient.js';import {renderExportSpec}from'./videoEditor/exportRenderer.js';import {startExportTask}from'./videoEditor/exportTask.js';import {useCanvasTask,ExportTaskCard}from'./videoEditor/ExportTaskCard.js';import {markTaskDelivered,dismissTask}from'./canvasTasks.js';import {getCachedCanvasBoards,fetchMyCanvasBoards,pushCanvasBoard}from'./surfaceIndex.js';import {useMediaSigning,useBoardMediaRefresh,applySrcRenewals}from'./useBoardMediaRefresh.js';import {readCachedCanvasBoards,writeCachedCanvasBoards}from'./canvasBoardsCatalog.js';import {hydrateCanvasBoardsSnapshot,persistCanvasBoardsSnapshot}from'./canvasBoardsSnapshot.js';import {boardSignature,mediaItemsFor,buildBoardState,reconcileDismissed,newBoardId,emptyBoardState,dimsForAspect,mediaKey}from'./canvasCore.js';import {visibleCreateGroups}from'./createTiles.js';import {parseDesignLink,parseMediaLink,parseCreateTileLink}from'./deepLinks.js';import {promoProjectToTimeline}from'./promoProjectImport.js';import {loadTemplateTimeline}from'./templateImport/loadTemplate.js';import {CanvasToolDock}from'./CanvasToolDock.js';import {describeSession}from'./sessionIdentity.js';import {DesignExperience}from'../design/DesignExperience.js';import {fetchMyDesigns}from'../design/designIndex.js';import {VideoGeneratorExperience}from'./VideoGeneratorExperience.js';import {VideoEditExperience}from'./VideoEditExperience.js';import {VideoClipsExperience}from'./VideoClipsExperience.js';import {FrameExtractorExperience}from'./FrameExtractorExperience.js';import {MoodboardExperience}from'./MoodboardExperience.js';import {SetStudioExperience}from'./SetStudioExperience.js';import {configureServerTasks}from'./serverTasks.js';import {setCanvasTasksHost}from'./canvasTaskSync.js';import {InfluencerStudioExperience}from'./InfluencerStudioExperience.js';import {CameraRecorderExperience}from'./recorder/CameraRecorderExperience.js';import {listStudioLooks}from'./studioLooks.js';import {CanvasThemeProvider,useCanvasTheme,themedStyles}from'./canvasTheme.js';import {Pressable,pressedStyle,ActionButton,RADIUS,SPACE,TYPE}from'./canvasUi.js';var __defProp = Object.defineProperty;
1
+ import {jsx,jsxs,Fragment}from'react/jsx-runtime';import {useMemo,useState,useRef,useEffect,useCallback}from'react';import {Image,View,Text,ActivityIndicator,StyleSheet}from'react-native';import {NativeCanvasViewer}from'./NativeCanvasViewer.js';import {CanvasBoardsGrid}from'./CanvasBoardsGrid.js';import {DesignCategoryGallery}from'./DesignCategoryGallery.js';import {fetchDesignCatalog,fetchDesignCatalogViaClient,interleaveTemplateRows}from'./designCatalog.js';import {designCategoryFor}from'./designCategories.js';import {SEEDANCE_SHOWCASE}from'./seedanceShowcase.js';import {TemplatesGallery}from'./home/TemplatesGallery.js';import {WORK_ARTIFACTS}from'./homeWork.js';import {CanvasAgentChatPane}from'./CanvasAgentChatPane.js';import {VideoEditorExperience}from'./VideoEditorExperience.js';import {ImageEditorExperience}from'./ImageEditorExperience.js';import {AudioEditorExperience}from'./AudioEditorExperience.js';import {friendlyMediaError}from'./videoEditor/mediaActions.js';import {createRemoteRunAction,createRemoteUploadMedia,proxiedMediaUrl,deriveBackendGraphqlUrl,unwrapProxyUrl}from'./videoEditor/remoteMediaClient.js';import {renderExportSpec}from'./videoEditor/exportRenderer.js';import {startExportTask}from'./videoEditor/exportTask.js';import {useCanvasTask,ExportTaskCard}from'./videoEditor/ExportTaskCard.js';import {markTaskDelivered,dismissTask}from'./canvasTasks.js';import {getCachedCanvasBoards,fetchMyCanvasBoards,pushCanvasBoard}from'./surfaceIndex.js';import {useMediaSigning,useBoardMediaRefresh,applySrcRenewals}from'./useBoardMediaRefresh.js';import {readCachedCanvasBoards,writeCachedCanvasBoards}from'./canvasBoardsCatalog.js';import {hydrateCanvasBoardsSnapshot,persistCanvasBoardsSnapshot}from'./canvasBoardsSnapshot.js';import {boardSignature,mediaItemsFor,buildBoardState,reconcileDismissed,newBoardId,emptyBoardState,dimsForAspect,mediaKey}from'./canvasCore.js';import {visibleCreateGroups,isDocsCreate}from'./createTiles.js';import {designEntryForCreate,parseDocLink,designTemplateIdOf,parseDesignLink,parseMediaLink,parseCreateTileLink}from'./deepLinks.js';import {promoProjectToTimeline}from'./promoProjectImport.js';import {loadTemplateTimeline}from'./templateImport/loadTemplate.js';import {CanvasToolDock}from'./CanvasToolDock.js';import {describeSession}from'./sessionIdentity.js';import {DesignExperience}from'../design/DesignExperience.js';import {listDesignArtifacts}from'../design/doc/artifacts.js';import {DocsEditorExperience}from'../docs/DocsEditorExperience.js';import {listDocArtifacts}from'../docs/docArtifacts.js';import {fetchMyDesigns}from'../design/designIndex.js';import {VideoGeneratorExperience}from'./VideoGeneratorExperience.js';import {VideoEditExperience}from'./VideoEditExperience.js';import {VideoClipsExperience}from'./VideoClipsExperience.js';import {FrameExtractorExperience}from'./FrameExtractorExperience.js';import {MoodboardExperience}from'./MoodboardExperience.js';import {SetStudioExperience}from'./SetStudioExperience.js';import {configureServerTasks}from'./serverTasks.js';import {setCanvasTasksHost}from'./canvasTaskSync.js';import {InfluencerStudioExperience}from'./InfluencerStudioExperience.js';import {CameraRecorderExperience}from'./recorder/CameraRecorderExperience.js';import {listStudioLooks}from'./studioLooks.js';import {CanvasThemeProvider,useCanvasTheme,themedStyles}from'./canvasTheme.js';import {Pressable,pressedStyle,RADIUS,SPACE,TYPE,ActionButton}from'./canvasUi.js';var __defProp = Object.defineProperty;
2
2
  var __defProps = Object.defineProperties;
3
3
  var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
4
  var __getOwnPropSymbols = Object.getOwnPropertySymbols;
@@ -86,7 +86,7 @@ function CanvasExperienceBody({
86
86
  artifactId,
87
87
  testID
88
88
  }) {
89
- var _a, _b, _c, _d, _e, _f, _g;
89
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i;
90
90
  const theme = useCanvasTheme();
91
91
  const styles = useMemo(() => makeStyles(theme), [theme]);
92
92
  const isDark = theme.isDark;
@@ -108,6 +108,13 @@ function CanvasExperienceBody({
108
108
  const [generation, setGeneration] = useState(0);
109
109
  const [mediaBusy, setMediaBusy] = useState(false);
110
110
  const [uploadStatus, setUploadStatus] = useState(null);
111
+ const [homeNotice, setHomeNotice] = useState(null);
112
+ useEffect(() => {
113
+ if (!homeNotice) return void 0;
114
+ const timer = setTimeout(() => setHomeNotice(null), 3200);
115
+ return () => clearTimeout(timer);
116
+ }, [homeNotice]);
117
+ const [designGallery, setDesignGallery] = useState(null);
111
118
  const lastSavedByIdRef = useRef({});
112
119
  const [boardsSettled, setBoardsSettled] = useState(false);
113
120
  const skipFetch = Boolean(explicitBoard);
@@ -250,9 +257,20 @@ function CanvasExperienceBody({
250
257
  setShowMoodboard(true);
251
258
  return;
252
259
  }
253
- const kind = studio === "flyers" ? "postcard" : studio === "carousel" ? "carousel" : "design";
254
- setDesignEntry({
255
- kind
260
+ if (studio === "docs") {
261
+ setDocEntry({
262
+ docId: null
263
+ });
264
+ return;
265
+ }
266
+ if (studio === "carousel") setDesignEntry({
267
+ categoryId: "carousel"
268
+ });
269
+ else if (studio === "flyers") setDesignEntry({
270
+ categoryId: "flyer"
271
+ });
272
+ else setDesignEntry({
273
+ kind: "design"
256
274
  });
257
275
  }, []);
258
276
  const reload = useCallback(() => setGeneration((n) => n + 1), []);
@@ -354,9 +372,17 @@ function CanvasExperienceBody({
354
372
  const exportTask = useCanvasTask(exportTaskId);
355
373
  const [designEntry, setDesignEntry] = useState(null);
356
374
  const [designs, setDesigns] = useState([]);
375
+ const [studioDesigns, setStudioDesigns] = useState([]);
376
+ const [docEntry, setDocEntry] = useState(null);
377
+ const [workDocs, setWorkDocs] = useState([]);
357
378
  const [featuredLooks, setFeaturedLooks] = useState([]);
379
+ const [studioMore, setStudioMore] = useState(false);
380
+ const [studioError, setStudioError] = useState(null);
381
+ const [workExpanded, setWorkExpanded] = useState(false);
382
+ const [studioRead, setStudioRead] = useState(0);
383
+ const [homeGallery, setHomeGallery] = useState(null);
358
384
  useEffect(() => {
359
- if (skipFetch || !token || !indexUrl || designEntry) return void 0;
385
+ if (skipFetch || !token || !indexUrl || designEntry || docEntry) return void 0;
360
386
  const controller = new AbortController();
361
387
  void fetchMyDesigns({
362
388
  url: indexUrl,
@@ -365,8 +391,27 @@ function CanvasExperienceBody({
365
391
  }).then((result) => {
366
392
  setDesigns(result.designs);
367
393
  });
394
+ const limit = workExpanded ? WORK_ARTIFACTS.expanded : WORK_ARTIFACTS.collapsed;
395
+ void listDesignArtifacts({
396
+ url: indexUrl,
397
+ token,
398
+ signal: controller.signal
399
+ }, limit).then((result) => {
400
+ if (controller.signal.aborted) return;
401
+ if (result.designs.length || !result.error) setStudioDesigns(result.designs);
402
+ setStudioMore(result.more);
403
+ setStudioError(result.error);
404
+ });
405
+ void listDocArtifacts({
406
+ url: indexUrl,
407
+ token,
408
+ signal: controller.signal
409
+ }, limit).then((result) => {
410
+ if (controller.signal.aborted) return;
411
+ if (result.docs.length || !result.error) setWorkDocs(result.docs);
412
+ });
368
413
  return () => controller.abort();
369
- }, [token, indexUrl, skipFetch, designEntry, generation]);
414
+ }, [token, indexUrl, skipFetch, designEntry, docEntry, generation, workExpanded, studioRead]);
370
415
  useEffect(() => {
371
416
  if (!token && !effectiveRunAction && !apolloClient) {
372
417
  setFeaturedLooks([]);
@@ -587,9 +632,22 @@ function CanvasExperienceBody({
587
632
  }
588
633
  }
589
634
  }, [onPickLocalMedia, openFreshBoardWithItem]);
590
- const canRunCreate = useCallback((action) => action.type !== "studio" || action.studio !== "image" && action.studio !== "audio" || Boolean(onPickLocalMedia && effectiveRunAction), [onPickLocalMedia, effectiveRunAction]);
635
+ const canRunCreate = useCallback((action) => {
636
+ if (action.type === "web") return true;
637
+ return action.type !== "studio" || action.studio !== "image" && action.studio !== "audio" || Boolean(onPickLocalMedia && effectiveRunAction);
638
+ }, [onPickLocalMedia, effectiveRunAction]);
591
639
  const createGroups = useMemo(() => visibleCreateGroups(canRunCreate), [canRunCreate]);
592
640
  const handleCreate = useCallback((action) => {
641
+ if (isDocsCreate(action)) {
642
+ setDocEntry({
643
+ docId: null
644
+ });
645
+ return;
646
+ }
647
+ if (action.type === "web") {
648
+ setDesignEntry(designEntryForCreate(action.create));
649
+ return;
650
+ }
593
651
  if (action.type === "design") {
594
652
  setDesignEntry({
595
653
  kind: action.kind
@@ -599,7 +657,7 @@ function CanvasExperienceBody({
599
657
  if (action.type === "generate") {
600
658
  if (action.mode === "slides") {
601
659
  setDesignEntry({
602
- kind: "design"
660
+ categoryId: "presentation"
603
661
  });
604
662
  return;
605
663
  }
@@ -629,6 +687,85 @@ function CanvasExperienceBody({
629
687
  handleDockStudio(action.studio);
630
688
  }
631
689
  }, [handleNewCanvas, handleDockStudio, pickThenEdit]);
690
+ const loadDesignCatalog = useMemo(() => {
691
+ const graphqlUrl = indexUrl ? deriveBackendGraphqlUrl(indexUrl) : null;
692
+ if (graphqlUrl) return (group, opts) => fetchDesignCatalog(graphqlUrl, token, group, opts);
693
+ if (apolloClient) return (group, opts) => fetchDesignCatalogViaClient(apolloClient, group, opts);
694
+ return void 0;
695
+ }, [indexUrl, token, apolloClient]);
696
+ const [templateRails, setTemplateRails] = useState(void 0);
697
+ const [templateRailsRead, setTemplateRailsRead] = useState(0);
698
+ useEffect(() => {
699
+ if (!loadDesignCatalog || skipFetch) {
700
+ setTemplateRails(void 0);
701
+ return void 0;
702
+ }
703
+ let live = true;
704
+ setTemplateRails((prev) => {
705
+ var _a2;
706
+ return {
707
+ status: "loading",
708
+ rows: (_a2 = prev == null ? void 0 : prev.rows) != null ? _a2 : [[], []]
709
+ };
710
+ });
711
+ const read = (group) => loadDesignCatalog(group, {
712
+ limit: 12,
713
+ offset: 0
714
+ }).then((page) => ({
715
+ ok: true,
716
+ cards: page.cards
717
+ }), () => ({
718
+ ok: false,
719
+ cards: []
720
+ }));
721
+ void Promise.all([read("canvas-flyer"), read("canvas-presentation")]).then(([flyers, slides]) => {
722
+ if (!live) return;
723
+ const rows = interleaveTemplateRows(flyers.cards, slides.cards);
724
+ setTemplateRails({
725
+ status: flyers.ok && slides.ok ? "ready" : "failed",
726
+ rows
727
+ });
728
+ });
729
+ return () => {
730
+ live = false;
731
+ };
732
+ }, [loadDesignCatalog, skipFetch, templateRailsRead]);
733
+ const openCategory = useCallback((tileId) => {
734
+ const category = designCategoryFor(tileId);
735
+ if (!category) return false;
736
+ setDesignGallery(category);
737
+ return true;
738
+ }, []);
739
+ const openTemplate = useCallback((templateId) => {
740
+ setDesignGallery(null);
741
+ setDesignEntry({
742
+ templateId
743
+ });
744
+ }, []);
745
+ const handleShowcasePrompt = useCallback((clip) => {
746
+ handleNewCanvas();
747
+ setGenerator({
748
+ mode: "video",
749
+ initialPrompt: clip.prompt
750
+ });
751
+ }, [handleNewCanvas]);
752
+ const handleStartWithPrompt = useCallback((prompt, settings) => {
753
+ handleNewCanvas();
754
+ setGenerator(__spreadValues({
755
+ mode: settings.mode,
756
+ initialPrompt: prompt,
757
+ aspect: settings.aspect,
758
+ resolution: settings.resolution
759
+ }, settings.referenceImageUrl ? {
760
+ referenceImageUrl: settings.referenceImageUrl
761
+ } : {}));
762
+ }, [handleNewCanvas]);
763
+ const pickHeroReference = useCallback(async () => {
764
+ var _a2, _b2;
765
+ if (!onPickLocalMedia) return null;
766
+ const picked = await onPickLocalMedia(void 0, "library");
767
+ return (_b2 = (_a2 = picked.find((it) => it.type === "image")) == null ? void 0 : _a2.src) != null ? _b2 : null;
768
+ }, [onPickLocalMedia]);
632
769
  const openMediaLink = useCallback(async (link) => {
633
770
  var _a2, _b2, _c2;
634
771
  const size = link.kind === "image" ? await new Promise((resolve) => {
@@ -661,6 +798,23 @@ function CanvasExperienceBody({
661
798
  useEffect(() => {
662
799
  if (designLinkRanRef.current || skipFetch) return;
663
800
  designLinkRanRef.current = true;
801
+ const docLink = parseDocLink({
802
+ designId,
803
+ artifactId
804
+ });
805
+ if (docLink) {
806
+ setDocEntry({
807
+ docId: docLink
808
+ });
809
+ return;
810
+ }
811
+ const templateId = designId || artifactId ? null : designTemplateIdOf(designTemplateId);
812
+ if (templateId) {
813
+ setDesignEntry({
814
+ templateId
815
+ });
816
+ return;
817
+ }
664
818
  const entry = parseDesignLink({
665
819
  designId,
666
820
  designTemplateId,
@@ -677,6 +831,10 @@ function CanvasExperienceBody({
677
831
  designTemplateId,
678
832
  artifactId
679
833
  })) return;
834
+ if (parseDocLink({
835
+ designId,
836
+ artifactId
837
+ })) return;
680
838
  const mediaLink = parseMediaLink(media);
681
839
  if (mediaLink) {
682
840
  void openMediaLink(mediaLink);
@@ -686,7 +844,16 @@ function CanvasExperienceBody({
686
844
  if (action) handleCreate(action);
687
845
  }, [boardsSettled, skipFetch]);
688
846
  if (generator) {
689
- return /* @__PURE__ */ jsx(VideoGeneratorExperience, { mode: generator.mode, item: generator.item, restyle: generator.restyle, initialPrompt: generator.initialPrompt, runAction: effectiveRunAction, onClose: () => setGenerator(null), onGenerated: (url, meta) => {
847
+ return /* @__PURE__ */ jsx(VideoGeneratorExperience, { mode: generator.mode, item: (_b = generator.item) != null ? _b : generator.referenceImageUrl && generator.mode === "video" ? {
848
+ id: "hero-reference",
849
+ type: "image",
850
+ src: generator.referenceImageUrl,
851
+ x: 0,
852
+ y: 0,
853
+ width: 0,
854
+ height: 0,
855
+ zIndex: 0
856
+ } : void 0, restyle: generator.restyle, initialPrompt: generator.initialPrompt, initialAspect: generator.aspect, initialResolution: generator.resolution, initialReferenceUrl: generator.referenceImageUrl, boardId: selectedId, runAction: effectiveRunAction, onClose: () => setGenerator(null), onGenerated: (url, meta) => {
690
857
  const kind = meta.mode === "audio" ? "audio" : meta.mode === "image" ? "image" : "video";
691
858
  addBoardItem(kind, url, {
692
859
  name: `${kind === "image" ? "Image" : kind === "audio" ? "Audio" : meta.mode === "promo" ? "Promo" : "Video"} \xB7 ${meta.prompt.slice(0, 28)}`,
@@ -705,7 +872,7 @@ function CanvasExperienceBody({
705
872
  } });
706
873
  }
707
874
  if (showFrames) {
708
- return /* @__PURE__ */ jsx(FrameExtractorExperience, { boardItems: (_b = selected == null ? void 0 : selected.board.items) != null ? _b : [], seedVideo: (boardSelectedItem == null ? void 0 : boardSelectedItem.type) === "video" ? boardSelectedItem : null, runAction: effectiveRunAction, onClose: () => setShowFrames(false), onPlace: (urls) => {
875
+ return /* @__PURE__ */ jsx(FrameExtractorExperience, { boardItems: (_c = selected == null ? void 0 : selected.board.items) != null ? _c : [], seedVideo: (boardSelectedItem == null ? void 0 : boardSelectedItem.type) === "video" ? boardSelectedItem : null, runAction: effectiveRunAction, onClose: () => setShowFrames(false), onPlace: (urls) => {
709
876
  urls.forEach((url, i) => addBoardItem("image", url, {
710
877
  name: `Frame ${i + 1}`
711
878
  }));
@@ -713,7 +880,7 @@ function CanvasExperienceBody({
713
880
  } });
714
881
  }
715
882
  if (showMoodboard) {
716
- return /* @__PURE__ */ jsx(MoodboardExperience, { boardItems: (_c = selected == null ? void 0 : selected.board.items) != null ? _c : [], onClose: () => setShowMoodboard(false), onUseBrief: (brief) => {
883
+ return /* @__PURE__ */ jsx(MoodboardExperience, { boardItems: (_d = selected == null ? void 0 : selected.board.items) != null ? _d : [], onClose: () => setShowMoodboard(false), onUseBrief: (brief) => {
717
884
  setShowMoodboard(false);
718
885
  setGenerator({
719
886
  mode: "image",
@@ -722,26 +889,26 @@ function CanvasExperienceBody({
722
889
  } });
723
890
  }
724
891
  if (showSet3d) {
725
- return /* @__PURE__ */ jsx(SetStudioExperience, { boardItems: (_d = selected == null ? void 0 : selected.board.items) != null ? _d : [], runAction: effectiveRunAction, uploadMedia: effectiveUploadMedia, token, indexUrl, onClose: () => setShowSet3d(false), onPlace: (kind, url, name) => {
892
+ return /* @__PURE__ */ jsx(SetStudioExperience, { boardItems: (_e = selected == null ? void 0 : selected.board.items) != null ? _e : [], runAction: effectiveRunAction, uploadMedia: effectiveUploadMedia, token, indexUrl, onClose: () => setShowSet3d(false), onPlace: (kind, url, name) => {
726
893
  addBoardItem(kind, url, {
727
894
  name
728
895
  });
729
896
  } });
730
897
  }
731
898
  if (showRecorder) {
732
- return /* @__PURE__ */ jsx(CameraRecorderExperience, { onClose: () => setShowRecorder(false), onPick: async (source) => {
899
+ return /* @__PURE__ */ jsx(CameraRecorderExperience, { runAction: effectiveRunAction, onClose: () => setShowRecorder(false), onPick: async (source) => {
733
900
  if (!onPickLocalMedia) return [];
734
901
  return onPickLocalMedia(void 0, source);
735
902
  }, onPlaced: (items) => {
736
903
  for (const item of items) {
737
- addBoardItem(item.type === "video" ? "video" : "image", item.src, {
904
+ addBoardItem(item.type, item.src, {
738
905
  name: item.generatedAssetName
739
906
  });
740
907
  }
741
908
  } });
742
909
  }
743
910
  if (showInfluencer) {
744
- return /* @__PURE__ */ jsx(InfluencerStudioExperience, { boardItems: (_e = selected == null ? void 0 : selected.board.items) != null ? _e : [], runAction: effectiveRunAction, onClose: () => setShowInfluencer(false), onPlace: (url, name) => {
911
+ return /* @__PURE__ */ jsx(InfluencerStudioExperience, { boardItems: (_f = selected == null ? void 0 : selected.board.items) != null ? _f : [], runAction: effectiveRunAction, onClose: () => setShowInfluencer(false), onPlace: (url, name) => {
745
912
  addBoardItem("video", url, {
746
913
  name,
747
914
  aspect: "9:16"
@@ -750,7 +917,7 @@ function CanvasExperienceBody({
750
917
  } });
751
918
  }
752
919
  if (videoEdit) {
753
- return /* @__PURE__ */ jsx(VideoEditExperience, { src: videoEdit.src, name: videoEdit.generatedAssetName, items: (_f = selected == null ? void 0 : selected.board.items) != null ? _f : [], runAction: effectiveRunAction, onClose: () => setVideoEdit(null), onApplied: (url, kind) => {
920
+ return /* @__PURE__ */ jsx(VideoEditExperience, { src: videoEdit.src, name: videoEdit.generatedAssetName, items: (_g = selected == null ? void 0 : selected.board.items) != null ? _g : [], runAction: effectiveRunAction, onClose: () => setVideoEdit(null), onApplied: (url, kind) => {
754
921
  if (kind === "audio") {
755
922
  addBoardItem("audio", url, {
756
923
  name: "Extracted audio"
@@ -784,6 +951,7 @@ function CanvasExperienceBody({
784
951
  src: mediaEdit.item.src,
785
952
  name: mediaEdit.item.generatedAssetName,
786
953
  runAction: effectiveRunAction,
954
+ libraryItems: (_h = selected == null ? void 0 : selected.board.items) != null ? _h : [],
787
955
  onClose: () => setMediaEdit(null),
788
956
  onSave: (url) => {
789
957
  patchItemSrc(mediaEdit.item.id, url, mediaEdit.kind);
@@ -794,7 +962,7 @@ function CanvasExperienceBody({
794
962
  }
795
963
  if (editorSeed) {
796
964
  return /* @__PURE__ */ jsxs(View, { style: styles.fill, children: [
797
- /* @__PURE__ */ jsx(VideoEditorExperience, { items: (_g = selected == null ? void 0 : selected.board.items) != null ? _g : [], seedItemId: editorSeed.itemId, initialTimeline: editorSeed.initialTimeline, projectTitle: editorSeed.projectTitle || (selected == null ? void 0 : selected.board.title) || (selected == null ? void 0 : selected.title), initialLogoSrc: editorSeed.logoSrc, onClose: () => setEditorSeed(null), onExport: effectiveOnExport, onPickLocalMedia, runAction: effectiveRunAction, uploadMedia: effectiveUploadMedia, audioRecorder, apolloClient, token, indexUrl, initialRailTab: editorSeed.initialRailTab }),
965
+ /* @__PURE__ */ jsx(VideoEditorExperience, { items: (_i = selected == null ? void 0 : selected.board.items) != null ? _i : [], seedItemId: editorSeed.itemId, initialTimeline: editorSeed.initialTimeline, projectTitle: editorSeed.projectTitle || (selected == null ? void 0 : selected.board.title) || (selected == null ? void 0 : selected.title), initialLogoSrc: editorSeed.logoSrc, onClose: () => setEditorSeed(null), onExport: effectiveOnExport, onPickLocalMedia, runAction: effectiveRunAction, uploadMedia: effectiveUploadMedia, audioRecorder, apolloClient, token, indexUrl, initialRailTab: editorSeed.initialRailTab }),
798
966
  exportTask ? /* @__PURE__ */ jsx(View, { style: styles.exportOverlay, children: /* @__PURE__ */ jsx(ExportTaskCard, { task: exportTask, onDismiss: () => {
799
967
  dismissTask(exportTask.id);
800
968
  setExportTaskId(null);
@@ -810,21 +978,68 @@ function CanvasExperienceBody({
810
978
  ] }) }) }) : null
811
979
  ] });
812
980
  }
981
+ if (docEntry) {
982
+ return /* @__PURE__ */ jsx(View, { style: styles.fill, testID, children: /* @__PURE__ */ jsx(DocsEditorExperience, { token, indexUrl, docId: docEntry.docId, onClose: () => setDocEntry(null), onPickLocalMedia, uploadMedia: effectiveUploadMedia }) });
983
+ }
813
984
  if (designEntry) {
814
985
  return /* @__PURE__ */ jsx(View, { style: styles.fill, testID, children: /* @__PURE__ */ jsx(DesignExperience, { token, indexUrl, entry: designEntry, onClose: () => setDesignEntry(null), onPickLocalMedia, uploadMedia: effectiveUploadMedia, runMediaAction: effectiveRunAction }) });
815
986
  }
987
+ if (!selected && homeGallery) {
988
+ return /* @__PURE__ */ jsx(View, { style: styles.fill, testID, children: /* @__PURE__ */ jsx(TemplatesGallery, { initialSource: homeGallery, runAction: effectiveRunAction, loadDesignCatalog, onClose: () => setHomeGallery(null), onUseVideoTemplate: (template) => {
989
+ setHomeGallery(null);
990
+ handleNewCanvas();
991
+ setGenerator(__spreadValues({
992
+ mode: "video",
993
+ initialPrompt: template.prompt
994
+ }, template.aspect ? {
995
+ aspect: template.aspect
996
+ } : {}));
997
+ }, onBlank: (size) => {
998
+ setHomeGallery(null);
999
+ setDesignEntry({
1000
+ sizeId: size.id
1001
+ });
1002
+ }, onOpenTemplate: (card) => {
1003
+ setHomeGallery(null);
1004
+ openTemplate(card.id);
1005
+ } }) });
1006
+ }
1007
+ if (!selected && designGallery) {
1008
+ const category = designGallery;
1009
+ return /* @__PURE__ */ jsxs(View, { style: styles.fill, testID, children: [
1010
+ /* @__PURE__ */ jsx(DesignCategoryGallery, { category, load: loadDesignCatalog, onClose: () => setDesignGallery(null), onBlank: (size) => {
1011
+ setDesignGallery(null);
1012
+ setDesignEntry({
1013
+ sizeId: size.id
1014
+ });
1015
+ }, onOpenTemplate: (card) => openTemplate(card.id) }),
1016
+ homeNotice ? /* @__PURE__ */ jsx(View, { pointerEvents: "none", style: styles.uploadToast, children: /* @__PURE__ */ jsx(Text, { style: styles.uploadToastText, numberOfLines: 2, children: homeNotice }) }) : null
1017
+ ] });
1018
+ }
816
1019
  if (!selected) {
817
1020
  return /* @__PURE__ */ jsxs(View, { style: styles.fill, testID, children: [
818
1021
  loading && boards.length === 0 ? /* @__PURE__ */ jsx(View, { style: styles.gridLoading, pointerEvents: "none", children: /* @__PURE__ */ jsx(ActivityIndicator, { size: "small" }) }) : null,
819
1022
  /* @__PURE__ */ jsx(CanvasBoardsGrid, { boards: boards.filter((entry) => entry.itemCount > 0), onOpen: setSelectedId, onNewCanvas: handleNewCanvas, designs, onOpenDesign: (designChannelId) => setDesignEntry({
820
1023
  channelId: designChannelId
1024
+ }), studioDesigns, onOpenStudioDesign: (id) => setDesignEntry({
1025
+ artifactId: id
1026
+ }), docs: workDocs, onOpenDoc: (id) => setDocEntry({
1027
+ docId: id
821
1028
  }), onAskAgent: handleAskAgentFromGrid, createGroups, onCreate: handleCreate, runAction: effectiveRunAction, featuredLooks, onRecreateLook: (look) => {
822
- setGenerator({
1029
+ setGenerator(__spreadValues({
823
1030
  mode: "video",
824
1031
  initialPrompt: look.prompt
825
- });
1032
+ }, look.aspect ? {
1033
+ aspect: look.aspect
1034
+ } : {}));
1035
+ }, onOpenCategory: openCategory, templateRails, onOpenTemplate: openTemplate, onSeeAllTemplates: () => setHomeGallery("flyers"), onRetryTemplates: () => setTemplateRailsRead((n) => n + 1), showcase: SEEDANCE_SHOWCASE, onUseShowcasePrompt: handleShowcasePrompt, onStartWithPrompt: handleStartWithPrompt, onPickReference: onPickLocalMedia ? pickHeroReference : void 0, onBrowseTemplates: () => setHomeGallery("video"), studioMore, studioError, onRetryStudioDesigns: () => setStudioRead((n) => n + 1), onExpandWork: setWorkExpanded, currentSessionId: channelId, onOpenSession: (sessionId) => {
1036
+ setBoards((prev) => prev.some((entry) => entry.channelId === sessionId) ? prev : [untitledBoard(sessionId), ...prev]);
1037
+ setSelectedId(sessionId);
826
1038
  } }),
827
- /* @__PURE__ */ jsx(CanvasAgentChatPane, { visible: gridAgentOpen, onClose: () => setGridAgentOpen(false), runAction: effectiveRunAction, boardItems: [], onGenerated: (url, meta) => {
1039
+ homeNotice ? /* @__PURE__ */ jsx(View, { pointerEvents: "none", style: styles.uploadToast, children: /* @__PURE__ */ jsx(Text, { style: styles.uploadToastText, numberOfLines: 2, children: homeNotice }) }) : null,
1040
+ /* @__PURE__ */ jsx(CanvasAgentChatPane, { visible: gridAgentOpen, onClose: () => setGridAgentOpen(false), onOpenDesign: (artifactId2) => setDesignEntry({
1041
+ artifactId: artifactId2
1042
+ }), runAction: effectiveRunAction, boardItems: [], onGenerated: (url, meta) => {
828
1043
  const kind = meta.mode === "audio" ? "audio" : meta.mode === "image" ? "image" : "video";
829
1044
  return openFreshBoardWithItem(kind, url, {
830
1045
  name: `${kind === "image" ? "Image" : kind === "audio" ? "Audio" : "Video"} \xB7 ${(meta.title || meta.prompt).slice(0, 28)}`,
@@ -844,7 +1059,7 @@ function CanvasExperienceBody({
844
1059
  }), onPickStorage: (kind, url, name) => addBoardItem(kind, url, {
845
1060
  name
846
1061
  }), onStudio: handleDockStudio, onSlides: () => setDesignEntry({
847
- kind: "design"
1062
+ categoryId: "presentation"
848
1063
  }), onGenerated: (url, meta) => {
849
1064
  const kind = meta.mode === "audio" ? "audio" : meta.mode === "image" ? "image" : "video";
850
1065
  addBoardItem(kind, url, {