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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (360) hide show
  1. package/lib/compute.js +57 -1
  2. package/lib/compute.js.map +1 -1
  3. package/lib/features/agent-chat/NativeAgentChat.js +3 -2
  4. package/lib/features/agent-chat/NativeAgentChat.js.map +1 -1
  5. package/lib/features/apps/AppsCatalog.js +10 -0
  6. package/lib/features/apps/AppsCatalog.js.map +1 -1
  7. package/lib/features/apps/mobileAppCatalog.js +11 -0
  8. package/lib/features/apps/mobileAppCatalog.js.map +1 -1
  9. package/lib/features/canvas/AudioEditorExperience.js +448 -105
  10. package/lib/features/canvas/AudioEditorExperience.js.map +1 -1
  11. package/lib/features/canvas/CanvasAgentChatPane.js +33 -14
  12. package/lib/features/canvas/CanvasAgentChatPane.js.map +1 -1
  13. package/lib/features/canvas/CanvasBoardsGrid.js +493 -41
  14. package/lib/features/canvas/CanvasBoardsGrid.js.map +1 -1
  15. package/lib/features/canvas/CanvasChatResultCard.js.map +1 -1
  16. package/lib/features/canvas/CanvasEditToolsPanel.js +37 -1
  17. package/lib/features/canvas/CanvasEditToolsPanel.js.map +1 -1
  18. package/lib/features/canvas/CanvasExperience.js +237 -22
  19. package/lib/features/canvas/CanvasExperience.js.map +1 -1
  20. package/lib/features/canvas/CanvasGeneratePanel.js +119 -26
  21. package/lib/features/canvas/CanvasGeneratePanel.js.map +1 -1
  22. package/lib/features/canvas/CanvasLooksPanel.js +17 -6
  23. package/lib/features/canvas/CanvasLooksPanel.js.map +1 -1
  24. package/lib/features/canvas/CanvasTasksPanel.js +18 -1
  25. package/lib/features/canvas/CanvasTasksPanel.js.map +1 -1
  26. package/lib/features/canvas/DesignCategoryGallery.js +423 -0
  27. package/lib/features/canvas/DesignCategoryGallery.js.map +1 -0
  28. package/lib/features/canvas/ImageEditorExperience.js +763 -187
  29. package/lib/features/canvas/ImageEditorExperience.js.map +1 -1
  30. package/lib/features/canvas/SetStudioExperience.js +199 -11
  31. package/lib/features/canvas/SetStudioExperience.js.map +1 -1
  32. package/lib/features/canvas/VideoEditorExperience.js +59 -40
  33. package/lib/features/canvas/VideoEditorExperience.js.map +1 -1
  34. package/lib/features/canvas/VideoGeneratorExperience.js +134 -34
  35. package/lib/features/canvas/VideoGeneratorExperience.js.map +1 -1
  36. package/lib/features/canvas/aiEdit.js +4 -2
  37. package/lib/features/canvas/aiEdit.js.map +1 -1
  38. package/lib/features/canvas/audioEditor/AudioWaveform.js +96 -0
  39. package/lib/features/canvas/audioEditor/AudioWaveform.js.map +1 -0
  40. package/lib/features/canvas/audioEditor/audioPeaks.js +93 -0
  41. package/lib/features/canvas/audioEditor/audioPeaks.js.map +1 -0
  42. package/lib/features/canvas/canvasTaskSync.js +34 -7
  43. package/lib/features/canvas/canvasTaskSync.js.map +1 -1
  44. package/lib/features/canvas/canvasTasks.js +23 -3
  45. package/lib/features/canvas/canvasTasks.js.map +1 -1
  46. package/lib/features/canvas/canvasTheme.js +10 -24
  47. package/lib/features/canvas/canvasTheme.js.map +1 -1
  48. package/lib/features/canvas/canvasUi.js +1 -1
  49. package/lib/features/canvas/canvasUi.js.map +1 -1
  50. package/lib/features/canvas/createTiles.js +17 -9
  51. package/lib/features/canvas/createTiles.js.map +1 -1
  52. package/lib/features/canvas/deepLinks.js +35 -5
  53. package/lib/features/canvas/deepLinks.js.map +1 -1
  54. package/lib/features/canvas/designCatalog.js +165 -0
  55. package/lib/features/canvas/designCatalog.js.map +1 -0
  56. package/lib/features/canvas/designCategories.js +262 -0
  57. package/lib/features/canvas/designCategories.js.map +1 -0
  58. package/lib/features/canvas/editorControls.js +406 -0
  59. package/lib/features/canvas/editorControls.js.map +1 -0
  60. package/lib/features/canvas/generationModels.js +5 -3
  61. package/lib/features/canvas/generationModels.js.map +1 -1
  62. package/lib/features/canvas/generationTasks.js +162 -0
  63. package/lib/features/canvas/generationTasks.js.map +1 -0
  64. package/lib/features/canvas/generator/BottomSheet.js +167 -0
  65. package/lib/features/canvas/generator/BottomSheet.js.map +1 -0
  66. package/lib/features/canvas/generator/BusinessCardChatCard.js +155 -0
  67. package/lib/features/canvas/generator/BusinessCardChatCard.js.map +1 -0
  68. package/lib/features/canvas/generator/DirectorSheet.js +163 -0
  69. package/lib/features/canvas/generator/DirectorSheet.js.map +1 -0
  70. package/lib/features/canvas/generator/ReframePreview.js +122 -0
  71. package/lib/features/canvas/generator/ReframePreview.js.map +1 -0
  72. package/lib/features/canvas/generator/RunLogCard.js +119 -0
  73. package/lib/features/canvas/generator/RunLogCard.js.map +1 -0
  74. package/lib/features/canvas/generator/ShotPanel.js +261 -0
  75. package/lib/features/canvas/generator/ShotPanel.js.map +1 -0
  76. package/lib/features/canvas/generator/businessCardWidget.js +117 -0
  77. package/lib/features/canvas/generator/businessCardWidget.js.map +1 -0
  78. package/lib/features/canvas/generator/cameraVocabulary.js +142 -0
  79. package/lib/features/canvas/generator/cameraVocabulary.js.map +1 -0
  80. package/lib/features/canvas/generator/cinematicVocabulary.js +416 -0
  81. package/lib/features/canvas/generator/cinematicVocabulary.js.map +1 -0
  82. package/lib/features/canvas/generator/direction.js +41 -0
  83. package/lib/features/canvas/generator/direction.js.map +1 -0
  84. package/lib/features/canvas/generator/reframeGeometry.js +108 -0
  85. package/lib/features/canvas/generator/reframeGeometry.js.map +1 -0
  86. package/lib/features/canvas/generator/runLog.js +71 -0
  87. package/lib/features/canvas/generator/runLog.js.map +1 -0
  88. package/lib/features/canvas/generator/shot.js +133 -0
  89. package/lib/features/canvas/generator/shot.js.map +1 -0
  90. package/lib/features/canvas/generator/useShotSpec.js +87 -0
  91. package/lib/features/canvas/generator/useShotSpec.js.map +1 -0
  92. package/lib/features/canvas/home/HeroComposer.js +214 -0
  93. package/lib/features/canvas/home/HeroComposer.js.map +1 -0
  94. package/lib/features/canvas/home/HeroMonitor.js +225 -0
  95. package/lib/features/canvas/home/HeroMonitor.js.map +1 -0
  96. package/lib/features/canvas/home/LookDetail.js +185 -0
  97. package/lib/features/canvas/home/LookDetail.js.map +1 -0
  98. package/lib/features/canvas/home/LoopingVideo.js +37 -0
  99. package/lib/features/canvas/home/LoopingVideo.js.map +1 -0
  100. package/lib/features/canvas/home/TemplatesGallery.js +253 -0
  101. package/lib/features/canvas/home/TemplatesGallery.js.map +1 -0
  102. package/lib/features/canvas/home/heroShots.js +100 -0
  103. package/lib/features/canvas/home/heroShots.js.map +1 -0
  104. package/lib/features/canvas/homeWork.js +62 -3
  105. package/lib/features/canvas/homeWork.js.map +1 -1
  106. package/lib/features/canvas/imageEditor/ImageMarkup.js +195 -0
  107. package/lib/features/canvas/imageEditor/ImageMarkup.js.map +1 -0
  108. package/lib/features/canvas/imageEditor/imageEditOps.js +367 -0
  109. package/lib/features/canvas/imageEditor/imageEditOps.js.map +1 -0
  110. package/lib/features/canvas/nativeViewerRegistry.js.map +1 -1
  111. package/lib/features/canvas/rankedCatalogSearch.js +375 -0
  112. package/lib/features/canvas/rankedCatalogSearch.js.map +1 -0
  113. package/lib/features/canvas/recorder/CameraRecorderExperience.js +68 -20
  114. package/lib/features/canvas/recorder/CameraRecorderExperience.js.map +1 -1
  115. package/lib/features/canvas/recorder/RecordingReview.js +272 -0
  116. package/lib/features/canvas/recorder/RecordingReview.js.map +1 -0
  117. package/lib/features/canvas/recorder/RecordingsList.js +179 -0
  118. package/lib/features/canvas/recorder/RecordingsList.js.map +1 -0
  119. package/lib/features/canvas/recorder/recorderOps.js +99 -0
  120. package/lib/features/canvas/recorder/recorderOps.js.map +1 -0
  121. package/lib/features/canvas/seedanceShowcase.js +314 -0
  122. package/lib/features/canvas/seedanceShowcase.js.map +1 -0
  123. package/lib/features/canvas/serverTasks.js +149 -15
  124. package/lib/features/canvas/serverTasks.js.map +1 -1
  125. package/lib/features/canvas/sessionRenewal.js +114 -0
  126. package/lib/features/canvas/sessionRenewal.js.map +1 -0
  127. package/lib/features/canvas/set/SetViewportWebView.js +34 -1
  128. package/lib/features/canvas/set/SetViewportWebView.js.map +1 -1
  129. package/lib/features/canvas/set/agent/setTurn.js +4 -2
  130. package/lib/features/canvas/set/agent/setTurn.js.map +1 -1
  131. package/lib/features/canvas/set/setPresets.js +85 -0
  132. package/lib/features/canvas/set/setPresets.js.map +1 -0
  133. package/lib/features/canvas/set/setProject.js +4 -1
  134. package/lib/features/canvas/set/setProject.js.map +1 -1
  135. package/lib/features/canvas/studioCatalog.js +59 -4
  136. package/lib/features/canvas/studioCatalog.js.map +1 -1
  137. package/lib/features/canvas/studioLooks.js +31 -4
  138. package/lib/features/canvas/studioLooks.js.map +1 -1
  139. package/lib/features/canvas/surfaceIndex.js +1 -14
  140. package/lib/features/canvas/surfaceIndex.js.map +1 -1
  141. package/lib/features/canvas/templateSearch.js +489 -0
  142. package/lib/features/canvas/templateSearch.js.map +1 -0
  143. package/lib/features/canvas/useCanvasSession.js +28 -6
  144. package/lib/features/canvas/useCanvasSession.js.map +1 -1
  145. package/lib/features/canvas/useStudioCatalogTemplates.js +41 -5
  146. package/lib/features/canvas/useStudioCatalogTemplates.js.map +1 -1
  147. package/lib/features/canvas/videoEditor/EditorPanels.js +531 -0
  148. package/lib/features/canvas/videoEditor/EditorPanels.js.map +1 -0
  149. package/lib/features/canvas/videoEditor/agent/AgentCutPane.js +48 -4
  150. package/lib/features/canvas/videoEditor/agent/AgentCutPane.js.map +1 -1
  151. package/lib/features/canvas/videoEditor/agent/agentLoop.js +2 -0
  152. package/lib/features/canvas/videoEditor/agent/agentLoop.js.map +1 -1
  153. package/lib/features/canvas/videoEditor/agent/brainClient.js +97 -27
  154. package/lib/features/canvas/videoEditor/agent/brainClient.js.map +1 -1
  155. package/lib/features/canvas/videoEditor/agent/cutTools.js +707 -3
  156. package/lib/features/canvas/videoEditor/agent/cutTools.js.map +1 -1
  157. package/lib/features/canvas/videoEditor/audioServices.js +165 -0
  158. package/lib/features/canvas/videoEditor/audioServices.js.map +1 -0
  159. package/lib/features/canvas/videoEditor/captions.js +144 -0
  160. package/lib/features/canvas/videoEditor/captions.js.map +1 -0
  161. package/lib/features/canvas/videoEditor/compileTimeline.js +24 -16
  162. package/lib/features/canvas/videoEditor/compileTimeline.js.map +1 -1
  163. package/lib/features/canvas/videoEditor/editorModel.js +12 -2
  164. package/lib/features/canvas/videoEditor/editorModel.js.map +1 -1
  165. package/lib/features/canvas/videoEditor/exportTask.js +89 -7
  166. package/lib/features/canvas/videoEditor/exportTask.js.map +1 -1
  167. package/lib/features/canvas/videoEditor/layers.js +117 -0
  168. package/lib/features/canvas/videoEditor/layers.js.map +1 -0
  169. package/lib/features/canvas/videoEditor/remoteMediaClient.js +45 -18
  170. package/lib/features/canvas/videoEditor/remoteMediaClient.js.map +1 -1
  171. package/lib/features/canvas/videoEditor/renderTimeline.js +18 -6
  172. package/lib/features/canvas/videoEditor/renderTimeline.js.map +1 -1
  173. package/lib/features/canvas/videoEditor/revoice.js +138 -0
  174. package/lib/features/canvas/videoEditor/revoice.js.map +1 -0
  175. package/lib/features/canvas/videoEditor/storageUpload.js +34 -0
  176. package/lib/features/canvas/videoEditor/storageUpload.js.map +1 -0
  177. package/lib/features/canvas/videoEditor/textMotion.js +109 -0
  178. package/lib/features/canvas/videoEditor/textMotion.js.map +1 -0
  179. package/lib/features/canvas/videoEditor/transitions.js +31 -0
  180. package/lib/features/canvas/videoEditor/transitions.js.map +1 -0
  181. package/lib/features/chat/TemplatesChatCards.js +8 -3
  182. package/lib/features/chat/TemplatesChatCards.js.map +1 -1
  183. package/lib/features/design/DesignEditorExperience.js +674 -644
  184. package/lib/features/design/DesignEditorExperience.js.map +1 -1
  185. package/lib/features/design/DesignExperience.js +285 -538
  186. package/lib/features/design/DesignExperience.js.map +1 -1
  187. package/lib/features/design/designCore.js +2 -212
  188. package/lib/features/design/designCore.js.map +1 -1
  189. package/lib/features/design/designIndex.js +1 -50
  190. package/lib/features/design/designIndex.js.map +1 -1
  191. package/lib/features/design/doc/aiDesign.js +247 -0
  192. package/lib/features/design/doc/aiDesign.js.map +1 -0
  193. package/lib/features/design/doc/artifacts.js +280 -0
  194. package/lib/features/design/doc/artifacts.js.map +1 -0
  195. package/lib/features/design/doc/chart.js +98 -0
  196. package/lib/features/design/doc/chart.js.map +1 -0
  197. package/lib/features/design/doc/crop.js +104 -0
  198. package/lib/features/design/doc/crop.js.map +1 -0
  199. package/lib/features/design/doc/curve.js +49 -0
  200. package/lib/features/design/doc/curve.js.map +1 -0
  201. package/lib/features/design/doc/docOps.js +397 -0
  202. package/lib/features/design/doc/docOps.js.map +1 -0
  203. package/lib/features/design/doc/findReplace.js +112 -0
  204. package/lib/features/design/doc/findReplace.js.map +1 -0
  205. package/lib/features/design/doc/fonts.js +79 -0
  206. package/lib/features/design/doc/fonts.js.map +1 -0
  207. package/lib/features/design/doc/frames.js +17 -0
  208. package/lib/features/design/doc/frames.js.map +1 -0
  209. package/lib/features/design/doc/geometry.js +133 -0
  210. package/lib/features/design/doc/geometry.js.map +1 -0
  211. package/lib/features/design/doc/imageAdjust.js +203 -0
  212. package/lib/features/design/doc/imageAdjust.js.map +1 -0
  213. package/lib/features/design/doc/legacyDoc.js +107 -0
  214. package/lib/features/design/doc/legacyDoc.js.map +1 -0
  215. package/lib/features/design/doc/newDoc.js +335 -0
  216. package/lib/features/design/doc/newDoc.js.map +1 -0
  217. package/lib/features/design/doc/pageRange.js +17 -0
  218. package/lib/features/design/doc/pageRange.js.map +1 -0
  219. package/lib/features/design/doc/pathScale.js +68 -0
  220. package/lib/features/design/doc/pathScale.js.map +1 -0
  221. package/lib/features/design/doc/qr.js +62 -0
  222. package/lib/features/design/doc/qr.js.map +1 -0
  223. package/lib/features/design/doc/shapes.js +366 -0
  224. package/lib/features/design/doc/shapes.js.map +1 -0
  225. package/lib/features/design/doc/sizes.js +230 -0
  226. package/lib/features/design/doc/sizes.js.map +1 -0
  227. package/lib/features/design/doc/textEffects.js +134 -0
  228. package/lib/features/design/doc/textEffects.js.map +1 -0
  229. package/lib/features/design/doc/textLayout.js +182 -0
  230. package/lib/features/design/doc/textLayout.js.map +1 -0
  231. package/lib/features/design/doc/types.js +30 -0
  232. package/lib/features/design/doc/types.js.map +1 -0
  233. package/lib/features/design/editor/AiPanel.js +194 -0
  234. package/lib/features/design/editor/AiPanel.js.map +1 -0
  235. package/lib/features/design/editor/ChartDataPanel.js +182 -0
  236. package/lib/features/design/editor/ChartDataPanel.js.map +1 -0
  237. package/lib/features/design/editor/CropOverlay.js +199 -0
  238. package/lib/features/design/editor/CropOverlay.js.map +1 -0
  239. package/lib/features/design/editor/DesignCanvas.js +363 -0
  240. package/lib/features/design/editor/DesignCanvas.js.map +1 -0
  241. package/lib/features/design/editor/ExportSheet.js +123 -0
  242. package/lib/features/design/editor/ExportSheet.js.map +1 -0
  243. package/lib/features/design/editor/FindReplacePanel.js +93 -0
  244. package/lib/features/design/editor/FindReplacePanel.js.map +1 -0
  245. package/lib/features/design/editor/ImageTools.js +188 -0
  246. package/lib/features/design/editor/ImageTools.js.map +1 -0
  247. package/lib/features/design/editor/LayerTools.js +485 -0
  248. package/lib/features/design/editor/LayerTools.js.map +1 -0
  249. package/lib/features/design/editor/PageStrip.js +203 -0
  250. package/lib/features/design/editor/PageStrip.js.map +1 -0
  251. package/lib/features/design/editor/Slideshow.js +97 -0
  252. package/lib/features/design/editor/Slideshow.js.map +1 -0
  253. package/lib/features/design/editor/ToolPanels.js +695 -0
  254. package/lib/features/design/editor/ToolPanels.js.map +1 -0
  255. package/lib/features/design/editor/controls.js +630 -0
  256. package/lib/features/design/editor/controls.js.map +1 -0
  257. package/lib/features/design/editor/useDesignSave.js +91 -0
  258. package/lib/features/design/editor/useDesignSave.js.map +1 -0
  259. package/lib/features/design/export/exportDesign.js +170 -0
  260. package/lib/features/design/export/exportDesign.js.map +1 -0
  261. package/lib/features/design/export/pdf.js +143 -0
  262. package/lib/features/design/export/pdf.js.map +1 -0
  263. package/lib/features/design/home/DesignHome.js +688 -0
  264. package/lib/features/design/home/DesignHome.js.map +1 -0
  265. package/lib/features/design/home/studioHome.js +61 -0
  266. package/lib/features/design/home/studioHome.js.map +1 -0
  267. package/lib/features/design/pickDesignImage.js +60 -0
  268. package/lib/features/design/pickDesignImage.js.map +1 -0
  269. package/lib/features/design/render/DesignPageView.js +69 -0
  270. package/lib/features/design/render/DesignPageView.js.map +1 -0
  271. package/lib/features/design/render/PageCapture.js +288 -0
  272. package/lib/features/design/render/PageCapture.js.map +1 -0
  273. package/lib/features/design/render/TextMeasure.js +115 -0
  274. package/lib/features/design/render/TextMeasure.js.map +1 -0
  275. package/lib/features/design/render/fontRegistry.js +110 -0
  276. package/lib/features/design/render/fontRegistry.js.map +1 -0
  277. package/lib/features/design/render/layers.js +392 -0
  278. package/lib/features/design/render/layers.js.map +1 -0
  279. package/lib/features/design/render/svg.js +35 -0
  280. package/lib/features/design/render/svg.js.map +1 -0
  281. package/lib/features/design/render/svgParts.js +435 -0
  282. package/lib/features/design/render/svgParts.js.map +1 -0
  283. package/lib/features/design/surface/BoardScreen.js +529 -0
  284. package/lib/features/design/surface/BoardScreen.js.map +1 -0
  285. package/lib/features/design/surface/CompareView.js +138 -0
  286. package/lib/features/design/surface/CompareView.js.map +1 -0
  287. package/lib/features/design/surface/CreationScreen.js +294 -0
  288. package/lib/features/design/surface/CreationScreen.js.map +1 -0
  289. package/lib/features/design/surface/DesignAgentChatPane.js +444 -0
  290. package/lib/features/design/surface/DesignAgentChatPane.js.map +1 -0
  291. package/lib/features/design/surface/DesignBoards.js +441 -0
  292. package/lib/features/design/surface/DesignBoards.js.map +1 -0
  293. package/lib/features/design/surface/DesignPreview.js +159 -0
  294. package/lib/features/design/surface/DesignPreview.js.map +1 -0
  295. package/lib/features/design/surface/DesignSurfaceExperience.js +80 -0
  296. package/lib/features/design/surface/DesignSurfaceExperience.js.map +1 -0
  297. package/lib/features/design/surface/FullScreenPreview.js +59 -0
  298. package/lib/features/design/surface/FullScreenPreview.js.map +1 -0
  299. package/lib/features/design/surface/NewSystemDialog.js +122 -0
  300. package/lib/features/design/surface/NewSystemDialog.js.map +1 -0
  301. package/lib/features/design/surface/PickerSheet.js +175 -0
  302. package/lib/features/design/surface/PickerSheet.js.map +1 -0
  303. package/lib/features/design/surface/TemplatesGallery.js +156 -0
  304. package/lib/features/design/surface/TemplatesGallery.js.map +1 -0
  305. package/lib/features/design/surface/WetPaint.js +140 -0
  306. package/lib/features/design/surface/WetPaint.js.map +1 -0
  307. package/lib/features/design/surface/agentTurn.js +229 -0
  308. package/lib/features/design/surface/agentTurn.js.map +1 -0
  309. package/lib/features/design/surface/designBoard.js +218 -0
  310. package/lib/features/design/surface/designBoard.js.map +1 -0
  311. package/lib/features/design/surface/designChannel.js +186 -0
  312. package/lib/features/design/surface/designChannel.js.map +1 -0
  313. package/lib/features/design/surface/designChat.js +141 -0
  314. package/lib/features/design/surface/designChat.js.map +1 -0
  315. package/lib/features/design/surface/designConnector.js +266 -0
  316. package/lib/features/design/surface/designConnector.js.map +1 -0
  317. package/lib/features/design/surface/designDocument.js +40 -0
  318. package/lib/features/design/surface/designDocument.js.map +1 -0
  319. package/lib/features/design/surface/designExport.js +55 -0
  320. package/lib/features/design/surface/designExport.js.map +1 -0
  321. package/lib/features/design/surface/designLinks.js +64 -0
  322. package/lib/features/design/surface/designLinks.js.map +1 -0
  323. package/lib/features/design/surface/designPalette.js +24 -0
  324. package/lib/features/design/surface/designPalette.js.map +1 -0
  325. package/lib/features/design/surface/designRun.js +161 -0
  326. package/lib/features/design/surface/designRun.js.map +1 -0
  327. package/lib/features/design/surface/designTheme.js +119 -0
  328. package/lib/features/design/surface/designTheme.js.map +1 -0
  329. package/lib/features/design/surface/execStream.js +206 -0
  330. package/lib/features/design/surface/execStream.js.map +1 -0
  331. package/lib/features/design/surface/metaball.js +48 -0
  332. package/lib/features/design/surface/metaball.js.map +1 -0
  333. package/lib/features/design/surface/pickReferenceFiles.js +35 -0
  334. package/lib/features/design/surface/pickReferenceFiles.js.map +1 -0
  335. package/lib/features/design/surface/useDesignSurface.js +379 -0
  336. package/lib/features/design/surface/useDesignSurface.js.map +1 -0
  337. package/lib/features/docs/DocBlockRow.js +336 -0
  338. package/lib/features/docs/DocBlockRow.js.map +1 -0
  339. package/lib/features/docs/DocsEditorExperience.js +949 -0
  340. package/lib/features/docs/DocsEditorExperience.js.map +1 -0
  341. package/lib/features/docs/DocsToolbar.js +247 -0
  342. package/lib/features/docs/DocsToolbar.js.map +1 -0
  343. package/lib/features/docs/blocks.js +560 -0
  344. package/lib/features/docs/blocks.js.map +1 -0
  345. package/lib/features/docs/docArtifacts.js +129 -0
  346. package/lib/features/docs/docArtifacts.js.map +1 -0
  347. package/lib/features/docs/docEdits.js +201 -0
  348. package/lib/features/docs/docEdits.js.map +1 -0
  349. package/lib/features/docs/docExport.js +235 -0
  350. package/lib/features/docs/docExport.js.map +1 -0
  351. package/lib/features/docs/docShare.js +62 -0
  352. package/lib/features/docs/docShare.js.map +1 -0
  353. package/lib/features/links/openInApp.js +38 -2
  354. package/lib/features/links/openInApp.js.map +1 -1
  355. package/lib/routes.json +54 -0
  356. package/lib/screens/DesignNative/index.js +35 -0
  357. package/lib/screens/DesignNative/index.js.map +1 -0
  358. package/package.json +4 -4
  359. package/lib/features/design/exportDesign.js +0 -133
  360. package/lib/features/design/exportDesign.js.map +0 -1
@@ -0,0 +1,253 @@
1
+ import {jsx,jsxs}from'react/jsx-runtime';import {useState,useMemo,useEffect}from'react';import {ScrollView,Text,View,StyleSheet,useWindowDimensions,TextInput,ActivityIndicator,FlatList}from'react-native';import {MaterialCommunityIcons}from'@expo/vector-icons';import {Image}from'expo-image';import {mapDesignCorpus,loadCanvasTemplateLane}from'../canvasChatTemplates.js';import {DESIGN_PROMPT_TEMPLATES}from'../designPromptTemplates.js';import {DesignCategoryGallery}from'../DesignCategoryGallery.js';import {designCategoryFor}from'../designCategories.js';import {useCanvasTheme,themedStyles}from'../canvasTheme.js';import {Pressable,pressedStyle,IconButton,RADIUS,SPACE,TYPE}from'../canvasUi.js';var __defProp = Object.defineProperty;
2
+ var __defProps = Object.defineProperties;
3
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
7
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
+ var __spreadValues = (a, b) => {
9
+ for (var prop in b || (b = {}))
10
+ if (__hasOwnProp.call(b, prop))
11
+ __defNormalProp(a, prop, b[prop]);
12
+ if (__getOwnPropSymbols)
13
+ for (var prop of __getOwnPropSymbols(b)) {
14
+ if (__propIsEnum.call(b, prop))
15
+ __defNormalProp(a, prop, b[prop]);
16
+ }
17
+ return a;
18
+ };
19
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
+ const HOME_GALLERY_SOURCES = [{
21
+ id: "video",
22
+ label: "Video"
23
+ }, {
24
+ id: "slides",
25
+ label: "Presentations",
26
+ category: "presentation"
27
+ }, {
28
+ id: "flyers",
29
+ label: "Flyers",
30
+ category: "flyer"
31
+ }];
32
+ const GUTTER = SPACE.lg;
33
+ const SEARCH_DEBOUNCE_MS = 350;
34
+ function TemplatesGallery({
35
+ initialSource = "video",
36
+ runAction,
37
+ loadDesignCatalog,
38
+ onClose,
39
+ onUseVideoTemplate,
40
+ onBlank,
41
+ onOpenTemplate
42
+ }) {
43
+ const theme = useCanvasTheme();
44
+ const styles = makeStyles(theme);
45
+ const [source, setSource] = useState(initialSource);
46
+ const entry = HOME_GALLERY_SOURCES.find((s) => s.id === source);
47
+ const category = (entry == null ? void 0 : entry.category) ? designCategoryFor(entry.category) : null;
48
+ const chips = /* @__PURE__ */ jsx(ScrollView, { horizontal: true, showsHorizontalScrollIndicator: false, style: styles.chipScroll, contentContainerStyle: styles.chips, children: HOME_GALLERY_SOURCES.map((s) => {
49
+ const on = s.id === source;
50
+ return /* @__PURE__ */ jsx(Pressable, { onPress: () => setSource(s.id), style: ({
51
+ pressed
52
+ }) => [styles.chip, on && styles.chipOn, pressedStyle(pressed)], accessibilityRole: "tab", accessibilityState: {
53
+ selected: on
54
+ }, testID: `gallery-source-${s.id}`, children: /* @__PURE__ */ jsx(Text, { style: [styles.chipLabel, on && styles.chipLabelOn], children: s.label }) }, s.id);
55
+ }) });
56
+ if (category) {
57
+ return /* @__PURE__ */ jsxs(View, { style: styles.root, children: [
58
+ chips,
59
+ /* @__PURE__ */ jsx(View, { style: styles.fill, children: /* @__PURE__ */ jsx(DesignCategoryGallery, { category, load: loadDesignCatalog, onClose, onBlank, onOpenTemplate }, category.id) })
60
+ ] });
61
+ }
62
+ return /* @__PURE__ */ jsxs(View, { style: styles.root, children: [
63
+ /* @__PURE__ */ jsxs(View, { style: styles.head, children: [
64
+ /* @__PURE__ */ jsx(Text, { style: styles.title, accessibilityRole: "header", children: "Templates" }),
65
+ /* @__PURE__ */ jsx(IconButton, { icon: "close", label: "Close templates", tone: "filled", size: 36, onPress: onClose })
66
+ ] }),
67
+ chips,
68
+ /* @__PURE__ */ jsx(VideoTemplates, { runAction, onUse: onUseVideoTemplate })
69
+ ] });
70
+ }
71
+ function VideoTemplates({
72
+ runAction,
73
+ onUse
74
+ }) {
75
+ const theme = useCanvasTheme();
76
+ const styles = makeStyles(theme);
77
+ const {
78
+ width
79
+ } = useWindowDimensions();
80
+ const column = (width - GUTTER * 2 - SPACE.md) / 2;
81
+ const corpus = useMemo(() => mapDesignCorpus("video", DESIGN_PROMPT_TEMPLATES), []);
82
+ const [query, setQuery] = useState("");
83
+ const [search, setSearch] = useState("");
84
+ const [rows, setRows] = useState([]);
85
+ const [status, setStatus] = useState("loading");
86
+ const [read, setRead] = useState(0);
87
+ useEffect(() => {
88
+ const timer = setTimeout(() => setSearch(query.trim()), SEARCH_DEBOUNCE_MS);
89
+ return () => clearTimeout(timer);
90
+ }, [query]);
91
+ useEffect(() => {
92
+ let live = true;
93
+ setStatus("loading");
94
+ loadCanvasTemplateLane("video", search || void 0, runAction, corpus).then((list) => {
95
+ if (!live) return;
96
+ setRows(list);
97
+ setStatus("ready");
98
+ }).catch(() => {
99
+ if (live) setStatus("failed");
100
+ });
101
+ return () => {
102
+ live = false;
103
+ };
104
+ }, [search, runAction, corpus, read]);
105
+ return /* @__PURE__ */ jsxs(View, { style: styles.fill, children: [
106
+ /* @__PURE__ */ jsxs(View, { style: styles.search, children: [
107
+ /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "magnify", size: 18, color: theme.mutedForeground }),
108
+ /* @__PURE__ */ jsx(TextInput, { value: query, onChangeText: setQuery, placeholder: "Search video templates", placeholderTextColor: theme.mutedForeground, style: styles.searchInput, autoCorrect: false, returnKeyType: "search" })
109
+ ] }),
110
+ status === "loading" && rows.length === 0 ? /* @__PURE__ */ jsx(ActivityIndicator, { style: styles.status, color: theme.mutedForeground }) : status === "failed" ? /* @__PURE__ */ jsxs(View, { style: styles.statusRow, children: [
111
+ /* @__PURE__ */ jsx(Text, { style: styles.hint, children: "Templates couldn't load." }),
112
+ /* @__PURE__ */ jsxs(Pressable, { onPress: () => setRead((n) => n + 1), style: ({
113
+ pressed
114
+ }) => [styles.retry, pressedStyle(pressed)], accessibilityRole: "button", children: [
115
+ /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "refresh", size: 16, color: theme.foreground }),
116
+ /* @__PURE__ */ jsx(Text, { style: styles.chipLabel, children: "Retry" })
117
+ ] })
118
+ ] }) : /* @__PURE__ */ jsx(FlatList, { data: rows, keyExtractor: (t) => t.id, numColumns: 2, columnWrapperStyle: styles.row, contentContainerStyle: styles.list, keyboardShouldPersistTaps: "handled", ListEmptyComponent: /* @__PURE__ */ jsx(Text, { style: styles.hint, children: search ? `No templates match "${search}".` : "No templates here yet." }), renderItem: ({
119
+ item
120
+ }) => /* @__PURE__ */ jsxs(Pressable, { onPress: () => onUse(item), style: ({
121
+ pressed
122
+ }) => [{
123
+ width: column
124
+ }, pressedStyle(pressed)], accessibilityRole: "button", accessibilityLabel: `Use template ${item.title}`, children: [
125
+ /* @__PURE__ */ jsxs(View, { style: styles.cover, children: [
126
+ item.cover ? /* @__PURE__ */ jsx(Image, { source: {
127
+ uri: item.cover
128
+ }, style: StyleSheet.absoluteFill, contentFit: "cover" }) : /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "movie-open-outline", size: 22, color: theme.mutedForeground }),
129
+ item.aspect ? /* @__PURE__ */ jsx(View, { style: styles.aspect, children: /* @__PURE__ */ jsx(Text, { style: styles.aspectLabel, children: item.aspect }) }) : null
130
+ ] }),
131
+ /* @__PURE__ */ jsx(Text, { style: styles.cardTitle, numberOfLines: 2, children: item.title })
132
+ ] }) })
133
+ ] });
134
+ }
135
+ const makeStyles = themedStyles((theme) => StyleSheet.create({
136
+ root: {
137
+ flex: 1,
138
+ backgroundColor: theme.background
139
+ },
140
+ fill: {
141
+ flex: 1
142
+ },
143
+ head: {
144
+ flexDirection: "row",
145
+ alignItems: "center",
146
+ justifyContent: "space-between",
147
+ paddingHorizontal: GUTTER,
148
+ paddingTop: SPACE.md,
149
+ paddingBottom: SPACE.sm
150
+ },
151
+ title: __spreadProps(__spreadValues({}, TYPE.heading), {
152
+ color: theme.foreground
153
+ }),
154
+ // flexGrow 0: a horizontal ScrollView otherwise swells into any spare height.
155
+ chipScroll: {
156
+ flexGrow: 0
157
+ },
158
+ chips: {
159
+ paddingHorizontal: GUTTER,
160
+ paddingVertical: SPACE.sm,
161
+ gap: SPACE.sm
162
+ },
163
+ chip: {
164
+ minHeight: 36,
165
+ justifyContent: "center",
166
+ paddingHorizontal: SPACE.md + 2,
167
+ borderRadius: RADIUS.pill,
168
+ backgroundColor: theme.card
169
+ },
170
+ chipOn: {
171
+ backgroundColor: theme.foreground
172
+ },
173
+ chipLabel: __spreadProps(__spreadValues({}, TYPE.label), {
174
+ color: theme.foreground
175
+ }),
176
+ chipLabelOn: {
177
+ color: theme.background
178
+ },
179
+ search: {
180
+ flexDirection: "row",
181
+ alignItems: "center",
182
+ gap: SPACE.sm,
183
+ marginHorizontal: GUTTER,
184
+ marginBottom: SPACE.md,
185
+ paddingHorizontal: SPACE.md,
186
+ minHeight: 44,
187
+ borderRadius: RADIUS.md,
188
+ backgroundColor: theme.card
189
+ },
190
+ searchInput: __spreadProps(__spreadValues({}, TYPE.body), {
191
+ flex: 1,
192
+ color: theme.foreground,
193
+ paddingVertical: SPACE.sm
194
+ }),
195
+ status: {
196
+ marginTop: SPACE.xl
197
+ },
198
+ statusRow: {
199
+ flexDirection: "row",
200
+ alignItems: "center",
201
+ gap: SPACE.md,
202
+ paddingHorizontal: GUTTER
203
+ },
204
+ hint: __spreadProps(__spreadValues({}, TYPE.body), {
205
+ fontSize: 14,
206
+ color: theme.mutedForeground,
207
+ paddingHorizontal: GUTTER
208
+ }),
209
+ retry: {
210
+ flexDirection: "row",
211
+ alignItems: "center",
212
+ gap: SPACE.xs + 2,
213
+ minHeight: 36,
214
+ paddingHorizontal: SPACE.md,
215
+ borderRadius: RADIUS.pill,
216
+ backgroundColor: theme.card
217
+ },
218
+ list: {
219
+ paddingHorizontal: GUTTER,
220
+ paddingBottom: SPACE.xxl
221
+ },
222
+ row: {
223
+ gap: SPACE.md,
224
+ marginBottom: SPACE.lg
225
+ },
226
+ cover: {
227
+ width: "100%",
228
+ aspectRatio: 16 / 9,
229
+ borderRadius: RADIUS.md,
230
+ overflow: "hidden",
231
+ backgroundColor: theme.card,
232
+ alignItems: "center",
233
+ justifyContent: "center",
234
+ marginBottom: SPACE.xs + 2
235
+ },
236
+ aspect: {
237
+ position: "absolute",
238
+ right: SPACE.xs + 2,
239
+ bottom: SPACE.xs + 2,
240
+ paddingHorizontal: SPACE.xs + 2,
241
+ paddingVertical: 2,
242
+ borderRadius: 6,
243
+ backgroundColor: "rgba(10,10,10,0.55)"
244
+ },
245
+ aspectLabel: {
246
+ fontSize: 11,
247
+ fontWeight: "600",
248
+ color: "#fafafa"
249
+ },
250
+ cardTitle: __spreadProps(__spreadValues({}, TYPE.label), {
251
+ color: theme.foreground
252
+ })
253
+ }));export{HOME_GALLERY_SOURCES,TemplatesGallery};//# sourceMappingURL=TemplatesGallery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TemplatesGallery.js","sources":["../../../../src/features/canvas/home/TemplatesGallery.tsx"],"sourcesContent":["/**\n * Home \"See all\" - one templates gallery with source chips, native twin of\n * canvas-surface `templatesGallerySources.ts`: Video (the studio catalog's\n * video lane, seeds the generator), Presentations and Flyers (the design\n * catalog, open in the design studio). Home no longer guesses a category\n * from the rail's first row; the person picks the source.\n */\nimport React, { useEffect, useMemo, useState } from 'react';\nimport {\n ActivityIndicator,\n FlatList,\n ScrollView,\n StyleSheet,\n Text,\n TextInput,\n useWindowDimensions,\n View,\n} from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { Image } from 'expo-image';\nimport type { RunMediaAction } from '../videoEditor/mediaActions';\nimport { loadCanvasTemplateLane, mapDesignCorpus, type CanvasPromptTemplate } from '../canvasChatTemplates';\nimport { DESIGN_PROMPT_TEMPLATES } from '../designPromptTemplates';\nimport { DesignCategoryGallery, type LoadDesignCatalog } from '../DesignCategoryGallery';\nimport type { DesignCatalogCard } from '../designCatalog';\nimport { designCategoryFor, type BlankSize } from '../designCategories';\nimport { useCanvasTheme, themedStyles, type CanvasPalette } from '../canvasTheme';\nimport { IconButton, Pressable, RADIUS, SPACE, TYPE, pressedStyle } from '../canvasUi';\n\nexport type HomeGallerySource = 'video' | 'slides' | 'flyers';\n\nexport const HOME_GALLERY_SOURCES: ReadonlyArray<{ id: HomeGallerySource; label: string; category?: string }> = [\n { id: 'video', label: 'Video' },\n { id: 'slides', label: 'Presentations', category: 'presentation' },\n { id: 'flyers', label: 'Flyers', category: 'flyer' },\n];\n\nconst GUTTER = SPACE.lg;\nconst SEARCH_DEBOUNCE_MS = 350;\n\nexport function TemplatesGallery({\n initialSource = 'video',\n runAction,\n loadDesignCatalog,\n onClose,\n onUseVideoTemplate,\n onBlank,\n onOpenTemplate,\n}: {\n initialSource?: HomeGallerySource;\n runAction?: RunMediaAction;\n loadDesignCatalog?: LoadDesignCatalog;\n onClose: () => void;\n /** A video template: a fresh canvas with the generator seeded from it. */\n onUseVideoTemplate: (template: CanvasPromptTemplate) => void;\n onBlank: (size: BlankSize) => void;\n onOpenTemplate?: (card: DesignCatalogCard) => void;\n}) {\n const theme = useCanvasTheme();\n const styles = makeStyles(theme);\n const [source, setSource] = useState<HomeGallerySource>(initialSource);\n const entry = HOME_GALLERY_SOURCES.find((s) => s.id === source);\n const category = entry?.category ? designCategoryFor(entry.category) : null;\n\n const chips = (\n <ScrollView\n horizontal\n showsHorizontalScrollIndicator={false}\n style={styles.chipScroll}\n contentContainerStyle={styles.chips}\n >\n {HOME_GALLERY_SOURCES.map((s) => {\n const on = s.id === source;\n return (\n <Pressable\n key={s.id}\n onPress={() => setSource(s.id)}\n style={({ pressed }) => [styles.chip, on && styles.chipOn, pressedStyle(pressed)]}\n accessibilityRole=\"tab\"\n accessibilityState={{ selected: on }}\n testID={`gallery-source-${s.id}`}\n >\n <Text style={[styles.chipLabel, on && styles.chipLabelOn]}>{s.label}</Text>\n </Pressable>\n );\n })}\n </ScrollView>\n );\n\n if (category) {\n return (\n <View style={styles.root}>\n {chips}\n <View style={styles.fill}>\n <DesignCategoryGallery\n key={category.id}\n category={category}\n load={loadDesignCatalog}\n onClose={onClose}\n onBlank={onBlank}\n onOpenTemplate={onOpenTemplate}\n />\n </View>\n </View>\n );\n }\n\n return (\n <View style={styles.root}>\n <View style={styles.head}>\n <Text style={styles.title} accessibilityRole=\"header\">\n Templates\n </Text>\n <IconButton icon=\"close\" label=\"Close templates\" tone=\"filled\" size={36} onPress={onClose} />\n </View>\n {chips}\n <VideoTemplates runAction={runAction} onUse={onUseVideoTemplate} />\n </View>\n );\n}\n\nfunction VideoTemplates({\n runAction,\n onUse,\n}: {\n runAction?: RunMediaAction;\n onUse: (template: CanvasPromptTemplate) => void;\n}) {\n const theme = useCanvasTheme();\n const styles = makeStyles(theme);\n const { width } = useWindowDimensions();\n const column = (width - GUTTER * 2 - SPACE.md) / 2;\n const corpus = useMemo(() => mapDesignCorpus('video', DESIGN_PROMPT_TEMPLATES), []);\n const [query, setQuery] = useState('');\n const [search, setSearch] = useState('');\n const [rows, setRows] = useState<CanvasPromptTemplate[]>([]);\n const [status, setStatus] = useState<'loading' | 'ready' | 'failed'>('loading');\n const [read, setRead] = useState(0);\n\n useEffect(() => {\n const timer = setTimeout(() => setSearch(query.trim()), SEARCH_DEBOUNCE_MS);\n return () => clearTimeout(timer);\n }, [query]);\n\n useEffect(() => {\n let live = true;\n setStatus('loading');\n loadCanvasTemplateLane('video', search || undefined, runAction, corpus)\n .then((list) => {\n if (!live) return;\n setRows(list);\n setStatus('ready');\n })\n .catch(() => {\n if (live) setStatus('failed');\n });\n return () => {\n live = false;\n };\n }, [search, runAction, corpus, read]);\n\n return (\n <View style={styles.fill}>\n <View style={styles.search}>\n <MaterialCommunityIcons name=\"magnify\" size={18} color={theme.mutedForeground} />\n <TextInput\n value={query}\n onChangeText={setQuery}\n placeholder=\"Search video templates\"\n placeholderTextColor={theme.mutedForeground}\n style={styles.searchInput}\n autoCorrect={false}\n returnKeyType=\"search\"\n />\n </View>\n {status === 'loading' && rows.length === 0 ? (\n <ActivityIndicator style={styles.status} color={theme.mutedForeground} />\n ) : status === 'failed' ? (\n <View style={styles.statusRow}>\n <Text style={styles.hint}>Templates couldn't load.</Text>\n <Pressable\n onPress={() => setRead((n) => n + 1)}\n style={({ pressed }) => [styles.retry, pressedStyle(pressed)]}\n accessibilityRole=\"button\"\n >\n <MaterialCommunityIcons name=\"refresh\" size={16} color={theme.foreground} />\n <Text style={styles.chipLabel}>Retry</Text>\n </Pressable>\n </View>\n ) : (\n <FlatList\n data={rows}\n keyExtractor={(t) => t.id}\n numColumns={2}\n columnWrapperStyle={styles.row}\n contentContainerStyle={styles.list}\n keyboardShouldPersistTaps=\"handled\"\n ListEmptyComponent={\n <Text style={styles.hint}>\n {search ? `No templates match \"${search}\".` : 'No templates here yet.'}\n </Text>\n }\n renderItem={({ item }) => (\n <Pressable\n onPress={() => onUse(item)}\n style={({ pressed }) => [{ width: column }, pressedStyle(pressed)]}\n accessibilityRole=\"button\"\n accessibilityLabel={`Use template ${item.title}`}\n >\n <View style={styles.cover}>\n {item.cover ? (\n <Image\n source={{ uri: item.cover }}\n style={StyleSheet.absoluteFill}\n contentFit=\"cover\"\n />\n ) : (\n <MaterialCommunityIcons\n name=\"movie-open-outline\"\n size={22}\n color={theme.mutedForeground}\n />\n )}\n {item.aspect ? (\n <View style={styles.aspect}>\n <Text style={styles.aspectLabel}>{item.aspect}</Text>\n </View>\n ) : null}\n </View>\n <Text style={styles.cardTitle} numberOfLines={2}>\n {item.title}\n </Text>\n </Pressable>\n )}\n />\n )}\n </View>\n );\n}\n\nconst makeStyles = themedStyles((theme: CanvasPalette) =>\n StyleSheet.create({\n root: { flex: 1, backgroundColor: theme.background },\n fill: { flex: 1 },\n head: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingHorizontal: GUTTER,\n paddingTop: SPACE.md,\n paddingBottom: SPACE.sm,\n },\n title: { ...TYPE.heading, color: theme.foreground },\n // flexGrow 0: a horizontal ScrollView otherwise swells into any spare height.\n chipScroll: { flexGrow: 0 },\n chips: { paddingHorizontal: GUTTER, paddingVertical: SPACE.sm, gap: SPACE.sm },\n chip: {\n minHeight: 36,\n justifyContent: 'center',\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 search: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: SPACE.sm,\n marginHorizontal: GUTTER,\n marginBottom: SPACE.md,\n paddingHorizontal: SPACE.md,\n minHeight: 44,\n borderRadius: RADIUS.md,\n backgroundColor: theme.card,\n },\n searchInput: { ...TYPE.body, flex: 1, color: theme.foreground, paddingVertical: SPACE.sm },\n status: { marginTop: SPACE.xl },\n statusRow: { flexDirection: 'row', alignItems: 'center', gap: SPACE.md, paddingHorizontal: GUTTER },\n hint: { ...TYPE.body, fontSize: 14, color: theme.mutedForeground, paddingHorizontal: GUTTER },\n retry: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: SPACE.xs + 2,\n minHeight: 36,\n paddingHorizontal: SPACE.md,\n borderRadius: RADIUS.pill,\n backgroundColor: theme.card,\n },\n list: { paddingHorizontal: GUTTER, paddingBottom: SPACE.xxl },\n row: { gap: SPACE.md, marginBottom: SPACE.lg },\n cover: {\n width: '100%',\n aspectRatio: 16 / 9,\n borderRadius: RADIUS.md,\n overflow: 'hidden',\n backgroundColor: theme.card,\n alignItems: 'center',\n justifyContent: 'center',\n marginBottom: SPACE.xs + 2,\n },\n aspect: {\n position: 'absolute',\n right: SPACE.xs + 2,\n bottom: SPACE.xs + 2,\n paddingHorizontal: SPACE.xs + 2,\n paddingVertical: 2,\n borderRadius: 6,\n backgroundColor: 'rgba(10,10,10,0.55)',\n },\n aspectLabel: { fontSize: 11, fontWeight: '600', color: '#fafafa' },\n cardTitle: { ...TYPE.label, color: theme.foreground },\n }),\n);\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,100 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
3
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
4
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
5
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
6
+ var __spreadValues = (a, b) => {
7
+ for (var prop in b || (b = {}))
8
+ if (__hasOwnProp.call(b, prop))
9
+ __defNormalProp(a, prop, b[prop]);
10
+ if (__getOwnPropSymbols)
11
+ for (var prop of __getOwnPropSymbols(b)) {
12
+ if (__propIsEnum.call(b, prop))
13
+ __defNormalProp(a, prop, b[prop]);
14
+ }
15
+ return a;
16
+ };
17
+ const HERO_ASPECTS = ["16:9", "9:16"];
18
+ const HERO_RESOLUTIONS = ["720p", "1080p"];
19
+ const HERO_SHOT_LIMIT = 6;
20
+ const HERO_CUT_MS = 7e3;
21
+ function heroShots(looks, showcase, limit = HERO_SHOT_LIMIT) {
22
+ const fromLooks = looks.filter((look) => Boolean(look.coverVideo) && Boolean(look.prompt)).map((look) => __spreadValues({
23
+ id: `look:${look.id}`,
24
+ title: look.name,
25
+ poster: look.cover,
26
+ video: look.coverVideo,
27
+ prompt: look.prompt
28
+ }, look.aspect ? {
29
+ aspect: look.aspect
30
+ } : {}));
31
+ if (fromLooks.length) return fromLooks.slice(0, limit);
32
+ return showcase.slice(0, limit).map((clip) => ({
33
+ id: `seedance:${clip.id}`,
34
+ title: clip.title,
35
+ poster: clip.poster,
36
+ video: clip.hls,
37
+ prompt: clip.prompt,
38
+ aspect: clip.aspect,
39
+ credit: {
40
+ author: clip.author,
41
+ sourceUrl: clip.sourceUrl,
42
+ license: clip.license
43
+ }
44
+ }));
45
+ }
46
+ function nextIn(list, current) {
47
+ return list[(list.indexOf(current) + 1) % list.length];
48
+ }
49
+ function heroAspectOf(aspect) {
50
+ return HERO_ASPECTS.includes(aspect != null ? aspect : "") ? aspect : null;
51
+ }
52
+ function heroSettings(mode, aspect, resolution, referenceImageUrl) {
53
+ return __spreadValues({
54
+ mode,
55
+ aspect,
56
+ resolution
57
+ }, referenceImageUrl ? {
58
+ referenceImageUrl
59
+ } : {});
60
+ }
61
+ function heroTimecode(seconds) {
62
+ const s = Math.max(0, seconds);
63
+ const pad = (n) => String(n).padStart(2, "0");
64
+ return `00:${pad(Math.floor(s / 60))}:${pad(Math.floor(s % 60))}:${pad(Math.floor(s % 1 * 24))}`;
65
+ }
66
+ function cropInset(aspect, box = 16 / 10) {
67
+ const [w = 16, h = 9] = aspect.split(":").map(Number);
68
+ const want = w / h;
69
+ return want > box ? {
70
+ y: (1 - box / want) / 2,
71
+ x: 0
72
+ } : {
73
+ y: 0,
74
+ x: (1 - want / box) / 2
75
+ };
76
+ }
77
+ function pickPlayingRegion(regions, viewportTop, viewportHeight) {
78
+ var _a;
79
+ if (!(viewportHeight > 0)) return null;
80
+ const bottom = viewportTop + viewportHeight;
81
+ const middle = viewportTop + viewportHeight / 2;
82
+ let best = null;
83
+ for (const region of regions) {
84
+ if (!(region.height > 0)) continue;
85
+ const visible = Math.min(bottom, region.top + region.height) - Math.max(viewportTop, region.top);
86
+ if (visible < Math.min(region.height, viewportHeight) / 2) continue;
87
+ const distance = Math.abs(region.top + region.height / 2 - middle);
88
+ if (!best || distance < best.distance) best = {
89
+ id: region.id,
90
+ distance
91
+ };
92
+ }
93
+ return (_a = best == null ? void 0 : best.id) != null ? _a : null;
94
+ }
95
+ function centredIndex(offsetX, viewportWidth, itemWidth, gap, leading, count) {
96
+ if (count <= 0 || false) return -1;
97
+ const middle = offsetX + viewportWidth / 2;
98
+ const raw = Math.round((middle - leading - itemWidth / 2) / (itemWidth + gap));
99
+ return Math.min(count - 1, Math.max(0, raw));
100
+ }export{HERO_ASPECTS,HERO_CUT_MS,HERO_RESOLUTIONS,HERO_SHOT_LIMIT,centredIndex,cropInset,heroAspectOf,heroSettings,heroShots,heroTimecode,nextIn,pickPlayingRegion};//# sourceMappingURL=heroShots.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heroShots.js","sources":["../../../../src/features/canvas/home/heroShots.ts"],"sourcesContent":["/**\n * Home hero (\"Direct the shot\") data - native twin of canvas-surface\n * `components/home/CanvasHome.tsx` + `HeroMonitor.tsx`: what the monitor\n * cycles, the composer's pills, what a submit seeds the generator with, and\n * the playback governor that lets one clip play at a time on home.\n *\n * Pure (no RN imports): jest-testable as-is.\n */\nimport type { StudioLook } from '../studioLooks';\nimport type { ShowcaseClip } from '../seedanceShowcase';\n\n/** One shot on the monitor. `video` may be empty: the poster then stands alone. */\nexport interface HeroShot {\n id: string;\n title: string;\n poster: string;\n video: string;\n prompt: string;\n aspect?: string;\n /** CC-BY clips must be credited wherever they play; studio looks carry none. */\n credit?: { author: string; sourceUrl: string; license: string };\n}\n\nexport const HERO_ASPECTS = ['16:9', '9:16'] as const;\nexport const HERO_RESOLUTIONS = ['720p', '1080p'] as const;\nexport type HeroAspect = (typeof HERO_ASPECTS)[number];\nexport type HeroResolution = (typeof HERO_RESOLUTIONS)[number];\nexport type HeroMode = 'image' | 'video';\n/** Monitor shots, as web (four thumbs on a phone, six on desktop). */\nexport const HERO_SHOT_LIMIT = 6;\n/** The monitor cuts to the next shot this often unless held. */\nexport const HERO_CUT_MS = 7000;\n\n/**\n * The monitor's shots: featured looks that have a cover video, else the\n * Seedance community clips (poster + HLS, credited). Capped at six.\n */\nexport function heroShots(\n looks: readonly StudioLook[],\n showcase: readonly ShowcaseClip[],\n limit = HERO_SHOT_LIMIT,\n): HeroShot[] {\n const fromLooks: HeroShot[] = looks\n .filter((look) => Boolean(look.coverVideo) && Boolean(look.prompt))\n .map((look) => ({\n id: `look:${look.id}`,\n title: look.name,\n poster: look.cover,\n video: look.coverVideo,\n prompt: look.prompt,\n ...(look.aspect ? { aspect: look.aspect } : {}),\n }));\n if (fromLooks.length) return fromLooks.slice(0, limit);\n return showcase.slice(0, limit).map((clip) => ({\n id: `seedance:${clip.id}`,\n title: clip.title,\n poster: clip.poster,\n video: clip.hls,\n prompt: clip.prompt,\n aspect: clip.aspect,\n credit: { author: clip.author, sourceUrl: clip.sourceUrl, license: clip.license },\n }));\n}\n\n/** The next value in a pill's list, wrapping (web `cycle`). */\nexport function nextIn<T>(list: readonly T[], current: T): T {\n return list[(list.indexOf(current) + 1) % list.length] as T;\n}\n\n/** A shot's aspect when the composer offers it, else null (web Tab-to-use keeps the framing). */\nexport function heroAspectOf(aspect: string | undefined): HeroAspect | null {\n return (HERO_ASPECTS as readonly string[]).includes(aspect ?? '') ? (aspect as HeroAspect) : null;\n}\n\n/** What a hero submit hands CanvasExperience (web `ComposerSettings`). */\nexport interface HeroSettings {\n mode: HeroMode;\n aspect: HeroAspect;\n resolution: HeroResolution;\n referenceImageUrl?: string;\n}\n\nexport function heroSettings(\n mode: HeroMode,\n aspect: HeroAspect,\n resolution: HeroResolution,\n referenceImageUrl?: string | null,\n): HeroSettings {\n return { mode, aspect, resolution, ...(referenceImageUrl ? { referenceImageUrl } : {}) };\n}\n\n/** \"SC 01 · TK 3\" style timecode for the monitor (seconds -> 00:MM:SS:FF at 24fps). */\nexport function heroTimecode(seconds: number): string {\n const s = Math.max(0, seconds);\n const pad = (n: number) => String(n).padStart(2, '0');\n return `00:${pad(Math.floor(s / 60))}:${pad(Math.floor(s % 60))}:${pad(Math.floor((s % 1) * 24))}`;\n}\n\n/**\n * Inset that masks a monitor of ratio `box` to `aspect`, as fractions per side\n * (web `cropInset`, whose monitor is 16:10; the phone's is 16:9).\n */\nexport function cropInset(aspect: string, box = 16 / 10): { y: number; x: number } {\n const [w = 16, h = 9] = aspect.split(':').map(Number);\n const want = w / h;\n return want > box ? { y: (1 - box / want) / 2, x: 0 } : { y: 0, x: (1 - want / box) / 2 };\n}\n\n// ── Playback governor ───────────────────────────────────────────────────────\n\n/** A block of home that can play video, measured in the list's content coordinates. */\nexport interface PlaybackRegion {\n id: string;\n top: number;\n height: number;\n}\n\n/**\n * One player at a time (web `playing` set, narrowed to one for a phone): of the\n * regions at least half on screen, the one whose middle is nearest the\n * viewport's middle plays. Null when none is visible enough.\n */\nexport function pickPlayingRegion(\n regions: readonly PlaybackRegion[],\n viewportTop: number,\n viewportHeight: number,\n): string | null {\n if (!(viewportHeight > 0)) return null;\n const bottom = viewportTop + viewportHeight;\n const middle = viewportTop + viewportHeight / 2;\n let best: { id: string; distance: number } | null = null;\n for (const region of regions) {\n if (!(region.height > 0)) continue;\n const visible = Math.min(bottom, region.top + region.height) - Math.max(viewportTop, region.top);\n if (visible < Math.min(region.height, viewportHeight) / 2) continue;\n const distance = Math.abs(region.top + region.height / 2 - middle);\n if (!best || distance < best.distance) best = { id: region.id, distance };\n }\n return best?.id ?? null;\n}\n\n/** The tile of a horizontal rail whose middle is nearest the rail's middle. */\nexport function centredIndex(\n offsetX: number,\n viewportWidth: number,\n itemWidth: number,\n gap: number,\n leading: number,\n count: number,\n): number {\n if (count <= 0 || !(itemWidth > 0)) return -1;\n const middle = offsetX + viewportWidth / 2;\n const raw = Math.round((middle - leading - itemWidth / 2) / (itemWidth + gap));\n return Math.min(count - 1, Math.max(0, raw));\n}\n"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- const WORK_FILTERS = [{
1
+ import {DESIGN_SIZES,isPrintCategory}from'../design/doc/sizes.js';const WORK_FILTERS = [{
2
2
  id: "all",
3
3
  label: "All"
4
4
  }, {
@@ -11,7 +11,7 @@ const WORK_FILTERS = [{
11
11
  id: "docs",
12
12
  label: "Docs"
13
13
  }];
14
- function mergeWork(boards, designs) {
14
+ function mergeWork(boards, designs, studio = [], docs = []) {
15
15
  const items = [...boards.map((board) => ({
16
16
  type: "board",
17
17
  id: board.channelId,
@@ -22,6 +22,16 @@ function mergeWork(boards, designs) {
22
22
  id: d.channelId,
23
23
  at: d.savedAt || 0,
24
24
  design: d
25
+ })), ...studio.map((a) => ({
26
+ type: "studio",
27
+ id: a.id,
28
+ at: a.updatedAt || 0,
29
+ studio: a
30
+ })), ...docs.map((d) => ({
31
+ type: "doc",
32
+ id: d.id,
33
+ at: d.updatedAt || 0,
34
+ doc: d
25
35
  }))];
26
36
  return items.map((item, i) => ({
27
37
  item,
@@ -34,6 +44,8 @@ function isDocKind(kind) {
34
44
  function matchesFilter(item, filter) {
35
45
  if (filter === "all") return true;
36
46
  if (item.type === "board") return filter === "canvases";
47
+ if (item.type === "doc") return filter === "docs";
48
+ if (item.type === "studio") return filter === (isDocKind(item.studio.kind) ? "docs" : "designs");
37
49
  return filter === (isDocKind(item.design.doc.kind) ? "docs" : "designs");
38
50
  }
39
51
  function availableFilters(items) {
@@ -52,6 +64,53 @@ function designNoun(doc) {
52
64
  return "Design";
53
65
  }
54
66
  }
67
+ const WORK_ROWS_COLLAPSED = 3;
68
+ const WORK_ARTIFACTS = {
69
+ collapsed: 24,
70
+ expanded: 96
71
+ };
72
+ function collapsedWorkCount(columns = 2, rows = WORK_ROWS_COLLAPSED) {
73
+ return Math.max(1, columns) * Math.max(1, rows);
74
+ }
75
+ function showAllLabel(count, more) {
76
+ return `Show all ${count}${more ? "+" : ""}`;
77
+ }
78
+ function presetFor(doc, kind) {
79
+ var _a, _b, _c, _d;
80
+ const match = (s) => s.width === doc.pageWidth && s.height === doc.pageHeight;
81
+ const turned = (s) => isPrintCategory(s.category) && s.width === doc.pageHeight && s.height === doc.pageWidth;
82
+ const platform = (_a = doc.brief) == null ? void 0 : _a.platform;
83
+ return (_d = (_c = (_b = DESIGN_SIZES.find((s) => match(s) && s.kind === kind && s.platform === platform)) != null ? _b : DESIGN_SIZES.find((s) => match(s) && s.kind === kind)) != null ? _c : DESIGN_SIZES.find(match)) != null ? _d : DESIGN_SIZES.find((s) => turned(s) && s.kind === kind);
84
+ }
85
+ const CATEGORY_NOUN = {
86
+ presentation: "Presentation",
87
+ social: "Social post",
88
+ carousel: "Carousel",
89
+ flyer: "Print",
90
+ "business-card": "Business card",
91
+ logo: "Logo",
92
+ banner: "Banner",
93
+ brochure: "Brochure",
94
+ certificate: "Certificate",
95
+ worksheet: "Worksheet",
96
+ proposal: "Proposal",
97
+ newsletter: "Newsletter",
98
+ menu: "Menu",
99
+ infographic: "Infographic"
100
+ };
101
+ function isBusinessCardSize(doc) {
102
+ return DESIGN_SIZES.some((s) => s.category === "business-card" && (s.width === doc.pageWidth && s.height === doc.pageHeight || s.width === doc.pageHeight && s.height === doc.pageWidth));
103
+ }
104
+ function studioNoun(artifact) {
105
+ var _a, _b, _c, _d, _e, _f;
106
+ if (artifact.kind === "doc") return "Doc";
107
+ const doc = (_a = artifact.doc) != null ? _a : {};
108
+ if (Number(doc.pageWidth) > 0 && Number(doc.pageHeight) > 0 && isBusinessCardSize(doc)) return "Business card";
109
+ const preset = presetFor(doc, artifact.kind === "flyer" ? "flyer" : "deck");
110
+ if ((preset == null ? void 0 : preset.category) === "flyer") return (_c = (_b = /^(Poster|Invitation|Postcard)\b/.exec(preset.label.replace(/^A\d /, ""))) == null ? void 0 : _b[1]) != null ? _c : "Flyer";
111
+ if ((preset == null ? void 0 : preset.category) === "branding") return (_e = (_d = /^(Letterhead|Envelope)\b/.exec(preset.label)) == null ? void 0 : _d[1]) != null ? _e : "Branding";
112
+ return (_f = preset && CATEGORY_NOUN[preset.category]) != null ? _f : artifact.kind === "flyer" ? "Print" : "Design";
113
+ }
55
114
  function pageCount(doc) {
56
115
  const pages = doc == null ? void 0 : doc.pages;
57
116
  if (!Array.isArray(pages) || pages.length < 2) return "";
@@ -71,4 +130,4 @@ function videoCoverFrame(src, runAction, pickUrl) {
71
130
  }).then((result) => pickUrl(result) || null).catch(() => null);
72
131
  videoFrames.set(src, job);
73
132
  return job;
74
- }export{WORK_FILTERS,availableFilters,boardCover,designNoun,matchesFilter,mergeWork,pageCount,videoCoverFrame};//# sourceMappingURL=homeWork.js.map
133
+ }export{WORK_ARTIFACTS,WORK_FILTERS,WORK_ROWS_COLLAPSED,availableFilters,boardCover,collapsedWorkCount,designNoun,matchesFilter,mergeWork,pageCount,presetFor,showAllLabel,studioNoun,videoCoverFrame};//# sourceMappingURL=homeWork.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"homeWork.js","sources":["../../../src/features/canvas/homeWork.ts"],"sourcesContent":["/**\n * What screen one lists under \"Your work\" - native twin of canvas-surface\n * `components/home/homeWork.ts`: the boards plus the designs made in the\n * design studio, newest first, with All / Canvases / Designs / Docs filters.\n *\n * Native's design index has no docs today; the Docs filter is kept so the\n * contract matches web and simply never shows until a doc kind exists.\n *\n * Pure (no RN imports) so merge, filters, labels and covers are jest-testable.\n */\nimport type { CanvasBoardSummary } from './surfaceIndex';\nimport type { CanvasItem } from './canvasCore';\nimport type { DesignDocSummary } from '../design/designIndex';\nimport type { PersistedDesignDoc } from '../design/designCore';\nimport type { RunMediaAction } from './videoEditor/mediaActions';\n\nexport type WorkFilter = 'all' | 'canvases' | 'designs' | 'docs';\n\nexport const WORK_FILTERS: ReadonlyArray<{ id: WorkFilter; label: string }> = [\n { id: 'all', label: 'All' },\n { id: 'canvases', label: 'Canvases' },\n { id: 'designs', label: 'Designs' },\n { id: 'docs', label: 'Docs' },\n];\n\nexport type WorkItem =\n | { type: 'board'; id: string; at: number; board: CanvasBoardSummary }\n | { type: 'design'; id: string; at: number; design: DesignDocSummary };\n\n/** One list, newest first; equal times keep their input order (boards first). */\nexport function mergeWork(boards: readonly CanvasBoardSummary[], designs: readonly DesignDocSummary[]): WorkItem[] {\n const items: WorkItem[] = [\n ...boards.map((board) => ({ type: 'board' as const, id: board.channelId, at: board.savedAt || 0, board })),\n ...designs.map((d) => ({ type: 'design' as const, id: d.channelId, at: d.savedAt || 0, design: d })),\n ];\n return items\n .map((item, i) => ({ item, i }))\n .sort((a, b) => b.item.at - a.item.at || a.i - b.i)\n .map((x) => x.item);\n}\n\n/** A design whose kind is a document (none on native yet; web `doc`). */\nfunction isDocKind(kind: string): boolean {\n return kind === 'doc';\n}\n\nexport function matchesFilter(item: WorkItem, filter: WorkFilter): boolean {\n if (filter === 'all') return true;\n if (item.type === 'board') return filter === 'canvases';\n return filter === (isDocKind(item.design.doc.kind) ? 'docs' : 'designs');\n}\n\n/** The filters worth offering: All plus each kind present. One kind alone needs no chips. */\nexport function availableFilters(items: readonly WorkItem[]): WorkFilter[] {\n const present = WORK_FILTERS.filter((f) => f.id !== 'all' && items.some((item) => matchesFilter(item, f.id)));\n return present.length > 1 ? ['all', ...present.map((f) => f.id)] : [];\n}\n\n/** What a saved design is, in a word or two: the badge on its tile. */\nexport function designNoun(doc: Pick<PersistedDesignDoc, 'kind'>): string {\n switch (doc.kind) {\n case 'tshirt':\n return 'T-shirt';\n case 'postcard':\n return 'Postcard';\n case 'carousel':\n return 'Carousel';\n default:\n return 'Design';\n }\n}\n\n/** \"3 pages\" for a design with more than one page, else empty. */\nexport function pageCount(doc: Pick<PersistedDesignDoc, 'pages'> | null | undefined): string {\n const pages = doc?.pages;\n if (!Array.isArray(pages) || pages.length < 2) return '';\n return `${pages.length} pages`;\n}\n\n/**\n * A board's cover: the first image (always paints, costs nothing), else the\n * first video (its frame is fetched), else none - web `BoardCard`.\n */\nexport function boardCover(items: readonly CanvasItem[]): CanvasItem | undefined {\n return items.find((it) => it.type === 'image') ?? items.find((it) => it.type === 'video');\n}\n\nconst videoFrames = new Map<string, Promise<string | null>>();\n\n/**\n * A still from a video for its board cover, via the editing connector's\n * THUMBNAIL action (as the generate panel's frame picker). One request per\n * source per session; a failure is remembered as null so a broken clip is not\n * re-asked on every grid render. `pickUrl` reads the connector result.\n */\nexport function videoCoverFrame(\n src: string,\n runAction: RunMediaAction,\n pickUrl: (result: Record<string, unknown>) => string,\n): Promise<string | null> {\n const cached = videoFrames.get(src);\n if (cached) return cached;\n const job = runAction('yantra-video-editing', 'YANTRA_VIDEO_EDIT_THUMBNAIL', { input_url: src, time_secs: 1 })\n .then((result) => pickUrl(result) || null)\n .catch(() => null);\n videoFrames.set(src, job);\n return job;\n}\n\n/** Tests only. */\nexport function clearVideoCoverCache(): void {\n videoFrames.clear();\n}\n"],"names":[],"mappings":"AAgBO,MAAM,eAGR,CAAC;AAAA,EACJ,EAAI,EAAA,KAAA;AAAA,EACJ,KAAO,EAAA;AACT,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,UAAA;AAAA,EACJ,KAAO,EAAA;AACT,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,SAAA;AAAA,EACJ,KAAO,EAAA;AACT,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,MAAA;AAAA,EACJ,KAAO,EAAA;AACT,CAAC;AAce,SAAA,SAAA,CAAU,QAAuC,OAAkD,EAAA;AACjH,EAAA,MAAM,KAAoB,GAAA,CAAC,GAAG,MAAA,CAAO,IAAI,CAAU,KAAA,MAAA;AAAA,IACjD,IAAM,EAAA,OAAA;AAAA,IACN,IAAI,KAAM,CAAA,SAAA;AAAA,IACV,EAAA,EAAI,MAAM,OAAW,IAAA,CAAA;AAAA,IACrB;AAAA,GACA,CAAA,CAAA,EAAG,GAAG,OAAA,CAAQ,IAAI,CAAM,CAAA,MAAA;AAAA,IACxB,IAAM,EAAA,QAAA;AAAA,IACN,IAAI,CAAE,CAAA,SAAA;AAAA,IACN,EAAA,EAAI,EAAE,OAAW,IAAA,CAAA;AAAA,IACjB,MAAQ,EAAA;AAAA,IACR,CAAC,CAAA;AACH,EAAA,OAAO,KAAM,CAAA,GAAA,CAAI,CAAC,IAAA,EAAM,CAAO,MAAA;AAAA,IAC7B,IAAA;AAAA,IACA;AAAA,GACF,CAAE,EAAE,IAAK,CAAA,CAAC,GAAG,CAAM,KAAA,CAAA,CAAE,KAAK,EAAK,GAAA,CAAA,CAAE,KAAK,EAAM,IAAA,CAAA,CAAE,IAAI,CAAE,CAAA,CAAC,EAAE,GAAI,CAAA,CAAA,CAAA,KAAK,EAAE,IAAI,CAAA;AACxE;AAGA,SAAS,UAAU,IAAuB,EAAA;AACxC,EAAA,OAAO,IAAS,KAAA,KAAA;AAClB;AACgB,SAAA,aAAA,CAAc,MAAgB,MAA6B,EAAA;AACzE,EAAI,IAAA,MAAA,KAAW,OAAc,OAAA,IAAA;AAC7B,EAAA,IAAI,IAAK,CAAA,IAAA,KAAS,OAAS,EAAA,OAAO,MAAW,KAAA,UAAA;AAC7C,EAAA,OAAO,YAAY,SAAU,CAAA,IAAA,CAAK,OAAO,GAAI,CAAA,IAAI,IAAI,MAAS,GAAA,SAAA,CAAA;AAChE;AAGO,SAAS,iBAAiB,KAA0C,EAAA;AACzE,EAAA,MAAM,OAAU,GAAA,YAAA,CAAa,MAAO,CAAA,CAAA,CAAA,KAAK,EAAE,EAAO,KAAA,KAAA,IAAS,KAAM,CAAA,IAAA,CAAK,UAAQ,aAAc,CAAA,IAAA,EAAM,CAAE,CAAA,EAAE,CAAC,CAAC,CAAA;AACxG,EAAA,OAAO,OAAQ,CAAA,MAAA,GAAS,CAAI,GAAA,CAAC,KAAO,EAAA,GAAG,OAAQ,CAAA,GAAA,CAAI,CAAK,CAAA,KAAA,CAAA,CAAE,EAAE,CAAC,IAAI,EAAC;AACpE;AAGO,SAAS,WAAW,GAA+C,EAAA;AACxE,EAAA,QAAQ,IAAI,IAAM;AAAA,IAChB,KAAK,QAAA;AACH,MAAO,OAAA,SAAA;AAAA,IACT,KAAK,UAAA;AACH,MAAO,OAAA,UAAA;AAAA,IACT,KAAK,UAAA;AACH,MAAO,OAAA,UAAA;AAAA,IACT;AACE,MAAO,OAAA,QAAA;AAAA;AAEb;AAGO,SAAS,UAAU,GAAmE,EAAA;AAC3F,EAAA,MAAM,QAAQ,GAAK,IAAA,IAAA,GAAA,MAAA,GAAA,GAAA,CAAA,KAAA;AACnB,EAAI,IAAA,CAAC,MAAM,OAAQ,CAAA,KAAK,KAAK,KAAM,CAAA,MAAA,GAAS,GAAU,OAAA,EAAA;AACtD,EAAO,OAAA,CAAA,EAAG,MAAM,MAAM,CAAA,MAAA,CAAA;AACxB;AAMO,SAAS,WAAW,KAAsD,EAAA;AAxGjF,EAAA,IAAA,EAAA;AAyGE,EAAA,OAAA,CAAO,EAAM,GAAA,KAAA,CAAA,IAAA,CAAK,CAAM,EAAA,KAAA,EAAA,CAAG,IAAS,KAAA,OAAO,CAApC,KAAA,IAAA,GAAA,EAAA,GAAyC,KAAM,CAAA,IAAA,CAAK,CAAM,EAAA,KAAA,EAAA,CAAG,SAAS,OAAO,CAAA;AACtF;AACA,MAAM,WAAA,uBAAkB,GAAoC,EAAA;AAQ5C,SAAA,eAAA,CAAgB,GAAa,EAAA,SAAA,EAA2B,OAA8E,EAAA;AACpJ,EAAM,MAAA,MAAA,GAAS,WAAY,CAAA,GAAA,CAAI,GAAG,CAAA;AAClC,EAAA,IAAI,QAAe,OAAA,MAAA;AACnB,EAAM,MAAA,GAAA,GAAM,SAAU,CAAA,sBAAA,EAAwB,6BAA+B,EAAA;AAAA,IAC3E,SAAW,EAAA,GAAA;AAAA,IACX,SAAW,EAAA;AAAA,GACZ,CAAE,CAAA,IAAA,CAAK,CAAU,MAAA,KAAA,OAAA,CAAQ,MAAM,CAAA,IAAK,IAAI,CAAA,CAAE,KAAM,CAAA,MAAM,IAAI,CAAA;AAC3D,EAAY,WAAA,CAAA,GAAA,CAAI,KAAK,GAAG,CAAA;AACxB,EAAO,OAAA,GAAA;AACT"}
1
+ {"version":3,"file":"homeWork.js","sources":["../../../src/features/canvas/homeWork.ts"],"sourcesContent":["/**\n * What screen one lists under \"Your work\" - native twin of canvas-surface\n * `components/home/homeWork.ts`: the boards plus the designs made in the\n * design studio, newest first, with All / Canvases / Designs / Docs filters.\n *\n * Native's design index has no docs today; the Docs filter is kept so the\n * contract matches web and simply never shows until a doc kind exists.\n *\n * Pure (no RN imports) so merge, filters, labels and covers are jest-testable.\n */\nimport type { CanvasBoardSummary } from './surfaceIndex';\nimport type { CanvasItem } from './canvasCore';\nimport type { DesignDocSummary } from '../design/designIndex';\nimport type { PersistedDesignDoc } from '../design/designCore';\nimport type { DesignArtifact } from '../design/doc/artifacts';\nimport type { RunMediaAction } from './videoEditor/mediaActions';\nimport type { DocArtifact } from '../docs/docArtifacts';\n\nexport { docPreviewLines } from '../docs/blocks';\nimport { DESIGN_SIZES, isPrintCategory, type DesignSize, type SizeCategory } from '../design/doc/sizes';\n\nexport type WorkFilter = 'all' | 'canvases' | 'designs' | 'docs';\n\nexport const WORK_FILTERS: ReadonlyArray<{ id: WorkFilter; label: string }> = [\n { id: 'all', label: 'All' },\n { id: 'canvases', label: 'Canvases' },\n { id: 'designs', label: 'Designs' },\n { id: 'docs', label: 'Docs' },\n];\n\nexport type WorkItem =\n | { type: 'board'; id: string; at: number; board: CanvasBoardSummary }\n | { type: 'design'; id: string; at: number; design: DesignDocSummary }\n /** A design studio design (`deck:` / `flyer:` row) - the web Design Studio's own. */\n | { type: 'studio'; id: string; at: number; studio: DesignArtifact }\n /** A rich-text doc (`doc:` row) - the web docs editor's own, opened in the native docs editor. */\n | { type: 'doc'; id: string; at: number; doc: DocArtifact };\n\n/** One list, newest first; equal times keep their input order (boards first). */\nexport function mergeWork(\n boards: readonly CanvasBoardSummary[],\n designs: readonly DesignDocSummary[],\n studio: readonly DesignArtifact[] = [],\n docs: readonly DocArtifact[] = [],\n): WorkItem[] {\n const items: WorkItem[] = [\n ...boards.map((board) => ({ type: 'board' as const, id: board.channelId, at: board.savedAt || 0, board })),\n ...designs.map((d) => ({ type: 'design' as const, id: d.channelId, at: d.savedAt || 0, design: d })),\n ...studio.map((a) => ({ type: 'studio' as const, id: a.id, at: a.updatedAt || 0, studio: a })),\n ...docs.map((d) => ({ type: 'doc' as const, id: d.id, at: d.updatedAt || 0, doc: d })),\n ];\n return items\n .map((item, i) => ({ item, i }))\n .sort((a, b) => b.item.at - a.item.at || a.i - b.i)\n .map((x) => x.item);\n}\n\n/** A design whose kind is a document (none on native yet; web `doc`). */\nfunction isDocKind(kind: string): boolean {\n return kind === 'doc';\n}\n\nexport function matchesFilter(item: WorkItem, filter: WorkFilter): boolean {\n if (filter === 'all') return true;\n if (item.type === 'board') return filter === 'canvases';\n if (item.type === 'doc') return filter === 'docs';\n if (item.type === 'studio') return filter === (isDocKind(item.studio.kind) ? 'docs' : 'designs');\n return filter === (isDocKind(item.design.doc.kind) ? 'docs' : 'designs');\n}\n\n/** The filters worth offering: All plus each kind present. One kind alone needs no chips. */\nexport function availableFilters(items: readonly WorkItem[]): WorkFilter[] {\n const present = WORK_FILTERS.filter((f) => f.id !== 'all' && items.some((item) => matchesFilter(item, f.id)));\n return present.length > 1 ? ['all', ...present.map((f) => f.id)] : [];\n}\n\n/** What a saved design is, in a word or two: the badge on its tile. */\nexport function designNoun(doc: Pick<PersistedDesignDoc, 'kind'>): string {\n switch (doc.kind) {\n case 'tshirt':\n return 'T-shirt';\n case 'postcard':\n return 'Postcard';\n case 'carousel':\n return 'Carousel';\n default:\n return 'Design';\n }\n}\n\n/** Rows of Your work before \"Show all\": three on a phone's two columns (web `ROWS.phone`). */\nexport const WORK_ROWS_COLLAPSED = 3;\n/** Studio designs read for the collapsed list; \"Show all\" re-reads this many (web `ARTIFACTS`). */\nexport const WORK_ARTIFACTS = { collapsed: 24, expanded: 96 } as const;\n\n/** Tiles shown before \"Show all\" on a grid of `columns`. */\nexport function collapsedWorkCount(columns = 2, rows = WORK_ROWS_COLLAPSED): number {\n return Math.max(1, columns) * Math.max(1, rows);\n}\n\n/** \"Show all 14\" / \"Show all 96+\" when the index has more past the read limit. */\nexport function showAllLabel(count: number, more: boolean): string {\n return `Show all ${count}${more ? '+' : ''}`;\n}\n\ntype SizedDoc = { pageWidth?: number; pageHeight?: number; brief?: { platform?: string } | null };\ntype StudioKind = DesignArtifact['kind'] | 'doc';\n\n/**\n * The preset a design was made at (web `presetFor`). Sizes are shared (a US\n * Letter flyer and a letterhead), so the platform the design was made for picks\n * first; a printed piece turned the other way up is still that piece.\n */\nexport function presetFor(doc: SizedDoc, kind: StudioKind): DesignSize | undefined {\n const match = (s: DesignSize) => s.width === doc.pageWidth && s.height === doc.pageHeight;\n const turned = (s: DesignSize) =>\n isPrintCategory(s.category) && s.width === doc.pageHeight && s.height === doc.pageWidth;\n const platform = doc.brief?.platform;\n return (\n DESIGN_SIZES.find((s) => match(s) && s.kind === kind && s.platform === platform) ??\n DESIGN_SIZES.find((s) => match(s) && s.kind === kind) ??\n DESIGN_SIZES.find(match) ??\n DESIGN_SIZES.find((s) => turned(s) && s.kind === kind)\n );\n}\n\nconst CATEGORY_NOUN: Partial<Record<SizeCategory, string>> = {\n presentation: 'Presentation',\n social: 'Social post',\n carousel: 'Carousel',\n flyer: 'Print',\n 'business-card': 'Business card',\n logo: 'Logo',\n banner: 'Banner',\n brochure: 'Brochure',\n certificate: 'Certificate',\n worksheet: 'Worksheet',\n proposal: 'Proposal',\n newsletter: 'Newsletter',\n menu: 'Menu',\n infographic: 'Infographic',\n};\n\nfunction isBusinessCardSize(doc: SizedDoc): boolean {\n return DESIGN_SIZES.some(\n (s) =>\n s.category === 'business-card' &&\n ((s.width === doc.pageWidth && s.height === doc.pageHeight) ||\n (s.width === doc.pageHeight && s.height === doc.pageWidth)),\n );\n}\n\n/** What a studio design is, in a word or two (web `designNoun`): \"Presentation\", \"Poster\", \"Business card\". */\nexport function studioNoun(artifact: { kind: string; doc?: unknown }): string {\n if (artifact.kind === 'doc') return 'Doc';\n const doc = (artifact.doc ?? {}) as SizedDoc;\n if (Number(doc.pageWidth) > 0 && Number(doc.pageHeight) > 0 && isBusinessCardSize(doc)) return 'Business card';\n const preset = presetFor(doc, artifact.kind === 'flyer' ? 'flyer' : 'deck');\n if (preset?.category === 'flyer')\n return /^(Poster|Invitation|Postcard)\\b/.exec(preset.label.replace(/^A\\d /, ''))?.[1] ?? 'Flyer';\n if (preset?.category === 'branding') return /^(Letterhead|Envelope)\\b/.exec(preset.label)?.[1] ?? 'Branding';\n return (preset && CATEGORY_NOUN[preset.category]) ?? (artifact.kind === 'flyer' ? 'Print' : 'Design');\n}\n\n/** \"3 pages\" for a design with more than one page, else empty. */\nexport function pageCount(doc: Pick<PersistedDesignDoc, 'pages'> | null | undefined): string {\n const pages = doc?.pages;\n if (!Array.isArray(pages) || pages.length < 2) return '';\n return `${pages.length} pages`;\n}\n\n/**\n * A board's cover: the first image (always paints, costs nothing), else the\n * first video (its frame is fetched), else none - web `BoardCard`.\n */\nexport function boardCover(items: readonly CanvasItem[]): CanvasItem | undefined {\n return items.find((it) => it.type === 'image') ?? items.find((it) => it.type === 'video');\n}\n\nconst videoFrames = new Map<string, Promise<string | null>>();\n\n/**\n * A still from a video for its board cover, via the editing connector's\n * THUMBNAIL action (as the generate panel's frame picker). One request per\n * source per session; a failure is remembered as null so a broken clip is not\n * re-asked on every grid render. `pickUrl` reads the connector result.\n */\nexport function videoCoverFrame(\n src: string,\n runAction: RunMediaAction,\n pickUrl: (result: Record<string, unknown>) => string,\n): Promise<string | null> {\n const cached = videoFrames.get(src);\n if (cached) return cached;\n const job = runAction('yantra-video-editing', 'YANTRA_VIDEO_EDIT_THUMBNAIL', { input_url: src, time_secs: 1 })\n .then((result) => pickUrl(result) || null)\n .catch(() => null);\n videoFrames.set(src, job);\n return job;\n}\n\n/** Tests only. */\nexport function clearVideoCoverCache(): void {\n videoFrames.clear();\n}\n"],"names":[],"mappings":"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"}