@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,406 @@
1
+ import {jsxs,jsx}from'react/jsx-runtime';import {useState,useRef,useMemo}from'react';import {View,Text,TextInput,PanResponder,Switch,ScrollView,Image,StyleSheet}from'react-native';import {useCanvasTheme,themedStyles}from'./canvasTheme.js';import {Pressable,pressedStyle,RADIUS,SPACE,HIT,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 clamp = (v, lo, hi) => Math.min(hi, Math.max(lo, v));
21
+ function snapToStep(raw, min, max, step) {
22
+ const snapped = step > 0 ? Math.round((raw - min) / step) * step + min : raw;
23
+ return clamp(Number(snapped.toFixed(6)), min, max);
24
+ }
25
+ function SliderRow({
26
+ label,
27
+ value,
28
+ min,
29
+ max,
30
+ step = 1,
31
+ format,
32
+ onChange,
33
+ disabled
34
+ }) {
35
+ const styles = makeStyles(useCanvasTheme());
36
+ const width = useRef(1);
37
+ const live = useRef({
38
+ min,
39
+ max,
40
+ step,
41
+ onChange,
42
+ disabled
43
+ });
44
+ live.current = {
45
+ min,
46
+ max,
47
+ step,
48
+ onChange,
49
+ disabled
50
+ };
51
+ const fromX = (x) => {
52
+ const {
53
+ min: lo,
54
+ max: hi,
55
+ step: st
56
+ } = live.current;
57
+ return snapToStep(lo + clamp(x, 0, width.current) / width.current * (hi - lo), lo, hi, st);
58
+ };
59
+ const responder = useMemo(
60
+ () => PanResponder.create({
61
+ onStartShouldSetPanResponder: () => !live.current.disabled,
62
+ onMoveShouldSetPanResponder: () => !live.current.disabled,
63
+ // A horizontal drag inside a vertical sheet must stay with the slider.
64
+ onPanResponderTerminationRequest: () => false,
65
+ onPanResponderGrant: (e) => live.current.onChange(fromX(e.nativeEvent.locationX)),
66
+ onPanResponderMove: (e) => live.current.onChange(fromX(e.nativeEvent.locationX))
67
+ }),
68
+ // eslint-disable-next-line react-hooks/exhaustive-deps
69
+ []
70
+ );
71
+ const frac = max > min ? (clamp(value, min, max) - min) / (max - min) : 0;
72
+ return /* @__PURE__ */ jsxs(View, { style: [styles.sliderRow, disabled && styles.off], children: [
73
+ /* @__PURE__ */ jsxs(View, { style: styles.sliderHead, children: [
74
+ /* @__PURE__ */ jsx(Text, { style: styles.label, children: label }),
75
+ /* @__PURE__ */ jsx(Text, { style: styles.value, children: format ? format(value) : String(Math.round(value * 100) / 100) })
76
+ ] }),
77
+ /* @__PURE__ */ jsxs(View, __spreadProps(__spreadValues({ style: styles.track, onLayout: (e) => {
78
+ width.current = Math.max(1, e.nativeEvent.layout.width);
79
+ } }, responder.panHandlers), { accessibilityRole: "adjustable", accessibilityLabel: label, accessibilityValue: {
80
+ min,
81
+ max,
82
+ now: value
83
+ }, accessibilityActions: [{
84
+ name: "increment"
85
+ }, {
86
+ name: "decrement"
87
+ }], onAccessibilityAction: (event) => {
88
+ const dir = event.nativeEvent.actionName === "increment" ? 1 : -1;
89
+ onChange(snapToStep(value + dir * step, min, max, step));
90
+ }, children: [
91
+ /* @__PURE__ */ jsx(View, { style: styles.rail, pointerEvents: "none", children: /* @__PURE__ */ jsx(View, { style: [styles.fill, {
92
+ width: `${frac * 100}%`
93
+ }] }) }),
94
+ /* @__PURE__ */ jsx(View, { pointerEvents: "none", style: [styles.knob, {
95
+ left: `${frac * 100}%`
96
+ }] })
97
+ ] }))
98
+ ] });
99
+ }
100
+ function NumberField({
101
+ label,
102
+ value,
103
+ onChange,
104
+ disabled,
105
+ suffix
106
+ }) {
107
+ const theme = useCanvasTheme();
108
+ const styles = makeStyles(theme);
109
+ const [draft, setDraft] = useState(null);
110
+ const shown = draft != null ? draft : String(Number.isFinite(value) ? Math.round(value * 1e3) / 1e3 : 0);
111
+ return /* @__PURE__ */ jsxs(View, { style: styles.numField, children: [
112
+ /* @__PURE__ */ jsxs(Text, { style: styles.numLabel, children: [
113
+ label,
114
+ suffix ? ` (${suffix})` : ""
115
+ ] }),
116
+ /* @__PURE__ */ jsx(TextInput, { value: shown, editable: !disabled, keyboardType: "numbers-and-punctuation", onChangeText: (text) => {
117
+ setDraft(text);
118
+ const next = Number(text);
119
+ if (text.trim() !== "" && Number.isFinite(next)) onChange(next);
120
+ }, onBlur: () => setDraft(null), style: [styles.numInput, disabled && styles.off], placeholderTextColor: theme.edInk3, accessibilityLabel: label })
121
+ ] });
122
+ }
123
+ function TextField({
124
+ label,
125
+ value,
126
+ onChange,
127
+ placeholder,
128
+ multiline
129
+ }) {
130
+ const theme = useCanvasTheme();
131
+ const styles = makeStyles(theme);
132
+ return /* @__PURE__ */ jsxs(View, { style: styles.block, children: [
133
+ label ? /* @__PURE__ */ jsx(Text, { style: [styles.label, styles.blockLabel], children: label }) : null,
134
+ /* @__PURE__ */ jsx(TextInput, { value, onChangeText: onChange, placeholder, placeholderTextColor: theme.edInk3, multiline, autoCapitalize: "none", autoCorrect: false, style: [styles.textInput, multiline && styles.textInputMulti], accessibilityLabel: label != null ? label : placeholder })
135
+ ] });
136
+ }
137
+ function ChoiceRow({
138
+ label,
139
+ options,
140
+ value,
141
+ onChange
142
+ }) {
143
+ const styles = makeStyles(useCanvasTheme());
144
+ return /* @__PURE__ */ jsxs(View, { style: styles.block, children: [
145
+ label ? /* @__PURE__ */ jsx(Text, { style: [styles.label, styles.blockLabel], children: label }) : null,
146
+ /* @__PURE__ */ jsx(View, { style: styles.chips, children: options.map((o) => {
147
+ const on = o.value === value;
148
+ return /* @__PURE__ */ jsx(Pressable, { onPress: () => onChange(o.value), accessibilityRole: "button", accessibilityState: {
149
+ selected: on
150
+ }, style: ({
151
+ pressed
152
+ }) => [styles.chip, on && styles.chipOn, pressedStyle(pressed)], children: /* @__PURE__ */ jsx(Text, { style: [styles.chipLabel, on && styles.chipLabelOn], children: o.label }) }, String(o.value));
153
+ }) })
154
+ ] });
155
+ }
156
+ function ToggleRow({
157
+ label,
158
+ value,
159
+ onChange
160
+ }) {
161
+ const theme = useCanvasTheme();
162
+ const styles = makeStyles(theme);
163
+ return /* @__PURE__ */ jsxs(View, { style: styles.toggleRow, children: [
164
+ /* @__PURE__ */ jsx(Text, { style: styles.toggleLabel, children: label }),
165
+ /* @__PURE__ */ jsx(Switch, { value, onValueChange: onChange, trackColor: {
166
+ false: theme.edRaisedHi,
167
+ true: theme.edAccent
168
+ }, accessibilityLabel: label })
169
+ ] });
170
+ }
171
+ function ApplyButton({
172
+ label,
173
+ onPress,
174
+ disabled,
175
+ tone = "solid"
176
+ }) {
177
+ const styles = makeStyles(useCanvasTheme());
178
+ return /* @__PURE__ */ jsx(Pressable, { onPress, disabled, accessibilityRole: "button", accessibilityState: {
179
+ disabled: Boolean(disabled)
180
+ }, style: ({
181
+ pressed
182
+ }) => [tone === "solid" ? styles.apply : styles.applySoft, disabled && styles.off, pressedStyle(pressed && !disabled)], children: /* @__PURE__ */ jsx(Text, { style: tone === "solid" ? styles.applyLabel : styles.applySoftLabel, children: label }) });
183
+ }
184
+ function SwatchRow({
185
+ label,
186
+ colors,
187
+ value,
188
+ onChange
189
+ }) {
190
+ const styles = makeStyles(useCanvasTheme());
191
+ return /* @__PURE__ */ jsxs(View, { style: styles.block, children: [
192
+ label ? /* @__PURE__ */ jsx(Text, { style: [styles.label, styles.blockLabel], children: label }) : null,
193
+ /* @__PURE__ */ jsx(View, { style: styles.chips, children: colors.map((c) => /* @__PURE__ */ jsx(Pressable, { onPress: () => onChange(c), accessibilityRole: "button", accessibilityLabel: c, accessibilityState: {
194
+ selected: c.toLowerCase() === value.toLowerCase()
195
+ }, style: [styles.swatch, {
196
+ backgroundColor: c
197
+ }, c.toLowerCase() === value.toLowerCase() && styles.swatchOn] }, c)) })
198
+ ] });
199
+ }
200
+ function MediaUrlPicker({
201
+ label,
202
+ items,
203
+ value,
204
+ onChange,
205
+ placeholder = "https://..."
206
+ }) {
207
+ const theme = useCanvasTheme();
208
+ const styles = makeStyles(theme);
209
+ return /* @__PURE__ */ jsxs(View, { style: styles.block, children: [
210
+ label ? /* @__PURE__ */ jsx(Text, { style: [styles.label, styles.blockLabel], children: label }) : null,
211
+ items.length ? /* @__PURE__ */ jsx(ScrollView, { horizontal: true, style: styles.hscroll, showsHorizontalScrollIndicator: false, contentContainerStyle: styles.pickRow, keyboardShouldPersistTaps: "handled", children: items.map((item) => {
212
+ var _a;
213
+ const on = item.src === value;
214
+ return /* @__PURE__ */ jsx(Pressable, { onPress: () => onChange(on ? "" : item.src), accessibilityRole: "button", accessibilityLabel: (_a = item.label) != null ? _a : item.kind, accessibilityState: {
215
+ selected: on
216
+ }, style: [item.kind === "image" ? styles.pickThumb : styles.pickChip, on && styles.pickOn], children: item.kind === "image" ? /* @__PURE__ */ jsx(Image, { source: {
217
+ uri: item.src
218
+ }, style: styles.pickImg }) : /* @__PURE__ */ jsx(Text, { style: styles.chipLabel, numberOfLines: 1, children: item.label || (item.kind === "audio" ? "Audio" : "Video") }) }, item.id);
219
+ }) }) : null,
220
+ /* @__PURE__ */ jsx(TextInput, { value, onChangeText: onChange, placeholder, placeholderTextColor: theme.edInk3, autoCapitalize: "none", autoCorrect: false, style: styles.textInput, accessibilityLabel: label != null ? label : "Media URL" })
221
+ ] });
222
+ }
223
+ const SWATCHES = ["#ef4444", "#f97316", "#facc15", "#22c55e", "#3b82f6", "#a855f7", "#ffffff", "#000000"];
224
+ const makeStyles = themedStyles((theme) => StyleSheet.create({
225
+ off: {
226
+ opacity: 0.4
227
+ },
228
+ block: {
229
+ marginBottom: SPACE.sm
230
+ },
231
+ blockLabel: {
232
+ marginBottom: SPACE.xs
233
+ },
234
+ label: __spreadProps(__spreadValues({}, TYPE.caption), {
235
+ color: theme.edInk2
236
+ }),
237
+ value: __spreadProps(__spreadValues({}, TYPE.caption), {
238
+ color: theme.edInk,
239
+ fontVariant: ["tabular-nums"]
240
+ }),
241
+ sliderRow: {
242
+ marginBottom: SPACE.sm
243
+ },
244
+ sliderHead: {
245
+ flexDirection: "row",
246
+ justifyContent: "space-between",
247
+ marginBottom: 2
248
+ },
249
+ track: {
250
+ height: 32,
251
+ justifyContent: "center"
252
+ },
253
+ rail: {
254
+ height: 4,
255
+ borderRadius: 2,
256
+ backgroundColor: theme.edRaisedHi,
257
+ overflow: "hidden"
258
+ },
259
+ fill: {
260
+ height: 4,
261
+ backgroundColor: theme.edInk
262
+ },
263
+ knob: {
264
+ position: "absolute",
265
+ width: 20,
266
+ height: 20,
267
+ marginLeft: -10,
268
+ borderRadius: 10,
269
+ backgroundColor: theme.edInk,
270
+ borderWidth: 3,
271
+ borderColor: theme.edPanel
272
+ },
273
+ numField: {
274
+ flex: 1,
275
+ minWidth: 64
276
+ },
277
+ numLabel: __spreadProps(__spreadValues({}, TYPE.caption), {
278
+ color: theme.edInk3,
279
+ marginBottom: 2
280
+ }),
281
+ numInput: __spreadProps(__spreadValues({}, TYPE.label), {
282
+ minHeight: 36,
283
+ borderRadius: RADIUS.sm,
284
+ paddingHorizontal: SPACE.sm,
285
+ backgroundColor: theme.edRaised,
286
+ color: theme.edInk,
287
+ fontVariant: ["tabular-nums"]
288
+ }),
289
+ textInput: __spreadProps(__spreadValues({}, TYPE.body), {
290
+ fontSize: 14,
291
+ minHeight: 40,
292
+ borderRadius: RADIUS.md,
293
+ paddingHorizontal: SPACE.md,
294
+ paddingVertical: SPACE.sm,
295
+ backgroundColor: theme.edRaised,
296
+ color: theme.edInk
297
+ }),
298
+ textInputMulti: {
299
+ minHeight: 72,
300
+ textAlignVertical: "top"
301
+ },
302
+ chips: {
303
+ flexDirection: "row",
304
+ flexWrap: "wrap",
305
+ gap: SPACE.xs + 2
306
+ },
307
+ chip: {
308
+ minHeight: 34,
309
+ paddingHorizontal: SPACE.md,
310
+ borderRadius: RADIUS.pill,
311
+ alignItems: "center",
312
+ justifyContent: "center",
313
+ backgroundColor: theme.edRaised
314
+ },
315
+ chipOn: {
316
+ backgroundColor: theme.edInk
317
+ },
318
+ chipLabel: __spreadProps(__spreadValues({}, TYPE.label), {
319
+ color: theme.edInk
320
+ }),
321
+ chipLabelOn: {
322
+ color: theme.edOnInk
323
+ },
324
+ toggleRow: {
325
+ flexDirection: "row",
326
+ alignItems: "center",
327
+ justifyContent: "space-between",
328
+ minHeight: HIT
329
+ },
330
+ toggleLabel: __spreadProps(__spreadValues({}, TYPE.label), {
331
+ fontWeight: "500",
332
+ color: theme.edInk,
333
+ flex: 1
334
+ }),
335
+ apply: {
336
+ minHeight: HIT,
337
+ borderRadius: RADIUS.pill,
338
+ backgroundColor: theme.edInk,
339
+ alignItems: "center",
340
+ justifyContent: "center",
341
+ paddingHorizontal: SPACE.lg,
342
+ marginTop: SPACE.xs,
343
+ marginBottom: SPACE.sm
344
+ },
345
+ applyLabel: __spreadProps(__spreadValues({}, TYPE.label), {
346
+ color: theme.edOnInk
347
+ }),
348
+ applySoft: {
349
+ minHeight: 40,
350
+ borderRadius: RADIUS.pill,
351
+ backgroundColor: theme.edRaisedHi,
352
+ alignItems: "center",
353
+ justifyContent: "center",
354
+ paddingHorizontal: SPACE.lg,
355
+ marginBottom: SPACE.sm
356
+ },
357
+ applySoftLabel: __spreadProps(__spreadValues({}, TYPE.label), {
358
+ color: theme.edInk
359
+ }),
360
+ hscroll: {
361
+ flexGrow: 0,
362
+ marginBottom: SPACE.xs
363
+ },
364
+ pickRow: {
365
+ gap: SPACE.xs + 2
366
+ },
367
+ pickThumb: {
368
+ width: 52,
369
+ height: 52,
370
+ borderRadius: RADIUS.sm,
371
+ overflow: "hidden",
372
+ borderWidth: 2,
373
+ borderColor: "transparent",
374
+ backgroundColor: theme.edRaised
375
+ },
376
+ pickChip: {
377
+ minHeight: 36,
378
+ maxWidth: 160,
379
+ paddingHorizontal: SPACE.md,
380
+ borderRadius: RADIUS.pill,
381
+ borderWidth: 2,
382
+ borderColor: "transparent",
383
+ justifyContent: "center",
384
+ backgroundColor: theme.edRaised
385
+ },
386
+ pickOn: {
387
+ borderColor: theme.edAccent
388
+ },
389
+ pickImg: {
390
+ width: "100%",
391
+ height: "100%"
392
+ },
393
+ swatch: {
394
+ width: 30,
395
+ height: 30,
396
+ borderRadius: 15,
397
+ borderWidth: 2,
398
+ borderColor: theme.edLineHi
399
+ },
400
+ swatchOn: {
401
+ borderColor: theme.edAccent,
402
+ transform: [{
403
+ scale: 1.12
404
+ }]
405
+ }
406
+ }));export{ApplyButton,ChoiceRow,MediaUrlPicker,NumberField,SWATCHES,SliderRow,SwatchRow,TextField,ToggleRow,snapToStep};//# sourceMappingURL=editorControls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editorControls.js","sources":["../../../src/features/canvas/editorControls.tsx"],"sourcesContent":["/**\n * Small form controls the native media editors share (image, audio, set,\n * recorder): the phone twins of web `components/editor-controls` - SliderRow,\n * NumRow, SelectRow (as chips), CheckRow and ApplyBtn.\n *\n * The slider is a plain PanResponder track, so no native slider module is\n * needed in the OTA remote. Pressable comes from canvasUi (NativeWind drops\n * function styles on the react-native one).\n */\nimport React, { useMemo, useRef, useState } from 'react';\nimport {\n Image,\n PanResponder,\n ScrollView,\n StyleSheet,\n Switch,\n Text,\n TextInput,\n View,\n type LayoutChangeEvent,\n} from 'react-native';\nimport { useCanvasTheme, themedStyles, type CanvasPalette } from './canvasTheme';\nimport { Pressable, HIT, RADIUS, SPACE, TYPE, pressedStyle } from './canvasUi';\n\nconst clamp = (v: number, lo: number, hi: number) => Math.min(hi, Math.max(lo, v));\n\n/** Snap a raw value to the slider's step, inside its range. */\nexport function snapToStep(raw: number, min: number, max: number, step: number): number {\n const snapped = step > 0 ? Math.round((raw - min) / step) * step + min : raw;\n // Float noise from the step arithmetic (0.1 * 3) would print as 0.30000000000000004.\n return clamp(Number(snapped.toFixed(6)), min, max);\n}\n\nexport function SliderRow({\n label,\n value,\n min,\n max,\n step = 1,\n format,\n onChange,\n disabled,\n}: {\n label: string;\n value: number;\n min: number;\n max: number;\n step?: number;\n format?: (v: number) => string;\n onChange: (v: number) => void;\n disabled?: boolean;\n}) {\n const styles = makeStyles(useCanvasTheme());\n const width = useRef(1);\n const live = useRef({ min, max, step, onChange, disabled });\n live.current = { min, max, step, onChange, disabled };\n const fromX = (x: number) => {\n const { min: lo, max: hi, step: st } = live.current;\n return snapToStep(lo + (clamp(x, 0, width.current) / width.current) * (hi - lo), lo, hi, st);\n };\n const responder = useMemo(\n () =>\n PanResponder.create({\n onStartShouldSetPanResponder: () => !live.current.disabled,\n onMoveShouldSetPanResponder: () => !live.current.disabled,\n // A horizontal drag inside a vertical sheet must stay with the slider.\n onPanResponderTerminationRequest: () => false,\n onPanResponderGrant: (e) => live.current.onChange(fromX(e.nativeEvent.locationX)),\n onPanResponderMove: (e) => live.current.onChange(fromX(e.nativeEvent.locationX)),\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [],\n );\n const frac = max > min ? (clamp(value, min, max) - min) / (max - min) : 0;\n return (\n <View style={[styles.sliderRow, disabled && styles.off]}>\n <View style={styles.sliderHead}>\n <Text style={styles.label}>{label}</Text>\n <Text style={styles.value}>{format ? format(value) : String(Math.round(value * 100) / 100)}</Text>\n </View>\n <View\n style={styles.track}\n onLayout={(e: LayoutChangeEvent) => {\n width.current = Math.max(1, e.nativeEvent.layout.width);\n }}\n {...responder.panHandlers}\n accessibilityRole=\"adjustable\"\n accessibilityLabel={label}\n accessibilityValue={{ min, max, now: value }}\n accessibilityActions={[{ name: 'increment' }, { name: 'decrement' }]}\n onAccessibilityAction={(event) => {\n const dir = event.nativeEvent.actionName === 'increment' ? 1 : -1;\n onChange(snapToStep(value + dir * step, min, max, step));\n }}\n >\n <View style={styles.rail} pointerEvents=\"none\">\n <View style={[styles.fill, { width: `${frac * 100}%` }]} />\n </View>\n <View pointerEvents=\"none\" style={[styles.knob, { left: `${frac * 100}%` }]} />\n </View>\n </View>\n );\n}\n\n/** A number typed in; a half-typed field keeps the last good value instead of snapping to 0. */\nexport function NumberField({\n label,\n value,\n onChange,\n disabled,\n suffix,\n}: {\n label: string;\n value: number;\n onChange: (v: number) => void;\n disabled?: boolean;\n suffix?: string;\n}) {\n const theme = useCanvasTheme();\n const styles = makeStyles(theme);\n const [draft, setDraft] = useState<string | null>(null);\n const shown = draft ?? String(Number.isFinite(value) ? Math.round(value * 1000) / 1000 : 0);\n return (\n <View style={styles.numField}>\n <Text style={styles.numLabel}>\n {label}\n {suffix ? ` (${suffix})` : ''}\n </Text>\n <TextInput\n value={shown}\n editable={!disabled}\n keyboardType=\"numbers-and-punctuation\"\n onChangeText={(text) => {\n setDraft(text);\n const next = Number(text);\n if (text.trim() !== '' && Number.isFinite(next)) onChange(next);\n }}\n onBlur={() => setDraft(null)}\n style={[styles.numInput, disabled && styles.off]}\n placeholderTextColor={theme.edInk3}\n accessibilityLabel={label}\n />\n </View>\n );\n}\n\nexport function TextField({\n label,\n value,\n onChange,\n placeholder,\n multiline,\n}: {\n label?: string;\n value: string;\n onChange: (v: string) => void;\n placeholder?: string;\n multiline?: boolean;\n}) {\n const theme = useCanvasTheme();\n const styles = makeStyles(theme);\n return (\n <View style={styles.block}>\n {label ? <Text style={[styles.label, styles.blockLabel]}>{label}</Text> : null}\n <TextInput\n value={value}\n onChangeText={onChange}\n placeholder={placeholder}\n placeholderTextColor={theme.edInk3}\n multiline={multiline}\n autoCapitalize=\"none\"\n autoCorrect={false}\n style={[styles.textInput, multiline && styles.textInputMulti]}\n accessibilityLabel={label ?? placeholder}\n />\n </View>\n );\n}\n\n/** SelectRow as a wrap of chips - every choice visible, one tap. */\nexport function ChoiceRow<T extends string | number>({\n label,\n options,\n value,\n onChange,\n}: {\n label?: string;\n options: ReadonlyArray<{ value: T; label: string }>;\n value: T;\n // NoInfer: T comes from options and value, so a setter for a literal union is accepted.\n onChange: (v: NoInfer<T>) => void;\n}) {\n const styles = makeStyles(useCanvasTheme());\n return (\n <View style={styles.block}>\n {label ? <Text style={[styles.label, styles.blockLabel]}>{label}</Text> : null}\n <View style={styles.chips}>\n {options.map((o) => {\n const on = o.value === value;\n return (\n <Pressable\n key={String(o.value)}\n onPress={() => onChange(o.value)}\n accessibilityRole=\"button\"\n accessibilityState={{ selected: on }}\n style={({ pressed }) => [styles.chip, on && styles.chipOn, pressedStyle(pressed)]}\n >\n <Text style={[styles.chipLabel, on && styles.chipLabelOn]}>{o.label}</Text>\n </Pressable>\n );\n })}\n </View>\n </View>\n );\n}\n\nexport function ToggleRow({\n label,\n value,\n onChange,\n}: {\n label: string;\n value: boolean;\n onChange: (v: boolean) => void;\n}) {\n const theme = useCanvasTheme();\n const styles = makeStyles(theme);\n return (\n <View style={styles.toggleRow}>\n <Text style={styles.toggleLabel}>{label}</Text>\n <Switch\n value={value}\n onValueChange={onChange}\n trackColor={{ false: theme.edRaisedHi, true: theme.edAccent }}\n accessibilityLabel={label}\n />\n </View>\n );\n}\n\nexport function ApplyButton({\n label,\n onPress,\n disabled,\n tone = 'solid',\n}: {\n label: string;\n onPress: () => void;\n disabled?: boolean;\n tone?: 'solid' | 'soft';\n}) {\n const styles = makeStyles(useCanvasTheme());\n return (\n <Pressable\n onPress={onPress}\n disabled={disabled}\n accessibilityRole=\"button\"\n accessibilityState={{ disabled: Boolean(disabled) }}\n style={({ pressed }) => [\n tone === 'solid' ? styles.apply : styles.applySoft,\n disabled && styles.off,\n pressedStyle(pressed && !disabled),\n ]}\n >\n <Text style={tone === 'solid' ? styles.applyLabel : styles.applySoftLabel}>{label}</Text>\n </Pressable>\n );\n}\n\n/** A colour picked from a short swatch list (web ColorRow; phones have no native colour input). */\nexport function SwatchRow({\n label,\n colors,\n value,\n onChange,\n}: {\n label?: string;\n colors: readonly string[];\n value: string;\n onChange: (v: string) => void;\n}) {\n const styles = makeStyles(useCanvasTheme());\n return (\n <View style={styles.block}>\n {label ? <Text style={[styles.label, styles.blockLabel]}>{label}</Text> : null}\n <View style={styles.chips}>\n {colors.map((c) => (\n <Pressable\n key={c}\n onPress={() => onChange(c)}\n accessibilityRole=\"button\"\n accessibilityLabel={c}\n accessibilityState={{ selected: c.toLowerCase() === value.toLowerCase() }}\n style={[\n styles.swatch,\n { backgroundColor: c },\n c.toLowerCase() === value.toLowerCase() && styles.swatchOn,\n ]}\n />\n ))}\n </View>\n </View>\n );\n}\n\n/**\n * A media URL from the board (thumb strip) or pasted - the phone answer to the\n * web panels' \"paste a URL\" rows. Audio rows show their name instead of a thumb.\n */\nexport function MediaUrlPicker({\n label,\n items,\n value,\n onChange,\n placeholder = 'https://...',\n}: {\n label?: string;\n items: ReadonlyArray<{ id: string; src: string; label?: string; kind: 'image' | 'video' | 'audio' }>;\n value: string;\n onChange: (url: string) => void;\n placeholder?: string;\n}) {\n const theme = useCanvasTheme();\n const styles = makeStyles(theme);\n return (\n <View style={styles.block}>\n {label ? <Text style={[styles.label, styles.blockLabel]}>{label}</Text> : null}\n {items.length ? (\n <ScrollView\n horizontal\n style={styles.hscroll}\n showsHorizontalScrollIndicator={false}\n contentContainerStyle={styles.pickRow}\n keyboardShouldPersistTaps=\"handled\"\n >\n {items.map((item) => {\n const on = item.src === value;\n return (\n <Pressable\n key={item.id}\n onPress={() => onChange(on ? '' : item.src)}\n accessibilityRole=\"button\"\n accessibilityLabel={item.label ?? item.kind}\n accessibilityState={{ selected: on }}\n style={[\n item.kind === 'image' ? styles.pickThumb : styles.pickChip,\n on && styles.pickOn,\n ]}\n >\n {item.kind === 'image' ? (\n <Image source={{ uri: item.src }} style={styles.pickImg} />\n ) : (\n <Text style={styles.chipLabel} numberOfLines={1}>\n {item.label || (item.kind === 'audio' ? 'Audio' : 'Video')}\n </Text>\n )}\n </Pressable>\n );\n })}\n </ScrollView>\n ) : null}\n <TextInput\n value={value}\n onChangeText={onChange}\n placeholder={placeholder}\n placeholderTextColor={theme.edInk3}\n autoCapitalize=\"none\"\n autoCorrect={false}\n style={styles.textInput}\n accessibilityLabel={label ?? 'Media URL'}\n />\n </View>\n );\n}\n\nexport const SWATCHES = [\n '#ef4444',\n '#f97316',\n '#facc15',\n '#22c55e',\n '#3b82f6',\n '#a855f7',\n '#ffffff',\n '#000000',\n] as const;\n\nconst makeStyles = themedStyles((theme: CanvasPalette) =>\n StyleSheet.create({\n off: { opacity: 0.4 },\n block: { marginBottom: SPACE.sm },\n blockLabel: { marginBottom: SPACE.xs },\n label: { ...TYPE.caption, color: theme.edInk2 },\n value: { ...TYPE.caption, color: theme.edInk, fontVariant: ['tabular-nums'] },\n sliderRow: { marginBottom: SPACE.sm },\n sliderHead: { flexDirection: 'row', justifyContent: 'space-between', marginBottom: 2 },\n track: { height: 32, justifyContent: 'center' },\n rail: { height: 4, borderRadius: 2, backgroundColor: theme.edRaisedHi, overflow: 'hidden' },\n fill: { height: 4, backgroundColor: theme.edInk },\n knob: {\n position: 'absolute',\n width: 20,\n height: 20,\n marginLeft: -10,\n borderRadius: 10,\n backgroundColor: theme.edInk,\n borderWidth: 3,\n borderColor: theme.edPanel,\n },\n numField: { flex: 1, minWidth: 64 },\n numLabel: { ...TYPE.caption, color: theme.edInk3, marginBottom: 2 },\n numInput: {\n ...TYPE.label,\n minHeight: 36,\n borderRadius: RADIUS.sm,\n paddingHorizontal: SPACE.sm,\n backgroundColor: theme.edRaised,\n color: theme.edInk,\n fontVariant: ['tabular-nums'],\n },\n textInput: {\n ...TYPE.body,\n fontSize: 14,\n minHeight: 40,\n borderRadius: RADIUS.md,\n paddingHorizontal: SPACE.md,\n paddingVertical: SPACE.sm,\n backgroundColor: theme.edRaised,\n color: theme.edInk,\n },\n textInputMulti: { minHeight: 72, textAlignVertical: 'top' },\n chips: { flexDirection: 'row', flexWrap: 'wrap', gap: SPACE.xs + 2 },\n chip: {\n minHeight: 34,\n paddingHorizontal: SPACE.md,\n borderRadius: RADIUS.pill,\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: theme.edRaised,\n },\n chipOn: { backgroundColor: theme.edInk },\n chipLabel: { ...TYPE.label, color: theme.edInk },\n chipLabelOn: { color: theme.edOnInk },\n toggleRow: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n minHeight: HIT,\n },\n toggleLabel: { ...TYPE.label, fontWeight: '500', color: theme.edInk, flex: 1 },\n apply: {\n minHeight: HIT,\n borderRadius: RADIUS.pill,\n backgroundColor: theme.edInk,\n alignItems: 'center',\n justifyContent: 'center',\n paddingHorizontal: SPACE.lg,\n marginTop: SPACE.xs,\n marginBottom: SPACE.sm,\n },\n applyLabel: { ...TYPE.label, color: theme.edOnInk },\n applySoft: {\n minHeight: 40,\n borderRadius: RADIUS.pill,\n backgroundColor: theme.edRaisedHi,\n alignItems: 'center',\n justifyContent: 'center',\n paddingHorizontal: SPACE.lg,\n marginBottom: SPACE.sm,\n },\n applySoftLabel: { ...TYPE.label, color: theme.edInk },\n hscroll: { flexGrow: 0, marginBottom: SPACE.xs },\n pickRow: { gap: SPACE.xs + 2 },\n pickThumb: {\n width: 52,\n height: 52,\n borderRadius: RADIUS.sm,\n overflow: 'hidden',\n borderWidth: 2,\n borderColor: 'transparent',\n backgroundColor: theme.edRaised,\n },\n pickChip: {\n minHeight: 36,\n maxWidth: 160,\n paddingHorizontal: SPACE.md,\n borderRadius: RADIUS.pill,\n borderWidth: 2,\n borderColor: 'transparent',\n justifyContent: 'center',\n backgroundColor: theme.edRaised,\n },\n pickOn: { borderColor: theme.edAccent },\n pickImg: { width: '100%', height: '100%' },\n swatch: { width: 30, height: 30, borderRadius: 15, borderWidth: 2, borderColor: theme.edLineHi },\n swatchOn: { borderColor: theme.edAccent, transform: [{ scale: 1.12 }] },\n }),\n);\n"],"names":[],"mappings":"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"}
@@ -143,7 +143,7 @@ function normalizeModels(raw) {
143
143
  const list = Array.isArray(payload) ? payload : Array.isArray(nested.models) ? nested.models : Array.isArray(nested.data) ? nested.data : Array.isArray(record.models) ? record.models : [];
144
144
  return list.map((m) => {
145
145
  var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k;
146
- return __spreadValues(__spreadValues(__spreadProps(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues({
146
+ return __spreadValues(__spreadValues(__spreadProps(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues({
147
147
  id: String((_c = (_b = (_a = m.id) != null ? _a : m.modelId) != null ? _b : m.name) != null ? _c : ""),
148
148
  label: String((_h = (_g = (_f = (_e = (_d = m.displayName) != null ? _d : m.label) != null ? _e : m.title) != null ? _f : m.name) != null ? _g : m.id) != null ? _h : ""),
149
149
  provider: String((_j = (_i = m.provider) != null ? _i : m.source) != null ? _j : ""),
@@ -162,10 +162,12 @@ function normalizeModels(raw) {
162
162
  maxReferenceImages: Math.max(0, Math.round(m.maxReferenceImages))
163
163
  } : {}), typeof m.supportsAudio === "boolean" ? {
164
164
  supportsAudio: m.supportsAudio
165
+ } : {}), typeof m.isFast === "boolean" ? {
166
+ isFast: m.isFast
165
167
  } : {}), Array.isArray(m.aspectRatios) ? {
166
- aspectRatios: m.aspectRatios.filter((s) => typeof s === "string")
168
+ aspectRatios: m.aspectRatios.map(String).filter(Boolean)
167
169
  } : {}), Array.isArray(m.resolutions) ? {
168
- resolutions: m.resolutions.filter((s) => typeof s === "string")
170
+ resolutions: m.resolutions.map(String).filter(Boolean)
169
171
  } : {}), typeof m.type === "string" ? {
170
172
  type: m.type
171
173
  } : {}), {
@@ -1 +1 @@
1
- {"version":3,"file":"generationModels.js","sources":["../../../src/features/canvas/generationModels.ts"],"sourcesContent":["/**\n * Native twin of canvas-surface `hooks/useModelList` — LIST_MODELS shapes\n * and duration gating. An out-of-range `durationSeconds` comes back as a\n * blank video, not an error (web issue #305).\n */\n\nexport interface ModelInfo {\n id: string;\n label: string;\n provider: string;\n description: string;\n supportsImageInput?: boolean;\n supportsVideoInput?: boolean;\n supportsImageToVideo?: boolean;\n supportsEndFrame?: boolean;\n /** Whether the video model reads style/subject reference stills (`styleReferenceUrls`). */\n supportsReferenceImages?: boolean;\n /** How many reference stills it reads (Veo 3, Seedance 9); see `videoReferenceCap`. */\n maxReferenceImages?: number;\n supportsAudio?: boolean;\n isFast?: boolean;\n type?: string;\n supportedDurationsSeconds?: number[];\n defaultDurationSeconds?: number;\n maxDurationSeconds?: number;\n aspectRatios?: string[];\n resolutions?: string[];\n}\n\nconst VEO_ASPECTS = ['16:9', '9:16'];\nconst VEO_RESOLUTIONS = ['720p', '1080p'];\nconst VEO_DURATIONS = [4, 6, 8];\n\nexport const STATIC_IMAGE_MODELS: ModelInfo[] = [\n { id: 'gemini-3.1-flash-image-preview', label: 'Gemini Efficient', provider: 'google', description: '' },\n];\n\n/** Offline fallback — mirrors canvas-surface `hooks/useModelList` STATIC_VIDEO_MODELS. */\nexport const STATIC_VIDEO_MODELS: ModelInfo[] = [\n {\n id: 'veo-3.1-generate-preview',\n label: 'Veo 3.1 Preview',\n provider: 'google',\n description: '',\n supportedDurationsSeconds: VEO_DURATIONS,\n defaultDurationSeconds: 8,\n maxDurationSeconds: 8,\n supportsImageToVideo: true,\n supportsEndFrame: true,\n supportsAudio: true,\n supportsReferenceImages: true,\n maxReferenceImages: 3,\n aspectRatios: VEO_ASPECTS,\n resolutions: VEO_RESOLUTIONS,\n },\n {\n id: 'veo-3.1-fast-generate-preview',\n label: 'Veo 3.1 Fast Preview',\n provider: 'google',\n description: '',\n supportedDurationsSeconds: VEO_DURATIONS,\n defaultDurationSeconds: 8,\n maxDurationSeconds: 8,\n supportsImageToVideo: true,\n supportsEndFrame: true,\n isFast: true,\n supportsReferenceImages: true,\n maxReferenceImages: 3,\n aspectRatios: VEO_ASPECTS,\n resolutions: VEO_RESOLUTIONS,\n },\n {\n id: 'veo-3-generate-preview',\n label: 'Veo 3 Preview',\n provider: 'google',\n description: '',\n supportedDurationsSeconds: VEO_DURATIONS,\n defaultDurationSeconds: 8,\n maxDurationSeconds: 8,\n supportsImageToVideo: true,\n aspectRatios: VEO_ASPECTS,\n resolutions: VEO_RESOLUTIONS,\n },\n {\n id: 'veo-3-fast-generate-preview',\n label: 'Veo 3 Fast Preview',\n provider: 'google',\n description: '',\n supportedDurationsSeconds: VEO_DURATIONS,\n defaultDurationSeconds: 8,\n maxDurationSeconds: 8,\n supportsImageToVideo: true,\n isFast: true,\n aspectRatios: VEO_ASPECTS,\n resolutions: VEO_RESOLUTIONS,\n },\n {\n id: 'veo-2.0-generate-001',\n label: 'Veo 2.0',\n provider: 'google',\n description: '',\n supportedDurationsSeconds: [5, 6, 7, 8],\n defaultDurationSeconds: 8,\n maxDurationSeconds: 8,\n supportsImageToVideo: true,\n aspectRatios: VEO_ASPECTS,\n resolutions: VEO_RESOLUTIONS,\n },\n {\n id: 'bytedance/seedance-2.0',\n label: 'Seedance 2.0',\n provider: 'openrouter',\n description: '',\n supportedDurationsSeconds: [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],\n defaultDurationSeconds: 5,\n maxDurationSeconds: 15,\n supportsImageToVideo: true,\n supportsReferenceImages: true,\n maxReferenceImages: 9,\n },\n {\n id: 'bytedance/seedance-2.0-fast',\n label: 'Seedance 2.0 Fast',\n provider: 'openrouter',\n description: '',\n supportedDurationsSeconds: [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],\n defaultDurationSeconds: 5,\n maxDurationSeconds: 15,\n supportsImageToVideo: true,\n supportsReferenceImages: true,\n maxReferenceImages: 9,\n isFast: true,\n },\n];\n\nexport const AUDIO_PROMPT_TYPES = new Set(['tts', 'sfx', 'music']);\n\nfunction durationList(raw: unknown): number[] {\n if (!Array.isArray(raw)) return [];\n return raw.filter((s): s is number => typeof s === 'number' && Number.isFinite(s) && s > 0);\n}\n\nfunction duration(raw: unknown): number | undefined {\n return typeof raw === 'number' && Number.isFinite(raw) && raw > 0 ? raw : undefined;\n}\n\nexport function videoDurationOptions(model: ModelInfo | undefined): number[] {\n return model?.supportedDurationsSeconds ?? [];\n}\n\nexport function promptAudioModels(models: ModelInfo[]): ModelInfo[] {\n return models.filter((m) => !m.type || AUDIO_PROMPT_TYPES.has(m.type));\n}\n\nexport function normalizeModels(raw: unknown): ModelInfo[] {\n let payload: unknown = raw;\n if (typeof payload === 'string') {\n try {\n payload = JSON.parse(payload);\n } catch {\n return [];\n }\n }\n const record = payload && typeof payload === 'object' ? (payload as Record<string, unknown>) : {};\n const nested = record.data && typeof record.data === 'object' ? (record.data as Record<string, unknown>) : record;\n const list = Array.isArray(payload)\n ? payload\n : Array.isArray(nested.models)\n ? nested.models\n : Array.isArray(nested.data)\n ? nested.data\n : Array.isArray(record.models)\n ? record.models\n : [];\n return (list as Array<Record<string, unknown>>)\n .map((m) => ({\n id: String(m.id ?? m.modelId ?? m.name ?? ''),\n label: String(m.displayName ?? m.label ?? m.title ?? m.name ?? m.id ?? ''),\n provider: String(m.provider ?? m.source ?? ''),\n description: String(m.description ?? ''),\n ...(typeof m.supportsImageInput === 'boolean' ? { supportsImageInput: m.supportsImageInput } : {}),\n ...(typeof m.supportsVideoInput === 'boolean' ? { supportsVideoInput: m.supportsVideoInput } : {}),\n ...(typeof m.supportsImageToVideo === 'boolean' ? { supportsImageToVideo: m.supportsImageToVideo } : {}),\n ...(typeof m.supportsEndFrame === 'boolean' ? { supportsEndFrame: m.supportsEndFrame } : {}),\n ...(typeof m.supportsReferenceImages === 'boolean'\n ? { supportsReferenceImages: m.supportsReferenceImages }\n : {}),\n ...(typeof m.maxReferenceImages === 'number' && Number.isFinite(m.maxReferenceImages)\n ? { maxReferenceImages: Math.max(0, Math.round(m.maxReferenceImages)) }\n : {}),\n ...(typeof m.supportsAudio === 'boolean' ? { supportsAudio: m.supportsAudio } : {}),\n ...(Array.isArray(m.aspectRatios)\n ? { aspectRatios: m.aspectRatios.filter((s): s is string => typeof s === 'string') }\n : {}),\n ...(Array.isArray(m.resolutions)\n ? { resolutions: m.resolutions.filter((s): s is string => typeof s === 'string') }\n : {}),\n ...(typeof m.type === 'string' ? { type: m.type } : {}),\n supportedDurationsSeconds: durationList(m.supportedDurationsSeconds),\n ...(duration(m.defaultDurationSeconds) ? { defaultDurationSeconds: Number(m.defaultDurationSeconds) } : {}),\n ...(duration(m.maxDurationSeconds) ? { maxDurationSeconds: Number(m.maxDurationSeconds) } : {}),\n }))\n .filter((m) => Boolean(m.id));\n}\n\nexport function buildVideoGenerateParams(opts: {\n prompt: string;\n aspectRatio: string;\n model?: string;\n durationSeconds?: number;\n referenceImageUrl?: string;\n referenceVideoUrl?: string;\n /** End frame (web `referenceEndImageUrl`); only models with `supportsEndFrame` read it. */\n referenceEndImageUrl?: string;\n /** Style/subject stills, capped by `videoReferenceCap`. */\n styleReferenceUrls?: string[];\n resolution?: string;\n generateAudio?: boolean;\n negativePrompt?: string;\n}): Record<string, unknown> {\n return {\n prompt: opts.prompt,\n aspectRatio: opts.aspectRatio,\n ...(opts.model ? { model: opts.model } : {}),\n ...(opts.durationSeconds ? { durationSeconds: opts.durationSeconds } : {}),\n ...(opts.referenceImageUrl ? { referenceImageUrl: opts.referenceImageUrl } : {}),\n ...(opts.referenceVideoUrl ? { referenceVideoUrl: opts.referenceVideoUrl } : {}),\n ...(opts.referenceEndImageUrl ? { referenceEndImageUrl: opts.referenceEndImageUrl } : {}),\n ...(opts.styleReferenceUrls?.length ? { styleReferenceUrls: opts.styleReferenceUrls } : {}),\n ...(opts.resolution ? { resolution: opts.resolution } : {}),\n // Sent whenever set: a model that defaults to sound needs an explicit false.\n ...(opts.generateAudio !== undefined ? { generateAudio: opts.generateAudio } : {}),\n ...(opts.negativePrompt ? { negativePrompt: opts.negativePrompt } : {}),\n };\n}\n\n/** Smallest reference count any provider takes - the cap when the connector does not say (web). */\nexport const DEFAULT_VIDEO_REFERENCE_CAP = 3;\n\n/** How many reference stills the selected video model's slot holds (web `videoReferenceCap`). */\nexport function videoReferenceCap(models: readonly ModelInfo[], selectedId: string): number {\n const current = models.find((m) => m.id === selectedId);\n if (!current) return DEFAULT_VIDEO_REFERENCE_CAP;\n if (typeof current.maxReferenceImages === 'number') return current.maxReferenceImages;\n return current.supportsReferenceImages === false ? 0 : DEFAULT_VIDEO_REFERENCE_CAP;\n}\n\n/** With a still attached, the first model that reads images when the pick cannot (web `modelThatReadsImages`). */\nexport function modelThatReadsImages(models: readonly ModelInfo[], selectedId: string): string | null {\n const current = models.find((m) => m.id === selectedId);\n if (!current || current.supportsImageInput !== false) return null;\n return models.find((m) => m.supportsImageInput)?.id ?? null;\n}\n\n/** Twin of canvas-surface `videoGenOptions.generationCapabilities`. */\nexport function generationCapabilities(model: ModelInfo | undefined): {\n aspects: string[];\n resolutions: string[];\n canAudio: boolean;\n canStartFrame: boolean;\n canEndFrame: boolean;\n canVideoInput: boolean;\n} {\n const google = model?.provider === 'google';\n return {\n aspects: model?.aspectRatios?.length ? model.aspectRatios : ['16:9', '9:16'],\n resolutions: model?.resolutions ?? [],\n canAudio: Boolean(model?.supportsAudio),\n canStartFrame: model?.supportsImageToVideo ?? true,\n canEndFrame: Boolean(model?.supportsEndFrame),\n canVideoInput: Boolean(model?.supportsVideoInput),\n };\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"generationModels.js","sources":["../../../src/features/canvas/generationModels.ts"],"sourcesContent":["/**\n * Native twin of canvas-surface `hooks/useModelList` — LIST_MODELS shapes\n * and duration gating. An out-of-range `durationSeconds` comes back as a\n * blank video, not an error (web issue #305).\n */\n\nexport interface ModelInfo {\n id: string;\n label: string;\n provider: string;\n description: string;\n supportsImageInput?: boolean;\n supportsVideoInput?: boolean;\n supportsImageToVideo?: boolean;\n supportsEndFrame?: boolean;\n /** Whether the video model reads style/subject reference stills (`styleReferenceUrls`). */\n supportsReferenceImages?: boolean;\n /** How many reference stills it reads (Veo 3, Seedance 9); see `videoReferenceCap`. */\n maxReferenceImages?: number;\n supportsAudio?: boolean;\n isFast?: boolean;\n type?: string;\n supportedDurationsSeconds?: number[];\n defaultDurationSeconds?: number;\n maxDurationSeconds?: number;\n aspectRatios?: string[];\n resolutions?: string[];\n}\n\nconst VEO_ASPECTS = ['16:9', '9:16'];\nconst VEO_RESOLUTIONS = ['720p', '1080p'];\nconst VEO_DURATIONS = [4, 6, 8];\n\nexport const STATIC_IMAGE_MODELS: ModelInfo[] = [\n { id: 'gemini-3.1-flash-image-preview', label: 'Gemini Efficient', provider: 'google', description: '' },\n];\n\n/** Offline fallback — verbatim copy of canvas-surface `hooks/useModelList` STATIC_VIDEO_MODELS (the connector's VEO_MODEL_REGISTRY). */\nexport const STATIC_VIDEO_MODELS: ModelInfo[] = [\n {\n id: 'veo-3.1-generate-preview',\n label: 'Veo 3.1 Preview',\n provider: 'google',\n description: '',\n supportedDurationsSeconds: VEO_DURATIONS,\n defaultDurationSeconds: 8,\n maxDurationSeconds: 8,\n supportsImageToVideo: true,\n supportsEndFrame: true,\n supportsAudio: true,\n supportsReferenceImages: true,\n maxReferenceImages: 3,\n aspectRatios: VEO_ASPECTS,\n resolutions: VEO_RESOLUTIONS,\n },\n {\n id: 'veo-3.1-fast-generate-preview',\n label: 'Veo 3.1 Fast Preview',\n provider: 'google',\n description: '',\n supportedDurationsSeconds: VEO_DURATIONS,\n defaultDurationSeconds: 8,\n maxDurationSeconds: 8,\n supportsImageToVideo: true,\n supportsEndFrame: true,\n isFast: true,\n supportsReferenceImages: true,\n maxReferenceImages: 3,\n aspectRatios: VEO_ASPECTS,\n resolutions: VEO_RESOLUTIONS,\n },\n {\n id: 'veo-3-generate-preview',\n label: 'Veo 3 Preview',\n provider: 'google',\n description: '',\n supportedDurationsSeconds: VEO_DURATIONS,\n defaultDurationSeconds: 8,\n maxDurationSeconds: 8,\n supportsImageToVideo: true,\n aspectRatios: VEO_ASPECTS,\n resolutions: VEO_RESOLUTIONS,\n },\n {\n id: 'veo-3-fast-generate-preview',\n label: 'Veo 3 Fast Preview',\n provider: 'google',\n description: '',\n supportedDurationsSeconds: VEO_DURATIONS,\n defaultDurationSeconds: 8,\n maxDurationSeconds: 8,\n supportsImageToVideo: true,\n isFast: true,\n aspectRatios: VEO_ASPECTS,\n resolutions: VEO_RESOLUTIONS,\n },\n {\n id: 'veo-2.0-generate-001',\n label: 'Veo 2.0',\n provider: 'google',\n description: '',\n supportedDurationsSeconds: [5, 6, 7, 8],\n defaultDurationSeconds: 8,\n maxDurationSeconds: 8,\n supportsImageToVideo: true,\n aspectRatios: VEO_ASPECTS,\n resolutions: VEO_RESOLUTIONS,\n },\n {\n id: 'bytedance/seedance-2.0',\n label: 'Seedance 2.0',\n provider: 'openrouter',\n description: '',\n supportedDurationsSeconds: [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],\n defaultDurationSeconds: 5,\n maxDurationSeconds: 15,\n supportsImageToVideo: true,\n supportsReferenceImages: true,\n maxReferenceImages: 9,\n },\n {\n id: 'bytedance/seedance-2.0-fast',\n label: 'Seedance 2.0 Fast',\n provider: 'openrouter',\n description: '',\n supportedDurationsSeconds: [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],\n defaultDurationSeconds: 5,\n maxDurationSeconds: 15,\n supportsImageToVideo: true,\n supportsReferenceImages: true,\n maxReferenceImages: 9,\n isFast: true,\n },\n];\n\nexport const AUDIO_PROMPT_TYPES = new Set(['tts', 'sfx', 'music']);\n\nfunction durationList(raw: unknown): number[] {\n if (!Array.isArray(raw)) return [];\n return raw.filter((s): s is number => typeof s === 'number' && Number.isFinite(s) && s > 0);\n}\n\nfunction duration(raw: unknown): number | undefined {\n return typeof raw === 'number' && Number.isFinite(raw) && raw > 0 ? raw : undefined;\n}\n\nexport function videoDurationOptions(model: ModelInfo | undefined): number[] {\n return model?.supportedDurationsSeconds ?? [];\n}\n\nexport function promptAudioModels(models: ModelInfo[]): ModelInfo[] {\n return models.filter((m) => !m.type || AUDIO_PROMPT_TYPES.has(m.type));\n}\n\nexport function normalizeModels(raw: unknown): ModelInfo[] {\n let payload: unknown = raw;\n if (typeof payload === 'string') {\n try {\n payload = JSON.parse(payload);\n } catch {\n return [];\n }\n }\n const record = payload && typeof payload === 'object' ? (payload as Record<string, unknown>) : {};\n const nested = record.data && typeof record.data === 'object' ? (record.data as Record<string, unknown>) : record;\n const list = Array.isArray(payload)\n ? payload\n : Array.isArray(nested.models)\n ? nested.models\n : Array.isArray(nested.data)\n ? nested.data\n : Array.isArray(record.models)\n ? record.models\n : [];\n return (list as Array<Record<string, unknown>>)\n .map((m) => ({\n id: String(m.id ?? m.modelId ?? m.name ?? ''),\n label: String(m.displayName ?? m.label ?? m.title ?? m.name ?? m.id ?? ''),\n provider: String(m.provider ?? m.source ?? ''),\n description: String(m.description ?? ''),\n ...(typeof m.supportsImageInput === 'boolean' ? { supportsImageInput: m.supportsImageInput } : {}),\n ...(typeof m.supportsVideoInput === 'boolean' ? { supportsVideoInput: m.supportsVideoInput } : {}),\n ...(typeof m.supportsImageToVideo === 'boolean' ? { supportsImageToVideo: m.supportsImageToVideo } : {}),\n ...(typeof m.supportsEndFrame === 'boolean' ? { supportsEndFrame: m.supportsEndFrame } : {}),\n ...(typeof m.supportsReferenceImages === 'boolean'\n ? { supportsReferenceImages: m.supportsReferenceImages }\n : {}),\n ...(typeof m.maxReferenceImages === 'number' && Number.isFinite(m.maxReferenceImages)\n ? { maxReferenceImages: Math.max(0, Math.round(m.maxReferenceImages)) }\n : {}),\n ...(typeof m.supportsAudio === 'boolean' ? { supportsAudio: m.supportsAudio } : {}),\n ...(typeof m.isFast === 'boolean' ? { isFast: m.isFast } : {}),\n ...(Array.isArray(m.aspectRatios) ? { aspectRatios: m.aspectRatios.map(String).filter(Boolean) } : {}),\n ...(Array.isArray(m.resolutions) ? { resolutions: m.resolutions.map(String).filter(Boolean) } : {}),\n ...(typeof m.type === 'string' ? { type: m.type } : {}),\n supportedDurationsSeconds: durationList(m.supportedDurationsSeconds),\n ...(duration(m.defaultDurationSeconds) ? { defaultDurationSeconds: Number(m.defaultDurationSeconds) } : {}),\n ...(duration(m.maxDurationSeconds) ? { maxDurationSeconds: Number(m.maxDurationSeconds) } : {}),\n }))\n .filter((m) => Boolean(m.id));\n}\n\nexport function buildVideoGenerateParams(opts: {\n prompt: string;\n aspectRatio: string;\n model?: string;\n durationSeconds?: number;\n referenceImageUrl?: string;\n referenceVideoUrl?: string;\n /** End frame (web `referenceEndImageUrl`); only models with `supportsEndFrame` read it. */\n referenceEndImageUrl?: string;\n /** Style/subject stills, capped by `videoReferenceCap`. */\n styleReferenceUrls?: string[];\n resolution?: string;\n generateAudio?: boolean;\n negativePrompt?: string;\n}): Record<string, unknown> {\n return {\n prompt: opts.prompt,\n aspectRatio: opts.aspectRatio,\n ...(opts.model ? { model: opts.model } : {}),\n ...(opts.durationSeconds ? { durationSeconds: opts.durationSeconds } : {}),\n ...(opts.referenceImageUrl ? { referenceImageUrl: opts.referenceImageUrl } : {}),\n ...(opts.referenceVideoUrl ? { referenceVideoUrl: opts.referenceVideoUrl } : {}),\n ...(opts.referenceEndImageUrl ? { referenceEndImageUrl: opts.referenceEndImageUrl } : {}),\n ...(opts.styleReferenceUrls?.length ? { styleReferenceUrls: opts.styleReferenceUrls } : {}),\n ...(opts.resolution ? { resolution: opts.resolution } : {}),\n // Sent whenever set: a model that defaults to sound needs an explicit false.\n ...(opts.generateAudio !== undefined ? { generateAudio: opts.generateAudio } : {}),\n ...(opts.negativePrompt ? { negativePrompt: opts.negativePrompt } : {}),\n };\n}\n\n/** Smallest reference count any provider takes - the cap when the connector does not say (web). */\nexport const DEFAULT_VIDEO_REFERENCE_CAP = 3;\n\n/** How many reference stills the selected video model's slot holds (web `videoReferenceCap`). */\nexport function videoReferenceCap(models: readonly ModelInfo[], selectedId: string): number {\n const current = models.find((m) => m.id === selectedId);\n if (!current) return DEFAULT_VIDEO_REFERENCE_CAP;\n if (typeof current.maxReferenceImages === 'number') return current.maxReferenceImages;\n return current.supportsReferenceImages === false ? 0 : DEFAULT_VIDEO_REFERENCE_CAP;\n}\n\n/** With a still attached, the first model that reads images when the pick cannot (web `modelThatReadsImages`). */\nexport function modelThatReadsImages(models: readonly ModelInfo[], selectedId: string): string | null {\n const current = models.find((m) => m.id === selectedId);\n if (!current || current.supportsImageInput !== false) return null;\n return models.find((m) => m.supportsImageInput)?.id ?? null;\n}\n\n/** Twin of canvas-surface `videoGenOptions.generationCapabilities`. */\nexport function generationCapabilities(model: ModelInfo | undefined): {\n aspects: string[];\n resolutions: string[];\n canAudio: boolean;\n canStartFrame: boolean;\n canEndFrame: boolean;\n canVideoInput: boolean;\n} {\n const google = model?.provider === 'google';\n return {\n aspects: model?.aspectRatios?.length ? model.aspectRatios : ['16:9', '9:16'],\n resolutions: model?.resolutions ?? [],\n canAudio: Boolean(model?.supportsAudio),\n canStartFrame: model?.supportsImageToVideo ?? true,\n canEndFrame: Boolean(model?.supportsEndFrame),\n canVideoInput: Boolean(model?.supportsVideoInput),\n };\n}\n"],"names":[],"mappings":"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"}