@adminide-stack/yantra-mobile 12.0.69-alpha.9 → 12.0.70-alpha.0

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 (522) hide show
  1. package/lib/components/GatewayConnector/GatewayConnector.js +2 -2
  2. package/lib/components/GatewayConnector/GatewayConnector.js.map +1 -1
  3. package/lib/components/KeyboardComposerDock.js +8 -1
  4. package/lib/components/KeyboardComposerDock.js.map +1 -1
  5. package/lib/components/NavigationHeader/NavigationHeader.js +2 -2
  6. package/lib/components/NavigationHeader/NavigationHeader.js.map +1 -1
  7. package/lib/config/env-config.js +4 -0
  8. package/lib/config/env-config.js.map +1 -1
  9. package/lib/contexts/ChatLiveStreamContext.js +4 -1
  10. package/lib/contexts/ChatLiveStreamContext.js.map +1 -1
  11. package/lib/features/agent-chat/NativeAgentChat.js +2 -0
  12. package/lib/features/agent-chat/NativeAgentChat.js.map +1 -1
  13. package/lib/features/apps/AppsCatalog.js +2 -2
  14. package/lib/features/apps/AppsCatalog.js.map +1 -1
  15. package/lib/features/audio-input/MicErrorBoundary.js +2 -2
  16. package/lib/features/audio-input/MicErrorBoundary.js.map +1 -1
  17. package/lib/features/canvas/AudioEditorExperience.js +308 -0
  18. package/lib/features/canvas/AudioEditorExperience.js.map +1 -0
  19. package/lib/features/canvas/CanvasAgentChatPane.js +310 -0
  20. package/lib/features/canvas/CanvasAgentChatPane.js.map +1 -0
  21. package/lib/features/canvas/CanvasBoardsGrid.js +414 -0
  22. package/lib/features/canvas/CanvasBoardsGrid.js.map +1 -0
  23. package/lib/features/canvas/CanvasChatResultCard.js +113 -0
  24. package/lib/features/canvas/CanvasChatResultCard.js.map +1 -0
  25. package/lib/features/canvas/CanvasEditToolsPanel.js +179 -0
  26. package/lib/features/canvas/CanvasEditToolsPanel.js.map +1 -0
  27. package/lib/features/canvas/CanvasExperience.js +859 -0
  28. package/lib/features/canvas/CanvasExperience.js.map +1 -0
  29. package/lib/features/canvas/CanvasGeneratePanel.js +514 -0
  30. package/lib/features/canvas/CanvasGeneratePanel.js.map +1 -0
  31. package/lib/features/canvas/CanvasLibrarySheet.js +355 -0
  32. package/lib/features/canvas/CanvasLibrarySheet.js.map +1 -0
  33. package/lib/features/canvas/CanvasLooksPanel.js +184 -0
  34. package/lib/features/canvas/CanvasLooksPanel.js.map +1 -0
  35. package/lib/features/canvas/CanvasTasksPanel.js +138 -0
  36. package/lib/features/canvas/CanvasTasksPanel.js.map +1 -0
  37. package/lib/features/canvas/CanvasTemplatesPanel.js +226 -0
  38. package/lib/features/canvas/CanvasTemplatesPanel.js.map +1 -0
  39. package/lib/features/canvas/CanvasToolDock.js +423 -0
  40. package/lib/features/canvas/CanvasToolDock.js.map +1 -0
  41. package/lib/features/canvas/FrameExtractorExperience.js +242 -0
  42. package/lib/features/canvas/FrameExtractorExperience.js.map +1 -0
  43. package/lib/features/canvas/ImageEditorExperience.js +491 -0
  44. package/lib/features/canvas/ImageEditorExperience.js.map +1 -0
  45. package/lib/features/canvas/InfluencerStudioExperience.js +288 -0
  46. package/lib/features/canvas/InfluencerStudioExperience.js.map +1 -0
  47. package/lib/features/canvas/MoodboardExperience.js +205 -0
  48. package/lib/features/canvas/MoodboardExperience.js.map +1 -0
  49. package/lib/features/canvas/NativeCanvasViewer.js +929 -0
  50. package/lib/features/canvas/NativeCanvasViewer.js.map +1 -0
  51. package/lib/features/canvas/PromoContextFields.js +150 -0
  52. package/lib/features/canvas/PromoContextFields.js.map +1 -0
  53. package/lib/features/canvas/SetStudioExperience.js +323 -0
  54. package/lib/features/canvas/SetStudioExperience.js.map +1 -0
  55. package/lib/features/canvas/VideoClipsExperience.js +175 -0
  56. package/lib/features/canvas/VideoClipsExperience.js.map +1 -0
  57. package/lib/features/canvas/VideoEditExperience.js +824 -0
  58. package/lib/features/canvas/VideoEditExperience.js.map +1 -0
  59. package/lib/features/canvas/VideoEditorExperience.js +3050 -0
  60. package/lib/features/canvas/VideoEditorExperience.js.map +1 -0
  61. package/lib/features/canvas/VideoGeneratorExperience.js +415 -0
  62. package/lib/features/canvas/VideoGeneratorExperience.js.map +1 -0
  63. package/lib/features/canvas/aiEdit.js +53 -0
  64. package/lib/features/canvas/aiEdit.js.map +1 -0
  65. package/lib/features/canvas/canvasAgentChat.js +76 -0
  66. package/lib/features/canvas/canvasAgentChat.js.map +1 -0
  67. package/lib/features/canvas/canvasBoardsCatalog.js +59 -0
  68. package/lib/features/canvas/canvasBoardsCatalog.js.map +1 -0
  69. package/lib/features/canvas/canvasBoardsSnapshot.js +14 -1
  70. package/lib/features/canvas/canvasBoardsSnapshot.js.map +1 -1
  71. package/lib/features/canvas/canvasChatDisplay.js +38 -0
  72. package/lib/features/canvas/canvasChatDisplay.js.map +1 -0
  73. package/lib/features/canvas/canvasChatTemplates.js +219 -0
  74. package/lib/features/canvas/canvasChatTemplates.js.map +1 -0
  75. package/lib/features/canvas/canvasCore.js +138 -1
  76. package/lib/features/canvas/canvasCore.js.map +1 -1
  77. package/lib/features/canvas/canvasEditOps.js +224 -0
  78. package/lib/features/canvas/canvasEditOps.js.map +1 -0
  79. package/lib/features/canvas/canvasTasks.js +187 -0
  80. package/lib/features/canvas/canvasTasks.js.map +1 -0
  81. package/lib/features/canvas/designPromptTemplates.js +3084 -0
  82. package/lib/features/canvas/designPromptTemplates.js.map +1 -0
  83. package/lib/features/canvas/editTools.js +54 -0
  84. package/lib/features/canvas/editTools.js.map +1 -0
  85. package/lib/features/canvas/extendVideo.js +5 -0
  86. package/lib/features/canvas/extendVideo.js.map +1 -0
  87. package/lib/features/canvas/frameExtract.js +33 -0
  88. package/lib/features/canvas/frameExtract.js.map +1 -0
  89. package/lib/features/canvas/generationModels.js +201 -0
  90. package/lib/features/canvas/generationModels.js.map +1 -0
  91. package/lib/features/canvas/influencer/influencerPipeline.js +170 -0
  92. package/lib/features/canvas/influencer/influencerPipeline.js.map +1 -0
  93. package/lib/features/canvas/influencer/productReel.js +72 -0
  94. package/lib/features/canvas/influencer/productReel.js.map +1 -0
  95. package/lib/features/canvas/influencer/reelPlan.js +159 -0
  96. package/lib/features/canvas/influencer/reelPlan.js.map +1 -0
  97. package/lib/features/canvas/moodboardCore.js +13 -0
  98. package/lib/features/canvas/moodboardCore.js.map +1 -0
  99. package/lib/features/canvas/promoProjectImport.js +99 -0
  100. package/lib/features/canvas/promoProjectImport.js.map +1 -0
  101. package/lib/features/canvas/promoVideo.js +312 -0
  102. package/lib/features/canvas/promoVideo.js.map +1 -0
  103. package/lib/features/canvas/recorder/CameraRecorderExperience.js +109 -0
  104. package/lib/features/canvas/recorder/CameraRecorderExperience.js.map +1 -0
  105. package/lib/features/canvas/sessionIdentity.js +28 -1
  106. package/lib/features/canvas/sessionIdentity.js.map +1 -1
  107. package/lib/features/canvas/set/SetViewportWebView.js +133 -0
  108. package/lib/features/canvas/set/SetViewportWebView.js.map +1 -0
  109. package/lib/features/canvas/set/cameraPath.js +194 -0
  110. package/lib/features/canvas/set/cameraPath.js.map +1 -0
  111. package/lib/features/canvas/set/setProject.js +24 -0
  112. package/lib/features/canvas/set/setProject.js.map +1 -0
  113. package/lib/features/canvas/storageLibrary.js +184 -0
  114. package/lib/features/canvas/storageLibrary.js.map +1 -0
  115. package/lib/features/canvas/studioCatalog.js +129 -0
  116. package/lib/features/canvas/studioCatalog.js.map +1 -0
  117. package/lib/features/canvas/studioLooks.js +189 -0
  118. package/lib/features/canvas/studioLooks.js.map +1 -0
  119. package/lib/features/canvas/surfaceIndex.js +63 -1
  120. package/lib/features/canvas/surfaceIndex.js.map +1 -1
  121. package/lib/features/canvas/templateImport/invideoNative.js +221 -0
  122. package/lib/features/canvas/templateImport/invideoNative.js.map +1 -0
  123. package/lib/features/canvas/templateImport/loadTemplate.js +43 -0
  124. package/lib/features/canvas/templateImport/loadTemplate.js.map +1 -0
  125. package/lib/features/canvas/templateImport/renderConfig.js +93 -0
  126. package/lib/features/canvas/templateImport/renderConfig.js.map +1 -0
  127. package/lib/features/canvas/useStudioCatalogTemplates.js +134 -0
  128. package/lib/features/canvas/useStudioCatalogTemplates.js.map +1 -0
  129. package/lib/features/canvas/video3d.js +109 -0
  130. package/lib/features/canvas/video3d.js.map +1 -0
  131. package/lib/features/canvas/videoClips.js +42 -0
  132. package/lib/features/canvas/videoClips.js.map +1 -0
  133. package/lib/features/canvas/videoEditor/agent/AgentCutPane.js +120 -0
  134. package/lib/features/canvas/videoEditor/agent/AgentCutPane.js.map +1 -0
  135. package/lib/features/canvas/videoEditor/agent/agentLoop.js +69 -0
  136. package/lib/features/canvas/videoEditor/agent/agentLoop.js.map +1 -0
  137. package/lib/features/canvas/videoEditor/agent/brainClient.js +45 -0
  138. package/lib/features/canvas/videoEditor/agent/brainClient.js.map +1 -0
  139. package/lib/features/canvas/videoEditor/agent/cutTools.js +129 -0
  140. package/lib/features/canvas/videoEditor/agent/cutTools.js.map +1 -0
  141. package/lib/features/canvas/videoEditor/editorModel.js +346 -0
  142. package/lib/features/canvas/videoEditor/editorModel.js.map +1 -0
  143. package/lib/features/canvas/videoEditor/exportRenderer.js +214 -0
  144. package/lib/features/canvas/videoEditor/exportRenderer.js.map +1 -0
  145. package/lib/features/canvas/videoEditor/filters.js +41 -0
  146. package/lib/features/canvas/videoEditor/filters.js.map +1 -0
  147. package/lib/features/canvas/videoEditor/mediaActions.js +57 -0
  148. package/lib/features/canvas/videoEditor/mediaActions.js.map +1 -0
  149. package/lib/features/canvas/videoEditor/remoteMediaClient.js +129 -0
  150. package/lib/features/canvas/videoEditor/remoteMediaClient.js.map +1 -0
  151. package/lib/features/canvas/videoEditor/solidColorPng.js +115 -0
  152. package/lib/features/canvas/videoEditor/solidColorPng.js.map +1 -0
  153. package/lib/features/canvas/videoEditor/videoEditOps.js +191 -0
  154. package/lib/features/canvas/videoEditor/videoEditOps.js.map +1 -0
  155. package/lib/features/canvas/videoEditor/videoProjectsStore.js +82 -0
  156. package/lib/features/canvas/videoEditor/videoProjectsStore.js.map +1 -0
  157. package/lib/features/canvas/videoRenderer.js +8 -0
  158. package/lib/features/canvas/videoRenderer.js.map +1 -0
  159. package/lib/features/canvas/withRemoteSafeArea.js +2 -2
  160. package/lib/features/canvas/withRemoteSafeArea.js.map +1 -1
  161. package/lib/features/characters/characterStudioProps.js +14 -0
  162. package/lib/features/characters/characterStudioProps.js.map +1 -0
  163. package/lib/features/chat/ChatCodeBlock.js +7 -3
  164. package/lib/features/chat/ChatCodeBlock.js.map +1 -1
  165. package/lib/features/chat/ChatTranscript.js +7 -3
  166. package/lib/features/chat/ChatTranscript.js.map +1 -1
  167. package/lib/features/chat/ChatWidgetCard.js +13 -0
  168. package/lib/features/chat/ChatWidgetCard.js.map +1 -0
  169. package/lib/features/chat/ConnectorConnectCard.js +166 -0
  170. package/lib/features/chat/ConnectorConnectCard.js.map +1 -0
  171. package/lib/features/chat/ConnectorConnectPrompt.js +272 -0
  172. package/lib/features/chat/ConnectorConnectPrompt.js.map +1 -0
  173. package/lib/features/chat/MessageActionBar.js.map +1 -1
  174. package/lib/features/chat/QueuedFollowUps.js +71 -0
  175. package/lib/features/chat/QueuedFollowUps.js.map +1 -0
  176. package/lib/features/chat/chatWidgets.js +37 -0
  177. package/lib/features/chat/chatWidgets.js.map +1 -0
  178. package/lib/features/chat/connectorConnect.js +207 -0
  179. package/lib/features/chat/connectorConnect.js.map +1 -0
  180. package/lib/features/chat/connectorConnectHandbacks.js +55 -0
  181. package/lib/features/chat/connectorConnectHandbacks.js.map +1 -0
  182. package/lib/features/design/DesignEditorExperience.js +643 -0
  183. package/lib/features/design/DesignEditorExperience.js.map +1 -0
  184. package/lib/features/design/DesignExperience.js +444 -0
  185. package/lib/features/design/DesignExperience.js.map +1 -0
  186. package/lib/features/design/designCore.js +298 -0
  187. package/lib/features/design/designCore.js.map +1 -0
  188. package/lib/features/design/designIndex.js +150 -0
  189. package/lib/features/design/designIndex.js.map +1 -0
  190. package/lib/features/design/exportDesign.js +133 -0
  191. package/lib/features/design/exportDesign.js.map +1 -0
  192. package/lib/features/job-search/ApplicationsPanel.js +907 -0
  193. package/lib/features/job-search/ApplicationsPanel.js.map +1 -0
  194. package/lib/features/job-search/ContactsPanel.js +627 -0
  195. package/lib/features/job-search/ContactsPanel.js.map +1 -0
  196. package/lib/features/job-search/InsightsPanel.js +299 -0
  197. package/lib/features/job-search/InsightsPanel.js.map +1 -0
  198. package/lib/features/job-search/InterviewPanel.js +637 -0
  199. package/lib/features/job-search/InterviewPanel.js.map +1 -0
  200. package/lib/features/job-search/JdPastePrompt.js +130 -0
  201. package/lib/features/job-search/JdPastePrompt.js.map +1 -0
  202. package/lib/features/job-search/JobCard.js +199 -0
  203. package/lib/features/job-search/JobCard.js.map +1 -0
  204. package/lib/features/job-search/JobDetailSheet.js +255 -0
  205. package/lib/features/job-search/JobDetailSheet.js.map +1 -0
  206. package/lib/features/job-search/JobSearchAgentChatPane.js +377 -0
  207. package/lib/features/job-search/JobSearchAgentChatPane.js.map +1 -0
  208. package/lib/features/job-search/JobSearchExperience.js +1324 -0
  209. package/lib/features/job-search/JobSearchExperience.js.map +1 -0
  210. package/lib/features/job-search/JobSearchLocationField.js +231 -0
  211. package/lib/features/job-search/JobSearchLocationField.js.map +1 -0
  212. package/lib/features/job-search/ProfilePanel.js +679 -0
  213. package/lib/features/job-search/ProfilePanel.js.map +1 -0
  214. package/lib/features/job-search/RepliesPanel.js +344 -0
  215. package/lib/features/job-search/RepliesPanel.js.map +1 -0
  216. package/lib/features/job-search/SavedPanel.js +297 -0
  217. package/lib/features/job-search/SavedPanel.js.map +1 -0
  218. package/lib/features/job-search/chat/widgetContent.js +29 -0
  219. package/lib/features/job-search/chat/widgetContent.js.map +1 -0
  220. package/lib/features/job-search/cvText.js +91 -0
  221. package/lib/features/job-search/cvText.js.map +1 -0
  222. package/lib/features/job-search/jobAgentSwipe.js +7 -0
  223. package/lib/features/job-search/jobAgentSwipe.js.map +1 -0
  224. package/lib/features/job-search/jobSearchClient.js +184 -0
  225. package/lib/features/job-search/jobSearchClient.js.map +1 -0
  226. package/lib/features/job-search/jobSearchExec.js +14 -0
  227. package/lib/features/job-search/jobSearchExec.js.map +1 -0
  228. package/lib/features/job-search/jobSearchRuntime.js +50 -0
  229. package/lib/features/job-search/jobSearchRuntime.js.map +1 -0
  230. package/lib/features/job-search/jobSearchTheme.js +44 -0
  231. package/lib/features/job-search/jobSearchTheme.js.map +1 -0
  232. package/lib/features/job-search/savedJobs.js +85 -0
  233. package/lib/features/job-search/savedJobs.js.map +1 -0
  234. package/lib/features/job-search/searchHistory.js +117 -0
  235. package/lib/features/job-search/searchHistory.js.map +1 -0
  236. package/lib/features/job-search/types.js +36 -0
  237. package/lib/features/job-search/types.js.map +1 -0
  238. package/lib/features/job-search/useJobSearchSession.js +558 -0
  239. package/lib/features/job-search/useJobSearchSession.js.map +1 -0
  240. package/lib/features/messaging/ChatComponents.js +529 -0
  241. package/lib/features/messaging/ChatComponents.js.map +1 -0
  242. package/lib/features/messaging/ChatInviteDeepLink.js +116 -0
  243. package/lib/features/messaging/ChatInviteDeepLink.js.map +1 -0
  244. package/lib/features/messaging/ContactsScreen.js +288 -0
  245. package/lib/features/messaging/ContactsScreen.js.map +1 -0
  246. package/lib/features/messaging/ConversationListScreen.js +147 -0
  247. package/lib/features/messaging/ConversationListScreen.js.map +1 -0
  248. package/lib/features/messaging/MessageActions.js +290 -0
  249. package/lib/features/messaging/MessageActions.js.map +1 -0
  250. package/lib/features/messaging/NativeChatExperience.js +189 -0
  251. package/lib/features/messaging/NativeChatExperience.js.map +1 -0
  252. package/lib/features/messaging/RegistrationScreen.js +11 -14
  253. package/lib/features/messaging/RegistrationScreen.js.map +1 -1
  254. package/lib/features/messaging/ThreadScreen.js +215 -0
  255. package/lib/features/messaging/ThreadScreen.js.map +1 -0
  256. package/lib/features/messaging/chatInviteLink.js +52 -0
  257. package/lib/features/messaging/chatInviteLink.js.map +1 -0
  258. package/lib/features/messaging/chatModel.js +278 -0
  259. package/lib/features/messaging/chatModel.js.map +1 -0
  260. package/lib/features/messaging/chatOperations.js +106 -1
  261. package/lib/features/messaging/chatOperations.js.map +1 -1
  262. package/lib/features/messaging/emojiCatalog.js +60 -0
  263. package/lib/features/messaging/emojiCatalog.js.map +1 -0
  264. package/lib/features/messaging/emojiKeywords.js +1592 -0
  265. package/lib/features/messaging/emojiKeywords.js.map +1 -0
  266. package/lib/features/messaging/nativeChatChannelQuery.js +27 -0
  267. package/lib/features/messaging/nativeChatChannelQuery.js.map +1 -0
  268. package/lib/features/messaging/phoneNumbers.js +52 -1
  269. package/lib/features/messaging/phoneNumbers.js.map +1 -1
  270. package/lib/features/messaging/sha256.js +68 -0
  271. package/lib/features/messaging/sha256.js.map +1 -0
  272. package/lib/features/messaging/useChatData.js +421 -0
  273. package/lib/features/messaging/useChatData.js.map +1 -0
  274. package/lib/features/messaging/useContactMatches.js +191 -0
  275. package/lib/features/messaging/useContactMatches.js.map +1 -0
  276. package/lib/features/messaging/usePhoneVerification.js +12 -12
  277. package/lib/features/messaging/usePhoneVerification.js.map +1 -1
  278. package/lib/features/messaging/yantraChatOrg.js +8 -3
  279. package/lib/features/messaging/yantraChatOrg.js.map +1 -1
  280. package/lib/features/resume/AnnotateModal.js +100 -0
  281. package/lib/features/resume/AnnotateModal.js.map +1 -0
  282. package/lib/features/resume/AnnotationBar.js +69 -0
  283. package/lib/features/resume/AnnotationBar.js.map +1 -0
  284. package/lib/features/resume/ExportSheet.js +105 -0
  285. package/lib/features/resume/ExportSheet.js.map +1 -0
  286. package/lib/features/resume/ResumeAgentChatPane.js +95 -0
  287. package/lib/features/resume/ResumeAgentChatPane.js.map +1 -0
  288. package/lib/features/resume/ResumeEditor.js +676 -0
  289. package/lib/features/resume/ResumeEditor.js.map +1 -0
  290. package/lib/features/resume/ResumeExperience.js +235 -0
  291. package/lib/features/resume/ResumeExperience.js.map +1 -0
  292. package/lib/features/resume/ResumeListPanel.js +262 -0
  293. package/lib/features/resume/ResumeListPanel.js.map +1 -0
  294. package/lib/features/resume/ResumeToolbar.js +236 -0
  295. package/lib/features/resume/ResumeToolbar.js.map +1 -0
  296. package/lib/features/resume/annotations.js +17 -0
  297. package/lib/features/resume/annotations.js.map +1 -0
  298. package/lib/features/resume/documentCss.js +52 -0
  299. package/lib/features/resume/documentCss.js.map +1 -0
  300. package/lib/features/resume/draft.js +89 -0
  301. package/lib/features/resume/draft.js.map +1 -0
  302. package/lib/features/resume/exportResume.js +43 -0
  303. package/lib/features/resume/exportResume.js.map +1 -0
  304. package/lib/features/resume/pickResumePhoto.js +22 -0
  305. package/lib/features/resume/pickResumePhoto.js.map +1 -0
  306. package/lib/features/resume/renderResume.js +121 -0
  307. package/lib/features/resume/renderResume.js.map +1 -0
  308. package/lib/features/resume/resumeClient.js +69 -0
  309. package/lib/features/resume/resumeClient.js.map +1 -0
  310. package/lib/features/resume/resumeExec.js +14 -0
  311. package/lib/features/resume/resumeExec.js.map +1 -0
  312. package/lib/features/resume/resumeIndex.js +244 -0
  313. package/lib/features/resume/resumeIndex.js.map +1 -0
  314. package/lib/features/resume/resumeRuntime.js +50 -0
  315. package/lib/features/resume/resumeRuntime.js.map +1 -0
  316. package/lib/features/resume/resumeTheme.js +34 -0
  317. package/lib/features/resume/resumeTheme.js.map +1 -0
  318. package/lib/features/resume/resumeToolbox.js +49 -0
  319. package/lib/features/resume/resumeToolbox.js.map +1 -0
  320. package/lib/features/resume/templates.js +90 -0
  321. package/lib/features/resume/templates.js.map +1 -0
  322. package/lib/features/resume/types.js +10 -0
  323. package/lib/features/resume/types.js.map +1 -0
  324. package/lib/features/resume/useResumeSession.js +183 -0
  325. package/lib/features/resume/useResumeSession.js.map +1 -0
  326. package/lib/features/shopping/DealsPanel.js +254 -0
  327. package/lib/features/shopping/DealsPanel.js.map +1 -0
  328. package/lib/features/shopping/HistoryPanel.js +147 -0
  329. package/lib/features/shopping/HistoryPanel.js.map +1 -0
  330. package/lib/features/shopping/OrdersPanel.js +157 -0
  331. package/lib/features/shopping/OrdersPanel.js.map +1 -0
  332. package/lib/features/shopping/ProductCard.js +326 -0
  333. package/lib/features/shopping/ProductCard.js.map +1 -0
  334. package/lib/features/shopping/ProductDetailSheet.js +313 -0
  335. package/lib/features/shopping/ProductDetailSheet.js.map +1 -0
  336. package/lib/features/shopping/ProductFilterBar.js +153 -0
  337. package/lib/features/shopping/ProductFilterBar.js.map +1 -0
  338. package/lib/features/shopping/ProductPhoto.js +27 -0
  339. package/lib/features/shopping/ProductPhoto.js.map +1 -0
  340. package/lib/features/shopping/SavedPanel.js +139 -0
  341. package/lib/features/shopping/SavedPanel.js.map +1 -0
  342. package/lib/features/shopping/ShoppingAgentChatPane.js +436 -0
  343. package/lib/features/shopping/ShoppingAgentChatPane.js.map +1 -0
  344. package/lib/features/shopping/ShoppingExperience.js +888 -0
  345. package/lib/features/shopping/ShoppingExperience.js.map +1 -0
  346. package/lib/features/shopping/TrendingSections.js +199 -0
  347. package/lib/features/shopping/TrendingSections.js.map +1 -0
  348. package/lib/features/shopping/WatchlistPanel.js +148 -0
  349. package/lib/features/shopping/WatchlistPanel.js.map +1 -0
  350. package/lib/features/shopping/catalog.js +238 -0
  351. package/lib/features/shopping/catalog.js.map +1 -0
  352. package/lib/features/shopping/chat/ShoppingChatResultCard.js +175 -0
  353. package/lib/features/shopping/chat/ShoppingChatResultCard.js.map +1 -0
  354. package/lib/features/shopping/chat/streamAssistantReply.js +34 -0
  355. package/lib/features/shopping/chat/streamAssistantReply.js.map +1 -0
  356. package/lib/features/shopping/chat/widgetContent.js +233 -0
  357. package/lib/features/shopping/chat/widgetContent.js.map +1 -0
  358. package/lib/features/shopping/hooks/useTrendingProducts.js +162 -0
  359. package/lib/features/shopping/hooks/useTrendingProducts.js.map +1 -0
  360. package/lib/features/shopping/productImage.js +42 -0
  361. package/lib/features/shopping/productImage.js.map +1 -0
  362. package/lib/features/shopping/savedProducts.js +84 -0
  363. package/lib/features/shopping/savedProducts.js.map +1 -0
  364. package/lib/features/shopping/services/catalogActions.js +166 -0
  365. package/lib/features/shopping/services/catalogActions.js.map +1 -0
  366. package/lib/features/shopping/services/parsePriceCheckIntent.js +58 -0
  367. package/lib/features/shopping/services/parsePriceCheckIntent.js.map +1 -0
  368. package/lib/features/shopping/services/parseShoppingIntent.js +67 -0
  369. package/lib/features/shopping/services/parseShoppingIntent.js.map +1 -0
  370. package/lib/features/shopping/services/productAvailability.js +25 -0
  371. package/lib/features/shopping/services/productAvailability.js.map +1 -0
  372. package/lib/features/shopping/services/productFilters.js +72 -0
  373. package/lib/features/shopping/services/productFilters.js.map +1 -0
  374. package/lib/features/shopping/services/retailerUrl.js +75 -0
  375. package/lib/features/shopping/services/retailerUrl.js.map +1 -0
  376. package/lib/features/shopping/services/shoppingChatReply.js +46 -0
  377. package/lib/features/shopping/services/shoppingChatReply.js.map +1 -0
  378. package/lib/features/shopping/services/shoppingProductSearch.js +336 -0
  379. package/lib/features/shopping/services/shoppingProductSearch.js.map +1 -0
  380. package/lib/features/shopping/services/shoppingSearchConnectorClient.js +41 -0
  381. package/lib/features/shopping/services/shoppingSearchConnectorClient.js.map +1 -0
  382. package/lib/features/shopping/shopAgentSwipe.js +7 -0
  383. package/lib/features/shopping/shopAgentSwipe.js.map +1 -0
  384. package/lib/features/shopping/shoppingCart.js +116 -0
  385. package/lib/features/shopping/shoppingCart.js.map +1 -0
  386. package/lib/features/shopping/shoppingExec.js +14 -0
  387. package/lib/features/shopping/shoppingExec.js.map +1 -0
  388. package/lib/features/shopping/shoppingHistoryStore.js +176 -0
  389. package/lib/features/shopping/shoppingHistoryStore.js.map +1 -0
  390. package/lib/features/shopping/shoppingRuntime.js +63 -0
  391. package/lib/features/shopping/shoppingRuntime.js.map +1 -0
  392. package/lib/features/shopping/timeAgo.js +14 -0
  393. package/lib/features/shopping/timeAgo.js.map +1 -0
  394. package/lib/features/shopping/useShoppingSearch.js +262 -0
  395. package/lib/features/shopping/useShoppingSearch.js.map +1 -0
  396. package/lib/features/travel/BookHeaderGlow.js +48 -0
  397. package/lib/features/travel/BookHeaderGlow.js.map +1 -0
  398. package/lib/features/travel/BookingsPanel.js +29 -0
  399. package/lib/features/travel/BookingsPanel.js.map +1 -0
  400. package/lib/features/travel/DiscoverPanel.js +155 -0
  401. package/lib/features/travel/DiscoverPanel.js.map +1 -0
  402. package/lib/features/travel/FlightCompareBar.js +86 -0
  403. package/lib/features/travel/FlightCompareBar.js.map +1 -0
  404. package/lib/features/travel/FlightDealsBoard.js +100 -0
  405. package/lib/features/travel/FlightDealsBoard.js.map +1 -0
  406. package/lib/features/travel/HistoryPanel.js +82 -0
  407. package/lib/features/travel/HistoryPanel.js.map +1 -0
  408. package/lib/features/travel/PopularDestinations.js +144 -0
  409. package/lib/features/travel/PopularDestinations.js.map +1 -0
  410. package/lib/features/travel/SavedPanel.js +27 -0
  411. package/lib/features/travel/SavedPanel.js.map +1 -0
  412. package/lib/features/travel/TravelAgentChatPane.js +303 -0
  413. package/lib/features/travel/TravelAgentChatPane.js.map +1 -0
  414. package/lib/features/travel/TravelBookHero.js +425 -0
  415. package/lib/features/travel/TravelBookHero.js.map +1 -0
  416. package/lib/features/travel/TravelDatesField.js +234 -0
  417. package/lib/features/travel/TravelDatesField.js.map +1 -0
  418. package/lib/features/travel/TravelDetailSheet.js +106 -0
  419. package/lib/features/travel/TravelDetailSheet.js.map +1 -0
  420. package/lib/features/travel/TravelExperience.js +624 -0
  421. package/lib/features/travel/TravelExperience.js.map +1 -0
  422. package/lib/features/travel/TravelGuestsField.js +85 -0
  423. package/lib/features/travel/TravelGuestsField.js.map +1 -0
  424. package/lib/features/travel/TravelLanding.js +318 -0
  425. package/lib/features/travel/TravelLanding.js.map +1 -0
  426. package/lib/features/travel/TravelLocationField.js +179 -0
  427. package/lib/features/travel/TravelLocationField.js.map +1 -0
  428. package/lib/features/travel/TravelPropertyCard.js +266 -0
  429. package/lib/features/travel/TravelPropertyCard.js.map +1 -0
  430. package/lib/features/travel/TravelPropertyPhoto.js +22 -0
  431. package/lib/features/travel/TravelPropertyPhoto.js.map +1 -0
  432. package/lib/features/travel/TravelRailFlyout.js +79 -0
  433. package/lib/features/travel/TravelRailFlyout.js.map +1 -0
  434. package/lib/features/travel/TravelResultsMap.js +126 -0
  435. package/lib/features/travel/TravelResultsMap.js.map +1 -0
  436. package/lib/features/travel/WorkspacePanel.js +148 -0
  437. package/lib/features/travel/WorkspacePanel.js.map +1 -0
  438. package/lib/features/travel/appNav.js +244 -0
  439. package/lib/features/travel/appNav.js.map +1 -0
  440. package/lib/features/travel/calendarDays.js +50 -0
  441. package/lib/features/travel/calendarDays.js.map +1 -0
  442. package/lib/features/travel/catalog.js +72 -0
  443. package/lib/features/travel/catalog.js.map +1 -0
  444. package/lib/features/travel/chat/TravelChatResultCard.js +107 -0
  445. package/lib/features/travel/chat/TravelChatResultCard.js.map +1 -0
  446. package/lib/features/travel/chat/widgetContent.js +107 -0
  447. package/lib/features/travel/chat/widgetContent.js.map +1 -0
  448. package/lib/features/travel/flightDeals.js +65 -0
  449. package/lib/features/travel/flightDeals.js.map +1 -0
  450. package/lib/features/travel/mapCoordinates.js +36 -0
  451. package/lib/features/travel/mapCoordinates.js.map +1 -0
  452. package/lib/features/travel/parseTravelIntent.js +303 -0
  453. package/lib/features/travel/parseTravelIntent.js.map +1 -0
  454. package/lib/features/travel/savedStays.js +66 -0
  455. package/lib/features/travel/savedStays.js.map +1 -0
  456. package/lib/features/travel/services/flightDealsBoard.js +111 -0
  457. package/lib/features/travel/services/flightDealsBoard.js.map +1 -0
  458. package/lib/features/travel/services/flightSearchConnectorClient.js +42 -0
  459. package/lib/features/travel/services/flightSearchConnectorClient.js.map +1 -0
  460. package/lib/features/travel/services/geocodeLocation.js +79 -0
  461. package/lib/features/travel/services/geocodeLocation.js.map +1 -0
  462. package/lib/features/travel/services/placePredictions.js +113 -0
  463. package/lib/features/travel/services/placePredictions.js.map +1 -0
  464. package/lib/features/travel/services/resolveOriginCity.js +27 -0
  465. package/lib/features/travel/services/resolveOriginCity.js.map +1 -0
  466. package/lib/features/travel/services/resortifiConnectorClient.js +76 -0
  467. package/lib/features/travel/services/resortifiConnectorClient.js.map +1 -0
  468. package/lib/features/travel/services/travelFlightSearch.js +289 -0
  469. package/lib/features/travel/services/travelFlightSearch.js.map +1 -0
  470. package/lib/features/travel/services/travelPropertySearch.js +377 -0
  471. package/lib/features/travel/services/travelPropertySearch.js.map +1 -0
  472. package/lib/features/travel/travelAgentSwipe.js +7 -0
  473. package/lib/features/travel/travelAgentSwipe.js.map +1 -0
  474. package/lib/features/travel/travelExec.js +14 -0
  475. package/lib/features/travel/travelExec.js.map +1 -0
  476. package/lib/features/travel/travelHistoryStore.js +108 -0
  477. package/lib/features/travel/travelHistoryStore.js.map +1 -0
  478. package/lib/features/travel/travelRuntime.js +62 -0
  479. package/lib/features/travel/travelRuntime.js.map +1 -0
  480. package/lib/features/travel/types.js +9 -0
  481. package/lib/features/travel/types.js.map +1 -0
  482. package/lib/features/travel/useTravelSearch.js +330 -0
  483. package/lib/features/travel/useTravelSearch.js.map +1 -0
  484. package/lib/features/travel/workspaceContent.js +548 -0
  485. package/lib/features/travel/workspaceContent.js.map +1 -0
  486. package/lib/hooks/useCdecliChannel.js +128 -6
  487. package/lib/hooks/useCdecliChannel.js.map +1 -1
  488. package/lib/hooks/useChatApi.js +4 -2
  489. package/lib/hooks/useChatApi.js.map +1 -1
  490. package/lib/hooks/useChatStream.js +77 -63
  491. package/lib/hooks/useChatStream.js.map +1 -1
  492. package/lib/hooks/useHostConnectorCard.js +24 -0
  493. package/lib/hooks/useHostConnectorCard.js.map +1 -0
  494. package/lib/hooks/useObtainSystemToken.js +23 -5
  495. package/lib/hooks/useObtainSystemToken.js.map +1 -1
  496. package/lib/hooks/webViewRetentionPolicy.js +1 -0
  497. package/lib/hooks/webViewRetentionPolicy.js.map +1 -1
  498. package/lib/index.js +1 -1
  499. package/lib/index.js.map +1 -1
  500. package/lib/screens/Chat/index.js +51 -22
  501. package/lib/screens/Chat/index.js.map +1 -1
  502. package/lib/screens/ChatNative/index.js +13 -2
  503. package/lib/screens/ChatNative/index.js.map +1 -1
  504. package/lib/screens/Home/HomeScreen.js +3 -3
  505. package/lib/screens/Home/HomeScreen.js.map +1 -1
  506. package/lib/screens/Home/components/ChatHistoryLanding.js +32 -32
  507. package/lib/screens/Home/components/ChatHistoryLanding.js.map +1 -1
  508. package/lib/screens/JobSearchNative/useJobSearchHostChat.js +12 -6
  509. package/lib/screens/JobSearchNative/useJobSearchHostChat.js.map +1 -1
  510. package/lib/screens/ResumeNative/useResumeHostChat.js +12 -6
  511. package/lib/screens/ResumeNative/useResumeHostChat.js.map +1 -1
  512. package/lib/screens/ShoppingNative/useShoppingHostChat.js +12 -6
  513. package/lib/screens/ShoppingNative/useShoppingHostChat.js.map +1 -1
  514. package/lib/screens/TravelNative/useTravelHostChat.js +12 -6
  515. package/lib/screens/TravelNative/useTravelHostChat.js.map +1 -1
  516. package/lib/screens/WebBuilder/WebViewWithNavigation.js +2 -2
  517. package/lib/screens/WebBuilder/WebViewWithNavigation.js.map +1 -1
  518. package/lib/services/brainQuickReply.js +38 -1
  519. package/lib/services/brainQuickReply.js.map +1 -1
  520. package/lib/state/chatThreadMerge.js +6 -1
  521. package/lib/state/chatThreadMerge.js.map +1 -1
  522. package/package.json +6 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"solidColorPng.js","sources":["../../../../src/features/canvas/videoEditor/solidColorPng.ts"],"sourcesContent":["/**\n * Solid-colour PNG for export. Blank scenes preview as a 1×1 GIF data URL\n * (tiny to persist), but yantra-video slideshow must fetch an even-sized\n * raster — 1×1 GIF data URLs fail both the fetch and yuv420 encode.\n */\n\nconst PNG_SIG = Uint8Array.of(137, 80, 78, 71, 13, 10, 26, 10);\n\nfunction u32(n: number): Uint8Array {\n return Uint8Array.of((n >>> 24) & 255, (n >>> 16) & 255, (n >>> 8) & 255, n & 255);\n}\n\nfunction concat(...parts: Uint8Array[]): Uint8Array {\n const out = new Uint8Array(parts.reduce((sum, part) => sum + part.length, 0));\n let offset = 0;\n for (const part of parts) {\n out.set(part, offset);\n offset += part.length;\n }\n return out;\n}\n\nfunction crc32(bytes: Uint8Array): number {\n let crc = ~0;\n for (let i = 0; i < bytes.length; i += 1) {\n crc ^= bytes[i];\n for (let bit = 0; bit < 8; bit += 1) crc = (crc >>> 1) ^ (0xedb88320 & -(crc & 1));\n }\n return ~crc >>> 0;\n}\n\nfunction adler32(bytes: Uint8Array): number {\n let a = 1;\n let b = 0;\n for (let i = 0; i < bytes.length; i += 1) {\n a += bytes[i];\n if (a >= 65521) a -= 65521;\n b += a;\n if (b >= 65521) b -= 65521;\n }\n return ((b << 16) | a) >>> 0;\n}\n\nfunction chunk(type: string, data: Uint8Array): Uint8Array {\n const typeBytes = Uint8Array.from([...type].map((ch) => ch.charCodeAt(0)));\n return concat(u32(data.length), typeBytes, data, u32(crc32(concat(typeBytes, data))));\n}\n\n/** zlib-wrapped stored (uncompressed) deflate — no extra deps. */\nfunction zlibStore(raw: Uint8Array): Uint8Array {\n const blocks: Uint8Array[] = [Uint8Array.of(0x78, 0x01)];\n let offset = 0;\n while (offset < raw.length) {\n const n = Math.min(raw.length - offset, 65535);\n const last = offset + n >= raw.length;\n const nlen = n ^ 0xffff;\n blocks.push(\n Uint8Array.of(last ? 0x01 : 0x00, n & 255, (n >> 8) & 255, nlen & 255, (nlen >> 8) & 255),\n raw.subarray(offset, offset + n),\n );\n offset += n;\n }\n blocks.push(u32(adler32(raw)));\n return concat(...blocks);\n}\n\nexport function parseHexColor(hex: string): { r: number; g: number; b: number; hex: string } {\n const h = hex.replace('#', '').padEnd(6, '0').slice(0, 6);\n const r = Number.parseInt(h.slice(0, 2), 16) || 0;\n const g = Number.parseInt(h.slice(2, 4), 16) || 0;\n const b = Number.parseInt(h.slice(4, 6), 16) || 0;\n return { r, g, b, hex: `#${h.toLowerCase()}` };\n}\n\n/** Recover the palette colour from the 1×1 GIF `solidColorSrc` produces. */\nexport function colorFromSolidSrc(src: string): string | null {\n const prefix = 'data:image/gif;base64,';\n if (!src.startsWith(prefix)) return null;\n const binary =\n typeof globalThis.atob === 'function'\n ? globalThis.atob(src.slice(prefix.length))\n : Buffer.from(src.slice(prefix.length), 'base64').toString('binary');\n if (binary.length < 16) return null;\n const hex = (n: number) => n.toString(16).padStart(2, '0');\n return `#${hex(binary.charCodeAt(13))}${hex(binary.charCodeAt(14))}${hex(binary.charCodeAt(15))}`;\n}\n\nexport function bytesToDataUrl(mime: string, bytes: Uint8Array): string {\n if (typeof Buffer !== 'undefined') {\n return `data:${mime};base64,${Buffer.from(bytes).toString('base64')}`;\n }\n let bin = '';\n const chunk = 8192;\n for (let i = 0; i < bytes.length; i += chunk) {\n const slice = bytes.subarray(i, i + chunk);\n bin += String.fromCharCode.apply(null, Array.from(slice) as unknown as number[]);\n }\n return `data:${mime};base64,${globalThis.btoa(bin)}`;\n}\n\n/** Even-sized RGB PNG the slideshow connector can fetch after upload. */\nexport function solidColorPngDataUrl(hex: string, width = 640, height = 360): string {\n const w = Math.max(2, width - (width % 2));\n const h = Math.max(2, height - (height % 2));\n const { r, g, b } = parseHexColor(hex);\n const stride = 1 + w * 3;\n const raw = new Uint8Array(stride * h);\n for (let y = 0; y < h; y += 1) {\n const row = y * stride;\n raw[row] = 0;\n for (let x = 0; x < w; x += 1) {\n const i = row + 1 + x * 3;\n raw[i] = r;\n raw[i + 1] = g;\n raw[i + 2] = b;\n }\n }\n const ihdr = concat(u32(w), u32(h), Uint8Array.of(8, 2, 0, 0, 0));\n const png = concat(PNG_SIG, chunk('IHDR', ihdr), chunk('IDAT', zlibStore(raw)), chunk('IEND', new Uint8Array(0)));\n return bytesToDataUrl('image/png', png);\n}\n\nexport function uploadFilenameFor(uri: string, prefix = 'canvas'): string {\n if (uri.startsWith('data:')) {\n const mime = uri.slice(5).split(';')[0]?.toLowerCase() || '';\n const ext = mime.includes('png')\n ? 'png'\n : mime.includes('gif')\n ? 'gif'\n : mime.includes('jpeg') || mime.includes('jpg')\n ? 'jpg'\n : mime.includes('webp')\n ? 'webp'\n : 'bin';\n return `${prefix}-${Date.now()}.${ext}`;\n }\n const ext =\n uri\n .split('?')[0]\n .split('.')\n .pop()\n ?.toLowerCase()\n ?.replace(/[^a-z0-9]/g, '') || 'bin';\n return `${prefix}-${Date.now()}.${ext}`;\n}\n"],"names":["chunk","ext"],"mappings":"AAMA,MAAM,OAAA,GAAU,UAAW,CAAA,EAAA,CAAG,GAAK,EAAA,EAAA,EAAI,IAAI,EAAI,EAAA,EAAA,EAAI,EAAI,EAAA,EAAA,EAAI,EAAE,CAAA;AAC7D,SAAS,IAAI,CAAuB,EAAA;AAClC,EAAA,OAAO,UAAW,CAAA,EAAA,CAAG,CAAM,KAAA,EAAA,GAAK,GAAK,EAAA,CAAA,KAAM,EAAK,GAAA,GAAA,EAAK,CAAM,KAAA,CAAA,GAAI,GAAK,EAAA,CAAA,GAAI,GAAG,CAAA;AAC7E;AACA,SAAS,UAAU,KAAiC,EAAA;AAClD,EAAA,MAAM,GAAM,GAAA,IAAI,UAAW,CAAA,KAAA,CAAM,MAAO,CAAA,CAAC,GAAK,EAAA,IAAA,KAAS,GAAM,GAAA,IAAA,CAAK,MAAQ,EAAA,CAAC,CAAC,CAAA;AAC5E,EAAA,IAAI,MAAS,GAAA,CAAA;AACb,EAAA,KAAA,MAAW,QAAQ,KAAO,EAAA;AACxB,IAAI,GAAA,CAAA,GAAA,CAAI,MAAM,MAAM,CAAA;AACpB,IAAA,MAAA,IAAU,IAAK,CAAA,MAAA;AAAA;AAEjB,EAAO,OAAA,GAAA;AACT;AACA,SAAS,MAAM,KAA2B,EAAA;AACxC,EAAA,IAAI,MAAM,EAAC;AACX,EAAA,KAAA,IAAS,IAAI,CAAG,EAAA,CAAA,GAAI,KAAM,CAAA,MAAA,EAAQ,KAAK,CAAG,EAAA;AACxC,IAAA,GAAA,IAAO,MAAM,CAAC,CAAA;AACd,IAAS,KAAA,IAAA,GAAA,GAAM,CAAG,EAAA,GAAA,GAAM,CAAG,EAAA,GAAA,IAAO,CAAG,EAAA,GAAA,GAAM,GAAQ,KAAA,CAAA,GAAI,UAAa,GAAA,EAAE,GAAM,GAAA,CAAA,CAAA;AAAA;AAE9E,EAAA,OAAO,CAAC,GAAQ,KAAA,CAAA;AAClB;AACA,SAAS,QAAQ,KAA2B,EAAA;AAC1C,EAAA,IAAI,CAAI,GAAA,CAAA;AACR,EAAA,IAAI,CAAI,GAAA,CAAA;AACR,EAAA,KAAA,IAAS,IAAI,CAAG,EAAA,CAAA,GAAI,KAAM,CAAA,MAAA,EAAQ,KAAK,CAAG,EAAA;AACxC,IAAA,CAAA,IAAK,MAAM,CAAC,CAAA;AACZ,IAAI,IAAA,CAAA,IAAK,OAAY,CAAA,IAAA,KAAA;AACrB,IAAK,CAAA,IAAA,CAAA;AACL,IAAI,IAAA,CAAA,IAAK,OAAY,CAAA,IAAA,KAAA;AAAA;AAEvB,EAAQ,OAAA,CAAA,CAAA,IAAK,KAAK,CAAO,MAAA,CAAA;AAC3B;AACA,SAAS,KAAA,CAAM,MAAc,IAA8B,EAAA;AACzD,EAAA,MAAM,SAAY,GAAA,UAAA,CAAW,IAAK,CAAA,CAAC,GAAG,IAAI,CAAE,CAAA,GAAA,CAAI,CAAM,EAAA,KAAA,EAAA,CAAG,UAAW,CAAA,CAAC,CAAC,CAAC,CAAA;AACvE,EAAA,OAAO,MAAO,CAAA,GAAA,CAAI,IAAK,CAAA,MAAM,GAAG,SAAW,EAAA,IAAA,EAAM,GAAI,CAAA,KAAA,CAAM,MAAO,CAAA,SAAA,EAAW,IAAI,CAAC,CAAC,CAAC,CAAA;AACtF;AAGA,SAAS,UAAU,GAA6B,EAAA;AAC9C,EAAA,MAAM,SAAuB,CAAC,UAAA,CAAW,EAAG,CAAA,GAAA,EAAM,CAAI,CAAC,CAAA;AACvD,EAAA,IAAI,MAAS,GAAA,CAAA;AACb,EAAO,OAAA,MAAA,GAAS,IAAI,MAAQ,EAAA;AAC1B,IAAA,MAAM,IAAI,IAAK,CAAA,GAAA,CAAI,GAAI,CAAA,MAAA,GAAS,QAAQ,KAAK,CAAA;AAC7C,IAAM,MAAA,IAAA,GAAO,MAAS,GAAA,CAAA,IAAK,GAAI,CAAA,MAAA;AAC/B,IAAA,MAAM,OAAO,CAAI,GAAA,KAAA;AACjB,IAAO,MAAA,CAAA,IAAA,CAAK,WAAW,EAAG,CAAA,IAAA,GAAO,IAAO,CAAM,EAAA,CAAA,GAAI,GAAK,EAAA,CAAA,IAAK,CAAI,GAAA,GAAA,EAAK,OAAO,GAAK,EAAA,IAAA,IAAQ,IAAI,GAAG,CAAA,EAAG,IAAI,QAAS,CAAA,MAAA,EAAQ,MAAS,GAAA,CAAC,CAAC,CAAA;AACnI,IAAU,MAAA,IAAA,CAAA;AAAA;AAEZ,EAAA,MAAA,CAAO,IAAK,CAAA,GAAA,CAAI,OAAQ,CAAA,GAAG,CAAC,CAAC,CAAA;AAC7B,EAAO,OAAA,MAAA,CAAO,GAAG,MAAM,CAAA;AACzB;AACO,SAAS,cAAc,GAK5B,EAAA;AACA,EAAA,MAAM,CAAI,GAAA,GAAA,CAAI,OAAQ,CAAA,GAAA,EAAK,EAAE,CAAA,CAAE,MAAO,CAAA,CAAA,EAAG,GAAG,CAAA,CAAE,KAAM,CAAA,CAAA,EAAG,CAAC,CAAA;AACxD,EAAM,MAAA,CAAA,GAAI,OAAO,QAAS,CAAA,CAAA,CAAE,MAAM,CAAG,EAAA,CAAC,CAAG,EAAA,EAAE,CAAK,IAAA,CAAA;AAChD,EAAM,MAAA,CAAA,GAAI,OAAO,QAAS,CAAA,CAAA,CAAE,MAAM,CAAG,EAAA,CAAC,CAAG,EAAA,EAAE,CAAK,IAAA,CAAA;AAChD,EAAM,MAAA,CAAA,GAAI,OAAO,QAAS,CAAA,CAAA,CAAE,MAAM,CAAG,EAAA,CAAC,CAAG,EAAA,EAAE,CAAK,IAAA,CAAA;AAChD,EAAO,OAAA;AAAA,IACL,CAAA;AAAA,IACA,CAAA;AAAA,IACA,CAAA;AAAA,IACA,GAAK,EAAA,CAAA,CAAA,EAAI,CAAE,CAAA,WAAA,EAAa,CAAA;AAAA,GAC1B;AACF;AAGO,SAAS,kBAAkB,GAA4B,EAAA;AAC5D,EAAA,MAAM,MAAS,GAAA,wBAAA;AACf,EAAA,IAAI,CAAC,GAAA,CAAI,UAAW,CAAA,MAAM,GAAU,OAAA,IAAA;AACpC,EAAM,MAAA,MAAA,GAAS,OAAO,UAAW,CAAA,IAAA,KAAS,aAAa,UAAW,CAAA,IAAA,CAAK,GAAI,CAAA,KAAA,CAAM,MAAO,CAAA,MAAM,CAAC,CAAI,GAAA,MAAA,CAAO,IAAK,CAAA,GAAA,CAAI,KAAM,CAAA,MAAA,CAAO,MAAM,CAAG,EAAA,QAAQ,CAAE,CAAA,QAAA,CAAS,QAAQ,CAAA;AACpK,EAAI,IAAA,MAAA,CAAO,MAAS,GAAA,EAAA,EAAW,OAAA,IAAA;AAC/B,EAAM,MAAA,GAAA,GAAM,CAAC,CAAc,KAAA,CAAA,CAAE,SAAS,EAAE,CAAA,CAAE,QAAS,CAAA,CAAA,EAAG,GAAG,CAAA;AACzD,EAAO,OAAA,CAAA,CAAA,EAAI,IAAI,MAAO,CAAA,UAAA,CAAW,EAAE,CAAC,CAAC,GAAG,GAAI,CAAA,MAAA,CAAO,WAAW,EAAE,CAAC,CAAC,CAAG,EAAA,GAAA,CAAI,OAAO,UAAW,CAAA,EAAE,CAAC,CAAC,CAAA,CAAA;AACjG;AACgB,SAAA,cAAA,CAAe,MAAc,KAA2B,EAAA;AACtE,EAAI,IAAA,OAAO,WAAW,WAAa,EAAA;AACjC,IAAO,OAAA,CAAA,KAAA,EAAQ,IAAI,CAAW,QAAA,EAAA,MAAA,CAAO,KAAK,KAAK,CAAA,CAAE,QAAS,CAAA,QAAQ,CAAC,CAAA,CAAA;AAAA;AAErE,EAAA,IAAI,GAAM,GAAA,EAAA;AACV,EAAA,MAAMA,MAAQ,GAAA,IAAA;AACd,EAAA,KAAA,IAAS,IAAI,CAAG,EAAA,CAAA,GAAI,KAAM,CAAA,MAAA,EAAQ,KAAKA,MAAO,EAAA;AAC5C,IAAA,MAAM,KAAQ,GAAA,KAAA,CAAM,QAAS,CAAA,CAAA,EAAG,IAAIA,MAAK,CAAA;AACzC,IAAA,GAAA,IAAO,OAAO,YAAa,CAAA,KAAA,CAAM,MAAM,KAAM,CAAA,IAAA,CAAK,KAAK,CAAwB,CAAA;AAAA;AAEjF,EAAA,OAAO,QAAQ,IAAI,CAAA,QAAA,EAAW,UAAW,CAAA,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AACpD;AAGO,SAAS,oBAAqB,CAAA,GAAA,EAAa,KAAQ,GAAA,GAAA,EAAK,SAAS,GAAa,EAAA;AACnF,EAAA,MAAM,IAAI,IAAK,CAAA,GAAA,CAAI,CAAG,EAAA,KAAA,GAAQ,QAAQ,CAAC,CAAA;AACvC,EAAA,MAAM,IAAI,IAAK,CAAA,GAAA,CAAI,CAAG,EAAA,MAAA,GAAS,SAAS,CAAC,CAAA;AACzC,EAAM,MAAA;AAAA,IACJ,CAAA;AAAA,IACA,CAAA;AAAA,IACA;AAAA,GACF,GAAI,cAAc,GAAG,CAAA;AACrB,EAAM,MAAA,MAAA,GAAS,IAAI,CAAI,GAAA,CAAA;AACvB,EAAA,MAAM,GAAM,GAAA,IAAI,UAAW,CAAA,MAAA,GAAS,CAAC,CAAA;AACrC,EAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,CAAA,EAAG,KAAK,CAAG,EAAA;AAC7B,IAAA,MAAM,MAAM,CAAI,GAAA,MAAA;AAChB,IAAA,GAAA,CAAI,GAAG,CAAI,GAAA,CAAA;AACX,IAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,CAAA,EAAG,KAAK,CAAG,EAAA;AAC7B,MAAM,MAAA,CAAA,GAAI,GAAM,GAAA,CAAA,GAAI,CAAI,GAAA,CAAA;AACxB,MAAA,GAAA,CAAI,CAAC,CAAI,GAAA,CAAA;AACT,MAAI,GAAA,CAAA,CAAA,GAAI,CAAC,CAAI,GAAA,CAAA;AACb,MAAI,GAAA,CAAA,CAAA,GAAI,CAAC,CAAI,GAAA,CAAA;AAAA;AACf;AAEF,EAAA,MAAM,IAAO,GAAA,MAAA,CAAO,GAAI,CAAA,CAAC,GAAG,GAAI,CAAA,CAAC,CAAG,EAAA,UAAA,CAAW,GAAG,CAAG,EAAA,CAAA,EAAG,CAAG,EAAA,CAAA,EAAG,CAAC,CAAC,CAAA;AAChE,EAAA,MAAM,MAAM,MAAO,CAAA,OAAA,EAAS,MAAM,MAAQ,EAAA,IAAI,GAAG,KAAM,CAAA,MAAA,EAAQ,UAAU,GAAG,CAAC,GAAG,KAAM,CAAA,MAAA,EAAQ,IAAI,UAAW,CAAA,CAAC,CAAC,CAAC,CAAA;AAChH,EAAO,OAAA,cAAA,CAAe,aAAa,GAAG,CAAA;AACxC;AACgB,SAAA,iBAAA,CAAkB,GAAa,EAAA,MAAA,GAAS,QAAkB,EAAA;AA1H1E,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AA2HE,EAAI,IAAA,GAAA,CAAI,UAAW,CAAA,OAAO,CAAG,EAAA;AAC3B,IAAM,MAAA,IAAA,GAAA,CAAA,CAAO,EAAI,GAAA,GAAA,CAAA,KAAA,CAAM,CAAC,CAAA,CAAE,KAAM,CAAA,GAAG,CAAE,CAAA,CAAC,CAAzB,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAA4B,WAAiB,EAAA,KAAA,EAAA;AAC1D,IAAMC,MAAAA,IAAAA,GAAM,IAAK,CAAA,QAAA,CAAS,KAAK,CAAA,GAAI,QAAQ,IAAK,CAAA,QAAA,CAAS,KAAK,CAAA,GAAI,KAAQ,GAAA,IAAA,CAAK,SAAS,MAAM,CAAA,IAAK,IAAK,CAAA,QAAA,CAAS,KAAK,CAAA,GAAI,QAAQ,IAAK,CAAA,QAAA,CAAS,MAAM,CAAA,GAAI,MAAS,GAAA,KAAA;AACnK,IAAA,OAAO,GAAG,MAAM,CAAA,CAAA,EAAI,KAAK,GAAI,EAAC,IAAIA,IAAG,CAAA,CAAA;AAAA;AAEvC,EAAA,MAAM,QAAM,EAAI,GAAA,CAAA,EAAA,GAAA,GAAA,CAAA,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAE,CAAA,KAAA,CAAM,GAAG,CAAA,CAAE,KAA7B,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAoC,kBAApC,IAAmD,GAAA,MAAA,GAAA,EAAA,CAAA,OAAA,CAAQ,cAAc,EAAO,CAAA,KAAA,KAAA;AAC5F,EAAA,OAAO,GAAG,MAAM,CAAA,CAAA,EAAI,KAAK,GAAI,EAAC,IAAI,GAAG,CAAA,CAAA;AACvC"}
@@ -0,0 +1,191 @@
1
+ const VIDEO_EDIT_ACTIONS = {
2
+ trim: "YANTRA_VIDEO_EDIT_TRIM",
3
+ speed: "YANTRA_VIDEO_EDIT_SPEED",
4
+ transcode: "YANTRA_VIDEO_EDIT_TRANSCODE",
5
+ gif: "YANTRA_VIDEO_EDIT_GIF_EXPORT",
6
+ thumbnail: "YANTRA_VIDEO_EDIT_THUMBNAIL",
7
+ reverse: "YANTRA_VIDEO_EDIT_REVERSE",
8
+ fps: "YANTRA_VIDEO_EDIT_FPS",
9
+ crop: "YANTRA_VIDEO_EDIT_CROP",
10
+ pad: "YANTRA_VIDEO_EDIT_PAD",
11
+ rotate: "YANTRA_VIDEO_EDIT_ROTATE",
12
+ fade: "YANTRA_VIDEO_EDIT_FADE",
13
+ blur: "YANTRA_VIDEO_EDIT_BLUR",
14
+ denoise: "YANTRA_VIDEO_EDIT_DENOISE",
15
+ stabilize: "YANTRA_VIDEO_EDIT_STABILIZE",
16
+ deinterlace: "YANTRA_VIDEO_EDIT_DEINTERLACE",
17
+ delogo: "YANTRA_VIDEO_EDIT_DELOGO",
18
+ color_adjust: "YANTRA_VIDEO_EDIT_COLOR_ADJUST",
19
+ mute: "YANTRA_VIDEO_EDIT_MUTE",
20
+ volume: "YANTRA_VIDEO_EDIT_VOLUME",
21
+ extract_audio: "YANTRA_VIDEO_EDIT_EXTRACT_AUDIO",
22
+ audio_normalize: "YANTRA_VIDEO_EDIT_AUDIO_NORMALIZE",
23
+ audio_delay: "YANTRA_VIDEO_EDIT_AUDIO_DELAY",
24
+ overlay_text: "YANTRA_VIDEO_EDIT_OVERLAY_TEXT",
25
+ overlay_image: "YANTRA_VIDEO_EDIT_OVERLAY_IMAGE",
26
+ picture_in_picture: "YANTRA_VIDEO_EDIT_PICTURE_IN_PICTURE",
27
+ burn_subtitles: "YANTRA_VIDEO_EDIT_BURN_SUBTITLES",
28
+ chroma_key: "YANTRA_VIDEO_EDIT_CHROMA_KEY",
29
+ loop: "YANTRA_VIDEO_EDIT_LOOP",
30
+ metadata: "YANTRA_VIDEO_EDIT_METADATA",
31
+ concat: "YANTRA_VIDEO_EDIT_CONCAT",
32
+ stack: "YANTRA_VIDEO_EDIT_STACK",
33
+ transition: "YANTRA_VIDEO_EDIT_TRANSITION",
34
+ add_audio: "YANTRA_VIDEO_EDIT_ADD_AUDIO",
35
+ extract_frames: "YANTRA_VIDEO_EDIT_EXTRACT_FRAMES",
36
+ slideshow: "YANTRA_VIDEO_EDIT_SLIDESHOW",
37
+ probe: "YANTRA_VIDEO_EDIT_PROBE",
38
+ contact_sheet: "YANTRA_VIDEO_EDIT_CONTACT_SHEET"
39
+ };
40
+ const VIDEO_EDIT_CATEGORIES = [{
41
+ id: "basic",
42
+ label: "Basic",
43
+ ops: [{
44
+ op: "trim",
45
+ label: "Trim"
46
+ }, {
47
+ op: "speed",
48
+ label: "Speed"
49
+ }, {
50
+ op: "transcode",
51
+ label: "Transcode"
52
+ }, {
53
+ op: "gif",
54
+ label: "GIF"
55
+ }, {
56
+ op: "thumbnail",
57
+ label: "Thumb"
58
+ }, {
59
+ op: "reverse",
60
+ label: "Reverse"
61
+ }]
62
+ }, {
63
+ id: "transform",
64
+ label: "Transform",
65
+ ops: [{
66
+ op: "fps",
67
+ label: "FPS"
68
+ }, {
69
+ op: "crop",
70
+ label: "Crop"
71
+ }, {
72
+ op: "pad",
73
+ label: "Pad"
74
+ }, {
75
+ op: "rotate",
76
+ label: "Rotate"
77
+ }, {
78
+ op: "fade",
79
+ label: "Fade"
80
+ }, {
81
+ op: "blur",
82
+ label: "Blur"
83
+ }, {
84
+ op: "denoise",
85
+ label: "Denoise"
86
+ }, {
87
+ op: "stabilize",
88
+ label: "Stabilize"
89
+ }, {
90
+ op: "deinterlace",
91
+ label: "Deinterlace"
92
+ }, {
93
+ op: "delogo",
94
+ label: "Delogo"
95
+ }, {
96
+ op: "color_adjust",
97
+ label: "Color"
98
+ }]
99
+ }, {
100
+ id: "audio",
101
+ label: "Audio",
102
+ ops: [{
103
+ op: "mute",
104
+ label: "Mute"
105
+ }, {
106
+ op: "volume",
107
+ label: "Volume"
108
+ }, {
109
+ op: "extract_audio",
110
+ label: "Extract"
111
+ }, {
112
+ op: "audio_normalize",
113
+ label: "Normalize"
114
+ }, {
115
+ op: "audio_delay",
116
+ label: "Delay"
117
+ }]
118
+ }, {
119
+ id: "compose",
120
+ label: "Compose",
121
+ ops: [{
122
+ op: "overlay_text",
123
+ label: "Text"
124
+ }, {
125
+ op: "overlay_image",
126
+ label: "Image"
127
+ }, {
128
+ op: "picture_in_picture",
129
+ label: "PiP"
130
+ }, {
131
+ op: "burn_subtitles",
132
+ label: "Subtitles"
133
+ }, {
134
+ op: "chroma_key",
135
+ label: "Chroma"
136
+ }, {
137
+ op: "loop",
138
+ label: "Loop"
139
+ }, {
140
+ op: "metadata",
141
+ label: "Tags"
142
+ }]
143
+ }, {
144
+ id: "multi",
145
+ label: "Multi",
146
+ ops: [{
147
+ op: "concat",
148
+ label: "Concat"
149
+ }, {
150
+ op: "stack",
151
+ label: "Stack"
152
+ }, {
153
+ op: "transition",
154
+ label: "Transition"
155
+ }, {
156
+ op: "add_audio",
157
+ label: "Add Audio"
158
+ }]
159
+ }, {
160
+ id: "frames",
161
+ label: "Frames",
162
+ ops: [{
163
+ op: "extract_frames",
164
+ label: "Extract"
165
+ }, {
166
+ op: "slideshow",
167
+ label: "Slideshow"
168
+ }]
169
+ }, {
170
+ id: "analyze",
171
+ label: "Analyze",
172
+ ops: [{
173
+ op: "probe",
174
+ label: "Probe"
175
+ }, {
176
+ op: "contact_sheet",
177
+ label: "Sheet"
178
+ }]
179
+ }];
180
+ function resultKind(op) {
181
+ if (op === "extract_audio") return "audio";
182
+ if (op === "gif" || op === "thumbnail" || op === "contact_sheet" || op === "extract_frames") return "image";
183
+ return "video";
184
+ }
185
+ const INSTANT_HINT = {
186
+ reverse: "Reverse the entire video clip.",
187
+ mute: "Remove all audio from the video.",
188
+ extract_audio: "Extract the audio track as an MP3.",
189
+ deinterlace: "Apply a deinterlacing filter.",
190
+ probe: "Read codec, duration, and size without changing the file."
191
+ };export{INSTANT_HINT,VIDEO_EDIT_ACTIONS,VIDEO_EDIT_CATEGORIES,resultKind};//# sourceMappingURL=videoEditOps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"videoEditOps.js","sources":["../../../../src/features/canvas/videoEditor/videoEditOps.ts"],"sourcesContent":["/**\n * Native twin of canvas-surface `VIDEO_EDIT_CATEGORIES` + `VIDEO_EDIT_ACTIONS`.\n * Action slugs must match `yantra-video-editing` (mediaEditingRpc).\n */\n\nexport type VideoEditCategory = 'basic' | 'transform' | 'audio' | 'compose' | 'multi' | 'frames' | 'analyze';\n\nexport type VideoEditOp =\n | 'trim'\n | 'speed'\n | 'transcode'\n | 'gif'\n | 'thumbnail'\n | 'reverse'\n | 'fps'\n | 'crop'\n | 'pad'\n | 'rotate'\n | 'fade'\n | 'blur'\n | 'denoise'\n | 'stabilize'\n | 'deinterlace'\n | 'delogo'\n | 'color_adjust'\n | 'mute'\n | 'volume'\n | 'extract_audio'\n | 'audio_normalize'\n | 'audio_delay'\n | 'overlay_text'\n | 'overlay_image'\n | 'picture_in_picture'\n | 'burn_subtitles'\n | 'chroma_key'\n | 'loop'\n | 'metadata'\n | 'concat'\n | 'stack'\n | 'transition'\n | 'add_audio'\n | 'extract_frames'\n | 'slideshow'\n | 'probe'\n | 'contact_sheet';\n\nexport const VIDEO_EDIT_ACTIONS: Record<VideoEditOp, string> = {\n trim: 'YANTRA_VIDEO_EDIT_TRIM',\n speed: 'YANTRA_VIDEO_EDIT_SPEED',\n transcode: 'YANTRA_VIDEO_EDIT_TRANSCODE',\n gif: 'YANTRA_VIDEO_EDIT_GIF_EXPORT',\n thumbnail: 'YANTRA_VIDEO_EDIT_THUMBNAIL',\n reverse: 'YANTRA_VIDEO_EDIT_REVERSE',\n fps: 'YANTRA_VIDEO_EDIT_FPS',\n crop: 'YANTRA_VIDEO_EDIT_CROP',\n pad: 'YANTRA_VIDEO_EDIT_PAD',\n rotate: 'YANTRA_VIDEO_EDIT_ROTATE',\n fade: 'YANTRA_VIDEO_EDIT_FADE',\n blur: 'YANTRA_VIDEO_EDIT_BLUR',\n denoise: 'YANTRA_VIDEO_EDIT_DENOISE',\n stabilize: 'YANTRA_VIDEO_EDIT_STABILIZE',\n deinterlace: 'YANTRA_VIDEO_EDIT_DEINTERLACE',\n delogo: 'YANTRA_VIDEO_EDIT_DELOGO',\n color_adjust: 'YANTRA_VIDEO_EDIT_COLOR_ADJUST',\n mute: 'YANTRA_VIDEO_EDIT_MUTE',\n volume: 'YANTRA_VIDEO_EDIT_VOLUME',\n extract_audio: 'YANTRA_VIDEO_EDIT_EXTRACT_AUDIO',\n audio_normalize: 'YANTRA_VIDEO_EDIT_AUDIO_NORMALIZE',\n audio_delay: 'YANTRA_VIDEO_EDIT_AUDIO_DELAY',\n overlay_text: 'YANTRA_VIDEO_EDIT_OVERLAY_TEXT',\n overlay_image: 'YANTRA_VIDEO_EDIT_OVERLAY_IMAGE',\n picture_in_picture: 'YANTRA_VIDEO_EDIT_PICTURE_IN_PICTURE',\n burn_subtitles: 'YANTRA_VIDEO_EDIT_BURN_SUBTITLES',\n chroma_key: 'YANTRA_VIDEO_EDIT_CHROMA_KEY',\n loop: 'YANTRA_VIDEO_EDIT_LOOP',\n metadata: 'YANTRA_VIDEO_EDIT_METADATA',\n concat: 'YANTRA_VIDEO_EDIT_CONCAT',\n stack: 'YANTRA_VIDEO_EDIT_STACK',\n transition: 'YANTRA_VIDEO_EDIT_TRANSITION',\n add_audio: 'YANTRA_VIDEO_EDIT_ADD_AUDIO',\n extract_frames: 'YANTRA_VIDEO_EDIT_EXTRACT_FRAMES',\n slideshow: 'YANTRA_VIDEO_EDIT_SLIDESHOW',\n probe: 'YANTRA_VIDEO_EDIT_PROBE',\n contact_sheet: 'YANTRA_VIDEO_EDIT_CONTACT_SHEET',\n};\n\nexport const VIDEO_EDIT_CATEGORIES: ReadonlyArray<{\n id: VideoEditCategory;\n label: string;\n ops: ReadonlyArray<{ op: VideoEditOp; label: string }>;\n}> = [\n {\n id: 'basic',\n label: 'Basic',\n ops: [\n { op: 'trim', label: 'Trim' },\n { op: 'speed', label: 'Speed' },\n { op: 'transcode', label: 'Transcode' },\n { op: 'gif', label: 'GIF' },\n { op: 'thumbnail', label: 'Thumb' },\n { op: 'reverse', label: 'Reverse' },\n ],\n },\n {\n id: 'transform',\n label: 'Transform',\n ops: [\n { op: 'fps', label: 'FPS' },\n { op: 'crop', label: 'Crop' },\n { op: 'pad', label: 'Pad' },\n { op: 'rotate', label: 'Rotate' },\n { op: 'fade', label: 'Fade' },\n { op: 'blur', label: 'Blur' },\n { op: 'denoise', label: 'Denoise' },\n { op: 'stabilize', label: 'Stabilize' },\n { op: 'deinterlace', label: 'Deinterlace' },\n { op: 'delogo', label: 'Delogo' },\n { op: 'color_adjust', label: 'Color' },\n ],\n },\n {\n id: 'audio',\n label: 'Audio',\n ops: [\n { op: 'mute', label: 'Mute' },\n { op: 'volume', label: 'Volume' },\n { op: 'extract_audio', label: 'Extract' },\n { op: 'audio_normalize', label: 'Normalize' },\n { op: 'audio_delay', label: 'Delay' },\n ],\n },\n {\n id: 'compose',\n label: 'Compose',\n ops: [\n { op: 'overlay_text', label: 'Text' },\n { op: 'overlay_image', label: 'Image' },\n { op: 'picture_in_picture', label: 'PiP' },\n { op: 'burn_subtitles', label: 'Subtitles' },\n { op: 'chroma_key', label: 'Chroma' },\n { op: 'loop', label: 'Loop' },\n { op: 'metadata', label: 'Tags' },\n ],\n },\n {\n id: 'multi',\n label: 'Multi',\n ops: [\n { op: 'concat', label: 'Concat' },\n { op: 'stack', label: 'Stack' },\n { op: 'transition', label: 'Transition' },\n { op: 'add_audio', label: 'Add Audio' },\n ],\n },\n {\n id: 'frames',\n label: 'Frames',\n ops: [\n { op: 'extract_frames', label: 'Extract' },\n { op: 'slideshow', label: 'Slideshow' },\n ],\n },\n {\n id: 'analyze',\n label: 'Analyze',\n ops: [\n { op: 'probe', label: 'Probe' },\n { op: 'contact_sheet', label: 'Sheet' },\n ],\n },\n];\n\n/** What Apply writes back — gif/thumb/sheet become stills; extract is audio. */\nexport function resultKind(op: VideoEditOp): 'video' | 'image' | 'audio' {\n if (op === 'extract_audio') return 'audio';\n if (op === 'gif' || op === 'thumbnail' || op === 'contact_sheet' || op === 'extract_frames') return 'image';\n return 'video';\n}\n\nexport const INSTANT_HINT: Partial<Record<VideoEditOp, string>> = {\n reverse: 'Reverse the entire video clip.',\n mute: 'Remove all audio from the video.',\n extract_audio: 'Extract the audio track as an MP3.',\n deinterlace: 'Apply a deinterlacing filter.',\n probe: 'Read codec, duration, and size without changing the file.',\n};\n"],"names":[],"mappings":"AAOO,MAAM,kBAAkD,GAAA;AAAA,EAC7D,IAAM,EAAA,wBAAA;AAAA,EACN,KAAO,EAAA,yBAAA;AAAA,EACP,SAAW,EAAA,6BAAA;AAAA,EACX,GAAK,EAAA,8BAAA;AAAA,EACL,SAAW,EAAA,6BAAA;AAAA,EACX,OAAS,EAAA,2BAAA;AAAA,EACT,GAAK,EAAA,uBAAA;AAAA,EACL,IAAM,EAAA,wBAAA;AAAA,EACN,GAAK,EAAA,uBAAA;AAAA,EACL,MAAQ,EAAA,0BAAA;AAAA,EACR,IAAM,EAAA,wBAAA;AAAA,EACN,IAAM,EAAA,wBAAA;AAAA,EACN,OAAS,EAAA,2BAAA;AAAA,EACT,SAAW,EAAA,6BAAA;AAAA,EACX,WAAa,EAAA,+BAAA;AAAA,EACb,MAAQ,EAAA,0BAAA;AAAA,EACR,YAAc,EAAA,gCAAA;AAAA,EACd,IAAM,EAAA,wBAAA;AAAA,EACN,MAAQ,EAAA,0BAAA;AAAA,EACR,aAAe,EAAA,iCAAA;AAAA,EACf,eAAiB,EAAA,mCAAA;AAAA,EACjB,WAAa,EAAA,+BAAA;AAAA,EACb,YAAc,EAAA,gCAAA;AAAA,EACd,aAAe,EAAA,iCAAA;AAAA,EACf,kBAAoB,EAAA,sCAAA;AAAA,EACpB,cAAgB,EAAA,kCAAA;AAAA,EAChB,UAAY,EAAA,8BAAA;AAAA,EACZ,IAAM,EAAA,wBAAA;AAAA,EACN,QAAU,EAAA,4BAAA;AAAA,EACV,MAAQ,EAAA,0BAAA;AAAA,EACR,KAAO,EAAA,yBAAA;AAAA,EACP,UAAY,EAAA,8BAAA;AAAA,EACZ,SAAW,EAAA,6BAAA;AAAA,EACX,cAAgB,EAAA,kCAAA;AAAA,EAChB,SAAW,EAAA,6BAAA;AAAA,EACX,KAAO,EAAA,yBAAA;AAAA,EACP,aAAe,EAAA;AACjB;AACO,MAAM,wBAOR,CAAC;AAAA,EACJ,EAAI,EAAA,OAAA;AAAA,EACJ,KAAO,EAAA,OAAA;AAAA,EACP,KAAK,CAAC;AAAA,IACJ,EAAI,EAAA,MAAA;AAAA,IACJ,KAAO,EAAA;AAAA,GACN,EAAA;AAAA,IACD,EAAI,EAAA,OAAA;AAAA,IACJ,KAAO,EAAA;AAAA,GACN,EAAA;AAAA,IACD,EAAI,EAAA,WAAA;AAAA,IACJ,KAAO,EAAA;AAAA,GACN,EAAA;AAAA,IACD,EAAI,EAAA,KAAA;AAAA,IACJ,KAAO,EAAA;AAAA,GACN,EAAA;AAAA,IACD,EAAI,EAAA,WAAA;AAAA,IACJ,KAAO,EAAA;AAAA,GACN,EAAA;AAAA,IACD,EAAI,EAAA,SAAA;AAAA,IACJ,KAAO,EAAA;AAAA,GACR;AACH,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,WAAA;AAAA,EACJ,KAAO,EAAA,WAAA;AAAA,EACP,KAAK,CAAC;AAAA,IACJ,EAAI,EAAA,KAAA;AAAA,IACJ,KAAO,EAAA;AAAA,GACN,EAAA;AAAA,IACD,EAAI,EAAA,MAAA;AAAA,IACJ,KAAO,EAAA;AAAA,GACN,EAAA;AAAA,IACD,EAAI,EAAA,KAAA;AAAA,IACJ,KAAO,EAAA;AAAA,GACN,EAAA;AAAA,IACD,EAAI,EAAA,QAAA;AAAA,IACJ,KAAO,EAAA;AAAA,GACN,EAAA;AAAA,IACD,EAAI,EAAA,MAAA;AAAA,IACJ,KAAO,EAAA;AAAA,GACN,EAAA;AAAA,IACD,EAAI,EAAA,MAAA;AAAA,IACJ,KAAO,EAAA;AAAA,GACN,EAAA;AAAA,IACD,EAAI,EAAA,SAAA;AAAA,IACJ,KAAO,EAAA;AAAA,GACN,EAAA;AAAA,IACD,EAAI,EAAA,WAAA;AAAA,IACJ,KAAO,EAAA;AAAA,GACN,EAAA;AAAA,IACD,EAAI,EAAA,aAAA;AAAA,IACJ,KAAO,EAAA;AAAA,GACN,EAAA;AAAA,IACD,EAAI,EAAA,QAAA;AAAA,IACJ,KAAO,EAAA;AAAA,GACN,EAAA;AAAA,IACD,EAAI,EAAA,cAAA;AAAA,IACJ,KAAO,EAAA;AAAA,GACR;AACH,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,OAAA;AAAA,EACJ,KAAO,EAAA,OAAA;AAAA,EACP,KAAK,CAAC;AAAA,IACJ,EAAI,EAAA,MAAA;AAAA,IACJ,KAAO,EAAA;AAAA,GACN,EAAA;AAAA,IACD,EAAI,EAAA,QAAA;AAAA,IACJ,KAAO,EAAA;AAAA,GACN,EAAA;AAAA,IACD,EAAI,EAAA,eAAA;AAAA,IACJ,KAAO,EAAA;AAAA,GACN,EAAA;AAAA,IACD,EAAI,EAAA,iBAAA;AAAA,IACJ,KAAO,EAAA;AAAA,GACN,EAAA;AAAA,IACD,EAAI,EAAA,aAAA;AAAA,IACJ,KAAO,EAAA;AAAA,GACR;AACH,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,SAAA;AAAA,EACJ,KAAO,EAAA,SAAA;AAAA,EACP,KAAK,CAAC;AAAA,IACJ,EAAI,EAAA,cAAA;AAAA,IACJ,KAAO,EAAA;AAAA,GACN,EAAA;AAAA,IACD,EAAI,EAAA,eAAA;AAAA,IACJ,KAAO,EAAA;AAAA,GACN,EAAA;AAAA,IACD,EAAI,EAAA,oBAAA;AAAA,IACJ,KAAO,EAAA;AAAA,GACN,EAAA;AAAA,IACD,EAAI,EAAA,gBAAA;AAAA,IACJ,KAAO,EAAA;AAAA,GACN,EAAA;AAAA,IACD,EAAI,EAAA,YAAA;AAAA,IACJ,KAAO,EAAA;AAAA,GACN,EAAA;AAAA,IACD,EAAI,EAAA,MAAA;AAAA,IACJ,KAAO,EAAA;AAAA,GACN,EAAA;AAAA,IACD,EAAI,EAAA,UAAA;AAAA,IACJ,KAAO,EAAA;AAAA,GACR;AACH,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,OAAA;AAAA,EACJ,KAAO,EAAA,OAAA;AAAA,EACP,KAAK,CAAC;AAAA,IACJ,EAAI,EAAA,QAAA;AAAA,IACJ,KAAO,EAAA;AAAA,GACN,EAAA;AAAA,IACD,EAAI,EAAA,OAAA;AAAA,IACJ,KAAO,EAAA;AAAA,GACN,EAAA;AAAA,IACD,EAAI,EAAA,YAAA;AAAA,IACJ,KAAO,EAAA;AAAA,GACN,EAAA;AAAA,IACD,EAAI,EAAA,WAAA;AAAA,IACJ,KAAO,EAAA;AAAA,GACR;AACH,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,QAAA;AAAA,EACJ,KAAO,EAAA,QAAA;AAAA,EACP,KAAK,CAAC;AAAA,IACJ,EAAI,EAAA,gBAAA;AAAA,IACJ,KAAO,EAAA;AAAA,GACN,EAAA;AAAA,IACD,EAAI,EAAA,WAAA;AAAA,IACJ,KAAO,EAAA;AAAA,GACR;AACH,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,SAAA;AAAA,EACJ,KAAO,EAAA,SAAA;AAAA,EACP,KAAK,CAAC;AAAA,IACJ,EAAI,EAAA,OAAA;AAAA,IACJ,KAAO,EAAA;AAAA,GACN,EAAA;AAAA,IACD,EAAI,EAAA,eAAA;AAAA,IACJ,KAAO,EAAA;AAAA,GACR;AACH,CAAC;AAGM,SAAS,WAAW,EAA8C,EAAA;AACvE,EAAI,IAAA,EAAA,KAAO,iBAAwB,OAAA,OAAA;AACnC,EAAI,IAAA,EAAA,KAAO,SAAS,EAAO,KAAA,WAAA,IAAe,OAAO,eAAmB,IAAA,EAAA,KAAO,kBAAyB,OAAA,OAAA;AACpG,EAAO,OAAA,OAAA;AACT;AACO,MAAM,YAAqD,GAAA;AAAA,EAChE,OAAS,EAAA,gCAAA;AAAA,EACT,IAAM,EAAA,kCAAA;AAAA,EACN,aAAe,EAAA,oCAAA;AAAA,EACf,WAAa,EAAA,+BAAA;AAAA,EACb,KAAO,EAAA;AACT"}
@@ -0,0 +1,82 @@
1
+ var _a;
2
+ let AsyncStorage = null;
3
+ try {
4
+ AsyncStorage = (_a = require("@react-native-async-storage/async-storage").default) != null ? _a : null;
5
+ } catch (e) {
6
+ AsyncStorage = null;
7
+ }
8
+ const STORAGE_KEY = "yantra.canvas-video-projects.v1";
9
+ let memory = [];
10
+ let lastWritten = "";
11
+ function newVideoProjectId() {
12
+ return `vp-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;
13
+ }
14
+ function projectHasWork(timeline) {
15
+ return timeline.clips.length > 0 || timeline.texts.length > 0 || Boolean(timeline.soundtrack || timeline.voiceover);
16
+ }
17
+ function relativeProjectTime(ts) {
18
+ const mins = Math.round((Date.now() - ts) / 6e4);
19
+ if (mins < 1) return "just now";
20
+ if (mins < 60) return `${mins}m ago`;
21
+ if (mins < 24 * 60) return `${Math.round(mins / 60)}h ago`;
22
+ if (mins < 7 * 24 * 60) return `${Math.round(mins / (60 * 24))}d ago`;
23
+ return new Date(ts).toLocaleDateString();
24
+ }
25
+ function isProject(value) {
26
+ if (!value || typeof value !== "object") return false;
27
+ const row = value;
28
+ return typeof row.id === "string" && row.id.length > 0 && Boolean(row.timeline) && Array.isArray(row.timeline.clips);
29
+ }
30
+ function parseVideoProjects(raw) {
31
+ if (!raw) return [];
32
+ try {
33
+ const parsed = JSON.parse(raw);
34
+ const list = Array.isArray(parsed.projects) ? parsed.projects : Array.isArray(parsed) ? parsed : [];
35
+ return list.filter(isProject);
36
+ } catch (e) {
37
+ return [];
38
+ }
39
+ }
40
+ async function loadVideoProjects() {
41
+ if (memory.length) return memory;
42
+ if (!AsyncStorage) return memory;
43
+ try {
44
+ const raw = await AsyncStorage.getItem(STORAGE_KEY);
45
+ if (memory.length) return memory;
46
+ memory = parseVideoProjects(raw);
47
+ lastWritten = raw != null ? raw : lastWritten;
48
+ return memory;
49
+ } catch (e) {
50
+ return memory;
51
+ }
52
+ }
53
+ function persistVideoProjects(rows) {
54
+ memory = rows;
55
+ const raw = JSON.stringify({
56
+ projects: rows
57
+ });
58
+ if (raw === lastWritten) return;
59
+ lastWritten = raw;
60
+ void (AsyncStorage == null ? void 0 : AsyncStorage.setItem(STORAGE_KEY, raw).catch(() => {
61
+ }));
62
+ }
63
+ function upsertVideoProject(rows, next) {
64
+ const without = rows.filter((row) => row.id !== next.id);
65
+ return [next, ...without].sort((a, b) => b.updatedAt - a.updatedAt);
66
+ }
67
+ function snapshotProject(id, title, timeline, logoSrc) {
68
+ var _a2, _b;
69
+ return {
70
+ id,
71
+ title: title.trim() || "Untitled project",
72
+ timeline: {
73
+ clips: [...timeline.clips],
74
+ texts: [...timeline.texts],
75
+ segments: timeline.segments ? [...timeline.segments] : [],
76
+ voiceover: (_a2 = timeline.voiceover) != null ? _a2 : null,
77
+ soundtrack: (_b = timeline.soundtrack) != null ? _b : null
78
+ },
79
+ logoSrc,
80
+ updatedAt: Date.now()
81
+ };
82
+ }export{loadVideoProjects,newVideoProjectId,parseVideoProjects,persistVideoProjects,projectHasWork,relativeProjectTime,snapshotProject,upsertVideoProject};//# sourceMappingURL=videoProjectsStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"videoProjectsStore.js","sources":["../../../../src/features/canvas/videoEditor/videoProjectsStore.ts"],"sourcesContent":["/**\n * Saved video-editor timelines — native twin of canvas-surface ProjectsPanel.\n * Disk is best-effort (same guarded AsyncStorage as canvas board snapshots).\n */\nimport { emptyTimeline, type EditorTimeline } from './editorModel';\n\ntype StorageLike = { getItem(key: string): Promise<string | null>; setItem(key: string, value: string): Promise<void> };\nlet AsyncStorage: StorageLike | null = null;\ntry {\n // eslint-disable-next-line @typescript-eslint/no-require-imports, global-require\n AsyncStorage = require('@react-native-async-storage/async-storage').default ?? null;\n} catch {\n AsyncStorage = null;\n}\n\nconst STORAGE_KEY = 'yantra.canvas-video-projects.v1';\n\nexport type SavedVideoProject = {\n id: string;\n title: string;\n timeline: EditorTimeline;\n logoSrc: string | null;\n updatedAt: number;\n};\n\nlet memory: SavedVideoProject[] = [];\nlet lastWritten = '';\n\nexport function newVideoProjectId(): string {\n return `vp-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\nexport function projectHasWork(timeline: EditorTimeline): boolean {\n return timeline.clips.length > 0 || timeline.texts.length > 0 || Boolean(timeline.soundtrack || timeline.voiceover);\n}\n\nexport function relativeProjectTime(ts: number): string {\n const mins = Math.round((Date.now() - ts) / 60000);\n if (mins < 1) return 'just now';\n if (mins < 60) return `${mins}m ago`;\n if (mins < 24 * 60) return `${Math.round(mins / 60)}h ago`;\n if (mins < 7 * 24 * 60) return `${Math.round(mins / (60 * 24))}d ago`;\n return new Date(ts).toLocaleDateString();\n}\n\nfunction isProject(value: unknown): value is SavedVideoProject {\n if (!value || typeof value !== 'object') return false;\n const row = value as SavedVideoProject;\n return (\n typeof row.id === 'string' && row.id.length > 0 && Boolean(row.timeline) && Array.isArray(row.timeline.clips)\n );\n}\n\nexport function parseVideoProjects(raw: string | null | undefined): SavedVideoProject[] {\n if (!raw) return [];\n try {\n const parsed = JSON.parse(raw) as { projects?: unknown };\n const list = Array.isArray(parsed.projects) ? parsed.projects : Array.isArray(parsed) ? parsed : [];\n return list.filter(isProject);\n } catch {\n return [];\n }\n}\n\nexport async function loadVideoProjects(): Promise<SavedVideoProject[]> {\n if (memory.length) return memory;\n if (!AsyncStorage) return memory;\n try {\n const raw = await AsyncStorage.getItem(STORAGE_KEY);\n if (memory.length) return memory;\n memory = parseVideoProjects(raw);\n lastWritten = raw ?? lastWritten;\n return memory;\n } catch {\n return memory;\n }\n}\n\nexport function persistVideoProjects(rows: SavedVideoProject[]): void {\n memory = rows;\n const raw = JSON.stringify({ projects: rows });\n if (raw === lastWritten) return;\n lastWritten = raw;\n void AsyncStorage?.setItem(STORAGE_KEY, raw).catch(() => {\n /* disk write is best-effort */\n });\n}\n\nexport function upsertVideoProject(rows: SavedVideoProject[], next: SavedVideoProject): SavedVideoProject[] {\n const without = rows.filter((row) => row.id !== next.id);\n return [next, ...without].sort((a, b) => b.updatedAt - a.updatedAt);\n}\n\nexport function snapshotProject(\n id: string,\n title: string,\n timeline: EditorTimeline,\n logoSrc: string | null,\n): SavedVideoProject {\n return {\n id,\n title: title.trim() || 'Untitled project',\n timeline: {\n clips: [...timeline.clips],\n texts: [...timeline.texts],\n segments: timeline.segments ? [...timeline.segments] : [],\n voiceover: timeline.voiceover ?? null,\n soundtrack: timeline.soundtrack ?? null,\n },\n logoSrc,\n updatedAt: Date.now(),\n };\n}\n\nexport { emptyTimeline };\n"],"names":["_a"],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ let renderer = null;
2
+ function getVideoItemRenderer() {
3
+ return renderer;
4
+ }
5
+ let previewRenderer = null;
6
+ function getVideoPreviewRenderer() {
7
+ return previewRenderer;
8
+ }export{getVideoItemRenderer,getVideoPreviewRenderer};//# sourceMappingURL=videoRenderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"videoRenderer.js","sources":["../../../src/features/canvas/videoRenderer.ts"],"sourcesContent":["/**\n * Injection seam for how a video item is DRAWN - the same pattern as\n * nativeViewerRegistry: the shared feature code cannot import expo-video\n * (the Expo lane does not ship it), so whoever CAN provides the renderer at\n * module scope and the viewer reads it back. Unset, video items render the\n * glyph tile they always have.\n */\nimport type { ComponentType } from 'react';\nimport type { CanvasItem } from './canvasCore';\n\nexport interface VideoItemRendererProps {\n item: CanvasItem;\n}\n\nlet renderer: ComponentType<VideoItemRendererProps> | null = null;\n\nexport function registerVideoItemRenderer(component: ComponentType<VideoItemRendererProps>): void {\n renderer = component;\n}\n\nexport function getVideoItemRenderer(): ComponentType<VideoItemRendererProps> | null {\n return renderer;\n}\n\n/**\n * Editor preview contract - the transport the video editor drives. The\n * implementation owns the player; the editor owns the state. Every field is\n * something the player can honestly reproduce on device (playbackRate,\n * volume, trim-window looping); anything it cannot (speed curves, real\n * filter grades) stays in the export spec for the render service.\n */\nexport interface VideoPreviewProps {\n src: string;\n playing: boolean;\n /** Constant playback rate the preview applies directly. */\n rate: number;\n /** 0..1 */\n volume: number;\n muted: boolean;\n /** Loop window in source seconds; end null = source end. */\n trimStartSec: number;\n trimEndSec: number | null;\n /** Template sample preview (web `<video controls loop autoPlay>`). */\n nativeControls?: boolean;\n loop?: boolean;\n onReady?: () => void;\n /** Seek request: bump `scrubNonce` with a new `scrubToSec` to seek. */\n scrubToSec?: number | null;\n scrubNonce?: number;\n /** ~4Hz progress + the source duration once known (editor learns real\n * video lengths through this). */\n onTime?: (currentSec: number, durationSec: number) => void;\n}\n\nlet previewRenderer: ComponentType<VideoPreviewProps> | null = null;\n\nexport function registerVideoPreviewRenderer(component: ComponentType<VideoPreviewProps>): void {\n previewRenderer = component;\n}\n\nexport function getVideoPreviewRenderer(): ComponentType<VideoPreviewProps> | null {\n return previewRenderer;\n}\n\n/** Web twin: HTML5 `<video controls autoPlay muted loop playsInline>`. */\nexport interface TemplateSampleProps {\n src: string;\n poster?: string;\n}\n\nlet templateSampleRenderer: ComponentType<TemplateSampleProps> | null = null;\n\nexport function registerTemplateSampleRenderer(component: ComponentType<TemplateSampleProps>): void {\n templateSampleRenderer = component;\n}\n\nexport function getTemplateSampleRenderer(): ComponentType<TemplateSampleProps> | null {\n return templateSampleRenderer;\n}\n"],"names":[],"mappings":"AAYA,IAAI,QAAyD,GAAA,IAAA;AAItD,SAAS,oBAAqE,GAAA;AACnF,EAAO,OAAA,QAAA;AACT;AA+BA,IAAI,eAA2D,GAAA,IAAA;AAIxD,SAAS,uBAAmE,GAAA;AACjF,EAAO,OAAA,eAAA;AACT"}
@@ -1,4 +1,4 @@
1
- import {jsx}from'react/jsx-runtime';import React from'react';var __defProp = Object.defineProperty;
1
+ import {jsx}from'react/jsx-runtime';import React__default from'react';var __defProp = Object.defineProperty;
2
2
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
3
  var __publicField = (obj, key, value) => __defNormalProp(obj, key + "" , value);
4
4
  const ZERO_INSETS = {
@@ -23,7 +23,7 @@ function useSafeInsets() {
23
23
  }
24
24
  return ZERO_INSETS;
25
25
  }
26
- class ProviderBoundary extends React.Component {
26
+ class ProviderBoundary extends React__default.Component {
27
27
  constructor() {
28
28
  super(...arguments);
29
29
  __publicField(this, "state", {
@@ -1 +1 @@
1
- {"version":3,"file":"withRemoteSafeArea.js","sources":["../../../src/features/canvas/withRemoteSafeArea.tsx"],"sourcesContent":["import React from 'react';\n\n/**\n * Safe-area access for code that ships inside a federated remote.\n *\n * react-native-safe-area-context is NOT a federation shared singleton (and\n * must not become one: a remote built `import: false` would fail with\n * RUNTIME-012 on every installed binary whose host bundle never shared it).\n * So the remote bundles its own copy, and two distinct failure modes follow,\n * both observed on device/sim:\n *\n * 1. The remote copy's SafeAreaInsetsContext is a different object from the\n * host's, so the host's <SafeAreaProvider> can never satisfy a\n * useSafeAreaInsets call made inside the remote - it throws \"No safe area\n * value available\" and the surface-level error boundary turns that into a\n * whole-surface \"Canvas surface unavailable\".\n * 2. On some hosts (bare-RN release harness), merely EVALUATING the remote's\n * copy is fatal: its native-component spec registers RNCSafeAreaProvider a\n * second time and React Native throws \"Tried to register two views with\n * the same name\".\n *\n * Therefore NOTHING in the remote may import the library top-level. This\n * module is the single guarded entry: the library is require'd once in a\n * try/catch, consumers take `useSafeInsets()` (never the library hook), and\n * `withRemoteSafeArea` mounts the remote copy's own provider when it loaded -\n * its native measurement works from any JS copy - or a pure-JS zero-inset\n * fallback when it did not.\n */\n\ntype Insets = { top: number; bottom: number; left: number; right: number };\n\nconst ZERO_INSETS: Insets = { top: 0, bottom: 0, left: 0, right: 0 };\n\ntype SafeAreaLib = {\n SafeAreaProvider: React.ComponentType<{ initialMetrics?: unknown; children?: React.ReactNode }>;\n useSafeAreaInsets: () => Insets;\n initialWindowMetrics?: unknown;\n};\n\nlet lib: SafeAreaLib | null = null;\ntry {\n // eslint-disable-next-line @typescript-eslint/no-require-imports, global-require\n lib = require('react-native-safe-area-context');\n} catch {\n lib = null;\n}\n\n/**\n * Insets that never throw: the library's value when its provider is reachable,\n * zero insets otherwise. Library presence is constant for the process, so the\n * hook call order is stable.\n */\nexport function useSafeInsets(): Insets {\n if (lib) {\n try {\n return lib.useSafeAreaInsets();\n } catch {\n return ZERO_INSETS;\n }\n }\n return ZERO_INSETS;\n}\n\n/** Probes whether the (remote-copy) insets context is already provided. */\nfunction insetsReachable(): boolean {\n try {\n lib!.useSafeAreaInsets();\n return true;\n } catch {\n return false;\n }\n}\n\nclass ProviderBoundary extends React.Component<{ children: React.ReactNode }, { failed: boolean }> {\n state = { failed: false };\n\n static getDerivedStateFromError() {\n return { failed: true };\n }\n\n render() {\n if (this.state.failed || !lib) {\n // Consumers reach insets via useSafeInsets(), which degrades to\n // zero on its own - a plain passthrough is enough here.\n return this.props.children;\n }\n const Provider = lib.SafeAreaProvider;\n return <Provider initialMetrics={lib.initialWindowMetrics ?? undefined}>{this.props.children}</Provider>;\n }\n}\n\nexport function withRemoteSafeArea<P extends object>(Component: React.ComponentType<P>): React.ComponentType<P> {\n function RemoteSafeArea(props: P) {\n // Library presence is process-constant, so the conditional hook call\n // inside insetsReachable keeps a stable order across renders.\n if (lib && insetsReachable()) {\n return <Component {...props} />;\n }\n return (\n <ProviderBoundary>\n <Component {...props} />\n </ProviderBoundary>\n );\n }\n RemoteSafeArea.displayName = `withRemoteSafeArea(${Component.displayName || Component.name || 'Component'})`;\n return RemoteSafeArea;\n}\n"],"names":[],"mappings":";;;AAmCA,MAAM,WAAsB,GAAA;AAAA,EAC1B,GAAK,EAAA,CAAA;AAAA,EACL,MAAQ,EAAA,CAAA;AAAA,EACR,IAAM,EAAA,CAAA;AAAA,EACN,KAAO,EAAA;AACT,CAAA;AASA,IAAI,GAA0B,GAAA,IAAA;AAC9B,IAAI;AAEF,EAAA,GAAA,GAAM,QAAQ,gCAAgC,CAAA;AAChD,CAAQ,CAAA,OAAA,CAAA,EAAA;AACN,EAAM,GAAA,GAAA,IAAA;AACR;AAOO,SAAS,aAAwB,GAAA;AACtC,EAAA,IAAI,GAAK,EAAA;AACP,IAAI,IAAA;AACF,MAAA,OAAO,IAAI,iBAAkB,EAAA;AAAA,KACvB,CAAA,OAAA,CAAA,EAAA;AACN,MAAO,OAAA,WAAA;AAAA;AACT;AAEF,EAAO,OAAA,WAAA;AACT;AAWA,MAAM,gBAAA,SAAyB,MAAM,SAIlC,CAAA;AAAA,EAJH,WAAA,GAAA;AAAA,IAAA,KAAA,CAAA,GAAA,SAAA,CAAA;AAKE,IAAQ,aAAA,CAAA,IAAA,EAAA,OAAA,EAAA;AAAA,MACN,MAAQ,EAAA;AAAA,KACV,CAAA;AAAA;AAAA,EACA,OAAO,wBAA2B,GAAA;AAChC,IAAO,OAAA;AAAA,MACL,MAAQ,EAAA;AAAA,KACV;AAAA;AACF,EACA,MAAS,GAAA;AA/FX,IAAA,IAAA,EAAA;AAgGI,IAAA,IAAI,IAAK,CAAA,KAAA,CAAM,MAAU,IAAA,CAAC,GAAK,EAAA;AAG7B,MAAA,OAAO,KAAK,KAAM,CAAA,QAAA;AAAA;AAEpB,IAAA,MAAM,WAAW,GAAI,CAAA,gBAAA;AACrB,IAAO,uBAAA,GAAA,CAAC,YAAS,cAAgB,EAAA,CAAA,EAAA,GAAA,GAAA,CAAI,yBAAJ,IAA4B,GAAA,EAAA,GAAA,MAAA,EAAY,QAAK,EAAA,IAAA,CAAA,KAAA,CAAM,QAAS,EAAA,CAAA;AAAA;AAEjG"}
1
+ {"version":3,"file":"withRemoteSafeArea.js","sources":["../../../src/features/canvas/withRemoteSafeArea.tsx"],"sourcesContent":["import React from 'react';\n\n/**\n * Safe-area access for code that ships inside a federated remote.\n *\n * react-native-safe-area-context is NOT a federation shared singleton (and\n * must not become one: a remote built `import: false` would fail with\n * RUNTIME-012 on every installed binary whose host bundle never shared it).\n * So the remote bundles its own copy, and two distinct failure modes follow,\n * both observed on device/sim:\n *\n * 1. The remote copy's SafeAreaInsetsContext is a different object from the\n * host's, so the host's <SafeAreaProvider> can never satisfy a\n * useSafeAreaInsets call made inside the remote - it throws \"No safe area\n * value available\" and the surface-level error boundary turns that into a\n * whole-surface \"Canvas surface unavailable\".\n * 2. On some hosts (bare-RN release harness), merely EVALUATING the remote's\n * copy is fatal: its native-component spec registers RNCSafeAreaProvider a\n * second time and React Native throws \"Tried to register two views with\n * the same name\".\n *\n * Therefore NOTHING in the remote may import the library top-level. This\n * module is the single guarded entry: the library is require'd once in a\n * try/catch, consumers take `useSafeInsets()` (never the library hook), and\n * `withRemoteSafeArea` mounts the remote copy's own provider when it loaded -\n * its native measurement works from any JS copy - or a pure-JS zero-inset\n * fallback when it did not.\n */\n\ntype Insets = { top: number; bottom: number; left: number; right: number };\n\nconst ZERO_INSETS: Insets = { top: 0, bottom: 0, left: 0, right: 0 };\n\ntype SafeAreaLib = {\n SafeAreaProvider: React.ComponentType<{ initialMetrics?: unknown; children?: React.ReactNode }>;\n useSafeAreaInsets: () => Insets;\n initialWindowMetrics?: unknown;\n};\n\nlet lib: SafeAreaLib | null = null;\ntry {\n // eslint-disable-next-line @typescript-eslint/no-require-imports, global-require\n lib = require('react-native-safe-area-context');\n} catch {\n lib = null;\n}\n\n/**\n * Insets that never throw: the library's value when its provider is reachable,\n * zero insets otherwise. Library presence is constant for the process, so the\n * hook call order is stable.\n */\nexport function useSafeInsets(): Insets {\n if (lib) {\n try {\n return lib.useSafeAreaInsets();\n } catch {\n return ZERO_INSETS;\n }\n }\n return ZERO_INSETS;\n}\n\n/** Probes whether the (remote-copy) insets context is already provided. */\nfunction insetsReachable(): boolean {\n try {\n lib!.useSafeAreaInsets();\n return true;\n } catch {\n return false;\n }\n}\n\nclass ProviderBoundary extends React.Component<{ children: React.ReactNode }, { failed: boolean }> {\n state = { failed: false };\n\n static getDerivedStateFromError() {\n return { failed: true };\n }\n\n render() {\n if (this.state.failed || !lib) {\n // Consumers reach insets via useSafeInsets(), which degrades to\n // zero on its own - a plain passthrough is enough here.\n return this.props.children;\n }\n const Provider = lib.SafeAreaProvider;\n return <Provider initialMetrics={lib.initialWindowMetrics ?? undefined}>{this.props.children}</Provider>;\n }\n}\n\nexport function withRemoteSafeArea<P extends object>(Component: React.ComponentType<P>): React.ComponentType<P> {\n function RemoteSafeArea(props: P) {\n // Library presence is process-constant, so the conditional hook call\n // inside insetsReachable keeps a stable order across renders.\n if (lib && insetsReachable()) {\n return <Component {...props} />;\n }\n return (\n <ProviderBoundary>\n <Component {...props} />\n </ProviderBoundary>\n );\n }\n RemoteSafeArea.displayName = `withRemoteSafeArea(${Component.displayName || Component.name || 'Component'})`;\n return RemoteSafeArea;\n}\n"],"names":["React"],"mappings":";;;AAmCA,MAAM,WAAsB,GAAA;AAAA,EAC1B,GAAK,EAAA,CAAA;AAAA,EACL,MAAQ,EAAA,CAAA;AAAA,EACR,IAAM,EAAA,CAAA;AAAA,EACN,KAAO,EAAA;AACT,CAAA;AASA,IAAI,GAA0B,GAAA,IAAA;AAC9B,IAAI;AAEF,EAAA,GAAA,GAAM,QAAQ,gCAAgC,CAAA;AAChD,CAAQ,CAAA,OAAA,CAAA,EAAA;AACN,EAAM,GAAA,GAAA,IAAA;AACR;AAOO,SAAS,aAAwB,GAAA;AACtC,EAAA,IAAI,GAAK,EAAA;AACP,IAAI,IAAA;AACF,MAAA,OAAO,IAAI,iBAAkB,EAAA;AAAA,KACvB,CAAA,OAAA,CAAA,EAAA;AACN,MAAO,OAAA,WAAA;AAAA;AACT;AAEF,EAAO,OAAA,WAAA;AACT;AAWA,MAAM,gBAAA,SAAyBA,eAAM,SAIlC,CAAA;AAAA,EAJH,WAAA,GAAA;AAAA,IAAA,KAAA,CAAA,GAAA,SAAA,CAAA;AAKE,IAAQ,aAAA,CAAA,IAAA,EAAA,OAAA,EAAA;AAAA,MACN,MAAQ,EAAA;AAAA,KACV,CAAA;AAAA;AAAA,EACA,OAAO,wBAA2B,GAAA;AAChC,IAAO,OAAA;AAAA,MACL,MAAQ,EAAA;AAAA,KACV;AAAA;AACF,EACA,MAAS,GAAA;AA/FX,IAAA,IAAA,EAAA;AAgGI,IAAA,IAAI,IAAK,CAAA,KAAA,CAAM,MAAU,IAAA,CAAC,GAAK,EAAA;AAG7B,MAAA,OAAO,KAAK,KAAM,CAAA,QAAA;AAAA;AAEpB,IAAA,MAAM,WAAW,GAAI,CAAA,gBAAA;AACrB,IAAO,uBAAA,GAAA,CAAC,YAAS,cAAgB,EAAA,CAAA,EAAA,GAAA,GAAA,CAAI,yBAAJ,IAA4B,GAAA,EAAA,GAAA,MAAA,EAAY,QAAK,EAAA,IAAA,CAAA,KAAA,CAAM,QAAS,EAAA,CAAA;AAAA;AAEjG"}
@@ -0,0 +1,14 @@
1
+ function characterSubgraphUrl(graphqlUrl, explicit) {
2
+ const override = (explicit || "").trim();
3
+ if (override) return override;
4
+ const match = (graphqlUrl || "").trim().match(/^(https?:)\/\/([^/]+)/i);
5
+ if (!match) return "";
6
+ const labels = match[2].split(".");
7
+ if (labels.length < 3) return "";
8
+ return `${match[1]}//character-subgraph.${labels.slice(1).join(".")}/graphql`;
9
+ }
10
+ function shouldLoadCharacterStudioRemote(env) {
11
+ if (env.isExpoGo) return false;
12
+ if (!env.isDev) return true;
13
+ return Boolean((env.devRemoteUrl || "").trim());
14
+ }export{characterSubgraphUrl,shouldLoadCharacterStudioRemote};//# sourceMappingURL=characterStudioProps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"characterStudioProps.js","sources":["../../../src/features/characters/characterStudioProps.ts"],"sourcesContent":["/**\n * The prop contract the federated character STUDIO remote\n * (`characters_native/Characters`, character-surfaces PR #66) expects from a\n * host. It replaces the old gallery contract (`manifestUrl` + `onStartChat`):\n * the studio is self-contained - Discover / Chats / Create / Edit / Chat all\n * live in the remote - and instead needs the host to lend it the things a\n * zero-native-code remote cannot do for itself. See character-surfaces#67.\n *\n * Every seam except `subgraphUrl` is optional by design: a host that omits one\n * gets a working surface with reduced behaviour, never a crash.\n */\nexport interface CharacterStudioProps {\n /** Surface session JWT the character subgraph + connector lane accept. */\n token?: string | null;\n /** Character community subgraph GraphQL endpoint (Discover, publish, edit). */\n subgraphUrl: string;\n /**\n * Connector runner - auth + transport stay host-side. The studio calls two\n * connectors: `yantra-character` (everything generative) and\n * `yantra-voicebox` (`YANTRA_VOICEBOX_SPEAK`, reading replies aloud).\n */\n runAction?: (\n connector: string,\n action: string,\n params: Record<string, unknown>,\n ) => Promise<Record<string, unknown>>;\n /** Durable per-device key/value: chat settings + transcripts survive relaunch. */\n storage?: {\n get(key: string): Promise<string | null>;\n set(key: string, value: string): Promise<void>;\n remove(key: string): Promise<void>;\n };\n /** In-app clip playback for spoken replies; without it a line opens in the system player. */\n playAudio?: (url: string) => Promise<void>;\n testID?: string;\n}\n\n/**\n * Where the character community subgraph lives, given a backend GraphQL URL:\n * swap the backend host's first DNS label (`ideback.x.y` → `character-subgraph.x.y`)\n * - the same convention the character surfaces use. Returns '' if the URL has no\n * derivable host. `explicit` (an env pin) always wins.\n *\n * Kept here next to the contract so the host and the character code cannot drift\n * on the derivation; env-config resolves it per-build via the same rule.\n */\nexport function characterSubgraphUrl(graphqlUrl: string, explicit?: string): string {\n const override = (explicit || '').trim();\n if (override) return override;\n const match = (graphqlUrl || '').trim().match(/^(https?:)\\/\\/([^/]+)/i);\n if (!match) return '';\n const labels = match[2].split('.');\n if (labels.length < 3) return '';\n return `${match[1]}//character-subgraph.${labels.slice(1).join('.')}/graphql`;\n}\n\n/**\n * Whether this build should try to fetch the studio remote at all.\n *\n * The studio has NO in-repo copy - it lives only in `characters_native/Characters`\n * - so when this is false the host has nothing to render but a placeholder.\n *\n * Three rules, and the middle one is the non-obvious one:\n * - Expo Go carries no federation runtime, so it can never load a remote.\n * - A DEV build can, but only a DEV-BUILT remote: production JSX elements carry\n * no `_store`, which dev React's Children validation dereferences, so pulling\n * the deployed studio into `yarn ios` crashes instead of rendering. DEV\n * therefore waits to be pointed at a remote rather than going looking.\n * - A release build always loads the deployed studio; the dev pin is irrelevant.\n *\n * Pure so the decision is testable without a renderer - it is the difference\n * between a working screen and a permanent placeholder, which is exactly the bug\n * this replaced: DEV refused unconditionally, and the placeholder advertised an\n * override the code never read.\n */\nexport function shouldLoadCharacterStudioRemote(env: {\n isDev: boolean;\n isExpoGo: boolean;\n devRemoteUrl?: string | null;\n}): boolean {\n if (env.isExpoGo) return false;\n if (!env.isDev) return true;\n return Boolean((env.devRemoteUrl || '').trim());\n}\n"],"names":[],"mappings":"AA0CgB,SAAA,oBAAA,CAAqB,YAAoB,QAA2B,EAAA;AAClF,EAAM,MAAA,QAAA,GAAA,CAAY,QAAY,IAAA,EAAA,EAAI,IAAK,EAAA;AACvC,EAAA,IAAI,UAAiB,OAAA,QAAA;AACrB,EAAA,MAAM,SAAS,UAAc,IAAA,EAAA,EAAI,IAAK,EAAA,CAAE,MAAM,wBAAwB,CAAA;AACtE,EAAI,IAAA,CAAC,OAAc,OAAA,EAAA;AACnB,EAAA,MAAM,MAAS,GAAA,KAAA,CAAM,CAAC,CAAA,CAAE,MAAM,GAAG,CAAA;AACjC,EAAI,IAAA,MAAA,CAAO,MAAS,GAAA,CAAA,EAAU,OAAA,EAAA;AAC9B,EAAO,OAAA,CAAA,EAAG,KAAM,CAAA,CAAC,CAAC,CAAA,qBAAA,EAAwB,MAAO,CAAA,KAAA,CAAM,CAAC,CAAA,CAAE,IAAK,CAAA,GAAG,CAAC,CAAA,QAAA,CAAA;AACrE;AAqBO,SAAS,gCAAgC,GAIpC,EAAA;AACV,EAAI,IAAA,GAAA,CAAI,UAAiB,OAAA,KAAA;AACzB,EAAI,IAAA,CAAC,GAAI,CAAA,KAAA,EAAc,OAAA,IAAA;AACvB,EAAA,OAAO,OAAS,CAAA,CAAA,GAAA,CAAI,YAAgB,IAAA,EAAA,EAAI,MAAM,CAAA;AAChD"}
@@ -1,4 +1,9 @@
1
- import {jsxs,jsx}from'react/jsx-runtime';import {memo,useState,useRef,useEffect,useCallback}from'react';import {Clipboard,Share,View,StyleSheet,Pressable,Platform}from'react-native';import {Feather}from'@expo/vector-icons';import {Text}from'@admin-layout/gluestack-ui-mobile';const ChatCodeBlock = memo(function ChatCodeBlock2({
1
+ import {jsxs,jsx}from'react/jsx-runtime';import {memo,useState,useRef,useEffect,useCallback}from'react';import {Clipboard,Share,View,StyleSheet,Pressable,Platform}from'react-native';import {Feather}from'@expo/vector-icons';import {Text}from'@admin-layout/gluestack-ui-mobile';function snippetExtension(language) {
2
+ if (language === "jsx" || language === "tsx") return "tsx";
3
+ if (language === "js" || language === "ts") return "ts";
4
+ return "txt";
5
+ }
6
+ const ChatCodeBlock = memo(function ChatCodeBlock2({
2
7
  language,
3
8
  code,
4
9
  isDark = false
@@ -17,10 +22,9 @@ import {jsxs,jsx}from'react/jsx-runtime';import {memo,useState,useRef,useEffect,
17
22
  copiedTimer.current = setTimeout(() => setCopied(false), 2e3);
18
23
  }, [body]);
19
24
  const handleDownload = useCallback(() => {
20
- const ext = language === "jsx" || language === "tsx" ? "tsx" : language === "js" || language === "ts" ? "ts" : "txt";
21
25
  void Share.share({
22
26
  message: body,
23
- title: `snippet.${ext}`
27
+ title: `snippet.${snippetExtension(language)}`
24
28
  });
25
29
  }, [body, language]);
26
30
  const border = isDark ? "rgba(148, 163, 184, 0.28)" : "#ebeef3";
@@ -1 +1 @@
1
- {"version":3,"file":"ChatCodeBlock.js","sources":["../../../src/features/chat/ChatCodeBlock.tsx"],"sourcesContent":["import React, { memo, useCallback, useEffect, useRef, useState } from 'react';\nimport { Platform, Pressable, Share, StyleSheet, View } from 'react-native';\n// eslint-disable-next-line @typescript-eslint/no-deprecated\nimport { Clipboard } from 'react-native';\nimport { Feather } from '@expo/vector-icons';\nimport { Text } from '@admin-layout/gluestack-ui-mobile';\n\n/**\n * Same chrome as web `CodeBlockWithActions` in tailwind-chat-pro: language\n * header, wrapping monospace body, copy + share/download. Long lines wrap\n * (browser `whitespace-pre-wrap`) instead of a nested horizontal ScrollView,\n * which collapsed the card to empty height inside the transcript list.\n */\nexport const ChatCodeBlock = memo(function ChatCodeBlock({\n language,\n code,\n isDark = false,\n}: {\n language?: string;\n code: string;\n isDark?: boolean;\n}) {\n const label = ((language || 'code').trim() || 'code').toUpperCase();\n const body = code.replace(/\\n$/, '');\n const [copied, setCopied] = useState(false);\n const copiedTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n useEffect(\n () => () => {\n if (copiedTimer.current) clearTimeout(copiedTimer.current);\n },\n [],\n );\n\n const handleCopy = useCallback(() => {\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n Clipboard.setString(body);\n setCopied(true);\n if (copiedTimer.current) clearTimeout(copiedTimer.current);\n copiedTimer.current = setTimeout(() => setCopied(false), 2000);\n }, [body]);\n\n const handleDownload = useCallback(() => {\n const ext =\n language === 'jsx' || language === 'tsx' ? 'tsx' : language === 'js' || language === 'ts' ? 'ts' : 'txt';\n void Share.share({ message: body, title: `snippet.${ext}` });\n }, [body, language]);\n\n const border = isDark ? 'rgba(148, 163, 184, 0.28)' : '#ebeef3';\n const headerBg = isDark ? 'rgba(148, 163, 184, 0.10)' : '#f6f7f8';\n const bodyBg = isDark ? '#171a20' : '#ffffff';\n const muted = isDark ? '#94a3b8' : '#667085';\n const ink = isDark ? '#f3f5f8' : '#121926';\n\n return (\n <View style={[styles.wrap, { borderColor: border, backgroundColor: bodyBg }]}>\n <View style={[styles.header, { backgroundColor: headerBg, borderBottomColor: border }]}>\n <Text style={[styles.lang, { color: muted }]}>{label}</Text>\n <Pressable\n onPress={handleCopy}\n hitSlop={8}\n accessibilityRole=\"button\"\n accessibilityLabel={copied ? 'Copied' : 'Copy code'}\n >\n <Feather name={copied ? 'check' : 'copy'} size={14} color={copied ? '#10b981' : muted} />\n </Pressable>\n </View>\n <Text selectable style={[styles.code, { color: ink }]}>\n {body}\n </Text>\n <View style={styles.footer}>\n <Pressable\n onPress={handleCopy}\n hitSlop={8}\n accessibilityRole=\"button\"\n accessibilityLabel={copied ? 'Copied' : 'Copy code'}\n style={styles.footerBtn}\n >\n <Feather name={copied ? 'check' : 'copy'} size={15} color={copied ? '#10b981' : muted} />\n </Pressable>\n <Pressable\n onPress={handleDownload}\n hitSlop={8}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Share code\"\n style={styles.footerBtn}\n >\n <Feather name=\"download\" size={15} color={muted} />\n </Pressable>\n </View>\n </View>\n );\n});\n\nconst styles = StyleSheet.create({\n wrap: {\n alignSelf: 'stretch',\n flexGrow: 0,\n borderWidth: 1,\n borderRadius: 14,\n overflow: 'hidden',\n marginVertical: 12,\n },\n header: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingHorizontal: 12,\n paddingVertical: 8,\n borderBottomWidth: 1,\n },\n lang: {\n fontSize: 10,\n fontWeight: '600',\n letterSpacing: 0.6,\n },\n code: {\n fontFamily: Platform.OS === 'ios' ? 'Menlo' : 'monospace',\n fontSize: 13,\n lineHeight: 20,\n paddingHorizontal: 16,\n paddingTop: 14,\n paddingBottom: 8,\n },\n footer: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 10,\n paddingBottom: 10,\n },\n footerBtn: {\n padding: 6,\n marginRight: 4,\n borderRadius: 6,\n },\n});\n"],"names":["ChatCodeBlock"],"mappings":"oRAaa,MAAA,aAAA,GAAgB,IAAK,CAAA,SAASA,cAAc,CAAA;AAAA,EACvD,QAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAS,GAAA;AACX,CAIG,EAAA;AACD,EAAA,MAAM,UAAU,QAAY,IAAA,MAAA,EAAQ,IAAK,EAAA,IAAK,QAAQ,WAAY,EAAA;AAClE,EAAA,MAAM,IAAO,GAAA,IAAA,CAAK,OAAQ,CAAA,KAAA,EAAO,EAAE,CAAA;AACnC,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAS,KAAK,CAAA;AAC1C,EAAM,MAAA,WAAA,GAAc,OAA6C,IAAI,CAAA;AACrE,EAAA,SAAA,CAAU,MAAM,MAAM;AACpB,IAAA,IAAI,WAAY,CAAA,OAAA,EAAsB,YAAA,CAAA,WAAA,CAAY,OAAO,CAAA;AAAA,GAC3D,EAAG,EAAE,CAAA;AACL,EAAM,MAAA,UAAA,GAAa,YAAY,MAAM;AAEnC,IAAA,SAAA,CAAU,UAAU,IAAI,CAAA;AACxB,IAAA,SAAA,CAAU,IAAI,CAAA;AACd,IAAA,IAAI,WAAY,CAAA,OAAA,EAAsB,YAAA,CAAA,WAAA,CAAY,OAAO,CAAA;AACzD,IAAA,WAAA,CAAY,UAAU,UAAW,CAAA,MAAM,SAAU,CAAA,KAAK,GAAG,GAAI,CAAA;AAAA,GAC/D,EAAG,CAAC,IAAI,CAAC,CAAA;AACT,EAAM,MAAA,cAAA,GAAiB,YAAY,MAAM;AACvC,IAAM,MAAA,GAAA,GAAM,QAAa,KAAA,KAAA,IAAS,QAAa,KAAA,KAAA,GAAQ,QAAQ,QAAa,KAAA,IAAA,IAAQ,QAAa,KAAA,IAAA,GAAO,IAAO,GAAA,KAAA;AAC/G,IAAA,KAAK,MAAM,KAAM,CAAA;AAAA,MACf,OAAS,EAAA,IAAA;AAAA,MACT,KAAA,EAAO,WAAW,GAAG,CAAA;AAAA,KACtB,CAAA;AAAA,GACA,EAAA,CAAC,IAAM,EAAA,QAAQ,CAAC,CAAA;AACnB,EAAM,MAAA,MAAA,GAAS,SAAS,2BAA8B,GAAA,SAAA;AACtD,EAAM,MAAA,QAAA,GAAW,SAAS,2BAA8B,GAAA,SAAA;AACxD,EAAM,MAAA,MAAA,GAAS,SAAS,SAAY,GAAA,SAAA;AACpC,EAAM,MAAA,KAAA,GAAQ,SAAS,SAAY,GAAA,SAAA;AACnC,EAAM,MAAA,GAAA,GAAM,SAAS,SAAY,GAAA,SAAA;AACjC,EAAA,uBAAQ,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,IAAM,EAAA;AAAA,IAChC,WAAa,EAAA,MAAA;AAAA,IACb,eAAiB,EAAA;AAAA,GAClB,CACS,EAAA,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,IAAK,EAAA,EAAA,KAAA,EAAO,CAAC,MAAA,CAAO,MAAQ,EAAA;AAAA,MACnC,eAAiB,EAAA,QAAA;AAAA,MACjB,iBAAmB,EAAA;AAAA,KACpB,CACW,EAAA,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,IAAK,EAAA,EAAA,KAAA,EAAO,CAAC,MAAA,CAAO,IAAM,EAAA;AAAA,QACnC,KAAO,EAAA;AAAA,OACR,GAAI,QAAM,EAAA,KAAA,EAAA,CAAA;AAAA,sBACD,GAAA,CAAC,SAAU,EAAA,EAAA,OAAA,EAAS,UAAY,EAAA,OAAA,EAAS,GAAG,iBAAkB,EAAA,QAAA,EAAS,kBAAoB,EAAA,MAAA,GAAS,QAAW,GAAA,WAAA,EAC3G,8BAAC,OAAQ,EAAA,EAAA,IAAA,EAAM,MAAS,GAAA,OAAA,GAAU,MAAQ,EAAA,IAAA,EAAM,IAAI,KAAO,EAAA,MAAA,GAAS,SAAY,GAAA,KAAA,EAAO,CAC3F,EAAA;AAAA,KACJ,EAAA,CAAA;AAAA,wBACC,IAAK,EAAA,EAAA,UAAA,EAAU,MAAC,KAAO,EAAA,CAAC,OAAO,IAAM,EAAA;AAAA,MAC5C,KAAO,EAAA;AAAA,KACR,GACY,QACL,EAAA,IAAA,EAAA,CAAA;AAAA,oBACC,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,MAChB,EAAA,QAAA,EAAA;AAAA,sBAAC,GAAA,CAAA,SAAA,EAAA,EAAU,OAAS,EAAA,UAAA,EAAY,OAAS,EAAA,CAAA,EAAG,iBAAkB,EAAA,QAAA,EAAS,kBAAoB,EAAA,MAAA,GAAS,QAAW,GAAA,WAAA,EAAa,KAAO,EAAA,MAAA,CAAO,WACtI,QAAC,kBAAA,GAAA,CAAA,OAAA,EAAA,EAAQ,IAAM,EAAA,MAAA,GAAS,OAAU,GAAA,MAAA,EAAQ,IAAM,EAAA,EAAA,EAAI,KAAO,EAAA,MAAA,GAAS,SAAY,GAAA,KAAA,EAAO,CAC3F,EAAA,CAAA;AAAA,sBACA,GAAA,CAAC,aAAU,OAAS,EAAA,cAAA,EAAgB,SAAS,CAAG,EAAA,iBAAA,EAAkB,UAAS,kBAAmB,EAAA,YAAA,EAAa,OAAO,MAAO,CAAA,SAAA,EACrH,8BAAC,OAAQ,EAAA,EAAA,IAAA,EAAK,YAAW,IAAM,EAAA,EAAA,EAAI,KAAO,EAAA,KAAA,EAAO,CACrD,EAAA;AAAA,KACJ,EAAA;AAAA,GACJ,EAAA,CAAA;AACR,CAAC;AACD,MAAM,MAAA,GAAS,WAAW,MAAO,CAAA;AAAA,EAC/B,IAAM,EAAA;AAAA,IACJ,SAAW,EAAA,SAAA;AAAA,IACX,QAAU,EAAA,CAAA;AAAA,IACV,WAAa,EAAA,CAAA;AAAA,IACb,YAAc,EAAA,EAAA;AAAA,IACd,QAAU,EAAA,QAAA;AAAA,IACV,cAAgB,EAAA;AAAA,GAClB;AAAA,EACA,MAAQ,EAAA;AAAA,IACN,aAAe,EAAA,KAAA;AAAA,IACf,UAAY,EAAA,QAAA;AAAA,IACZ,cAAgB,EAAA,eAAA;AAAA,IAChB,iBAAmB,EAAA,EAAA;AAAA,IACnB,eAAiB,EAAA,CAAA;AAAA,IACjB,iBAAmB,EAAA;AAAA,GACrB;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,QAAU,EAAA,EAAA;AAAA,IACV,UAAY,EAAA,KAAA;AAAA,IACZ,aAAe,EAAA;AAAA,GACjB;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,UAAY,EAAA,QAAA,CAAS,EAAO,KAAA,KAAA,GAAQ,OAAU,GAAA,WAAA;AAAA,IAC9C,QAAU,EAAA,EAAA;AAAA,IACV,UAAY,EAAA,EAAA;AAAA,IACZ,iBAAmB,EAAA,EAAA;AAAA,IACnB,UAAY,EAAA,EAAA;AAAA,IACZ,aAAe,EAAA;AAAA,GACjB;AAAA,EACA,MAAQ,EAAA;AAAA,IACN,aAAe,EAAA,KAAA;AAAA,IACf,UAAY,EAAA,QAAA;AAAA,IACZ,iBAAmB,EAAA,EAAA;AAAA,IACnB,aAAe,EAAA;AAAA,GACjB;AAAA,EACA,SAAW,EAAA;AAAA,IACT,OAAS,EAAA,CAAA;AAAA,IACT,WAAa,EAAA,CAAA;AAAA,IACb,YAAc,EAAA;AAAA;AAElB,CAAC,CAAA"}
1
+ {"version":3,"file":"ChatCodeBlock.js","sources":["../../../src/features/chat/ChatCodeBlock.tsx"],"sourcesContent":["import React, { memo, useCallback, useEffect, useRef, useState } from 'react';\n// Clipboard is deprecated in React Native core but still works; MessageActionBar\n// explains why it is used instead of a community package.\nimport { Clipboard, Platform, Pressable, Share, StyleSheet, View } from 'react-native';\nimport { Feather } from '@expo/vector-icons';\nimport { Text } from '@admin-layout/gluestack-ui-mobile';\n\n/** The shared snippet's file extension: JS and TS snippets share as TypeScript. */\nfunction snippetExtension(language: string | undefined): string {\n if (language === 'jsx' || language === 'tsx') return 'tsx';\n if (language === 'js' || language === 'ts') return 'ts';\n return 'txt';\n}\n\n/**\n * Same chrome as web `CodeBlockWithActions` in tailwind-chat-pro: language\n * header, wrapping monospace body, copy + share/download. Long lines wrap\n * (browser `whitespace-pre-wrap`) instead of a nested horizontal ScrollView,\n * which collapsed the card to empty height inside the transcript list.\n */\nexport const ChatCodeBlock = memo(function ChatCodeBlock({\n language,\n code,\n isDark = false,\n}: {\n language?: string;\n code: string;\n isDark?: boolean;\n}) {\n const label = ((language || 'code').trim() || 'code').toUpperCase();\n const body = code.replace(/\\n$/, '');\n const [copied, setCopied] = useState(false);\n const copiedTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n useEffect(\n () => () => {\n if (copiedTimer.current) clearTimeout(copiedTimer.current);\n },\n [],\n );\n\n const handleCopy = useCallback(() => {\n Clipboard.setString(body);\n setCopied(true);\n if (copiedTimer.current) clearTimeout(copiedTimer.current);\n copiedTimer.current = setTimeout(() => setCopied(false), 2000);\n }, [body]);\n\n const handleDownload = useCallback(() => {\n void Share.share({ message: body, title: `snippet.${snippetExtension(language)}` });\n }, [body, language]);\n\n const border = isDark ? 'rgba(148, 163, 184, 0.28)' : '#ebeef3';\n const headerBg = isDark ? 'rgba(148, 163, 184, 0.10)' : '#f6f7f8';\n const bodyBg = isDark ? '#171a20' : '#ffffff';\n const muted = isDark ? '#94a3b8' : '#667085';\n const ink = isDark ? '#f3f5f8' : '#121926';\n\n return (\n <View style={[styles.wrap, { borderColor: border, backgroundColor: bodyBg }]}>\n <View style={[styles.header, { backgroundColor: headerBg, borderBottomColor: border }]}>\n <Text style={[styles.lang, { color: muted }]}>{label}</Text>\n <Pressable\n onPress={handleCopy}\n hitSlop={8}\n accessibilityRole=\"button\"\n accessibilityLabel={copied ? 'Copied' : 'Copy code'}\n >\n <Feather name={copied ? 'check' : 'copy'} size={14} color={copied ? '#10b981' : muted} />\n </Pressable>\n </View>\n <Text selectable style={[styles.code, { color: ink }]}>\n {body}\n </Text>\n <View style={styles.footer}>\n <Pressable\n onPress={handleCopy}\n hitSlop={8}\n accessibilityRole=\"button\"\n accessibilityLabel={copied ? 'Copied' : 'Copy code'}\n style={styles.footerBtn}\n >\n <Feather name={copied ? 'check' : 'copy'} size={15} color={copied ? '#10b981' : muted} />\n </Pressable>\n <Pressable\n onPress={handleDownload}\n hitSlop={8}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Share code\"\n style={styles.footerBtn}\n >\n <Feather name=\"download\" size={15} color={muted} />\n </Pressable>\n </View>\n </View>\n );\n});\n\nconst styles = StyleSheet.create({\n wrap: {\n alignSelf: 'stretch',\n flexGrow: 0,\n borderWidth: 1,\n borderRadius: 14,\n overflow: 'hidden',\n marginVertical: 12,\n },\n header: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingHorizontal: 12,\n paddingVertical: 8,\n borderBottomWidth: 1,\n },\n lang: {\n fontSize: 10,\n fontWeight: '600',\n letterSpacing: 0.6,\n },\n code: {\n fontFamily: Platform.OS === 'ios' ? 'Menlo' : 'monospace',\n fontSize: 13,\n lineHeight: 20,\n paddingHorizontal: 16,\n paddingTop: 14,\n paddingBottom: 8,\n },\n footer: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 10,\n paddingBottom: 10,\n },\n footerBtn: {\n padding: 6,\n marginRight: 4,\n borderRadius: 6,\n },\n});\n"],"names":["ChatCodeBlock"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import {jsx,Fragment,jsxs}from'react/jsx-runtime';import {useRef,useMemo,useCallback,useEffect,memo}from'react';import {View,StyleSheet,FlatList,Platform,Pressable,Text}from'react-native';import {dismissKeyboard}from'../../utils/keyboardController.js';import {useKeyboardLiftHeight}from'../../components/KeyboardComposerDock.js';import Markdown from'react-native-markdown-display';import {shouldRenderUserTranscriptTurn,displayUserMessageText}from'../attachments/displayUserMessageText.js';import {MessageAttachmentPreviews}from'../attachments/MessageAttachmentPreviews.js';import {ToolTimeline}from'./ToolTimeline.js';import {parseToolActivity}from'./toolActivity.js';import {parseAskUser,displayAskUserAssistantText,stripAskUser}from'./askUser.js';import {collapseDuplicateUserRows,groupConsecutiveRoleRows}from'./transcriptGroups.js';import {AssistantMarkdown}from'./AssistantMarkdown.js';var __defProp = Object.defineProperty;
1
+ import {jsx,Fragment,jsxs}from'react/jsx-runtime';import {useRef,useMemo,useCallback,useEffect,memo}from'react';import {View,StyleSheet,FlatList,Platform,Pressable,Text}from'react-native';import {dismissKeyboard}from'../../utils/keyboardController.js';import {useKeyboardLiftHeight}from'../../components/KeyboardComposerDock.js';import Markdown from'react-native-markdown-display';import {shouldRenderUserTranscriptTurn,displayUserMessageText}from'../attachments/displayUserMessageText.js';import {MessageAttachmentPreviews}from'../attachments/MessageAttachmentPreviews.js';import {ToolTimeline}from'./ToolTimeline.js';import {ChatWidgetCard}from'./ChatWidgetCard.js';import {splitChatWidgets}from'./chatWidgets.js';import {parseToolActivity}from'./toolActivity.js';import {parseAskUser,displayAskUserAssistantText,stripAskUser}from'./askUser.js';import {collapseDuplicateUserRows,groupConsecutiveRoleRows}from'./transcriptGroups.js';import {AssistantMarkdown}from'./AssistantMarkdown.js';var __defProp = Object.defineProperty;
2
2
  var __defProps = Object.defineProperties;
3
3
  var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
4
  var __getOwnPropSymbols = Object.getOwnPropertySymbols;
@@ -180,11 +180,15 @@ const AssistantTurnView = memo(function AssistantTurnView2({
180
180
  const attachments = (_a = item.attachments) != null ? _a : [];
181
181
  const stripped = stripAskUser(item.content);
182
182
  const toolActivity = parseToolActivity(stripped, !!item.streaming);
183
- const text = parseToolActivity(displayAskUserAssistantText(item.content, !!item.askAnswered), !!item.streaming).text;
183
+ const {
184
+ text,
185
+ widgets
186
+ } = splitChatWidgets(parseToolActivity(displayAskUserAssistantText(item.content, !!item.askAnswered), !!item.streaming).text, !!item.streaming);
184
187
  return /* @__PURE__ */ jsxs(View, { style: [styles.assistantCol, tightTop && styles.assistantColTight], children: [
185
188
  attachments.length > 0 ? /* @__PURE__ */ jsx(MessageAttachmentPreviews, { attachments, align: "start", isDark }) : null,
186
189
  toolActivity.steps.length > 0 ? /* @__PURE__ */ jsx(ToolTimeline, { steps: toolActivity.steps, active: !!item.streaming, isDark }) : null,
187
190
  text ? /* @__PURE__ */ jsx(AssistantMarkdown, { text, streaming: !!item.streaming, isDark }) : null,
191
+ widgets.map((widget, i) => /* @__PURE__ */ jsx(ChatWidgetCard, { widget, isDark }, `${widget.component}-${i}`)),
188
192
  renderMessageActions ? renderMessageActions({
189
193
  id: item.id,
190
194
  role: "assistant",
@@ -280,4 +284,4 @@ const styles = StyleSheet.create({
280
284
  assistantColTight: {
281
285
  marginTop: -4
282
286
  }
283
- });export{ChatTranscript};//# sourceMappingURL=ChatTranscript.js.map
287
+ });export{ChatTranscript,USER_BUBBLE_BG};//# sourceMappingURL=ChatTranscript.js.map