@adminide-stack/yantra-mobile 12.0.141-alpha.1 → 12.0.142-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 (227) hide show
  1. package/lib/features/agent-chat/NativeAgentChat.js +21 -4
  2. package/lib/features/agent-chat/NativeAgentChat.js.map +1 -1
  3. package/lib/features/chat/ApprovalCard.js +353 -0
  4. package/lib/features/chat/ApprovalCard.js.map +1 -0
  5. package/lib/features/chat/AskUserCard.js +9 -2
  6. package/lib/features/chat/AskUserCard.js.map +1 -1
  7. package/lib/features/chat/askUser.js +25 -3
  8. package/lib/features/chat/askUser.js.map +1 -1
  9. package/lib/features/chat/queuedFollowUpRows.js +13 -0
  10. package/lib/features/chat/queuedFollowUpRows.js.map +1 -0
  11. package/lib/features/dictate/DictateExperience.js +59 -7
  12. package/lib/features/dictate/DictateExperience.js.map +1 -1
  13. package/lib/features/dictate/components/NoteView.js +227 -12
  14. package/lib/features/dictate/components/NoteView.js.map +1 -1
  15. package/lib/features/dictate/dictateClient.js +93 -23
  16. package/lib/features/dictate/dictateClient.js.map +1 -1
  17. package/lib/features/dictate/dictatePreference.js +19 -0
  18. package/lib/features/dictate/dictatePreference.js.map +1 -0
  19. package/lib/features/dictate/noteText.js +17 -2
  20. package/lib/features/dictate/noteText.js.map +1 -1
  21. package/lib/features/dictate/privacy.js +96 -0
  22. package/lib/features/dictate/privacy.js.map +1 -0
  23. package/lib/features/dictate/shownNote.js +24 -0
  24. package/lib/features/dictate/shownNote.js.map +1 -0
  25. package/lib/features/discover/DiscoverArticle.js +105 -92
  26. package/lib/features/discover/DiscoverArticle.js.map +1 -1
  27. package/lib/features/discover/DiscoverFeed.js +97 -48
  28. package/lib/features/discover/DiscoverFeed.js.map +1 -1
  29. package/lib/features/discover/DiscoverFollowUp.js +135 -0
  30. package/lib/features/discover/DiscoverFollowUp.js.map +1 -0
  31. package/lib/features/discover/DiscoverSidebar.js +555 -0
  32. package/lib/features/discover/DiscoverSidebar.js.map +1 -0
  33. package/lib/features/discover/DiscoverSkeletons.js +123 -0
  34. package/lib/features/discover/DiscoverSkeletons.js.map +1 -0
  35. package/lib/features/discover/DiscoverStoryCards.js +193 -87
  36. package/lib/features/discover/DiscoverStoryCards.js.map +1 -1
  37. package/lib/features/discover/followUpQuery.js +42 -0
  38. package/lib/features/discover/followUpQuery.js.map +1 -0
  39. package/lib/features/discover/markets.js +37 -0
  40. package/lib/features/discover/markets.js.map +1 -0
  41. package/lib/features/discover/useDiscoverSidebar.js +148 -0
  42. package/lib/features/discover/useDiscoverSidebar.js.map +1 -0
  43. package/lib/features/discover/weather.js +42 -0
  44. package/lib/features/discover/weather.js.map +1 -0
  45. package/lib/features/expenses/ExpensesAgentChatPane.js +1 -1
  46. package/lib/features/expenses/ExpensesAgentChatPane.js.map +1 -1
  47. package/lib/features/inbox/InboxAgentChatPane.js +1 -1
  48. package/lib/features/inbox/InboxAgentChatPane.js.map +1 -1
  49. package/lib/features/job-search/JobSearchAgentChatPane.js +1 -0
  50. package/lib/features/job-search/JobSearchAgentChatPane.js.map +1 -1
  51. package/lib/features/local-services/LocalServicesAgentChatPane.js +1 -1
  52. package/lib/features/local-services/LocalServicesAgentChatPane.js.map +1 -1
  53. package/lib/features/movies/MoviesAgentChatPane.js +1 -1
  54. package/lib/features/movies/MoviesAgentChatPane.js.map +1 -1
  55. package/lib/features/notion/NotionBlockSheets.js +206 -0
  56. package/lib/features/notion/NotionBlockSheets.js.map +1 -0
  57. package/lib/features/notion/NotionBlockView.js +36 -0
  58. package/lib/features/notion/NotionBlockView.js.map +1 -0
  59. package/lib/features/notion/NotionCommentsSheet.js +461 -0
  60. package/lib/features/notion/NotionCommentsSheet.js.map +1 -0
  61. package/lib/features/notion/NotionConnectionsSheet.js +244 -0
  62. package/lib/features/notion/NotionConnectionsSheet.js.map +1 -0
  63. package/lib/features/notion/NotionHistorySheet.js +439 -0
  64. package/lib/features/notion/NotionHistorySheet.js.map +1 -0
  65. package/lib/features/notion/NotionMediaBlocks.js +803 -0
  66. package/lib/features/notion/NotionMediaBlocks.js.map +1 -0
  67. package/lib/features/notion/NotionMentionSheet.js +279 -0
  68. package/lib/features/notion/NotionMentionSheet.js.map +1 -0
  69. package/lib/features/notion/NotionPageMenu.js +585 -0
  70. package/lib/features/notion/NotionPageMenu.js.map +1 -0
  71. package/lib/features/notion/NotionPageTree.js +220 -0
  72. package/lib/features/notion/NotionPageTree.js.map +1 -0
  73. package/lib/features/notion/NotionPageView.js +1253 -152
  74. package/lib/features/notion/NotionPageView.js.map +1 -1
  75. package/lib/features/notion/NotionShareSheet.js +606 -0
  76. package/lib/features/notion/NotionShareSheet.js.map +1 -0
  77. package/lib/features/notion/NotionSheets.js +87 -15
  78. package/lib/features/notion/NotionSheets.js.map +1 -1
  79. package/lib/features/notion/NotionSidebarSections.js +492 -0
  80. package/lib/features/notion/NotionSidebarSections.js.map +1 -0
  81. package/lib/features/notion/NotionWorkspaceAdmin.js +659 -0
  82. package/lib/features/notion/NotionWorkspaceAdmin.js.map +1 -0
  83. package/lib/features/notion/NotionWorkspaceView.js +257 -45
  84. package/lib/features/notion/NotionWorkspaceView.js.map +1 -1
  85. package/lib/features/notion/database/DatabaseCells.js +554 -0
  86. package/lib/features/notion/database/DatabaseCells.js.map +1 -0
  87. package/lib/features/notion/database/DatabaseDateLayouts.js +792 -0
  88. package/lib/features/notion/database/DatabaseDateLayouts.js.map +1 -0
  89. package/lib/features/notion/database/DatabaseLayouts.js +461 -0
  90. package/lib/features/notion/database/DatabaseLayouts.js.map +1 -0
  91. package/lib/features/notion/database/DatabaseSheets.js +791 -0
  92. package/lib/features/notion/database/DatabaseSheets.js.map +1 -0
  93. package/lib/features/notion/database/NotionDatabaseView.js +817 -0
  94. package/lib/features/notion/database/NotionDatabaseView.js.map +1 -0
  95. package/lib/features/notion/database/RowPropertiesPanel.js +162 -0
  96. package/lib/features/notion/database/RowPropertiesPanel.js.map +1 -0
  97. package/lib/features/notion/database/chartData.js +89 -0
  98. package/lib/features/notion/database/chartData.js.map +1 -0
  99. package/lib/features/notion/database/chartView.js +112 -0
  100. package/lib/features/notion/database/chartView.js.map +1 -0
  101. package/lib/features/notion/database/connectorButton.js +33 -0
  102. package/lib/features/notion/database/connectorButton.js.map +1 -0
  103. package/lib/features/notion/database/databaseCalc.js +208 -0
  104. package/lib/features/notion/database/databaseCalc.js.map +1 -0
  105. package/lib/features/notion/database/databaseCalendar.js +157 -0
  106. package/lib/features/notion/database/databaseCalendar.js.map +1 -0
  107. package/lib/features/notion/database/databaseCsv.js +98 -0
  108. package/lib/features/notion/database/databaseCsv.js.map +1 -0
  109. package/lib/features/notion/database/databaseCsvActions.js +58 -0
  110. package/lib/features/notion/database/databaseCsvActions.js.map +1 -0
  111. package/lib/features/notion/database/databaseFilter.js +473 -0
  112. package/lib/features/notion/database/databaseFilter.js.map +1 -0
  113. package/lib/features/notion/database/databaseFormula.js +1072 -0
  114. package/lib/features/notion/database/databaseFormula.js.map +1 -0
  115. package/lib/features/notion/database/databaseGroup.js +151 -0
  116. package/lib/features/notion/database/databaseGroup.js.map +1 -0
  117. package/lib/features/notion/database/databaseRollup.js +58 -0
  118. package/lib/features/notion/database/databaseRollup.js.map +1 -0
  119. package/lib/features/notion/database/databaseTimeline.js +156 -0
  120. package/lib/features/notion/database/databaseTimeline.js.map +1 -0
  121. package/lib/features/notion/database/databaseView.js +1188 -0
  122. package/lib/features/notion/database/databaseView.js.map +1 -0
  123. package/lib/features/notion/database/databaseViews.js +310 -0
  124. package/lib/features/notion/database/databaseViews.js.map +1 -0
  125. package/lib/features/notion/database/relationSource.js +92 -0
  126. package/lib/features/notion/database/relationSource.js.map +1 -0
  127. package/lib/features/notion/database/uniqueId.js +17 -0
  128. package/lib/features/notion/database/uniqueId.js.map +1 -0
  129. package/lib/features/notion/database/useNotionDatabase.js +617 -0
  130. package/lib/features/notion/database/useNotionDatabase.js.map +1 -0
  131. package/lib/features/notion/notionAgentRunStatus.js +39 -0
  132. package/lib/features/notion/notionAgentRunStatus.js.map +1 -0
  133. package/lib/features/notion/notionCodeLanguages.js +112 -0
  134. package/lib/features/notion/notionCodeLanguages.js.map +1 -0
  135. package/lib/features/notion/notionComments.js +86 -0
  136. package/lib/features/notion/notionComments.js.map +1 -0
  137. package/lib/features/notion/notionConnections.js +74 -0
  138. package/lib/features/notion/notionConnections.js.map +1 -0
  139. package/lib/features/notion/notionDocuments.js +453 -1
  140. package/lib/features/notion/notionDocuments.js.map +1 -1
  141. package/lib/features/notion/notionEditorModel.js +142 -7
  142. package/lib/features/notion/notionEditorModel.js.map +1 -1
  143. package/lib/features/notion/notionMarkdownShortcuts.js +51 -0
  144. package/lib/features/notion/notionMarkdownShortcuts.js.map +1 -0
  145. package/lib/features/notion/notionMedia.js +119 -0
  146. package/lib/features/notion/notionMedia.js.map +1 -0
  147. package/lib/features/notion/notionMentionDate.js +32 -0
  148. package/lib/features/notion/notionMentionDate.js.map +1 -0
  149. package/lib/features/notion/notionMentionOptions.js +162 -0
  150. package/lib/features/notion/notionMentionOptions.js.map +1 -0
  151. package/lib/features/notion/notionNotesAgent.js +445 -0
  152. package/lib/features/notion/notionNotesAgent.js.map +1 -0
  153. package/lib/features/notion/notionPageAccess.js +168 -0
  154. package/lib/features/notion/notionPageAccess.js.map +1 -0
  155. package/lib/features/notion/notionPageActions.js +138 -0
  156. package/lib/features/notion/notionPageActions.js.map +1 -0
  157. package/lib/features/notion/notionPageHistory.js +154 -0
  158. package/lib/features/notion/notionPageHistory.js.map +1 -0
  159. package/lib/features/notion/notionPageKinds.js +200 -0
  160. package/lib/features/notion/notionPageKinds.js.map +1 -0
  161. package/lib/features/notion/notionRecents.js +48 -0
  162. package/lib/features/notion/notionRecents.js.map +1 -0
  163. package/lib/features/notion/notionRichText.js +177 -0
  164. package/lib/features/notion/notionRichText.js.map +1 -0
  165. package/lib/features/notion/notionRichTitle.js +336 -0
  166. package/lib/features/notion/notionRichTitle.js.map +1 -0
  167. package/lib/features/notion/useNotionWorkspace.js +272 -13
  168. package/lib/features/notion/useNotionWorkspace.js.map +1 -1
  169. package/lib/features/notion/usePageActions.js +155 -0
  170. package/lib/features/notion/usePageActions.js.map +1 -0
  171. package/lib/features/resume/ResumeAgentChatPane.js +1 -1
  172. package/lib/features/resume/ResumeAgentChatPane.js.map +1 -1
  173. package/lib/features/shopping/ShoppingAgentChatPane.js +1 -1
  174. package/lib/features/shopping/ShoppingAgentChatPane.js.map +1 -1
  175. package/lib/features/study/StudyAgentChatPane.js +1 -1
  176. package/lib/features/study/StudyAgentChatPane.js.map +1 -1
  177. package/lib/features/travel/TravelAgentChatPane.js +1 -1
  178. package/lib/features/travel/TravelAgentChatPane.js.map +1 -1
  179. package/lib/features/webbuilder/WebBuilderExperience.js +40 -8
  180. package/lib/features/webbuilder/WebBuilderExperience.js.map +1 -1
  181. package/lib/features/webbuilder/buildFragments.js +1 -1
  182. package/lib/features/webbuilder/buildFragments.js.map +1 -1
  183. package/lib/features/webbuilder/codeFiles.js +302 -0
  184. package/lib/features/webbuilder/codeFiles.js.map +1 -0
  185. package/lib/features/webbuilder/codeHighlight.js +209 -0
  186. package/lib/features/webbuilder/codeHighlight.js.map +1 -0
  187. package/lib/features/webbuilder/components/CodeView.js +682 -52
  188. package/lib/features/webbuilder/components/CodeView.js.map +1 -1
  189. package/lib/features/webbuilder/components/PreviewScreen.js +59 -38
  190. package/lib/features/webbuilder/components/PreviewScreen.js.map +1 -1
  191. package/lib/features/webbuilder/components/ProjectChat.js +3 -3
  192. package/lib/features/webbuilder/components/ProjectChat.js.map +1 -1
  193. package/lib/features/webbuilder/stepLabels.js +68 -0
  194. package/lib/features/webbuilder/stepLabels.js.map +1 -0
  195. package/lib/hooks/useHostChatSteering.js +45 -0
  196. package/lib/hooks/useHostChatSteering.js.map +1 -0
  197. package/lib/screens/Chat/index.js +2 -12
  198. package/lib/screens/Chat/index.js.map +1 -1
  199. package/lib/screens/ExpensesNative/useExpensesHostChat.js +25 -5
  200. package/lib/screens/ExpensesNative/useExpensesHostChat.js.map +1 -1
  201. package/lib/screens/InboxNative/useInboxHostChat.js +25 -5
  202. package/lib/screens/InboxNative/useInboxHostChat.js.map +1 -1
  203. package/lib/screens/JobSearchNative/useJobSearchHostChat.js +25 -5
  204. package/lib/screens/JobSearchNative/useJobSearchHostChat.js.map +1 -1
  205. package/lib/screens/LocalServicesNative/useLocalServicesHostChat.js +25 -5
  206. package/lib/screens/LocalServicesNative/useLocalServicesHostChat.js.map +1 -1
  207. package/lib/screens/MoviesNative/useMoviesHostChat.js +25 -5
  208. package/lib/screens/MoviesNative/useMoviesHostChat.js.map +1 -1
  209. package/lib/screens/NotionPage/index.js +2 -2
  210. package/lib/screens/NotionPage/index.js.map +1 -1
  211. package/lib/screens/ResumeNative/useResumeHostChat.js +25 -5
  212. package/lib/screens/ResumeNative/useResumeHostChat.js.map +1 -1
  213. package/lib/screens/ShoppingNative/useShoppingHostChat.js +25 -5
  214. package/lib/screens/ShoppingNative/useShoppingHostChat.js.map +1 -1
  215. package/lib/screens/StudyNative/useStudyHostChat.js +25 -5
  216. package/lib/screens/StudyNative/useStudyHostChat.js.map +1 -1
  217. package/lib/screens/TravelNative/useTravelHostChat.js +25 -5
  218. package/lib/screens/TravelNative/useTravelHostChat.js.map +1 -1
  219. package/lib/screens/WebBuilderNative/codeWorkspaceApi.js +222 -0
  220. package/lib/screens/WebBuilderNative/codeWorkspaceApi.js.map +1 -0
  221. package/lib/screens/WebBuilderNative/index.js +1 -1
  222. package/lib/screens/WebBuilderNative/index.js.map +1 -1
  223. package/lib/screens/WebBuilderNative/sandboxProxyApi.js +126 -4
  224. package/lib/screens/WebBuilderNative/sandboxProxyApi.js.map +1 -1
  225. package/lib/screens/WebBuilderNative/useWebBuilderHost.js +120 -11
  226. package/lib/screens/WebBuilderNative/useWebBuilderHost.js.map +1 -1
  227. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"LocalServicesAgentChatPane.js","sources":["../../../src/features/local-services/LocalServicesAgentChatPane.tsx"],"sourcesContent":["/**\n * The Yantra agent, over the search on screen. Every turn goes to the host's\n * gateway chat (the same agent and skills as main chat); the first turn of a\n * thread carries the local services context line, so \"find me one open now\n * that does panel upgrades\" means this search, near this place.\n *\n * When the agent answers with its `local-services` card (the card the main chat\n * paints), the pros it listed can be opened as the native list: the card's rows\n * and search are read with the existing widget protocol, nothing new.\n */\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { StyleSheet, Text, View } from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { NativeAgentChat, type AgentChatMessage, type AgentChatSuggestion } from '../agent-chat';\nimport type { MessageAttachment } from '../../hooks/useChatStream';\nimport { DIM, Tap } from '../inbox/components/Tap';\nimport { latestAgentResults, type AgentResults } from './chat/widgetOpening';\nimport { countLine, whatLabel, whereLabel } from './format';\nimport type { LocalServicesHostChat } from './hostChat';\nimport { withLocalServicesContext, type LocalServicesContextInput } from './localServicesContext';\nimport type { LocalServicesTheme } from './localServicesTheme';\n\nconst NOT_CONNECTED = 'Yantra is not connected yet. Check the connection in Home, then send again.';\n\nexport interface LocalServicesAgentSeed {\n id: string;\n text: string;\n attachments?: MessageAttachment[];\n}\n\n/** Starters that read the search on screen when there is one. */\nexport function agentSuggestions(hasResults: boolean): AgentChatSuggestion[] {\n if (hasResults) {\n return [\n { id: 'open', label: \"Who's open right now?\", prompt: 'Which of these pros are open right now?' },\n {\n id: 'compare',\n label: 'Compare the top 3',\n prompt: 'Compare the top 3 pros on my list and tell me which one to call first, and why.',\n },\n {\n id: 'ask',\n label: 'What should I ask them?',\n prompt: 'What should I ask these pros on the phone before I hire one?',\n },\n ];\n }\n return [\n { id: 'electrician', label: 'An electrician near me', prompt: 'Find an electrician near me' },\n {\n id: 'leak',\n label: 'A plumber for a leak, today',\n prompt: 'I have a leaking pipe. Find a plumber who can come today.',\n },\n { id: 'ac', label: 'My AC stopped working', prompt: 'My AC stopped working. Who can fix it near me?' },\n ];\n}\n\nfunction ResultsCard({\n results,\n theme,\n onShow,\n}: {\n results: AgentResults;\n theme: LocalServicesTheme;\n onShow: () => void;\n}) {\n const { query, page } = results;\n const heading = results.title ?? `${whatLabel(query)} near ${whereLabel(query, page)}`;\n return (\n <Tap\n onPress={onShow}\n accessibilityRole=\"button\"\n accessibilityLabel={`Show ${heading} in the list`}\n style={[styles.card, { backgroundColor: theme.card, borderColor: theme.border }]}\n pressedStyle={DIM}\n testID=\"ls-agent-results\"\n >\n <View style={[styles.cardIcon, { backgroundColor: theme.accentSoft }]}>\n <MaterialCommunityIcons name=\"format-list-bulleted\" size={18} color={theme.accent} />\n </View>\n <View style={styles.cardText}>\n <Text style={[styles.cardTitle, { color: theme.ink }]} numberOfLines={2}>\n {heading.charAt(0).toUpperCase() + heading.slice(1)}\n </Text>\n <Text style={[styles.cardMeta, { color: theme.muted }]} numberOfLines={1}>\n {countLine(page.businesses.length, page.total)} · Open the list\n </Text>\n </View>\n <MaterialCommunityIcons name=\"chevron-right\" size={22} color={theme.faint} />\n </Tap>\n );\n}\n\nexport function LocalServicesAgentChatPane({\n visible,\n onClose,\n hostChat,\n context,\n seed,\n theme,\n onShowResults,\n}: {\n visible: boolean;\n onClose: () => void;\n hostChat?: LocalServicesHostChat;\n /** The search on screen, for the first turn's context line. */\n context: LocalServicesContextInput;\n /** A turn to send as the pane opens. */\n seed: LocalServicesAgentSeed | null;\n theme: LocalServicesTheme;\n onShowResults: (results: AgentResults) => void;\n}) {\n const [localMessages, setLocalMessages] = useState<AgentChatMessage[]>([]);\n const seeded = useRef<string | null>(null);\n const hostMessages = useMemo(() => hostChat?.messages ?? [], [hostChat?.messages]);\n const messages = hostMessages.length > 0 ? hostMessages : localMessages;\n const latest = useMemo(() => latestAgentResults(hostMessages), [hostMessages]);\n\n const send = (text: string, files?: MessageAttachment[]) => {\n const trimmed = text.trim();\n if (!trimmed && !files?.length) return;\n if (!hostChat || !hostChat.connected) {\n setLocalMessages((prev) => [\n ...prev,\n { id: `u-${Date.now()}`, role: 'user', content: trimmed },\n { id: `a-${Date.now()}`, role: 'assistant', content: hostChat?.error || NOT_CONNECTED },\n ]);\n return;\n }\n setLocalMessages([]);\n // A fresh thread learns which search it is about; later turns go verbatim.\n const firstTurn = hostMessages.length === 0;\n hostChat.send(firstTurn ? withLocalServicesContext(trimmed, context) : trimmed, files);\n };\n\n useEffect(() => {\n if (!visible || !seed || seeded.current === seed.id) return;\n seeded.current = seed.id;\n send(seed.text, seed.attachments);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [visible, seed]);\n\n const hasResults = Boolean(context.businesses?.length);\n\n return (\n <NativeAgentChat\n title=\"Local Services agent\"\n visible={visible}\n onClose={onClose}\n onSwipeLeft={onClose}\n messages={messages}\n renderConnectorCard={hostChat?.renderConnectorCard}\n onSend={send}\n onClear={() => {\n setLocalMessages([]);\n seeded.current = null;\n hostChat?.clear?.();\n }}\n busy={Boolean(hostChat?.busy)}\n streamingContent={hostChat?.streaming ?? null}\n error={hostChat?.error ?? null}\n placeholder=\"Ask about a job or a pro…\"\n emptyTitle=\"What needs doing?\"\n emptyBody={\n hasResults\n ? 'Ask about the pros on your list: who is open, who to call first, what to ask them.'\n : 'Describe the job and where, and the agent finds the right local pro for it.'\n }\n suggestions={messages.length === 0 ? agentSuggestions(hasResults) : []}\n beforeComposer={\n latest && !hostChat?.busy ? (\n <ResultsCard results={latest.results} theme={theme} onShow={() => onShowResults(latest.results)} />\n ) : null\n }\n isDark={theme.isDark}\n ink={theme.ink}\n muted={theme.muted}\n screen={theme.screen}\n border={theme.border}\n card={theme.card}\n />\n );\n}\n\nconst styles = StyleSheet.create({\n card: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 12,\n marginHorizontal: 16,\n marginTop: 4,\n marginBottom: 12,\n paddingHorizontal: 14,\n paddingVertical: 12,\n borderRadius: 16,\n borderWidth: StyleSheet.hairlineWidth,\n },\n cardIcon: { width: 36, height: 36, borderRadius: 18, alignItems: 'center', justifyContent: 'center' },\n cardText: { flex: 1, minWidth: 0 },\n cardTitle: { fontSize: 15, fontWeight: '600' },\n cardMeta: { fontSize: 13, marginTop: 2 },\n});\n"],"names":["_a"],"mappings":"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"}
1
+ {"version":3,"file":"LocalServicesAgentChatPane.js","sources":["../../../src/features/local-services/LocalServicesAgentChatPane.tsx"],"sourcesContent":["/**\n * The Yantra agent, over the search on screen. Every turn goes to the host's\n * gateway chat (the same agent and skills as main chat); the first turn of a\n * thread carries the local services context line, so \"find me one open now\n * that does panel upgrades\" means this search, near this place.\n *\n * When the agent answers with its `local-services` card (the card the main chat\n * paints), the pros it listed can be opened as the native list: the card's rows\n * and search are read with the existing widget protocol, nothing new.\n */\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { StyleSheet, Text, View } from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { NativeAgentChat, type AgentChatMessage, type AgentChatSuggestion } from '../agent-chat';\nimport type { MessageAttachment } from '../../hooks/useChatStream';\nimport { DIM, Tap } from '../inbox/components/Tap';\nimport { latestAgentResults, type AgentResults } from './chat/widgetOpening';\nimport { countLine, whatLabel, whereLabel } from './format';\nimport type { LocalServicesHostChat } from './hostChat';\nimport { withLocalServicesContext, type LocalServicesContextInput } from './localServicesContext';\nimport type { LocalServicesTheme } from './localServicesTheme';\n\nconst NOT_CONNECTED = 'Yantra is not connected yet. Check the connection in Home, then send again.';\n\nexport interface LocalServicesAgentSeed {\n id: string;\n text: string;\n attachments?: MessageAttachment[];\n}\n\n/** Starters that read the search on screen when there is one. */\nexport function agentSuggestions(hasResults: boolean): AgentChatSuggestion[] {\n if (hasResults) {\n return [\n { id: 'open', label: \"Who's open right now?\", prompt: 'Which of these pros are open right now?' },\n {\n id: 'compare',\n label: 'Compare the top 3',\n prompt: 'Compare the top 3 pros on my list and tell me which one to call first, and why.',\n },\n {\n id: 'ask',\n label: 'What should I ask them?',\n prompt: 'What should I ask these pros on the phone before I hire one?',\n },\n ];\n }\n return [\n { id: 'electrician', label: 'An electrician near me', prompt: 'Find an electrician near me' },\n {\n id: 'leak',\n label: 'A plumber for a leak, today',\n prompt: 'I have a leaking pipe. Find a plumber who can come today.',\n },\n { id: 'ac', label: 'My AC stopped working', prompt: 'My AC stopped working. Who can fix it near me?' },\n ];\n}\n\nfunction ResultsCard({\n results,\n theme,\n onShow,\n}: {\n results: AgentResults;\n theme: LocalServicesTheme;\n onShow: () => void;\n}) {\n const { query, page } = results;\n const heading = results.title ?? `${whatLabel(query)} near ${whereLabel(query, page)}`;\n return (\n <Tap\n onPress={onShow}\n accessibilityRole=\"button\"\n accessibilityLabel={`Show ${heading} in the list`}\n style={[styles.card, { backgroundColor: theme.card, borderColor: theme.border }]}\n pressedStyle={DIM}\n testID=\"ls-agent-results\"\n >\n <View style={[styles.cardIcon, { backgroundColor: theme.accentSoft }]}>\n <MaterialCommunityIcons name=\"format-list-bulleted\" size={18} color={theme.accent} />\n </View>\n <View style={styles.cardText}>\n <Text style={[styles.cardTitle, { color: theme.ink }]} numberOfLines={2}>\n {heading.charAt(0).toUpperCase() + heading.slice(1)}\n </Text>\n <Text style={[styles.cardMeta, { color: theme.muted }]} numberOfLines={1}>\n {countLine(page.businesses.length, page.total)} · Open the list\n </Text>\n </View>\n <MaterialCommunityIcons name=\"chevron-right\" size={22} color={theme.faint} />\n </Tap>\n );\n}\n\nexport function LocalServicesAgentChatPane({\n visible,\n onClose,\n hostChat,\n context,\n seed,\n theme,\n onShowResults,\n}: {\n visible: boolean;\n onClose: () => void;\n hostChat?: LocalServicesHostChat;\n /** The search on screen, for the first turn's context line. */\n context: LocalServicesContextInput;\n /** A turn to send as the pane opens. */\n seed: LocalServicesAgentSeed | null;\n theme: LocalServicesTheme;\n onShowResults: (results: AgentResults) => void;\n}) {\n const [localMessages, setLocalMessages] = useState<AgentChatMessage[]>([]);\n const seeded = useRef<string | null>(null);\n const hostMessages = useMemo(() => hostChat?.messages ?? [], [hostChat?.messages]);\n const messages = hostMessages.length > 0 ? hostMessages : localMessages;\n const latest = useMemo(() => latestAgentResults(hostMessages), [hostMessages]);\n\n const send = (text: string, files?: MessageAttachment[]) => {\n const trimmed = text.trim();\n if (!trimmed && !files?.length) return;\n if (!hostChat || !hostChat.connected) {\n setLocalMessages((prev) => [\n ...prev,\n { id: `u-${Date.now()}`, role: 'user', content: trimmed },\n { id: `a-${Date.now()}`, role: 'assistant', content: hostChat?.error || NOT_CONNECTED },\n ]);\n return;\n }\n setLocalMessages([]);\n // A fresh thread learns which search it is about; later turns go verbatim.\n const firstTurn = hostMessages.length === 0;\n hostChat.send(firstTurn ? withLocalServicesContext(trimmed, context) : trimmed, files);\n };\n\n useEffect(() => {\n if (!visible || !seed || seeded.current === seed.id) return;\n seeded.current = seed.id;\n send(seed.text, seed.attachments);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [visible, seed]);\n\n const hasResults = Boolean(context.businesses?.length);\n\n return (\n <NativeAgentChat\n title=\"Local Services agent\"\n visible={visible}\n onClose={onClose}\n onSwipeLeft={onClose}\n messages={messages}\n renderConnectorCard={hostChat?.renderConnectorCard}\n onSend={send}\n onClear={() => {\n setLocalMessages([]);\n seeded.current = null;\n hostChat?.clear?.();\n }}\n busy={Boolean(hostChat?.busy)}\n steering={hostChat}\n streamingContent={hostChat?.streaming ?? null}\n error={hostChat?.error ?? null}\n placeholder=\"Ask about a job or a pro…\"\n emptyTitle=\"What needs doing?\"\n emptyBody={\n hasResults\n ? 'Ask about the pros on your list: who is open, who to call first, what to ask them.'\n : 'Describe the job and where, and the agent finds the right local pro for it.'\n }\n suggestions={messages.length === 0 ? agentSuggestions(hasResults) : []}\n beforeComposer={\n latest && !hostChat?.busy ? (\n <ResultsCard results={latest.results} theme={theme} onShow={() => onShowResults(latest.results)} />\n ) : null\n }\n isDark={theme.isDark}\n ink={theme.ink}\n muted={theme.muted}\n screen={theme.screen}\n border={theme.border}\n card={theme.card}\n />\n );\n}\n\nconst styles = StyleSheet.create({\n card: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 12,\n marginHorizontal: 16,\n marginTop: 4,\n marginBottom: 12,\n paddingHorizontal: 14,\n paddingVertical: 12,\n borderRadius: 16,\n borderWidth: StyleSheet.hairlineWidth,\n },\n cardIcon: { width: 36, height: 36, borderRadius: 18, alignItems: 'center', justifyContent: 'center' },\n cardText: { flex: 1, minWidth: 0 },\n cardTitle: { fontSize: 15, fontWeight: '600' },\n cardMeta: { fontSize: 13, marginTop: 2 },\n});\n"],"names":["_a"],"mappings":"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"}
@@ -45,5 +45,5 @@ function MoviesAgentChatPane({
45
45
  seeded.current = null;
46
46
  lastContext.current = null;
47
47
  (_a2 = hostChat == null ? void 0 : hostChat.clear) == null ? void 0 : _a2.call(hostChat);
48
- }, busy: Boolean(hostChat == null ? void 0 : hostChat.busy), streamingContent: (_b = hostChat == null ? void 0 : hostChat.streaming) != null ? _b : null, error: (_c = hostChat == null ? void 0 : hostChat.error) != null ? _c : null, placeholder: movieTitle ? "Ask about this movie\u2026" : "Ask about movies or showtimes\u2026", emptyTitle: movieTitle ? `About ${movieTitle}` : "What are we watching?", emptyBody: movieTitle ? "Ask where and when it is playing, whether it is worth seeing, or for more like it." : "Ask what is playing near you, for showtimes on any day, or for something to watch tonight.", suggestions: messages.length === 0 ? moviesAgentSuggestions(movieTitle) : [], isDark: theme.isDark, ink: theme.ink, muted: theme.muted, screen: theme.screen, border: theme.border });
48
+ }, busy: Boolean(hostChat == null ? void 0 : hostChat.busy), steering: hostChat, streamingContent: (_b = hostChat == null ? void 0 : hostChat.streaming) != null ? _b : null, error: (_c = hostChat == null ? void 0 : hostChat.error) != null ? _c : null, placeholder: movieTitle ? "Ask about this movie\u2026" : "Ask about movies or showtimes\u2026", emptyTitle: movieTitle ? `About ${movieTitle}` : "What are we watching?", emptyBody: movieTitle ? "Ask where and when it is playing, whether it is worth seeing, or for more like it." : "Ask what is playing near you, for showtimes on any day, or for something to watch tonight.", suggestions: messages.length === 0 ? moviesAgentSuggestions(movieTitle) : [], isDark: theme.isDark, ink: theme.ink, muted: theme.muted, screen: theme.screen, border: theme.border });
49
49
  }export{MoviesAgentChatPane};//# sourceMappingURL=MoviesAgentChatPane.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MoviesAgentChatPane.js","sources":["../../../src/features/movies/MoviesAgentChatPane.tsx"],"sourcesContent":["/**\n * The Yantra agent, over what is on the Movies screen. Every turn goes to the\n * host's gateway chat (the same agent and skills as main chat). A turn carries\n * the movies context line whenever it changed since the thread last heard it -\n * the first turn always, and again after the person opens another film, moves\n * city or picks another day - so \"is this playing in IMAX on Friday\" means the\n * film, the city and the Friday on screen.\n */\nimport React, { useEffect, useRef, useState } from 'react';\nimport { NativeAgentChat, type AgentChatMessage } from '../agent-chat';\nimport type { MessageAttachment } from '../../hooks/useChatStream';\nimport type { MoviesHostChat } from './hostChat';\nimport { turnWithContext } from './moviesContext';\nimport { moviesAgentSuggestions } from './moviesPrompts';\nimport type { MoviesTheme } from './moviesTheme';\n\nconst NOT_CONNECTED = 'Yantra is not connected yet. Check the connection in Home, then send again.';\n\nexport interface MoviesAgentSeed {\n id: string;\n text: string;\n /** Photos or files the ask was handed over with (a hand-off from Home or Chat). */\n files?: MessageAttachment[];\n}\n\nexport function MoviesAgentChatPane({\n visible,\n onClose,\n hostChat,\n contextHeader,\n movieTitle,\n seed,\n theme,\n}: {\n visible: boolean;\n onClose: () => void;\n hostChat?: MoviesHostChat;\n /** The `[movies context: …]` line for the screen as it is now. */\n contextHeader: string;\n movieTitle: string | null;\n /** A turn to send as the pane opens. */\n seed: MoviesAgentSeed | null;\n theme: MoviesTheme;\n}) {\n const [localMessages, setLocalMessages] = useState<AgentChatMessage[]>([]);\n const seeded = useRef<string | null>(null);\n // The context line the current thread last heard.\n const lastContext = useRef<string | null>(null);\n const hostMessages = hostChat?.messages ?? [];\n const messages = hostMessages.length > 0 ? hostMessages : localMessages;\n\n const send = (text: string, files?: MessageAttachment[]) => {\n const trimmed = text.trim();\n if (!trimmed && !files?.length) return;\n if (!hostChat || !hostChat.connected) {\n setLocalMessages((prev) => [\n ...prev,\n { id: `u-${Date.now()}`, role: 'user', content: trimmed },\n { id: `a-${Date.now()}`, role: 'assistant', content: hostChat?.error || NOT_CONNECTED },\n ]);\n return;\n }\n setLocalMessages([]);\n const turn = turnWithContext(trimmed, contextHeader, lastContext.current);\n lastContext.current = contextHeader;\n hostChat.send(turn, files);\n };\n\n useEffect(() => {\n if (!visible || !seed || seeded.current === seed.id) return;\n seeded.current = seed.id;\n send(seed.text, seed.files);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [visible, seed]);\n\n return (\n <NativeAgentChat\n title=\"Movies agent\"\n visible={visible}\n onClose={onClose}\n onSwipeLeft={onClose}\n messages={messages}\n renderConnectorCard={hostChat?.renderConnectorCard}\n onSend={send}\n onClear={() => {\n setLocalMessages([]);\n seeded.current = null;\n lastContext.current = null;\n hostChat?.clear?.();\n }}\n busy={Boolean(hostChat?.busy)}\n streamingContent={hostChat?.streaming ?? null}\n error={hostChat?.error ?? null}\n placeholder={movieTitle ? 'Ask about this movie…' : 'Ask about movies or showtimes…'}\n emptyTitle={movieTitle ? `About ${movieTitle}` : 'What are we watching?'}\n emptyBody={\n movieTitle\n ? 'Ask where and when it is playing, whether it is worth seeing, or for more like it.'\n : 'Ask what is playing near you, for showtimes on any day, or for something to watch tonight.'\n }\n suggestions={messages.length === 0 ? moviesAgentSuggestions(movieTitle) : []}\n isDark={theme.isDark}\n ink={theme.ink}\n muted={theme.muted}\n screen={theme.screen}\n border={theme.border}\n />\n );\n}\n"],"names":["_a"],"mappings":"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"}
1
+ {"version":3,"file":"MoviesAgentChatPane.js","sources":["../../../src/features/movies/MoviesAgentChatPane.tsx"],"sourcesContent":["/**\n * The Yantra agent, over what is on the Movies screen. Every turn goes to the\n * host's gateway chat (the same agent and skills as main chat). A turn carries\n * the movies context line whenever it changed since the thread last heard it -\n * the first turn always, and again after the person opens another film, moves\n * city or picks another day - so \"is this playing in IMAX on Friday\" means the\n * film, the city and the Friday on screen.\n */\nimport React, { useEffect, useRef, useState } from 'react';\nimport { NativeAgentChat, type AgentChatMessage } from '../agent-chat';\nimport type { MessageAttachment } from '../../hooks/useChatStream';\nimport type { MoviesHostChat } from './hostChat';\nimport { turnWithContext } from './moviesContext';\nimport { moviesAgentSuggestions } from './moviesPrompts';\nimport type { MoviesTheme } from './moviesTheme';\n\nconst NOT_CONNECTED = 'Yantra is not connected yet. Check the connection in Home, then send again.';\n\nexport interface MoviesAgentSeed {\n id: string;\n text: string;\n /** Photos or files the ask was handed over with (a hand-off from Home or Chat). */\n files?: MessageAttachment[];\n}\n\nexport function MoviesAgentChatPane({\n visible,\n onClose,\n hostChat,\n contextHeader,\n movieTitle,\n seed,\n theme,\n}: {\n visible: boolean;\n onClose: () => void;\n hostChat?: MoviesHostChat;\n /** The `[movies context: …]` line for the screen as it is now. */\n contextHeader: string;\n movieTitle: string | null;\n /** A turn to send as the pane opens. */\n seed: MoviesAgentSeed | null;\n theme: MoviesTheme;\n}) {\n const [localMessages, setLocalMessages] = useState<AgentChatMessage[]>([]);\n const seeded = useRef<string | null>(null);\n // The context line the current thread last heard.\n const lastContext = useRef<string | null>(null);\n const hostMessages = hostChat?.messages ?? [];\n const messages = hostMessages.length > 0 ? hostMessages : localMessages;\n\n const send = (text: string, files?: MessageAttachment[]) => {\n const trimmed = text.trim();\n if (!trimmed && !files?.length) return;\n if (!hostChat || !hostChat.connected) {\n setLocalMessages((prev) => [\n ...prev,\n { id: `u-${Date.now()}`, role: 'user', content: trimmed },\n { id: `a-${Date.now()}`, role: 'assistant', content: hostChat?.error || NOT_CONNECTED },\n ]);\n return;\n }\n setLocalMessages([]);\n const turn = turnWithContext(trimmed, contextHeader, lastContext.current);\n lastContext.current = contextHeader;\n hostChat.send(turn, files);\n };\n\n useEffect(() => {\n if (!visible || !seed || seeded.current === seed.id) return;\n seeded.current = seed.id;\n send(seed.text, seed.files);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [visible, seed]);\n\n return (\n <NativeAgentChat\n title=\"Movies agent\"\n visible={visible}\n onClose={onClose}\n onSwipeLeft={onClose}\n messages={messages}\n renderConnectorCard={hostChat?.renderConnectorCard}\n onSend={send}\n onClear={() => {\n setLocalMessages([]);\n seeded.current = null;\n lastContext.current = null;\n hostChat?.clear?.();\n }}\n busy={Boolean(hostChat?.busy)}\n steering={hostChat}\n streamingContent={hostChat?.streaming ?? null}\n error={hostChat?.error ?? null}\n placeholder={movieTitle ? 'Ask about this movie…' : 'Ask about movies or showtimes…'}\n emptyTitle={movieTitle ? `About ${movieTitle}` : 'What are we watching?'}\n emptyBody={\n movieTitle\n ? 'Ask where and when it is playing, whether it is worth seeing, or for more like it.'\n : 'Ask what is playing near you, for showtimes on any day, or for something to watch tonight.'\n }\n suggestions={messages.length === 0 ? moviesAgentSuggestions(movieTitle) : []}\n isDark={theme.isDark}\n ink={theme.ink}\n muted={theme.muted}\n screen={theme.screen}\n border={theme.border}\n />\n );\n}\n"],"names":["_a"],"mappings":"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"}
@@ -0,0 +1,206 @@
1
+ import {jsx,jsxs,Fragment}from'react/jsx-runtime';import {useState,useMemo}from'react';import {Modal,Pressable,StyleSheet,View,Text,TextInput,FlatList}from'react-native';import {Ionicons}from'@expo/vector-icons';import {normalizeLanguage,CODE_LANGUAGES}from'./notionCodeLanguages.js';import {NOTION_COLORS,textColorOf,washColorOf}from'./notionRichText.js';import {ui}from'./notionUi.js';function ColorSheet({
2
+ visible,
3
+ palette,
4
+ isDark,
5
+ title,
6
+ currentText,
7
+ currentBackground,
8
+ onPick,
9
+ onClose
10
+ }) {
11
+ const section = (kind, label, current) => /* @__PURE__ */ jsxs(Fragment, { children: [
12
+ /* @__PURE__ */ jsx(Text, { style: [styles.section, {
13
+ color: palette.textMuted
14
+ }], children: label }),
15
+ /* @__PURE__ */ jsx(View, { style: styles.grid, children: NOTION_COLORS.map((c) => {
16
+ var _a, _b;
17
+ const active = (current != null ? current : "") === c.value;
18
+ const swatchText = kind === "text" ? (_a = textColorOf(c.value, isDark)) != null ? _a : palette.text : palette.text;
19
+ const swatchBg = kind === "background" ? (_b = washColorOf(c.value, isDark)) != null ? _b : palette.fill : palette.fill;
20
+ return /* @__PURE__ */ jsxs(Pressable, { accessibilityRole: "button", accessibilityLabel: `${c.label} ${kind === "text" ? "text" : "background"}`, accessibilityState: {
21
+ selected: active
22
+ }, onPress: () => {
23
+ onPick({
24
+ kind,
25
+ value: c.value
26
+ });
27
+ onClose();
28
+ }, style: styles.cell, children: [
29
+ /* @__PURE__ */ jsx(View, { style: [styles.swatch, {
30
+ backgroundColor: swatchBg,
31
+ borderColor: active ? palette.primary : palette.hairline
32
+ }, active && styles.swatchActive], children: /* @__PURE__ */ jsx(Text, { style: [styles.swatchText, {
33
+ color: swatchText
34
+ }], children: "A" }) }),
35
+ /* @__PURE__ */ jsx(Text, { numberOfLines: 1, style: [styles.cellLabel, {
36
+ color: palette.textMuted
37
+ }], children: c.label })
38
+ ] }, `${kind}-${c.value || "default"}`);
39
+ }) })
40
+ ] });
41
+ return /* @__PURE__ */ jsx(Modal, { visible, transparent: true, animationType: "fade", onRequestClose: onClose, children: /* @__PURE__ */ jsx(Pressable, { style: [styles.backdrop, {
42
+ backgroundColor: palette.backdrop
43
+ }], onPress: onClose, children: /* @__PURE__ */ jsxs(Pressable, { style: [styles.sheet, {
44
+ backgroundColor: palette.card
45
+ }], children: [
46
+ /* @__PURE__ */ jsx(View, { style: [styles.grabber, {
47
+ backgroundColor: palette.hairline
48
+ }] }),
49
+ /* @__PURE__ */ jsx(Text, { style: [styles.title, {
50
+ color: palette.text
51
+ }], children: title }),
52
+ section("text", "Text color", currentText),
53
+ section("background", "Background color", currentBackground)
54
+ ] }) }) });
55
+ }
56
+ function LanguageSheet({
57
+ visible,
58
+ palette,
59
+ current,
60
+ onPick,
61
+ onClose
62
+ }) {
63
+ const [query, setQuery] = useState("");
64
+ const active = normalizeLanguage(current);
65
+ const list = useMemo(() => {
66
+ const q = query.trim().toLowerCase();
67
+ return CODE_LANGUAGES.filter((l) => !q || l.label.toLowerCase().includes(q) || l.value.includes(q));
68
+ }, [query]);
69
+ return /* @__PURE__ */ jsx(Modal, { visible, animationType: "slide", presentationStyle: "pageSheet", onRequestClose: onClose, children: /* @__PURE__ */ jsxs(View, { style: [ui.flex, {
70
+ backgroundColor: palette.bg
71
+ }], children: [
72
+ /* @__PURE__ */ jsxs(View, { style: [ui.sheetHeader, {
73
+ borderBottomColor: palette.hairline
74
+ }], children: [
75
+ /* @__PURE__ */ jsx(View, { style: [ui.sheetHeaderSide, ui.sheetHeaderLeft] }),
76
+ /* @__PURE__ */ jsx(Text, { style: [ui.sheetHeaderTitle, {
77
+ color: palette.text
78
+ }], children: "Code language" }),
79
+ /* @__PURE__ */ jsx(Pressable, { accessibilityRole: "button", onPress: onClose, hitSlop: 8, style: ui.sheetHeaderSide, children: /* @__PURE__ */ jsx(Text, { style: [ui.sheetHeaderDone, {
80
+ color: palette.primary
81
+ }], children: "Done" }) })
82
+ ] }),
83
+ /* @__PURE__ */ jsxs(View, { style: [styles.search, {
84
+ backgroundColor: palette.fill
85
+ }], children: [
86
+ /* @__PURE__ */ jsx(Ionicons, { name: "search", size: 17, color: palette.textMuted }),
87
+ /* @__PURE__ */ jsx(TextInput, { value: query, onChangeText: setQuery, placeholder: "Search languages", placeholderTextColor: palette.textMuted, autoCorrect: false, autoCapitalize: "none", style: [styles.searchInput, {
88
+ color: palette.text
89
+ }] })
90
+ ] }),
91
+ /* @__PURE__ */ jsx(FlatList, { data: list, keyExtractor: (l) => l.value, keyboardShouldPersistTaps: "handled", contentContainerStyle: styles.list, renderItem: ({
92
+ item,
93
+ index
94
+ }) => /* @__PURE__ */ jsxs(Pressable, { accessibilityRole: "button", accessibilityState: {
95
+ selected: item.value === active
96
+ }, onPress: () => {
97
+ onPick(item.value);
98
+ onClose();
99
+ }, style: ({
100
+ pressed
101
+ }) => [styles.langRow, {
102
+ backgroundColor: pressed ? palette.pressed : palette.card
103
+ }, index === 0 && styles.top, index === list.length - 1 && styles.bottom], children: [
104
+ /* @__PURE__ */ jsx(Text, { style: [styles.langLabel, {
105
+ color: palette.text
106
+ }], children: item.label }),
107
+ item.value === active ? /* @__PURE__ */ jsx(Ionicons, { name: "checkmark", size: 20, color: palette.primary }) : null
108
+ ] }) })
109
+ ] }) });
110
+ }
111
+ const styles = StyleSheet.create({
112
+ backdrop: {
113
+ flex: 1,
114
+ justifyContent: "flex-end"
115
+ },
116
+ sheet: {
117
+ borderTopLeftRadius: 24,
118
+ borderTopRightRadius: 24,
119
+ paddingHorizontal: 16,
120
+ paddingTop: 8,
121
+ paddingBottom: 32
122
+ },
123
+ grabber: {
124
+ alignSelf: "center",
125
+ width: 36,
126
+ height: 5,
127
+ borderRadius: 3,
128
+ marginBottom: 12
129
+ },
130
+ title: {
131
+ fontSize: 18,
132
+ fontWeight: "700",
133
+ marginLeft: 4
134
+ },
135
+ section: {
136
+ fontSize: 13,
137
+ fontWeight: "600",
138
+ marginTop: 16,
139
+ marginBottom: 8,
140
+ marginLeft: 4
141
+ },
142
+ grid: {
143
+ flexDirection: "row",
144
+ flexWrap: "wrap"
145
+ },
146
+ cell: {
147
+ width: "20%",
148
+ alignItems: "center",
149
+ paddingVertical: 6
150
+ },
151
+ swatch: {
152
+ width: 40,
153
+ height: 40,
154
+ borderRadius: 10,
155
+ borderWidth: 1,
156
+ alignItems: "center",
157
+ justifyContent: "center"
158
+ },
159
+ swatchActive: {
160
+ borderWidth: 2.5
161
+ },
162
+ swatchText: {
163
+ fontSize: 18,
164
+ fontWeight: "700"
165
+ },
166
+ cellLabel: {
167
+ fontSize: 11,
168
+ marginTop: 4
169
+ },
170
+ search: {
171
+ flexDirection: "row",
172
+ alignItems: "center",
173
+ gap: 8,
174
+ height: 40,
175
+ margin: 16,
176
+ paddingHorizontal: 12,
177
+ borderRadius: 12
178
+ },
179
+ searchInput: {
180
+ flex: 1,
181
+ fontSize: 16,
182
+ paddingVertical: 0
183
+ },
184
+ list: {
185
+ paddingHorizontal: 16,
186
+ paddingBottom: 48
187
+ },
188
+ langRow: {
189
+ flexDirection: "row",
190
+ alignItems: "center",
191
+ justifyContent: "space-between",
192
+ paddingHorizontal: 16,
193
+ minHeight: 48
194
+ },
195
+ langLabel: {
196
+ fontSize: 16
197
+ },
198
+ top: {
199
+ borderTopLeftRadius: 14,
200
+ borderTopRightRadius: 14
201
+ },
202
+ bottom: {
203
+ borderBottomLeftRadius: 14,
204
+ borderBottomRightRadius: 14
205
+ }
206
+ });export{ColorSheet,LanguageSheet};//# sourceMappingURL=NotionBlockSheets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NotionBlockSheets.js","sources":["../../../src/features/notion/NotionBlockSheets.tsx"],"sourcesContent":["/**\n * Pickers the editor's block menu and format bar open: colour (the web's ten text colours and\n * ten backgrounds) and the code-block language list.\n */\nimport React, { useMemo, useState } from 'react';\nimport { FlatList, Modal, Pressable, StyleSheet, Text, TextInput, View } from 'react-native';\nimport { Ionicons } from '@expo/vector-icons';\nimport { CODE_LANGUAGES, normalizeLanguage } from './notionCodeLanguages';\nimport { NOTION_COLORS, textColorOf, washColorOf } from './notionRichText';\nimport type { NotionPalette } from './notionTheme';\nimport { ui } from './notionUi';\n\ntype Palette = NotionPalette;\n\n/** Text colour or background (web: `red` / `red_background`; inline: `color` / `highlight`). */\nexport interface ColorChoice {\n kind: 'text' | 'background';\n value: string;\n}\n\nexport function ColorSheet({\n visible,\n palette,\n isDark,\n title,\n currentText,\n currentBackground,\n onPick,\n onClose,\n}: {\n visible: boolean;\n palette: Palette;\n isDark: boolean;\n title: string;\n currentText?: string;\n currentBackground?: string;\n onPick: (choice: ColorChoice) => void;\n onClose: () => void;\n}) {\n const section = (kind: 'text' | 'background', label: string, current?: string) => (\n <>\n <Text style={[styles.section, { color: palette.textMuted }]}>{label}</Text>\n <View style={styles.grid}>\n {NOTION_COLORS.map((c) => {\n const active = (current ?? '') === c.value;\n const swatchText = kind === 'text' ? (textColorOf(c.value, isDark) ?? palette.text) : palette.text;\n const swatchBg =\n kind === 'background' ? (washColorOf(c.value, isDark) ?? palette.fill) : palette.fill;\n return (\n <Pressable\n key={`${kind}-${c.value || 'default'}`}\n accessibilityRole=\"button\"\n accessibilityLabel={`${c.label} ${kind === 'text' ? 'text' : 'background'}`}\n accessibilityState={{ selected: active }}\n onPress={() => {\n onPick({ kind, value: c.value });\n onClose();\n }}\n style={styles.cell}\n >\n <View\n style={[\n styles.swatch,\n {\n backgroundColor: swatchBg,\n borderColor: active ? palette.primary : palette.hairline,\n },\n active && styles.swatchActive,\n ]}\n >\n <Text style={[styles.swatchText, { color: swatchText }]}>A</Text>\n </View>\n <Text numberOfLines={1} style={[styles.cellLabel, { color: palette.textMuted }]}>\n {c.label}\n </Text>\n </Pressable>\n );\n })}\n </View>\n </>\n );\n return (\n <Modal visible={visible} transparent animationType=\"fade\" onRequestClose={onClose}>\n <Pressable style={[styles.backdrop, { backgroundColor: palette.backdrop }]} onPress={onClose}>\n <Pressable style={[styles.sheet, { backgroundColor: palette.card }]}>\n <View style={[styles.grabber, { backgroundColor: palette.hairline }]} />\n <Text style={[styles.title, { color: palette.text }]}>{title}</Text>\n {section('text', 'Text color', currentText)}\n {section('background', 'Background color', currentBackground)}\n </Pressable>\n </Pressable>\n </Modal>\n );\n}\n\nexport function LanguageSheet({\n visible,\n palette,\n current,\n onPick,\n onClose,\n}: {\n visible: boolean;\n palette: Palette;\n current: unknown;\n onPick: (value: string) => void;\n onClose: () => void;\n}) {\n const [query, setQuery] = useState('');\n const active = normalizeLanguage(current);\n const list = useMemo(() => {\n const q = query.trim().toLowerCase();\n return CODE_LANGUAGES.filter((l) => !q || l.label.toLowerCase().includes(q) || l.value.includes(q));\n }, [query]);\n return (\n <Modal visible={visible} animationType=\"slide\" presentationStyle=\"pageSheet\" onRequestClose={onClose}>\n <View style={[ui.flex, { backgroundColor: palette.bg }]}>\n <View style={[ui.sheetHeader, { borderBottomColor: palette.hairline }]}>\n <View style={[ui.sheetHeaderSide, ui.sheetHeaderLeft]} />\n <Text style={[ui.sheetHeaderTitle, { color: palette.text }]}>Code language</Text>\n <Pressable accessibilityRole=\"button\" onPress={onClose} hitSlop={8} style={ui.sheetHeaderSide}>\n <Text style={[ui.sheetHeaderDone, { color: palette.primary }]}>Done</Text>\n </Pressable>\n </View>\n <View style={[styles.search, { backgroundColor: palette.fill }]}>\n <Ionicons name=\"search\" size={17} color={palette.textMuted} />\n <TextInput\n value={query}\n onChangeText={setQuery}\n placeholder=\"Search languages\"\n placeholderTextColor={palette.textMuted}\n autoCorrect={false}\n autoCapitalize=\"none\"\n style={[styles.searchInput, { color: palette.text }]}\n />\n </View>\n <FlatList\n data={list}\n keyExtractor={(l) => l.value}\n keyboardShouldPersistTaps=\"handled\"\n contentContainerStyle={styles.list}\n renderItem={({ item, index }) => (\n <Pressable\n accessibilityRole=\"button\"\n accessibilityState={{ selected: item.value === active }}\n onPress={() => {\n onPick(item.value);\n onClose();\n }}\n style={({ pressed }) => [\n styles.langRow,\n { backgroundColor: pressed ? palette.pressed : palette.card },\n index === 0 && styles.top,\n index === list.length - 1 && styles.bottom,\n ]}\n >\n <Text style={[styles.langLabel, { color: palette.text }]}>{item.label}</Text>\n {item.value === active ? (\n <Ionicons name=\"checkmark\" size={20} color={palette.primary} />\n ) : null}\n </Pressable>\n )}\n />\n </View>\n </Modal>\n );\n}\n\nconst styles = StyleSheet.create({\n backdrop: { flex: 1, justifyContent: 'flex-end' },\n sheet: {\n borderTopLeftRadius: 24,\n borderTopRightRadius: 24,\n paddingHorizontal: 16,\n paddingTop: 8,\n paddingBottom: 32,\n },\n grabber: { alignSelf: 'center', width: 36, height: 5, borderRadius: 3, marginBottom: 12 },\n title: { fontSize: 18, fontWeight: '700', marginLeft: 4 },\n section: { fontSize: 13, fontWeight: '600', marginTop: 16, marginBottom: 8, marginLeft: 4 },\n grid: { flexDirection: 'row', flexWrap: 'wrap' },\n cell: { width: '20%', alignItems: 'center', paddingVertical: 6 },\n swatch: { width: 40, height: 40, borderRadius: 10, borderWidth: 1, alignItems: 'center', justifyContent: 'center' },\n swatchActive: { borderWidth: 2.5 },\n swatchText: { fontSize: 18, fontWeight: '700' },\n cellLabel: { fontSize: 11, marginTop: 4 },\n search: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 8,\n height: 40,\n margin: 16,\n paddingHorizontal: 12,\n borderRadius: 12,\n },\n searchInput: { flex: 1, fontSize: 16, paddingVertical: 0 },\n list: { paddingHorizontal: 16, paddingBottom: 48 },\n langRow: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingHorizontal: 16,\n minHeight: 48,\n },\n langLabel: { fontSize: 16 },\n top: { borderTopLeftRadius: 14, borderTopRightRadius: 14 },\n bottom: { borderBottomLeftRadius: 14, borderBottomRightRadius: 14 },\n});\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import {jsx}from'react/jsx-runtime';import {View,StyleSheet,ActivityIndicator}from'react-native';import {useQuery}from'@apollo/client/index.js';import {NATIVE_NOTION_BLOCK}from'./notionDocuments.js';import {NotionPageView}from'./NotionPageView.js';import {notionPalette}from'./notionTheme.js';import {NotionDatabaseView}from'./database/NotionDatabaseView.js';function NotionBlockView({
2
+ orgName,
3
+ blockId,
4
+ isDark
5
+ }) {
6
+ var _a;
7
+ const {
8
+ data,
9
+ error
10
+ } = useQuery(NATIVE_NOTION_BLOCK, {
11
+ variables: {
12
+ input: {
13
+ blockId: blockId != null ? blockId : ""
14
+ }
15
+ },
16
+ skip: !blockId,
17
+ fetchPolicy: "cache-first"
18
+ });
19
+ const type = (_a = data == null ? void 0 : data.getBlock) == null ? void 0 : _a.type;
20
+ if (blockId && !type && !error) {
21
+ return /* @__PURE__ */ jsx(View, { style: [styles.center, {
22
+ backgroundColor: notionPalette(isDark).bg
23
+ }], children: /* @__PURE__ */ jsx(ActivityIndicator, { color: notionPalette(isDark).textMuted }) });
24
+ }
25
+ if (blockId && type === "database") {
26
+ return /* @__PURE__ */ jsx(NotionDatabaseView, { orgName, blockId, isDark });
27
+ }
28
+ return /* @__PURE__ */ jsx(NotionPageView, { orgName, blockId, isDark });
29
+ }
30
+ const styles = StyleSheet.create({
31
+ center: {
32
+ flex: 1,
33
+ alignItems: "center",
34
+ justifyContent: "center"
35
+ }
36
+ });export{NotionBlockView};//# sourceMappingURL=NotionBlockView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NotionBlockView.js","sources":["../../../src/features/notion/NotionBlockView.tsx"],"sourcesContent":["/**\n * What `/notion/page/:blockId` shows: databases open in the native database view (web\n * DatabasePage), everything else in the page editor. The block's type comes from the same\n * `getBlock` the editor reads; until it is known a spinner holds the screen so a database never\n * flashes up as an empty page.\n */\nimport React from 'react';\nimport { ActivityIndicator, StyleSheet, View } from 'react-native';\nimport { useQuery } from '@apollo/client';\nimport { NATIVE_NOTION_BLOCK } from './notionDocuments';\nimport { NotionPageView } from './NotionPageView';\nimport { notionPalette } from './notionTheme';\nimport { NotionDatabaseView } from './database/NotionDatabaseView';\n\nexport function NotionBlockView({\n orgName,\n blockId,\n isDark,\n}: {\n orgName: string | null;\n blockId: string | null;\n isDark: boolean;\n}) {\n const { data, error } = useQuery<{ getBlock?: { id: string; type: string } | null }>(NATIVE_NOTION_BLOCK, {\n variables: { input: { blockId: blockId ?? '' } },\n skip: !blockId,\n fetchPolicy: 'cache-first',\n });\n const type = data?.getBlock?.type;\n if (blockId && !type && !error) {\n return (\n <View style={[styles.center, { backgroundColor: notionPalette(isDark).bg }]}>\n <ActivityIndicator color={notionPalette(isDark).textMuted} />\n </View>\n );\n }\n if (blockId && type === 'database') {\n return <NotionDatabaseView orgName={orgName} blockId={blockId} isDark={isDark} />;\n }\n return <NotionPageView orgName={orgName} blockId={blockId} isDark={isDark} />;\n}\n\nconst styles = StyleSheet.create({\n center: { flex: 1, alignItems: 'center', justifyContent: 'center' },\n});\n"],"names":[],"mappings":"uWAaO,SAAS,eAAgB,CAAA;AAAA,EAC9B,OAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAIG,EAAA;AArBH,EAAA,IAAA,EAAA;AAsBE,EAAM,MAAA;AAAA,IACJ,IAAA;AAAA,IACA;AAAA,GACF,GAAI,SAKD,mBAAqB,EAAA;AAAA,IACtB,SAAW,EAAA;AAAA,MACT,KAAO,EAAA;AAAA,QACL,SAAS,OAAW,IAAA,IAAA,GAAA,OAAA,GAAA;AAAA;AACtB,KACF;AAAA,IACA,MAAM,CAAC,OAAA;AAAA,IACP,WAAa,EAAA;AAAA,GACd,CAAA;AACD,EAAM,MAAA,IAAA,GAAA,CAAO,EAAM,GAAA,IAAA,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAA,QAAA,KAAN,IAAgB,GAAA,MAAA,GAAA,EAAA,CAAA,IAAA;AAC7B,EAAA,IAAI,OAAW,IAAA,CAAC,IAAQ,IAAA,CAAC,KAAO,EAAA;AAC9B,IAAA,uBAAQ,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,MAAQ,EAAA;AAAA,MAClC,eAAA,EAAiB,aAAc,CAAA,MAAM,CAAE,CAAA;AAAA,KACxC,GACW,QAAC,kBAAA,GAAA,CAAA,iBAAA,EAAA,EAAkB,OAAO,aAAc,CAAA,MAAM,CAAE,CAAA,SAAA,EAAW,CAC/D,EAAA,CAAA;AAAA;AAEV,EAAI,IAAA,OAAA,IAAW,SAAS,UAAY,EAAA;AAClC,IAAA,uBAAQ,GAAA,CAAA,kBAAA,EAAA,EAAmB,OAAkB,EAAA,OAAA,EAAkB,MAAgB,EAAA,CAAA;AAAA;AAEjF,EAAA,uBAAQ,GAAA,CAAA,cAAA,EAAA,EAAe,OAAkB,EAAA,OAAA,EAAkB,MAAgB,EAAA,CAAA;AAC7E;AACA,MAAM,MAAA,GAAS,WAAW,MAAO,CAAA;AAAA,EAC/B,MAAQ,EAAA;AAAA,IACN,IAAM,EAAA,CAAA;AAAA,IACN,UAAY,EAAA,QAAA;AAAA,IACZ,cAAgB,EAAA;AAAA;AAEpB,CAAC,CAAA"}