@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,72 @@
1
+ const SOURCE_LABELS = {
2
+ resortifi: "Yantra",
3
+ airbnb: "Airbnb",
4
+ booking: "Booking.com",
5
+ "hotels-com": "Hotels.com",
6
+ expedia: "Expedia",
7
+ "flight-search": "Flights",
8
+ turo: "Turo",
9
+ cars: "Cars",
10
+ chat: "Chat"
11
+ };
12
+ const SOURCE_BADGE = {
13
+ resortifi: {
14
+ bg: "#0c1a2e",
15
+ fg: "#93c5fd"
16
+ },
17
+ airbnb: {
18
+ bg: "#ff385c",
19
+ fg: "#fff"
20
+ },
21
+ booking: {
22
+ bg: "#003580",
23
+ fg: "#fff"
24
+ },
25
+ "hotels-com": {
26
+ bg: "#d32f2f",
27
+ fg: "#fff"
28
+ },
29
+ expedia: {
30
+ bg: "#ffc72c",
31
+ fg: "#0f172a"
32
+ },
33
+ "flight-search": {
34
+ bg: "#0c1a2e",
35
+ fg: "#93c5fd"
36
+ },
37
+ turo: {
38
+ bg: "#593bfb",
39
+ fg: "#fff"
40
+ },
41
+ cars: {
42
+ bg: "#0c1a2e",
43
+ fg: "#f5c26b"
44
+ },
45
+ chat: {
46
+ bg: "#2869E0",
47
+ fg: "#fff"
48
+ }
49
+ };
50
+ const SOURCE_ORDER = ["airbnb", "booking", "hotels-com", "expedia", "resortifi", "flight-search", "turo", "cars", "chat"];
51
+ function propertySource(property) {
52
+ return property.source;
53
+ }
54
+ function formatPriceLabel(property) {
55
+ var _a, _b;
56
+ if ((_a = property.priceLabel) == null ? void 0 : _a.trim()) return property.priceLabel.trim();
57
+ if (typeof property.price === "number" && Number.isFinite(property.price) && property.price > 0) {
58
+ const unit = (_b = property.priceUnit) != null ? _b : property.kind === "flight" ? "trip" : property.kind === "car" ? "day" : "night";
59
+ return `$${Math.round(property.price)} /${unit}`;
60
+ }
61
+ return "See price";
62
+ }
63
+ function kindLabel(kind) {
64
+ switch (kind) {
65
+ case "flight":
66
+ return "Flight";
67
+ case "car":
68
+ return "Car";
69
+ default:
70
+ return "Stay";
71
+ }
72
+ }export{SOURCE_BADGE,SOURCE_LABELS,SOURCE_ORDER,formatPriceLabel,kindLabel,propertySource};//# sourceMappingURL=catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.js","sources":["../../../src/features/travel/catalog.ts"],"sourcesContent":["import type { PropertySource, TravelProperty, TravelResultKind } from './types';\n\nexport const SOURCE_LABELS: Record<PropertySource, string> = {\n resortifi: 'Yantra',\n airbnb: 'Airbnb',\n booking: 'Booking.com',\n 'hotels-com': 'Hotels.com',\n expedia: 'Expedia',\n 'flight-search': 'Flights',\n turo: 'Turo',\n cars: 'Cars',\n chat: 'Chat',\n};\n\nexport const SOURCE_SECTION: Record<PropertySource, { title: string; subtitle: string }> = {\n airbnb: { title: 'Airbnb', subtitle: 'Homes and stays' },\n booking: { title: 'Booking.com', subtitle: 'Hotels worldwide' },\n 'hotels-com': { title: 'Hotels.com', subtitle: 'Hotel inventory' },\n expedia: { title: 'Expedia', subtitle: 'Packages and hotels' },\n resortifi: { title: 'Yantra stays', subtitle: 'Connector inventory' },\n 'flight-search': { title: 'Flights', subtitle: 'Bookable + meta-search fares' },\n turo: { title: 'Turo', subtitle: 'Peer-to-peer cars' },\n cars: { title: 'Car rentals', subtitle: 'Aggregators and priced offers' },\n chat: { title: 'Chat', subtitle: 'From the travel agent' },\n};\n\nexport const SOURCE_BADGE: Record<PropertySource, { bg: string; fg: string }> = {\n resortifi: { bg: '#0c1a2e', fg: '#93c5fd' },\n airbnb: { bg: '#ff385c', fg: '#fff' },\n booking: { bg: '#003580', fg: '#fff' },\n 'hotels-com': { bg: '#d32f2f', fg: '#fff' },\n expedia: { bg: '#ffc72c', fg: '#0f172a' },\n 'flight-search': { bg: '#0c1a2e', fg: '#93c5fd' },\n turo: { bg: '#593bfb', fg: '#fff' },\n cars: { bg: '#0c1a2e', fg: '#f5c26b' },\n chat: { bg: '#2869E0', fg: '#fff' },\n};\n\nexport const SOURCE_ORDER: PropertySource[] = [\n 'airbnb',\n 'booking',\n 'hotels-com',\n 'expedia',\n 'resortifi',\n 'flight-search',\n 'turo',\n 'cars',\n 'chat',\n];\n\nexport function propertySource(property: TravelProperty): PropertySource {\n return property.source;\n}\n\nexport function formatPriceLabel(property: TravelProperty): string {\n if (property.priceLabel?.trim()) return property.priceLabel.trim();\n if (typeof property.price === 'number' && Number.isFinite(property.price) && property.price > 0) {\n const unit =\n property.priceUnit ?? (property.kind === 'flight' ? 'trip' : property.kind === 'car' ? 'day' : 'night');\n return `$${Math.round(property.price)} /${unit}`;\n }\n return 'See price';\n}\n\nexport function kindLabel(kind?: TravelResultKind): string {\n switch (kind) {\n case 'flight':\n return 'Flight';\n case 'car':\n return 'Car';\n default:\n return 'Stay';\n }\n}\n"],"names":[],"mappings":"AACO,MAAM,aAAgD,GAAA;AAAA,EAC3D,SAAW,EAAA,QAAA;AAAA,EACX,MAAQ,EAAA,QAAA;AAAA,EACR,OAAS,EAAA,aAAA;AAAA,EACT,YAAc,EAAA,YAAA;AAAA,EACd,OAAS,EAAA,SAAA;AAAA,EACT,eAAiB,EAAA,SAAA;AAAA,EACjB,IAAM,EAAA,MAAA;AAAA,EACN,IAAM,EAAA,MAAA;AAAA,EACN,IAAM,EAAA;AACR;AA0CO,MAAM,YAGR,GAAA;AAAA,EACH,SAAW,EAAA;AAAA,IACT,EAAI,EAAA,SAAA;AAAA,IACJ,EAAI,EAAA;AAAA,GACN;AAAA,EACA,MAAQ,EAAA;AAAA,IACN,EAAI,EAAA,SAAA;AAAA,IACJ,EAAI,EAAA;AAAA,GACN;AAAA,EACA,OAAS,EAAA;AAAA,IACP,EAAI,EAAA,SAAA;AAAA,IACJ,EAAI,EAAA;AAAA,GACN;AAAA,EACA,YAAc,EAAA;AAAA,IACZ,EAAI,EAAA,SAAA;AAAA,IACJ,EAAI,EAAA;AAAA,GACN;AAAA,EACA,OAAS,EAAA;AAAA,IACP,EAAI,EAAA,SAAA;AAAA,IACJ,EAAI,EAAA;AAAA,GACN;AAAA,EACA,eAAiB,EAAA;AAAA,IACf,EAAI,EAAA,SAAA;AAAA,IACJ,EAAI,EAAA;AAAA,GACN;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,EAAI,EAAA,SAAA;AAAA,IACJ,EAAI,EAAA;AAAA,GACN;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,EAAI,EAAA,SAAA;AAAA,IACJ,EAAI,EAAA;AAAA,GACN;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,EAAI,EAAA,SAAA;AAAA,IACJ,EAAI,EAAA;AAAA;AAER;AACa,MAAA,YAAA,GAAiC,CAAC,QAAA,EAAU,SAAW,EAAA,YAAA,EAAc,WAAW,WAAa,EAAA,eAAA,EAAiB,MAAQ,EAAA,MAAA,EAAQ,MAAM;AAC1I,SAAS,eAAe,QAA0C,EAAA;AACvE,EAAA,OAAO,QAAS,CAAA,MAAA;AAClB;AACO,SAAS,iBAAiB,QAAkC,EAAA;AAlGnE,EAAA,IAAA,EAAA,EAAA,EAAA;AAmGE,EAAA,IAAA,CAAI,cAAS,UAAT,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAqB,QAAe,OAAA,QAAA,CAAS,WAAW,IAAK,EAAA;AACjE,EAAI,IAAA,OAAO,QAAS,CAAA,KAAA,KAAU,QAAY,IAAA,MAAA,CAAO,QAAS,CAAA,QAAA,CAAS,KAAK,CAAA,IAAK,QAAS,CAAA,KAAA,GAAQ,CAAG,EAAA;AAC/F,IAAM,MAAA,IAAA,GAAA,CAAO,EAAS,GAAA,QAAA,CAAA,SAAA,KAAT,IAAuB,GAAA,EAAA,GAAA,QAAA,CAAS,IAAS,KAAA,QAAA,GAAW,MAAS,GAAA,QAAA,CAAS,IAAS,KAAA,KAAA,GAAQ,KAAQ,GAAA,OAAA;AAC5G,IAAA,OAAO,IAAI,IAAK,CAAA,KAAA,CAAM,SAAS,KAAK,CAAC,KAAK,IAAI,CAAA,CAAA;AAAA;AAEhD,EAAO,OAAA,WAAA;AACT;AACO,SAAS,UAAU,IAAiC,EAAA;AACzD,EAAA,QAAQ,IAAM;AAAA,IACZ,KAAK,QAAA;AACH,MAAO,OAAA,QAAA;AAAA,IACT,KAAK,KAAA;AACH,MAAO,OAAA,KAAA;AAAA,IACT;AACE,MAAO,OAAA,MAAA;AAAA;AAEb"}
@@ -0,0 +1,107 @@
1
+ import {jsxs,jsx}from'react/jsx-runtime';import {StyleSheet,View,Text,ScrollView,Pressable}from'react-native';import {Image}from'expo-image';const PREVIEW_LIMIT = 6;
2
+ function TravelChatResultCard({
3
+ attachment,
4
+ properties,
5
+ ink,
6
+ muted,
7
+ border,
8
+ card,
9
+ onViewResults,
10
+ onOpenItem
11
+ }) {
12
+ var _a;
13
+ const byId = new Map(properties.map((p) => [p.id, p]));
14
+ const preview = attachment.properties.slice(0, PREVIEW_LIMIT);
15
+ const remaining = attachment.properties.length - preview.length;
16
+ const count = (_a = attachment.totalCount) != null ? _a : attachment.properties.length;
17
+ return /* @__PURE__ */ jsxs(View, { style: [styles.wrap, {
18
+ backgroundColor: card,
19
+ borderColor: border
20
+ }], children: [
21
+ /* @__PURE__ */ jsx(Text, { style: [styles.title, {
22
+ color: ink
23
+ }], numberOfLines: 1, children: attachment.title }),
24
+ /* @__PURE__ */ jsxs(Text, { style: [styles.sub, {
25
+ color: muted
26
+ }], children: [
27
+ count,
28
+ " option",
29
+ count === 1 ? "" : "s"
30
+ ] }),
31
+ /* @__PURE__ */ jsx(ScrollView, { horizontal: true, nestedScrollEnabled: true, showsHorizontalScrollIndicator: true, contentContainerStyle: styles.row, children: preview.map((item) => {
32
+ const property = byId.get(item.id);
33
+ const meta = item.price != null && item.price > 0 ? `$${Math.round(item.price)}` : void 0;
34
+ return /* @__PURE__ */ jsxs(Pressable, { onPress: () => property && onOpenItem(property), style: styles.tile, children: [
35
+ item.imageUrl ? /* @__PURE__ */ jsx(Image, { source: {
36
+ uri: item.imageUrl
37
+ }, style: styles.thumb, contentFit: "cover" }) : /* @__PURE__ */ jsx(View, { style: [styles.thumb, {
38
+ backgroundColor: "#f1f5f9"
39
+ }] }),
40
+ /* @__PURE__ */ jsx(Text, { style: [styles.thumbTitle, {
41
+ color: ink
42
+ }], numberOfLines: 2, children: item.title }),
43
+ meta ? /* @__PURE__ */ jsx(Text, { style: [styles.thumbMeta, {
44
+ color: muted
45
+ }], numberOfLines: 1, children: meta }) : null
46
+ ] }, item.id);
47
+ }) }),
48
+ remaining > 0 ? /* @__PURE__ */ jsxs(Text, { style: [styles.more, {
49
+ color: muted
50
+ }], children: [
51
+ "+",
52
+ remaining,
53
+ " more"
54
+ ] }) : null,
55
+ /* @__PURE__ */ jsx(Pressable, { onPress: onViewResults, style: styles.cta, children: /* @__PURE__ */ jsx(Text, { style: styles.ctaText, children: attachment.actionLabel || "View results" }) })
56
+ ] });
57
+ }
58
+ const styles = StyleSheet.create({
59
+ wrap: {
60
+ borderWidth: 1,
61
+ borderRadius: 14,
62
+ padding: 12,
63
+ gap: 8,
64
+ marginTop: 8
65
+ },
66
+ title: {
67
+ fontSize: 14,
68
+ fontWeight: "700"
69
+ },
70
+ sub: {
71
+ fontSize: 12
72
+ },
73
+ row: {
74
+ gap: 8,
75
+ paddingVertical: 4
76
+ },
77
+ tile: {
78
+ width: 92,
79
+ gap: 4
80
+ },
81
+ thumb: {
82
+ width: 92,
83
+ height: 64,
84
+ borderRadius: 8
85
+ },
86
+ thumbTitle: {
87
+ fontSize: 11,
88
+ fontWeight: "600"
89
+ },
90
+ thumbMeta: {
91
+ fontSize: 11
92
+ },
93
+ more: {
94
+ fontSize: 12
95
+ },
96
+ cta: {
97
+ backgroundColor: "#0b1220",
98
+ borderRadius: 8,
99
+ paddingVertical: 8,
100
+ alignItems: "center"
101
+ },
102
+ ctaText: {
103
+ color: "#fff",
104
+ fontSize: 13,
105
+ fontWeight: "700"
106
+ }
107
+ });export{TravelChatResultCard};//# sourceMappingURL=TravelChatResultCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TravelChatResultCard.js","sources":["../../../../src/features/travel/chat/TravelChatResultCard.tsx"],"sourcesContent":["import React from 'react';\nimport { Pressable, ScrollView, StyleSheet, Text, View } from 'react-native';\nimport { Image } from 'expo-image';\nimport type { TravelProperty } from '../types';\nimport type { TravelChatAttachment } from './widgetContent';\n\nconst PREVIEW_LIMIT = 6;\n\nexport function TravelChatResultCard({\n attachment,\n properties,\n ink,\n muted,\n border,\n card,\n onViewResults,\n onOpenItem,\n}: {\n attachment: TravelChatAttachment;\n properties: TravelProperty[];\n ink: string;\n muted: string;\n border: string;\n card: string;\n onViewResults: () => void;\n onOpenItem: (property: TravelProperty) => void;\n}) {\n const byId = new Map(properties.map((p) => [p.id, p]));\n const preview = attachment.properties.slice(0, PREVIEW_LIMIT);\n const remaining = attachment.properties.length - preview.length;\n const count = attachment.totalCount ?? attachment.properties.length;\n\n return (\n <View style={[styles.wrap, { backgroundColor: card, borderColor: border }]}>\n <Text style={[styles.title, { color: ink }]} numberOfLines={1}>\n {attachment.title}\n </Text>\n <Text style={[styles.sub, { color: muted }]}>\n {count} option{count === 1 ? '' : 's'}\n </Text>\n <ScrollView\n horizontal\n nestedScrollEnabled\n showsHorizontalScrollIndicator\n contentContainerStyle={styles.row}\n >\n {preview.map((item) => {\n const property = byId.get(item.id);\n const meta = item.price != null && item.price > 0 ? `$${Math.round(item.price)}` : undefined;\n return (\n <Pressable key={item.id} onPress={() => property && onOpenItem(property)} style={styles.tile}>\n {item.imageUrl ? (\n <Image source={{ uri: item.imageUrl }} style={styles.thumb} contentFit=\"cover\" />\n ) : (\n <View style={[styles.thumb, { backgroundColor: '#f1f5f9' }]} />\n )}\n <Text style={[styles.thumbTitle, { color: ink }]} numberOfLines={2}>\n {item.title}\n </Text>\n {meta ? (\n <Text style={[styles.thumbMeta, { color: muted }]} numberOfLines={1}>\n {meta}\n </Text>\n ) : null}\n </Pressable>\n );\n })}\n </ScrollView>\n {remaining > 0 ? <Text style={[styles.more, { color: muted }]}>+{remaining} more</Text> : null}\n <Pressable onPress={onViewResults} style={styles.cta}>\n <Text style={styles.ctaText}>{attachment.actionLabel || 'View results'}</Text>\n </Pressable>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n wrap: { borderWidth: 1, borderRadius: 14, padding: 12, gap: 8, marginTop: 8 },\n title: { fontSize: 14, fontWeight: '700' },\n sub: { fontSize: 12 },\n row: { gap: 8, paddingVertical: 4 },\n tile: { width: 92, gap: 4 },\n thumb: { width: 92, height: 64, borderRadius: 8 },\n thumbTitle: { fontSize: 11, fontWeight: '600' },\n thumbMeta: { fontSize: 11 },\n more: { fontSize: 12 },\n cta: { backgroundColor: '#0b1220', borderRadius: 8, paddingVertical: 8, alignItems: 'center' },\n ctaText: { color: '#fff', fontSize: 13, fontWeight: '700' },\n});\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,107 @@
1
+ import {formatPriceLabel}from'../catalog.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 WIDGET_FENCE = /```(?:yantra:widget|json)\s*([\s\S]*?)```/gi;
18
+ function visibleAssistantContent(messageContent) {
19
+ return messageContent.replace(WIDGET_FENCE, (match, body) => {
20
+ try {
21
+ const parsed = JSON.parse(String(body).trim());
22
+ if (typeof (parsed == null ? void 0 : parsed.propsComponent) === "string") return "";
23
+ } catch (e) {
24
+ return match;
25
+ }
26
+ return match;
27
+ }).replace(/\n{3,}/g, "\n\n").trim();
28
+ }
29
+ function extractTravelAttachment(messageContent) {
30
+ var _a, _b, _c, _d;
31
+ let found = null;
32
+ for (const match of messageContent.matchAll(WIDGET_FENCE)) {
33
+ try {
34
+ const parsed = JSON.parse(String((_a = match[1]) != null ? _a : "").trim());
35
+ const attachment = (parsed == null ? void 0 : parsed.propsComponent) === "travel" ? (_c = (_b = parsed.propsConfiguration) == null ? void 0 : _b.contents) == null ? void 0 : _c.attachment : void 0;
36
+ if ((_d = attachment == null ? void 0 : attachment.properties) == null ? void 0 : _d.length) found = attachment;
37
+ } catch (e) {
38
+ }
39
+ }
40
+ return found;
41
+ }
42
+ function buildTravelAttachment(properties, query) {
43
+ return {
44
+ title: query ? `Results for ${query}` : "Travel results",
45
+ query,
46
+ totalCount: properties.length,
47
+ actionLabel: "View results",
48
+ properties: properties.slice(0, 12).map((p) => __spreadValues(__spreadValues(__spreadValues(__spreadValues({
49
+ id: p.id,
50
+ title: p.title
51
+ }, typeof p.price === "number" ? {
52
+ price: p.price
53
+ } : {}), p.imageUrl ? {
54
+ imageUrl: p.imageUrl
55
+ } : {}), p.url ? {
56
+ url: p.url
57
+ } : {}), p.source ? {
58
+ source: p.source
59
+ } : {}))
60
+ };
61
+ }
62
+ function summarizeTravelResults(properties, query) {
63
+ const count = properties.length;
64
+ const q = query.trim();
65
+ if (count === 0) {
66
+ return q ? `I couldn't find travel options matching **${q}**. Try refining dates or destination.` : `I couldn't find any travel options for that request.`;
67
+ }
68
+ const header = q ? `I found **${count} option${count === 1 ? "" : "s"}** for **${q}**:` : `I found **${count} option${count === 1 ? "" : "s"}**:`;
69
+ const preview = properties.slice(0, 5);
70
+ const lines = preview.map((p, i) => {
71
+ const price = formatPriceLabel(p);
72
+ const rating = typeof p.rating === "number" ? `\u2605 ${p.rating.toFixed(1)}` : void 0;
73
+ const meta = [price !== "See price" ? price : void 0, rating].filter(Boolean).join(" \xB7 ");
74
+ return meta ? `${i + 1}. **${p.title}** \u2014 ${meta}` : `${i + 1}. **${p.title}**`;
75
+ });
76
+ const remaining = count - preview.length;
77
+ const parts = [header, "", ...lines];
78
+ if (remaining > 0) parts.push("", `_+ ${remaining} more in the card below._`);
79
+ parts.push("", "Tap **View results** below to browse the full list.");
80
+ return parts.join("\n");
81
+ }
82
+ function buildTravelWidgetMessage(properties, query) {
83
+ const attachment = buildTravelAttachment(properties, query);
84
+ const envelope = {
85
+ propsComponent: "travel",
86
+ propsConfiguration: {
87
+ contents: {
88
+ attachment
89
+ }
90
+ }
91
+ };
92
+ return `${summarizeTravelResults(properties, query)}
93
+
94
+ \`\`\`json
95
+ ${JSON.stringify(envelope)}
96
+ \`\`\``;
97
+ }
98
+ function isTravelConversation(text) {
99
+ const trimmed = text.trim();
100
+ if (!trimmed) return true;
101
+ if (/^(hi|hey|hello|yo|thanks|thank you|thx|ok|okay)[\s!.?]*$/i.test(trimmed)) return true;
102
+ return false;
103
+ }
104
+ function shouldUseHostLane(text, fileCount) {
105
+ if (fileCount > 0) return true;
106
+ return isTravelConversation(text);
107
+ }export{WIDGET_FENCE,buildTravelAttachment,buildTravelWidgetMessage,extractTravelAttachment,isTravelConversation,shouldUseHostLane,summarizeTravelResults,visibleAssistantContent};//# sourceMappingURL=widgetContent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"widgetContent.js","sources":["../../../../src/features/travel/chat/widgetContent.ts"],"sourcesContent":["import type { TravelProperty } from '../types';\nimport { formatPriceLabel } from '../catalog';\n\nexport const WIDGET_FENCE = /```(?:yantra:widget|json)\\s*([\\s\\S]*?)```/gi;\n\nexport interface TravelChatCardItem {\n id: string;\n title: string;\n price?: number;\n imageUrl?: string;\n url?: string;\n source?: string;\n}\n\nexport interface TravelChatAttachment {\n title: string;\n query?: string;\n actionLabel?: string;\n totalCount?: number;\n properties: TravelChatCardItem[];\n}\n\nexport function visibleAssistantContent(messageContent: string): string {\n return messageContent\n .replace(WIDGET_FENCE, (match, body: string) => {\n try {\n const parsed = JSON.parse(String(body).trim()) as { propsComponent?: unknown };\n if (typeof parsed?.propsComponent === 'string') return '';\n } catch {\n return match;\n }\n return match;\n })\n .replace(/\\n{3,}/g, '\\n\\n')\n .trim();\n}\n\nexport function extractTravelAttachment(messageContent: string): TravelChatAttachment | null {\n let found: TravelChatAttachment | null = null;\n for (const match of messageContent.matchAll(WIDGET_FENCE)) {\n try {\n const parsed = JSON.parse(String(match[1] ?? '').trim()) as {\n propsComponent?: string;\n propsConfiguration?: { contents?: { attachment?: TravelChatAttachment } };\n };\n const attachment =\n parsed?.propsComponent === 'travel' ? parsed.propsConfiguration?.contents?.attachment : undefined;\n if (attachment?.properties?.length) found = attachment;\n } catch {\n /* skip */\n }\n }\n return found;\n}\n\nexport function buildTravelAttachment(properties: TravelProperty[], query: string): TravelChatAttachment {\n return {\n title: query ? `Results for ${query}` : 'Travel results',\n query,\n totalCount: properties.length,\n actionLabel: 'View results',\n properties: properties.slice(0, 12).map((p) => ({\n id: p.id,\n title: p.title,\n ...(typeof p.price === 'number' ? { price: p.price } : {}),\n ...(p.imageUrl ? { imageUrl: p.imageUrl } : {}),\n ...(p.url ? { url: p.url } : {}),\n ...(p.source ? { source: p.source } : {}),\n })),\n };\n}\n\nexport function summarizeTravelResults(properties: TravelProperty[], query: string): string {\n const count = properties.length;\n const q = query.trim();\n if (count === 0) {\n return q\n ? `I couldn't find travel options matching **${q}**. Try refining dates or destination.`\n : `I couldn't find any travel options for that request.`;\n }\n const header = q\n ? `I found **${count} option${count === 1 ? '' : 's'}** for **${q}**:`\n : `I found **${count} option${count === 1 ? '' : 's'}**:`;\n const preview = properties.slice(0, 5);\n const lines = preview.map((p, i) => {\n const price = formatPriceLabel(p);\n const rating = typeof p.rating === 'number' ? `★ ${p.rating.toFixed(1)}` : undefined;\n const meta = [price !== 'See price' ? price : undefined, rating].filter(Boolean).join(' · ');\n return meta ? `${i + 1}. **${p.title}** — ${meta}` : `${i + 1}. **${p.title}**`;\n });\n const remaining = count - preview.length;\n const parts = [header, '', ...lines];\n if (remaining > 0) parts.push('', `_+ ${remaining} more in the card below._`);\n parts.push('', 'Tap **View results** below to browse the full list.');\n return parts.join('\\n');\n}\n\nexport function buildTravelWidgetMessage(properties: TravelProperty[], query: string): string {\n const attachment = buildTravelAttachment(properties, query);\n const envelope = {\n propsComponent: 'travel',\n propsConfiguration: { contents: { attachment } },\n };\n return `${summarizeTravelResults(properties, query)}\\n\\n\\`\\`\\`json\\n${JSON.stringify(envelope)}\\n\\`\\`\\``;\n}\n\nexport function isTravelConversation(text: string): boolean {\n const trimmed = text.trim();\n if (!trimmed) return true;\n if (/^(hi|hey|hello|yo|thanks|thank you|thx|ok|okay)[\\s!.?]*$/i.test(trimmed)) return true;\n return false;\n}\n\nexport function shouldUseHostLane(text: string, fileCount: number): boolean {\n if (fileCount > 0) return true;\n return isTravelConversation(text);\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ function usablePrice(p) {
2
+ return p.price != null && Number.isFinite(p.price) && p.price > 0 ? p.price : void 0;
3
+ }
4
+ function formatDurationShort(minutes) {
5
+ if (minutes == null || !Number.isFinite(minutes) || minutes <= 0) return void 0;
6
+ const h = Math.floor(minutes / 60);
7
+ const m = Math.round(minutes % 60);
8
+ if (h === 0) return `${m}m`;
9
+ return m === 0 ? `${h}h` : `${h}h ${m}m`;
10
+ }
11
+ function compactMarkerPrice(priceLabel, price) {
12
+ const rounded = price != null && Number.isFinite(price) ? Math.round(price) : void 0;
13
+ if (rounded != null) return `$${rounded}`;
14
+ return (priceLabel == null ? void 0 : priceLabel.trim()) || void 0;
15
+ }
16
+ function computeFlightDeals(properties) {
17
+ const priced = properties.filter((p) => (p.kind === "flight" || p.source === "flight-search") && usablePrice(p) != null);
18
+ if (priced.length < 2) return null;
19
+ const byPrice = (a, b) => {
20
+ var _a, _b;
21
+ return usablePrice(a) - usablePrice(b) || ((_a = a.durationMinutes) != null ? _a : Infinity) - ((_b = b.durationMinutes) != null ? _b : Infinity);
22
+ };
23
+ const cheapest = [...priced].sort(byPrice)[0];
24
+ const timed = priced.filter((p) => p.durationMinutes != null && p.durationMinutes > 0);
25
+ const fastest = timed.length ? [...timed].sort((a, b) => a.durationMinutes - b.durationMinutes || usablePrice(a) - usablePrice(b))[0] : void 0;
26
+ const minPrice = usablePrice(cheapest);
27
+ const maxPrice = Math.max(...priced.map((p) => usablePrice(p)));
28
+ let best;
29
+ if (timed.length >= 2 && fastest) {
30
+ const minDuration = fastest.durationMinutes;
31
+ const score = (p) => usablePrice(p) / minPrice + p.durationMinutes / minDuration;
32
+ best = [...timed].sort((a, b) => score(a) - score(b) || byPrice(a, b))[0];
33
+ }
34
+ return {
35
+ count: priced.length,
36
+ minPrice,
37
+ maxPrice,
38
+ cheapest,
39
+ fastest,
40
+ best
41
+ };
42
+ }
43
+ function sortFlightProperties(properties, sort) {
44
+ const durationOf = (p) => p.durationMinutes != null && p.durationMinutes > 0 ? p.durationMinutes : void 0;
45
+ const minPrice = Math.min(...properties.map((p) => {
46
+ var _a;
47
+ return (_a = usablePrice(p)) != null ? _a : Infinity;
48
+ }));
49
+ const minDuration = Math.min(...properties.map((p) => {
50
+ var _a;
51
+ return (_a = durationOf(p)) != null ? _a : Infinity;
52
+ }));
53
+ const metric = (p) => {
54
+ const price = usablePrice(p);
55
+ const duration = durationOf(p);
56
+ if (sort === "cheapest") return price != null ? price : Infinity;
57
+ if (sort === "fastest") return duration != null ? duration : Infinity;
58
+ return price != null && duration != null && Number.isFinite(minPrice) && Number.isFinite(minDuration) ? price / minPrice + duration / minDuration : Infinity;
59
+ };
60
+ return properties.map((p, index) => ({
61
+ p,
62
+ index,
63
+ m: metric(p)
64
+ })).sort((a, b) => (a.m === b.m ? 0 : a.m - b.m) || a.index - b.index).map((x) => x.p);
65
+ }export{compactMarkerPrice,computeFlightDeals,formatDurationShort,sortFlightProperties};//# sourceMappingURL=flightDeals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flightDeals.js","sources":["../../../src/features/travel/flightDeals.ts"],"sourcesContent":["import type { TravelProperty } from './types';\n\nexport type FlightSort = 'cheapest' | 'best' | 'fastest';\n\nexport interface FlightDealSummary {\n count: number;\n minPrice: number;\n maxPrice: number;\n cheapest: TravelProperty;\n fastest?: TravelProperty;\n best?: TravelProperty;\n}\n\nfunction usablePrice(p: TravelProperty): number | undefined {\n return p.price != null && Number.isFinite(p.price) && p.price > 0 ? p.price : undefined;\n}\n\nexport function formatDurationShort(minutes?: number): string | undefined {\n if (minutes == null || !Number.isFinite(minutes) || minutes <= 0) return undefined;\n const h = Math.floor(minutes / 60);\n const m = Math.round(minutes % 60);\n if (h === 0) return `${m}m`;\n return m === 0 ? `${h}h` : `${h}h ${m}m`;\n}\n\nexport function compactMarkerPrice(priceLabel?: string, price?: number): string | undefined {\n const rounded = price != null && Number.isFinite(price) ? Math.round(price) : undefined;\n if (rounded != null) return `$${rounded}`;\n return priceLabel?.trim() || undefined;\n}\n\nexport function computeFlightDeals(properties: TravelProperty[]): FlightDealSummary | null {\n const priced = properties.filter(\n (p) => (p.kind === 'flight' || p.source === 'flight-search') && usablePrice(p) != null,\n );\n if (priced.length < 2) return null;\n\n const byPrice = (a: TravelProperty, b: TravelProperty) =>\n usablePrice(a)! - usablePrice(b)! || (a.durationMinutes ?? Infinity) - (b.durationMinutes ?? Infinity);\n const cheapest = [...priced].sort(byPrice)[0];\n const timed = priced.filter((p) => p.durationMinutes != null && p.durationMinutes > 0);\n const fastest = timed.length\n ? [...timed].sort((a, b) => a.durationMinutes! - b.durationMinutes! || usablePrice(a)! - usablePrice(b)!)[0]\n : undefined;\n const minPrice = usablePrice(cheapest)!;\n const maxPrice = Math.max(...priced.map((p) => usablePrice(p)!));\n let best: TravelProperty | undefined;\n if (timed.length >= 2 && fastest) {\n const minDuration = fastest.durationMinutes!;\n const score = (p: TravelProperty) => usablePrice(p)! / minPrice + p.durationMinutes! / minDuration;\n best = [...timed].sort((a, b) => score(a) - score(b) || byPrice(a, b))[0];\n }\n return { count: priced.length, minPrice, maxPrice, cheapest, fastest, best };\n}\n\nexport function sortFlightProperties(properties: TravelProperty[], sort: FlightSort): TravelProperty[] {\n const durationOf = (p: TravelProperty) =>\n p.durationMinutes != null && p.durationMinutes > 0 ? p.durationMinutes : undefined;\n const minPrice = Math.min(...properties.map((p) => usablePrice(p) ?? Infinity));\n const minDuration = Math.min(...properties.map((p) => durationOf(p) ?? Infinity));\n const metric = (p: TravelProperty): number => {\n const price = usablePrice(p);\n const duration = durationOf(p);\n if (sort === 'cheapest') return price ?? Infinity;\n if (sort === 'fastest') return duration ?? Infinity;\n return price != null && duration != null && Number.isFinite(minPrice) && Number.isFinite(minDuration)\n ? price / minPrice + duration / minDuration\n : Infinity;\n };\n return properties\n .map((p, index) => ({ p, index, m: metric(p) }))\n .sort((a, b) => (a.m === b.m ? 0 : a.m - b.m) || a.index - b.index)\n .map((x) => x.p);\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defProps = Object.defineProperties;
3
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
7
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
+ var __spreadValues = (a, b) => {
9
+ for (var prop in b || (b = {}))
10
+ if (__hasOwnProp.call(b, prop))
11
+ __defNormalProp(a, prop, b[prop]);
12
+ if (__getOwnPropSymbols)
13
+ for (var prop of __getOwnPropSymbols(b)) {
14
+ if (__propIsEnum.call(b, prop))
15
+ __defNormalProp(a, prop, b[prop]);
16
+ }
17
+ return a;
18
+ };
19
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
+ const GOLDEN_ANGLE = Math.PI * (3 - Math.sqrt(5));
21
+ function withMapCoordinates(properties, center) {
22
+ const delta = 0.012;
23
+ return properties.map((property, index) => {
24
+ if (property.latitude != null && property.longitude != null) {
25
+ return __spreadProps(__spreadValues({}, property), {
26
+ latitude: property.latitude,
27
+ longitude: property.longitude
28
+ });
29
+ }
30
+ const angle = (index + 0.5) * GOLDEN_ANGLE;
31
+ return __spreadProps(__spreadValues({}, property), {
32
+ latitude: center.lat + Math.sin(angle) * delta,
33
+ longitude: center.lng + Math.cos(angle) * delta
34
+ });
35
+ });
36
+ }export{withMapCoordinates};//# sourceMappingURL=mapCoordinates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapCoordinates.js","sources":["../../../src/features/travel/mapCoordinates.ts"],"sourcesContent":["import type { TravelProperty } from './types';\n\n/**\n * Phyllotaxis (sunflower) spacing for properties the supplier gave no coordinates for.\n *\n * The previous `index / properties.length * 2π` spread landed on the cardinal angles whenever\n * the index divided the count evenly — at angle π, `Math.sin` is 0, so the marker sat on the\n * search centre's exact latitude and read as un-jittered. It also derived the angle from the\n * position among ALL properties, so a run of supplier-positioned rows bunched the rest together.\n * The golden angle never lands on a cardinal for an integer step and spreads any count evenly.\n */\nconst GOLDEN_ANGLE = Math.PI * (3 - Math.sqrt(5));\n\nexport function withMapCoordinates(\n properties: TravelProperty[],\n center: { lat: number; lng: number },\n): Array<TravelProperty & { latitude: number; longitude: number }> {\n const delta = 0.012;\n return properties.map((property, index) => {\n if (property.latitude != null && property.longitude != null) {\n return { ...property, latitude: property.latitude, longitude: property.longitude };\n }\n // Half-step offset so index 0 is not on a cardinal angle either.\n const angle = (index + 0.5) * GOLDEN_ANGLE;\n return {\n ...property,\n latitude: center.lat + Math.sin(angle) * delta,\n longitude: center.lng + Math.cos(angle) * delta,\n };\n });\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AAWA,MAAM,eAAe,IAAK,CAAA,EAAA,IAAM,CAAI,GAAA,IAAA,CAAK,KAAK,CAAC,CAAA,CAAA;AAC/B,SAAA,kBAAA,CAAmB,YAA8B,MAM9D,EAAA;AACD,EAAA,MAAM,KAAQ,GAAA,KAAA;AACd,EAAA,OAAO,UAAW,CAAA,GAAA,CAAI,CAAC,QAAA,EAAU,KAAU,KAAA;AACzC,IAAA,IAAI,QAAS,CAAA,QAAA,IAAY,IAAQ,IAAA,QAAA,CAAS,aAAa,IAAM,EAAA;AAC3D,MAAA,OAAO,iCACF,QADE,CAAA,EAAA;AAAA,QAEL,UAAU,QAAS,CAAA,QAAA;AAAA,QACnB,WAAW,QAAS,CAAA;AAAA,OACtB,CAAA;AAAA;AAGF,IAAM,MAAA,KAAA,GAAA,CAAS,QAAQ,GAAO,IAAA,YAAA;AAC9B,IAAA,OAAO,iCACF,QADE,CAAA,EAAA;AAAA,MAEL,UAAU,MAAO,CAAA,GAAA,GAAM,IAAK,CAAA,GAAA,CAAI,KAAK,CAAI,GAAA,KAAA;AAAA,MACzC,WAAW,MAAO,CAAA,GAAA,GAAM,IAAK,CAAA,GAAA,CAAI,KAAK,CAAI,GAAA;AAAA,KAC5C,CAAA;AAAA,GACD,CAAA;AACH"}