@adminide-stack/yantra-mobile 12.0.69-alpha.9 → 12.0.69
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.
- package/lib/components/GatewayConnector/GatewayConnector.js +2 -2
- package/lib/components/GatewayConnector/GatewayConnector.js.map +1 -1
- package/lib/components/KeyboardComposerDock.js +8 -1
- package/lib/components/KeyboardComposerDock.js.map +1 -1
- package/lib/components/NavigationHeader/NavigationHeader.js +2 -2
- package/lib/components/NavigationHeader/NavigationHeader.js.map +1 -1
- package/lib/config/env-config.js +4 -0
- package/lib/config/env-config.js.map +1 -1
- package/lib/contexts/ChatLiveStreamContext.js +4 -1
- package/lib/contexts/ChatLiveStreamContext.js.map +1 -1
- package/lib/features/agent-chat/NativeAgentChat.js +2 -0
- package/lib/features/agent-chat/NativeAgentChat.js.map +1 -1
- package/lib/features/apps/AppsCatalog.js +2 -2
- package/lib/features/apps/AppsCatalog.js.map +1 -1
- package/lib/features/audio-input/MicErrorBoundary.js +2 -2
- package/lib/features/audio-input/MicErrorBoundary.js.map +1 -1
- package/lib/features/canvas/AudioEditorExperience.js +308 -0
- package/lib/features/canvas/AudioEditorExperience.js.map +1 -0
- package/lib/features/canvas/CanvasAgentChatPane.js +310 -0
- package/lib/features/canvas/CanvasAgentChatPane.js.map +1 -0
- package/lib/features/canvas/CanvasBoardsGrid.js +414 -0
- package/lib/features/canvas/CanvasBoardsGrid.js.map +1 -0
- package/lib/features/canvas/CanvasChatResultCard.js +113 -0
- package/lib/features/canvas/CanvasChatResultCard.js.map +1 -0
- package/lib/features/canvas/CanvasEditToolsPanel.js +179 -0
- package/lib/features/canvas/CanvasEditToolsPanel.js.map +1 -0
- package/lib/features/canvas/CanvasExperience.js +859 -0
- package/lib/features/canvas/CanvasExperience.js.map +1 -0
- package/lib/features/canvas/CanvasGeneratePanel.js +514 -0
- package/lib/features/canvas/CanvasGeneratePanel.js.map +1 -0
- package/lib/features/canvas/CanvasLibrarySheet.js +355 -0
- package/lib/features/canvas/CanvasLibrarySheet.js.map +1 -0
- package/lib/features/canvas/CanvasLooksPanel.js +184 -0
- package/lib/features/canvas/CanvasLooksPanel.js.map +1 -0
- package/lib/features/canvas/CanvasTasksPanel.js +138 -0
- package/lib/features/canvas/CanvasTasksPanel.js.map +1 -0
- package/lib/features/canvas/CanvasTemplatesPanel.js +226 -0
- package/lib/features/canvas/CanvasTemplatesPanel.js.map +1 -0
- package/lib/features/canvas/CanvasToolDock.js +423 -0
- package/lib/features/canvas/CanvasToolDock.js.map +1 -0
- package/lib/features/canvas/FrameExtractorExperience.js +242 -0
- package/lib/features/canvas/FrameExtractorExperience.js.map +1 -0
- package/lib/features/canvas/ImageEditorExperience.js +491 -0
- package/lib/features/canvas/ImageEditorExperience.js.map +1 -0
- package/lib/features/canvas/InfluencerStudioExperience.js +288 -0
- package/lib/features/canvas/InfluencerStudioExperience.js.map +1 -0
- package/lib/features/canvas/MoodboardExperience.js +205 -0
- package/lib/features/canvas/MoodboardExperience.js.map +1 -0
- package/lib/features/canvas/NativeCanvasViewer.js +929 -0
- package/lib/features/canvas/NativeCanvasViewer.js.map +1 -0
- package/lib/features/canvas/PromoContextFields.js +150 -0
- package/lib/features/canvas/PromoContextFields.js.map +1 -0
- package/lib/features/canvas/SetStudioExperience.js +323 -0
- package/lib/features/canvas/SetStudioExperience.js.map +1 -0
- package/lib/features/canvas/VideoClipsExperience.js +175 -0
- package/lib/features/canvas/VideoClipsExperience.js.map +1 -0
- package/lib/features/canvas/VideoEditExperience.js +824 -0
- package/lib/features/canvas/VideoEditExperience.js.map +1 -0
- package/lib/features/canvas/VideoEditorExperience.js +3050 -0
- package/lib/features/canvas/VideoEditorExperience.js.map +1 -0
- package/lib/features/canvas/VideoGeneratorExperience.js +415 -0
- package/lib/features/canvas/VideoGeneratorExperience.js.map +1 -0
- package/lib/features/canvas/aiEdit.js +53 -0
- package/lib/features/canvas/aiEdit.js.map +1 -0
- package/lib/features/canvas/canvasAgentChat.js +76 -0
- package/lib/features/canvas/canvasAgentChat.js.map +1 -0
- package/lib/features/canvas/canvasBoardsCatalog.js +59 -0
- package/lib/features/canvas/canvasBoardsCatalog.js.map +1 -0
- package/lib/features/canvas/canvasBoardsSnapshot.js +14 -1
- package/lib/features/canvas/canvasBoardsSnapshot.js.map +1 -1
- package/lib/features/canvas/canvasChatDisplay.js +38 -0
- package/lib/features/canvas/canvasChatDisplay.js.map +1 -0
- package/lib/features/canvas/canvasChatTemplates.js +219 -0
- package/lib/features/canvas/canvasChatTemplates.js.map +1 -0
- package/lib/features/canvas/canvasCore.js +138 -1
- package/lib/features/canvas/canvasCore.js.map +1 -1
- package/lib/features/canvas/canvasEditOps.js +224 -0
- package/lib/features/canvas/canvasEditOps.js.map +1 -0
- package/lib/features/canvas/canvasTasks.js +187 -0
- package/lib/features/canvas/canvasTasks.js.map +1 -0
- package/lib/features/canvas/designPromptTemplates.js +3084 -0
- package/lib/features/canvas/designPromptTemplates.js.map +1 -0
- package/lib/features/canvas/editTools.js +54 -0
- package/lib/features/canvas/editTools.js.map +1 -0
- package/lib/features/canvas/extendVideo.js +5 -0
- package/lib/features/canvas/extendVideo.js.map +1 -0
- package/lib/features/canvas/frameExtract.js +33 -0
- package/lib/features/canvas/frameExtract.js.map +1 -0
- package/lib/features/canvas/generationModels.js +201 -0
- package/lib/features/canvas/generationModels.js.map +1 -0
- package/lib/features/canvas/influencer/influencerPipeline.js +170 -0
- package/lib/features/canvas/influencer/influencerPipeline.js.map +1 -0
- package/lib/features/canvas/influencer/productReel.js +72 -0
- package/lib/features/canvas/influencer/productReel.js.map +1 -0
- package/lib/features/canvas/influencer/reelPlan.js +159 -0
- package/lib/features/canvas/influencer/reelPlan.js.map +1 -0
- package/lib/features/canvas/moodboardCore.js +13 -0
- package/lib/features/canvas/moodboardCore.js.map +1 -0
- package/lib/features/canvas/promoProjectImport.js +99 -0
- package/lib/features/canvas/promoProjectImport.js.map +1 -0
- package/lib/features/canvas/promoVideo.js +312 -0
- package/lib/features/canvas/promoVideo.js.map +1 -0
- package/lib/features/canvas/recorder/CameraRecorderExperience.js +109 -0
- package/lib/features/canvas/recorder/CameraRecorderExperience.js.map +1 -0
- package/lib/features/canvas/sessionIdentity.js +28 -1
- package/lib/features/canvas/sessionIdentity.js.map +1 -1
- package/lib/features/canvas/set/SetViewportWebView.js +133 -0
- package/lib/features/canvas/set/SetViewportWebView.js.map +1 -0
- package/lib/features/canvas/set/cameraPath.js +194 -0
- package/lib/features/canvas/set/cameraPath.js.map +1 -0
- package/lib/features/canvas/set/setProject.js +24 -0
- package/lib/features/canvas/set/setProject.js.map +1 -0
- package/lib/features/canvas/storageLibrary.js +184 -0
- package/lib/features/canvas/storageLibrary.js.map +1 -0
- package/lib/features/canvas/studioCatalog.js +129 -0
- package/lib/features/canvas/studioCatalog.js.map +1 -0
- package/lib/features/canvas/studioLooks.js +189 -0
- package/lib/features/canvas/studioLooks.js.map +1 -0
- package/lib/features/canvas/surfaceIndex.js +63 -1
- package/lib/features/canvas/surfaceIndex.js.map +1 -1
- package/lib/features/canvas/templateImport/invideoNative.js +221 -0
- package/lib/features/canvas/templateImport/invideoNative.js.map +1 -0
- package/lib/features/canvas/templateImport/loadTemplate.js +43 -0
- package/lib/features/canvas/templateImport/loadTemplate.js.map +1 -0
- package/lib/features/canvas/templateImport/renderConfig.js +93 -0
- package/lib/features/canvas/templateImport/renderConfig.js.map +1 -0
- package/lib/features/canvas/useStudioCatalogTemplates.js +134 -0
- package/lib/features/canvas/useStudioCatalogTemplates.js.map +1 -0
- package/lib/features/canvas/video3d.js +109 -0
- package/lib/features/canvas/video3d.js.map +1 -0
- package/lib/features/canvas/videoClips.js +42 -0
- package/lib/features/canvas/videoClips.js.map +1 -0
- package/lib/features/canvas/videoEditor/agent/AgentCutPane.js +120 -0
- package/lib/features/canvas/videoEditor/agent/AgentCutPane.js.map +1 -0
- package/lib/features/canvas/videoEditor/agent/agentLoop.js +69 -0
- package/lib/features/canvas/videoEditor/agent/agentLoop.js.map +1 -0
- package/lib/features/canvas/videoEditor/agent/brainClient.js +45 -0
- package/lib/features/canvas/videoEditor/agent/brainClient.js.map +1 -0
- package/lib/features/canvas/videoEditor/agent/cutTools.js +129 -0
- package/lib/features/canvas/videoEditor/agent/cutTools.js.map +1 -0
- package/lib/features/canvas/videoEditor/editorModel.js +346 -0
- package/lib/features/canvas/videoEditor/editorModel.js.map +1 -0
- package/lib/features/canvas/videoEditor/exportRenderer.js +214 -0
- package/lib/features/canvas/videoEditor/exportRenderer.js.map +1 -0
- package/lib/features/canvas/videoEditor/filters.js +41 -0
- package/lib/features/canvas/videoEditor/filters.js.map +1 -0
- package/lib/features/canvas/videoEditor/mediaActions.js +57 -0
- package/lib/features/canvas/videoEditor/mediaActions.js.map +1 -0
- package/lib/features/canvas/videoEditor/remoteMediaClient.js +129 -0
- package/lib/features/canvas/videoEditor/remoteMediaClient.js.map +1 -0
- package/lib/features/canvas/videoEditor/solidColorPng.js +115 -0
- package/lib/features/canvas/videoEditor/solidColorPng.js.map +1 -0
- package/lib/features/canvas/videoEditor/videoEditOps.js +191 -0
- package/lib/features/canvas/videoEditor/videoEditOps.js.map +1 -0
- package/lib/features/canvas/videoEditor/videoProjectsStore.js +82 -0
- package/lib/features/canvas/videoEditor/videoProjectsStore.js.map +1 -0
- package/lib/features/canvas/videoRenderer.js +8 -0
- package/lib/features/canvas/videoRenderer.js.map +1 -0
- package/lib/features/canvas/withRemoteSafeArea.js +2 -2
- package/lib/features/canvas/withRemoteSafeArea.js.map +1 -1
- package/lib/features/characters/characterStudioProps.js +14 -0
- package/lib/features/characters/characterStudioProps.js.map +1 -0
- package/lib/features/chat/ChatCodeBlock.js +7 -3
- package/lib/features/chat/ChatCodeBlock.js.map +1 -1
- package/lib/features/chat/ChatTranscript.js +7 -3
- package/lib/features/chat/ChatTranscript.js.map +1 -1
- package/lib/features/chat/ChatWidgetCard.js +13 -0
- package/lib/features/chat/ChatWidgetCard.js.map +1 -0
- package/lib/features/chat/ConnectorConnectCard.js +164 -0
- package/lib/features/chat/ConnectorConnectCard.js.map +1 -0
- package/lib/features/chat/ConnectorConnectPrompt.js +254 -0
- package/lib/features/chat/ConnectorConnectPrompt.js.map +1 -0
- package/lib/features/chat/MessageActionBar.js.map +1 -1
- package/lib/features/chat/QueuedFollowUps.js +71 -0
- package/lib/features/chat/QueuedFollowUps.js.map +1 -0
- package/lib/features/chat/chatWidgets.js +37 -0
- package/lib/features/chat/chatWidgets.js.map +1 -0
- package/lib/features/chat/connectorConnect.js +179 -0
- package/lib/features/chat/connectorConnect.js.map +1 -0
- package/lib/features/chat/connectorConnectHandbacks.js +55 -0
- package/lib/features/chat/connectorConnectHandbacks.js.map +1 -0
- package/lib/features/design/DesignEditorExperience.js +643 -0
- package/lib/features/design/DesignEditorExperience.js.map +1 -0
- package/lib/features/design/DesignExperience.js +444 -0
- package/lib/features/design/DesignExperience.js.map +1 -0
- package/lib/features/design/designCore.js +298 -0
- package/lib/features/design/designCore.js.map +1 -0
- package/lib/features/design/designIndex.js +150 -0
- package/lib/features/design/designIndex.js.map +1 -0
- package/lib/features/design/exportDesign.js +133 -0
- package/lib/features/design/exportDesign.js.map +1 -0
- package/lib/features/job-search/ApplicationsPanel.js +907 -0
- package/lib/features/job-search/ApplicationsPanel.js.map +1 -0
- package/lib/features/job-search/ContactsPanel.js +627 -0
- package/lib/features/job-search/ContactsPanel.js.map +1 -0
- package/lib/features/job-search/InsightsPanel.js +299 -0
- package/lib/features/job-search/InsightsPanel.js.map +1 -0
- package/lib/features/job-search/InterviewPanel.js +637 -0
- package/lib/features/job-search/InterviewPanel.js.map +1 -0
- package/lib/features/job-search/JdPastePrompt.js +130 -0
- package/lib/features/job-search/JdPastePrompt.js.map +1 -0
- package/lib/features/job-search/JobCard.js +199 -0
- package/lib/features/job-search/JobCard.js.map +1 -0
- package/lib/features/job-search/JobDetailSheet.js +255 -0
- package/lib/features/job-search/JobDetailSheet.js.map +1 -0
- package/lib/features/job-search/JobSearchAgentChatPane.js +377 -0
- package/lib/features/job-search/JobSearchAgentChatPane.js.map +1 -0
- package/lib/features/job-search/JobSearchExperience.js +1324 -0
- package/lib/features/job-search/JobSearchExperience.js.map +1 -0
- package/lib/features/job-search/JobSearchLocationField.js +231 -0
- package/lib/features/job-search/JobSearchLocationField.js.map +1 -0
- package/lib/features/job-search/ProfilePanel.js +679 -0
- package/lib/features/job-search/ProfilePanel.js.map +1 -0
- package/lib/features/job-search/RepliesPanel.js +344 -0
- package/lib/features/job-search/RepliesPanel.js.map +1 -0
- package/lib/features/job-search/SavedPanel.js +297 -0
- package/lib/features/job-search/SavedPanel.js.map +1 -0
- package/lib/features/job-search/chat/widgetContent.js +29 -0
- package/lib/features/job-search/chat/widgetContent.js.map +1 -0
- package/lib/features/job-search/cvText.js +91 -0
- package/lib/features/job-search/cvText.js.map +1 -0
- package/lib/features/job-search/jobAgentSwipe.js +7 -0
- package/lib/features/job-search/jobAgentSwipe.js.map +1 -0
- package/lib/features/job-search/jobSearchClient.js +184 -0
- package/lib/features/job-search/jobSearchClient.js.map +1 -0
- package/lib/features/job-search/jobSearchExec.js +14 -0
- package/lib/features/job-search/jobSearchExec.js.map +1 -0
- package/lib/features/job-search/jobSearchRuntime.js +50 -0
- package/lib/features/job-search/jobSearchRuntime.js.map +1 -0
- package/lib/features/job-search/jobSearchTheme.js +44 -0
- package/lib/features/job-search/jobSearchTheme.js.map +1 -0
- package/lib/features/job-search/savedJobs.js +85 -0
- package/lib/features/job-search/savedJobs.js.map +1 -0
- package/lib/features/job-search/searchHistory.js +117 -0
- package/lib/features/job-search/searchHistory.js.map +1 -0
- package/lib/features/job-search/types.js +36 -0
- package/lib/features/job-search/types.js.map +1 -0
- package/lib/features/job-search/useJobSearchSession.js +558 -0
- package/lib/features/job-search/useJobSearchSession.js.map +1 -0
- package/lib/features/messaging/ChatComponents.js +529 -0
- package/lib/features/messaging/ChatComponents.js.map +1 -0
- package/lib/features/messaging/ChatInviteDeepLink.js +116 -0
- package/lib/features/messaging/ChatInviteDeepLink.js.map +1 -0
- package/lib/features/messaging/ContactsScreen.js +288 -0
- package/lib/features/messaging/ContactsScreen.js.map +1 -0
- package/lib/features/messaging/ConversationListScreen.js +147 -0
- package/lib/features/messaging/ConversationListScreen.js.map +1 -0
- package/lib/features/messaging/MessageActions.js +290 -0
- package/lib/features/messaging/MessageActions.js.map +1 -0
- package/lib/features/messaging/NativeChatExperience.js +189 -0
- package/lib/features/messaging/NativeChatExperience.js.map +1 -0
- package/lib/features/messaging/RegistrationScreen.js +11 -14
- package/lib/features/messaging/RegistrationScreen.js.map +1 -1
- package/lib/features/messaging/ThreadScreen.js +215 -0
- package/lib/features/messaging/ThreadScreen.js.map +1 -0
- package/lib/features/messaging/chatInviteLink.js +52 -0
- package/lib/features/messaging/chatInviteLink.js.map +1 -0
- package/lib/features/messaging/chatModel.js +278 -0
- package/lib/features/messaging/chatModel.js.map +1 -0
- package/lib/features/messaging/chatOperations.js +106 -1
- package/lib/features/messaging/chatOperations.js.map +1 -1
- package/lib/features/messaging/emojiCatalog.js +60 -0
- package/lib/features/messaging/emojiCatalog.js.map +1 -0
- package/lib/features/messaging/emojiKeywords.js +1592 -0
- package/lib/features/messaging/emojiKeywords.js.map +1 -0
- package/lib/features/messaging/nativeChatChannelQuery.js +27 -0
- package/lib/features/messaging/nativeChatChannelQuery.js.map +1 -0
- package/lib/features/messaging/phoneNumbers.js +52 -1
- package/lib/features/messaging/phoneNumbers.js.map +1 -1
- package/lib/features/messaging/sha256.js +68 -0
- package/lib/features/messaging/sha256.js.map +1 -0
- package/lib/features/messaging/useChatData.js +421 -0
- package/lib/features/messaging/useChatData.js.map +1 -0
- package/lib/features/messaging/useContactMatches.js +191 -0
- package/lib/features/messaging/useContactMatches.js.map +1 -0
- package/lib/features/messaging/usePhoneVerification.js +12 -12
- package/lib/features/messaging/usePhoneVerification.js.map +1 -1
- package/lib/features/messaging/yantraChatOrg.js +8 -3
- package/lib/features/messaging/yantraChatOrg.js.map +1 -1
- package/lib/features/resume/AnnotateModal.js +100 -0
- package/lib/features/resume/AnnotateModal.js.map +1 -0
- package/lib/features/resume/AnnotationBar.js +69 -0
- package/lib/features/resume/AnnotationBar.js.map +1 -0
- package/lib/features/resume/ExportSheet.js +105 -0
- package/lib/features/resume/ExportSheet.js.map +1 -0
- package/lib/features/resume/ResumeAgentChatPane.js +95 -0
- package/lib/features/resume/ResumeAgentChatPane.js.map +1 -0
- package/lib/features/resume/ResumeEditor.js +676 -0
- package/lib/features/resume/ResumeEditor.js.map +1 -0
- package/lib/features/resume/ResumeExperience.js +235 -0
- package/lib/features/resume/ResumeExperience.js.map +1 -0
- package/lib/features/resume/ResumeListPanel.js +262 -0
- package/lib/features/resume/ResumeListPanel.js.map +1 -0
- package/lib/features/resume/ResumeToolbar.js +236 -0
- package/lib/features/resume/ResumeToolbar.js.map +1 -0
- package/lib/features/resume/annotations.js +17 -0
- package/lib/features/resume/annotations.js.map +1 -0
- package/lib/features/resume/documentCss.js +52 -0
- package/lib/features/resume/documentCss.js.map +1 -0
- package/lib/features/resume/draft.js +89 -0
- package/lib/features/resume/draft.js.map +1 -0
- package/lib/features/resume/exportResume.js +43 -0
- package/lib/features/resume/exportResume.js.map +1 -0
- package/lib/features/resume/pickResumePhoto.js +22 -0
- package/lib/features/resume/pickResumePhoto.js.map +1 -0
- package/lib/features/resume/renderResume.js +121 -0
- package/lib/features/resume/renderResume.js.map +1 -0
- package/lib/features/resume/resumeClient.js +69 -0
- package/lib/features/resume/resumeClient.js.map +1 -0
- package/lib/features/resume/resumeExec.js +14 -0
- package/lib/features/resume/resumeExec.js.map +1 -0
- package/lib/features/resume/resumeIndex.js +244 -0
- package/lib/features/resume/resumeIndex.js.map +1 -0
- package/lib/features/resume/resumeRuntime.js +50 -0
- package/lib/features/resume/resumeRuntime.js.map +1 -0
- package/lib/features/resume/resumeTheme.js +34 -0
- package/lib/features/resume/resumeTheme.js.map +1 -0
- package/lib/features/resume/resumeToolbox.js +49 -0
- package/lib/features/resume/resumeToolbox.js.map +1 -0
- package/lib/features/resume/templates.js +90 -0
- package/lib/features/resume/templates.js.map +1 -0
- package/lib/features/resume/types.js +10 -0
- package/lib/features/resume/types.js.map +1 -0
- package/lib/features/resume/useResumeSession.js +183 -0
- package/lib/features/resume/useResumeSession.js.map +1 -0
- package/lib/features/shopping/DealsPanel.js +254 -0
- package/lib/features/shopping/DealsPanel.js.map +1 -0
- package/lib/features/shopping/HistoryPanel.js +147 -0
- package/lib/features/shopping/HistoryPanel.js.map +1 -0
- package/lib/features/shopping/OrdersPanel.js +157 -0
- package/lib/features/shopping/OrdersPanel.js.map +1 -0
- package/lib/features/shopping/ProductCard.js +326 -0
- package/lib/features/shopping/ProductCard.js.map +1 -0
- package/lib/features/shopping/ProductDetailSheet.js +313 -0
- package/lib/features/shopping/ProductDetailSheet.js.map +1 -0
- package/lib/features/shopping/ProductFilterBar.js +153 -0
- package/lib/features/shopping/ProductFilterBar.js.map +1 -0
- package/lib/features/shopping/ProductPhoto.js +27 -0
- package/lib/features/shopping/ProductPhoto.js.map +1 -0
- package/lib/features/shopping/SavedPanel.js +139 -0
- package/lib/features/shopping/SavedPanel.js.map +1 -0
- package/lib/features/shopping/ShoppingAgentChatPane.js +436 -0
- package/lib/features/shopping/ShoppingAgentChatPane.js.map +1 -0
- package/lib/features/shopping/ShoppingExperience.js +888 -0
- package/lib/features/shopping/ShoppingExperience.js.map +1 -0
- package/lib/features/shopping/TrendingSections.js +199 -0
- package/lib/features/shopping/TrendingSections.js.map +1 -0
- package/lib/features/shopping/WatchlistPanel.js +148 -0
- package/lib/features/shopping/WatchlistPanel.js.map +1 -0
- package/lib/features/shopping/catalog.js +238 -0
- package/lib/features/shopping/catalog.js.map +1 -0
- package/lib/features/shopping/chat/ShoppingChatResultCard.js +175 -0
- package/lib/features/shopping/chat/ShoppingChatResultCard.js.map +1 -0
- package/lib/features/shopping/chat/streamAssistantReply.js +34 -0
- package/lib/features/shopping/chat/streamAssistantReply.js.map +1 -0
- package/lib/features/shopping/chat/widgetContent.js +233 -0
- package/lib/features/shopping/chat/widgetContent.js.map +1 -0
- package/lib/features/shopping/hooks/useTrendingProducts.js +162 -0
- package/lib/features/shopping/hooks/useTrendingProducts.js.map +1 -0
- package/lib/features/shopping/productImage.js +42 -0
- package/lib/features/shopping/productImage.js.map +1 -0
- package/lib/features/shopping/savedProducts.js +84 -0
- package/lib/features/shopping/savedProducts.js.map +1 -0
- package/lib/features/shopping/services/catalogActions.js +166 -0
- package/lib/features/shopping/services/catalogActions.js.map +1 -0
- package/lib/features/shopping/services/parsePriceCheckIntent.js +58 -0
- package/lib/features/shopping/services/parsePriceCheckIntent.js.map +1 -0
- package/lib/features/shopping/services/parseShoppingIntent.js +67 -0
- package/lib/features/shopping/services/parseShoppingIntent.js.map +1 -0
- package/lib/features/shopping/services/productAvailability.js +25 -0
- package/lib/features/shopping/services/productAvailability.js.map +1 -0
- package/lib/features/shopping/services/productFilters.js +72 -0
- package/lib/features/shopping/services/productFilters.js.map +1 -0
- package/lib/features/shopping/services/retailerUrl.js +75 -0
- package/lib/features/shopping/services/retailerUrl.js.map +1 -0
- package/lib/features/shopping/services/shoppingChatReply.js +46 -0
- package/lib/features/shopping/services/shoppingChatReply.js.map +1 -0
- package/lib/features/shopping/services/shoppingProductSearch.js +336 -0
- package/lib/features/shopping/services/shoppingProductSearch.js.map +1 -0
- package/lib/features/shopping/services/shoppingSearchConnectorClient.js +41 -0
- package/lib/features/shopping/services/shoppingSearchConnectorClient.js.map +1 -0
- package/lib/features/shopping/shopAgentSwipe.js +7 -0
- package/lib/features/shopping/shopAgentSwipe.js.map +1 -0
- package/lib/features/shopping/shoppingCart.js +116 -0
- package/lib/features/shopping/shoppingCart.js.map +1 -0
- package/lib/features/shopping/shoppingExec.js +14 -0
- package/lib/features/shopping/shoppingExec.js.map +1 -0
- package/lib/features/shopping/shoppingHistoryStore.js +176 -0
- package/lib/features/shopping/shoppingHistoryStore.js.map +1 -0
- package/lib/features/shopping/shoppingRuntime.js +63 -0
- package/lib/features/shopping/shoppingRuntime.js.map +1 -0
- package/lib/features/shopping/timeAgo.js +14 -0
- package/lib/features/shopping/timeAgo.js.map +1 -0
- package/lib/features/shopping/useShoppingSearch.js +262 -0
- package/lib/features/shopping/useShoppingSearch.js.map +1 -0
- package/lib/features/travel/BookHeaderGlow.js +48 -0
- package/lib/features/travel/BookHeaderGlow.js.map +1 -0
- package/lib/features/travel/BookingsPanel.js +29 -0
- package/lib/features/travel/BookingsPanel.js.map +1 -0
- package/lib/features/travel/DiscoverPanel.js +155 -0
- package/lib/features/travel/DiscoverPanel.js.map +1 -0
- package/lib/features/travel/FlightCompareBar.js +86 -0
- package/lib/features/travel/FlightCompareBar.js.map +1 -0
- package/lib/features/travel/FlightDealsBoard.js +100 -0
- package/lib/features/travel/FlightDealsBoard.js.map +1 -0
- package/lib/features/travel/HistoryPanel.js +82 -0
- package/lib/features/travel/HistoryPanel.js.map +1 -0
- package/lib/features/travel/PopularDestinations.js +144 -0
- package/lib/features/travel/PopularDestinations.js.map +1 -0
- package/lib/features/travel/SavedPanel.js +27 -0
- package/lib/features/travel/SavedPanel.js.map +1 -0
- package/lib/features/travel/TravelAgentChatPane.js +303 -0
- package/lib/features/travel/TravelAgentChatPane.js.map +1 -0
- package/lib/features/travel/TravelBookHero.js +425 -0
- package/lib/features/travel/TravelBookHero.js.map +1 -0
- package/lib/features/travel/TravelDatesField.js +234 -0
- package/lib/features/travel/TravelDatesField.js.map +1 -0
- package/lib/features/travel/TravelDetailSheet.js +106 -0
- package/lib/features/travel/TravelDetailSheet.js.map +1 -0
- package/lib/features/travel/TravelExperience.js +624 -0
- package/lib/features/travel/TravelExperience.js.map +1 -0
- package/lib/features/travel/TravelGuestsField.js +85 -0
- package/lib/features/travel/TravelGuestsField.js.map +1 -0
- package/lib/features/travel/TravelLanding.js +318 -0
- package/lib/features/travel/TravelLanding.js.map +1 -0
- package/lib/features/travel/TravelLocationField.js +179 -0
- package/lib/features/travel/TravelLocationField.js.map +1 -0
- package/lib/features/travel/TravelPropertyCard.js +266 -0
- package/lib/features/travel/TravelPropertyCard.js.map +1 -0
- package/lib/features/travel/TravelPropertyPhoto.js +22 -0
- package/lib/features/travel/TravelPropertyPhoto.js.map +1 -0
- package/lib/features/travel/TravelRailFlyout.js +79 -0
- package/lib/features/travel/TravelRailFlyout.js.map +1 -0
- package/lib/features/travel/TravelResultsMap.js +126 -0
- package/lib/features/travel/TravelResultsMap.js.map +1 -0
- package/lib/features/travel/WorkspacePanel.js +148 -0
- package/lib/features/travel/WorkspacePanel.js.map +1 -0
- package/lib/features/travel/appNav.js +244 -0
- package/lib/features/travel/appNav.js.map +1 -0
- package/lib/features/travel/calendarDays.js +50 -0
- package/lib/features/travel/calendarDays.js.map +1 -0
- package/lib/features/travel/catalog.js +72 -0
- package/lib/features/travel/catalog.js.map +1 -0
- package/lib/features/travel/chat/TravelChatResultCard.js +107 -0
- package/lib/features/travel/chat/TravelChatResultCard.js.map +1 -0
- package/lib/features/travel/chat/widgetContent.js +107 -0
- package/lib/features/travel/chat/widgetContent.js.map +1 -0
- package/lib/features/travel/flightDeals.js +65 -0
- package/lib/features/travel/flightDeals.js.map +1 -0
- package/lib/features/travel/mapCoordinates.js +36 -0
- package/lib/features/travel/mapCoordinates.js.map +1 -0
- package/lib/features/travel/parseTravelIntent.js +303 -0
- package/lib/features/travel/parseTravelIntent.js.map +1 -0
- package/lib/features/travel/savedStays.js +66 -0
- package/lib/features/travel/savedStays.js.map +1 -0
- package/lib/features/travel/services/flightDealsBoard.js +111 -0
- package/lib/features/travel/services/flightDealsBoard.js.map +1 -0
- package/lib/features/travel/services/flightSearchConnectorClient.js +42 -0
- package/lib/features/travel/services/flightSearchConnectorClient.js.map +1 -0
- package/lib/features/travel/services/geocodeLocation.js +79 -0
- package/lib/features/travel/services/geocodeLocation.js.map +1 -0
- package/lib/features/travel/services/placePredictions.js +113 -0
- package/lib/features/travel/services/placePredictions.js.map +1 -0
- package/lib/features/travel/services/resolveOriginCity.js +27 -0
- package/lib/features/travel/services/resolveOriginCity.js.map +1 -0
- package/lib/features/travel/services/resortifiConnectorClient.js +76 -0
- package/lib/features/travel/services/resortifiConnectorClient.js.map +1 -0
- package/lib/features/travel/services/travelFlightSearch.js +289 -0
- package/lib/features/travel/services/travelFlightSearch.js.map +1 -0
- package/lib/features/travel/services/travelPropertySearch.js +377 -0
- package/lib/features/travel/services/travelPropertySearch.js.map +1 -0
- package/lib/features/travel/travelAgentSwipe.js +7 -0
- package/lib/features/travel/travelAgentSwipe.js.map +1 -0
- package/lib/features/travel/travelExec.js +14 -0
- package/lib/features/travel/travelExec.js.map +1 -0
- package/lib/features/travel/travelHistoryStore.js +108 -0
- package/lib/features/travel/travelHistoryStore.js.map +1 -0
- package/lib/features/travel/travelRuntime.js +62 -0
- package/lib/features/travel/travelRuntime.js.map +1 -0
- package/lib/features/travel/types.js +9 -0
- package/lib/features/travel/types.js.map +1 -0
- package/lib/features/travel/useTravelSearch.js +330 -0
- package/lib/features/travel/useTravelSearch.js.map +1 -0
- package/lib/features/travel/workspaceContent.js +548 -0
- package/lib/features/travel/workspaceContent.js.map +1 -0
- package/lib/hooks/useCdecliChannel.js +128 -6
- package/lib/hooks/useCdecliChannel.js.map +1 -1
- package/lib/hooks/useChatApi.js +4 -2
- package/lib/hooks/useChatApi.js.map +1 -1
- package/lib/hooks/useChatStream.js +77 -63
- package/lib/hooks/useChatStream.js.map +1 -1
- package/lib/hooks/useHostConnectorCard.js +24 -0
- package/lib/hooks/useHostConnectorCard.js.map +1 -0
- package/lib/hooks/useObtainSystemToken.js +23 -5
- package/lib/hooks/useObtainSystemToken.js.map +1 -1
- package/lib/hooks/webViewRetentionPolicy.js +1 -0
- package/lib/hooks/webViewRetentionPolicy.js.map +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/screens/Chat/index.js +51 -22
- package/lib/screens/Chat/index.js.map +1 -1
- package/lib/screens/ChatNative/index.js +13 -2
- package/lib/screens/ChatNative/index.js.map +1 -1
- package/lib/screens/Home/HomeScreen.js +3 -3
- package/lib/screens/Home/HomeScreen.js.map +1 -1
- package/lib/screens/Home/components/ChatHistoryLanding.js +32 -32
- package/lib/screens/Home/components/ChatHistoryLanding.js.map +1 -1
- package/lib/screens/JobSearchNative/useJobSearchHostChat.js +12 -6
- package/lib/screens/JobSearchNative/useJobSearchHostChat.js.map +1 -1
- package/lib/screens/ResumeNative/useResumeHostChat.js +12 -6
- package/lib/screens/ResumeNative/useResumeHostChat.js.map +1 -1
- package/lib/screens/ShoppingNative/useShoppingHostChat.js +12 -6
- package/lib/screens/ShoppingNative/useShoppingHostChat.js.map +1 -1
- package/lib/screens/TravelNative/useTravelHostChat.js +12 -6
- package/lib/screens/TravelNative/useTravelHostChat.js.map +1 -1
- package/lib/screens/WebBuilder/WebViewWithNavigation.js +2 -2
- package/lib/screens/WebBuilder/WebViewWithNavigation.js.map +1 -1
- package/lib/services/brainQuickReply.js +38 -1
- package/lib/services/brainQuickReply.js.map +1 -1
- package/lib/state/chatThreadMerge.js +6 -1
- package/lib/state/chatThreadMerge.js.map +1 -1
- package/package.json +6 -4
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
var __defProp = Object.defineProperty;
|
|
2
|
+
var __defProps = Object.defineProperties;
|
|
3
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
2
4
|
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
3
5
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
4
6
|
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
@@ -14,6 +16,7 @@ var __spreadValues = (a, b) => {
|
|
|
14
16
|
}
|
|
15
17
|
return a;
|
|
16
18
|
};
|
|
19
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
17
20
|
function parseBoardState(raw) {
|
|
18
21
|
if (!raw || typeof raw !== "object") return null;
|
|
19
22
|
const candidate = raw;
|
|
@@ -38,14 +41,148 @@ function emptyBoardState(title) {
|
|
|
38
41
|
title
|
|
39
42
|
} : {});
|
|
40
43
|
}
|
|
44
|
+
function isLocalOnlySrc(src) {
|
|
45
|
+
return /^(blob:|file:|content:|ph:|assets-library:|data:)/i.test(src.trim());
|
|
46
|
+
}
|
|
47
|
+
function isUnsetBoardTitle(title) {
|
|
48
|
+
const t = title == null ? void 0 : title.trim();
|
|
49
|
+
return !t || /^untitled$/i.test(t) || /^new canvas$/i.test(t);
|
|
50
|
+
}
|
|
51
|
+
function buildBoardState(items, zoom, currentTitle) {
|
|
52
|
+
var _a;
|
|
53
|
+
const persistableItems = items.filter((it) => !isLocalOnlySrc(it.src));
|
|
54
|
+
const named = (_a = persistableItems.find((it) => it.generatedAssetName)) == null ? void 0 : _a.generatedAssetName;
|
|
55
|
+
return {
|
|
56
|
+
version: 1,
|
|
57
|
+
savedAt: Date.now(),
|
|
58
|
+
items: persistableItems,
|
|
59
|
+
zoom: clampZoom(zoom),
|
|
60
|
+
title: isUnsetBoardTitle(currentTitle) ? named : currentTitle
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
function boardSignature(state) {
|
|
64
|
+
var _a;
|
|
65
|
+
return JSON.stringify({
|
|
66
|
+
title: (_a = state.title) != null ? _a : "",
|
|
67
|
+
items: state.items.map((it) => {
|
|
68
|
+
var _a2;
|
|
69
|
+
return [it.id, it.type, it.src, (_a2 = it.generatedAssetName) != null ? _a2 : ""];
|
|
70
|
+
})
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
function newBoardId() {
|
|
74
|
+
const c = globalThis.crypto;
|
|
75
|
+
if (c == null ? void 0 : c.randomUUID) return c.randomUUID();
|
|
76
|
+
return `board-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;
|
|
77
|
+
}
|
|
41
78
|
function isRenderableItem(item) {
|
|
42
79
|
if (!item || typeof item !== "object") return false;
|
|
43
80
|
const c = item;
|
|
44
81
|
return typeof c.id === "string" && (c.type === "image" || c.type === "video" || c.type === "audio") && typeof c.src === "string" && c.src.length > 0 && !c.src.startsWith("blob:") && [c.x, c.y, c.width, c.height].every((n) => typeof n === "number" && Number.isFinite(n)) && c.width > 0 && c.height > 0;
|
|
45
82
|
}
|
|
83
|
+
function frameForUpload(type) {
|
|
84
|
+
if (type === "video") return {
|
|
85
|
+
x: 100,
|
|
86
|
+
y: 100,
|
|
87
|
+
width: 640,
|
|
88
|
+
height: 360
|
|
89
|
+
};
|
|
90
|
+
if (type === "audio") return {
|
|
91
|
+
x: 100,
|
|
92
|
+
y: 100,
|
|
93
|
+
width: 400,
|
|
94
|
+
height: 80
|
|
95
|
+
};
|
|
96
|
+
return {
|
|
97
|
+
x: 100,
|
|
98
|
+
y: 100,
|
|
99
|
+
width: 500,
|
|
100
|
+
height: 400
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
function coerceUploadSizedItem(item) {
|
|
104
|
+
const cap = frameForUpload(item.type);
|
|
105
|
+
if (item.width <= cap.width * 1.5 && item.height <= cap.height * 1.5) return item;
|
|
106
|
+
return __spreadProps(__spreadValues({}, item), {
|
|
107
|
+
width: cap.width,
|
|
108
|
+
height: cap.height,
|
|
109
|
+
x: item.x || cap.x,
|
|
110
|
+
y: item.y || cap.y
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
function dimsForAspect(aspect, maxEdge) {
|
|
114
|
+
const [w, h] = aspect.split(":").map(Number);
|
|
115
|
+
if (!w || !h) return {
|
|
116
|
+
width: maxEdge,
|
|
117
|
+
height: maxEdge
|
|
118
|
+
};
|
|
119
|
+
return w >= h ? {
|
|
120
|
+
width: maxEdge,
|
|
121
|
+
height: Math.round(maxEdge * h / w)
|
|
122
|
+
} : {
|
|
123
|
+
width: Math.round(maxEdge * w / h),
|
|
124
|
+
height: maxEdge
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
const MIN_ITEM_SIZE = 24;
|
|
128
|
+
function resizeFrame(frame, corner, dx, dy) {
|
|
129
|
+
"worklet";
|
|
130
|
+
const left = corner === "tl" || corner === "bl";
|
|
131
|
+
const top = corner === "tl" || corner === "tr";
|
|
132
|
+
const width = Math.max(MIN_ITEM_SIZE, left ? frame.width - dx : frame.width + dx);
|
|
133
|
+
const height = Math.max(MIN_ITEM_SIZE, top ? frame.height - dy : frame.height + dy);
|
|
134
|
+
return {
|
|
135
|
+
// Anchor the opposite corner: a left/top edge moves by however much the
|
|
136
|
+
// clamped size actually changed, not by the raw drag delta.
|
|
137
|
+
x: left ? frame.x + (frame.width - width) : frame.x,
|
|
138
|
+
y: top ? frame.y + (frame.height - height) : frame.y,
|
|
139
|
+
width,
|
|
140
|
+
height
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
function applyItemFrame(items, id, frame) {
|
|
144
|
+
return items.map((item) => item.id === id ? __spreadValues(__spreadValues({}, item), frame) : item);
|
|
145
|
+
}
|
|
46
146
|
const MIN_ZOOM = 0.25;
|
|
47
147
|
const MAX_ZOOM = 4;
|
|
48
148
|
function clampZoom(zoom) {
|
|
49
149
|
if (!Number.isFinite(zoom)) return 1;
|
|
50
150
|
return Math.min(MAX_ZOOM, Math.max(MIN_ZOOM, zoom));
|
|
51
|
-
}
|
|
151
|
+
}
|
|
152
|
+
function boardBounds(items) {
|
|
153
|
+
if (items.length === 0) return null;
|
|
154
|
+
let minX = Infinity;
|
|
155
|
+
let minY = Infinity;
|
|
156
|
+
let maxX = -Infinity;
|
|
157
|
+
let maxY = -Infinity;
|
|
158
|
+
for (const it of items) {
|
|
159
|
+
minX = Math.min(minX, it.x);
|
|
160
|
+
minY = Math.min(minY, it.y);
|
|
161
|
+
maxX = Math.max(maxX, it.x + it.width);
|
|
162
|
+
maxY = Math.max(maxY, it.y + it.height);
|
|
163
|
+
}
|
|
164
|
+
return {
|
|
165
|
+
minX,
|
|
166
|
+
minY,
|
|
167
|
+
maxX,
|
|
168
|
+
maxY
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
function paintOrder(items) {
|
|
172
|
+
return [...items].sort((a, b) => a.zIndex - b.zIndex || a.id.localeCompare(b.id));
|
|
173
|
+
}
|
|
174
|
+
function spreadStackedItems(items, gutter = 24) {
|
|
175
|
+
const seen = /* @__PURE__ */ new Map();
|
|
176
|
+
return items.map((item) => {
|
|
177
|
+
var _a;
|
|
178
|
+
const key = `${item.x}|${item.y}|${item.width}|${item.height}`;
|
|
179
|
+
const n = (_a = seen.get(key)) != null ? _a : 0;
|
|
180
|
+
seen.set(key, n + 1);
|
|
181
|
+
return n === 0 ? item : __spreadProps(__spreadValues({}, item), {
|
|
182
|
+
x: item.x + (item.width + gutter) * n
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
function removeItem(items, id) {
|
|
187
|
+
return items.filter((i) => i.id !== id);
|
|
188
|
+
}export{MAX_ZOOM,MIN_ITEM_SIZE,MIN_ZOOM,applyItemFrame,boardBounds,boardSignature,buildBoardState,clampZoom,coerceUploadSizedItem,dimsForAspect,emptyBoardState,frameForUpload,isLocalOnlySrc,isRenderableItem,isUnsetBoardTitle,newBoardId,paintOrder,parseBoardState,removeItem,resizeFrame,spreadStackedItems};//# sourceMappingURL=canvasCore.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canvasCore.js","sources":["../../../src/features/canvas/canvasCore.ts"],"sourcesContent":["/**\n * Platform-agnostic canvas document model — the native twin of the web\n * surface's `state/boards.ts` (`@yantra/canvas-surface`).\n *\n * The shapes are copied, not imported: the surface package builds for the DOM\n * (react-dom peer, vite, `crypto.randomUUID`), so importing it would drag the\n * web toolchain into Metro. The contract that actually matters is the persisted\n * JSON — `PersistedCanvasState` version 1 — and tests below pin this file to\n * fixtures of that JSON, so drift between the copies fails a test rather than\n * corrupting a board.\n *\n * Everything here is pure data + math so it runs identically under Metro,\n * vite, and jest: no RN imports, no DOM globals.\n */\n\nexport interface CanvasItem {\n id: string;\n type: 'image' | 'video' | 'audio';\n src: string;\n x: number;\n y: number;\n width: number;\n height: number;\n zIndex: number;\n generatedAssetName?: string;\n}\n\nexport interface PersistedCanvasState {\n version: 1;\n savedAt: number;\n items: CanvasItem[];\n zoom: number;\n title?: string;\n}\n\n/** Parse a persisted board, tolerating the unknown: bad rows drop, not throw. */\nexport function parseBoardState(raw: unknown): PersistedCanvasState | null {\n if (!raw || typeof raw !== 'object') return null;\n const candidate = raw as Partial<PersistedCanvasState>;\n if (candidate.version !== 1 || !Array.isArray(candidate.items)) return null;\n const items = candidate.items.filter(isRenderableItem);\n return {\n version: 1,\n savedAt: typeof candidate.savedAt === 'number' ? candidate.savedAt : 0,\n items,\n zoom: clampZoom(typeof candidate.zoom === 'number' ? candidate.zoom : 1),\n ...(typeof candidate.title === 'string' && candidate.title ? { title: candidate.title } : {}),\n };\n}\n\n/** Blank board used when the index row has no items yet — native still opens it. */\nexport function emptyBoardState(title?: string): PersistedCanvasState {\n return {\n version: 1,\n savedAt: 0,\n items: [],\n zoom: 1,\n ...(title ? { title } : {}),\n };\n}\n\n/**\n * Media that cannot survive a reload. Web drops `blob:` (dies with the tab);\n * native also drops device URIs (`file:`, photo-library schemes) until the host\n * has uploaded them to storage — same rule as canvas-surface `buildBoardState`.\n */\nexport function isLocalOnlySrc(src: string): boolean {\n return /^(blob:|file:|content:|ph:|assets-library:|data:)/i.test(src.trim());\n}\n\n/**\n * State to write to the index. Title is sticky once the user (or the first\n * labelled item) sets it, matching web `buildBoardState`.\n */\n/** Placeholder titles native used to stamp on a blank board. Web leaves title\n * unset so the first upload (`IMG_0002`) becomes the grid name. */\nexport function isUnsetBoardTitle(title?: string): boolean {\n const t = title?.trim();\n return !t || /^untitled$/i.test(t) || /^new canvas$/i.test(t);\n}\n\n/** Web `addMediaItem` strips the extension so `IMG_0003.jpeg` → `IMG_0003`. */\nexport function labelFromFileName(name: string): string {\n const base = name.trim().split(/[\\\\/]/).pop() || name.trim();\n const stripped = base.replace(/\\.[^.]+$/, '');\n return stripped || base;\n}\n\nexport function buildBoardState(\n items: readonly CanvasItem[],\n zoom: number,\n currentTitle?: string,\n): PersistedCanvasState {\n const persistableItems = items.filter((it) => !isLocalOnlySrc(it.src));\n const named = persistableItems.find((it) => it.generatedAssetName)?.generatedAssetName;\n return {\n version: 1,\n savedAt: Date.now(),\n items: persistableItems,\n zoom: clampZoom(zoom),\n title: isUnsetBoardTitle(currentTitle) ? named : currentTitle,\n };\n}\n\n/**\n * Comparable fingerprint of what is worth a write. Geometry and zoom ride\n * along on the next real save but are not themselves a reason to hit the index\n * (web `boardSignature`).\n */\nexport function boardSignature(state: PersistedCanvasState): string {\n return JSON.stringify({\n title: state.title ?? '',\n items: state.items.map((it) => [it.id, it.type, it.src, it.generatedAssetName ?? '']),\n });\n}\n\n/** Mint a board id. The index upserts on `{tenantId, surface, channelId}` with no chat FK. */\nexport function newBoardId(): string {\n const c = globalThis.crypto as Crypto | undefined;\n if (c?.randomUUID) return c.randomUUID();\n return `board-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\n/** An item the viewer can draw. `blob:` URLs died with the web tab that made them. */\nexport function isRenderableItem(item: unknown): item is CanvasItem {\n if (!item || typeof item !== 'object') return false;\n const c = item as Partial<CanvasItem>;\n return (\n typeof c.id === 'string' &&\n (c.type === 'image' || c.type === 'video' || c.type === 'audio') &&\n typeof c.src === 'string' &&\n c.src.length > 0 &&\n !c.src.startsWith('blob:') &&\n [c.x, c.y, c.width, c.height].every((n) => typeof n === 'number' && Number.isFinite(n)) &&\n (c.width as number) > 0 &&\n (c.height as number) > 0\n );\n}\n\n/**\n * Board frame for an upload — twin of canvas-surface `addMediaItem`.\n * Web does not use the file's pixel size (a 12MP photo would fill the plane\n * and force 25% zoom). Image 500×400, video 640×360, audio 400×80, at (100,100).\n */\nexport function frameForUpload(type: CanvasItem['type']): Pick<CanvasItem, 'x' | 'y' | 'width' | 'height'> {\n if (type === 'video') return { x: 100, y: 100, width: 640, height: 360 };\n if (type === 'audio') return { x: 100, y: 100, width: 400, height: 80 };\n return { x: 100, y: 100, width: 500, height: 400 };\n}\n\n/** Device-pixel dumps (a 12MP photo) must not sit at 100% zoom and fill the phone. */\nexport function coerceUploadSizedItem(item: CanvasItem): CanvasItem {\n const cap = frameForUpload(item.type);\n if (item.width <= cap.width * 1.5 && item.height <= cap.height * 1.5) return item;\n return { ...item, width: cap.width, height: cap.height, x: item.x || cap.x, y: item.y || cap.y };\n}\n\n/** Twin of canvas-surface `dimsForAspect` — generated video/image frame size. */\nexport function dimsForAspect(aspect: string, maxEdge: number): { width: number; height: number } {\n const [w, h] = aspect.split(':').map(Number);\n if (!w || !h) return { width: maxEdge, height: maxEdge };\n return w >= h\n ? { width: maxEdge, height: Math.round((maxEdge * h) / w) }\n : { width: Math.round((maxEdge * w) / h), height: maxEdge };\n}\n\n/** Floor for item edits - a rect can never be resized away entirely. */\nexport const MIN_ITEM_SIZE = 24;\n\nexport interface ItemFrame {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport type ResizeCorner = 'tl' | 'tr' | 'bl' | 'br';\n\n/**\n * Resize `frame` by dragging `corner` by (dx, dy) board units, keeping the\n * OPPOSITE corner anchored - the gesture the selection handles drive. Both\n * axes move independently (free-form resize); each side clamps at\n * MIN_ITEM_SIZE so a rect can shrink to a nub but never invert or vanish.\n *\n * Marked as a worklet: the resize handles call this per-frame on the UI\n * thread. The directive is inert everywhere else (plain string in node/jest).\n */\nexport function resizeFrame(frame: ItemFrame, corner: ResizeCorner, dx: number, dy: number): ItemFrame {\n 'worklet';\n\n const left = corner === 'tl' || corner === 'bl';\n const top = corner === 'tl' || corner === 'tr';\n\n const width = Math.max(MIN_ITEM_SIZE, left ? frame.width - dx : frame.width + dx);\n const height = Math.max(MIN_ITEM_SIZE, top ? frame.height - dy : frame.height + dy);\n\n return {\n // Anchor the opposite corner: a left/top edge moves by however much the\n // clamped size actually changed, not by the raw drag delta.\n x: left ? frame.x + (frame.width - width) : frame.x,\n y: top ? frame.y + (frame.height - height) : frame.y,\n width,\n height,\n };\n}\n\n/** New items array with `id`'s frame replaced - the commit step after a drag\n * or resize gesture ends. Unknown ids return the array unchanged. */\nexport function applyItemFrame(items: readonly CanvasItem[], id: string, frame: ItemFrame): CanvasItem[] {\n return items.map((item) => (item.id === id ? { ...item, ...frame } : item));\n}\n\nexport const MIN_ZOOM = 0.25;\nexport const MAX_ZOOM = 4;\n\nexport function clampZoom(zoom: number): number {\n if (!Number.isFinite(zoom)) return 1;\n return Math.min(MAX_ZOOM, Math.max(MIN_ZOOM, zoom));\n}\n\nexport interface BoardBounds {\n minX: number;\n minY: number;\n maxX: number;\n maxY: number;\n}\n\n/** Union of item rects; null for an empty board (an empty union has no bounds). */\nexport function boardBounds(items: readonly CanvasItem[]): BoardBounds | null {\n if (items.length === 0) return null;\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (const it of items) {\n minX = Math.min(minX, it.x);\n minY = Math.min(minY, it.y);\n maxX = Math.max(maxX, it.x + it.width);\n maxY = Math.max(maxY, it.y + it.height);\n }\n return { minX, minY, maxX, maxY };\n}\n\nexport interface FitTransform {\n /** Uniform scale applied to board coordinates. */\n scale: number;\n /** Screen-space translation, applied after scaling. */\n translateX: number;\n translateY: number;\n}\n\n/**\n * Fit the whole board inside a viewport with a margin — the viewer's initial\n * camera. Pure math so pinch/pan gestures can start from a reproducible state.\n */\nexport function fitToViewport(\n bounds: BoardBounds,\n viewportWidth: number,\n viewportHeight: number,\n margin = 24,\n): FitTransform {\n const boardW = Math.max(1, bounds.maxX - bounds.minX);\n const boardH = Math.max(1, bounds.maxY - bounds.minY);\n const availW = Math.max(1, viewportWidth - margin * 2);\n const availH = Math.max(1, viewportHeight - margin * 2);\n const scale = clampZoom(Math.min(availW / boardW, availH / boardH));\n // Center the scaled board in the viewport.\n const translateX = (viewportWidth - boardW * scale) / 2 - bounds.minX * scale;\n const translateY = (viewportHeight - boardH * scale) / 2 - bounds.minY * scale;\n return { scale, translateX, translateY };\n}\n\n/** Painter's order: stable sort by zIndex so overlapping media stack as authored. */\nexport function paintOrder(items: readonly CanvasItem[]): CanvasItem[] {\n return [...items].sort((a, b) => a.zIndex - b.zIndex || a.id.localeCompare(b.id));\n}\n\n/**\n * Fan items with IDENTICAL rects into a row - a DISPLAY-layer fix.\n *\n * \"Save to canvas\" appends every file at the same default frame, so a board\n * the user never arranged holds its media exactly stacked: the viewer renders\n * all of them faithfully and shows only the top one. Items whose rect is an\n * exact duplicate of an earlier item's slide right by (width + gutter) each,\n * so every file is visible side by side; a board with a real layout has no\n * exact duplicates and passes through untouched.\n *\n * Deliberately not persisted: the spread is how the board is SHOWN, and only\n * becomes real geometry if the user drags an item, which commits that item's\n * new frame like any other edit.\n */\nexport function spreadStackedItems(items: readonly CanvasItem[], gutter = 24): CanvasItem[] {\n const seen = new Map<string, number>();\n return items.map((item) => {\n const key = `${item.x}|${item.y}|${item.width}|${item.height}`;\n const n = seen.get(key) ?? 0;\n seen.set(key, n + 1);\n return n === 0 ? item : { ...item, x: item.x + (item.width + gutter) * n };\n });\n}\n\n/** New list with `id` painted above every other item; absent id = no-op. */\nexport function bringToFront(items: readonly CanvasItem[], id: string): CanvasItem[] {\n const top = Math.max(...items.map((i) => i.zIndex), 0);\n return items.map((i) => (i.id === id && i.zIndex <= top ? { ...i, zIndex: top + 1 } : i));\n}\n\n/** New list with `id` painted below every other item; absent id = no-op. */\nexport function sendToBack(items: readonly CanvasItem[], id: string): CanvasItem[] {\n const bottom = Math.min(...items.map((i) => i.zIndex), 0);\n return items.map((i) => (i.id === id && i.zIndex >= bottom ? { ...i, zIndex: bottom - 1 } : i));\n}\n\n/** New list without `id`; absent id = same content. */\nexport function removeItem(items: readonly CanvasItem[], id: string): CanvasItem[] {\n return items.filter((i) => i.id !== id);\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAmCO,SAAS,gBAAgB,GAA2C,EAAA;AACzE,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,UAAiB,OAAA,IAAA;AAC5C,EAAA,MAAM,SAAY,GAAA,GAAA;AAClB,EAAI,IAAA,SAAA,CAAU,YAAY,CAAK,IAAA,CAAC,MAAM,OAAQ,CAAA,SAAA,CAAU,KAAK,CAAA,EAAU,OAAA,IAAA;AACvE,EAAA,MAAM,KAAQ,GAAA,SAAA,CAAU,KAAM,CAAA,MAAA,CAAO,gBAAgB,CAAA;AACrD,EAAO,OAAA,cAAA,CAAA;AAAA,IACL,OAAS,EAAA,CAAA;AAAA,IACT,SAAS,OAAO,SAAA,CAAU,OAAY,KAAA,QAAA,GAAW,UAAU,OAAU,GAAA,CAAA;AAAA,IACrE,KAAA;AAAA,IACA,IAAA,EAAM,UAAU,OAAO,SAAA,CAAU,SAAS,QAAW,GAAA,SAAA,CAAU,OAAO,CAAC;AAAA,GAAA,EACnE,OAAO,SAAA,CAAU,KAAU,KAAA,QAAA,IAAY,UAAU,KAAQ,GAAA;AAAA,IAC3D,OAAO,SAAU,CAAA;AAAA,MACf,EAAC,CAAA;AAET;AAGO,SAAS,gBAAgB,KAAsC,EAAA;AACpE,EAAO,OAAA,cAAA,CAAA;AAAA,IACL,OAAS,EAAA,CAAA;AAAA,IACT,OAAS,EAAA,CAAA;AAAA,IACT,OAAO,EAAC;AAAA,IACR,IAAM,EAAA;AAAA,GAAA,EACF,KAAQ,GAAA;AAAA,IACV;AAAA,MACE,EAAC,CAAA;AAET;AA4DO,SAAS,iBAAiB,IAAmC,EAAA;AAClE,EAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,UAAiB,OAAA,KAAA;AAC9C,EAAA,MAAM,CAAI,GAAA,IAAA;AACV,EAAO,OAAA,OAAO,EAAE,EAAO,KAAA,QAAA,KAAa,EAAE,IAAS,KAAA,OAAA,IAAW,CAAE,CAAA,IAAA,KAAS,OAAW,IAAA,CAAA,CAAE,SAAS,OAAY,CAAA,IAAA,OAAO,CAAE,CAAA,GAAA,KAAQ,QAAY,IAAA,CAAA,CAAE,IAAI,MAAS,GAAA,CAAA,IAAK,CAAC,CAAA,CAAE,GAAI,CAAA,UAAA,CAAW,OAAO,CAAK,IAAA,CAAC,CAAE,CAAA,CAAA,EAAG,CAAE,CAAA,CAAA,EAAG,EAAE,KAAO,EAAA,CAAA,CAAE,MAAM,CAAA,CAAE,KAAM,CAAA,CAAA,CAAA,KAAK,OAAO,CAAM,KAAA,QAAA,IAAY,MAAO,CAAA,QAAA,CAAS,CAAC,CAAC,KAAK,CAAE,CAAA,KAAA,GAAkB,CAAK,IAAA,CAAA,CAAE,MAAmB,GAAA,CAAA;AAC/T;AAwGO,MAAM,QAAW,GAAA;AACjB,MAAM,QAAW,GAAA;AACjB,SAAS,UAAU,IAAsB,EAAA;AAC9C,EAAA,IAAI,CAAC,MAAA,CAAO,QAAS,CAAA,IAAI,GAAU,OAAA,CAAA;AACnC,EAAA,OAAO,KAAK,GAAI,CAAA,QAAA,EAAU,KAAK,GAAI,CAAA,QAAA,EAAU,IAAI,CAAC,CAAA;AACpD"}
|
|
1
|
+
{"version":3,"file":"canvasCore.js","sources":["../../../src/features/canvas/canvasCore.ts"],"sourcesContent":["/**\n * Platform-agnostic canvas document model — the native twin of the web\n * surface's `state/boards.ts` (`@yantra/canvas-surface`).\n *\n * The shapes are copied, not imported: the surface package builds for the DOM\n * (react-dom peer, vite, `crypto.randomUUID`), so importing it would drag the\n * web toolchain into Metro. The contract that actually matters is the persisted\n * JSON — `PersistedCanvasState` version 1 — and tests below pin this file to\n * fixtures of that JSON, so drift between the copies fails a test rather than\n * corrupting a board.\n *\n * Everything here is pure data + math so it runs identically under Metro,\n * vite, and jest: no RN imports, no DOM globals.\n */\n\nexport interface CanvasItem {\n id: string;\n type: 'image' | 'video' | 'audio';\n src: string;\n x: number;\n y: number;\n width: number;\n height: number;\n zIndex: number;\n generatedAssetName?: string;\n}\n\nexport interface PersistedCanvasState {\n version: 1;\n savedAt: number;\n items: CanvasItem[];\n zoom: number;\n title?: string;\n}\n\n/** Parse a persisted board, tolerating the unknown: bad rows drop, not throw. */\nexport function parseBoardState(raw: unknown): PersistedCanvasState | null {\n if (!raw || typeof raw !== 'object') return null;\n const candidate = raw as Partial<PersistedCanvasState>;\n if (candidate.version !== 1 || !Array.isArray(candidate.items)) return null;\n const items = candidate.items.filter(isRenderableItem);\n return {\n version: 1,\n savedAt: typeof candidate.savedAt === 'number' ? candidate.savedAt : 0,\n items,\n zoom: clampZoom(typeof candidate.zoom === 'number' ? candidate.zoom : 1),\n ...(typeof candidate.title === 'string' && candidate.title ? { title: candidate.title } : {}),\n };\n}\n\n/** Blank board used when the index row has no items yet — native still opens it. */\nexport function emptyBoardState(title?: string): PersistedCanvasState {\n return {\n version: 1,\n savedAt: 0,\n items: [],\n zoom: 1,\n ...(title ? { title } : {}),\n };\n}\n\n/**\n * Media that cannot survive a reload. Web drops `blob:` (dies with the tab);\n * native also drops device URIs (`file:`, photo-library schemes) until the host\n * has uploaded them to storage — same rule as canvas-surface `buildBoardState`.\n */\nexport function isLocalOnlySrc(src: string): boolean {\n return /^(blob:|file:|content:|ph:|assets-library:|data:)/i.test(src.trim());\n}\n\n/**\n * State to write to the index. Title is sticky once the user (or the first\n * labelled item) sets it, matching web `buildBoardState`.\n */\n/** Placeholder titles native used to stamp on a blank board. Web leaves title\n * unset so the first upload (`IMG_0002`) becomes the grid name. */\nexport function isUnsetBoardTitle(title?: string): boolean {\n const t = title?.trim();\n return !t || /^untitled$/i.test(t) || /^new canvas$/i.test(t);\n}\n\n/** Web `addMediaItem` strips the extension so `IMG_0003.jpeg` → `IMG_0003`. */\nexport function labelFromFileName(name: string): string {\n const base = name.trim().split(/[\\\\/]/).pop() || name.trim();\n const stripped = base.replace(/\\.[^.]+$/, '');\n return stripped || base;\n}\n\nexport function buildBoardState(\n items: readonly CanvasItem[],\n zoom: number,\n currentTitle?: string,\n): PersistedCanvasState {\n const persistableItems = items.filter((it) => !isLocalOnlySrc(it.src));\n const named = persistableItems.find((it) => it.generatedAssetName)?.generatedAssetName;\n return {\n version: 1,\n savedAt: Date.now(),\n items: persistableItems,\n zoom: clampZoom(zoom),\n title: isUnsetBoardTitle(currentTitle) ? named : currentTitle,\n };\n}\n\n/**\n * Comparable fingerprint of what is worth a write. Geometry and zoom ride\n * along on the next real save but are not themselves a reason to hit the index\n * (web `boardSignature`).\n */\nexport function boardSignature(state: PersistedCanvasState): string {\n return JSON.stringify({\n title: state.title ?? '',\n items: state.items.map((it) => [it.id, it.type, it.src, it.generatedAssetName ?? '']),\n });\n}\n\n/** Mint a board id. The index upserts on `{tenantId, surface, channelId}` with no chat FK. */\nexport function newBoardId(): string {\n const c = globalThis.crypto as Crypto | undefined;\n if (c?.randomUUID) return c.randomUUID();\n return `board-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\n/** An item the viewer can draw. `blob:` URLs died with the web tab that made them. */\nexport function isRenderableItem(item: unknown): item is CanvasItem {\n if (!item || typeof item !== 'object') return false;\n const c = item as Partial<CanvasItem>;\n return (\n typeof c.id === 'string' &&\n (c.type === 'image' || c.type === 'video' || c.type === 'audio') &&\n typeof c.src === 'string' &&\n c.src.length > 0 &&\n !c.src.startsWith('blob:') &&\n [c.x, c.y, c.width, c.height].every((n) => typeof n === 'number' && Number.isFinite(n)) &&\n (c.width as number) > 0 &&\n (c.height as number) > 0\n );\n}\n\n/**\n * Board frame for an upload — twin of canvas-surface `addMediaItem`.\n * Web does not use the file's pixel size (a 12MP photo would fill the plane\n * and force 25% zoom). Image 500×400, video 640×360, audio 400×80, at (100,100).\n */\nexport function frameForUpload(type: CanvasItem['type']): Pick<CanvasItem, 'x' | 'y' | 'width' | 'height'> {\n if (type === 'video') return { x: 100, y: 100, width: 640, height: 360 };\n if (type === 'audio') return { x: 100, y: 100, width: 400, height: 80 };\n return { x: 100, y: 100, width: 500, height: 400 };\n}\n\n/** Device-pixel dumps (a 12MP photo) must not sit at 100% zoom and fill the phone. */\nexport function coerceUploadSizedItem(item: CanvasItem): CanvasItem {\n const cap = frameForUpload(item.type);\n if (item.width <= cap.width * 1.5 && item.height <= cap.height * 1.5) return item;\n return { ...item, width: cap.width, height: cap.height, x: item.x || cap.x, y: item.y || cap.y };\n}\n\n/** Twin of canvas-surface `dimsForAspect` — generated video/image frame size. */\nexport function dimsForAspect(aspect: string, maxEdge: number): { width: number; height: number } {\n const [w, h] = aspect.split(':').map(Number);\n if (!w || !h) return { width: maxEdge, height: maxEdge };\n return w >= h\n ? { width: maxEdge, height: Math.round((maxEdge * h) / w) }\n : { width: Math.round((maxEdge * w) / h), height: maxEdge };\n}\n\n/** Floor for item edits - a rect can never be resized away entirely. */\nexport const MIN_ITEM_SIZE = 24;\n\nexport interface ItemFrame {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport type ResizeCorner = 'tl' | 'tr' | 'bl' | 'br';\n\n/**\n * Resize `frame` by dragging `corner` by (dx, dy) board units, keeping the\n * OPPOSITE corner anchored - the gesture the selection handles drive. Both\n * axes move independently (free-form resize); each side clamps at\n * MIN_ITEM_SIZE so a rect can shrink to a nub but never invert or vanish.\n *\n * Marked as a worklet: the resize handles call this per-frame on the UI\n * thread. The directive is inert everywhere else (plain string in node/jest).\n */\nexport function resizeFrame(frame: ItemFrame, corner: ResizeCorner, dx: number, dy: number): ItemFrame {\n 'worklet';\n\n const left = corner === 'tl' || corner === 'bl';\n const top = corner === 'tl' || corner === 'tr';\n\n const width = Math.max(MIN_ITEM_SIZE, left ? frame.width - dx : frame.width + dx);\n const height = Math.max(MIN_ITEM_SIZE, top ? frame.height - dy : frame.height + dy);\n\n return {\n // Anchor the opposite corner: a left/top edge moves by however much the\n // clamped size actually changed, not by the raw drag delta.\n x: left ? frame.x + (frame.width - width) : frame.x,\n y: top ? frame.y + (frame.height - height) : frame.y,\n width,\n height,\n };\n}\n\n/** New items array with `id`'s frame replaced - the commit step after a drag\n * or resize gesture ends. Unknown ids return the array unchanged. */\nexport function applyItemFrame(items: readonly CanvasItem[], id: string, frame: ItemFrame): CanvasItem[] {\n return items.map((item) => (item.id === id ? { ...item, ...frame } : item));\n}\n\nexport const MIN_ZOOM = 0.25;\nexport const MAX_ZOOM = 4;\n\nexport function clampZoom(zoom: number): number {\n if (!Number.isFinite(zoom)) return 1;\n return Math.min(MAX_ZOOM, Math.max(MIN_ZOOM, zoom));\n}\n\nexport interface BoardBounds {\n minX: number;\n minY: number;\n maxX: number;\n maxY: number;\n}\n\n/** Union of item rects; null for an empty board (an empty union has no bounds). */\nexport function boardBounds(items: readonly CanvasItem[]): BoardBounds | null {\n if (items.length === 0) return null;\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (const it of items) {\n minX = Math.min(minX, it.x);\n minY = Math.min(minY, it.y);\n maxX = Math.max(maxX, it.x + it.width);\n maxY = Math.max(maxY, it.y + it.height);\n }\n return { minX, minY, maxX, maxY };\n}\n\nexport interface FitTransform {\n /** Uniform scale applied to board coordinates. */\n scale: number;\n /** Screen-space translation, applied after scaling. */\n translateX: number;\n translateY: number;\n}\n\n/**\n * Fit the whole board inside a viewport with a margin — the viewer's initial\n * camera. Pure math so pinch/pan gestures can start from a reproducible state.\n */\nexport function fitToViewport(\n bounds: BoardBounds,\n viewportWidth: number,\n viewportHeight: number,\n margin = 24,\n): FitTransform {\n const boardW = Math.max(1, bounds.maxX - bounds.minX);\n const boardH = Math.max(1, bounds.maxY - bounds.minY);\n const availW = Math.max(1, viewportWidth - margin * 2);\n const availH = Math.max(1, viewportHeight - margin * 2);\n const scale = clampZoom(Math.min(availW / boardW, availH / boardH));\n // Center the scaled board in the viewport.\n const translateX = (viewportWidth - boardW * scale) / 2 - bounds.minX * scale;\n const translateY = (viewportHeight - boardH * scale) / 2 - bounds.minY * scale;\n return { scale, translateX, translateY };\n}\n\n/** Painter's order: stable sort by zIndex so overlapping media stack as authored. */\nexport function paintOrder(items: readonly CanvasItem[]): CanvasItem[] {\n return [...items].sort((a, b) => a.zIndex - b.zIndex || a.id.localeCompare(b.id));\n}\n\n/**\n * Fan items with IDENTICAL rects into a row - a DISPLAY-layer fix.\n *\n * \"Save to canvas\" appends every file at the same default frame, so a board\n * the user never arranged holds its media exactly stacked: the viewer renders\n * all of them faithfully and shows only the top one. Items whose rect is an\n * exact duplicate of an earlier item's slide right by (width + gutter) each,\n * so every file is visible side by side; a board with a real layout has no\n * exact duplicates and passes through untouched.\n *\n * Deliberately not persisted: the spread is how the board is SHOWN, and only\n * becomes real geometry if the user drags an item, which commits that item's\n * new frame like any other edit.\n */\nexport function spreadStackedItems(items: readonly CanvasItem[], gutter = 24): CanvasItem[] {\n const seen = new Map<string, number>();\n return items.map((item) => {\n const key = `${item.x}|${item.y}|${item.width}|${item.height}`;\n const n = seen.get(key) ?? 0;\n seen.set(key, n + 1);\n return n === 0 ? item : { ...item, x: item.x + (item.width + gutter) * n };\n });\n}\n\n/** New list with `id` painted above every other item; absent id = no-op. */\nexport function bringToFront(items: readonly CanvasItem[], id: string): CanvasItem[] {\n const top = Math.max(...items.map((i) => i.zIndex), 0);\n return items.map((i) => (i.id === id && i.zIndex <= top ? { ...i, zIndex: top + 1 } : i));\n}\n\n/** New list with `id` painted below every other item; absent id = no-op. */\nexport function sendToBack(items: readonly CanvasItem[], id: string): CanvasItem[] {\n const bottom = Math.min(...items.map((i) => i.zIndex), 0);\n return items.map((i) => (i.id === id && i.zIndex >= bottom ? { ...i, zIndex: bottom - 1 } : i));\n}\n\n/** New list without `id`; absent id = same content. */\nexport function removeItem(items: readonly CanvasItem[], id: string): CanvasItem[] {\n return items.filter((i) => i.id !== id);\n}\n"],"names":["_a"],"mappings":"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"}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import {resultUrl,generationMediaUrl}from'./videoEditor/mediaActions.js';import {buildVideoGenerateParams}from'./generationModels.js';import {unwrapProxyUrl}from'./videoEditor/remoteMediaClient.js';import {continuationPrompt}from'./extendVideo.js';var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
3
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
4
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
5
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
6
|
+
var __spreadValues = (a, b) => {
|
|
7
|
+
for (var prop in b || (b = {}))
|
|
8
|
+
if (__hasOwnProp.call(b, prop))
|
|
9
|
+
__defNormalProp(a, prop, b[prop]);
|
|
10
|
+
if (__getOwnPropSymbols)
|
|
11
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
12
|
+
if (__propIsEnum.call(b, prop))
|
|
13
|
+
__defNormalProp(a, prop, b[prop]);
|
|
14
|
+
}
|
|
15
|
+
return a;
|
|
16
|
+
};
|
|
17
|
+
const REFRAME_RATIOS = ["9:16", "16:9", "4:3", "3:4", "21:9", "1:1"];
|
|
18
|
+
const UPSCALE_TARGETS = [{
|
|
19
|
+
id: "1080p",
|
|
20
|
+
label: "1080p",
|
|
21
|
+
longEdge: 1920
|
|
22
|
+
}, {
|
|
23
|
+
id: "2k",
|
|
24
|
+
label: "2K",
|
|
25
|
+
longEdge: 2560
|
|
26
|
+
}, {
|
|
27
|
+
id: "4k",
|
|
28
|
+
label: "4K",
|
|
29
|
+
longEdge: 3840
|
|
30
|
+
}];
|
|
31
|
+
const evenDown = (n) => Math.max(2, Math.floor(n / 2) * 2);
|
|
32
|
+
const even = (n) => Math.max(2, Math.round(n / 2) * 2);
|
|
33
|
+
function parseRatio(ratio) {
|
|
34
|
+
const [w, h] = ratio.split(":").map(Number);
|
|
35
|
+
if (!Number.isFinite(w) || !Number.isFinite(h) || !w || !h) return null;
|
|
36
|
+
return w / h;
|
|
37
|
+
}
|
|
38
|
+
function reframePlan(src, ratio, fit) {
|
|
39
|
+
const target = parseRatio(ratio);
|
|
40
|
+
if (target === null || !(src.width > 0) || !(src.height > 0)) return null;
|
|
41
|
+
const current = src.width / src.height;
|
|
42
|
+
if (fit === "crop") {
|
|
43
|
+
let width2 = src.width;
|
|
44
|
+
let height2 = src.height;
|
|
45
|
+
if (current > target) width2 = src.height * target;
|
|
46
|
+
else height2 = src.width / target;
|
|
47
|
+
width2 = Math.min(evenDown(Math.round(width2)), evenDown(src.width));
|
|
48
|
+
height2 = Math.min(evenDown(Math.round(height2)), evenDown(src.height));
|
|
49
|
+
return {
|
|
50
|
+
fit: "crop",
|
|
51
|
+
width: width2,
|
|
52
|
+
height: height2,
|
|
53
|
+
x: Math.floor((src.width - width2) / 2),
|
|
54
|
+
y: Math.floor((src.height - height2) / 2)
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
let width = src.width;
|
|
58
|
+
let height = src.height;
|
|
59
|
+
if (current > target) height = even(src.width / target);
|
|
60
|
+
else width = even(src.height * target);
|
|
61
|
+
return {
|
|
62
|
+
fit: "fit",
|
|
63
|
+
width,
|
|
64
|
+
height
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
function upscalePlan(src, target) {
|
|
68
|
+
const t = UPSCALE_TARGETS.find((u) => u.id === target);
|
|
69
|
+
if (!t || !(src.width > 0) || !(src.height > 0)) return null;
|
|
70
|
+
const long = Math.max(src.width, src.height);
|
|
71
|
+
if (long >= t.longEdge) return null;
|
|
72
|
+
const scale = t.longEdge / long;
|
|
73
|
+
return {
|
|
74
|
+
width: even(src.width * scale),
|
|
75
|
+
height: even(src.height * scale)
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
async function runImage(run, action, params) {
|
|
79
|
+
const result = await run("yantra-image-editing", action, params);
|
|
80
|
+
return resultUrl(result, action);
|
|
81
|
+
}
|
|
82
|
+
async function runVideo(run, action, params) {
|
|
83
|
+
const result = await run("yantra-video-editing", action, params);
|
|
84
|
+
return resultUrl(result, action);
|
|
85
|
+
}
|
|
86
|
+
async function runReframe(run, kind, src, plan) {
|
|
87
|
+
const url = unwrapProxyUrl(src);
|
|
88
|
+
if (kind === "image") {
|
|
89
|
+
if (plan.fit === "crop") {
|
|
90
|
+
return runImage(run, "YANTRA_IMAGE_EDIT_CROP", {
|
|
91
|
+
input_url: url,
|
|
92
|
+
x: plan.x,
|
|
93
|
+
y: plan.y,
|
|
94
|
+
width: plan.width,
|
|
95
|
+
height: plan.height
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
return runImage(run, "YANTRA_IMAGE_EDIT_PAD", {
|
|
99
|
+
input_url: url,
|
|
100
|
+
width: plan.width,
|
|
101
|
+
height: plan.height
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
if (plan.fit === "crop") {
|
|
105
|
+
return runVideo(run, "YANTRA_VIDEO_EDIT_CROP", {
|
|
106
|
+
input_url: url,
|
|
107
|
+
x: plan.x,
|
|
108
|
+
y: plan.y,
|
|
109
|
+
width: plan.width,
|
|
110
|
+
height: plan.height
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
return runVideo(run, "YANTRA_VIDEO_EDIT_TRANSCODE", {
|
|
114
|
+
input_url: url,
|
|
115
|
+
resolution: `${plan.width}x${plan.height}`
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
async function runRemoveBackground(run, kind, src) {
|
|
119
|
+
const url = unwrapProxyUrl(src);
|
|
120
|
+
if (kind === "image") {
|
|
121
|
+
return runImage(run, "YANTRA_IMAGE_EDIT_REMOVE_BACKGROUND", {
|
|
122
|
+
input_url: url
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
return runVideo(run, "YANTRA_VIDEO_EDIT_CHROMAKEY", {
|
|
126
|
+
input_url: url,
|
|
127
|
+
color: "auto",
|
|
128
|
+
similarity: 0.2,
|
|
129
|
+
blend: 0.1
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
async function runUpscale(run, kind, src, out) {
|
|
133
|
+
const url = unwrapProxyUrl(src);
|
|
134
|
+
if (kind === "image") {
|
|
135
|
+
return runImage(run, "YANTRA_IMAGE_EDIT_RESIZE", {
|
|
136
|
+
input_url: url,
|
|
137
|
+
width: out.width,
|
|
138
|
+
height: out.height,
|
|
139
|
+
fit: "fill"
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
return runVideo(run, "YANTRA_VIDEO_EDIT_TRANSCODE", {
|
|
143
|
+
input_url: url,
|
|
144
|
+
resolution: `${out.width}x${out.height}`
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
async function runMatchLook(run, kind, src) {
|
|
148
|
+
const url = unwrapProxyUrl(src);
|
|
149
|
+
if (kind === "image") {
|
|
150
|
+
return runImage(run, "YANTRA_IMAGE_EDIT_FINETUNE", {
|
|
151
|
+
input_url: url,
|
|
152
|
+
brightness: 0.02,
|
|
153
|
+
contrast: 1.15,
|
|
154
|
+
saturation: 1.1
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
return runVideo(run, "YANTRA_VIDEO_EDIT_COLOR_ADJUST", {
|
|
158
|
+
input_url: url,
|
|
159
|
+
brightness: 0.02,
|
|
160
|
+
contrast: 1.15,
|
|
161
|
+
saturation: 1.1
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
async function runLipSync(run, videoSrc, opts) {
|
|
165
|
+
var _a, _b, _c;
|
|
166
|
+
const videoUrl = unwrapProxyUrl(videoSrc);
|
|
167
|
+
const submit = await run("yantra-audio", "YANTRA_AUDIO_LIPSYNC_SUBMIT", __spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues({
|
|
168
|
+
video_url: videoUrl
|
|
169
|
+
}, opts.audioUrl ? {
|
|
170
|
+
audio_url: unwrapProxyUrl(opts.audioUrl)
|
|
171
|
+
} : {}), ((_a = opts.text) == null ? void 0 : _a.trim()) && !opts.audioUrl ? {
|
|
172
|
+
text: opts.text.trim()
|
|
173
|
+
} : {}), opts.model ? {
|
|
174
|
+
model: opts.model
|
|
175
|
+
} : {}), opts.syncMode ? {
|
|
176
|
+
sync_mode: opts.syncMode
|
|
177
|
+
} : {}), opts.voiceId ? {
|
|
178
|
+
voice_id: opts.voiceId
|
|
179
|
+
} : {}));
|
|
180
|
+
const body = (_b = submit.data && typeof submit.data === "object" ? submit.data : submit) != null ? _b : {};
|
|
181
|
+
const requestId = typeof body.requestId === "string" ? body.requestId : "";
|
|
182
|
+
const statusUrl = typeof body.statusUrl === "string" ? body.statusUrl : "";
|
|
183
|
+
if (!requestId) throw new Error("Lip sync did not return a queue handle");
|
|
184
|
+
const deadline = Date.now() + 12 * 6e4;
|
|
185
|
+
while (Date.now() < deadline) {
|
|
186
|
+
await new Promise((r) => setTimeout(r, 5e3));
|
|
187
|
+
const poll = await run("yantra-audio", "YANTRA_AUDIO_LIPSYNC_STATUS", __spreadValues({
|
|
188
|
+
requestId
|
|
189
|
+
}, statusUrl ? {
|
|
190
|
+
statusUrl
|
|
191
|
+
} : {}));
|
|
192
|
+
const p = (_c = poll.data && typeof poll.data === "object" ? poll.data : poll) != null ? _c : {};
|
|
193
|
+
const state = typeof p.state === "string" ? p.state : typeof p.status === "string" ? p.status : "";
|
|
194
|
+
if (state === "succeeded" || state === "completed") {
|
|
195
|
+
const url = typeof p.videoUrl === "string" && p.videoUrl || typeof p.url === "string" && p.url || resultUrl(poll, "YANTRA_AUDIO_LIPSYNC_STATUS");
|
|
196
|
+
if (url) return url;
|
|
197
|
+
throw new Error("Lip sync finished without a video URL");
|
|
198
|
+
}
|
|
199
|
+
if (state === "failed" || state === "error") {
|
|
200
|
+
throw new Error(typeof p.error === "string" ? p.error : "Lip sync failed");
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
throw new Error("Lip sync is taking longer than expected");
|
|
204
|
+
}
|
|
205
|
+
async function runExtendVideo(run, videoSrc, prompt) {
|
|
206
|
+
const url = unwrapProxyUrl(videoSrc);
|
|
207
|
+
const thumb = await run("yantra-video-editing", "YANTRA_VIDEO_EDIT_THUMBNAIL", {
|
|
208
|
+
input_url: url,
|
|
209
|
+
at_end: true,
|
|
210
|
+
backoff_secs: 0.08
|
|
211
|
+
});
|
|
212
|
+
const frameUrl = resultUrl(thumb, "YANTRA_VIDEO_EDIT_THUMBNAIL");
|
|
213
|
+
const generated = await run("yantra-video-generation", "YANTRA_VIDEO_GENERATION_GENERATE", buildVideoGenerateParams({
|
|
214
|
+
prompt: continuationPrompt(prompt),
|
|
215
|
+
aspectRatio: "16:9",
|
|
216
|
+
referenceImageUrl: frameUrl,
|
|
217
|
+
durationSeconds: 4
|
|
218
|
+
}));
|
|
219
|
+
const nextUrl = generationMediaUrl(generated);
|
|
220
|
+
const concat = await run("yantra-video-editing", "YANTRA_VIDEO_EDIT_CONCAT", {
|
|
221
|
+
input_urls: [url, nextUrl]
|
|
222
|
+
});
|
|
223
|
+
return resultUrl(concat, "YANTRA_VIDEO_EDIT_CONCAT");
|
|
224
|
+
}export{REFRAME_RATIOS,UPSCALE_TARGETS,parseRatio,reframePlan,runExtendVideo,runLipSync,runMatchLook,runReframe,runRemoveBackground,runUpscale,upscalePlan};//# sourceMappingURL=canvasEditOps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvasEditOps.js","sources":["../../../src/features/canvas/canvasEditOps.ts"],"sourcesContent":["/**\n * Native runners for canvas edit tools — twin of web reframe/upscale/editOps\n * + lipsyncRpc, driven by RunMediaAction.\n */\nimport { generationMediaUrl, resultUrl, type RunMediaAction } from './videoEditor/mediaActions';\nimport { buildVideoGenerateParams } from './generationModels';\nimport { unwrapProxyUrl } from './videoEditor/remoteMediaClient';\nimport { continuationPrompt } from './extendVideo';\n\nexport const REFRAME_RATIOS = ['9:16', '16:9', '4:3', '3:4', '21:9', '1:1'] as const;\nexport type ReframeRatio = (typeof REFRAME_RATIOS)[number];\nexport type ReframeFit = 'crop' | 'fit';\n\nexport interface Dims {\n width: number;\n height: number;\n}\n\nexport const UPSCALE_TARGETS = [\n { id: '1080p', label: '1080p', longEdge: 1920 },\n { id: '2k', label: '2K', longEdge: 2560 },\n { id: '4k', label: '4K', longEdge: 3840 },\n] as const;\n\nexport type UpscaleTarget = (typeof UPSCALE_TARGETS)[number]['id'];\n\nconst evenDown = (n: number) => Math.max(2, Math.floor(n / 2) * 2);\nconst even = (n: number) => Math.max(2, Math.round(n / 2) * 2);\n\nexport function parseRatio(ratio: string): number | null {\n const [w, h] = ratio.split(':').map(Number);\n if (!Number.isFinite(w) || !Number.isFinite(h) || !w || !h) return null;\n return w / h;\n}\n\nexport type ReframePlan =\n | { fit: 'crop'; width: number; height: number; x: number; y: number }\n | { fit: 'fit'; width: number; height: number };\n\nexport function reframePlan(src: Dims, ratio: string, fit: ReframeFit): ReframePlan | null {\n const target = parseRatio(ratio);\n if (target === null || !(src.width > 0) || !(src.height > 0)) return null;\n const current = src.width / src.height;\n if (fit === 'crop') {\n let width = src.width;\n let height = src.height;\n if (current > target) width = src.height * target;\n else height = src.width / target;\n width = Math.min(evenDown(Math.round(width)), evenDown(src.width));\n height = Math.min(evenDown(Math.round(height)), evenDown(src.height));\n return {\n fit: 'crop',\n width,\n height,\n x: Math.floor((src.width - width) / 2),\n y: Math.floor((src.height - height) / 2),\n };\n }\n let width = src.width;\n let height = src.height;\n if (current > target) height = even(src.width / target);\n else width = even(src.height * target);\n return { fit: 'fit', width, height };\n}\n\nexport function upscalePlan(src: Dims, target: UpscaleTarget): Dims | null {\n const t = UPSCALE_TARGETS.find((u) => u.id === target);\n if (!t || !(src.width > 0) || !(src.height > 0)) return null;\n const long = Math.max(src.width, src.height);\n if (long >= t.longEdge) return null;\n const scale = t.longEdge / long;\n return { width: even(src.width * scale), height: even(src.height * scale) };\n}\n\nasync function runImage(run: RunMediaAction, action: string, params: Record<string, unknown>): Promise<string> {\n const result = await run('yantra-image-editing', action, params);\n return resultUrl(result, action);\n}\n\nasync function runVideo(run: RunMediaAction, action: string, params: Record<string, unknown>): Promise<string> {\n const result = await run('yantra-video-editing', action, params);\n return resultUrl(result, action);\n}\n\nexport async function runReframe(\n run: RunMediaAction,\n kind: 'image' | 'video',\n src: string,\n plan: ReframePlan,\n): Promise<string> {\n const url = unwrapProxyUrl(src);\n if (kind === 'image') {\n if (plan.fit === 'crop') {\n return runImage(run, 'YANTRA_IMAGE_EDIT_CROP', {\n input_url: url,\n x: plan.x,\n y: plan.y,\n width: plan.width,\n height: plan.height,\n });\n }\n return runImage(run, 'YANTRA_IMAGE_EDIT_PAD', {\n input_url: url,\n width: plan.width,\n height: plan.height,\n });\n }\n if (plan.fit === 'crop') {\n return runVideo(run, 'YANTRA_VIDEO_EDIT_CROP', {\n input_url: url,\n x: plan.x,\n y: plan.y,\n width: plan.width,\n height: plan.height,\n });\n }\n return runVideo(run, 'YANTRA_VIDEO_EDIT_TRANSCODE', {\n input_url: url,\n resolution: `${plan.width}x${plan.height}`,\n });\n}\n\nexport async function runRemoveBackground(run: RunMediaAction, kind: 'image' | 'video', src: string): Promise<string> {\n const url = unwrapProxyUrl(src);\n if (kind === 'image') {\n return runImage(run, 'YANTRA_IMAGE_EDIT_REMOVE_BACKGROUND', { input_url: url });\n }\n return runVideo(run, 'YANTRA_VIDEO_EDIT_CHROMAKEY', {\n input_url: url,\n color: 'auto',\n similarity: 0.2,\n blend: 0.1,\n });\n}\n\nexport async function runUpscale(\n run: RunMediaAction,\n kind: 'image' | 'video',\n src: string,\n out: Dims,\n): Promise<string> {\n const url = unwrapProxyUrl(src);\n if (kind === 'image') {\n return runImage(run, 'YANTRA_IMAGE_EDIT_RESIZE', {\n input_url: url,\n width: out.width,\n height: out.height,\n fit: 'fill',\n });\n }\n return runVideo(run, 'YANTRA_VIDEO_EDIT_TRANSCODE', {\n input_url: url,\n resolution: `${out.width}x${out.height}`,\n });\n}\n\n/** Simple grade: boost contrast/saturation slightly toward a cinematic look. */\nexport async function runMatchLook(run: RunMediaAction, kind: 'image' | 'video', src: string): Promise<string> {\n const url = unwrapProxyUrl(src);\n if (kind === 'image') {\n return runImage(run, 'YANTRA_IMAGE_EDIT_FINETUNE', {\n input_url: url,\n brightness: 0.02,\n contrast: 1.15,\n saturation: 1.1,\n });\n }\n return runVideo(run, 'YANTRA_VIDEO_EDIT_COLOR_ADJUST', {\n input_url: url,\n brightness: 0.02,\n contrast: 1.15,\n saturation: 1.1,\n });\n}\n\nexport async function runLipSync(\n run: RunMediaAction,\n videoSrc: string,\n opts: {\n text?: string;\n audioUrl?: string;\n model?: string;\n syncMode?: string;\n voiceId?: string;\n },\n): Promise<string> {\n const videoUrl = unwrapProxyUrl(videoSrc);\n const submit = await run('yantra-audio', 'YANTRA_AUDIO_LIPSYNC_SUBMIT', {\n video_url: videoUrl,\n ...(opts.audioUrl ? { audio_url: unwrapProxyUrl(opts.audioUrl) } : {}),\n ...(opts.text?.trim() && !opts.audioUrl ? { text: opts.text.trim() } : {}),\n ...(opts.model ? { model: opts.model } : {}),\n ...(opts.syncMode ? { sync_mode: opts.syncMode } : {}),\n ...(opts.voiceId ? { voice_id: opts.voiceId } : {}),\n });\n const body = ((submit.data && typeof submit.data === 'object' ? submit.data : submit) ?? {}) as Record<\n string,\n unknown\n >;\n const requestId = typeof body.requestId === 'string' ? body.requestId : '';\n const statusUrl = typeof body.statusUrl === 'string' ? body.statusUrl : '';\n if (!requestId) throw new Error('Lip sync did not return a queue handle');\n\n const deadline = Date.now() + 12 * 60_000;\n while (Date.now() < deadline) {\n await new Promise((r) => setTimeout(r, 5000));\n const poll = await run('yantra-audio', 'YANTRA_AUDIO_LIPSYNC_STATUS', {\n requestId,\n ...(statusUrl ? { statusUrl } : {}),\n });\n const p = ((poll.data && typeof poll.data === 'object' ? poll.data : poll) ?? {}) as Record<string, unknown>;\n const state = typeof p.state === 'string' ? p.state : typeof p.status === 'string' ? p.status : '';\n if (state === 'succeeded' || state === 'completed') {\n const url =\n (typeof p.videoUrl === 'string' && p.videoUrl) ||\n (typeof p.url === 'string' && p.url) ||\n resultUrl(poll, 'YANTRA_AUDIO_LIPSYNC_STATUS');\n if (url) return url;\n throw new Error('Lip sync finished without a video URL');\n }\n if (state === 'failed' || state === 'error') {\n throw new Error(typeof p.error === 'string' ? p.error : 'Lip sync failed');\n }\n }\n throw new Error('Lip sync is taking longer than expected');\n}\n\n/**\n * Extend: last-frame thumbnail → generate continuation → concat.\n */\nexport async function runExtendVideo(run: RunMediaAction, videoSrc: string, prompt: string): Promise<string> {\n const url = unwrapProxyUrl(videoSrc);\n const thumb = await run('yantra-video-editing', 'YANTRA_VIDEO_EDIT_THUMBNAIL', {\n input_url: url,\n at_end: true,\n backoff_secs: 0.08,\n });\n const frameUrl = resultUrl(thumb, 'YANTRA_VIDEO_EDIT_THUMBNAIL');\n const generated = await run(\n 'yantra-video-generation',\n 'YANTRA_VIDEO_GENERATION_GENERATE',\n buildVideoGenerateParams({\n prompt: continuationPrompt(prompt),\n aspectRatio: '16:9',\n referenceImageUrl: frameUrl,\n durationSeconds: 4,\n }),\n );\n const nextUrl = generationMediaUrl(generated);\n const concat = await run('yantra-video-editing', 'YANTRA_VIDEO_EDIT_CONCAT', {\n input_urls: [url, nextUrl],\n });\n return resultUrl(concat, 'YANTRA_VIDEO_EDIT_CONCAT');\n}\n"],"names":["width","height"],"mappings":"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"}
|