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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (360) hide show
  1. package/lib/compute.js +57 -1
  2. package/lib/compute.js.map +1 -1
  3. package/lib/features/agent-chat/NativeAgentChat.js +3 -2
  4. package/lib/features/agent-chat/NativeAgentChat.js.map +1 -1
  5. package/lib/features/apps/AppsCatalog.js +10 -0
  6. package/lib/features/apps/AppsCatalog.js.map +1 -1
  7. package/lib/features/apps/mobileAppCatalog.js +11 -0
  8. package/lib/features/apps/mobileAppCatalog.js.map +1 -1
  9. package/lib/features/canvas/AudioEditorExperience.js +448 -105
  10. package/lib/features/canvas/AudioEditorExperience.js.map +1 -1
  11. package/lib/features/canvas/CanvasAgentChatPane.js +33 -14
  12. package/lib/features/canvas/CanvasAgentChatPane.js.map +1 -1
  13. package/lib/features/canvas/CanvasBoardsGrid.js +493 -41
  14. package/lib/features/canvas/CanvasBoardsGrid.js.map +1 -1
  15. package/lib/features/canvas/CanvasChatResultCard.js.map +1 -1
  16. package/lib/features/canvas/CanvasEditToolsPanel.js +37 -1
  17. package/lib/features/canvas/CanvasEditToolsPanel.js.map +1 -1
  18. package/lib/features/canvas/CanvasExperience.js +237 -22
  19. package/lib/features/canvas/CanvasExperience.js.map +1 -1
  20. package/lib/features/canvas/CanvasGeneratePanel.js +119 -26
  21. package/lib/features/canvas/CanvasGeneratePanel.js.map +1 -1
  22. package/lib/features/canvas/CanvasLooksPanel.js +17 -6
  23. package/lib/features/canvas/CanvasLooksPanel.js.map +1 -1
  24. package/lib/features/canvas/CanvasTasksPanel.js +18 -1
  25. package/lib/features/canvas/CanvasTasksPanel.js.map +1 -1
  26. package/lib/features/canvas/DesignCategoryGallery.js +423 -0
  27. package/lib/features/canvas/DesignCategoryGallery.js.map +1 -0
  28. package/lib/features/canvas/ImageEditorExperience.js +763 -187
  29. package/lib/features/canvas/ImageEditorExperience.js.map +1 -1
  30. package/lib/features/canvas/SetStudioExperience.js +199 -11
  31. package/lib/features/canvas/SetStudioExperience.js.map +1 -1
  32. package/lib/features/canvas/VideoEditorExperience.js +59 -40
  33. package/lib/features/canvas/VideoEditorExperience.js.map +1 -1
  34. package/lib/features/canvas/VideoGeneratorExperience.js +134 -34
  35. package/lib/features/canvas/VideoGeneratorExperience.js.map +1 -1
  36. package/lib/features/canvas/aiEdit.js +4 -2
  37. package/lib/features/canvas/aiEdit.js.map +1 -1
  38. package/lib/features/canvas/audioEditor/AudioWaveform.js +96 -0
  39. package/lib/features/canvas/audioEditor/AudioWaveform.js.map +1 -0
  40. package/lib/features/canvas/audioEditor/audioPeaks.js +93 -0
  41. package/lib/features/canvas/audioEditor/audioPeaks.js.map +1 -0
  42. package/lib/features/canvas/canvasTaskSync.js +34 -7
  43. package/lib/features/canvas/canvasTaskSync.js.map +1 -1
  44. package/lib/features/canvas/canvasTasks.js +23 -3
  45. package/lib/features/canvas/canvasTasks.js.map +1 -1
  46. package/lib/features/canvas/canvasTheme.js +10 -24
  47. package/lib/features/canvas/canvasTheme.js.map +1 -1
  48. package/lib/features/canvas/canvasUi.js +1 -1
  49. package/lib/features/canvas/canvasUi.js.map +1 -1
  50. package/lib/features/canvas/createTiles.js +17 -9
  51. package/lib/features/canvas/createTiles.js.map +1 -1
  52. package/lib/features/canvas/deepLinks.js +35 -5
  53. package/lib/features/canvas/deepLinks.js.map +1 -1
  54. package/lib/features/canvas/designCatalog.js +165 -0
  55. package/lib/features/canvas/designCatalog.js.map +1 -0
  56. package/lib/features/canvas/designCategories.js +262 -0
  57. package/lib/features/canvas/designCategories.js.map +1 -0
  58. package/lib/features/canvas/editorControls.js +406 -0
  59. package/lib/features/canvas/editorControls.js.map +1 -0
  60. package/lib/features/canvas/generationModels.js +5 -3
  61. package/lib/features/canvas/generationModels.js.map +1 -1
  62. package/lib/features/canvas/generationTasks.js +162 -0
  63. package/lib/features/canvas/generationTasks.js.map +1 -0
  64. package/lib/features/canvas/generator/BottomSheet.js +167 -0
  65. package/lib/features/canvas/generator/BottomSheet.js.map +1 -0
  66. package/lib/features/canvas/generator/BusinessCardChatCard.js +155 -0
  67. package/lib/features/canvas/generator/BusinessCardChatCard.js.map +1 -0
  68. package/lib/features/canvas/generator/DirectorSheet.js +163 -0
  69. package/lib/features/canvas/generator/DirectorSheet.js.map +1 -0
  70. package/lib/features/canvas/generator/ReframePreview.js +122 -0
  71. package/lib/features/canvas/generator/ReframePreview.js.map +1 -0
  72. package/lib/features/canvas/generator/RunLogCard.js +119 -0
  73. package/lib/features/canvas/generator/RunLogCard.js.map +1 -0
  74. package/lib/features/canvas/generator/ShotPanel.js +261 -0
  75. package/lib/features/canvas/generator/ShotPanel.js.map +1 -0
  76. package/lib/features/canvas/generator/businessCardWidget.js +117 -0
  77. package/lib/features/canvas/generator/businessCardWidget.js.map +1 -0
  78. package/lib/features/canvas/generator/cameraVocabulary.js +142 -0
  79. package/lib/features/canvas/generator/cameraVocabulary.js.map +1 -0
  80. package/lib/features/canvas/generator/cinematicVocabulary.js +416 -0
  81. package/lib/features/canvas/generator/cinematicVocabulary.js.map +1 -0
  82. package/lib/features/canvas/generator/direction.js +41 -0
  83. package/lib/features/canvas/generator/direction.js.map +1 -0
  84. package/lib/features/canvas/generator/reframeGeometry.js +108 -0
  85. package/lib/features/canvas/generator/reframeGeometry.js.map +1 -0
  86. package/lib/features/canvas/generator/runLog.js +71 -0
  87. package/lib/features/canvas/generator/runLog.js.map +1 -0
  88. package/lib/features/canvas/generator/shot.js +133 -0
  89. package/lib/features/canvas/generator/shot.js.map +1 -0
  90. package/lib/features/canvas/generator/useShotSpec.js +87 -0
  91. package/lib/features/canvas/generator/useShotSpec.js.map +1 -0
  92. package/lib/features/canvas/home/HeroComposer.js +214 -0
  93. package/lib/features/canvas/home/HeroComposer.js.map +1 -0
  94. package/lib/features/canvas/home/HeroMonitor.js +225 -0
  95. package/lib/features/canvas/home/HeroMonitor.js.map +1 -0
  96. package/lib/features/canvas/home/LookDetail.js +185 -0
  97. package/lib/features/canvas/home/LookDetail.js.map +1 -0
  98. package/lib/features/canvas/home/LoopingVideo.js +37 -0
  99. package/lib/features/canvas/home/LoopingVideo.js.map +1 -0
  100. package/lib/features/canvas/home/TemplatesGallery.js +253 -0
  101. package/lib/features/canvas/home/TemplatesGallery.js.map +1 -0
  102. package/lib/features/canvas/home/heroShots.js +100 -0
  103. package/lib/features/canvas/home/heroShots.js.map +1 -0
  104. package/lib/features/canvas/homeWork.js +62 -3
  105. package/lib/features/canvas/homeWork.js.map +1 -1
  106. package/lib/features/canvas/imageEditor/ImageMarkup.js +195 -0
  107. package/lib/features/canvas/imageEditor/ImageMarkup.js.map +1 -0
  108. package/lib/features/canvas/imageEditor/imageEditOps.js +367 -0
  109. package/lib/features/canvas/imageEditor/imageEditOps.js.map +1 -0
  110. package/lib/features/canvas/nativeViewerRegistry.js.map +1 -1
  111. package/lib/features/canvas/rankedCatalogSearch.js +375 -0
  112. package/lib/features/canvas/rankedCatalogSearch.js.map +1 -0
  113. package/lib/features/canvas/recorder/CameraRecorderExperience.js +68 -20
  114. package/lib/features/canvas/recorder/CameraRecorderExperience.js.map +1 -1
  115. package/lib/features/canvas/recorder/RecordingReview.js +272 -0
  116. package/lib/features/canvas/recorder/RecordingReview.js.map +1 -0
  117. package/lib/features/canvas/recorder/RecordingsList.js +179 -0
  118. package/lib/features/canvas/recorder/RecordingsList.js.map +1 -0
  119. package/lib/features/canvas/recorder/recorderOps.js +99 -0
  120. package/lib/features/canvas/recorder/recorderOps.js.map +1 -0
  121. package/lib/features/canvas/seedanceShowcase.js +314 -0
  122. package/lib/features/canvas/seedanceShowcase.js.map +1 -0
  123. package/lib/features/canvas/serverTasks.js +149 -15
  124. package/lib/features/canvas/serverTasks.js.map +1 -1
  125. package/lib/features/canvas/sessionRenewal.js +114 -0
  126. package/lib/features/canvas/sessionRenewal.js.map +1 -0
  127. package/lib/features/canvas/set/SetViewportWebView.js +34 -1
  128. package/lib/features/canvas/set/SetViewportWebView.js.map +1 -1
  129. package/lib/features/canvas/set/agent/setTurn.js +4 -2
  130. package/lib/features/canvas/set/agent/setTurn.js.map +1 -1
  131. package/lib/features/canvas/set/setPresets.js +85 -0
  132. package/lib/features/canvas/set/setPresets.js.map +1 -0
  133. package/lib/features/canvas/set/setProject.js +4 -1
  134. package/lib/features/canvas/set/setProject.js.map +1 -1
  135. package/lib/features/canvas/studioCatalog.js +59 -4
  136. package/lib/features/canvas/studioCatalog.js.map +1 -1
  137. package/lib/features/canvas/studioLooks.js +31 -4
  138. package/lib/features/canvas/studioLooks.js.map +1 -1
  139. package/lib/features/canvas/surfaceIndex.js +1 -14
  140. package/lib/features/canvas/surfaceIndex.js.map +1 -1
  141. package/lib/features/canvas/templateSearch.js +489 -0
  142. package/lib/features/canvas/templateSearch.js.map +1 -0
  143. package/lib/features/canvas/useCanvasSession.js +28 -6
  144. package/lib/features/canvas/useCanvasSession.js.map +1 -1
  145. package/lib/features/canvas/useStudioCatalogTemplates.js +41 -5
  146. package/lib/features/canvas/useStudioCatalogTemplates.js.map +1 -1
  147. package/lib/features/canvas/videoEditor/EditorPanels.js +531 -0
  148. package/lib/features/canvas/videoEditor/EditorPanels.js.map +1 -0
  149. package/lib/features/canvas/videoEditor/agent/AgentCutPane.js +48 -4
  150. package/lib/features/canvas/videoEditor/agent/AgentCutPane.js.map +1 -1
  151. package/lib/features/canvas/videoEditor/agent/agentLoop.js +2 -0
  152. package/lib/features/canvas/videoEditor/agent/agentLoop.js.map +1 -1
  153. package/lib/features/canvas/videoEditor/agent/brainClient.js +97 -27
  154. package/lib/features/canvas/videoEditor/agent/brainClient.js.map +1 -1
  155. package/lib/features/canvas/videoEditor/agent/cutTools.js +707 -3
  156. package/lib/features/canvas/videoEditor/agent/cutTools.js.map +1 -1
  157. package/lib/features/canvas/videoEditor/audioServices.js +165 -0
  158. package/lib/features/canvas/videoEditor/audioServices.js.map +1 -0
  159. package/lib/features/canvas/videoEditor/captions.js +144 -0
  160. package/lib/features/canvas/videoEditor/captions.js.map +1 -0
  161. package/lib/features/canvas/videoEditor/compileTimeline.js +24 -16
  162. package/lib/features/canvas/videoEditor/compileTimeline.js.map +1 -1
  163. package/lib/features/canvas/videoEditor/editorModel.js +12 -2
  164. package/lib/features/canvas/videoEditor/editorModel.js.map +1 -1
  165. package/lib/features/canvas/videoEditor/exportTask.js +89 -7
  166. package/lib/features/canvas/videoEditor/exportTask.js.map +1 -1
  167. package/lib/features/canvas/videoEditor/layers.js +117 -0
  168. package/lib/features/canvas/videoEditor/layers.js.map +1 -0
  169. package/lib/features/canvas/videoEditor/remoteMediaClient.js +45 -18
  170. package/lib/features/canvas/videoEditor/remoteMediaClient.js.map +1 -1
  171. package/lib/features/canvas/videoEditor/renderTimeline.js +18 -6
  172. package/lib/features/canvas/videoEditor/renderTimeline.js.map +1 -1
  173. package/lib/features/canvas/videoEditor/revoice.js +138 -0
  174. package/lib/features/canvas/videoEditor/revoice.js.map +1 -0
  175. package/lib/features/canvas/videoEditor/storageUpload.js +34 -0
  176. package/lib/features/canvas/videoEditor/storageUpload.js.map +1 -0
  177. package/lib/features/canvas/videoEditor/textMotion.js +109 -0
  178. package/lib/features/canvas/videoEditor/textMotion.js.map +1 -0
  179. package/lib/features/canvas/videoEditor/transitions.js +31 -0
  180. package/lib/features/canvas/videoEditor/transitions.js.map +1 -0
  181. package/lib/features/chat/TemplatesChatCards.js +8 -3
  182. package/lib/features/chat/TemplatesChatCards.js.map +1 -1
  183. package/lib/features/design/DesignEditorExperience.js +674 -644
  184. package/lib/features/design/DesignEditorExperience.js.map +1 -1
  185. package/lib/features/design/DesignExperience.js +285 -538
  186. package/lib/features/design/DesignExperience.js.map +1 -1
  187. package/lib/features/design/designCore.js +2 -212
  188. package/lib/features/design/designCore.js.map +1 -1
  189. package/lib/features/design/designIndex.js +1 -50
  190. package/lib/features/design/designIndex.js.map +1 -1
  191. package/lib/features/design/doc/aiDesign.js +247 -0
  192. package/lib/features/design/doc/aiDesign.js.map +1 -0
  193. package/lib/features/design/doc/artifacts.js +280 -0
  194. package/lib/features/design/doc/artifacts.js.map +1 -0
  195. package/lib/features/design/doc/chart.js +98 -0
  196. package/lib/features/design/doc/chart.js.map +1 -0
  197. package/lib/features/design/doc/crop.js +104 -0
  198. package/lib/features/design/doc/crop.js.map +1 -0
  199. package/lib/features/design/doc/curve.js +49 -0
  200. package/lib/features/design/doc/curve.js.map +1 -0
  201. package/lib/features/design/doc/docOps.js +397 -0
  202. package/lib/features/design/doc/docOps.js.map +1 -0
  203. package/lib/features/design/doc/findReplace.js +112 -0
  204. package/lib/features/design/doc/findReplace.js.map +1 -0
  205. package/lib/features/design/doc/fonts.js +79 -0
  206. package/lib/features/design/doc/fonts.js.map +1 -0
  207. package/lib/features/design/doc/frames.js +17 -0
  208. package/lib/features/design/doc/frames.js.map +1 -0
  209. package/lib/features/design/doc/geometry.js +133 -0
  210. package/lib/features/design/doc/geometry.js.map +1 -0
  211. package/lib/features/design/doc/imageAdjust.js +203 -0
  212. package/lib/features/design/doc/imageAdjust.js.map +1 -0
  213. package/lib/features/design/doc/legacyDoc.js +107 -0
  214. package/lib/features/design/doc/legacyDoc.js.map +1 -0
  215. package/lib/features/design/doc/newDoc.js +335 -0
  216. package/lib/features/design/doc/newDoc.js.map +1 -0
  217. package/lib/features/design/doc/pageRange.js +17 -0
  218. package/lib/features/design/doc/pageRange.js.map +1 -0
  219. package/lib/features/design/doc/pathScale.js +68 -0
  220. package/lib/features/design/doc/pathScale.js.map +1 -0
  221. package/lib/features/design/doc/qr.js +62 -0
  222. package/lib/features/design/doc/qr.js.map +1 -0
  223. package/lib/features/design/doc/shapes.js +366 -0
  224. package/lib/features/design/doc/shapes.js.map +1 -0
  225. package/lib/features/design/doc/sizes.js +230 -0
  226. package/lib/features/design/doc/sizes.js.map +1 -0
  227. package/lib/features/design/doc/textEffects.js +134 -0
  228. package/lib/features/design/doc/textEffects.js.map +1 -0
  229. package/lib/features/design/doc/textLayout.js +182 -0
  230. package/lib/features/design/doc/textLayout.js.map +1 -0
  231. package/lib/features/design/doc/types.js +30 -0
  232. package/lib/features/design/doc/types.js.map +1 -0
  233. package/lib/features/design/editor/AiPanel.js +194 -0
  234. package/lib/features/design/editor/AiPanel.js.map +1 -0
  235. package/lib/features/design/editor/ChartDataPanel.js +182 -0
  236. package/lib/features/design/editor/ChartDataPanel.js.map +1 -0
  237. package/lib/features/design/editor/CropOverlay.js +199 -0
  238. package/lib/features/design/editor/CropOverlay.js.map +1 -0
  239. package/lib/features/design/editor/DesignCanvas.js +363 -0
  240. package/lib/features/design/editor/DesignCanvas.js.map +1 -0
  241. package/lib/features/design/editor/ExportSheet.js +123 -0
  242. package/lib/features/design/editor/ExportSheet.js.map +1 -0
  243. package/lib/features/design/editor/FindReplacePanel.js +93 -0
  244. package/lib/features/design/editor/FindReplacePanel.js.map +1 -0
  245. package/lib/features/design/editor/ImageTools.js +188 -0
  246. package/lib/features/design/editor/ImageTools.js.map +1 -0
  247. package/lib/features/design/editor/LayerTools.js +485 -0
  248. package/lib/features/design/editor/LayerTools.js.map +1 -0
  249. package/lib/features/design/editor/PageStrip.js +203 -0
  250. package/lib/features/design/editor/PageStrip.js.map +1 -0
  251. package/lib/features/design/editor/Slideshow.js +97 -0
  252. package/lib/features/design/editor/Slideshow.js.map +1 -0
  253. package/lib/features/design/editor/ToolPanels.js +695 -0
  254. package/lib/features/design/editor/ToolPanels.js.map +1 -0
  255. package/lib/features/design/editor/controls.js +630 -0
  256. package/lib/features/design/editor/controls.js.map +1 -0
  257. package/lib/features/design/editor/useDesignSave.js +91 -0
  258. package/lib/features/design/editor/useDesignSave.js.map +1 -0
  259. package/lib/features/design/export/exportDesign.js +170 -0
  260. package/lib/features/design/export/exportDesign.js.map +1 -0
  261. package/lib/features/design/export/pdf.js +143 -0
  262. package/lib/features/design/export/pdf.js.map +1 -0
  263. package/lib/features/design/home/DesignHome.js +688 -0
  264. package/lib/features/design/home/DesignHome.js.map +1 -0
  265. package/lib/features/design/home/studioHome.js +61 -0
  266. package/lib/features/design/home/studioHome.js.map +1 -0
  267. package/lib/features/design/pickDesignImage.js +60 -0
  268. package/lib/features/design/pickDesignImage.js.map +1 -0
  269. package/lib/features/design/render/DesignPageView.js +69 -0
  270. package/lib/features/design/render/DesignPageView.js.map +1 -0
  271. package/lib/features/design/render/PageCapture.js +288 -0
  272. package/lib/features/design/render/PageCapture.js.map +1 -0
  273. package/lib/features/design/render/TextMeasure.js +115 -0
  274. package/lib/features/design/render/TextMeasure.js.map +1 -0
  275. package/lib/features/design/render/fontRegistry.js +110 -0
  276. package/lib/features/design/render/fontRegistry.js.map +1 -0
  277. package/lib/features/design/render/layers.js +392 -0
  278. package/lib/features/design/render/layers.js.map +1 -0
  279. package/lib/features/design/render/svg.js +35 -0
  280. package/lib/features/design/render/svg.js.map +1 -0
  281. package/lib/features/design/render/svgParts.js +435 -0
  282. package/lib/features/design/render/svgParts.js.map +1 -0
  283. package/lib/features/design/surface/BoardScreen.js +529 -0
  284. package/lib/features/design/surface/BoardScreen.js.map +1 -0
  285. package/lib/features/design/surface/CompareView.js +138 -0
  286. package/lib/features/design/surface/CompareView.js.map +1 -0
  287. package/lib/features/design/surface/CreationScreen.js +294 -0
  288. package/lib/features/design/surface/CreationScreen.js.map +1 -0
  289. package/lib/features/design/surface/DesignAgentChatPane.js +444 -0
  290. package/lib/features/design/surface/DesignAgentChatPane.js.map +1 -0
  291. package/lib/features/design/surface/DesignBoards.js +441 -0
  292. package/lib/features/design/surface/DesignBoards.js.map +1 -0
  293. package/lib/features/design/surface/DesignPreview.js +159 -0
  294. package/lib/features/design/surface/DesignPreview.js.map +1 -0
  295. package/lib/features/design/surface/DesignSurfaceExperience.js +80 -0
  296. package/lib/features/design/surface/DesignSurfaceExperience.js.map +1 -0
  297. package/lib/features/design/surface/FullScreenPreview.js +59 -0
  298. package/lib/features/design/surface/FullScreenPreview.js.map +1 -0
  299. package/lib/features/design/surface/NewSystemDialog.js +122 -0
  300. package/lib/features/design/surface/NewSystemDialog.js.map +1 -0
  301. package/lib/features/design/surface/PickerSheet.js +175 -0
  302. package/lib/features/design/surface/PickerSheet.js.map +1 -0
  303. package/lib/features/design/surface/TemplatesGallery.js +156 -0
  304. package/lib/features/design/surface/TemplatesGallery.js.map +1 -0
  305. package/lib/features/design/surface/WetPaint.js +140 -0
  306. package/lib/features/design/surface/WetPaint.js.map +1 -0
  307. package/lib/features/design/surface/agentTurn.js +229 -0
  308. package/lib/features/design/surface/agentTurn.js.map +1 -0
  309. package/lib/features/design/surface/designBoard.js +218 -0
  310. package/lib/features/design/surface/designBoard.js.map +1 -0
  311. package/lib/features/design/surface/designChannel.js +186 -0
  312. package/lib/features/design/surface/designChannel.js.map +1 -0
  313. package/lib/features/design/surface/designChat.js +141 -0
  314. package/lib/features/design/surface/designChat.js.map +1 -0
  315. package/lib/features/design/surface/designConnector.js +266 -0
  316. package/lib/features/design/surface/designConnector.js.map +1 -0
  317. package/lib/features/design/surface/designDocument.js +40 -0
  318. package/lib/features/design/surface/designDocument.js.map +1 -0
  319. package/lib/features/design/surface/designExport.js +55 -0
  320. package/lib/features/design/surface/designExport.js.map +1 -0
  321. package/lib/features/design/surface/designLinks.js +64 -0
  322. package/lib/features/design/surface/designLinks.js.map +1 -0
  323. package/lib/features/design/surface/designPalette.js +24 -0
  324. package/lib/features/design/surface/designPalette.js.map +1 -0
  325. package/lib/features/design/surface/designRun.js +161 -0
  326. package/lib/features/design/surface/designRun.js.map +1 -0
  327. package/lib/features/design/surface/designTheme.js +119 -0
  328. package/lib/features/design/surface/designTheme.js.map +1 -0
  329. package/lib/features/design/surface/execStream.js +206 -0
  330. package/lib/features/design/surface/execStream.js.map +1 -0
  331. package/lib/features/design/surface/metaball.js +48 -0
  332. package/lib/features/design/surface/metaball.js.map +1 -0
  333. package/lib/features/design/surface/pickReferenceFiles.js +35 -0
  334. package/lib/features/design/surface/pickReferenceFiles.js.map +1 -0
  335. package/lib/features/design/surface/useDesignSurface.js +379 -0
  336. package/lib/features/design/surface/useDesignSurface.js.map +1 -0
  337. package/lib/features/docs/DocBlockRow.js +336 -0
  338. package/lib/features/docs/DocBlockRow.js.map +1 -0
  339. package/lib/features/docs/DocsEditorExperience.js +949 -0
  340. package/lib/features/docs/DocsEditorExperience.js.map +1 -0
  341. package/lib/features/docs/DocsToolbar.js +247 -0
  342. package/lib/features/docs/DocsToolbar.js.map +1 -0
  343. package/lib/features/docs/blocks.js +560 -0
  344. package/lib/features/docs/blocks.js.map +1 -0
  345. package/lib/features/docs/docArtifacts.js +129 -0
  346. package/lib/features/docs/docArtifacts.js.map +1 -0
  347. package/lib/features/docs/docEdits.js +201 -0
  348. package/lib/features/docs/docEdits.js.map +1 -0
  349. package/lib/features/docs/docExport.js +235 -0
  350. package/lib/features/docs/docExport.js.map +1 -0
  351. package/lib/features/docs/docShare.js +62 -0
  352. package/lib/features/docs/docShare.js.map +1 -0
  353. package/lib/features/links/openInApp.js +38 -2
  354. package/lib/features/links/openInApp.js.map +1 -1
  355. package/lib/routes.json +54 -0
  356. package/lib/screens/DesignNative/index.js +35 -0
  357. package/lib/screens/DesignNative/index.js.map +1 -0
  358. package/package.json +4 -4
  359. package/lib/features/design/exportDesign.js +0 -133
  360. package/lib/features/design/exportDesign.js.map +0 -1
@@ -0,0 +1,71 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defProps = Object.defineProperties;
3
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
7
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
+ var __spreadValues = (a, b) => {
9
+ for (var prop in b || (b = {}))
10
+ if (__hasOwnProp.call(b, prop))
11
+ __defNormalProp(a, prop, b[prop]);
12
+ if (__getOwnPropSymbols)
13
+ for (var prop of __getOwnPropSymbols(b)) {
14
+ if (__propIsEnum.call(b, prop))
15
+ __defNormalProp(a, prop, b[prop]);
16
+ }
17
+ return a;
18
+ };
19
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
+ const RUN_LOG_MAX_STEPS = 200;
21
+ function startRun(title, now = Date.now()) {
22
+ return {
23
+ title,
24
+ startedAt: now,
25
+ steps: []
26
+ };
27
+ }
28
+ function logStep(run, line, now = Date.now()) {
29
+ const text = line.trim();
30
+ if (!text) return run;
31
+ const last = run.steps[run.steps.length - 1];
32
+ if (last && last.line === text) return run;
33
+ const steps = [...run.steps, {
34
+ at: now,
35
+ line: text
36
+ }];
37
+ return __spreadProps(__spreadValues({}, run), {
38
+ steps: steps.length > RUN_LOG_MAX_STEPS ? steps.slice(steps.length - RUN_LOG_MAX_STEPS) : steps
39
+ });
40
+ }
41
+ function finishRun(run, summary, now = Date.now()) {
42
+ return __spreadProps(__spreadValues({}, run), {
43
+ endedAt: now,
44
+ summary
45
+ });
46
+ }
47
+ function failRun(run, error, now = Date.now()) {
48
+ return __spreadProps(__spreadValues({}, run), {
49
+ endedAt: now,
50
+ error: error.trim() || "Stopped without a reason"
51
+ });
52
+ }
53
+ const runIsActive = (run) => Boolean(run && run.endedAt === void 0);
54
+ function runElapsedMs(run, now = Date.now()) {
55
+ var _a;
56
+ return Math.max(0, ((_a = run.endedAt) != null ? _a : now) - run.startedAt);
57
+ }
58
+ function formatWorked(ms) {
59
+ const s = Math.max(0, Math.round(ms / 1e3));
60
+ if (s < 60) return `${s}s`;
61
+ const m = Math.floor(s / 60);
62
+ if (m < 60) return `${m}m ${String(s % 60).padStart(2, "0")}s`;
63
+ const h = Math.floor(m / 60);
64
+ return `${h}h ${String(m % 60).padStart(2, "0")}m`;
65
+ }
66
+ function runHeadline(run, now = Date.now()) {
67
+ const worked = formatWorked(runElapsedMs(run, now));
68
+ if (run.endedAt === void 0) return `Working \xB7 ${worked}`;
69
+ if (run.error !== void 0) return `Stopped after ${worked}`;
70
+ return `Worked for ${worked}`;
71
+ }export{RUN_LOG_MAX_STEPS,failRun,finishRun,formatWorked,logStep,runElapsedMs,runHeadline,runIsActive,startRun};//# sourceMappingURL=runLog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runLog.js","sources":["../../../../src/features/canvas/generator/runLog.ts"],"sourcesContent":["/**\n * The run log - what a generation or edit did, and how long it took.\n *\n * Every run reports progress lines; until now the panel showed the latest one\n * and threw the rest away. This keeps them, stamps them, and turns the run into\n * a receipt: \"Worked for 4m 19s\", the steps on demand, one line of what came\n * out. The same shape whether the work was a Veo generation, a promo\n * production or a crop, so the panel renders one card.\n *\n * Pure. The page holds the current log in state and calls these on the events\n * it already has.\n */\n\nexport interface RunStep {\n at: number;\n line: string;\n}\n\nexport interface RunLog {\n /** What was asked for - the card's title. */\n title: string;\n startedAt: number;\n endedAt?: number;\n steps: RunStep[];\n /** One line of what came out, set on success. */\n summary?: string;\n /** Why it stopped, set on failure. */\n error?: string;\n}\n\n/** Keeps the tail: a promo production narrates for minutes. */\nexport const RUN_LOG_MAX_STEPS = 200;\n\nexport function startRun(title: string, now = Date.now()): RunLog {\n return { title, startedAt: now, steps: [] };\n}\n\n/**\n * Append a progress line. Blank lines and a repeat of the last line are\n * dropped - streams re-send their current line on every tick - and the log\n * is capped from the front so it cannot grow without bound.\n */\nexport function logStep(run: RunLog, line: string, now = Date.now()): RunLog {\n const text = line.trim();\n if (!text) return run;\n const last = run.steps[run.steps.length - 1];\n if (last && last.line === text) return run;\n const steps = [...run.steps, { at: now, line: text }];\n return { ...run, steps: steps.length > RUN_LOG_MAX_STEPS ? steps.slice(steps.length - RUN_LOG_MAX_STEPS) : steps };\n}\n\nexport function finishRun(run: RunLog, summary: string, now = Date.now()): RunLog {\n return { ...run, endedAt: now, summary };\n}\n\nexport function failRun(run: RunLog, error: string, now = Date.now()): RunLog {\n return { ...run, endedAt: now, error: error.trim() || 'Stopped without a reason' };\n}\n\nexport const runIsActive = (run: RunLog | null | undefined): boolean => Boolean(run && run.endedAt === undefined);\n\nexport function runElapsedMs(run: RunLog, now = Date.now()): number {\n return Math.max(0, (run.endedAt ?? now) - run.startedAt);\n}\n\n/** '4s' · '42s' · '4m 19s' · '1h 02m' */\nexport function formatWorked(ms: number): string {\n const s = Math.max(0, Math.round(ms / 1000));\n if (s < 60) return `${s}s`;\n const m = Math.floor(s / 60);\n if (m < 60) return `${m}m ${String(s % 60).padStart(2, '0')}s`;\n const h = Math.floor(m / 60);\n return `${h}h ${String(m % 60).padStart(2, '0')}m`;\n}\n\n/** The card's header line for the run's current state. */\nexport function runHeadline(run: RunLog, now = Date.now()): string {\n const worked = formatWorked(runElapsedMs(run, now));\n if (run.endedAt === undefined) return `Working · ${worked}`;\n if (run.error !== undefined) return `Stopped after ${worked}`;\n return `Worked for ${worked}`;\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,133 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defProps = Object.defineProperties;
3
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
7
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
+ var __spreadValues = (a, b) => {
9
+ for (var prop in b || (b = {}))
10
+ if (__hasOwnProp.call(b, prop))
11
+ __defNormalProp(a, prop, b[prop]);
12
+ if (__getOwnPropSymbols)
13
+ for (var prop of __getOwnPropSymbols(b)) {
14
+ if (__propIsEnum.call(b, prop))
15
+ __defNormalProp(a, prop, b[prop]);
16
+ }
17
+ return a;
18
+ };
19
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
+ const SHOT_CONNECTOR = "yantra-video-generation";
21
+ const SHOT_BUILD_ACTION = "YANTRA_VIDEO_GENERATION_BUILD_SHOT";
22
+ const SHOT_SIZE_CHOICES = ["extreme wide", "wide", "medium", "medium close-up", "close-up", "macro"];
23
+ const SHOT_MOVE_CHOICES = ["static", "slow dolly in", "dolly out", "pan left", "pan right", "orbit", "crane up", "handheld follow"];
24
+ const SHOT_LENS_CHOICES = [14, 24, 35, 50, 85, 135];
25
+ const str = (v) => typeof v === "string" ? v.trim().replace(/\s+/g, " ") : "";
26
+ const num = (v) => typeof v === "number" && Number.isFinite(v) ? Math.round(v) : void 0;
27
+ function parseShotSpec(raw) {
28
+ const o = raw && typeof raw === "object" ? raw : {};
29
+ const c = o.camera && typeof o.camera === "object" ? o.camera : {};
30
+ const camera = {};
31
+ if (str(c.shot)) camera.shot = str(c.shot);
32
+ if (str(c.move)) camera.move = str(c.move);
33
+ const lens = num(c.lensMm);
34
+ if (lens !== void 0 && lens >= 8 && lens <= 800) camera.lensMm = lens;
35
+ if (str(c.aperture)) camera.aperture = str(c.aperture);
36
+ if (str(c.angle)) camera.angle = str(c.angle);
37
+ const duration = num(o.durationSeconds);
38
+ return __spreadProps(__spreadValues(__spreadValues({
39
+ subject: str(o.subject),
40
+ action: str(o.action),
41
+ environment: str(o.environment),
42
+ lighting: str(o.lighting),
43
+ style: str(o.style),
44
+ palette: str(o.palette),
45
+ camera,
46
+ audio: str(o.audio),
47
+ negative: Array.isArray(o.negative) ? [...new Set(o.negative.map(str).filter(Boolean))] : []
48
+ }, duration !== void 0 && duration > 0 ? {
49
+ durationSeconds: duration
50
+ } : {}), str(o.aspectRatio) ? {
51
+ aspectRatio: str(o.aspectRatio)
52
+ } : {}), {
53
+ notes: str(o.notes)
54
+ });
55
+ }
56
+ function describeCamera(camera) {
57
+ const parts = [];
58
+ if (camera.move) parts.push(camera.move);
59
+ if (camera.shot) parts.push(camera.shot);
60
+ const lens = camera.lensMm ? `${camera.lensMm}mm lens` : "";
61
+ if (lens && camera.aperture) parts.push(`${lens} at ${camera.aperture}`);
62
+ else if (lens) parts.push(lens);
63
+ else if (camera.aperture) parts.push(camera.aperture);
64
+ if (camera.angle) parts.push(camera.angle);
65
+ return parts.join(", ");
66
+ }
67
+ const sentence = (s) => {
68
+ const t = s.trim().replace(/[.\s]+$/, "");
69
+ return t ? `${t[0].toUpperCase()}${t.slice(1)}.` : "";
70
+ };
71
+ function compileShot(spec, opts = {}) {
72
+ const clauses = [];
73
+ const opening = [spec.subject, spec.action].filter(Boolean).join(", ");
74
+ if (opening) clauses.push(sentence(opening));
75
+ if (spec.environment) clauses.push(sentence(spec.environment));
76
+ if (spec.lighting) clauses.push(sentence(spec.lighting));
77
+ const look = [spec.style, spec.palette].filter(Boolean).join(", ");
78
+ if (look) clauses.push(sentence(look));
79
+ const camera = describeCamera(spec.camera);
80
+ if (camera) clauses.push(sentence(camera));
81
+ if (spec.audio && opts.supportsAudio) clauses.push(sentence(`Audio: ${spec.audio}`));
82
+ if (spec.notes) clauses.push(sentence(spec.notes));
83
+ const negativePrompt = spec.negative.join(", ");
84
+ return __spreadValues(__spreadValues(__spreadValues({
85
+ prompt: clauses.join(" ")
86
+ }, negativePrompt ? {
87
+ negativePrompt
88
+ } : {}), spec.durationSeconds !== void 0 ? {
89
+ durationSeconds: spec.durationSeconds
90
+ } : {}), spec.aspectRatio ? {
91
+ aspectRatio: spec.aspectRatio
92
+ } : {});
93
+ }
94
+ const briefWorthStructuring = (brief) => brief.trim().split(/\s+/).length >= 25;
95
+ function addNegatives(current, draft) {
96
+ const entries = draft.split(",").map((s) => s.trim()).filter(Boolean);
97
+ return [.../* @__PURE__ */ new Set([...current, ...entries])];
98
+ }
99
+ function withCamera(spec, key, value) {
100
+ const camera = __spreadValues({}, spec.camera);
101
+ if (value === void 0 || value === "" || typeof value === "number" && !Number.isFinite(value)) delete camera[key];
102
+ else camera[key] = value;
103
+ return __spreadProps(__spreadValues({}, spec), {
104
+ camera
105
+ });
106
+ }
107
+ function parseBuiltShot(raw) {
108
+ var _a, _b;
109
+ const outer = raw != null ? raw : {};
110
+ const body = (_a = outer.data) != null ? _a : outer;
111
+ const constraintsRaw = (_b = body.constraints) != null ? _b : {};
112
+ const spec = parseShotSpec(body.spec);
113
+ const constraints = {
114
+ durations: Array.isArray(constraintsRaw.durations) ? constraintsRaw.durations.filter((d) => typeof d === "number") : [],
115
+ aspects: Array.isArray(constraintsRaw.aspects) ? constraintsRaw.aspects.filter((a) => typeof a === "string") : [],
116
+ supportsAudio: constraintsRaw.supportsAudio === true
117
+ };
118
+ return {
119
+ spec,
120
+ compiled: compileShot(spec, {
121
+ supportsAudio: constraints.supportsAudio
122
+ }),
123
+ constraints
124
+ };
125
+ }
126
+ async function buildShot(run, params) {
127
+ const raw = await run(SHOT_CONNECTOR, SHOT_BUILD_ACTION, __spreadValues({
128
+ brief: params.brief
129
+ }, params.model ? {
130
+ model: params.model
131
+ } : {}));
132
+ return parseBuiltShot(raw);
133
+ }export{SHOT_BUILD_ACTION,SHOT_CONNECTOR,SHOT_LENS_CHOICES,SHOT_MOVE_CHOICES,SHOT_SIZE_CHOICES,addNegatives,briefWorthStructuring,buildShot,compileShot,describeCamera,parseBuiltShot,parseShotSpec,withCamera};//# sourceMappingURL=shot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shot.js","sources":["../../../../src/features/canvas/generator/shot.ts"],"sourcesContent":["/**\n * Shot structuring: turning a long video brief into parameters instead of prose\n * (native twin of web `rpc/shotRpc.ts`).\n *\n * A video model has one text encoder and a short attention budget, so a long\n * brief generates worse than a tight sentence: the camera direction, the brand\n * rules and the \"do not show\" list all compete with the subject for the same\n * tokens. The connector's BUILD_SHOT action sorts the brief into fields; this\n * module calls it and holds the client-side compiler that turns an EDITED spec\n * back into a prompt without a round-trip per keystroke.\n *\n * The compiler mirrors `shot/shotSpec.ts` in yantra-video-generation, which\n * stays authoritative. Pure apart from `buildShot`, which takes the host's\n * connector runner so the module carries no transport of its own.\n */\n\n/** The host's connector runner, narrowed to the one connector this module calls (RunMediaAction fits). */\nexport type RunConnectorAction = (\n connector: 'yantra-video-generation',\n action: string,\n params: Record<string, unknown>,\n) => Promise<unknown>;\n\nexport interface ShotCamera {\n shot?: string;\n move?: string;\n lensMm?: number;\n aperture?: string;\n angle?: string;\n}\n\nexport interface ShotSpec {\n subject: string;\n action: string;\n environment: string;\n lighting: string;\n style: string;\n palette: string;\n camera: ShotCamera;\n audio: string;\n negative: string[];\n durationSeconds?: number;\n aspectRatio?: string;\n notes: string;\n}\n\nexport interface CompiledShot {\n prompt: string;\n negativePrompt?: string;\n durationSeconds?: number;\n aspectRatio?: string;\n}\n\n/** What the target model allows, so the controls never offer an invalid value. */\nexport interface ShotConstraints {\n durations: number[];\n aspects: string[];\n supportsAudio: boolean;\n}\n\nexport interface BuiltShot {\n spec: ShotSpec;\n compiled: CompiledShot;\n constraints: ShotConstraints;\n}\n\nexport const SHOT_CONNECTOR = 'yantra-video-generation' as const;\nexport const SHOT_BUILD_ACTION = 'YANTRA_VIDEO_GENERATION_BUILD_SHOT';\n\n/** Values a picker offers (web ShotPanel). Free text is not offered on a phone: these are the shortcuts. */\nexport const SHOT_SIZE_CHOICES = ['extreme wide', 'wide', 'medium', 'medium close-up', 'close-up', 'macro'] as const;\nexport const SHOT_MOVE_CHOICES = [\n 'static',\n 'slow dolly in',\n 'dolly out',\n 'pan left',\n 'pan right',\n 'orbit',\n 'crane up',\n 'handheld follow',\n] as const;\nexport const SHOT_LENS_CHOICES = [14, 24, 35, 50, 85, 135] as const;\n\nconst str = (v: unknown): string => (typeof v === 'string' ? v.trim().replace(/\\s+/g, ' ') : '');\nconst num = (v: unknown): number | undefined =>\n typeof v === 'number' && Number.isFinite(v) ? Math.round(v) : undefined;\n\nexport const emptyShotSpec = (): ShotSpec => ({\n subject: '',\n action: '',\n environment: '',\n lighting: '',\n style: '',\n palette: '',\n camera: {},\n audio: '',\n negative: [],\n notes: '',\n});\n\nexport function parseShotSpec(raw: unknown): ShotSpec {\n const o = (raw && typeof raw === 'object' ? raw : {}) as Record<string, unknown>;\n const c = (o.camera && typeof o.camera === 'object' ? o.camera : {}) as Record<string, unknown>;\n const camera: ShotCamera = {};\n if (str(c.shot)) camera.shot = str(c.shot);\n if (str(c.move)) camera.move = str(c.move);\n const lens = num(c.lensMm);\n if (lens !== undefined && lens >= 8 && lens <= 800) camera.lensMm = lens;\n if (str(c.aperture)) camera.aperture = str(c.aperture);\n if (str(c.angle)) camera.angle = str(c.angle);\n const duration = num(o.durationSeconds);\n return {\n subject: str(o.subject),\n action: str(o.action),\n environment: str(o.environment),\n lighting: str(o.lighting),\n style: str(o.style),\n palette: str(o.palette),\n camera,\n audio: str(o.audio),\n negative: Array.isArray(o.negative) ? [...new Set(o.negative.map(str).filter(Boolean))] : [],\n ...(duration !== undefined && duration > 0 ? { durationSeconds: duration } : {}),\n ...(str(o.aspectRatio) ? { aspectRatio: str(o.aspectRatio) } : {}),\n notes: str(o.notes),\n };\n}\n\n/** 'slow dolly in, medium close-up, 50mm lens at f/1.8, low angle' */\nexport function describeCamera(camera: ShotCamera): string {\n const parts: string[] = [];\n if (camera.move) parts.push(camera.move);\n if (camera.shot) parts.push(camera.shot);\n const lens = camera.lensMm ? `${camera.lensMm}mm lens` : '';\n if (lens && camera.aperture) parts.push(`${lens} at ${camera.aperture}`);\n else if (lens) parts.push(lens);\n else if (camera.aperture) parts.push(camera.aperture);\n if (camera.angle) parts.push(camera.angle);\n return parts.join(', ');\n}\n\nconst sentence = (s: string): string => {\n const t = s.trim().replace(/[.\\s]+$/, '');\n return t ? `${t[0].toUpperCase()}${t.slice(1)}.` : '';\n};\n\n/**\n * Compile a spec into the prompt the model receives. Subject and action lead,\n * the camera note trails; negatives NEVER enter the prompt, they ride the\n * provider's negative_prompt.\n */\nexport function compileShot(spec: ShotSpec, opts: { supportsAudio?: boolean } = {}): CompiledShot {\n const clauses: string[] = [];\n const opening = [spec.subject, spec.action].filter(Boolean).join(', ');\n if (opening) clauses.push(sentence(opening));\n if (spec.environment) clauses.push(sentence(spec.environment));\n if (spec.lighting) clauses.push(sentence(spec.lighting));\n const look = [spec.style, spec.palette].filter(Boolean).join(', ');\n if (look) clauses.push(sentence(look));\n const camera = describeCamera(spec.camera);\n if (camera) clauses.push(sentence(camera));\n if (spec.audio && opts.supportsAudio) clauses.push(sentence(`Audio: ${spec.audio}`));\n if (spec.notes) clauses.push(sentence(spec.notes));\n\n const negativePrompt = spec.negative.join(', ');\n return {\n prompt: clauses.join(' '),\n ...(negativePrompt ? { negativePrompt } : {}),\n ...(spec.durationSeconds !== undefined ? { durationSeconds: spec.durationSeconds } : {}),\n ...(spec.aspectRatio ? { aspectRatio: spec.aspectRatio } : {}),\n };\n}\n\n/** True when a spec says enough to be worth generating from. */\nexport const shotSpecIsUsable = (spec: ShotSpec): boolean => Boolean(spec.subject || spec.action);\n\n/** A brief short enough to be one clause is already the tight prompt the model wants. */\nexport const briefWorthStructuring = (brief: string): boolean => brief.trim().split(/\\s+/).length >= 25;\n\n/** Split a typed \"text, watermark\" into new negatives, merged into the list without repeats. */\nexport function addNegatives(current: readonly string[], draft: string): string[] {\n const entries = draft\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n return [...new Set([...current, ...entries])];\n}\n\n/** Set or clear one camera field; an empty value removes the key so it says nothing. */\nexport function withCamera<K extends keyof ShotCamera>(\n spec: ShotSpec,\n key: K,\n value: ShotCamera[K] | undefined,\n): ShotSpec {\n const camera = { ...spec.camera };\n if (value === undefined || value === '' || (typeof value === 'number' && !Number.isFinite(value)))\n delete camera[key];\n else camera[key] = value;\n return { ...spec, camera };\n}\n\n/** The BUILD_SHOT reply, however the connector wrapped it. */\nexport function parseBuiltShot(raw: unknown): BuiltShot {\n const outer = (raw ?? {}) as Record<string, unknown>;\n const body = (outer.data ?? outer) as Record<string, unknown>;\n const constraintsRaw = (body.constraints ?? {}) as Record<string, unknown>;\n const spec = parseShotSpec(body.spec);\n const constraints: ShotConstraints = {\n durations: Array.isArray(constraintsRaw.durations)\n ? constraintsRaw.durations.filter((d): d is number => typeof d === 'number')\n : [],\n aspects: Array.isArray(constraintsRaw.aspects)\n ? constraintsRaw.aspects.filter((a): a is string => typeof a === 'string')\n : [],\n supportsAudio: constraintsRaw.supportsAudio === true,\n };\n // Recompile locally rather than trusting the wire copy: one compiler for both states.\n return { spec, compiled: compileShot(spec, { supportsAudio: constraints.supportsAudio }), constraints };\n}\n\nexport async function buildShot(\n run: RunConnectorAction,\n params: { brief: string; model?: string },\n): Promise<BuiltShot> {\n const raw = await run(SHOT_CONNECTOR, SHOT_BUILD_ACTION, {\n brief: params.brief,\n ...(params.model ? { model: params.model } : {}),\n });\n return parseBuiltShot(raw);\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,87 @@
1
+ import {useState,useRef,useCallback}from'react';import {buildShot,compileShot}from'./shot.js';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
+ function useShotSpec(run) {
18
+ const [spec, setSpec] = useState(null);
19
+ const [constraints, setConstraints] = useState(null);
20
+ const [busy, setBusy] = useState(false);
21
+ const [error, setError] = useState(null);
22
+ const brief = useRef("");
23
+ const structure = useCallback(async (text, model) => {
24
+ const value = text.trim();
25
+ if (!run || !value || busy) return;
26
+ brief.current = value;
27
+ setBusy(true);
28
+ setError(null);
29
+ try {
30
+ const built = await buildShot(run, __spreadValues({
31
+ brief: value
32
+ }, model ? {
33
+ model
34
+ } : {}));
35
+ setSpec(built.spec);
36
+ setConstraints(built.constraints);
37
+ } catch (err) {
38
+ setError(`Could not sort the brief. ${err instanceof Error ? err.message : String(err)}`.slice(0, 240));
39
+ } finally {
40
+ setBusy(false);
41
+ }
42
+ }, [run, busy]);
43
+ const discard = useCallback(() => {
44
+ setSpec(null);
45
+ setConstraints(null);
46
+ return brief.current;
47
+ }, []);
48
+ const capture = useCallback(() => {
49
+ var _a;
50
+ const snapshot = {
51
+ spec,
52
+ constraints,
53
+ brief: brief.current
54
+ };
55
+ const compiled = spec ? compileShot(spec, {
56
+ supportsAudio: (_a = constraints == null ? void 0 : constraints.supportsAudio) != null ? _a : false
57
+ }) : null;
58
+ return {
59
+ compiled,
60
+ snapshot
61
+ };
62
+ }, [spec, constraints]);
63
+ const clear = useCallback(() => {
64
+ setSpec(null);
65
+ setConstraints(null);
66
+ brief.current = "";
67
+ }, []);
68
+ const restore = useCallback((snapshot) => {
69
+ setSpec(snapshot.spec);
70
+ setConstraints(snapshot.constraints);
71
+ brief.current = brief.current || snapshot.brief;
72
+ }, []);
73
+ return {
74
+ spec,
75
+ constraints,
76
+ busy,
77
+ error,
78
+ brief,
79
+ setSpec,
80
+ structure,
81
+ discard,
82
+ capture,
83
+ clear,
84
+ restore,
85
+ dismissError: () => setError(null)
86
+ };
87
+ }export{useShotSpec};//# sourceMappingURL=useShotSpec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useShotSpec.js","sources":["../../../../src/features/canvas/generator/useShotSpec.ts"],"sourcesContent":["/**\n * The structured-shot state both video generators hold (web CanvasPage\n * `shotSpec` / `shotConstraints` / `shotBusy` / `shotBrief`): sort a brief,\n * edit the spec, compile it for the run, put it back if the run fails.\n */\nimport { useCallback, useRef, useState } from 'react';\nimport {\n buildShot,\n compileShot,\n type CompiledShot,\n type RunConnectorAction,\n type ShotConstraints,\n type ShotSpec,\n} from './shot';\n\nexport interface ShotSnapshot {\n spec: ShotSpec | null;\n constraints: ShotConstraints | null;\n brief: string;\n}\n\nexport function useShotSpec(run: RunConnectorAction | undefined) {\n const [spec, setSpec] = useState<ShotSpec | null>(null);\n const [constraints, setConstraints] = useState<ShotConstraints | null>(null);\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const brief = useRef('');\n\n const structure = useCallback(\n async (text: string, model?: string) => {\n const value = text.trim();\n if (!run || !value || busy) return;\n brief.current = value;\n setBusy(true);\n setError(null);\n try {\n const built = await buildShot(run, { brief: value, ...(model ? { model } : {}) });\n setSpec(built.spec);\n setConstraints(built.constraints);\n } catch (err: unknown) {\n // Non-fatal: the plain prompt still generates.\n setError(`Could not sort the brief. ${err instanceof Error ? err.message : String(err)}`.slice(0, 240));\n } finally {\n setBusy(false);\n }\n },\n [run, busy],\n );\n\n /** Drop the spec; returns the brief it came from so the prompt box can take it back. */\n const discard = useCallback((): string => {\n setSpec(null);\n setConstraints(null);\n return brief.current;\n }, []);\n\n /** The compiled shot for a run (or null), and a snapshot to restore if the run fails. */\n const capture = useCallback((): { compiled: CompiledShot | null; snapshot: ShotSnapshot } => {\n const snapshot = { spec, constraints, brief: brief.current };\n const compiled = spec ? compileShot(spec, { supportsAudio: constraints?.supportsAudio ?? false }) : null;\n return { compiled, snapshot };\n }, [spec, constraints]);\n\n const clear = useCallback(() => {\n setSpec(null);\n setConstraints(null);\n brief.current = '';\n }, []);\n\n const restore = useCallback((snapshot: ShotSnapshot) => {\n setSpec(snapshot.spec);\n setConstraints(snapshot.constraints);\n brief.current = brief.current || snapshot.brief;\n }, []);\n\n return {\n spec,\n constraints,\n busy,\n error,\n brief,\n setSpec,\n structure,\n discard,\n capture,\n clear,\n restore,\n dismissError: () => setError(null),\n };\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,214 @@
1
+ import {jsxs,jsx}from'react/jsx-runtime';import {useMemo,useState,useCallback}from'react';import {View,Text,Modal,TextInput,ScrollView,ActivityIndicator,StyleSheet}from'react-native';import {MaterialCommunityIcons}from'@expo/vector-icons';import {Image}from'expo-image';import {useCanvasTheme,themedStyles}from'../canvasTheme.js';import {Pressable,pressedStyle,Segmented,RADIUS,SPACE,TYPE}from'../canvasUi.js';import {HeroMonitor}from'./HeroMonitor.js';import {DirectorSheet,DirectorPill}from'../generator/DirectorSheet.js';import {EMPTY_DIRECTION,directedPrompt}from'../generator/direction.js';import {heroShots,heroAspectOf,nextIn,heroSettings,HERO_ASPECTS,HERO_RESOLUTIONS}from'./heroShots.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 MODES = [{
21
+ id: "image",
22
+ label: "Image"
23
+ }, {
24
+ id: "video",
25
+ label: "Video"
26
+ }];
27
+ const PLACEHOLDER = "A slow push-in on a ceramic mug on a sunlit table, steam curling, shallow focus";
28
+ const PHONE_SHOTS = 4;
29
+ function HeroComposer({
30
+ featuredLooks,
31
+ showcase,
32
+ playing,
33
+ onStartWithPrompt,
34
+ onPickReference,
35
+ onBrowseTemplates
36
+ }) {
37
+ const theme = useCanvasTheme();
38
+ const styles = makeStyles(theme);
39
+ const shots = useMemo(() => heroShots(featuredLooks, showcase, PHONE_SHOTS), [featuredLooks, showcase]);
40
+ const [shot, setShot] = useState(0);
41
+ const [mode, setMode] = useState("video");
42
+ const [draft, setDraft] = useState("");
43
+ const [focused, setFocused] = useState(false);
44
+ const [aspect, setAspect] = useState("16:9");
45
+ const [resolution, setResolution] = useState("720p");
46
+ const [product, setProduct] = useState(null);
47
+ const [attaching, setAttaching] = useState(false);
48
+ const [direction, setDirection] = useState(EMPTY_DIRECTION);
49
+ const [directing, setDirecting] = useState(false);
50
+ const index = shots.length ? shot % shots.length : 0;
51
+ const ready = Boolean(draft.trim());
52
+ const applyShot = useCallback((s) => {
53
+ setDraft(s.prompt);
54
+ setMode("video");
55
+ const fit = heroAspectOf(s.aspect);
56
+ if (fit) setAspect(fit);
57
+ }, []);
58
+ const attach = async () => {
59
+ if (!onPickReference || attaching) return;
60
+ setAttaching(true);
61
+ try {
62
+ const url = await onPickReference();
63
+ if (url) setProduct(url);
64
+ } finally {
65
+ setAttaching(false);
66
+ }
67
+ };
68
+ const submit = () => {
69
+ const text = draft.trim();
70
+ if (!text) return;
71
+ const sent = mode === "video" ? directedPrompt(text, direction) : text;
72
+ onStartWithPrompt(sent, heroSettings(mode, aspect, resolution, product));
73
+ };
74
+ return /* @__PURE__ */ jsxs(View, { style: styles.root, children: [
75
+ /* @__PURE__ */ jsxs(View, { style: styles.titleRow, children: [
76
+ /* @__PURE__ */ jsx(Text, { style: styles.title, accessibilityRole: "header", children: "Direct the shot" }),
77
+ onBrowseTemplates ? /* @__PURE__ */ jsxs(Pressable, { onPress: onBrowseTemplates, hitSlop: 8, style: ({
78
+ pressed
79
+ }) => [styles.templatesLink, pressedStyle(pressed)], accessibilityRole: "button", accessibilityLabel: "Start from a template", testID: "hero-browse-templates", children: [
80
+ /* @__PURE__ */ jsx(Text, { style: styles.templatesLinkLabel, children: "Templates" }),
81
+ /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "arrow-right", size: 14, color: theme.mutedForeground })
82
+ ] }) : null
83
+ ] }),
84
+ /* @__PURE__ */ jsx(HeroMonitor, { shots, index, onCut: setShot, paused: ready || focused, playing, still: mode === "image", aspect, resolution, slate: draft, onUseShot: applyShot }),
85
+ directing ? /* @__PURE__ */ jsx(Modal, { transparent: true, animationType: "slide", visible: true, onRequestClose: () => setDirecting(false), children: /* @__PURE__ */ jsx(View, { style: styles.sheetHost, children: /* @__PURE__ */ jsx(DirectorSheet, { value: direction, onChange: setDirection, onClose: () => setDirecting(false), prompt: draft }) }) }) : null,
86
+ /* @__PURE__ */ jsxs(View, { style: styles.composer, children: [
87
+ /* @__PURE__ */ jsxs(View, { style: styles.promptWell, children: [
88
+ /* @__PURE__ */ jsx(TextInput, { value: draft, onChangeText: setDraft, onFocus: () => setFocused(true), onBlur: () => setFocused(false), placeholder: mode === "video" ? PLACEHOLDER : "A ceramic mug on a sunlit table, soft morning light", placeholderTextColor: theme.tint(0.32), multiline: true, style: styles.prompt, accessibilityLabel: "Describe the shot", testID: "hero-prompt" }),
89
+ /* @__PURE__ */ jsx(Pressable, { onPress: submit, disabled: !ready, style: ({
90
+ pressed
91
+ }) => [styles.send, !ready && styles.sendIdle, pressedStyle(pressed && ready)], accessibilityRole: "button", accessibilityLabel: mode === "video" ? "Generate video" : "Generate image", accessibilityState: {
92
+ disabled: !ready
93
+ }, testID: "hero-generate", children: /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "arrow-up", size: 20, color: theme.primaryForeground }) })
94
+ ] }),
95
+ /* @__PURE__ */ jsxs(ScrollView, { horizontal: true, showsHorizontalScrollIndicator: false, style: styles.optionsScroll, contentContainerStyle: styles.options, keyboardShouldPersistTaps: "handled", children: [
96
+ /* @__PURE__ */ jsx(Segmented, { options: MODES, value: mode, onChange: setMode }),
97
+ /* @__PURE__ */ jsxs(Pressable, { onPress: () => setAspect(nextIn(HERO_ASPECTS, aspect)), style: ({
98
+ pressed
99
+ }) => [styles.pill, pressedStyle(pressed)], accessibilityRole: "button", accessibilityLabel: `Aspect ratio ${aspect}. Tap to change`, children: [
100
+ /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "aspect-ratio", size: 15, color: theme.mutedForeground }),
101
+ /* @__PURE__ */ jsx(Text, { style: styles.pillLabel, children: aspect })
102
+ ] }),
103
+ /* @__PURE__ */ jsx(Pressable, { onPress: () => setResolution(nextIn(HERO_RESOLUTIONS, resolution)), style: ({
104
+ pressed
105
+ }) => [styles.pill, pressedStyle(pressed)], accessibilityRole: "button", accessibilityLabel: `Resolution ${resolution}. Tap to change`, children: /* @__PURE__ */ jsx(Text, { style: styles.pillLabel, children: resolution }) }),
106
+ mode === "video" ? /* @__PURE__ */ jsx(DirectorPill, { value: direction, onPress: () => setDirecting(true) }) : null,
107
+ product ? /* @__PURE__ */ jsxs(View, { style: styles.pill, children: [
108
+ /* @__PURE__ */ jsx(Image, { source: {
109
+ uri: product
110
+ }, style: styles.refThumb, contentFit: "cover" }),
111
+ /* @__PURE__ */ jsx(Text, { style: styles.pillLabel, children: "Product" }),
112
+ /* @__PURE__ */ jsx(Pressable, { onPress: () => setProduct(null), hitSlop: 10, accessibilityRole: "button", accessibilityLabel: "Remove product reference", children: /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "close", size: 14, color: theme.mutedForeground }) })
113
+ ] }) : onPickReference ? /* @__PURE__ */ jsxs(Pressable, { onPress: () => void attach(), disabled: attaching, style: ({
114
+ pressed
115
+ }) => [styles.pill, pressedStyle(pressed)], accessibilityRole: "button", accessibilityLabel: "Add a product reference image", children: [
116
+ attaching ? /* @__PURE__ */ jsx(ActivityIndicator, { size: "small", color: theme.mutedForeground }) : /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "image-plus", size: 15, color: theme.mutedForeground }),
117
+ /* @__PURE__ */ jsx(Text, { style: styles.pillLabel, children: "Product" })
118
+ ] }) : null
119
+ ] })
120
+ ] })
121
+ ] });
122
+ }
123
+ const makeStyles = themedStyles((theme) => StyleSheet.create({
124
+ root: {
125
+ gap: SPACE.md,
126
+ marginBottom: SPACE.xl
127
+ },
128
+ sheetHost: {
129
+ flex: 1
130
+ },
131
+ titleRow: {
132
+ flexDirection: "row",
133
+ alignItems: "center",
134
+ justifyContent: "space-between",
135
+ gap: SPACE.md
136
+ },
137
+ title: __spreadProps(__spreadValues({}, TYPE.heading), {
138
+ color: theme.foreground,
139
+ flexShrink: 1
140
+ }),
141
+ templatesLink: {
142
+ flexDirection: "row",
143
+ alignItems: "center",
144
+ gap: SPACE.xs,
145
+ minHeight: 32
146
+ },
147
+ templatesLinkLabel: __spreadProps(__spreadValues({}, TYPE.label), {
148
+ color: theme.mutedForeground
149
+ }),
150
+ composer: {
151
+ gap: SPACE.sm,
152
+ padding: SPACE.sm,
153
+ borderRadius: RADIUS.xl,
154
+ backgroundColor: theme.card
155
+ },
156
+ promptWell: {
157
+ flexDirection: "row",
158
+ alignItems: "flex-end",
159
+ gap: SPACE.sm,
160
+ paddingLeft: SPACE.md,
161
+ paddingRight: SPACE.xs + 2,
162
+ paddingVertical: SPACE.xs + 2,
163
+ borderRadius: RADIUS.lg,
164
+ backgroundColor: theme.isDark ? theme.secondary : theme.surface
165
+ },
166
+ prompt: __spreadProps(__spreadValues({}, TYPE.body), {
167
+ flex: 1,
168
+ minHeight: 64,
169
+ maxHeight: 160,
170
+ paddingTop: SPACE.sm,
171
+ paddingBottom: SPACE.sm,
172
+ color: theme.foreground,
173
+ textAlignVertical: "top"
174
+ }),
175
+ send: {
176
+ width: 40,
177
+ height: 40,
178
+ borderRadius: 20,
179
+ alignItems: "center",
180
+ justifyContent: "center",
181
+ backgroundColor: theme.primary
182
+ },
183
+ // Stays lime so the main action is always findable; dimmed until there is a prompt.
184
+ sendIdle: {
185
+ opacity: 0.4
186
+ },
187
+ optionsScroll: {
188
+ flexGrow: 0
189
+ },
190
+ options: {
191
+ flexDirection: "row",
192
+ alignItems: "center",
193
+ gap: SPACE.sm,
194
+ paddingHorizontal: 2
195
+ },
196
+ pill: {
197
+ flexDirection: "row",
198
+ alignItems: "center",
199
+ gap: SPACE.xs + 2,
200
+ minHeight: 36,
201
+ paddingHorizontal: SPACE.md,
202
+ borderRadius: RADIUS.pill,
203
+ backgroundColor: theme.isDark ? theme.secondary : theme.surface
204
+ },
205
+ refThumb: {
206
+ width: 20,
207
+ height: 20,
208
+ borderRadius: 5
209
+ },
210
+ pillLabel: __spreadProps(__spreadValues({}, TYPE.label), {
211
+ fontVariant: ["tabular-nums"],
212
+ color: theme.foreground
213
+ })
214
+ }));export{HeroComposer};//# sourceMappingURL=HeroComposer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HeroComposer.js","sources":["../../../../src/features/canvas/home/HeroComposer.tsx"],"sourcesContent":["/**\n * \"Direct the shot\" - the home hero, native twin of canvas-surface\n * `CanvasHome.tsx` (hero + composer). The monitor previews what the composer\n * will make; Generate opens a fresh canvas with the generator seeded from it.\n *\n * Monitor looping shots (HeroMonitor), \"Use this shot\" copies a prompt\n * Composer image / video, the prompt, a product reference, aspect and\n * resolution pills, Generate\n *\n * Film / camera / palette / lighting ride the \"Direct\" pill (generator/DirectorSheet)\n * and are applied to the prompt on Generate, as web CanvasHome does. The\n * character picker and model chip are not here yet.\n */\nimport React, { useCallback, useMemo, useState } from 'react';\nimport { ActivityIndicator, Modal, ScrollView, StyleSheet, Text, TextInput, View } from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { Image } from 'expo-image';\nimport type { StudioLook } from '../studioLooks';\nimport type { ShowcaseClip } from '../seedanceShowcase';\nimport { useCanvasTheme, themedStyles, type CanvasPalette } from '../canvasTheme';\nimport { Pressable, RADIUS, SPACE, Segmented, TYPE, pressedStyle } from '../canvasUi';\nimport { HeroMonitor } from './HeroMonitor';\nimport { DirectorPill, DirectorSheet } from '../generator/DirectorSheet';\nimport { EMPTY_DIRECTION, directedPrompt, type Direction } from '../generator/direction';\nimport {\n HERO_ASPECTS,\n HERO_RESOLUTIONS,\n heroAspectOf,\n heroSettings,\n heroShots,\n nextIn,\n type HeroAspect,\n type HeroMode,\n type HeroResolution,\n type HeroSettings,\n type HeroShot,\n} from './heroShots';\n\nconst MODES = [\n { id: 'image' as const, label: 'Image' },\n { id: 'video' as const, label: 'Video' },\n];\nconst PLACEHOLDER = 'A slow push-in on a ceramic mug on a sunlit table, steam curling, shallow focus';\n/** The monitor's four thumbs on a phone; it cycles only what it shows. */\nconst PHONE_SHOTS = 4;\n\nexport function HeroComposer({\n featuredLooks,\n showcase,\n playing,\n onStartWithPrompt,\n onPickReference,\n onBrowseTemplates,\n}: {\n featuredLooks: readonly StudioLook[];\n showcase: readonly ShowcaseClip[];\n /** The home playback governor: true while the hero is the region on screen. */\n playing: boolean;\n onStartWithPrompt: (prompt: string, settings: HeroSettings) => void;\n /** Picks an image from the device and answers its uploaded URL (null when cancelled). */\n onPickReference?: () => Promise<string | null>;\n onBrowseTemplates?: () => void;\n}) {\n const theme = useCanvasTheme();\n const styles = makeStyles(theme);\n const shots = useMemo(() => heroShots(featuredLooks, showcase, PHONE_SHOTS), [featuredLooks, showcase]);\n const [shot, setShot] = useState(0);\n const [mode, setMode] = useState<HeroMode>('video');\n const [draft, setDraft] = useState('');\n const [focused, setFocused] = useState(false);\n const [aspect, setAspect] = useState<HeroAspect>('16:9');\n const [resolution, setResolution] = useState<HeroResolution>('720p');\n const [product, setProduct] = useState<string | null>(null);\n const [attaching, setAttaching] = useState(false);\n const [direction, setDirection] = useState<Direction>(EMPTY_DIRECTION);\n const [directing, setDirecting] = useState(false);\n const index = shots.length ? shot % shots.length : 0;\n const ready = Boolean(draft.trim());\n\n const applyShot = useCallback((s: HeroShot) => {\n setDraft(s.prompt);\n setMode('video');\n const fit = heroAspectOf(s.aspect);\n if (fit) setAspect(fit);\n }, []);\n\n const attach = async () => {\n if (!onPickReference || attaching) return;\n setAttaching(true);\n try {\n const url = await onPickReference();\n if (url) setProduct(url);\n } finally {\n setAttaching(false);\n }\n };\n\n const submit = () => {\n const text = draft.trim();\n if (!text) return;\n // Web CanvasHome: applyCinematic(draft, composeCameraPhrase(camera), cine). Video only.\n const sent = mode === 'video' ? directedPrompt(text, direction) : text;\n onStartWithPrompt(sent, heroSettings(mode, aspect, resolution, product));\n };\n\n return (\n <View style={styles.root}>\n <View style={styles.titleRow}>\n <Text style={styles.title} accessibilityRole=\"header\">\n Direct the shot\n </Text>\n {onBrowseTemplates ? (\n <Pressable\n onPress={onBrowseTemplates}\n hitSlop={8}\n style={({ pressed }) => [styles.templatesLink, pressedStyle(pressed)]}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Start from a template\"\n testID=\"hero-browse-templates\"\n >\n <Text style={styles.templatesLinkLabel}>Templates</Text>\n <MaterialCommunityIcons name=\"arrow-right\" size={14} color={theme.mutedForeground} />\n </Pressable>\n ) : null}\n </View>\n\n <HeroMonitor\n shots={shots}\n index={index}\n onCut={setShot}\n paused={ready || focused}\n playing={playing}\n still={mode === 'image'}\n aspect={aspect}\n resolution={resolution}\n slate={draft}\n onUseShot={applyShot}\n />\n\n {directing ? (\n <Modal transparent animationType=\"slide\" visible onRequestClose={() => setDirecting(false)}>\n <View style={styles.sheetHost}>\n <DirectorSheet\n value={direction}\n onChange={setDirection}\n onClose={() => setDirecting(false)}\n prompt={draft}\n />\n </View>\n </Modal>\n ) : null}\n\n <View style={styles.composer}>\n {/* The prompt carries its own send, like the home prompt bar. */}\n <View style={styles.promptWell}>\n <TextInput\n value={draft}\n onChangeText={setDraft}\n onFocus={() => setFocused(true)}\n onBlur={() => setFocused(false)}\n placeholder={\n mode === 'video' ? PLACEHOLDER : 'A ceramic mug on a sunlit table, soft morning light'\n }\n placeholderTextColor={theme.tint(0.32)}\n multiline\n style={styles.prompt}\n accessibilityLabel=\"Describe the shot\"\n testID=\"hero-prompt\"\n />\n <Pressable\n onPress={submit}\n disabled={!ready}\n style={({ pressed }) => [\n styles.send,\n !ready && styles.sendIdle,\n pressedStyle(pressed && ready),\n ]}\n accessibilityRole=\"button\"\n accessibilityLabel={mode === 'video' ? 'Generate video' : 'Generate image'}\n accessibilityState={{ disabled: !ready }}\n testID=\"hero-generate\"\n >\n <MaterialCommunityIcons name=\"arrow-up\" size={20} color={theme.primaryForeground} />\n </Pressable>\n </View>\n\n {/* Every setting in one row: what it makes, its frame, and how it is shot. */}\n <ScrollView\n horizontal\n showsHorizontalScrollIndicator={false}\n style={styles.optionsScroll}\n contentContainerStyle={styles.options}\n keyboardShouldPersistTaps=\"handled\"\n >\n <Segmented options={MODES} value={mode} onChange={setMode} />\n <Pressable\n onPress={() => setAspect(nextIn(HERO_ASPECTS, aspect))}\n style={({ pressed }) => [styles.pill, pressedStyle(pressed)]}\n accessibilityRole=\"button\"\n accessibilityLabel={`Aspect ratio ${aspect}. Tap to change`}\n >\n <MaterialCommunityIcons name=\"aspect-ratio\" size={15} color={theme.mutedForeground} />\n <Text style={styles.pillLabel}>{aspect}</Text>\n </Pressable>\n <Pressable\n onPress={() => setResolution(nextIn(HERO_RESOLUTIONS, resolution))}\n style={({ pressed }) => [styles.pill, pressedStyle(pressed)]}\n accessibilityRole=\"button\"\n accessibilityLabel={`Resolution ${resolution}. Tap to change`}\n >\n <Text style={styles.pillLabel}>{resolution}</Text>\n </Pressable>\n {mode === 'video' ? <DirectorPill value={direction} onPress={() => setDirecting(true)} /> : null}\n {product ? (\n <View style={styles.pill}>\n <Image source={{ uri: product }} style={styles.refThumb} contentFit=\"cover\" />\n <Text style={styles.pillLabel}>Product</Text>\n <Pressable\n onPress={() => setProduct(null)}\n hitSlop={10}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Remove product reference\"\n >\n <MaterialCommunityIcons name=\"close\" size={14} color={theme.mutedForeground} />\n </Pressable>\n </View>\n ) : onPickReference ? (\n <Pressable\n onPress={() => void attach()}\n disabled={attaching}\n style={({ pressed }) => [styles.pill, pressedStyle(pressed)]}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Add a product reference image\"\n >\n {attaching ? (\n <ActivityIndicator size=\"small\" color={theme.mutedForeground} />\n ) : (\n <MaterialCommunityIcons name=\"image-plus\" size={15} color={theme.mutedForeground} />\n )}\n <Text style={styles.pillLabel}>Product</Text>\n </Pressable>\n ) : null}\n </ScrollView>\n </View>\n </View>\n );\n}\n\nconst makeStyles = themedStyles((theme: CanvasPalette) =>\n StyleSheet.create({\n root: { gap: SPACE.md, marginBottom: SPACE.xl },\n sheetHost: { flex: 1 },\n titleRow: { flexDirection: 'row', alignItems: 'center', justifyContent: 'space-between', gap: SPACE.md },\n title: { ...TYPE.heading, color: theme.foreground, flexShrink: 1 },\n templatesLink: { flexDirection: 'row', alignItems: 'center', gap: SPACE.xs, minHeight: 32 },\n templatesLinkLabel: { ...TYPE.label, color: theme.mutedForeground },\n composer: {\n gap: SPACE.sm,\n padding: SPACE.sm,\n borderRadius: RADIUS.xl,\n backgroundColor: theme.card,\n },\n promptWell: {\n flexDirection: 'row',\n alignItems: 'flex-end',\n gap: SPACE.sm,\n paddingLeft: SPACE.md,\n paddingRight: SPACE.xs + 2,\n paddingVertical: SPACE.xs + 2,\n borderRadius: RADIUS.lg,\n backgroundColor: theme.isDark ? theme.secondary : theme.surface,\n },\n prompt: {\n ...TYPE.body,\n flex: 1,\n minHeight: 64,\n maxHeight: 160,\n paddingTop: SPACE.sm,\n paddingBottom: SPACE.sm,\n color: theme.foreground,\n textAlignVertical: 'top',\n },\n send: {\n width: 40,\n height: 40,\n borderRadius: 20,\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: theme.primary,\n },\n // Stays lime so the main action is always findable; dimmed until there is a prompt.\n sendIdle: { opacity: 0.4 },\n optionsScroll: { flexGrow: 0 },\n options: { flexDirection: 'row', alignItems: 'center', gap: SPACE.sm, paddingHorizontal: 2 },\n pill: {\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.isDark ? theme.secondary : theme.surface,\n },\n refThumb: { width: 20, height: 20, borderRadius: 5 },\n pillLabel: { ...TYPE.label, fontVariant: ['tabular-nums'], color: theme.foreground },\n }),\n);\n"],"names":[],"mappings":"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"}