@adminide-stack/yantra-mobile 12.0.141-alpha.1 → 12.0.141
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/features/agent-chat/NativeAgentChat.js +21 -4
- package/lib/features/agent-chat/NativeAgentChat.js.map +1 -1
- package/lib/features/chat/ApprovalCard.js +353 -0
- package/lib/features/chat/ApprovalCard.js.map +1 -0
- package/lib/features/chat/AskUserCard.js +9 -2
- package/lib/features/chat/AskUserCard.js.map +1 -1
- package/lib/features/chat/askUser.js +25 -3
- package/lib/features/chat/askUser.js.map +1 -1
- package/lib/features/chat/queuedFollowUpRows.js +13 -0
- package/lib/features/chat/queuedFollowUpRows.js.map +1 -0
- package/lib/features/devices/bodyComposition.js +116 -0
- package/lib/features/devices/bodyComposition.js.map +1 -0
- package/lib/features/devices/readings.js.map +1 -1
- package/lib/features/devices/session.js +22 -2
- package/lib/features/devices/session.js.map +1 -1
- package/lib/features/discover/DiscoverArticle.js +105 -92
- package/lib/features/discover/DiscoverArticle.js.map +1 -1
- package/lib/features/discover/DiscoverFeed.js +97 -48
- package/lib/features/discover/DiscoverFeed.js.map +1 -1
- package/lib/features/discover/DiscoverFollowUp.js +135 -0
- package/lib/features/discover/DiscoverFollowUp.js.map +1 -0
- package/lib/features/discover/DiscoverSidebar.js +555 -0
- package/lib/features/discover/DiscoverSidebar.js.map +1 -0
- package/lib/features/discover/DiscoverSkeletons.js +123 -0
- package/lib/features/discover/DiscoverSkeletons.js.map +1 -0
- package/lib/features/discover/DiscoverStoryCards.js +193 -87
- package/lib/features/discover/DiscoverStoryCards.js.map +1 -1
- package/lib/features/discover/followUpQuery.js +42 -0
- package/lib/features/discover/followUpQuery.js.map +1 -0
- package/lib/features/discover/markets.js +37 -0
- package/lib/features/discover/markets.js.map +1 -0
- package/lib/features/discover/useDiscoverSidebar.js +148 -0
- package/lib/features/discover/useDiscoverSidebar.js.map +1 -0
- package/lib/features/discover/weather.js +42 -0
- package/lib/features/discover/weather.js.map +1 -0
- package/lib/features/expenses/ExpensesAgentChatPane.js +1 -1
- package/lib/features/expenses/ExpensesAgentChatPane.js.map +1 -1
- package/lib/features/inbox/InboxAgentChatPane.js +1 -1
- package/lib/features/inbox/InboxAgentChatPane.js.map +1 -1
- package/lib/features/job-search/JobSearchAgentChatPane.js +1 -0
- package/lib/features/job-search/JobSearchAgentChatPane.js.map +1 -1
- package/lib/features/local-services/LocalServicesAgentChatPane.js +1 -1
- package/lib/features/local-services/LocalServicesAgentChatPane.js.map +1 -1
- package/lib/features/movies/MoviesAgentChatPane.js +1 -1
- package/lib/features/movies/MoviesAgentChatPane.js.map +1 -1
- package/lib/features/notion/NotionBlockSheets.js +206 -0
- package/lib/features/notion/NotionBlockSheets.js.map +1 -0
- package/lib/features/notion/NotionBlockView.js +36 -0
- package/lib/features/notion/NotionBlockView.js.map +1 -0
- package/lib/features/notion/NotionCommentsSheet.js +461 -0
- package/lib/features/notion/NotionCommentsSheet.js.map +1 -0
- package/lib/features/notion/NotionConnectionsSheet.js +244 -0
- package/lib/features/notion/NotionConnectionsSheet.js.map +1 -0
- package/lib/features/notion/NotionHistorySheet.js +439 -0
- package/lib/features/notion/NotionHistorySheet.js.map +1 -0
- package/lib/features/notion/NotionMediaBlocks.js +803 -0
- package/lib/features/notion/NotionMediaBlocks.js.map +1 -0
- package/lib/features/notion/NotionMentionSheet.js +279 -0
- package/lib/features/notion/NotionMentionSheet.js.map +1 -0
- package/lib/features/notion/NotionPageMenu.js +585 -0
- package/lib/features/notion/NotionPageMenu.js.map +1 -0
- package/lib/features/notion/NotionPageTree.js +220 -0
- package/lib/features/notion/NotionPageTree.js.map +1 -0
- package/lib/features/notion/NotionPageView.js +1253 -152
- package/lib/features/notion/NotionPageView.js.map +1 -1
- package/lib/features/notion/NotionShareSheet.js +606 -0
- package/lib/features/notion/NotionShareSheet.js.map +1 -0
- package/lib/features/notion/NotionSheets.js +87 -15
- package/lib/features/notion/NotionSheets.js.map +1 -1
- package/lib/features/notion/NotionSidebarSections.js +492 -0
- package/lib/features/notion/NotionSidebarSections.js.map +1 -0
- package/lib/features/notion/NotionWorkspaceAdmin.js +659 -0
- package/lib/features/notion/NotionWorkspaceAdmin.js.map +1 -0
- package/lib/features/notion/NotionWorkspaceView.js +257 -45
- package/lib/features/notion/NotionWorkspaceView.js.map +1 -1
- package/lib/features/notion/database/DatabaseCells.js +554 -0
- package/lib/features/notion/database/DatabaseCells.js.map +1 -0
- package/lib/features/notion/database/DatabaseDateLayouts.js +792 -0
- package/lib/features/notion/database/DatabaseDateLayouts.js.map +1 -0
- package/lib/features/notion/database/DatabaseLayouts.js +461 -0
- package/lib/features/notion/database/DatabaseLayouts.js.map +1 -0
- package/lib/features/notion/database/DatabaseSheets.js +791 -0
- package/lib/features/notion/database/DatabaseSheets.js.map +1 -0
- package/lib/features/notion/database/NotionDatabaseView.js +817 -0
- package/lib/features/notion/database/NotionDatabaseView.js.map +1 -0
- package/lib/features/notion/database/RowPropertiesPanel.js +162 -0
- package/lib/features/notion/database/RowPropertiesPanel.js.map +1 -0
- package/lib/features/notion/database/chartData.js +89 -0
- package/lib/features/notion/database/chartData.js.map +1 -0
- package/lib/features/notion/database/chartView.js +112 -0
- package/lib/features/notion/database/chartView.js.map +1 -0
- package/lib/features/notion/database/connectorButton.js +33 -0
- package/lib/features/notion/database/connectorButton.js.map +1 -0
- package/lib/features/notion/database/databaseCalc.js +208 -0
- package/lib/features/notion/database/databaseCalc.js.map +1 -0
- package/lib/features/notion/database/databaseCalendar.js +157 -0
- package/lib/features/notion/database/databaseCalendar.js.map +1 -0
- package/lib/features/notion/database/databaseCsv.js +98 -0
- package/lib/features/notion/database/databaseCsv.js.map +1 -0
- package/lib/features/notion/database/databaseCsvActions.js +58 -0
- package/lib/features/notion/database/databaseCsvActions.js.map +1 -0
- package/lib/features/notion/database/databaseFilter.js +473 -0
- package/lib/features/notion/database/databaseFilter.js.map +1 -0
- package/lib/features/notion/database/databaseFormula.js +1072 -0
- package/lib/features/notion/database/databaseFormula.js.map +1 -0
- package/lib/features/notion/database/databaseGroup.js +151 -0
- package/lib/features/notion/database/databaseGroup.js.map +1 -0
- package/lib/features/notion/database/databaseRollup.js +58 -0
- package/lib/features/notion/database/databaseRollup.js.map +1 -0
- package/lib/features/notion/database/databaseTimeline.js +156 -0
- package/lib/features/notion/database/databaseTimeline.js.map +1 -0
- package/lib/features/notion/database/databaseView.js +1188 -0
- package/lib/features/notion/database/databaseView.js.map +1 -0
- package/lib/features/notion/database/databaseViews.js +310 -0
- package/lib/features/notion/database/databaseViews.js.map +1 -0
- package/lib/features/notion/database/relationSource.js +92 -0
- package/lib/features/notion/database/relationSource.js.map +1 -0
- package/lib/features/notion/database/uniqueId.js +17 -0
- package/lib/features/notion/database/uniqueId.js.map +1 -0
- package/lib/features/notion/database/useNotionDatabase.js +617 -0
- package/lib/features/notion/database/useNotionDatabase.js.map +1 -0
- package/lib/features/notion/notionAgentRunStatus.js +39 -0
- package/lib/features/notion/notionAgentRunStatus.js.map +1 -0
- package/lib/features/notion/notionCodeLanguages.js +112 -0
- package/lib/features/notion/notionCodeLanguages.js.map +1 -0
- package/lib/features/notion/notionComments.js +86 -0
- package/lib/features/notion/notionComments.js.map +1 -0
- package/lib/features/notion/notionConnections.js +74 -0
- package/lib/features/notion/notionConnections.js.map +1 -0
- package/lib/features/notion/notionDocuments.js +453 -1
- package/lib/features/notion/notionDocuments.js.map +1 -1
- package/lib/features/notion/notionEditorModel.js +142 -7
- package/lib/features/notion/notionEditorModel.js.map +1 -1
- package/lib/features/notion/notionMarkdownShortcuts.js +51 -0
- package/lib/features/notion/notionMarkdownShortcuts.js.map +1 -0
- package/lib/features/notion/notionMedia.js +119 -0
- package/lib/features/notion/notionMedia.js.map +1 -0
- package/lib/features/notion/notionMentionDate.js +32 -0
- package/lib/features/notion/notionMentionDate.js.map +1 -0
- package/lib/features/notion/notionMentionOptions.js +162 -0
- package/lib/features/notion/notionMentionOptions.js.map +1 -0
- package/lib/features/notion/notionNotesAgent.js +445 -0
- package/lib/features/notion/notionNotesAgent.js.map +1 -0
- package/lib/features/notion/notionPageAccess.js +168 -0
- package/lib/features/notion/notionPageAccess.js.map +1 -0
- package/lib/features/notion/notionPageActions.js +138 -0
- package/lib/features/notion/notionPageActions.js.map +1 -0
- package/lib/features/notion/notionPageHistory.js +154 -0
- package/lib/features/notion/notionPageHistory.js.map +1 -0
- package/lib/features/notion/notionPageKinds.js +200 -0
- package/lib/features/notion/notionPageKinds.js.map +1 -0
- package/lib/features/notion/notionRecents.js +48 -0
- package/lib/features/notion/notionRecents.js.map +1 -0
- package/lib/features/notion/notionRichText.js +177 -0
- package/lib/features/notion/notionRichText.js.map +1 -0
- package/lib/features/notion/notionRichTitle.js +336 -0
- package/lib/features/notion/notionRichTitle.js.map +1 -0
- package/lib/features/notion/useNotionWorkspace.js +272 -13
- package/lib/features/notion/useNotionWorkspace.js.map +1 -1
- package/lib/features/notion/usePageActions.js +155 -0
- package/lib/features/notion/usePageActions.js.map +1 -0
- package/lib/features/resume/ResumeAgentChatPane.js +1 -1
- package/lib/features/resume/ResumeAgentChatPane.js.map +1 -1
- package/lib/features/shopping/ShoppingAgentChatPane.js +1 -1
- package/lib/features/shopping/ShoppingAgentChatPane.js.map +1 -1
- package/lib/features/study/StudyAgentChatPane.js +1 -1
- package/lib/features/study/StudyAgentChatPane.js.map +1 -1
- package/lib/features/travel/TravelAgentChatPane.js +1 -1
- package/lib/features/travel/TravelAgentChatPane.js.map +1 -1
- package/lib/features/webbuilder/WebBuilderExperience.js +40 -8
- package/lib/features/webbuilder/WebBuilderExperience.js.map +1 -1
- package/lib/features/webbuilder/buildFragments.js +1 -1
- package/lib/features/webbuilder/buildFragments.js.map +1 -1
- package/lib/features/webbuilder/codeFiles.js +302 -0
- package/lib/features/webbuilder/codeFiles.js.map +1 -0
- package/lib/features/webbuilder/codeHighlight.js +209 -0
- package/lib/features/webbuilder/codeHighlight.js.map +1 -0
- package/lib/features/webbuilder/components/CodeView.js +682 -52
- package/lib/features/webbuilder/components/CodeView.js.map +1 -1
- package/lib/features/webbuilder/components/PreviewScreen.js +59 -38
- package/lib/features/webbuilder/components/PreviewScreen.js.map +1 -1
- package/lib/features/webbuilder/components/ProjectChat.js +3 -3
- package/lib/features/webbuilder/components/ProjectChat.js.map +1 -1
- package/lib/features/webbuilder/stepLabels.js +68 -0
- package/lib/features/webbuilder/stepLabels.js.map +1 -0
- package/lib/hooks/useHostChatSteering.js +45 -0
- package/lib/hooks/useHostChatSteering.js.map +1 -0
- package/lib/screens/Chat/index.js +2 -12
- package/lib/screens/Chat/index.js.map +1 -1
- package/lib/screens/Devices/index.js +205 -3
- package/lib/screens/Devices/index.js.map +1 -1
- package/lib/screens/ExpensesNative/useExpensesHostChat.js +25 -5
- package/lib/screens/ExpensesNative/useExpensesHostChat.js.map +1 -1
- package/lib/screens/InboxNative/useInboxHostChat.js +25 -5
- package/lib/screens/InboxNative/useInboxHostChat.js.map +1 -1
- package/lib/screens/JobSearchNative/useJobSearchHostChat.js +25 -5
- package/lib/screens/JobSearchNative/useJobSearchHostChat.js.map +1 -1
- package/lib/screens/LocalServicesNative/useLocalServicesHostChat.js +25 -5
- package/lib/screens/LocalServicesNative/useLocalServicesHostChat.js.map +1 -1
- package/lib/screens/MoviesNative/useMoviesHostChat.js +25 -5
- package/lib/screens/MoviesNative/useMoviesHostChat.js.map +1 -1
- package/lib/screens/NotionPage/index.js +2 -2
- package/lib/screens/NotionPage/index.js.map +1 -1
- package/lib/screens/ResumeNative/useResumeHostChat.js +25 -5
- package/lib/screens/ResumeNative/useResumeHostChat.js.map +1 -1
- package/lib/screens/ShoppingNative/useShoppingHostChat.js +25 -5
- package/lib/screens/ShoppingNative/useShoppingHostChat.js.map +1 -1
- package/lib/screens/StudyNative/useStudyHostChat.js +25 -5
- package/lib/screens/StudyNative/useStudyHostChat.js.map +1 -1
- package/lib/screens/TravelNative/useTravelHostChat.js +25 -5
- package/lib/screens/TravelNative/useTravelHostChat.js.map +1 -1
- package/lib/screens/WebBuilderNative/codeWorkspaceApi.js +222 -0
- package/lib/screens/WebBuilderNative/codeWorkspaceApi.js.map +1 -0
- package/lib/screens/WebBuilderNative/index.js +1 -1
- package/lib/screens/WebBuilderNative/index.js.map +1 -1
- package/lib/screens/WebBuilderNative/sandboxProxyApi.js +126 -4
- package/lib/screens/WebBuilderNative/sandboxProxyApi.js.map +1 -1
- package/lib/screens/WebBuilderNative/useWebBuilderHost.js +120 -11
- package/lib/screens/WebBuilderNative/useWebBuilderHost.js.map +1 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CodeView.js","sources":["../../../../src/features/webbuilder/components/CodeView.tsx"],"sourcesContent":["/**\n * The Code tab - the source the build posted (web CreationView `view='code'`),\n * read-only on a phone: the files as a list, one file at a time in a\n * monospace pane that scrolls both ways. Changes go through the agent.\n */\nimport React, { useEffect, useMemo, useState } from 'react';\nimport { Platform, ScrollView, StyleSheet, Text, View } from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { DIM, Tap } from '../../inbox/components/Tap';\nimport type { WebBuilderTheme } from '../webbuilderTheme';\nimport { CenteredState } from './ui';\n\n/** Very long files are cut so the pane stays responsive. */\nconst MAX_CHARS = 60_000;\nconst MONO = Platform.select({ ios: 'Menlo', android: 'monospace', default: 'monospace' });\n\n/** Source first (src/, app/, pages/), config after, lockfiles never. */\nexport function orderedFiles(files: Record<string, string>): string[] {\n const rank = (path: string) => {\n if (/(^|\\/)src\\//.test(path) || /(^|\\/)(app|pages|components)\\//.test(path)) return 0;\n if (/\\.(tsx?|jsx?|vue|svelte|css|html)$/.test(path)) return 1;\n return 2;\n };\n return Object.keys(files)\n .filter((path) => !/(^|\\/)(package-lock\\.json|yarn\\.lock|pnpm-lock\\.yaml)$/.test(path))\n .sort((a, b) => rank(a) - rank(b) || a.localeCompare(b));\n}\n\nexport function CodeView({\n files,\n theme,\n onAsk,\n}: {\n files: Record<string, string> | null;\n theme: WebBuilderTheme;\n onAsk: () => void;\n}) {\n const paths = useMemo(() => (files ? orderedFiles(files) : []), [files]);\n const [path, setPath] = useState<string | null>(null);\n useEffect(() => {\n if (!path || !paths.includes(path)) setPath(paths[0] ?? null);\n }, [paths, path]);\n\n if (!files || paths.length === 0) {\n return (\n <CenteredState\n icon=\"code-tags\"\n title=\"No code to show yet\"\n body=\"The source appears here once a build finishes.\"\n theme={theme}\n primary={{ label: 'Ask the agent', icon: 'creation', onPress: onAsk }}\n testID=\"webbuilder-code-empty\"\n />\n );\n }\n\n const source = path ? (files[path] ?? '') : '';\n const shown = source.length > MAX_CHARS ? `${source.slice(0, MAX_CHARS)}\\n\\n… (cut for the phone)` : source;\n\n return (\n <View style={styles.fill} testID=\"webbuilder-code\">\n <ScrollView\n horizontal\n showsHorizontalScrollIndicator={false}\n style={[styles.tabs, { borderBottomColor: theme.border, backgroundColor: theme.card }]}\n contentContainerStyle={styles.tabsContent}\n >\n {paths.map((p) => {\n const active = p === path;\n return (\n <Tap\n key={p}\n onPress={() => setPath(p)}\n accessibilityRole=\"tab\"\n accessibilityState={{ selected: active }}\n style={[\n styles.tab,\n { borderColor: active ? theme.accent : theme.border },\n active && { backgroundColor: theme.accentSoft },\n ]}\n pressedStyle={DIM}\n >\n <MaterialCommunityIcons\n name=\"file-code-outline\"\n size={14}\n color={active ? theme.accent : theme.muted}\n />\n <Text\n style={[styles.tabLabel, { color: active ? theme.accent : theme.muted }]}\n numberOfLines={1}\n >\n {p}\n </Text>\n </Tap>\n );\n })}\n </ScrollView>\n <ScrollView style={[styles.fill, { backgroundColor: theme.code }]}>\n <ScrollView horizontal contentContainerStyle={styles.codePad}>\n <Text selectable style={[styles.code, { color: theme.codeInk, fontFamily: MONO }]}>\n {shown}\n </Text>\n </ScrollView>\n </ScrollView>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n fill: { flex: 1 },\n tabs: { flexGrow: 0, borderBottomWidth: StyleSheet.hairlineWidth },\n tabsContent: { gap: 6, paddingHorizontal: 10, paddingVertical: 8 },\n tab: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 5,\n maxWidth: 220,\n paddingHorizontal: 10,\n paddingVertical: 6,\n borderRadius: 8,\n borderWidth: StyleSheet.hairlineWidth,\n },\n tabLabel: { fontSize: 12, fontWeight: '600' },\n codePad: { padding: 14 },\n code: { fontSize: 12, lineHeight: 18 },\n});\n"],"names":["_a"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CodeView.js","sources":["../../../../src/features/webbuilder/components/CodeView.tsx"],"sourcesContent":["/**\n * The Code tab - the web Code workspace on a phone. With the host's `code` calls it\n * shows the site's live files (its sandbox), or its saved code from the backup repo\n * when the sandbox is asleep (read-only, \"Wake to edit\"):\n *\n * - Files: the project tree (folders first, collapsible), one file at a time with\n * line numbers; binary files can't be shown, files over 1 MB open read-only.\n * - Edit and Save: the file is read again before writing; changed on disk since it\n * was opened -> Overwrite or Reload. Read-only while the agent works on the site.\n * A saved file is a hand edit: the next turn tells the agent to keep it.\n * - Search: matching file names, then matching lines across the project (a capped\n * `git grep`; the open files when the project can't be searched); a hit opens the\n * file at its line.\n *\n * An older host (no `code`) keeps the old view: the files the build posted, read-only.\n */\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n ActivityIndicator,\n Alert,\n FlatList,\n Platform,\n ScrollView,\n StyleSheet,\n Text,\n TextInput,\n View,\n} from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { DIM, Tap } from '../../inbox/components/Tap';\nimport type { WebBuilderTheme } from '../webbuilderTheme';\nimport type { WebBuilderBuild, WebBuilderCodeHost } from '../types';\nimport {\n matchFileNames,\n normalizeQuery,\n preferredFile,\n sortTree,\n type ContentSearchResult,\n type OpenMode,\n} from '../codeFiles';\nimport { CenteredState } from './ui';\nimport { codeLanguage, highlightLines, tokenColors } from '../codeHighlight';\n\n/** Bigger files show plain: colouring them would cost more than it helps on a phone. */\nconst MAX_HIGHLIGHT_CHARS = 200_000;\n\nconst MONO = Platform.select({ ios: 'Menlo', android: 'monospace', default: 'monospace' });\nconst LINE_HEIGHT = 18;\n/** The posted-files fallback cuts very long files so the pane stays responsive. */\nconst MAX_FALLBACK_CHARS = 60_000;\n\n/** Source first (src/, app/, pages/), config after, lockfiles never (the posted-files fallback). */\nexport function orderedFiles(files: Record<string, string>): string[] {\n const rank = (path: string) => {\n if (/(^|\\/)src\\//.test(path) || /(^|\\/)(app|pages|components)\\//.test(path)) return 0;\n if (/\\.(tsx?|jsx?|vue|svelte|css|html)$/.test(path)) return 1;\n return 2;\n };\n return Object.keys(files)\n .filter((path) => !/(^|\\/)(package-lock\\.json|yarn\\.lock|pnpm-lock\\.yaml)$/.test(path))\n .sort((a, b) => rank(a) - rank(b) || a.localeCompare(b));\n}\n\ntype TreeRow = { kind: 'dir' | 'file'; path: string; name: string; depth: number };\n\n/** The tree as rows: a folder's children follow it, hidden while it is collapsed. */\nexport function treeRows(files: string[], collapsed: ReadonlySet<string>): TreeRow[] {\n const rows: TreeRow[] = [];\n const seenDirs = new Set<string>();\n for (const path of sortTree(files)) {\n const parts = path.split('/');\n let hidden = false;\n for (let i = 0; i < parts.length - 1 && !hidden; i += 1) {\n const dir = parts.slice(0, i + 1).join('/');\n if (!seenDirs.has(dir)) {\n seenDirs.add(dir);\n rows.push({ kind: 'dir', path: dir, name: parts[i], depth: i });\n }\n if (collapsed.has(dir)) hidden = true;\n }\n if (!hidden) rows.push({ kind: 'file', path, name: parts[parts.length - 1], depth: parts.length - 1 });\n }\n // A folder inside a collapsed folder hides too.\n return rows.filter(\n (row) =>\n !row.path\n .split('/')\n .slice(0, -1)\n .some((_, i, arr) => collapsed.has(arr.slice(0, i + 1).join('/'))),\n );\n}\n\ninterface OpenFile {\n path: string;\n /** What was loaded (the save compares against it). */\n base: string;\n mode: OpenMode;\n saved: boolean;\n}\n\nfunction FileLines({\n text,\n path,\n theme,\n focusLine,\n}: {\n text: string;\n /** Picks the syntax colours (by extension). */\n path: string;\n theme: WebBuilderTheme;\n /** Scroll to this line (1-based), e.g. from a search hit. */\n focusLine?: number | null;\n}) {\n const lines = useMemo(() => text.split('\\n'), [text]);\n const tokens = useMemo(\n () => (text.length <= MAX_HIGHLIGHT_CHARS ? highlightLines(lines, codeLanguage(path)) : null),\n [lines, path, text.length],\n );\n const colors = useMemo(() => tokenColors(theme.isDark), [theme.isDark]);\n const listRef = useRef<FlatList<string>>(null);\n const gutter = String(lines.length).length * 8 + 14;\n useEffect(() => {\n if (!focusLine || focusLine < 1) return;\n const index = Math.min(focusLine - 1, lines.length - 1);\n setTimeout(() => listRef.current?.scrollToIndex({ index, animated: false, viewPosition: 0.3 }), 50);\n }, [focusLine, lines.length]);\n return (\n <ScrollView horizontal style={styles.fill} contentContainerStyle={styles.hScroll}>\n <FlatList\n ref={listRef}\n data={lines}\n keyExtractor={(_, i) => String(i)}\n getItemLayout={(_, index) => ({ length: LINE_HEIGHT, offset: LINE_HEIGHT * index, index })}\n initialNumToRender={60}\n windowSize={11}\n renderItem={({ item, index }) => (\n <View style={[styles.lineRow, index + 1 === focusLine && { backgroundColor: theme.accentSoft }]}>\n <Text style={[styles.lineNo, { width: gutter, color: theme.faint }]}>{index + 1}</Text>\n <Text style={[styles.lineText, { color: theme.ink }]}>\n {tokens && tokens[index]?.length\n ? tokens[index].map((tok, t) => (\n <Text key={t} style={colors[tok.kind] ? { color: colors[tok.kind] } : null}>\n {tok.text}\n </Text>\n ))\n : item || ' '}\n </Text>\n </View>\n )}\n />\n </ScrollView>\n );\n}\n\n/** The old view (an older host): the files the build posted, read-only. */\nfunction PostedFiles({\n files,\n theme,\n onAsk,\n}: {\n files: Record<string, string> | null;\n theme: WebBuilderTheme;\n onAsk: () => void;\n}) {\n const paths = useMemo(() => (files ? orderedFiles(files) : []), [files]);\n const [path, setPath] = useState<string | null>(null);\n useEffect(() => {\n if (!path || !paths.includes(path)) setPath(paths[0] ?? null);\n }, [paths, path]);\n if (!files || !paths.length) {\n return (\n <CenteredState\n icon=\"code-tags\"\n title=\"No code yet\"\n body=\"The site's files show here once the agent has built it.\"\n theme={theme}\n primary={{ label: 'Ask the agent', onPress: onAsk }}\n />\n );\n }\n const text = path ? (files[path] ?? '') : '';\n return (\n <View style={styles.fill}>\n <ScrollView horizontal showsHorizontalScrollIndicator={false} style={styles.tabs}>\n {paths.map((p) => (\n <Tap\n key={p}\n onPress={() => setPath(p)}\n style={[\n styles.tab,\n { borderColor: theme.border, backgroundColor: p === path ? theme.chip : 'transparent' },\n ]}\n pressedStyle={DIM}\n >\n <Text style={[styles.tabText, { color: theme.ink }]} numberOfLines={1}>\n {p.split('/').pop()}\n </Text>\n </Tap>\n ))}\n </ScrollView>\n <FileLines\n text={text.length > MAX_FALLBACK_CHARS ? text.slice(0, MAX_FALLBACK_CHARS) : text}\n path={path ?? ''}\n theme={theme}\n />\n </View>\n );\n}\n\nexport function CodeView({\n files,\n build = null,\n code,\n busy = false,\n onWake,\n theme,\n onAsk,\n}: {\n files: Record<string, string> | null;\n /** The open build (its sandbox, its saved code). */\n build?: WebBuilderBuild | null;\n /** The host's Code calls; without them, the posted files read-only. */\n code?: WebBuilderCodeHost;\n /** The agent is working on the site: files are read-only meanwhile. */\n busy?: boolean;\n /** Wake an asleep site (resume, or boot its restore point); the tree is read again after. */\n onWake?: () => Promise<unknown> | void;\n theme: WebBuilderTheme;\n onAsk: () => void;\n}) {\n const [tab, setTab] = useState<'files' | 'search'>('files');\n const [tree, setTree] = useState<{ files: string[]; partial: boolean; saved: boolean } | null>(null);\n const [treeError, setTreeError] = useState<string | null>(null);\n /** The sandbox is asleep and no saved code is known: Wake brings the files. */\n const [asleep, setAsleep] = useState(false);\n const [waking, setWaking] = useState(false);\n const [loadingTree, setLoadingTree] = useState(false);\n const [collapsed, setCollapsed] = useState<Set<string>>(new Set());\n const [open, setOpen] = useState<OpenFile | null>(null);\n const [opening, setOpening] = useState(false);\n const [focusLine, setFocusLine] = useState<number | null>(null);\n const [editing, setEditing] = useState(false);\n const [saving, setSaving] = useState(false);\n /** Unsaved drafts by path, kept while the Code view is open. */\n const [drafts, setDrafts] = useState<Record<string, string>>({});\n const [notice, setNotice] = useState<string | null>(null);\n const buildKey = build?.key ?? null;\n\n const loadTree = useCallback(() => {\n if (!code || !build) return;\n setLoadingTree(true);\n setTreeError(null);\n setAsleep(false);\n code.listFiles(build)\n .then((r) => {\n if (r.ok && r.files) setTree({ files: r.files, partial: Boolean(r.partial), saved: Boolean(r.saved) });\n else {\n setAsleep(Boolean(r.asleep));\n setTreeError(r.error || 'Could not list the project files.');\n }\n })\n .catch(() => setTreeError('Could not list the project files.'))\n .finally(() => setLoadingTree(false));\n }, [code, build]);\n\n // A new build (or the agent finished a turn): read the tree again.\n useEffect(() => {\n setTree(null);\n setOpen(null);\n setEditing(false);\n setDrafts({});\n loadTree();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [buildKey, build?.updatedAt, Boolean(code)]);\n\n const openFile = useCallback(\n (path: string, line?: number) => {\n if (!code || !build) return;\n setOpening(true);\n setEditing(false);\n setFocusLine(line ?? null);\n code.readFile(build, path, Boolean(tree?.saved))\n .then((r) => {\n if (!r.ok) {\n setNotice(r.error || 'Could not read the file.');\n return;\n }\n setOpen({\n path,\n base: r.content ?? '',\n mode: r.mode ?? { kind: 'error', message: 'The file came back empty.' },\n saved: Boolean(r.saved),\n });\n setNotice(null);\n })\n .catch(() => setNotice('Could not read the file.'))\n .finally(() => setOpening(false));\n },\n [code, build, tree?.saved],\n );\n\n // Open the app's entry file the first time the tree arrives.\n useEffect(() => {\n if (tree && !open && tree.files.length) {\n const first = preferredFile(tree.files);\n if (first) openFile(first);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [tree]);\n\n const draft = open ? (drafts[open.path] ?? open.base) : '';\n const dirty = Boolean(open && drafts[open.path] !== undefined && drafts[open.path] !== open.base);\n const readOnlyReason = (() => {\n if (!open) return null;\n if (tree?.saved || open.saved) return 'Viewing saved code. Wake the site to edit.';\n if (busy) return 'Read-only while the agent works on the site.';\n if (open.mode.kind === 'readonly') return 'This file is over 1 MB, so it opens read-only.';\n return null;\n })();\n\n const save = (force = false) => {\n if (!code || !build || !open) return;\n setSaving(true);\n code.saveFile(build, open.path, open.base, draft, force)\n .then((r) => {\n if (r.conflict) {\n const disk = r.disk ?? '';\n Alert.alert(\n 'This file changed',\n 'It changed on the site since you opened it (the agent, or someone else). Keep your version or load theirs?',\n [\n {\n text: 'Load theirs',\n onPress: () => {\n setOpen({ ...open, base: disk });\n setDrafts((prev) => {\n const { [open.path]: _drop, ...rest } = prev;\n return rest;\n });\n setEditing(false);\n },\n },\n { text: 'Overwrite', style: 'destructive', onPress: () => save(true) },\n { text: 'Cancel', style: 'cancel' },\n ],\n );\n return;\n }\n if (!r.ok) {\n setNotice(r.error || 'Could not save the file.');\n return;\n }\n setOpen({ ...open, base: draft });\n setDrafts((prev) => {\n const { [open.path]: _drop, ...rest } = prev;\n return rest;\n });\n setEditing(false);\n setNotice(r.unchanged ? 'No changes to save.' : 'Saved. The agent will keep this change.');\n })\n .catch(() => setNotice('Could not save the file.'))\n .finally(() => setSaving(false));\n };\n\n // ── Search ─────────────────────────────────────────────────────────────\n const [query, setQuery] = useState('');\n const [searching, setSearching] = useState(false);\n const [results, setResults] = useState<{ result: ContentSearchResult; source: 'project' | 'open-files' } | null>(\n null,\n );\n const nameMatches = useMemo(() => (tree ? matchFileNames(tree.files, query) : []), [tree, query]);\n const runSearch = () => {\n if (!code || !build || !normalizeQuery(query)) return;\n setSearching(true);\n const openDocs: Record<string, string> = { ...(open ? { [open.path]: open.base } : {}), ...drafts };\n code.search(build, query, !tree?.saved, openDocs)\n .then(setResults)\n .catch(() => setResults(null))\n .finally(() => setSearching(false));\n };\n\n if (!code || !build) return <PostedFiles files={files} theme={theme} onAsk={onAsk} />;\n\n const rows = tree ? treeRows(tree.files, collapsed) : [];\n\n const header = (\n <View style={[styles.segment, { backgroundColor: theme.chip }]}>\n {(['files', 'search'] as const).map((value) => (\n <Tap\n key={value}\n onPress={() => setTab(value)}\n accessibilityRole=\"button\"\n accessibilityState={{ selected: tab === value }}\n style={[styles.segmentItem, tab === value && { backgroundColor: theme.card }]}\n pressedStyle={DIM}\n >\n <MaterialCommunityIcons\n name={value === 'files' ? 'file-tree-outline' : 'magnify'}\n size={16}\n color={tab === value ? theme.ink : theme.muted}\n />\n <Text style={[styles.segmentText, { color: tab === value ? theme.ink : theme.muted }]}>\n {value === 'files' ? 'Files' : 'Search'}\n </Text>\n </Tap>\n ))}\n </View>\n );\n\n const noticeBar = notice ? (\n <Tap\n onPress={() => setNotice(null)}\n style={[styles.notice, { backgroundColor: theme.chip }]}\n pressedStyle={DIM}\n >\n <Text style={[styles.noticeText, { color: theme.ink }]}>{notice}</Text>\n </Tap>\n ) : null;\n\n // ── One file ──────────────────────────────────────────────────────────\n if (tab === 'files' && open) {\n let body: React.ReactNode;\n if (open.mode.kind === 'binary') {\n body = (\n <CenteredState\n icon=\"file-image-outline\"\n title=\"Can't show this file\"\n body=\"Images, fonts and other binary files aren't shown here.\"\n theme={theme}\n />\n );\n } else if (open.mode.kind === 'error') {\n body = (\n <CenteredState\n icon=\"alert-circle-outline\"\n title=\"Couldn't open this file\"\n body={open.mode.message}\n theme={theme}\n />\n );\n } else if (editing) {\n body = (\n <TextInput\n value={draft}\n onChangeText={(text) => setDrafts((prev) => ({ ...prev, [open.path]: text }))}\n multiline\n autoCapitalize=\"none\"\n autoCorrect={false}\n spellCheck={false}\n textAlignVertical=\"top\"\n style={[styles.editor, { color: theme.ink, backgroundColor: theme.card }]}\n accessibilityLabel={`Edit ${open.path}`}\n testID=\"webbuilder-code-editor\"\n />\n );\n } else {\n body = <FileLines text={draft} path={open.path} theme={theme} focusLine={focusLine} />;\n }\n const canEdit = !readOnlyReason && open.mode.kind === 'edit';\n return (\n <View style={styles.fill}>\n <View style={[styles.fileBar, { borderBottomColor: theme.border }]}>\n <Tap\n onPress={() => {\n setOpen(null);\n setEditing(false);\n }}\n accessibilityRole=\"button\"\n accessibilityLabel=\"All files\"\n hitSlop={8}\n pressedStyle={DIM}\n >\n <MaterialCommunityIcons name=\"chevron-left\" size={24} color={theme.ink} />\n </Tap>\n <Text style={[styles.filePath, { color: theme.ink }]} numberOfLines={1}>\n {open.path}\n {dirty ? ' •' : ''}\n </Text>\n {editing ? (\n <>\n <Tap\n onPress={() => setEditing(false)}\n style={styles.barAction}\n pressedStyle={DIM}\n accessibilityRole=\"button\"\n >\n <Text style={[styles.barActionText, { color: theme.muted }]}>Done</Text>\n </Tap>\n <Tap\n onPress={() => save()}\n disabled={saving || !dirty}\n style={[\n styles.saveButton,\n { backgroundColor: theme.accent },\n (!dirty || saving) && styles.disabled,\n ]}\n pressedStyle={DIM}\n accessibilityRole=\"button\"\n testID=\"webbuilder-code-save\"\n >\n {saving ? (\n <ActivityIndicator size=\"small\" color={theme.accentInk} />\n ) : (\n <Text style={[styles.saveText, { color: theme.accentInk }]}>Save</Text>\n )}\n </Tap>\n </>\n ) : (\n <Tap\n onPress={() => setEditing(true)}\n disabled={!canEdit}\n style={[styles.barAction, !canEdit && styles.disabled]}\n pressedStyle={DIM}\n accessibilityRole=\"button\"\n testID=\"webbuilder-code-edit\"\n >\n <MaterialCommunityIcons name=\"pencil-outline\" size={18} color={theme.ink} />\n <Text style={[styles.barActionText, { color: theme.ink }]}>Edit</Text>\n </Tap>\n )}\n </View>\n {readOnlyReason ? (\n <View style={[styles.banner, { backgroundColor: theme.chip }]}>\n <MaterialCommunityIcons name=\"lock-outline\" size={14} color={theme.muted} />\n <Text style={[styles.bannerText, { color: theme.muted }]}>{readOnlyReason}</Text>\n </View>\n ) : null}\n {noticeBar}\n {body}\n </View>\n );\n }\n\n // ── Search ────────────────────────────────────────────────────────────\n if (tab === 'search') {\n return (\n <View style={styles.fill}>\n {header}\n <View style={[styles.searchBox, { borderColor: theme.border, backgroundColor: theme.card }]}>\n <MaterialCommunityIcons name=\"magnify\" size={18} color={theme.muted} />\n <TextInput\n value={query}\n onChangeText={setQuery}\n onSubmitEditing={runSearch}\n returnKeyType=\"search\"\n placeholder=\"Search the code\"\n placeholderTextColor={theme.faint}\n autoCapitalize=\"none\"\n autoCorrect={false}\n style={[styles.searchInput, { color: theme.ink }]}\n testID=\"webbuilder-code-search\"\n />\n {searching ? <ActivityIndicator size=\"small\" color={theme.accent} /> : null}\n </View>\n <ScrollView style={styles.fill} keyboardShouldPersistTaps=\"handled\">\n {nameMatches.length ? (\n <Text style={[styles.sectionLabel, { color: theme.muted }]}>Files</Text>\n ) : null}\n {nameMatches.map((path) => (\n <Tap\n key={`name-${path}`}\n onPress={() => {\n setTab('files');\n openFile(path);\n }}\n style={styles.resultRow}\n pressedStyle={DIM}\n >\n <MaterialCommunityIcons name=\"file-document-outline\" size={16} color={theme.muted} />\n <Text style={[styles.resultPath, { color: theme.ink }]} numberOfLines={1}>\n {path}\n </Text>\n </Tap>\n ))}\n {results ? (\n <Text style={[styles.sectionLabel, { color: theme.muted }]}>\n {results.result.total\n ? `${results.result.total}${results.result.truncated ? '+' : ''} matches${\n results.source === 'open-files' ? ' in the open files' : ''\n }`\n : 'No matches'}\n </Text>\n ) : null}\n {results?.result.files.map((file) => (\n <View key={`hit-${file.path}`} style={styles.hitGroup}>\n <Text style={[styles.resultPath, { color: theme.ink }]} numberOfLines={1}>\n {file.path}\n </Text>\n {file.matches.map((m) => (\n <Tap\n key={`${file.path}:${m.line}`}\n onPress={() => {\n setTab('files');\n openFile(file.path, m.line);\n }}\n style={styles.hitRow}\n pressedStyle={DIM}\n >\n <Text style={[styles.hitLine, { color: theme.faint }]}>{m.line}</Text>\n <Text style={[styles.hitText, { color: theme.ink }]} numberOfLines={1}>\n {m.ranges.length ? (\n <>\n {m.text.slice(0, m.ranges[0][0])}\n <Text\n style={{ backgroundColor: theme.accentSoft, color: theme.accent }}\n >\n {m.text.slice(m.ranges[0][0], m.ranges[0][1])}\n </Text>\n {m.text.slice(m.ranges[0][1])}\n </>\n ) : (\n m.text\n )}\n </Text>\n </Tap>\n ))}\n </View>\n ))}\n {!results && !nameMatches.length ? (\n <Text style={[styles.searchHint, { color: theme.muted }]}>\n Find text across the site's files: a name, a class, a word on the page.\n </Text>\n ) : null}\n </ScrollView>\n </View>\n );\n }\n\n // ── The tree ──────────────────────────────────────────────────────────\n return (\n <View style={styles.fill}>\n {header}\n {tree?.saved ? (\n <View style={[styles.banner, { backgroundColor: theme.chip }]}>\n <MaterialCommunityIcons name=\"archive-outline\" size={14} color={theme.muted} />\n <Text style={[styles.bannerText, { color: theme.muted }]}>\n Viewing saved code. Wake the site to edit.\n </Text>\n </View>\n ) : null}\n {noticeBar}\n {loadingTree && !tree ? (\n <View style={styles.center}>\n <ActivityIndicator color={theme.accent} />\n </View>\n ) : null}\n {treeError && !tree && !(asleep && files) ? (\n <CenteredState\n icon={asleep ? 'power-sleep' : 'folder-alert-outline'}\n title={asleep ? 'The site is asleep' : \"Couldn't load the files\"}\n body={treeError}\n theme={theme}\n busy={waking}\n primary={\n asleep && onWake\n ? {\n label: waking ? 'Waking the site…' : 'Wake the site',\n onPress: () => {\n setWaking(true);\n Promise.resolve(onWake())\n .catch(() => undefined)\n .finally(() => {\n setWaking(false);\n loadTree();\n });\n },\n }\n : { label: 'Try again', onPress: loadTree }\n }\n secondary={asleep && onWake ? { label: 'Try again', onPress: loadTree } : undefined}\n />\n ) : null}\n {/* Asleep, but the build posted its files: show those (read-only) rather than an error. */}\n {treeError && !tree && asleep && files ? <PostedFiles files={files} theme={theme} onAsk={onAsk} /> : null}\n {tree ? (\n <FlatList\n data={rows}\n keyExtractor={(row) => `${row.kind}:${row.path}`}\n refreshing={loadingTree}\n onRefresh={loadTree}\n ListFooterComponent={\n tree.partial ? (\n <Text style={[styles.searchHint, { color: theme.muted }]}>\n Showing the first {tree.files.length} files.\n </Text>\n ) : null\n }\n renderItem={({ item }) => {\n const isDir = item.kind === 'dir';\n const isCollapsed = collapsed.has(item.path);\n let treeIcon: 'folder-outline' | 'folder-open-outline' | 'file-document-outline' =\n 'file-document-outline';\n if (isDir) treeIcon = isCollapsed ? 'folder-outline' : 'folder-open-outline';\n return (\n <Tap\n onPress={() => {\n if (isDir) {\n setCollapsed((prev) => {\n const next = new Set(prev);\n if (next.has(item.path)) next.delete(item.path);\n else next.add(item.path);\n return next;\n });\n } else {\n openFile(item.path);\n }\n }}\n style={[styles.treeRow, { paddingLeft: 16 + item.depth * 16 }]}\n pressedStyle={DIM}\n accessibilityRole=\"button\"\n accessibilityLabel={isDir ? `Folder ${item.name}` : `Open ${item.path}`}\n >\n <MaterialCommunityIcons\n name={treeIcon}\n size={18}\n color={isDir ? theme.accent : theme.muted}\n />\n <Text\n style={[styles.treeName, { color: theme.ink }, isDir && styles.treeDir]}\n numberOfLines={1}\n >\n {item.name}\n </Text>\n {!isDir && drafts[item.path] !== undefined ? (\n <View style={[styles.dirtyDot, { backgroundColor: theme.accent }]} />\n ) : null}\n </Tap>\n );\n }}\n />\n ) : null}\n {opening ? (\n <View style={[styles.opening, { backgroundColor: theme.card }]}>\n <ActivityIndicator size=\"small\" color={theme.accent} />\n </View>\n ) : null}\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n fill: { flex: 1 },\n center: { padding: 32, alignItems: 'center' },\n hScroll: { minWidth: '100%' },\n lineRow: { flexDirection: 'row', height: LINE_HEIGHT, alignItems: 'center' },\n lineNo: { fontFamily: MONO, fontSize: 11, textAlign: 'right', paddingRight: 10 },\n lineText: { fontFamily: MONO, fontSize: 12.5, paddingRight: 24 },\n tabs: { flexGrow: 0, paddingHorizontal: 12, paddingVertical: 8 },\n tab: {\n paddingHorizontal: 12,\n paddingVertical: 6,\n borderRadius: 999,\n borderWidth: StyleSheet.hairlineWidth,\n marginRight: 8,\n },\n tabText: { fontSize: 13, fontWeight: '500', maxWidth: 180 },\n segment: { flexDirection: 'row', margin: 12, borderRadius: 12, padding: 3 },\n segmentItem: {\n flex: 1,\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 6,\n paddingVertical: 8,\n borderRadius: 10,\n },\n segmentText: { fontSize: 14, fontWeight: '600' },\n banner: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 6,\n marginHorizontal: 12,\n marginBottom: 8,\n padding: 10,\n borderRadius: 10,\n },\n bannerText: { fontSize: 13, flex: 1 },\n notice: { marginHorizontal: 12, marginBottom: 8, padding: 10, borderRadius: 10 },\n noticeText: { fontSize: 13 },\n treeRow: { flexDirection: 'row', alignItems: 'center', gap: 8, paddingVertical: 10, paddingRight: 16 },\n treeName: { fontSize: 14, flex: 1 },\n treeDir: { fontWeight: '600' },\n dirtyDot: { width: 8, height: 8, borderRadius: 4 },\n fileBar: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 8,\n paddingHorizontal: 12,\n paddingVertical: 10,\n borderBottomWidth: StyleSheet.hairlineWidth,\n },\n filePath: { flex: 1, fontFamily: MONO, fontSize: 13 },\n barAction: { flexDirection: 'row', alignItems: 'center', gap: 4, paddingHorizontal: 8, paddingVertical: 6 },\n barActionText: { fontSize: 14, fontWeight: '600' },\n saveButton: { paddingHorizontal: 14, paddingVertical: 7, borderRadius: 10, minWidth: 64, alignItems: 'center' },\n saveText: { fontSize: 14, fontWeight: '700' },\n disabled: { opacity: 0.4 },\n editor: { flex: 1, fontFamily: MONO, fontSize: 13, padding: 12, lineHeight: LINE_HEIGHT },\n searchBox: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 8,\n marginHorizontal: 12,\n marginBottom: 8,\n paddingHorizontal: 12,\n borderRadius: 12,\n borderWidth: StyleSheet.hairlineWidth,\n height: 44,\n },\n searchInput: { flex: 1, fontSize: 15 },\n sectionLabel: {\n fontSize: 12,\n fontWeight: '700',\n textTransform: 'uppercase',\n marginHorizontal: 16,\n marginTop: 12,\n marginBottom: 4,\n },\n resultRow: { flexDirection: 'row', alignItems: 'center', gap: 8, paddingHorizontal: 16, paddingVertical: 10 },\n resultPath: { fontFamily: MONO, fontSize: 13, flexShrink: 1 },\n hitGroup: { paddingHorizontal: 16, paddingVertical: 8, gap: 2 },\n hitRow: { flexDirection: 'row', gap: 10, paddingVertical: 6 },\n hitLine: { fontFamily: MONO, fontSize: 12, minWidth: 32, textAlign: 'right' },\n hitText: { fontFamily: MONO, fontSize: 12.5, flex: 1 },\n searchHint: { fontSize: 13, textAlign: 'center', padding: 24 },\n opening: { position: 'absolute', top: 70, alignSelf: 'center', padding: 10, borderRadius: 20 },\n});\n"],"names":["_a","_b"],"mappings":"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"}
|
|
@@ -11,6 +11,52 @@ import {jsx,jsxs}from'react/jsx-runtime';import {useState,useEffect}from'react';
|
|
|
11
11
|
disabled
|
|
12
12
|
}, hitSlop: 6, style: [styles.barButton, disabled && styles.disabled], pressedStyle: DIM, children: /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: icon, size: 20, color: active ? theme.accent : theme.ink }) });
|
|
13
13
|
}
|
|
14
|
+
const VIEW_OPTIONS = [{
|
|
15
|
+
label: "Preview",
|
|
16
|
+
value: "preview",
|
|
17
|
+
icon: "eye-outline"
|
|
18
|
+
}, {
|
|
19
|
+
label: "Code",
|
|
20
|
+
value: "code",
|
|
21
|
+
icon: "code-tags"
|
|
22
|
+
}];
|
|
23
|
+
function ViewPicker({
|
|
24
|
+
value,
|
|
25
|
+
onPick,
|
|
26
|
+
canShowCode,
|
|
27
|
+
disabled = false,
|
|
28
|
+
theme
|
|
29
|
+
}) {
|
|
30
|
+
var _a, _b;
|
|
31
|
+
const options = VIEW_OPTIONS.filter((o) => o.value !== "code" || canShowCode);
|
|
32
|
+
const open = () => {
|
|
33
|
+
if (Platform.OS === "ios") {
|
|
34
|
+
ActionSheetIOS.showActionSheetWithOptions({
|
|
35
|
+
title: "Show",
|
|
36
|
+
options: [...options.map((o) => o.value === value ? `\u2713 ${o.label}` : o.label), "Cancel"],
|
|
37
|
+
cancelButtonIndex: options.length
|
|
38
|
+
}, (index) => {
|
|
39
|
+
const picked = options[index];
|
|
40
|
+
if (picked) onPick(picked.value);
|
|
41
|
+
});
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
Alert.alert("Show", void 0, options.map((o) => ({
|
|
45
|
+
text: o.label,
|
|
46
|
+
onPress: () => onPick(o.value)
|
|
47
|
+
})), {
|
|
48
|
+
cancelable: true
|
|
49
|
+
});
|
|
50
|
+
};
|
|
51
|
+
const icon = (_b = (_a = VIEW_OPTIONS.find((o) => o.value === value)) == null ? void 0 : _a.icon) != null ? _b : "eye-outline";
|
|
52
|
+
return /* @__PURE__ */ jsxs(Tap, { onPress: open, disabled, accessibilityRole: "button", accessibilityLabel: `Showing ${value}. Change`, style: [styles.device, {
|
|
53
|
+
borderColor: theme.border,
|
|
54
|
+
backgroundColor: theme.card
|
|
55
|
+
}, disabled && styles.disabled], pressedStyle: DIM, testID: "webbuilder-preview-device", children: [
|
|
56
|
+
/* @__PURE__ */ jsx(MaterialCommunityIcons, { name: icon, size: 20, color: theme.ink }),
|
|
57
|
+
/* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "chevron-down", size: 18, color: theme.muted })
|
|
58
|
+
] });
|
|
59
|
+
}
|
|
14
60
|
function pathOf(url) {
|
|
15
61
|
const match = /^https?:\/\/[^/]+(\/[^?#]*)?/i.exec(url != null ? url : "");
|
|
16
62
|
return (match == null ? void 0 : match[1]) || "/";
|
|
@@ -29,13 +75,18 @@ function PreviewScreen({
|
|
|
29
75
|
publishLabel = "Publish",
|
|
30
76
|
error,
|
|
31
77
|
theme,
|
|
32
|
-
bottomInset
|
|
78
|
+
bottomInset,
|
|
79
|
+
viewport: viewportProp,
|
|
80
|
+
onViewport,
|
|
81
|
+
onShowCode
|
|
33
82
|
}) {
|
|
34
83
|
var _a;
|
|
35
|
-
const [
|
|
84
|
+
const [ownViewport, setOwnViewport] = useState("phone");
|
|
85
|
+
const viewport = viewportProp != null ? viewportProp : ownViewport;
|
|
86
|
+
const setViewport = onViewport != null ? onViewport : setOwnViewport;
|
|
36
87
|
const url = (_a = build == null ? void 0 : build.previewUrl) != null ? _a : null;
|
|
37
88
|
const canPublish = Boolean(build == null ? void 0 : build.sandboxId);
|
|
38
|
-
useEffect(() =>
|
|
89
|
+
useEffect(() => setOwnViewport("phone"), [build == null ? void 0 : build.key]);
|
|
39
90
|
let stage;
|
|
40
91
|
if (url) {
|
|
41
92
|
stage = /* @__PURE__ */ jsx(PreviewFrame, { url, nonce: previewNonce, viewport, theme, onWake, waking, starting: Boolean(building) });
|
|
@@ -46,33 +97,6 @@ function PreviewScreen({
|
|
|
46
97
|
} else {
|
|
47
98
|
stage = /* @__PURE__ */ jsx(CenteredState, { icon: error ? "alert-circle-outline" : "application-outline", title: error ? "The build didn't finish" : "No preview yet", body: error != null ? error : "Ask the agent to build the site; the preview shows up here.", theme });
|
|
48
99
|
}
|
|
49
|
-
const pickDevice = () => {
|
|
50
|
-
const options = [{
|
|
51
|
-
label: "Phone",
|
|
52
|
-
value: "phone"
|
|
53
|
-
}, {
|
|
54
|
-
label: "Desktop",
|
|
55
|
-
value: "desktop"
|
|
56
|
-
}];
|
|
57
|
-
if (Platform.OS === "ios") {
|
|
58
|
-
ActionSheetIOS.showActionSheetWithOptions({
|
|
59
|
-
title: "Preview as",
|
|
60
|
-
options: [...options.map((o) => o.value === viewport ? `\u2713 ${o.label}` : o.label), "Cancel"],
|
|
61
|
-
cancelButtonIndex: options.length
|
|
62
|
-
}, (index) => {
|
|
63
|
-
const picked = options[index];
|
|
64
|
-
if (picked) setViewport(picked.value);
|
|
65
|
-
});
|
|
66
|
-
return;
|
|
67
|
-
}
|
|
68
|
-
Alert.alert("Preview as", void 0, [...options.map((o) => ({
|
|
69
|
-
text: o.label,
|
|
70
|
-
onPress: () => setViewport(o.value)
|
|
71
|
-
})), {
|
|
72
|
-
text: "Cancel",
|
|
73
|
-
style: "cancel"
|
|
74
|
-
}]);
|
|
75
|
-
};
|
|
76
100
|
return /* @__PURE__ */ jsxs(View, { style: [styles.fill, {
|
|
77
101
|
backgroundColor: theme.stage
|
|
78
102
|
}], children: [
|
|
@@ -80,13 +104,9 @@ function PreviewScreen({
|
|
|
80
104
|
backgroundColor: theme.card,
|
|
81
105
|
borderBottomColor: theme.border
|
|
82
106
|
}], children: [
|
|
83
|
-
/* @__PURE__ */
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
}, !url && styles.disabled], pressedStyle: DIM, testID: "webbuilder-preview-device", children: [
|
|
87
|
-
/* @__PURE__ */ jsx(MaterialCommunityIcons, { name: viewport === "phone" ? "cellphone" : "monitor", size: 20, color: theme.ink }),
|
|
88
|
-
/* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "chevron-down", size: 18, color: theme.muted })
|
|
89
|
-
] }),
|
|
107
|
+
onShowCode ? /* @__PURE__ */ jsx(ViewPicker, { value: "preview", onPick: (picked) => {
|
|
108
|
+
if (picked === "code") onShowCode();
|
|
109
|
+
}, canShowCode: true, theme }) : null,
|
|
90
110
|
/* @__PURE__ */ jsxs(View, { style: [styles.bar, {
|
|
91
111
|
borderColor: theme.border,
|
|
92
112
|
backgroundColor: theme.screen
|
|
@@ -95,6 +115,7 @@ function PreviewScreen({
|
|
|
95
115
|
color: theme.ink
|
|
96
116
|
}], numberOfLines: 1, children: pathOf(url) }) }),
|
|
97
117
|
building && url ? /* @__PURE__ */ jsx(ActivityIndicator, { size: "small", color: theme.accent, style: styles.barSpin }) : null,
|
|
118
|
+
/* @__PURE__ */ jsx(BarButton, { icon: viewport === "phone" ? "cellphone" : "monitor", label: viewport === "phone" ? "Showing phone width. Show desktop" : "Showing desktop width. Show phone", onPress: () => setViewport(viewport === "phone" ? "desktop" : "phone"), theme, disabled: !url }),
|
|
98
119
|
/* @__PURE__ */ jsx(BarButton, { icon: "open-in-new", label: "Open in the browser", onPress: () => {
|
|
99
120
|
if (url) Linking.openURL(url).catch(() => void 0);
|
|
100
121
|
}, theme, disabled: !url }),
|
|
@@ -200,4 +221,4 @@ const styles = StyleSheet.create({
|
|
|
200
221
|
},
|
|
201
222
|
elevation: 2
|
|
202
223
|
}
|
|
203
|
-
});export{PreviewScreen};//# sourceMappingURL=PreviewScreen.js.map
|
|
224
|
+
});export{PreviewScreen,ViewPicker};//# sourceMappingURL=PreviewScreen.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PreviewScreen.js","sources":["../../../../src/features/webbuilder/components/PreviewScreen.tsx"],"sourcesContent":["/**\n * The site, full screen - what the chat's site card opens, as Manus shows it: a\n * slim address bar (home, the page, open in the browser, reload) over the live\n * preview. While the agent is still building it says so instead of a blank page.\n */\nimport React, { useEffect, useState } from 'react';\nimport { ActionSheetIOS, ActivityIndicator, Alert, Linking, Platform, StyleSheet, Text, View } from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { DIM, Tap } from '../../inbox/components/Tap';\nimport type { WebBuilderBuild, WebBuilderBuilding } from '../types';\nimport type { WebBuilderTheme } from '../webbuilderTheme';\nimport type { ToolStep } from '../../chat/toolActivity';\nimport { BuildingStage } from './BuildingStage';\nimport { PreviewFrame, type PreviewViewport } from './PreviewFrame';\nimport { PreviewPlaceholder } from './PreviewPlaceholder';\nimport { CenteredState, type IconName } from './ui';\n\nfunction BarButton({\n icon,\n label,\n onPress,\n theme,\n active = false,\n disabled = false,\n}: {\n icon: IconName;\n label: string;\n onPress: () => void;\n theme: WebBuilderTheme;\n active?: boolean;\n disabled?: boolean;\n}) {\n return (\n <Tap\n onPress={onPress}\n disabled={disabled}\n accessibilityRole=\"button\"\n accessibilityLabel={label}\n accessibilityState={{ selected: active, disabled }}\n hitSlop={6}\n style={[styles.barButton, disabled && styles.disabled]}\n pressedStyle={DIM}\n >\n <MaterialCommunityIcons name={icon} size={20} color={active ? theme.accent : theme.ink} />\n </Tap>\n );\n}\n\nfunction pathOf(url: string | null): string {\n const match = /^https?:\\/\\/[^/]+(\\/[^?#]*)?/i.exec(url ?? '');\n return match?.[1] || '/';\n}\n\nexport function PreviewScreen({\n build,\n building,\n loading,\n previewNonce,\n onReload,\n onHome,\n onWake,\n waking = false,\n steps = [],\n onPublish,\n publishLabel = 'Publish',\n error,\n theme,\n bottomInset,\n}: {\n build: WebBuilderBuild | null;\n building: WebBuilderBuilding | null;\n loading: boolean;\n previewNonce: number;\n onReload: () => void;\n onHome: () => void;\n onWake: () => void;\n /** A wake is running: the page stays \"on its way\". */\n waking?: boolean;\n /** The agent's steps so far, while it builds. */\n steps?: ToolStep[];\n onPublish: () => void;\n /** \"Publish\", or \"Publishing…\" while it runs. */\n publishLabel?: string;\n error?: string | null;\n theme: WebBuilderTheme;\n bottomInset: number;\n}) {\n const [viewport, setViewport] = useState<PreviewViewport>('phone');\n const url = build?.previewUrl ?? null;\n const canPublish = Boolean(build?.sandboxId);\n useEffect(() => setViewport('phone'), [build?.key]);\n\n let stage: React.ReactNode;\n if (url) {\n stage = (\n <PreviewFrame\n url={url}\n nonce={previewNonce}\n viewport={viewport}\n theme={theme}\n onWake={onWake}\n waking={waking}\n starting={Boolean(building)}\n />\n );\n } else if (building) {\n stage = (\n <BuildingStage\n statusText={building.statusText}\n startedAt={building.startedAt}\n steps={steps}\n theme={theme}\n />\n );\n } else if (loading) {\n stage = <PreviewPlaceholder theme={theme} label=\"Loading preview, please wait…\" />;\n } else {\n stage = (\n <CenteredState\n icon={error ? 'alert-circle-outline' : 'application-outline'}\n title={error ? \"The build didn't finish\" : 'No preview yet'}\n body={error ?? 'Ask the agent to build the site; the preview shows up here.'}\n theme={theme}\n />\n );\n }\n\n const pickDevice = () => {\n const options: Array<{ label: string; value: PreviewViewport }> = [\n { label: 'Phone', value: 'phone' },\n { label: 'Desktop', value: 'desktop' },\n ];\n if (Platform.OS === 'ios') {\n ActionSheetIOS.showActionSheetWithOptions(\n {\n title: 'Preview as',\n options: [...options.map((o) => (o.value === viewport ? `✓ ${o.label}` : o.label)), 'Cancel'],\n cancelButtonIndex: options.length,\n },\n (index) => {\n const picked = options[index];\n if (picked) setViewport(picked.value);\n },\n );\n return;\n }\n Alert.alert('Preview as', undefined, [\n ...options.map((o) => ({ text: o.label, onPress: () => setViewport(o.value) })),\n { text: 'Cancel', style: 'cancel' as const },\n ]);\n };\n\n return (\n <View style={[styles.fill, { backgroundColor: theme.stage }]}>\n <View style={[styles.toolbar, { backgroundColor: theme.card, borderBottomColor: theme.border }]}>\n <Tap\n onPress={pickDevice}\n disabled={!url}\n accessibilityRole=\"button\"\n accessibilityLabel={`Preview as ${viewport}`}\n style={[\n styles.device,\n { borderColor: theme.border, backgroundColor: theme.card },\n !url && styles.disabled,\n ]}\n pressedStyle={DIM}\n testID=\"webbuilder-preview-device\"\n >\n <MaterialCommunityIcons\n name={viewport === 'phone' ? 'cellphone' : 'monitor'}\n size={20}\n color={theme.ink}\n />\n <MaterialCommunityIcons name=\"chevron-down\" size={18} color={theme.muted} />\n </Tap>\n <View style={[styles.bar, { borderColor: theme.border, backgroundColor: theme.screen }]}>\n <Tap\n onPress={onHome}\n disabled={!url}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Back to the home page\"\n style={styles.pathTap}\n pressedStyle={DIM}\n >\n <Text style={[styles.path, { color: theme.ink }]} numberOfLines={1}>\n {pathOf(url)}\n </Text>\n </Tap>\n {building && url ? (\n <ActivityIndicator size=\"small\" color={theme.accent} style={styles.barSpin} />\n ) : null}\n <BarButton\n icon=\"open-in-new\"\n label=\"Open in the browser\"\n onPress={() => {\n if (url) Linking.openURL(url).catch(() => undefined);\n }}\n theme={theme}\n disabled={!url}\n />\n <BarButton icon=\"refresh\" label=\"Reload\" onPress={onReload} theme={theme} disabled={!url} />\n </View>\n <Tap\n onPress={onPublish}\n disabled={!canPublish}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Publish\"\n style={[styles.publish, { backgroundColor: theme.ink }, !canPublish && styles.disabled]}\n pressedStyle={DIM}\n testID=\"webbuilder-preview-publish\"\n >\n <MaterialCommunityIcons name=\"export-variant\" size={17} color={theme.card} />\n <Text style={[styles.publishText, { color: theme.card }]}>{publishLabel}</Text>\n </Tap>\n </View>\n <View style={[styles.stage, { paddingBottom: bottomInset + 10 }]}>\n <View\n style={[\n styles.frame,\n {\n backgroundColor: theme.card,\n borderColor: theme.border,\n shadowColor: theme.isDark ? '#000' : '#1c1917',\n },\n ]}\n >\n {stage}\n </View>\n </View>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n fill: { flex: 1 },\n toolbar: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 8,\n paddingHorizontal: 12,\n paddingVertical: 10,\n borderBottomWidth: StyleSheet.hairlineWidth,\n },\n device: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 4,\n height: 44,\n paddingHorizontal: 10,\n borderRadius: 12,\n borderWidth: StyleSheet.hairlineWidth,\n },\n bar: {\n flex: 1,\n flexDirection: 'row',\n alignItems: 'center',\n height: 44,\n paddingLeft: 14,\n paddingRight: 4,\n borderRadius: 22,\n borderWidth: StyleSheet.hairlineWidth,\n },\n pathTap: { flex: 1, justifyContent: 'center', height: 44 },\n path: { fontSize: 15, fontWeight: '500' },\n barButton: { width: 36, height: 36, borderRadius: 18, alignItems: 'center', justifyContent: 'center' },\n barSpin: { marginRight: 4 },\n publish: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 6,\n height: 44,\n paddingHorizontal: 14,\n borderRadius: 12,\n },\n publishText: { fontSize: 15, fontWeight: '700' },\n disabled: { opacity: 0.35 },\n stage: { flex: 1, padding: 12 },\n frame: {\n flex: 1,\n borderRadius: 22,\n borderWidth: StyleSheet.hairlineWidth,\n overflow: 'hidden',\n shadowOpacity: 0.06,\n shadowRadius: 14,\n shadowOffset: { width: 0, height: 4 },\n elevation: 2,\n },\n});\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PreviewScreen.js","sources":["../../../../src/features/webbuilder/components/PreviewScreen.tsx"],"sourcesContent":["/**\n * The site, full screen - what the chat's site card opens, as Manus shows it: a\n * slim address bar (home, the page, open in the browser, reload) over the live\n * preview. While the agent is still building it says so instead of a blank page.\n */\nimport React, { useEffect, useState } from 'react';\nimport { ActionSheetIOS, ActivityIndicator, Alert, Linking, Platform, StyleSheet, Text, View } from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { DIM, Tap } from '../../inbox/components/Tap';\nimport type { WebBuilderBuild, WebBuilderBuilding } from '../types';\nimport type { WebBuilderTheme } from '../webbuilderTheme';\nimport type { ToolStep } from '../../chat/toolActivity';\nimport { BuildingStage } from './BuildingStage';\nimport { PreviewFrame, type PreviewViewport } from './PreviewFrame';\nimport { PreviewPlaceholder } from './PreviewPlaceholder';\nimport { CenteredState, type IconName } from './ui';\n\nfunction BarButton({\n icon,\n label,\n onPress,\n theme,\n active = false,\n disabled = false,\n}: {\n icon: IconName;\n label: string;\n onPress: () => void;\n theme: WebBuilderTheme;\n active?: boolean;\n disabled?: boolean;\n}) {\n return (\n <Tap\n onPress={onPress}\n disabled={disabled}\n accessibilityRole=\"button\"\n accessibilityLabel={label}\n accessibilityState={{ selected: active, disabled }}\n hitSlop={6}\n style={[styles.barButton, disabled && styles.disabled]}\n pressedStyle={DIM}\n >\n <MaterialCommunityIcons name={icon} size={20} color={active ? theme.accent : theme.ink} />\n </Tap>\n );\n}\n\n/** What the picker shows: the running site, or its code. */\nexport type SiteView = 'preview' | 'code';\n\nconst VIEW_OPTIONS: Array<{ label: string; value: SiteView; icon: 'eye-outline' | 'code-tags' }> = [\n { label: 'Preview', value: 'preview', icon: 'eye-outline' },\n { label: 'Code', value: 'code', icon: 'code-tags' },\n];\n\n/** The view picker (Preview / Code), the same chip on the preview and the code view. */\nexport function ViewPicker({\n value,\n onPick,\n canShowCode,\n disabled = false,\n theme,\n}: {\n value: SiteView;\n onPick: (value: SiteView) => void;\n canShowCode: boolean;\n disabled?: boolean;\n theme: WebBuilderTheme;\n}) {\n const options = VIEW_OPTIONS.filter((o) => o.value !== 'code' || canShowCode);\n const open = () => {\n if (Platform.OS === 'ios') {\n ActionSheetIOS.showActionSheetWithOptions(\n {\n title: 'Show',\n options: [...options.map((o) => (o.value === value ? `✓ ${o.label}` : o.label)), 'Cancel'],\n cancelButtonIndex: options.length,\n },\n (index) => {\n const picked = options[index];\n if (picked) onPick(picked.value);\n },\n );\n return;\n }\n // Two choices, so Android's alert holds them (dismissed by tapping outside).\n Alert.alert(\n 'Show',\n undefined,\n options.map((o) => ({ text: o.label, onPress: () => onPick(o.value) })),\n {\n cancelable: true,\n },\n );\n };\n const icon = VIEW_OPTIONS.find((o) => o.value === value)?.icon ?? 'eye-outline';\n return (\n <Tap\n onPress={open}\n disabled={disabled}\n accessibilityRole=\"button\"\n accessibilityLabel={`Showing ${value}. Change`}\n style={[\n styles.device,\n { borderColor: theme.border, backgroundColor: theme.card },\n disabled && styles.disabled,\n ]}\n pressedStyle={DIM}\n testID=\"webbuilder-preview-device\"\n >\n <MaterialCommunityIcons name={icon} size={20} color={theme.ink} />\n <MaterialCommunityIcons name=\"chevron-down\" size={18} color={theme.muted} />\n </Tap>\n );\n}\n\nfunction pathOf(url: string | null): string {\n const match = /^https?:\\/\\/[^/]+(\\/[^?#]*)?/i.exec(url ?? '');\n return match?.[1] || '/';\n}\n\nexport function PreviewScreen({\n build,\n building,\n loading,\n previewNonce,\n onReload,\n onHome,\n onWake,\n waking = false,\n steps = [],\n onPublish,\n publishLabel = 'Publish',\n error,\n theme,\n bottomInset,\n viewport: viewportProp,\n onViewport,\n onShowCode,\n}: {\n build: WebBuilderBuild | null;\n building: WebBuilderBuilding | null;\n loading: boolean;\n previewNonce: number;\n onReload: () => void;\n onHome: () => void;\n onWake: () => void;\n /** A wake is running: the page stays \"on its way\". */\n waking?: boolean;\n /** The agent's steps so far, while it builds. */\n steps?: ToolStep[];\n onPublish: () => void;\n /** \"Publish\", or \"Publishing…\" while it runs. */\n publishLabel?: string;\n error?: string | null;\n theme: WebBuilderTheme;\n bottomInset: number;\n /** The width shown, when the parent holds it. */\n viewport?: PreviewViewport;\n onViewport?: (viewport: PreviewViewport) => void;\n /** Code in the view picker; without it the picker offers Phone / Desktop only. */\n onShowCode?: () => void;\n}) {\n const [ownViewport, setOwnViewport] = useState<PreviewViewport>('phone');\n // The host of this screen may hold the width (so the code view's picker can come back to it).\n const viewport = viewportProp ?? ownViewport;\n const setViewport = onViewport ?? setOwnViewport;\n const url = build?.previewUrl ?? null;\n const canPublish = Boolean(build?.sandboxId);\n useEffect(() => setOwnViewport('phone'), [build?.key]);\n\n let stage: React.ReactNode;\n if (url) {\n stage = (\n <PreviewFrame\n url={url}\n nonce={previewNonce}\n viewport={viewport}\n theme={theme}\n onWake={onWake}\n waking={waking}\n starting={Boolean(building)}\n />\n );\n } else if (building) {\n stage = (\n <BuildingStage\n statusText={building.statusText}\n startedAt={building.startedAt}\n steps={steps}\n theme={theme}\n />\n );\n } else if (loading) {\n stage = <PreviewPlaceholder theme={theme} label=\"Loading preview, please wait…\" />;\n } else {\n stage = (\n <CenteredState\n icon={error ? 'alert-circle-outline' : 'application-outline'}\n title={error ? \"The build didn't finish\" : 'No preview yet'}\n body={error ?? 'Ask the agent to build the site; the preview shows up here.'}\n theme={theme}\n />\n );\n }\n\n return (\n <View style={[styles.fill, { backgroundColor: theme.stage }]}>\n <View style={[styles.toolbar, { backgroundColor: theme.card, borderBottomColor: theme.border }]}>\n {onShowCode ? (\n <ViewPicker\n value=\"preview\"\n onPick={(picked) => {\n if (picked === 'code') onShowCode();\n }}\n canShowCode\n theme={theme}\n />\n ) : null}\n <View style={[styles.bar, { borderColor: theme.border, backgroundColor: theme.screen }]}>\n <Tap\n onPress={onHome}\n disabled={!url}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Back to the home page\"\n style={styles.pathTap}\n pressedStyle={DIM}\n >\n <Text style={[styles.path, { color: theme.ink }]} numberOfLines={1}>\n {pathOf(url)}\n </Text>\n </Tap>\n {building && url ? (\n <ActivityIndicator size=\"small\" color={theme.accent} style={styles.barSpin} />\n ) : null}\n <BarButton\n icon={viewport === 'phone' ? 'cellphone' : 'monitor'}\n label={\n viewport === 'phone'\n ? 'Showing phone width. Show desktop'\n : 'Showing desktop width. Show phone'\n }\n onPress={() => setViewport(viewport === 'phone' ? 'desktop' : 'phone')}\n theme={theme}\n disabled={!url}\n />\n <BarButton\n icon=\"open-in-new\"\n label=\"Open in the browser\"\n onPress={() => {\n if (url) Linking.openURL(url).catch(() => undefined);\n }}\n theme={theme}\n disabled={!url}\n />\n <BarButton icon=\"refresh\" label=\"Reload\" onPress={onReload} theme={theme} disabled={!url} />\n </View>\n <Tap\n onPress={onPublish}\n disabled={!canPublish}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Publish\"\n style={[styles.publish, { backgroundColor: theme.ink }, !canPublish && styles.disabled]}\n pressedStyle={DIM}\n testID=\"webbuilder-preview-publish\"\n >\n <MaterialCommunityIcons name=\"export-variant\" size={17} color={theme.card} />\n <Text style={[styles.publishText, { color: theme.card }]}>{publishLabel}</Text>\n </Tap>\n </View>\n <View style={[styles.stage, { paddingBottom: bottomInset + 10 }]}>\n <View\n style={[\n styles.frame,\n {\n backgroundColor: theme.card,\n borderColor: theme.border,\n shadowColor: theme.isDark ? '#000' : '#1c1917',\n },\n ]}\n >\n {stage}\n </View>\n </View>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n fill: { flex: 1 },\n toolbar: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 8,\n paddingHorizontal: 12,\n paddingVertical: 10,\n borderBottomWidth: StyleSheet.hairlineWidth,\n },\n device: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 4,\n height: 44,\n paddingHorizontal: 10,\n borderRadius: 12,\n borderWidth: StyleSheet.hairlineWidth,\n },\n bar: {\n flex: 1,\n flexDirection: 'row',\n alignItems: 'center',\n height: 44,\n paddingLeft: 14,\n paddingRight: 4,\n borderRadius: 22,\n borderWidth: StyleSheet.hairlineWidth,\n },\n pathTap: { flex: 1, justifyContent: 'center', height: 44 },\n path: { fontSize: 15, fontWeight: '500' },\n barButton: { width: 36, height: 36, borderRadius: 18, alignItems: 'center', justifyContent: 'center' },\n barSpin: { marginRight: 4 },\n publish: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 6,\n height: 44,\n paddingHorizontal: 14,\n borderRadius: 12,\n },\n publishText: { fontSize: 15, fontWeight: '700' },\n disabled: { opacity: 0.35 },\n stage: { flex: 1, padding: 12 },\n frame: {\n flex: 1,\n borderRadius: 22,\n borderWidth: StyleSheet.hairlineWidth,\n overflow: 'hidden',\n shadowOpacity: 0.06,\n shadowRadius: 14,\n shadowOffset: { width: 0, height: 4 },\n elevation: 2,\n },\n});\n"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {jsxs,jsx}from'react/jsx-runtime';import {useState,useRef,useMemo,useEffect}from'react';import {StyleSheet,KeyboardAvoidingView,FlatList,View,Text,TextInput,Platform,ActivityIndicator,Image}from'react-native';import {WebView}from'react-native-webview';import {MaterialCommunityIcons}from'@expo/vector-icons';import {Tap,DIM}from'../../inbox/components/Tap.js';import {AssistantMarkdown}from'../../chat/AssistantMarkdown.js';import {ToolTimeline}from'../../chat/ToolTimeline.js';import {parseToolActivity}from'../../chat/toolActivity.js';import {AskUserCard}from'../../chat/AskUserCard.js';import {displayHost}from'../buildFragments.js';import {DESKTOP_VIEWPORT_SCRIPT}from'./PreviewFrame.js';import {PreviewPlaceholder}from'./PreviewPlaceholder.js';import {webbuilderAgentSuggestions}from'../webbuilderPrompts.js';var __defProp = Object.defineProperty;
|
|
1
|
+
import {jsxs,jsx}from'react/jsx-runtime';import {useState,useRef,useMemo,useEffect}from'react';import {StyleSheet,KeyboardAvoidingView,FlatList,View,Text,TextInput,Platform,ActivityIndicator,Image}from'react-native';import {WebView}from'react-native-webview';import {MaterialCommunityIcons}from'@expo/vector-icons';import {Tap,DIM}from'../../inbox/components/Tap.js';import {AssistantMarkdown}from'../../chat/AssistantMarkdown.js';import {ToolTimeline}from'../../chat/ToolTimeline.js';import {parseToolActivity}from'../../chat/toolActivity.js';import {friendlySteps}from'../stepLabels.js';import {AskUserCard}from'../../chat/AskUserCard.js';import {displayHost}from'../buildFragments.js';import {DESKTOP_VIEWPORT_SCRIPT}from'./PreviewFrame.js';import {PreviewPlaceholder}from'./PreviewPlaceholder.js';import {webbuilderAgentSuggestions}from'../webbuilderPrompts.js';var __defProp = Object.defineProperty;
|
|
2
2
|
var __defProps = Object.defineProperties;
|
|
3
3
|
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
4
|
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
@@ -60,7 +60,7 @@ function AgentTurn({
|
|
|
60
60
|
const parsed = useMemo(() => parseToolActivity(content, active), [content, active]);
|
|
61
61
|
return /* @__PURE__ */ jsxs(View, { style: styles.agentTurn, children: [
|
|
62
62
|
/* @__PURE__ */ jsx(AgentAvatar, { theme }),
|
|
63
|
-
parsed.steps.length ? /* @__PURE__ */ jsx(ToolTimeline, { steps: parsed.steps, active, isDark: theme.isDark }) : null,
|
|
63
|
+
parsed.steps.length ? /* @__PURE__ */ jsx(ToolTimeline, { steps: friendlySteps(parsed.steps), active, isDark: theme.isDark }) : null,
|
|
64
64
|
parsed.text ? /* @__PURE__ */ jsx(AssistantMarkdown, { text: parsed.text, streaming: active, isDark: theme.isDark }) : null
|
|
65
65
|
] });
|
|
66
66
|
}
|
|
@@ -75,7 +75,7 @@ function LiveTurn({
|
|
|
75
75
|
const showStatus = !parsed.text && parsed.steps.length === 0;
|
|
76
76
|
return /* @__PURE__ */ jsxs(View, { style: styles.agentTurn, children: [
|
|
77
77
|
/* @__PURE__ */ jsx(AgentAvatar, { theme }),
|
|
78
|
-
parsed.steps.length ? /* @__PURE__ */ jsx(ToolTimeline, { steps: parsed.steps, active: true, isDark: theme.isDark }) : null,
|
|
78
|
+
parsed.steps.length ? /* @__PURE__ */ jsx(ToolTimeline, { steps: friendlySteps(parsed.steps), active: true, isDark: theme.isDark }) : null,
|
|
79
79
|
parsed.text ? /* @__PURE__ */ jsx(AssistantMarkdown, { text: parsed.text, streaming: true, isDark: theme.isDark }) : null,
|
|
80
80
|
showStatus ? /* @__PURE__ */ jsxs(View, { style: [styles.working, {
|
|
81
81
|
backgroundColor: theme.card,
|