@adminide-stack/yantra-mobile 12.0.142-alpha.0 → 12.0.144
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/attachments/displayUserMessageText.js +2 -2
- package/lib/features/attachments/displayUserMessageText.js.map +1 -1
- 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/notion/NotionAgentPanel.js +987 -0
- package/lib/features/notion/NotionAgentPanel.js.map +1 -0
- package/lib/features/notion/NotionAskAiSheet.js +362 -0
- package/lib/features/notion/NotionAskAiSheet.js.map +1 -0
- package/lib/features/notion/NotionBlockView.js +4 -3
- package/lib/features/notion/NotionBlockView.js.map +1 -1
- package/lib/features/notion/NotionConnectionsSheet.js +47 -13
- package/lib/features/notion/NotionConnectionsSheet.js.map +1 -1
- package/lib/features/notion/NotionPageView.js +68 -8
- package/lib/features/notion/NotionPageView.js.map +1 -1
- package/lib/features/notion/NotionSidebarSections.js +1 -1
- package/lib/features/notion/NotionSidebarSections.js.map +1 -1
- package/lib/features/notion/NotionWorkspaceView.js +14 -9
- package/lib/features/notion/NotionWorkspaceView.js.map +1 -1
- package/lib/features/notion/database/DatabaseCells.js +3 -1
- package/lib/features/notion/database/DatabaseCells.js.map +1 -1
- package/lib/features/notion/database/DatabaseDateLayouts.js +1 -1
- package/lib/features/notion/database/DatabaseDateLayouts.js.map +1 -1
- package/lib/features/notion/database/NotionDatabaseView.js +1 -1
- package/lib/features/notion/database/NotionDatabaseView.js.map +1 -1
- package/lib/features/notion/notionAgentRunStatus.js +2 -2
- package/lib/features/notion/notionAgentRunStatus.js.map +1 -1
- package/lib/features/notion/notionAgentRuns.js +57 -0
- package/lib/features/notion/notionAgentRuns.js.map +1 -0
- package/lib/features/notion/notionAiContext.js +91 -0
- package/lib/features/notion/notionAiContext.js.map +1 -0
- package/lib/features/notion/notionConnections.js +42 -4
- package/lib/features/notion/notionConnections.js.map +1 -1
- package/lib/features/notion/notionDocuments.js +61 -1
- package/lib/features/notion/notionDocuments.js.map +1 -1
- package/lib/features/notion/notionNotesAgent.js +173 -3
- package/lib/features/notion/notionNotesAgent.js.map +1 -1
- package/lib/features/notion/notionPageKinds.js +1 -1
- package/lib/features/webbuilder/WebBuilderExperience.js +229 -97
- package/lib/features/webbuilder/WebBuilderExperience.js.map +1 -1
- package/lib/features/webbuilder/buildFragments.js +33 -7
- package/lib/features/webbuilder/buildFragments.js.map +1 -1
- package/lib/features/webbuilder/buildJob.js +2 -2
- package/lib/features/webbuilder/buildJob.js.map +1 -1
- package/lib/features/webbuilder/codeFiles.js +18 -1
- package/lib/features/webbuilder/codeFiles.js.map +1 -1
- package/lib/features/webbuilder/components/BottomTabs.js.map +1 -1
- package/lib/features/webbuilder/components/CodeView.js +134 -56
- package/lib/features/webbuilder/components/CodeView.js.map +1 -1
- package/lib/features/webbuilder/components/Composer.js +2 -2
- package/lib/features/webbuilder/components/Composer.js.map +1 -1
- package/lib/features/webbuilder/components/PreviewFrame.js +19 -3
- package/lib/features/webbuilder/components/PreviewFrame.js.map +1 -1
- package/lib/features/webbuilder/components/PreviewScreen.js +310 -46
- package/lib/features/webbuilder/components/PreviewScreen.js.map +1 -1
- package/lib/features/webbuilder/components/ProjectChat.js +141 -12
- package/lib/features/webbuilder/components/ProjectChat.js.map +1 -1
- package/lib/features/webbuilder/components/ProjectSheets.js +792 -0
- package/lib/features/webbuilder/components/ProjectSheets.js.map +1 -0
- package/lib/features/webbuilder/components/ProjectsScreen.js +14 -2
- package/lib/features/webbuilder/components/ProjectsScreen.js.map +1 -1
- package/lib/features/webbuilder/components/PublishSheet.js +914 -58
- package/lib/features/webbuilder/components/PublishSheet.js.map +1 -1
- package/lib/features/webbuilder/components/TemplateCard.js +9 -6
- package/lib/features/webbuilder/components/TemplateCard.js.map +1 -1
- package/lib/features/webbuilder/components/TemplatesSheet.js +5 -17
- package/lib/features/webbuilder/components/TemplatesSheet.js.map +1 -1
- package/lib/features/webbuilder/connectorTemplates.js +171 -0
- package/lib/features/webbuilder/connectorTemplates.js.map +1 -0
- package/lib/features/webbuilder/fileTree.js +163 -0
- package/lib/features/webbuilder/fileTree.js.map +1 -0
- package/lib/features/webbuilder/followUps.js +67 -0
- package/lib/features/webbuilder/followUps.js.map +1 -0
- package/lib/features/webbuilder/previewProbe.js +49 -0
- package/lib/features/webbuilder/previewProbe.js.map +1 -0
- package/lib/features/webbuilder/previewRoutes.js +156 -0
- package/lib/features/webbuilder/previewRoutes.js.map +1 -0
- package/lib/features/webbuilder/projectTools.js +341 -0
- package/lib/features/webbuilder/projectTools.js.map +1 -0
- package/lib/features/webbuilder/publishTools.js +475 -0
- package/lib/features/webbuilder/publishTools.js.map +1 -0
- package/lib/features/webbuilder/sleepNotice.js +13 -0
- package/lib/features/webbuilder/sleepNotice.js.map +1 -0
- package/lib/features/webbuilder/stepLabels.js +37 -7
- package/lib/features/webbuilder/stepLabels.js.map +1 -1
- package/lib/features/webbuilder/studioCatalog.js +5 -1
- package/lib/features/webbuilder/studioCatalog.js.map +1 -1
- package/lib/features/webbuilder/templateCatalog.js +140 -0
- package/lib/features/webbuilder/templateCatalog.js.map +1 -0
- package/lib/features/webbuilder/webbuilderPrompts.js +31 -5
- package/lib/features/webbuilder/webbuilderPrompts.js.map +1 -1
- package/lib/features/webbuilder/workflow.js +8 -4
- package/lib/features/webbuilder/workflow.js.map +1 -1
- package/lib/screens/Devices/index.js +205 -3
- package/lib/screens/Devices/index.js.map +1 -1
- package/lib/screens/WebBuilderNative/codeWorkspaceApi.js +9 -6
- package/lib/screens/WebBuilderNative/codeWorkspaceApi.js.map +1 -1
- package/lib/screens/WebBuilderNative/index.js +1 -1
- package/lib/screens/WebBuilderNative/index.js.map +1 -1
- package/lib/screens/WebBuilderNative/keepAlive.js +53 -3
- package/lib/screens/WebBuilderNative/keepAlive.js.map +1 -1
- package/lib/screens/WebBuilderNative/unreachableRetry.js +23 -0
- package/lib/screens/WebBuilderNative/unreachableRetry.js.map +1 -0
- package/lib/screens/WebBuilderNative/useConnectorTemplates.js +37 -0
- package/lib/screens/WebBuilderNative/useConnectorTemplates.js.map +1 -0
- package/lib/screens/WebBuilderNative/useSandboxKeepAlive.js +6 -0
- package/lib/screens/WebBuilderNative/useSandboxKeepAlive.js.map +1 -1
- package/lib/screens/WebBuilderNative/useWebBuilderHost.js +302 -40
- package/lib/screens/WebBuilderNative/useWebBuilderHost.js.map +1 -1
- package/lib/screens/WebBuilderNative/useWebBuilderJobs.js +2 -2
- package/lib/screens/WebBuilderNative/useWebBuilderJobs.js.map +1 -1
- package/lib/screens/WebBuilderNative/versionUndo.js +1 -1
- package/lib/screens/WebBuilderNative/versionUndo.js.map +1 -1
- package/lib/screens/WebBuilderNative/webbuilderTransport.js +147 -77
- package/lib/screens/WebBuilderNative/webbuilderTransport.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 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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"}
|
|
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 codeUnavailableText,\n listErrorText,\n matchFileNames,\n normalizeQuery,\n preferredFile,\n type ContentSearchResult,\n type OpenMode,\n} from '../codeFiles';\nimport { CenteredState } from './ui';\nimport { codeLanguage, highlightLines, tokenColors } from '../codeHighlight';\nimport {\n buildFileTree,\n filterPaths,\n nameMatch,\n readExpandedFolders,\n rollUp,\n visibleRows,\n withFolder,\n withRevealed,\n writeExpandedFolders,\n type Expansion,\n type FolderNode,\n} from '../fileTree';\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\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 emptyBody,\n}: {\n files: Record<string, string> | null;\n theme: WebBuilderTheme;\n onAsk: () => void;\n /** Why there are no files, when known (still building, not a project yet). */\n emptyBody?: string;\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={emptyBody ?? \"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 const hasPosted = !!files && Object.keys(files).length > 0;\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 // The open folders (VS Code's explorer: closed until opened), kept per project on this device.\n const projectKey = build?.projectId || build?.sandboxId || build?.key || '';\n const [expanded, setExpanded] = useState<ReadonlySet<string>>(new Set());\n const expandedLoaded = useRef<string | null>(null);\n useEffect(() => {\n let live = true;\n expandedLoaded.current = null;\n readExpandedFolders(projectKey).then((kept) => {\n if (!live) return;\n setExpanded((now) => (now.size ? new Set([...kept, ...now]) : kept));\n expandedLoaded.current = projectKey;\n });\n return () => {\n live = false;\n };\n }, [projectKey]);\n useEffect(() => {\n if (projectKey && expandedLoaded.current === projectKey) writeExpandedFolders(projectKey, expanded);\n }, [projectKey, expanded]);\n const [treeQuery, setTreeQuery] = useState('');\n const filtering = treeQuery.trim().length > 0;\n // While filtering every match is open; closing one only lasts until the filter changes.\n const [filterExpanded, setFilterExpanded] = useState<Expansion>('all');\n useEffect(() => setFilterExpanded('all'), [treeQuery]);\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(listErrorText(r.error));\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 setExpanded((prev) => withRevealed(prev, path));\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) {\n const emptyBody = build\n ? codeUnavailableText({\n agentBuild: build.origin === 'agent',\n busy,\n openUrl: build.liveUrl || build.previewUrl,\n })\n : undefined;\n return <PostedFiles files={files} theme={theme} onAsk={onAsk} emptyBody={emptyBody} />;\n }\n\n const fileTree = tree ? buildFileTree(filtering ? filterPaths(tree.files, treeQuery) : tree.files) : null;\n const expansion: Expansion = filtering ? filterExpanded : expanded;\n const rows = fileTree ? visibleRows(fileTree, expansion) : [];\n // An unsaved draft marks every folder above it, so a closed folder still shows it.\n const dirtyFolders = rollUp(Object.keys(drafts).map((p) => [p, true] as const));\n const setFolder = (folder: FolderNode, openIt: boolean) => {\n if (filtering) {\n setFilterExpanded((prev) => {\n const base =\n prev === 'all'\n ? new Set(rows.filter((r) => r.node.kind === 'folder' && r.expanded).map((r) => r.node.path))\n : prev;\n return withFolder(base, folder, openIt);\n });\n } else {\n setExpanded((prev) => withFolder(prev, folder, openIt));\n }\n };\n const collapseAll = () => (filtering ? setFilterExpanded(new Set()) : setExpanded(new Set()));\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 && !hasPosted ? (\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 {/* The live files could not be read, but the build posted its files: show those (read-only) rather than an error. */}\n {treeError && !tree && hasPosted ? <PostedFiles files={files} theme={theme} onAsk={onAsk} /> : null}\n {tree ? (\n <View style={[styles.treeBar, { borderBottomColor: theme.border }]}>\n <View style={[styles.treeFilter, { backgroundColor: theme.chip }]}>\n <MaterialCommunityIcons name=\"filter-variant\" size={16} color={theme.muted} />\n <TextInput\n value={treeQuery}\n onChangeText={setTreeQuery}\n placeholder=\"Filter files\"\n placeholderTextColor={theme.faint}\n autoCapitalize=\"none\"\n autoCorrect={false}\n style={[styles.treeFilterInput, { color: theme.ink }]}\n accessibilityLabel=\"Filter files by name\"\n testID=\"webbuilder-code-tree-filter\"\n />\n {filtering ? (\n <Tap\n onPress={() => setTreeQuery('')}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Clear the filter\"\n hitSlop={8}\n pressedStyle={DIM}\n >\n <MaterialCommunityIcons name=\"close-circle\" size={16} color={theme.faint} />\n </Tap>\n ) : null}\n </View>\n <Tap\n onPress={collapseAll}\n disabled={!rows.some((r) => r.expanded)}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Collapse all folders\"\n style={[styles.collapseAll, !rows.some((r) => r.expanded) && styles.disabled]}\n pressedStyle={DIM}\n testID=\"webbuilder-code-collapse-all\"\n >\n <MaterialCommunityIcons name=\"collapse-all-outline\" size={20} color={theme.ink} />\n </Tap>\n </View>\n ) : null}\n {tree ? (\n <FlatList\n data={rows}\n keyExtractor={(row) => `${row.node.kind}:${row.node.path}`}\n refreshing={loadingTree}\n onRefresh={loadTree}\n keyboardShouldPersistTaps=\"handled\"\n ListEmptyComponent={\n filtering ? (\n <Text style={[styles.searchHint, { color: theme.muted }]}>\n No file name matches “{treeQuery.trim()}”.\n </Text>\n ) : null\n }\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 { node } = item;\n const isDir = node.kind === 'folder';\n let treeIcon: 'folder-outline' | 'folder-open-outline' | 'file-document-outline' =\n 'file-document-outline';\n if (isDir) treeIcon = item.expanded ? 'folder-open-outline' : 'folder-outline';\n const isOpen = !isDir && open?.path === node.path;\n // A closed folder shows a draft inside it; an open one leaves that to its files.\n const unsaved = isDir\n ? !item.expanded && dirtyFolders.has(node.path)\n : drafts[node.path] !== undefined;\n const hit = !isDir && filtering ? nameMatch(node.name, treeQuery) : null;\n return (\n <Tap\n onPress={() => {\n if (node.kind === 'folder') setFolder(node, !item.expanded);\n else openFile(node.path);\n }}\n style={[\n styles.treeRow,\n { paddingLeft: 12 + (item.level - 1) * 16 },\n isOpen && { backgroundColor: theme.chip },\n ]}\n pressedStyle={DIM}\n accessibilityRole=\"button\"\n accessibilityState={isDir ? { expanded: item.expanded } : { selected: isOpen }}\n accessibilityLabel={\n isDir\n ? `Folder ${node.name}${unsaved ? ', has unsaved changes' : ''}`\n : `Open ${node.path}${unsaved ? ', unsaved' : ''}`\n }\n >\n {isDir ? (\n <MaterialCommunityIcons\n name={item.expanded ? 'chevron-down' : 'chevron-right'}\n size={16}\n color={theme.muted}\n />\n ) : (\n <View style={styles.chevronSpace} />\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 {hit ? (\n <>\n {node.name.slice(0, hit.start)}\n <Text style={{ backgroundColor: theme.accentSoft, color: theme.accent }}>\n {node.name.slice(hit.start, hit.end)}\n </Text>\n {node.name.slice(hit.end)}\n </>\n ) : (\n node.name\n )}\n </Text>\n {unsaved ? <View style={[styles.dirtyDot, { backgroundColor: theme.accent }]} /> : 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 treeBar: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 8,\n paddingHorizontal: 12,\n paddingBottom: 8,\n borderBottomWidth: StyleSheet.hairlineWidth,\n },\n treeFilter: {\n flex: 1,\n flexDirection: 'row',\n alignItems: 'center',\n gap: 6,\n borderRadius: 10,\n paddingHorizontal: 10,\n },\n treeFilterInput: { flex: 1, fontSize: 14, paddingVertical: Platform.OS === 'ios' ? 8 : 4 },\n collapseAll: { width: 36, height: 36, alignItems: 'center', justifyContent: 'center' },\n chevronSpace: { width: 16 },\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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BA,MAAM,mBAAsB,GAAA,GAAA;AAC5B,MAAM,IAAA,GAAO,SAAS,MAAO,CAAA;AAAA,EAC3B,GAAK,EAAA,OAAA;AAAA,EACL,OAAS,EAAA,WAAA;AAAA,EACT,OAAS,EAAA;AACX,CAAC,CAAA;AACD,MAAM,WAAc,GAAA,EAAA;AAEpB,MAAM,kBAAqB,GAAA,GAAA;AAGpB,SAAS,aAAa,KAAyC,EAAA;AACpE,EAAM,MAAA,IAAA,GAAO,CAAC,IAAiB,KAAA;AAC7B,IAAI,IAAA,aAAA,CAAc,KAAK,IAAI,CAAA,IAAK,iCAAiC,IAAK,CAAA,IAAI,GAAU,OAAA,CAAA;AACpF,IAAA,IAAI,oCAAqC,CAAA,IAAA,CAAK,IAAI,CAAA,EAAU,OAAA,CAAA;AAC5D,IAAO,OAAA,CAAA;AAAA,GACT;AACA,EAAO,OAAA,MAAA,CAAO,IAAK,CAAA,KAAK,CAAE,CAAA,MAAA,CAAO,UAAQ,CAAC,wDAAA,CAAyD,IAAK,CAAA,IAAI,CAAC,CAAA,CAAE,KAAK,CAAC,CAAA,EAAG,CAAM,KAAA,IAAA,CAAK,CAAC,CAAA,GAAI,IAAK,CAAA,CAAC,CAAK,IAAA,CAAA,CAAE,aAAc,CAAA,CAAC,CAAC,CAAA;AACvK;AAQA,SAAS,SAAU,CAAA;AAAA,EACjB,IAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAOG,EAAA;AACD,EAAM,MAAA,KAAA,GAAQ,QAAQ,MAAM,IAAA,CAAK,MAAM,IAAI,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AACpD,EAAA,MAAM,SAAS,OAAQ,CAAA,MAAM,KAAK,MAAU,IAAA,mBAAA,GAAsB,eAAe,KAAO,EAAA,YAAA,CAAa,IAAI,CAAC,IAAI,IAAM,EAAA,CAAC,OAAO,IAAM,EAAA,IAAA,CAAK,MAAM,CAAC,CAAA;AAC9I,EAAM,MAAA,MAAA,GAAS,OAAQ,CAAA,MAAM,WAAY,CAAA,KAAA,CAAM,MAAM,CAAG,EAAA,CAAC,KAAM,CAAA,MAAM,CAAC,CAAA;AACtE,EAAM,MAAA,OAAA,GAAU,OAAyB,IAAI,CAAA;AAC7C,EAAA,MAAM,SAAS,MAAO,CAAA,KAAA,CAAM,MAAM,CAAA,CAAE,SAAS,CAAI,GAAA,EAAA;AACjD,EAAA,SAAA,CAAU,MAAM;AACd,IAAI,IAAA,CAAC,SAAa,IAAA,SAAA,GAAY,CAAG,EAAA;AACjC,IAAA,MAAM,QAAQ,IAAK,CAAA,GAAA,CAAI,YAAY,CAAG,EAAA,KAAA,CAAM,SAAS,CAAC,CAAA;AACtD,IAAA,UAAA,CAAW,MAAG;AA3ElB,MAAA,IAAA,EAAA;AA2EqB,MAAQ,OAAA,CAAA,EAAA,GAAA,OAAA,CAAA,OAAA,KAAR,mBAAiB,aAAc,CAAA;AAAA,QAC9C,KAAA;AAAA,QACA,QAAU,EAAA,KAAA;AAAA,QACV,YAAc,EAAA;AAAA,OAChB,CAAA;AAAA,KAAA,EAAI,EAAE,CAAA;AAAA,GACL,EAAA,CAAC,SAAW,EAAA,KAAA,CAAM,MAAM,CAAC,CAAA;AAC5B,EAAO,uBAAA,GAAA,CAAC,UAAW,EAAA,EAAA,UAAA,EAAU,IAAC,EAAA,KAAA,EAAO,MAAO,CAAA,IAAA,EAAM,qBAAuB,EAAA,MAAA,CAAO,OACtE,EAAA,QAAA,kBAAA,GAAA,CAAC,QAAS,EAAA,EAAA,GAAA,EAAK,SAAS,IAAM,EAAA,KAAA,EAAO,YAAc,EAAA,CAAC,CAAG,EAAA,CAAA,KAAM,MAAO,CAAA,CAAC,CAAG,EAAA,aAAA,EAAe,CAAC,CAAA,EAAG,KAAW,MAAA;AAAA,IAC5G,MAAQ,EAAA,WAAA;AAAA,IACR,QAAQ,WAAc,GAAA,KAAA;AAAA,IACtB;AAAA,MACE,kBAAoB,EAAA,EAAA,EAAI,UAAY,EAAA,EAAA,EAAI,YAAY,CAAC;AAAA,IACvD,IAAA;AAAA,IACA;AAAA,GACC,KAAA;AAzFP,IAAA,IAAA,EAAA;AAyFU,IAAA,uBAAA,IAAA,CAAC,QAAK,KAAO,EAAA,CAAC,OAAO,OAAS,EAAA,KAAA,GAAQ,MAAM,SAAa,IAAA;AAAA,MAC7D,iBAAiB,KAAM,CAAA;AAAA,KACxB,CACmB,EAAA,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,IAAK,EAAA,EAAA,KAAA,EAAO,CAAC,MAAA,CAAO,MAAQ,EAAA;AAAA,QAC7C,KAAO,EAAA,MAAA;AAAA,QACP,OAAO,KAAM,CAAA;AAAA,OACd,CAAI,EAAA,QAAA,EAAA,KAAA,GAAQ,CAAE,EAAA,CAAA;AAAA,sBACI,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,QAAU,EAAA;AAAA,QAC/C,OAAO,KAAM,CAAA;AAAA,OACd,GACsB,QAAU,EAAA,MAAA,KAAA,CAAA,EAAA,GAAA,MAAA,CAAO,KAAK,CAAZ,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAe,UAAS,MAAO,CAAA,KAAK,EAAE,GAAI,CAAA,CAAC,KAAK,CAAM,qBAAA,GAAA,CAAC,QAAa,KAAO,EAAA,MAAA,CAAO,GAAI,CAAA,IAAI,CAAI,GAAA;AAAA,QAC3H,KAAA,EAAO,MAAO,CAAA,GAAA,CAAI,IAAI;AAAA,OACxB,GAAI,MAC+B,QAAI,EAAA,GAAA,CAAA,IAAA,EAAA,EAHyD,CAIlE,CAAO,CAAA,GAAI,QAAQ,GACjC,EAAA;AAAA,KACJ,EAAA,CAAA;AAAA,GAAA,EAAS,CACrB,EAAA,CAAA;AACR;AAGA,SAAS,WAAY,CAAA;AAAA,EACnB,KAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAMG,EAAA;AAzHH,EAAA,IAAA,EAAA;AA0HE,EAAM,MAAA,KAAA,GAAQ,OAAQ,CAAA,MAAM,KAAQ,GAAA,YAAA,CAAa,KAAK,CAAA,GAAI,EAAC,EAAG,CAAC,KAAK,CAAC,CAAA;AACrE,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAwB,IAAI,CAAA;AACpD,EAAA,SAAA,CAAU,MAAM;AA5HlB,IAAAA,IAAAA,GAAAA;AA6HI,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,KAAA,CAAM,SAAS,IAAI,CAAA,EAAWA,OAAAA,CAAAA,CAAAA,GAAAA,GAAA,KAAM,CAAA,CAAC,CAAP,KAAA,IAAA,GAAAA,MAAY,IAAI,CAAA;AAAA,GAC3D,EAAA,CAAC,KAAO,EAAA,IAAI,CAAC,CAAA;AAChB,EAAA,IAAI,CAAC,KAAA,IAAS,CAAC,KAAA,CAAM,MAAQ,EAAA;AAC3B,IAAO,uBAAA,GAAA,CAAC,aAAc,EAAA,EAAA,IAAA,EAAK,WAAY,EAAA,KAAA,EAAM,eAAc,IAAM,EAAA,SAAA,IAAA,IAAA,GAAA,SAAA,GAAa,yDAA2D,EAAA,KAAA,EAAc,OAAS,EAAA;AAAA,MAC9J,KAAO,EAAA,eAAA;AAAA,MACP,OAAS,EAAA;AAAA,KACR,EAAA,CAAA;AAAA;AAEL,EAAA,MAAM,OAAO,IAAO,GAAA,CAAA,EAAA,GAAA,KAAA,CAAM,IAAI,CAAA,KAAV,YAAe,EAAK,GAAA,EAAA;AACxC,EAAA,uBAAQ,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,IACjB,EAAA,QAAA,EAAA;AAAA,oBAAC,GAAA,CAAA,UAAA,EAAA,EAAW,YAAU,IAAC,EAAA,8BAAA,EAAgC,OAAO,KAAO,EAAA,MAAA,CAAO,MACvE,QAAM,EAAA,KAAA,CAAA,GAAA,CAAI,uBAAM,GAAA,CAAA,GAAA,EAAA,EAAY,SAAS,MAAM,OAAA,CAAQ,CAAC,CAAG,EAAA,KAAA,EAAO,CAAC,MAAA,CAAO,GAAK,EAAA;AAAA,MACpF,aAAa,KAAM,CAAA,MAAA;AAAA,MACnB,eAAiB,EAAA,CAAA,KAAM,IAAO,GAAA,KAAA,CAAM,IAAO,GAAA;AAAA,KAC5C,GAAG,YAAc,EAAA,GAAA,EACA,8BAAC,IAAK,EAAA,EAAA,KAAA,EAAO,CAAC,MAAA,CAAO,OAAS,EAAA;AAAA,MAC5C,OAAO,KAAM,CAAA;AAAA,KACd,CAAA,EAAG,aAAe,EAAA,CAAA,EACE,QAAE,EAAA,CAAA,CAAA,KAAA,CAAM,GAAG,CAAA,CAAE,GAAI,EAAA,EACtB,CARkB,EAAA,EAAA,CAStB,CAAM,CACd,EAAA,CAAA;AAAA,oBACC,GAAA,CAAA,SAAA,EAAA,EAAU,IAAM,EAAA,IAAA,CAAK,SAAS,kBAAqB,GAAA,IAAA,CAAK,KAAM,CAAA,CAAA,EAAG,kBAAkB,CAAI,GAAA,IAAA,EAAM,IAAM,EAAA,IAAA,IAAA,IAAA,GAAA,IAAA,GAAQ,IAAI,KAAc,EAAA;AAAA,GAClI,EAAA,CAAA;AACR;AACO,SAAS,QAAS,CAAA;AAAA,EACvB,KAAA;AAAA,EACA,KAAQ,GAAA,IAAA;AAAA,EACR,IAAA;AAAA,EACA,IAAO,GAAA,KAAA;AAAA,EACP,MAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAYG,EAAA;AA1KH,EAAA,IAAA,EAAA,EAAA,EAAA;AA2KE,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAI,SAA6B,OAAO,CAAA;AAC1D,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAId,IAAI,CAAA;AACd,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAwB,IAAI,CAAA;AAC9D,EAAM,MAAA,SAAA,GAAY,CAAC,CAAC,KAAA,IAAS,OAAO,IAAK,CAAA,KAAK,EAAE,MAAS,GAAA,CAAA;AAEzD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAS,KAAK,CAAA;AAEpD,EAAA,MAAM,cAAa,KAAO,IAAA,IAAA,GAAA,MAAA,GAAA,KAAA,CAAA,SAAA,MAAa,KAAO,IAAA,IAAA,GAAA,MAAA,GAAA,KAAA,CAAA,SAAA,CAAA,KAAa,+BAAO,GAAO,CAAA,IAAA,EAAA;AACzE,EAAA,MAAM,CAAC,QAAU,EAAA,WAAW,IAAI,QAA8B,iBAAA,IAAI,KAAK,CAAA;AACvE,EAAM,MAAA,cAAA,GAAiB,OAAsB,IAAI,CAAA;AACjD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,IAAO,GAAA,IAAA;AACX,IAAA,cAAA,CAAe,OAAU,GAAA,IAAA;AACzB,IAAoB,mBAAA,CAAA,UAAU,CAAE,CAAA,IAAA,CAAK,CAAQ,IAAA,KAAA;AAC3C,MAAA,IAAI,CAAC,IAAM,EAAA;AACX,MAAA,WAAA,CAAY,CAAO,GAAA,KAAA,GAAA,CAAI,IAAO,mBAAA,IAAI,GAAI,CAAA,CAAC,GAAG,IAAA,EAAM,GAAG,GAAG,CAAC,CAAA,GAAI,IAAI,CAAA;AAC/D,MAAA,cAAA,CAAe,OAAU,GAAA,UAAA;AAAA,KAC1B,CAAA;AACD,IAAA,OAAO,MAAM;AACX,MAAO,IAAA,GAAA,KAAA;AAAA,KACT;AAAA,GACF,EAAG,CAAC,UAAU,CAAC,CAAA;AACf,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,cAAc,cAAe,CAAA,OAAA,KAAY,UAAY,EAAA,oBAAA,CAAqB,YAAY,QAAQ,CAAA;AAAA,GACjG,EAAA,CAAC,UAAY,EAAA,QAAQ,CAAC,CAAA;AACzB,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAS,EAAE,CAAA;AAC7C,EAAA,MAAM,SAAY,GAAA,SAAA,CAAU,IAAK,EAAA,CAAE,MAAS,GAAA,CAAA;AAE5C,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAI,SAAoB,KAAK,CAAA;AACrE,EAAA,SAAA,CAAU,MAAM,iBAAkB,CAAA,KAAK,CAAG,EAAA,CAAC,SAAS,CAAC,CAAA;AACrD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAA0B,IAAI,CAAA;AACtD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAwB,IAAI,CAAA;AAC9D,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAS,KAAK,CAAA;AAE1C,EAAA,MAAM,CAAC,MAAQ,EAAA,SAAS,CAAI,GAAA,QAAA,CAAiC,EAAE,CAAA;AAC/D,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAwB,IAAI,CAAA;AACxD,EAAM,MAAA,QAAA,GAAA,CAAW,EAAO,GAAA,KAAA,IAAA,IAAA,GAAA,MAAA,GAAA,KAAA,CAAA,GAAA,KAAP,IAAc,GAAA,EAAA,GAAA,IAAA;AAC/B,EAAM,MAAA,QAAA,GAAW,YAAY,MAAM;AACjC,IAAI,IAAA,CAAC,IAAQ,IAAA,CAAC,KAAO,EAAA;AACrB,IAAA,cAAA,CAAe,IAAI,CAAA;AACnB,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,SAAA,CAAU,KAAK,CAAA;AACf,IAAA,IAAA,CAAK,SAAU,CAAA,KAAK,CAAE,CAAA,IAAA,CAAK,CAAK,CAAA,KAAA;AAC9B,MAAA,IAAI,CAAE,CAAA,EAAA,IAAM,CAAE,CAAA,KAAA,EAAe,OAAA,CAAA;AAAA,QAC3B,OAAO,CAAE,CAAA,KAAA;AAAA,QACT,OAAA,EAAS,OAAQ,CAAA,CAAA,CAAE,OAAO,CAAA;AAAA,QAC1B,KAAA,EAAO,OAAQ,CAAA,CAAA,CAAE,KAAK;AAAA,OACvB,CAAA;AAAA,WAAO;AACN,QAAU,SAAA,CAAA,OAAA,CAAQ,CAAE,CAAA,MAAM,CAAC,CAAA;AAC3B,QAAa,YAAA,CAAA,aAAA,CAAc,CAAE,CAAA,KAAK,CAAC,CAAA;AAAA;AACrC,KACD,CAAA,CAAE,KAAM,CAAA,MAAM,YAAa,CAAA,mCAAmC,CAAC,CAAA,CAAE,OAAQ,CAAA,MAAM,cAAe,CAAA,KAAK,CAAC,CAAA;AAAA,GACpG,EAAA,CAAC,IAAM,EAAA,KAAK,CAAC,CAAA;AAGhB,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,IAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,IAAA,UAAA,CAAW,KAAK,CAAA;AAChB,IAAA,SAAA,CAAU,EAAE,CAAA;AACZ,IAAS,QAAA,EAAA;AAAA,GAEX,EAAG,CAAC,QAAU,EAAA,KAAA,IAAA,IAAA,GAAA,MAAA,GAAA,KAAA,CAAO,WAAW,OAAQ,CAAA,IAAI,CAAC,CAAC,CAAA;AAC9C,EAAA,MAAM,QAAW,GAAA,WAAA,CAAY,CAAC,IAAA,EAAc,IAAkB,KAAA;AAC5D,IAAI,IAAA,CAAC,IAAQ,IAAA,CAAC,KAAO,EAAA;AACrB,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,UAAA,CAAW,KAAK,CAAA;AAChB,IAAA,YAAA,CAAa,sBAAQ,IAAI,CAAA;AACzB,IAAK,IAAA,CAAA,QAAA,CAAS,OAAO,IAAM,EAAA,OAAA,CAAQ,6BAAM,KAAK,CAAC,CAAE,CAAA,IAAA,CAAK,CAAK,CAAA,KAAA;AAvP/D,MAAA,IAAAA,GAAAC,EAAAA,GAAAA;AAwPM,MAAI,IAAA,CAAC,EAAE,EAAI,EAAA;AACT,QAAU,SAAA,CAAA,CAAA,CAAE,SAAS,0BAA0B,CAAA;AAC/C,QAAA;AAAA;AAEF,MAAA,WAAA,CAAY,CAAQ,IAAA,KAAA,YAAA,CAAa,IAAM,EAAA,IAAI,CAAC,CAAA;AAC5C,MAAQ,OAAA,CAAA;AAAA,QACN,IAAA;AAAA,QACA,IAAMD,EAAAA,CAAAA,GAAAA,GAAA,CAAE,CAAA,OAAA,KAAF,OAAAA,GAAa,GAAA,EAAA;AAAA,QACnB,IAAMC,EAAAA,CAAAA,GAAAA,GAAA,CAAE,CAAA,IAAA,KAAF,OAAAA,GAAU,GAAA;AAAA,UACd,IAAM,EAAA,OAAA;AAAA,UACN,OAAS,EAAA;AAAA,SACX;AAAA,QACA,KAAA,EAAO,OAAQ,CAAA,CAAA,CAAE,KAAK;AAAA,OACvB,CAAA;AACD,MAAA,SAAA,CAAU,IAAI,CAAA;AAAA,KACf,CAAA,CAAE,KAAM,CAAA,MAAM,SAAU,CAAA,0BAA0B,CAAC,CAAA,CAAE,OAAQ,CAAA,MAAM,UAAW,CAAA,KAAK,CAAC,CAAA;AAAA,KACpF,CAAC,IAAA,EAAM,KAAO,EAAA,IAAA,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAM,KAAK,CAAC,CAAA;AAG7B,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,IAAQ,IAAA,CAAC,IAAQ,IAAA,IAAA,CAAK,MAAM,MAAQ,EAAA;AACtC,MAAM,MAAA,KAAA,GAAQ,aAAc,CAAA,IAAA,CAAK,KAAK,CAAA;AACtC,MAAI,IAAA,KAAA,WAAgB,KAAK,CAAA;AAAA;AAC3B,GAEF,EAAG,CAAC,IAAI,CAAC,CAAA;AACT,EAAM,MAAA,KAAA,GAAQ,QAAO,EAAO,GAAA,MAAA,CAAA,IAAA,CAAK,IAAI,CAAhB,KAAA,IAAA,GAAA,EAAA,GAAqB,KAAK,IAAO,GAAA,EAAA;AACtD,EAAA,MAAM,KAAQ,GAAA,OAAA,CAAQ,IAAQ,IAAA,MAAA,CAAO,IAAK,CAAA,IAAI,CAAM,KAAA,MAAA,IAAa,MAAO,CAAA,IAAA,CAAK,IAAI,CAAA,KAAM,KAAK,IAAI,CAAA;AAChG,EAAA,MAAM,kBAAkB,MAAM;AAC5B,IAAI,IAAA,CAAC,MAAa,OAAA,IAAA;AAClB,IAAA,IAAA,CAAI,IAAM,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAA,KAAA,KAAS,IAAK,CAAA,KAAA,EAAc,OAAA,4CAAA;AACtC,IAAA,IAAI,MAAa,OAAA,8CAAA;AACjB,IAAA,IAAI,IAAK,CAAA,IAAA,CAAK,IAAS,KAAA,UAAA,EAAmB,OAAA,gDAAA;AAC1C,IAAO,OAAA,IAAA;AAAA,GACN,GAAA;AACH,EAAM,MAAA,IAAA,GAAO,CAAC,KAAA,GAAQ,KAAU,KAAA;AAC9B,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,KAAA,IAAS,CAAC,IAAM,EAAA;AAC9B,IAAA,SAAA,CAAU,IAAI,CAAA;AACd,IAAK,IAAA,CAAA,QAAA,CAAS,KAAO,EAAA,IAAA,CAAK,IAAM,EAAA,IAAA,CAAK,MAAM,KAAO,EAAA,KAAK,CAAE,CAAA,IAAA,CAAK,CAAK,CAAA,KAAA;AA9RvE,MAAAD,IAAAA,GAAAA;AA+RM,MAAA,IAAI,EAAE,QAAU,EAAA;AACd,QAAA,MAAM,IAAOA,GAAAA,CAAAA,GAAAA,GAAA,CAAE,CAAA,IAAA,KAAF,OAAAA,GAAU,GAAA,EAAA;AACvB,QAAM,KAAA,CAAA,KAAA,CAAM,mBAAqB,EAAA,4GAAA,EAA8G,CAAC;AAAA,UAC9I,IAAM,EAAA,aAAA;AAAA,UACN,SAAS,MAAM;AACb,YAAA,OAAA,CAAQ,iCACH,IADG,CAAA,EAAA;AAAA,cAEN,IAAM,EAAA;AAAA,aACP,CAAA,CAAA;AACD,YAAA,SAAA,CAAU,CAAQ,IAAA,KAAA;AAxS9B,cAAAA,IAAAA,GAAAA;AAySc,cAAA,MAGIC,MAAA,IAFD,EAAA;AAAA,gBA1SjB,CA0SiBD,GAAA,GAAA,IAAA,CAAK,IAAO,GAAA;AAAA,eA1S7B,GA4SkBC,GADC,EAAA,IAAA,GAAA,SAAA,CACDA,GADC,EAAA;AAAA,gBADF,SAAAD,CAAAA,GAAAA;AAAA,eAAA,CAAA;AAGH,cAAO,OAAA,IAAA;AAAA,aACR,CAAA;AACD,YAAA,UAAA,CAAW,KAAK,CAAA;AAAA;AAClB,SACC,EAAA;AAAA,UACD,IAAM,EAAA,WAAA;AAAA,UACN,KAAO,EAAA,aAAA;AAAA,UACP,OAAA,EAAS,MAAM,IAAA,CAAK,IAAI;AAAA,SACvB,EAAA;AAAA,UACD,IAAM,EAAA,QAAA;AAAA,UACN,KAAO,EAAA;AAAA,SACR,CAAC,CAAA;AACF,QAAA;AAAA;AAEF,MAAI,IAAA,CAAC,EAAE,EAAI,EAAA;AACT,QAAU,SAAA,CAAA,CAAA,CAAE,SAAS,0BAA0B,CAAA;AAC/C,QAAA;AAAA;AAEF,MAAA,OAAA,CAAQ,iCACH,IADG,CAAA,EAAA;AAAA,QAEN,IAAM,EAAA;AAAA,OACP,CAAA,CAAA;AACD,MAAA,SAAA,CAAU,CAAQ,IAAA,KAAA;AAnUxB,QAAAA,IAAAA,GAAAA;AAoUQ,QAAA,MAGIC,MAAA,IAFD,EAAA;AAAA,UArUX,CAqUWD,GAAA,GAAA,IAAA,CAAK,IAAO,GAAA;AAAA,SArUvB,GAuUYC,GADC,EAAA,IAAA,GAAA,SAAA,CACDA,GADC,EAAA;AAAA,UADF,SAAAD,CAAAA,GAAAA;AAAA,SAAA,CAAA;AAGH,QAAO,OAAA,IAAA;AAAA,OACR,CAAA;AACD,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAU,SAAA,CAAA,CAAA,CAAE,SAAY,GAAA,qBAAA,GAAwB,yCAAyC,CAAA;AAAA,KAC1F,CAAA,CAAE,KAAM,CAAA,MAAM,SAAU,CAAA,0BAA0B,CAAC,CAAA,CAAE,OAAQ,CAAA,MAAM,SAAU,CAAA,KAAK,CAAC,CAAA;AAAA,GACtF;AAGA,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAS,EAAE,CAAA;AACrC,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAGpB,IAAI,CAAA;AACd,EAAA,MAAM,WAAc,GAAA,OAAA,CAAQ,MAAM,IAAA,GAAO,eAAe,IAAK,CAAA,KAAA,EAAO,KAAK,CAAA,GAAI,EAAC,EAAG,CAAC,IAAA,EAAM,KAAK,CAAC,CAAA;AAC9F,EAAA,MAAM,YAAY,MAAM;AACtB,IAAA,IAAI,CAAC,IAAQ,IAAA,CAAC,SAAS,CAAC,cAAA,CAAe,KAAK,CAAG,EAAA;AAC/C,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAM,MAAA,QAAA,GAAmC,kCACnC,IAAO,GAAA;AAAA,MACT,CAAC,IAAA,CAAK,IAAI,GAAG,IAAK,CAAA;AAAA,KACpB,GAAI,EACD,CAAA,EAAA,MAAA,CAAA;AAEL,IAAK,IAAA,CAAA,MAAA,CAAO,OAAO,KAAO,EAAA,EAAC,6BAAM,KAAO,CAAA,EAAA,QAAQ,EAAE,IAAK,CAAA,UAAU,EAAE,KAAM,CAAA,MAAM,WAAW,IAAI,CAAC,EAAE,OAAQ,CAAA,MAAM,YAAa,CAAA,KAAK,CAAC,CAAA;AAAA,GACpI;AACA,EAAI,IAAA,CAAC,IAAQ,IAAA,CAAC,KAAO,EAAA;AACnB,IAAM,MAAA,SAAA,GAAY,QAAQ,mBAAoB,CAAA;AAAA,MAC5C,UAAA,EAAY,MAAM,MAAW,KAAA,OAAA;AAAA,MAC7B,IAAA;AAAA,MACA,OAAA,EAAS,KAAM,CAAA,OAAA,IAAW,KAAM,CAAA;AAAA,KACjC,CAAI,GAAA,MAAA;AACL,IAAA,uBAAQ,GAAA,CAAA,WAAA,EAAA,EAAY,KAAc,EAAA,KAAA,EAAc,OAAc,SAAsB,EAAA,CAAA;AAAA;AAEtF,EAAM,MAAA,QAAA,GAAW,IAAO,GAAA,aAAA,CAAc,SAAY,GAAA,WAAA,CAAY,IAAK,CAAA,KAAA,EAAO,SAAS,CAAA,GAAI,IAAK,CAAA,KAAK,CAAI,GAAA,IAAA;AACrG,EAAM,MAAA,SAAA,GAAuB,YAAY,cAAiB,GAAA,QAAA;AAC1D,EAAA,MAAM,OAAO,QAAW,GAAA,WAAA,CAAY,QAAU,EAAA,SAAS,IAAI,EAAC;AAE5D,EAAA,MAAM,YAAe,GAAA,MAAA,CAAO,MAAO,CAAA,IAAA,CAAK,MAAM,CAAA,CAAE,GAAI,CAAA,CAAA,CAAA,KAAK,CAAC,CAAA,EAAG,IAAI,CAAU,CAAC,CAAA;AAC5E,EAAM,MAAA,SAAA,GAAY,CAAC,MAAA,EAAoB,MAAoB,KAAA;AACzD,IAAA,IAAI,SAAW,EAAA;AACb,MAAA,iBAAA,CAAkB,CAAQ,IAAA,KAAA;AACxB,QAAM,MAAA,IAAA,GAAO,SAAS,KAAQ,GAAA,IAAI,IAAI,IAAK,CAAA,MAAA,CAAO,OAAK,CAAE,CAAA,IAAA,CAAK,SAAS,QAAY,IAAA,CAAA,CAAE,QAAQ,CAAE,CAAA,GAAA,CAAI,OAAK,CAAE,CAAA,IAAA,CAAK,IAAI,CAAC,CAAI,GAAA,IAAA;AACxH,QAAO,OAAA,UAAA,CAAW,IAAM,EAAA,MAAA,EAAQ,MAAM,CAAA;AAAA,OACvC,CAAA;AAAA,KACI,MAAA;AACL,MAAA,WAAA,CAAY,CAAQ,IAAA,KAAA,UAAA,CAAW,IAAM,EAAA,MAAA,EAAQ,MAAM,CAAC,CAAA;AAAA;AACtD,GACF;AACA,EAAM,MAAA,WAAA,GAAc,MAAM,SAAA,GAAY,iBAAkB,iBAAA,IAAI,GAAI,EAAC,CAAI,GAAA,WAAA,iBAAgB,IAAA,GAAA,EAAK,CAAA;AAC1F,EAAA,MAAM,yBAAU,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,OAAS,EAAA;AAAA,IAC3C,iBAAiB,KAAM,CAAA;AAAA,GACxB,CACW,EAAA,QAAA,EAAA,CAAC,OAAS,EAAA,QAAQ,EAAY,GAAI,CAAA,CAAA,KAAA,qBAAU,IAAA,CAAA,GAAA,EAAA,EAAgB,SAAS,MAAM,MAAA,CAAO,KAAK,CAAG,EAAA,iBAAA,EAAkB,UAAS,kBAAoB,EAAA;AAAA,IACjJ,UAAU,GAAQ,KAAA;AAAA,KACjB,KAAO,EAAA,CAAC,MAAO,CAAA,WAAA,EAAa,QAAQ,KAAS,IAAA;AAAA,IAC9C,iBAAiB,KAAM,CAAA;AAAA,GACxB,CAAG,EAAA,YAAA,EAAc,GACF,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,sBAAuB,EAAA,EAAA,IAAA,EAAM,KAAU,KAAA,OAAA,GAAU,sBAAsB,SAAW,EAAA,IAAA,EAAM,EAAI,EAAA,KAAA,EAAO,GAAQ,KAAA,KAAA,GAAQ,KAAM,CAAA,GAAA,GAAM,MAAM,KAAO,EAAA,CAAA;AAAA,oBAC5I,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,WAAa,EAAA;AAAA,MAC9C,KAAO,EAAA,GAAA,KAAQ,KAAQ,GAAA,KAAA,CAAM,MAAM,KAAM,CAAA;AAAA,KAC1C,CAAA,EACkB,QAAU,EAAA,KAAA,KAAA,OAAA,GAAU,UAAU,QACnC,EAAA;AAAA,GAV+C,EAAA,EAAA,KAWnD,CAAM,CACd,EAAA,CAAA;AACN,EAAA,MAAM,SAAY,GAAA,MAAA,mBAAU,GAAA,CAAA,GAAA,EAAA,EAAI,OAAS,EAAA,MAAM,SAAU,CAAA,IAAI,CAAG,EAAA,KAAA,EAAO,CAAC,MAAA,CAAO,MAAQ,EAAA;AAAA,IACrF,iBAAiB,KAAM,CAAA;AAAA,GACxB,GAAG,YAAc,EAAA,GAAA,EACR,8BAAC,IAAK,EAAA,EAAA,KAAA,EAAO,CAAC,MAAA,CAAO,UAAY,EAAA;AAAA,IACvC,OAAO,KAAM,CAAA;AAAA,GACd,CAAA,EAAI,QAAO,EAAA,MAAA,EAAA,CAAA,EACR,CAAS,GAAA,IAAA;AAGf,EAAI,IAAA,GAAA,KAAQ,WAAW,IAAM,EAAA;AAC3B,IAAI,IAAA,IAAA;AACJ,IAAI,IAAA,IAAA,CAAK,IAAK,CAAA,IAAA,KAAS,QAAU,EAAA;AAC/B,MAAO,IAAA,mBAAA,GAAA,CAAC,iBAAc,IAAK,EAAA,oBAAA,EAAqB,OAAM,sBAAuB,EAAA,IAAA,EAAK,2DAA0D,KAAc,EAAA,CAAA;AAAA,KACjJ,MAAA,IAAA,IAAA,CAAK,IAAK,CAAA,IAAA,KAAS,OAAS,EAAA;AACrC,MAAO,IAAA,mBAAA,GAAA,CAAC,aAAc,EAAA,EAAA,IAAA,EAAK,sBAAuB,EAAA,KAAA,EAAM,2BAA0B,IAAM,EAAA,IAAA,CAAK,IAAK,CAAA,OAAA,EAAS,KAAc,EAAA,CAAA;AAAA,eAChH,OAAS,EAAA;AAClB,MAAO,IAAA,mBAAA,GAAA,CAAC,aAAU,KAAO,EAAA,KAAA,EAAO,cAAc,CAAQ,IAAA,KAAA,SAAA,CAAU,CAAS,IAAA,KAAA,aAAA,CAAA,cAAA,CAAA,EAAA,EACpE,IADoE,CAAA,EAAA;AAAA,QAEvE,CAAC,IAAK,CAAA,IAAI,GAAG;AAAA,OACb,CAAA,CAAA,EAAG,SAAS,EAAA,IAAA,EAAC,gBAAe,MAAO,EAAA,WAAA,EAAa,KAAO,EAAA,UAAA,EAAY,OAAO,iBAAkB,EAAA,KAAA,EAAM,KAAO,EAAA,CAAC,OAAO,MAAQ,EAAA;AAAA,QACzH,OAAO,KAAM,CAAA,GAAA;AAAA,QACb,iBAAiB,KAAM,CAAA;AAAA,OACxB,GAAG,kBAAoB,EAAA,CAAA,KAAA,EAAQ,KAAK,IAAI,CAAA,CAAA,EAAI,QAAO,wBAAyB,EAAA,CAAA;AAAA,KACxE,MAAA;AACL,MAAO,IAAA,mBAAA,GAAA,CAAC,aAAU,IAAM,EAAA,KAAA,EAAO,MAAM,IAAK,CAAA,IAAA,EAAM,OAAc,SAAsB,EAAA,CAAA;AAAA;AAEtF,IAAA,MAAM,OAAU,GAAA,CAAC,cAAkB,IAAA,IAAA,CAAK,KAAK,IAAS,KAAA,MAAA;AACtD,IAAA,uBAAQ,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,IACf,EAAA,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,IAAK,EAAA,EAAA,KAAA,EAAO,CAAC,MAAA,CAAO,OAAS,EAAA;AAAA,QACtC,mBAAmB,KAAM,CAAA;AAAA,OAC1B,CACa,EAAA,QAAA,EAAA;AAAA,wBAAC,GAAA,CAAA,GAAA,EAAA,EAAI,SAAS,MAAM;AAC9B,UAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,UAAA,UAAA,CAAW,KAAK,CAAA;AAAA,WACf,iBAAkB,EAAA,QAAA,EAAS,oBAAmB,WAAY,EAAA,OAAA,EAAS,GAAG,YAAc,EAAA,GAAA,EACvE,QAAC,kBAAA,GAAA,CAAA,sBAAA,EAAA,EAAuB,MAAK,cAAe,EAAA,IAAA,EAAM,IAAI,KAAO,EAAA,KAAA,CAAM,KAAK,CAC5E,EAAA,CAAA;AAAA,wBACC,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,QAAU,EAAA;AAAA,UACzC,OAAO,KAAM,CAAA;AAAA,SACd,CAAG,EAAA,aAAA,EAAe,CACF,EAAA,QAAA,EAAA;AAAA,UAAK,IAAA,CAAA,IAAA;AAAA,UACL,QAAQ,SAAO,GAAA;AAAA,SACpB,EAAA,CAAA;AAAA,QACC,0BACO,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,OAAI,OAAS,EAAA,MAAM,WAAW,KAAK,CAAA,EAAG,OAAO,MAAO,CAAA,SAAA,EAAW,YAAc,EAAA,GAAA,EAAK,mBAAkB,QACjG,EAAA,QAAA,kBAAA,GAAA,CAAC,QAAK,KAAO,EAAA,CAAC,OAAO,aAAe,EAAA;AAAA,YACtD,OAAO,KAAM,CAAA;AAAA,WACd,CAAG,EAAA,QAAA,EAAA,MAAA,EAAI,CACQ,EAAA,CAAA;AAAA,0BACC,GAAA,CAAA,GAAA,EAAA,EAAI,OAAS,EAAA,MAAM,IAAK,EAAA,EAAG,QAAU,EAAA,MAAA,IAAU,CAAC,KAAA,EAAO,KAAO,EAAA,CAAC,OAAO,UAAY,EAAA;AAAA,YACnG,iBAAiB,KAAM,CAAA;AAAA,WACzB,EAAA,CAAI,CAAC,KAAA,IAAS,MAAW,KAAA,MAAA,CAAO,QAAQ,CAAA,EAAG,YAAc,EAAA,GAAA,EAAK,iBAAkB,EAAA,QAAA,EAAS,MAAO,EAAA,sBAAA,EACzE,QAAS,EAAA,MAAA,mBAAA,GAAA,CAAC,iBAAkB,EAAA,EAAA,IAAA,EAAK,OAAQ,EAAA,KAAA,EAAO,KAAM,CAAA,SAAA,EAAW,CAAK,mBAAA,GAAA,CAAC,IAAK,EAAA,EAAA,KAAA,EAAO,CAAC,MAAA,CAAO,QAAU,EAAA;AAAA,YACxH,OAAO,KAAM,CAAA;AAAA,WACd,CAAG,EAAA,QAAA,EAAA,MAAA,EAAI,CACQ,EAAA;AAAA,SACJ,EAAA,CAAA,mBAAO,IAAA,CAAA,GAAA,EAAA,EAAI,OAAS,EAAA,MAAM,WAAW,IAAI,CAAA,EAAG,QAAU,EAAA,CAAC,OAAS,EAAA,KAAA,EAAO,CAAC,MAAO,CAAA,SAAA,EAAW,CAAC,OAAA,IAAW,MAAO,CAAA,QAAQ,CAAG,EAAA,YAAA,EAAc,GAAK,EAAA,iBAAA,EAAkB,QAAS,EAAA,MAAA,EAAO,sBACzK,EAAA,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,0BAAuB,IAAK,EAAA,gBAAA,EAAiB,MAAM,EAAI,EAAA,KAAA,EAAO,MAAM,GAAK,EAAA,CAAA;AAAA,0BACzE,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,aAAe,EAAA;AAAA,YACpD,OAAO,KAAM,CAAA;AAAA,WACd,GAAG,QAAI,EAAA,MAAA,EAAA;AAAA,SACM,EAAA;AAAA,OACR,EAAA,CAAA;AAAA,MACC,iCAAkB,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,MAAQ,EAAA;AAAA,QACvD,iBAAiB,KAAM,CAAA;AAAA,OACxB,CACiB,EAAA,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,0BAAuB,IAAK,EAAA,cAAA,EAAe,MAAM,EAAI,EAAA,KAAA,EAAO,MAAM,KAAO,EAAA,CAAA;AAAA,wBACzE,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,UAAY,EAAA;AAAA,UAC/C,OAAO,KAAM,CAAA;AAAA,SACd,GAAI,QAAe,EAAA,cAAA,EAAA;AAAA,OAAA,EACR,CAAU,GAAA,IAAA;AAAA,MACb,SAAA;AAAA,MACA;AAAA,KACL,EAAA,CAAA;AAAA;AAIV,EAAA,IAAI,QAAQ,QAAU,EAAA;AACpB,IAAA,uBAAQ,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,IACd,EAAA,QAAA,EAAA;AAAA,MAAA,MAAA;AAAA,sBACA,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,SAAW,EAAA;AAAA,QACxC,aAAa,KAAM,CAAA,MAAA;AAAA,QACnB,iBAAiB,KAAM,CAAA;AAAA,OACxB,CACa,EAAA,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,0BAAuB,IAAK,EAAA,SAAA,EAAU,MAAM,EAAI,EAAA,KAAA,EAAO,MAAM,KAAO,EAAA,CAAA;AAAA,wBACrE,GAAA,CAAC,aAAU,KAAO,EAAA,KAAA,EAAO,cAAc,QAAU,EAAA,eAAA,EAAiB,SAAW,EAAA,aAAA,EAAc,QAAS,EAAA,WAAA,EAAY,mBAAkB,oBAAsB,EAAA,KAAA,CAAM,OAAO,cAAe,EAAA,MAAA,EAAO,aAAa,KAAO,EAAA,KAAA,EAAO,CAAC,MAAA,CAAO,WAAa,EAAA;AAAA,UACrP,OAAO,KAAM,CAAA;AAAA,SACd,CAAG,EAAA,MAAA,EAAO,wBAAyB,EAAA,CAAA;AAAA,QACvB,SAAA,uBAAa,iBAAkB,EAAA,EAAA,IAAA,EAAK,SAAQ,KAAO,EAAA,KAAA,CAAM,QAAQ,CAAK,GAAA;AAAA,OAC3E,EAAA,CAAA;AAAA,2BACC,UAAW,EAAA,EAAA,KAAA,EAAO,MAAO,CAAA,IAAA,EAAM,2BAA0B,SACrD,EAAA,QAAA,EAAA;AAAA,QAAA,WAAA,CAAY,yBAAU,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,YAAc,EAAA;AAAA,UACnE,OAAO,KAAM,CAAA;AAAA,SACd,CAAG,EAAA,QAAA,EAAA,OAAA,EAAK,CAAU,GAAA,IAAA;AAAA,QACN,YAAY,GAAI,CAAA,CAAA,IAAA,qBAAS,IAAA,CAAA,GAAA,EAAA,EAAyB,SAAS,MAAM;AAC5E,UAAA,MAAA,CAAO,OAAO,CAAA;AACd,UAAA,QAAA,CAAS,IAAI,CAAA;AAAA,SACZ,EAAA,KAAA,EAAO,MAAO,CAAA,SAAA,EAAW,cAAc,GACtB,EAAA,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,0BAAuB,IAAK,EAAA,uBAAA,EAAwB,MAAM,EAAI,EAAA,KAAA,EAAO,MAAM,KAAO,EAAA,CAAA;AAAA,0BAClF,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,UAAY,EAAA;AAAA,YACjD,OAAO,KAAM,CAAA;AAAA,WACd,CAAA,EAAG,aAAe,EAAA,CAAA,EACI,QACL,EAAA,IAAA,EAAA;AAAA,SAT2B,EAAA,EAAA,CAAA,KAAA,EAAQ,IAAI,CAAA,CAU3C,CAAM,CAAA;AAAA,QACT,0BAAW,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,YAAc,EAAA;AAAA,UACxD,OAAO,KAAM,CAAA;AAAA,SACd,GACoB,QAAQ,EAAA,OAAA,CAAA,MAAA,CAAO,QAAQ,CAAG,EAAA,OAAA,CAAQ,MAAO,CAAA,KAAK,CAAG,EAAA,OAAA,CAAQ,OAAO,SAAY,GAAA,GAAA,GAAM,EAAE,CAAA,QAAA,EAAW,OAAQ,CAAA,MAAA,KAAW,eAAe,oBAAuB,GAAA,EAAE,CAAK,CAAA,GAAA,YAAA,EACpK,CAAU,GAAA,IAAA;AAAA,QACb,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,OAAO,KAAM,CAAA,GAAA,CAAI,0BAAS,IAAA,CAAA,IAAA,EAAA,EAA8B,KAAO,EAAA,MAAA,CAAO,QACxE,EAAA,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,IAAK,EAAA,EAAA,KAAA,EAAO,CAAC,MAAA,CAAO,UAAY,EAAA;AAAA,YACjD,OAAO,KAAM,CAAA;AAAA,WACd,CAAA,EAAG,aAAe,EAAA,CAAA,EACI,eAAK,IACV,EAAA,CAAA;AAAA,UACC,KAAK,OAAQ,CAAA,GAAA,CAAI,uBAAM,IAAA,CAAA,GAAA,EAAA,EAAmC,SAAS,MAAM;AAC1F,YAAA,MAAA,CAAO,OAAO,CAAA;AACd,YAAS,QAAA,CAAA,IAAA,CAAK,IAAM,EAAA,CAAA,CAAE,IAAI,CAAA;AAAA,WACzB,EAAA,KAAA,EAAO,MAAO,CAAA,MAAA,EAAQ,cAAc,GACb,EAAA,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,IAAK,EAAA,EAAA,KAAA,EAAO,CAAC,MAAA,CAAO,OAAS,EAAA;AAAA,cACpD,OAAO,KAAM,CAAA;AAAA,aACd,CAAI,EAAA,QAAA,EAAA,CAAA,CAAE,IAAK,EAAA,CAAA;AAAA,4BACa,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,OAAS,EAAA;AAAA,cACpD,OAAO,KAAM,CAAA;AAAA,aACd,CAAG,EAAA,aAAA,EAAe,GACU,QAAE,EAAA,CAAA,CAAA,MAAA,CAAO,yBACD,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,cAAE,CAAA,CAAA,IAAA,CAAK,MAAM,CAAG,EAAA,CAAA,CAAE,OAAO,CAAC,CAAA,CAAE,CAAC,CAAC,CAAA;AAAA,8BAC/B,GAAA,CAAC,QAAK,KAAO,EAAA;AAAA,gBAC3C,iBAAiB,KAAM,CAAA,UAAA;AAAA,gBACvB,OAAO,KAAM,CAAA;AAAA,iBAEsB,QAAE,EAAA,CAAA,CAAA,IAAA,CAAK,KAAM,CAAA,CAAA,CAAE,OAAO,CAAC,CAAA,CAAE,CAAC,CAAA,EAAG,EAAE,MAAO,CAAA,CAAC,CAAE,CAAA,CAAC,CAAC,CAChD,EAAA,CAAA;AAAA,cACC,CAAA,CAAE,KAAK,KAAM,CAAA,CAAA,CAAE,OAAO,CAAC,CAAA,CAAE,CAAC,CAAC;AAAA,aAChC,EAAA,CAAA,GAAM,EAAE,IAChB,EAAA;AAAA,WAAA,EAAA,EApByB,GAAG,IAAK,CAAA,IAAI,IAAI,CAAE,CAAA,IAAI,EAqBnD,CAAM;AAAA,SA3B4B,EAAA,EAAA,CAAA,IAAA,EAAO,IAAK,CAAA,IAAI,CA4B1D,CAAA,CAAA,CAAA;AAAA,QACH,CAAC,OAAW,IAAA,CAAC,WAAY,CAAA,MAAA,uBAAU,IAAK,EAAA,EAAA,KAAA,EAAO,CAAC,MAAA,CAAO,UAAY,EAAA;AAAA,UAC9E,OAAO,KAAM,CAAA;AAAA,SACd,CAAG,EAAA,QAAA,EAAA,yEAAA,EAEY,CAAU,GAAA;AAAA,OAClB,EAAA;AAAA,KACJ,EAAA,CAAA;AAAA;AAIV,EAAA,uBAAQ,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,IAChB,EAAA,QAAA,EAAA;AAAA,IAAA,MAAA;AAAA,IAAA,CACA,6BAAM,KAAQ,oBAAA,IAAA,CAAC,QAAK,KAAO,EAAA,CAAC,OAAO,MAAQ,EAAA;AAAA,MAClD,iBAAiB,KAAM,CAAA;AAAA,KACxB,CACe,EAAA,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,0BAAuB,IAAK,EAAA,iBAAA,EAAkB,MAAM,EAAI,EAAA,KAAA,EAAO,MAAM,KAAO,EAAA,CAAA;AAAA,sBAC5E,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,UAAY,EAAA;AAAA,QAC7C,OAAO,KAAM,CAAA;AAAA,OACd,GAAG,QAEU,EAAA,4CAAA,EAAA;AAAA,KAAA,EACJ,CAAU,GAAA,IAAA;AAAA,IACb,SAAA;AAAA,IACA,WAAe,IAAA,CAAC,IAAO,mBAAA,GAAA,CAAC,QAAK,KAAO,EAAA,MAAA,CAAO,MACpC,EAAA,QAAA,kBAAA,GAAA,CAAC,iBAAkB,EAAA,EAAA,KAAA,EAAO,KAAM,CAAA,MAAA,EAAQ,GAC5C,CAAU,GAAA,IAAA;AAAA,IACb,SAAA,IAAa,CAAC,IAAQ,IAAA,CAAC,4BAAa,GAAA,CAAA,aAAA,EAAA,EAAc,IAAM,EAAA,MAAA,GAAS,aAAgB,GAAA,sBAAA,EAAwB,OAAO,MAAS,GAAA,oBAAA,GAAuB,2BAA2B,IAAM,EAAA,SAAA,EAAW,OAAc,IAAM,EAAA,MAAA,EAAQ,OAAS,EAAA,MAAA,IAAU,MAAS,GAAA;AAAA,MAC3P,KAAA,EAAO,SAAS,uBAAqB,GAAA,eAAA;AAAA,MACrC,SAAS,MAAM;AACb,QAAA,SAAA,CAAU,IAAI,CAAA;AACd,QAAQ,OAAA,CAAA,OAAA,CAAQ,QAAQ,CAAA,CAAE,MAAM,MAAM,MAAS,CAAE,CAAA,OAAA,CAAQ,MAAM;AAC7D,UAAA,SAAA,CAAU,KAAK,CAAA;AACf,UAAS,QAAA,EAAA;AAAA,SACV,CAAA;AAAA;AACH,KACE,GAAA;AAAA,MACF,KAAO,EAAA,WAAA;AAAA,MACP,OAAS,EAAA;AAAA,KACX,EAAG,SAAW,EAAA,MAAA,IAAU,MAAS,GAAA;AAAA,MAC/B,KAAO,EAAA,WAAA;AAAA,MACP,OAAS,EAAA;AAAA,KACX,GAAI,QAAW,CAAK,GAAA,IAAA;AAAA,IAEX,SAAA,IAAa,CAAC,IAAQ,IAAA,SAAA,uBAAa,WAAY,EAAA,EAAA,KAAA,EAAc,KAAc,EAAA,KAAA,EAAc,CAAK,GAAA,IAAA;AAAA,IAC9F,uBAAQ,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,OAAS,EAAA;AAAA,MAC5C,mBAAmB,KAAM,CAAA;AAAA,KAC1B,CACe,EAAA,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,IAAK,EAAA,EAAA,KAAA,EAAO,CAAC,MAAA,CAAO,UAAY,EAAA;AAAA,QAC7C,iBAAiB,KAAM,CAAA;AAAA,OACxB,CACiB,EAAA,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,0BAAuB,IAAK,EAAA,gBAAA,EAAiB,MAAM,EAAI,EAAA,KAAA,EAAO,MAAM,KAAO,EAAA,CAAA;AAAA,4BAC3E,SAAU,EAAA,EAAA,KAAA,EAAO,WAAW,YAAc,EAAA,YAAA,EAAc,aAAY,cAAe,EAAA,oBAAA,EAAsB,KAAM,CAAA,KAAA,EAAO,gBAAe,MAAO,EAAA,WAAA,EAAa,OAAO,KAAO,EAAA,CAAC,OAAO,eAAiB,EAAA;AAAA,UAC/M,OAAO,KAAM,CAAA;AAAA,SACd,CAAA,EAAG,kBAAmB,EAAA,sBAAA,EAAuB,QAAO,6BAA8B,EAAA,CAAA;AAAA,QAClE,SAAA,mBAAa,GAAA,CAAA,GAAA,EAAA,EAAI,OAAS,EAAA,MAAM,YAAa,CAAA,EAAE,CAAG,EAAA,iBAAA,EAAkB,QAAS,EAAA,kBAAA,EAAmB,kBAAmB,EAAA,OAAA,EAAS,GAAG,YAAc,EAAA,GAAA,EACtI,QAAC,kBAAA,GAAA,CAAA,sBAAA,EAAA,EAAuB,IAAK,EAAA,cAAA,EAAe,IAAM,EAAA,EAAA,EAAI,KAAO,EAAA,KAAA,CAAM,KAAO,EAAA,CAAA,EAC9E,CAAS,GAAA;AAAA,OACjB,EAAA,CAAA;AAAA,0BACC,GAAI,EAAA,EAAA,OAAA,EAAS,aAAa,QAAU,EAAA,CAAC,KAAK,IAAK,CAAA,CAAA,CAAA,KAAK,EAAE,QAAQ,CAAA,EAAG,mBAAkB,QAAS,EAAA,kBAAA,EAAmB,wBAAuB,KAAO,EAAA,CAAC,OAAO,WAAa,EAAA,CAAC,KAAK,IAAK,CAAA,CAAA,CAAA,KAAK,EAAE,QAAQ,CAAA,IAAK,OAAO,QAAQ,CAAA,EAAG,cAAc,GAAK,EAAA,MAAA,EAAO,gCAC1O,QAAC,kBAAA,GAAA,CAAA,sBAAA,EAAA,EAAuB,MAAK,sBAAuB,EAAA,IAAA,EAAM,IAAI,KAAO,EAAA,KAAA,CAAM,KAAK,CACpF,EAAA;AAAA,KAAA,EACJ,CAAU,GAAA,IAAA;AAAA,IACb,IAAO,mBAAA,GAAA,CAAC,QAAS,EAAA,EAAA,IAAA,EAAM,IAAM,EAAA,YAAA,EAAc,CAAO,GAAA,KAAA,CAAA,EAAG,GAAI,CAAA,IAAA,CAAK,IAAI,CAAA,CAAA,EAAI,GAAI,CAAA,IAAA,CAAK,IAAI,CAAA,CAAA,EAAI,UAAY,EAAA,WAAA,EAAa,SAAW,EAAA,QAAA,EAAU,yBAA0B,EAAA,SAAA,EAAU,kBAAoB,EAAA,SAAA,mBAAa,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,UAAY,EAAA;AAAA,MACjP,OAAO,KAAM,CAAA;AAAA,KACd,CAAG,EAAA,QAAA,EAAA;AAAA,MAAA,6BAAA;AAAA,MAC+C,UAAU,IAAK,EAAA;AAAA,MAAE;AAAA,KAC5C,EAAA,CAAA,GAAU,IAAM,EAAA,mBAAA,EAAqB,IAAK,CAAA,OAAA,wBAAW,IAAK,EAAA,EAAA,KAAA,EAAO,CAAC,MAAA,CAAO,UAAY,EAAA;AAAA,MAC3G,OAAO,KAAM,CAAA;AAAA,KACd,CAAG,EAAA,QAAA,EAAA;AAAA,MAAA,oBAAA;AAAA,MAC2C,KAAK,KAAM,CAAA,MAAA;AAAA,MAAO;AAAA,KACzC,EAAA,CAAA,GAAU,IAAM,EAAA,UAAA,EAAY,CAAC;AAAA,MACnD;AAAA,KACI,KAAA;AACJ,MAAM,MAAA;AAAA,QACJ;AAAA,OACE,GAAA,IAAA;AACJ,MAAM,MAAA,KAAA,GAAQ,KAAK,IAAS,KAAA,QAAA;AAC5B,MAAA,IAAI,QAA+E,GAAA,uBAAA;AACnF,MAAA,IAAI,KAAO,EAAA,QAAA,GAAW,IAAK,CAAA,QAAA,GAAW,qBAAwB,GAAA,gBAAA;AAC9D,MAAA,MAAM,MAAS,GAAA,CAAC,KAAS,IAAA,CAAA,IAAA,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAM,UAAS,IAAK,CAAA,IAAA;AAE7C,MAAA,MAAM,OAAU,GAAA,KAAA,GAAQ,CAAC,IAAA,CAAK,QAAY,IAAA,YAAA,CAAa,GAAI,CAAA,IAAA,CAAK,IAAI,CAAA,GAAI,MAAO,CAAA,IAAA,CAAK,IAAI,CAAM,KAAA,MAAA;AAC9F,MAAM,MAAA,GAAA,GAAM,CAAC,KAAS,IAAA,SAAA,GAAY,UAAU,IAAK,CAAA,IAAA,EAAM,SAAS,CAAI,GAAA,IAAA;AACpE,MAAO,uBAAA,IAAA,CAAC,GAAI,EAAA,EAAA,OAAA,EAAS,MAAM;AACzB,QAAA,IAAI,KAAK,IAAS,KAAA,QAAA,YAAoB,IAAM,EAAA,CAAC,KAAK,QAAQ,CAAA;AAAA,aAAO,QAAA,CAAS,KAAK,IAAI,CAAA;AAAA,OAClF,EAAA,KAAA,EAAO,CAAC,MAAA,CAAO,OAAS,EAAA;AAAA,QACzB,WAAa,EAAA,EAAA,GAAA,CAAM,IAAK,CAAA,KAAA,GAAQ,CAAK,IAAA;AAAA,SACpC,MAAU,IAAA;AAAA,QACX,iBAAiB,KAAM,CAAA;AAAA,OACxB,CAAG,EAAA,YAAA,EAAc,KAAK,iBAAkB,EAAA,QAAA,EAAS,oBAAoB,KAAQ,GAAA;AAAA,QAC5E,UAAU,IAAK,CAAA;AAAA,OACb,GAAA;AAAA,QACF,QAAU,EAAA;AAAA,SACT,kBAAoB,EAAA,KAAA,GAAQ,UAAU,IAAK,CAAA,IAAI,GAAG,OAAU,GAAA,uBAAA,GAA0B,EAAE,CAAA,CAAA,GAAK,QAAQ,IAAK,CAAA,IAAI,GAAG,OAAU,GAAA,WAAA,GAAc,EAAE,CACnH,CAAA,EAAA,QAAA,EAAA;AAAA,QAAA,KAAA,uBAAS,sBAAuB,EAAA,EAAA,IAAA,EAAM,IAAK,CAAA,QAAA,GAAW,iBAAiB,eAAiB,EAAA,IAAA,EAAM,EAAI,EAAA,KAAA,EAAO,MAAM,KAAO,EAAA,CAAA,uBAAM,IAAK,EAAA,EAAA,KAAA,EAAO,OAAO,YAAc,EAAA,CAAA;AAAA,wBAC9J,GAAA,CAAC,sBAAuB,EAAA,EAAA,IAAA,EAAM,QAAU,EAAA,IAAA,EAAM,EAAI,EAAA,KAAA,EAAO,KAAQ,GAAA,KAAA,CAAM,MAAS,GAAA,KAAA,CAAM,KAAO,EAAA,CAAA;AAAA,wBAC5F,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,QAAU,EAAA;AAAA,UACrD,OAAO,KAAM,CAAA;AAAA,SACf,EAAG,SAAS,MAAO,CAAA,OAAO,GAAG,aAAe,EAAA,CAAA,EACf,gCACQ,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,UAAA,IAAA,CAAK,IAAK,CAAA,KAAA,CAAM,CAAG,EAAA,GAAA,CAAI,KAAK,CAAA;AAAA,0BAC7B,GAAA,CAAC,QAAK,KAAO,EAAA;AAAA,YAC3C,iBAAiB,KAAM,CAAA,UAAA;AAAA,YACvB,OAAO,KAAM,CAAA;AAAA,WACf,EACqC,eAAK,IAAK,CAAA,KAAA,CAAM,IAAI,KAAO,EAAA,GAAA,CAAI,GAAG,CACvC,EAAA,CAAA;AAAA,UACC,IAAK,CAAA,IAAA,CAAK,KAAM,CAAA,GAAA,CAAI,GAAG;AAAA,SAC5B,EAAA,CAAA,GAAM,KAAK,IACnB,EAAA,CAAA;AAAA,QACC,0BAAW,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,QAAU,EAAA;AAAA,UAChE,iBAAiB,KAAM,CAAA;AAAA,SACxB,GAAG,CAAK,GAAA;AAAA,OACW,EAAA,CAAA;AAAA,OACrB,CAAK,GAAA,IAAA;AAAA,IACC,0BAAW,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,OAAS,EAAA;AAAA,MAC/C,iBAAiB,KAAM,CAAA;AAAA,KACxB,CACe,EAAA,QAAA,kBAAA,GAAA,CAAC,iBAAkB,EAAA,EAAA,IAAA,EAAK,SAAQ,KAAO,EAAA,KAAA,CAAM,MAAQ,EAAA,CAAA,EACzD,CAAU,GAAA;AAAA,GAClB,EAAA,CAAA;AACR;AACA,MAAM,MAAA,GAAS,WAAW,MAAO,CAAA;AAAA,EAC/B,IAAM,EAAA;AAAA,IACJ,IAAM,EAAA;AAAA,GACR;AAAA,EACA,OAAS,EAAA;AAAA,IACP,aAAe,EAAA,KAAA;AAAA,IACf,UAAY,EAAA,QAAA;AAAA,IACZ,GAAK,EAAA,CAAA;AAAA,IACL,iBAAmB,EAAA,EAAA;AAAA,IACnB,aAAe,EAAA,CAAA;AAAA,IACf,mBAAmB,UAAW,CAAA;AAAA,GAChC;AAAA,EACA,UAAY,EAAA;AAAA,IACV,IAAM,EAAA,CAAA;AAAA,IACN,aAAe,EAAA,KAAA;AAAA,IACf,UAAY,EAAA,QAAA;AAAA,IACZ,GAAK,EAAA,CAAA;AAAA,IACL,YAAc,EAAA,EAAA;AAAA,IACd,iBAAmB,EAAA;AAAA,GACrB;AAAA,EACA,eAAiB,EAAA;AAAA,IACf,IAAM,EAAA,CAAA;AAAA,IACN,QAAU,EAAA,EAAA;AAAA,IACV,eAAiB,EAAA,QAAA,CAAS,EAAO,KAAA,KAAA,GAAQ,CAAI,GAAA;AAAA,GAC/C;AAAA,EACA,WAAa,EAAA;AAAA,IACX,KAAO,EAAA,EAAA;AAAA,IACP,MAAQ,EAAA,EAAA;AAAA,IACR,UAAY,EAAA,QAAA;AAAA,IACZ,cAAgB,EAAA;AAAA,GAClB;AAAA,EACA,YAAc,EAAA;AAAA,IACZ,KAAO,EAAA;AAAA,GACT;AAAA,EACA,MAAQ,EAAA;AAAA,IACN,OAAS,EAAA,EAAA;AAAA,IACT,UAAY,EAAA;AAAA,GACd;AAAA,EACA,OAAS,EAAA;AAAA,IACP,QAAU,EAAA;AAAA,GACZ;AAAA,EACA,OAAS,EAAA;AAAA,IACP,aAAe,EAAA,KAAA;AAAA,IACf,MAAQ,EAAA,WAAA;AAAA,IACR,UAAY,EAAA;AAAA,GACd;AAAA,EACA,MAAQ,EAAA;AAAA,IACN,UAAY,EAAA,IAAA;AAAA,IACZ,QAAU,EAAA,EAAA;AAAA,IACV,SAAW,EAAA,OAAA;AAAA,IACX,YAAc,EAAA;AAAA,GAChB;AAAA,EACA,QAAU,EAAA;AAAA,IACR,UAAY,EAAA,IAAA;AAAA,IACZ,QAAU,EAAA,IAAA;AAAA,IACV,YAAc,EAAA;AAAA,GAChB;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,QAAU,EAAA,CAAA;AAAA,IACV,iBAAmB,EAAA,EAAA;AAAA,IACnB,eAAiB,EAAA;AAAA,GACnB;AAAA,EACA,GAAK,EAAA;AAAA,IACH,iBAAmB,EAAA,EAAA;AAAA,IACnB,eAAiB,EAAA,CAAA;AAAA,IACjB,YAAc,EAAA,GAAA;AAAA,IACd,aAAa,UAAW,CAAA,aAAA;AAAA,IACxB,WAAa,EAAA;AAAA,GACf;AAAA,EACA,OAAS,EAAA;AAAA,IACP,QAAU,EAAA,EAAA;AAAA,IACV,UAAY,EAAA,KAAA;AAAA,IACZ,QAAU,EAAA;AAAA,GACZ;AAAA,EACA,OAAS,EAAA;AAAA,IACP,aAAe,EAAA,KAAA;AAAA,IACf,MAAQ,EAAA,EAAA;AAAA,IACR,YAAc,EAAA,EAAA;AAAA,IACd,OAAS,EAAA;AAAA,GACX;AAAA,EACA,WAAa,EAAA;AAAA,IACX,IAAM,EAAA,CAAA;AAAA,IACN,aAAe,EAAA,KAAA;AAAA,IACf,UAAY,EAAA,QAAA;AAAA,IACZ,cAAgB,EAAA,QAAA;AAAA,IAChB,GAAK,EAAA,CAAA;AAAA,IACL,eAAiB,EAAA,CAAA;AAAA,IACjB,YAAc,EAAA;AAAA,GAChB;AAAA,EACA,WAAa,EAAA;AAAA,IACX,QAAU,EAAA,EAAA;AAAA,IACV,UAAY,EAAA;AAAA,GACd;AAAA,EACA,MAAQ,EAAA;AAAA,IACN,aAAe,EAAA,KAAA;AAAA,IACf,UAAY,EAAA,QAAA;AAAA,IACZ,GAAK,EAAA,CAAA;AAAA,IACL,gBAAkB,EAAA,EAAA;AAAA,IAClB,YAAc,EAAA,CAAA;AAAA,IACd,OAAS,EAAA,EAAA;AAAA,IACT,YAAc,EAAA;AAAA,GAChB;AAAA,EACA,UAAY,EAAA;AAAA,IACV,QAAU,EAAA,EAAA;AAAA,IACV,IAAM,EAAA;AAAA,GACR;AAAA,EACA,MAAQ,EAAA;AAAA,IACN,gBAAkB,EAAA,EAAA;AAAA,IAClB,YAAc,EAAA,CAAA;AAAA,IACd,OAAS,EAAA,EAAA;AAAA,IACT,YAAc,EAAA;AAAA,GAChB;AAAA,EACA,UAAY,EAAA;AAAA,IACV,QAAU,EAAA;AAAA,GACZ;AAAA,EACA,OAAS,EAAA;AAAA,IACP,aAAe,EAAA,KAAA;AAAA,IACf,UAAY,EAAA,QAAA;AAAA,IACZ,GAAK,EAAA,CAAA;AAAA,IACL,eAAiB,EAAA,EAAA;AAAA,IACjB,YAAc,EAAA;AAAA,GAChB;AAAA,EACA,QAAU,EAAA;AAAA,IACR,QAAU,EAAA,EAAA;AAAA,IACV,IAAM,EAAA;AAAA,GACR;AAAA,EACA,OAAS,EAAA;AAAA,IACP,UAAY,EAAA;AAAA,GACd;AAAA,EACA,QAAU,EAAA;AAAA,IACR,KAAO,EAAA,CAAA;AAAA,IACP,MAAQ,EAAA,CAAA;AAAA,IACR,YAAc,EAAA;AAAA,GAChB;AAAA,EACA,OAAS,EAAA;AAAA,IACP,aAAe,EAAA,KAAA;AAAA,IACf,UAAY,EAAA,QAAA;AAAA,IACZ,GAAK,EAAA,CAAA;AAAA,IACL,iBAAmB,EAAA,EAAA;AAAA,IACnB,eAAiB,EAAA,EAAA;AAAA,IACjB,mBAAmB,UAAW,CAAA;AAAA,GAChC;AAAA,EACA,QAAU,EAAA;AAAA,IACR,IAAM,EAAA,CAAA;AAAA,IACN,UAAY,EAAA,IAAA;AAAA,IACZ,QAAU,EAAA;AAAA,GACZ;AAAA,EACA,SAAW,EAAA;AAAA,IACT,aAAe,EAAA,KAAA;AAAA,IACf,UAAY,EAAA,QAAA;AAAA,IACZ,GAAK,EAAA,CAAA;AAAA,IACL,iBAAmB,EAAA,CAAA;AAAA,IACnB,eAAiB,EAAA;AAAA,GACnB;AAAA,EACA,aAAe,EAAA;AAAA,IACb,QAAU,EAAA,EAAA;AAAA,IACV,UAAY,EAAA;AAAA,GACd;AAAA,EACA,UAAY,EAAA;AAAA,IACV,iBAAmB,EAAA,EAAA;AAAA,IACnB,eAAiB,EAAA,CAAA;AAAA,IACjB,YAAc,EAAA,EAAA;AAAA,IACd,QAAU,EAAA,EAAA;AAAA,IACV,UAAY,EAAA;AAAA,GACd;AAAA,EACA,QAAU,EAAA;AAAA,IACR,QAAU,EAAA,EAAA;AAAA,IACV,UAAY,EAAA;AAAA,GACd;AAAA,EACA,QAAU,EAAA;AAAA,IACR,OAAS,EAAA;AAAA,GACX;AAAA,EACA,MAAQ,EAAA;AAAA,IACN,IAAM,EAAA,CAAA;AAAA,IACN,UAAY,EAAA,IAAA;AAAA,IACZ,QAAU,EAAA,EAAA;AAAA,IACV,OAAS,EAAA,EAAA;AAAA,IACT,UAAY,EAAA;AAAA,GACd;AAAA,EACA,SAAW,EAAA;AAAA,IACT,aAAe,EAAA,KAAA;AAAA,IACf,UAAY,EAAA,QAAA;AAAA,IACZ,GAAK,EAAA,CAAA;AAAA,IACL,gBAAkB,EAAA,EAAA;AAAA,IAClB,YAAc,EAAA,CAAA;AAAA,IACd,iBAAmB,EAAA,EAAA;AAAA,IACnB,YAAc,EAAA,EAAA;AAAA,IACd,aAAa,UAAW,CAAA,aAAA;AAAA,IACxB,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,WAAa,EAAA;AAAA,IACX,IAAM,EAAA,CAAA;AAAA,IACN,QAAU,EAAA;AAAA,GACZ;AAAA,EACA,YAAc,EAAA;AAAA,IACZ,QAAU,EAAA,EAAA;AAAA,IACV,UAAY,EAAA,KAAA;AAAA,IACZ,aAAe,EAAA,WAAA;AAAA,IACf,gBAAkB,EAAA,EAAA;AAAA,IAClB,SAAW,EAAA,EAAA;AAAA,IACX,YAAc,EAAA;AAAA,GAChB;AAAA,EACA,SAAW,EAAA;AAAA,IACT,aAAe,EAAA,KAAA;AAAA,IACf,UAAY,EAAA,QAAA;AAAA,IACZ,GAAK,EAAA,CAAA;AAAA,IACL,iBAAmB,EAAA,EAAA;AAAA,IACnB,eAAiB,EAAA;AAAA,GACnB;AAAA,EACA,UAAY,EAAA;AAAA,IACV,UAAY,EAAA,IAAA;AAAA,IACZ,QAAU,EAAA,EAAA;AAAA,IACV,UAAY,EAAA;AAAA,GACd;AAAA,EACA,QAAU,EAAA;AAAA,IACR,iBAAmB,EAAA,EAAA;AAAA,IACnB,eAAiB,EAAA,CAAA;AAAA,IACjB,GAAK,EAAA;AAAA,GACP;AAAA,EACA,MAAQ,EAAA;AAAA,IACN,aAAe,EAAA,KAAA;AAAA,IACf,GAAK,EAAA,EAAA;AAAA,IACL,eAAiB,EAAA;AAAA,GACnB;AAAA,EACA,OAAS,EAAA;AAAA,IACP,UAAY,EAAA,IAAA;AAAA,IACZ,QAAU,EAAA,EAAA;AAAA,IACV,QAAU,EAAA,EAAA;AAAA,IACV,SAAW,EAAA;AAAA,GACb;AAAA,EACA,OAAS,EAAA;AAAA,IACP,UAAY,EAAA,IAAA;AAAA,IACZ,QAAU,EAAA,IAAA;AAAA,IACV,IAAM,EAAA;AAAA,GACR;AAAA,EACA,UAAY,EAAA;AAAA,IACV,QAAU,EAAA,EAAA;AAAA,IACV,SAAW,EAAA,QAAA;AAAA,IACX,OAAS,EAAA;AAAA,GACX;AAAA,EACA,OAAS,EAAA;AAAA,IACP,QAAU,EAAA,UAAA;AAAA,IACV,GAAK,EAAA,EAAA;AAAA,IACL,SAAW,EAAA,QAAA;AAAA,IACX,OAAS,EAAA,EAAA;AAAA,IACT,YAAc,EAAA;AAAA;AAElB,CAAC,CAAA"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {jsxs,jsx}from'react/jsx-runtime';import {forwardRef}from'react';import {View,StyleSheet,TextInput,Text,ScrollView}from'react-native';import {MaterialCommunityIcons}from'@expo/vector-icons';import {Tap,DIM}from'../../inbox/components/Tap.js';import {hostLabel}from'../studioCatalog.js';function Tool({
|
|
1
|
+
import {jsxs,jsx}from'react/jsx-runtime';import {forwardRef}from'react';import {View,StyleSheet,TextInput,Text,ScrollView}from'react-native';import {MaterialCommunityIcons}from'@expo/vector-icons';import {Tap,DIM}from'../../inbox/components/Tap.js';import {hostLabel}from'../studioCatalog.js';import {templateName}from'../templateCatalog.js';function Tool({
|
|
2
2
|
icon,
|
|
3
3
|
label,
|
|
4
4
|
value,
|
|
@@ -79,7 +79,7 @@ const Composer = forwardRef(function Composer2({
|
|
|
79
79
|
borderTopColor: theme.border
|
|
80
80
|
}], children: [
|
|
81
81
|
/* @__PURE__ */ jsxs(ScrollView, { horizontal: true, showsHorizontalScrollIndicator: false, keyboardShouldPersistTaps: "handled", style: styles.tools, contentContainerStyle: styles.toolsContent, children: [
|
|
82
|
-
/* @__PURE__ */ jsx(Tool, { icon: "view-grid-plus-outline", label: "Template", value: template
|
|
82
|
+
/* @__PURE__ */ jsx(Tool, { icon: "view-grid-plus-outline", label: "Template", value: template ? templateName(template) : void 0, onPress: onTemplate, onClear: onClearTemplate, theme, testID: "webbuilder-composer-template" }),
|
|
83
83
|
/* @__PURE__ */ jsx(Tool, { icon: "web", label: "Look like", value: lookOpen ? null : lookHost, onPress: () => onLookOpen(true), onClear: () => onLookUrl(""), theme, testID: "webbuilder-composer-look" }),
|
|
84
84
|
/* @__PURE__ */ jsx(Tool, { icon: "palette-outline", label: "Brand kit", value: brand ? brand.name || "Brand" : null, onPress: onBrand, theme, leading: (brand == null ? void 0 : brand.colors.length) ? /* @__PURE__ */ jsx(View, { style: styles.dots, children: brand.colors.slice(0, 3).map((c) => /* @__PURE__ */ jsx(View, { style: [styles.dot, {
|
|
85
85
|
backgroundColor: c,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Composer.js","sources":["../../../../src/features/webbuilder/components/Composer.tsx"],"sourcesContent":["/**\n * The prompt box - what to build, and in one toolbar row the three ways the web\n * studio lets you shape it: a starter template, a site to look like, the brand\n * kit. A tool shows as a small icon until it is set, then as a chip naming the\n * choice, with a way to remove it. Send is the only filled control; while the\n * builder is still connecting it rests disabled and the box says so.\n */\nimport React, { forwardRef } from 'react';\nimport { ScrollView, StyleSheet, Text, TextInput, View } from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { DIM, Tap } from '../../inbox/components/Tap';\nimport { hostLabel, type BrandKit } from '../studioCatalog';\nimport type { WebBuilderTemplate } from '../workflow';\nimport type { WebBuilderTheme } from '../webbuilderTheme';\nimport type { IconName } from './ui';\n\nfunction Tool({\n icon,\n label,\n value,\n onPress,\n onClear,\n theme,\n leading,\n testID,\n}: {\n icon: IconName;\n /** What the tool does, for screen readers. */\n label: string;\n /** The choice once made (a template name, a host, a brand); unset when empty. */\n value?: string | null;\n onPress: () => void;\n onClear?: () => void;\n theme: WebBuilderTheme;\n leading?: React.ReactNode;\n testID?: string;\n}) {\n if (!value) {\n return (\n <Tap\n onPress={onPress}\n accessibilityRole=\"button\"\n accessibilityLabel={label}\n hitSlop={4}\n style={[styles.toolIcon, { borderColor: theme.border }]}\n pressedStyle={DIM}\n testID={testID}\n >\n <MaterialCommunityIcons name={icon} size={19} color={theme.muted} />\n </Tap>\n );\n }\n return (\n <View style={[styles.toolChip, { backgroundColor: theme.accentSoft, borderColor: theme.accentBorder }]}>\n <Tap\n onPress={onPress}\n accessibilityRole=\"button\"\n accessibilityLabel={`${label}: ${value}`}\n style={styles.toolChipMain}\n pressedStyle={DIM}\n testID={testID}\n >\n {leading ?? <MaterialCommunityIcons name={icon} size={16} color={theme.accent} />}\n <Text style={[styles.toolChipLabel, { color: theme.accent }]} numberOfLines={1}>\n {value}\n </Text>\n </Tap>\n {onClear ? (\n <Tap\n onPress={onClear}\n accessibilityRole=\"button\"\n accessibilityLabel={`Remove ${label.toLowerCase()}`}\n hitSlop={8}\n style={styles.toolChipClear}\n pressedStyle={DIM}\n >\n <MaterialCommunityIcons name=\"close-circle\" size={16} color={theme.accent} />\n </Tap>\n ) : (\n <View style={styles.toolChipEnd} />\n )}\n </View>\n );\n}\n\nexport interface ComposerProps {\n value: string;\n onChangeText: (text: string) => void;\n onSubmit: () => void;\n template: WebBuilderTemplate | null;\n onTemplate: () => void;\n onClearTemplate: () => void;\n lookUrl: string;\n onLookUrl: (url: string) => void;\n lookInvalid: boolean;\n /** The look-alike field is open (the home's \"A site you love\" card opens it too). */\n lookOpen: boolean;\n onLookOpen: (open: boolean) => void;\n brand: BrandKit | null;\n onBrand: () => void;\n /** The builder is still connecting: send waits, and this sentence says why. */\n connecting?: string | null;\n canSubmit: boolean;\n theme: WebBuilderTheme;\n}\n\nexport const Composer = forwardRef<TextInput, ComposerProps>(function Composer(\n {\n value,\n onChangeText,\n onSubmit,\n template,\n onTemplate,\n onClearTemplate,\n lookUrl,\n onLookUrl,\n lookInvalid,\n lookOpen,\n onLookOpen,\n brand,\n onBrand,\n connecting = null,\n canSubmit,\n theme,\n },\n ref,\n) {\n const lookHost = lookUrl && !lookInvalid ? hostLabel(lookUrl) : null;\n const ready = canSubmit && !connecting;\n return (\n <View\n style={[\n styles.box,\n {\n backgroundColor: theme.card,\n borderColor: theme.border,\n shadowColor: theme.isDark ? '#000' : '#7c2d12',\n },\n ]}\n >\n <TextInput\n ref={ref}\n value={value}\n onChangeText={onChangeText}\n placeholder=\"Describe the site you want to build…\"\n placeholderTextColor={theme.faint}\n multiline\n style={[styles.input, { color: theme.ink }]}\n accessibilityLabel=\"Describe what you want to build\"\n testID=\"webbuilder-brief\"\n />\n\n {lookOpen ? (\n <View\n style={[\n styles.look,\n { backgroundColor: theme.chip, borderColor: lookInvalid ? theme.crit : 'transparent' },\n ]}\n >\n <MaterialCommunityIcons name=\"web\" size={16} color={theme.muted} />\n <TextInput\n value={lookUrl}\n onChangeText={onLookUrl}\n placeholder=\"Look like… https://stripe.com\"\n placeholderTextColor={theme.faint}\n autoCapitalize=\"none\"\n autoCorrect={false}\n keyboardType=\"url\"\n autoFocus={!lookUrl}\n onSubmitEditing={() => onLookOpen(false)}\n style={[styles.lookInput, { color: theme.ink }]}\n accessibilityLabel=\"Make it look like this site\"\n testID=\"webbuilder-look\"\n />\n <Tap\n onPress={() => {\n onLookUrl('');\n onLookOpen(false);\n }}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Remove the look-alike site\"\n hitSlop={8}\n pressedStyle={DIM}\n >\n <MaterialCommunityIcons name=\"close\" size={16} color={theme.muted} />\n </Tap>\n </View>\n ) : null}\n\n {connecting ? (\n <View style={styles.status} accessibilityLiveRegion=\"polite\">\n <View style={[styles.statusDot, { backgroundColor: theme.warn }]} />\n <Text style={[styles.statusText, { color: theme.muted }]} numberOfLines={1}>\n {connecting}\n </Text>\n </View>\n ) : null}\n\n <View style={[styles.toolbar, { borderTopColor: theme.border }]}>\n <ScrollView\n horizontal\n showsHorizontalScrollIndicator={false}\n keyboardShouldPersistTaps=\"handled\"\n style={styles.tools}\n contentContainerStyle={styles.toolsContent}\n >\n <Tool\n icon=\"view-grid-plus-outline\"\n label=\"Template\"\n value={template?.title}\n onPress={onTemplate}\n onClear={onClearTemplate}\n theme={theme}\n testID=\"webbuilder-composer-template\"\n />\n <Tool\n icon=\"web\"\n label=\"Look like\"\n value={lookOpen ? null : lookHost}\n onPress={() => onLookOpen(true)}\n onClear={() => onLookUrl('')}\n theme={theme}\n testID=\"webbuilder-composer-look\"\n />\n <Tool\n icon=\"palette-outline\"\n label=\"Brand kit\"\n value={brand ? brand.name || 'Brand' : null}\n onPress={onBrand}\n theme={theme}\n leading={\n brand?.colors.length ? (\n <View style={styles.dots}>\n {brand.colors.slice(0, 3).map((c) => (\n <View\n key={c}\n style={[styles.dot, { backgroundColor: c, borderColor: theme.card }]}\n />\n ))}\n </View>\n ) : undefined\n }\n testID=\"webbuilder-composer-brand\"\n />\n </ScrollView>\n <Tap\n onPress={onSubmit}\n disabled={!ready}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Start building\"\n accessibilityState={{ disabled: !ready }}\n style={[styles.send, { backgroundColor: ready ? theme.accent : theme.chip }]}\n pressedStyle={DIM}\n testID=\"webbuilder-start\"\n >\n <MaterialCommunityIcons name=\"arrow-up\" size={21} color={ready ? theme.accentInk : theme.faint} />\n </Tap>\n </View>\n </View>\n );\n});\n\nconst styles = StyleSheet.create({\n box: {\n borderRadius: 22,\n borderWidth: StyleSheet.hairlineWidth,\n paddingTop: 14,\n paddingHorizontal: 14,\n paddingBottom: 10,\n gap: 10,\n shadowOpacity: 0.07,\n shadowRadius: 16,\n shadowOffset: { width: 0, height: 6 },\n elevation: 3,\n },\n input: {\n minHeight: 64,\n maxHeight: 160,\n fontSize: 17,\n lineHeight: 24,\n padding: 0,\n textAlignVertical: 'top',\n },\n look: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 8,\n borderRadius: 12,\n borderWidth: 1,\n paddingHorizontal: 10,\n },\n lookInput: { flex: 1, fontSize: 15, paddingVertical: 9 },\n status: { flexDirection: 'row', alignItems: 'center', gap: 8 },\n statusDot: { width: 7, height: 7, borderRadius: 4 },\n statusText: { flex: 1, fontSize: 13 },\n toolbar: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 10,\n paddingTop: 10,\n borderTopWidth: StyleSheet.hairlineWidth,\n },\n tools: { flex: 1 },\n toolsContent: { gap: 8, alignItems: 'center' },\n toolIcon: {\n width: 38,\n height: 38,\n borderRadius: 19,\n borderWidth: StyleSheet.hairlineWidth,\n alignItems: 'center',\n justifyContent: 'center',\n },\n toolChip: {\n flexDirection: 'row',\n alignItems: 'center',\n height: 38,\n maxWidth: 200,\n borderRadius: 19,\n borderWidth: StyleSheet.hairlineWidth,\n },\n toolChipMain: { flexDirection: 'row', alignItems: 'center', gap: 6, paddingLeft: 12, flexShrink: 1 },\n toolChipLabel: { fontSize: 14, fontWeight: '600', flexShrink: 1 },\n toolChipClear: { paddingLeft: 6, paddingRight: 10, height: 38, justifyContent: 'center' },\n toolChipEnd: { width: 12 },\n dots: { flexDirection: 'row', marginRight: 4 },\n dot: { width: 12, height: 12, borderRadius: 6, borderWidth: 1.5, marginRight: -4 },\n send: { width: 42, height: 42, borderRadius: 21, alignItems: 'center', justifyContent: 'center' },\n});\n"],"names":["Composer"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Composer.js","sources":["../../../../src/features/webbuilder/components/Composer.tsx"],"sourcesContent":["/**\n * The prompt box - what to build, and in one toolbar row the three ways the web\n * studio lets you shape it: a starter template, a site to look like, the brand\n * kit. A tool shows as a small icon until it is set, then as a chip naming the\n * choice, with a way to remove it. Send is the only filled control; while the\n * builder is still connecting it rests disabled and the box says so.\n */\nimport React, { forwardRef } from 'react';\nimport { ScrollView, StyleSheet, Text, TextInput, View } from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { DIM, Tap } from '../../inbox/components/Tap';\nimport { hostLabel, type BrandKit } from '../studioCatalog';\nimport type { WebBuilderTemplate } from '../workflow';\nimport type { WebBuilderTheme } from '../webbuilderTheme';\nimport { templateName } from '../templateCatalog';\nimport type { IconName } from './ui';\n\nfunction Tool({\n icon,\n label,\n value,\n onPress,\n onClear,\n theme,\n leading,\n testID,\n}: {\n icon: IconName;\n /** What the tool does, for screen readers. */\n label: string;\n /** The choice once made (a template name, a host, a brand); unset when empty. */\n value?: string | null;\n onPress: () => void;\n onClear?: () => void;\n theme: WebBuilderTheme;\n leading?: React.ReactNode;\n testID?: string;\n}) {\n if (!value) {\n return (\n <Tap\n onPress={onPress}\n accessibilityRole=\"button\"\n accessibilityLabel={label}\n hitSlop={4}\n style={[styles.toolIcon, { borderColor: theme.border }]}\n pressedStyle={DIM}\n testID={testID}\n >\n <MaterialCommunityIcons name={icon} size={19} color={theme.muted} />\n </Tap>\n );\n }\n return (\n <View style={[styles.toolChip, { backgroundColor: theme.accentSoft, borderColor: theme.accentBorder }]}>\n <Tap\n onPress={onPress}\n accessibilityRole=\"button\"\n accessibilityLabel={`${label}: ${value}`}\n style={styles.toolChipMain}\n pressedStyle={DIM}\n testID={testID}\n >\n {leading ?? <MaterialCommunityIcons name={icon} size={16} color={theme.accent} />}\n <Text style={[styles.toolChipLabel, { color: theme.accent }]} numberOfLines={1}>\n {value}\n </Text>\n </Tap>\n {onClear ? (\n <Tap\n onPress={onClear}\n accessibilityRole=\"button\"\n accessibilityLabel={`Remove ${label.toLowerCase()}`}\n hitSlop={8}\n style={styles.toolChipClear}\n pressedStyle={DIM}\n >\n <MaterialCommunityIcons name=\"close-circle\" size={16} color={theme.accent} />\n </Tap>\n ) : (\n <View style={styles.toolChipEnd} />\n )}\n </View>\n );\n}\n\nexport interface ComposerProps {\n value: string;\n onChangeText: (text: string) => void;\n onSubmit: () => void;\n template: WebBuilderTemplate | null;\n onTemplate: () => void;\n onClearTemplate: () => void;\n lookUrl: string;\n onLookUrl: (url: string) => void;\n lookInvalid: boolean;\n /** The look-alike field is open (the home's \"A site you love\" card opens it too). */\n lookOpen: boolean;\n onLookOpen: (open: boolean) => void;\n brand: BrandKit | null;\n onBrand: () => void;\n /** The builder is still connecting: send waits, and this sentence says why. */\n connecting?: string | null;\n canSubmit: boolean;\n theme: WebBuilderTheme;\n}\n\nexport const Composer = forwardRef<TextInput, ComposerProps>(function Composer(\n {\n value,\n onChangeText,\n onSubmit,\n template,\n onTemplate,\n onClearTemplate,\n lookUrl,\n onLookUrl,\n lookInvalid,\n lookOpen,\n onLookOpen,\n brand,\n onBrand,\n connecting = null,\n canSubmit,\n theme,\n },\n ref,\n) {\n const lookHost = lookUrl && !lookInvalid ? hostLabel(lookUrl) : null;\n const ready = canSubmit && !connecting;\n return (\n <View\n style={[\n styles.box,\n {\n backgroundColor: theme.card,\n borderColor: theme.border,\n shadowColor: theme.isDark ? '#000' : '#7c2d12',\n },\n ]}\n >\n <TextInput\n ref={ref}\n value={value}\n onChangeText={onChangeText}\n placeholder=\"Describe the site you want to build…\"\n placeholderTextColor={theme.faint}\n multiline\n style={[styles.input, { color: theme.ink }]}\n accessibilityLabel=\"Describe what you want to build\"\n testID=\"webbuilder-brief\"\n />\n\n {lookOpen ? (\n <View\n style={[\n styles.look,\n { backgroundColor: theme.chip, borderColor: lookInvalid ? theme.crit : 'transparent' },\n ]}\n >\n <MaterialCommunityIcons name=\"web\" size={16} color={theme.muted} />\n <TextInput\n value={lookUrl}\n onChangeText={onLookUrl}\n placeholder=\"Look like… https://stripe.com\"\n placeholderTextColor={theme.faint}\n autoCapitalize=\"none\"\n autoCorrect={false}\n keyboardType=\"url\"\n autoFocus={!lookUrl}\n onSubmitEditing={() => onLookOpen(false)}\n style={[styles.lookInput, { color: theme.ink }]}\n accessibilityLabel=\"Make it look like this site\"\n testID=\"webbuilder-look\"\n />\n <Tap\n onPress={() => {\n onLookUrl('');\n onLookOpen(false);\n }}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Remove the look-alike site\"\n hitSlop={8}\n pressedStyle={DIM}\n >\n <MaterialCommunityIcons name=\"close\" size={16} color={theme.muted} />\n </Tap>\n </View>\n ) : null}\n\n {connecting ? (\n <View style={styles.status} accessibilityLiveRegion=\"polite\">\n <View style={[styles.statusDot, { backgroundColor: theme.warn }]} />\n <Text style={[styles.statusText, { color: theme.muted }]} numberOfLines={1}>\n {connecting}\n </Text>\n </View>\n ) : null}\n\n <View style={[styles.toolbar, { borderTopColor: theme.border }]}>\n <ScrollView\n horizontal\n showsHorizontalScrollIndicator={false}\n keyboardShouldPersistTaps=\"handled\"\n style={styles.tools}\n contentContainerStyle={styles.toolsContent}\n >\n <Tool\n icon=\"view-grid-plus-outline\"\n label=\"Template\"\n value={template ? templateName(template) : undefined}\n onPress={onTemplate}\n onClear={onClearTemplate}\n theme={theme}\n testID=\"webbuilder-composer-template\"\n />\n <Tool\n icon=\"web\"\n label=\"Look like\"\n value={lookOpen ? null : lookHost}\n onPress={() => onLookOpen(true)}\n onClear={() => onLookUrl('')}\n theme={theme}\n testID=\"webbuilder-composer-look\"\n />\n <Tool\n icon=\"palette-outline\"\n label=\"Brand kit\"\n value={brand ? brand.name || 'Brand' : null}\n onPress={onBrand}\n theme={theme}\n leading={\n brand?.colors.length ? (\n <View style={styles.dots}>\n {brand.colors.slice(0, 3).map((c) => (\n <View\n key={c}\n style={[styles.dot, { backgroundColor: c, borderColor: theme.card }]}\n />\n ))}\n </View>\n ) : undefined\n }\n testID=\"webbuilder-composer-brand\"\n />\n </ScrollView>\n <Tap\n onPress={onSubmit}\n disabled={!ready}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Start building\"\n accessibilityState={{ disabled: !ready }}\n style={[styles.send, { backgroundColor: ready ? theme.accent : theme.chip }]}\n pressedStyle={DIM}\n testID=\"webbuilder-start\"\n >\n <MaterialCommunityIcons name=\"arrow-up\" size={21} color={ready ? theme.accentInk : theme.faint} />\n </Tap>\n </View>\n </View>\n );\n});\n\nconst styles = StyleSheet.create({\n box: {\n borderRadius: 22,\n borderWidth: StyleSheet.hairlineWidth,\n paddingTop: 14,\n paddingHorizontal: 14,\n paddingBottom: 10,\n gap: 10,\n shadowOpacity: 0.07,\n shadowRadius: 16,\n shadowOffset: { width: 0, height: 6 },\n elevation: 3,\n },\n input: {\n minHeight: 64,\n maxHeight: 160,\n fontSize: 17,\n lineHeight: 24,\n padding: 0,\n textAlignVertical: 'top',\n },\n look: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 8,\n borderRadius: 12,\n borderWidth: 1,\n paddingHorizontal: 10,\n },\n lookInput: { flex: 1, fontSize: 15, paddingVertical: 9 },\n status: { flexDirection: 'row', alignItems: 'center', gap: 8 },\n statusDot: { width: 7, height: 7, borderRadius: 4 },\n statusText: { flex: 1, fontSize: 13 },\n toolbar: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 10,\n paddingTop: 10,\n borderTopWidth: StyleSheet.hairlineWidth,\n },\n tools: { flex: 1 },\n toolsContent: { gap: 8, alignItems: 'center' },\n toolIcon: {\n width: 38,\n height: 38,\n borderRadius: 19,\n borderWidth: StyleSheet.hairlineWidth,\n alignItems: 'center',\n justifyContent: 'center',\n },\n toolChip: {\n flexDirection: 'row',\n alignItems: 'center',\n height: 38,\n maxWidth: 200,\n borderRadius: 19,\n borderWidth: StyleSheet.hairlineWidth,\n },\n toolChipMain: { flexDirection: 'row', alignItems: 'center', gap: 6, paddingLeft: 12, flexShrink: 1 },\n toolChipLabel: { fontSize: 14, fontWeight: '600', flexShrink: 1 },\n toolChipClear: { paddingLeft: 6, paddingRight: 10, height: 38, justifyContent: 'center' },\n toolChipEnd: { width: 12 },\n dots: { flexDirection: 'row', marginRight: 4 },\n dot: { width: 12, height: 12, borderRadius: 6, borderWidth: 1.5, marginRight: -4 },\n send: { width: 42, height: 42, borderRadius: 21, alignItems: 'center', justifyContent: 'center' },\n});\n"],"names":["Composer"],"mappings":"sVAgBA,SAAS,IAAK,CAAA;AAAA,EACZ,IAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAWG,EAAA;AACD,EAAA,IAAI,CAAC,KAAO,EAAA;AACV,IAAA,uBAAQ,GAAA,CAAA,GAAA,EAAA,EAAI,OAAkB,EAAA,iBAAA,EAAkB,QAAS,EAAA,kBAAA,EAAoB,KAAO,EAAA,OAAA,EAAS,CAAG,EAAA,KAAA,EAAO,CAAC,MAAA,CAAO,QAAU,EAAA;AAAA,MACvH,aAAa,KAAM,CAAA;AAAA,KACpB,CAAA,EAAG,YAAc,EAAA,GAAA,EAAK,QACX,QAAC,kBAAA,GAAA,CAAA,sBAAA,EAAA,EAAuB,IAAM,EAAA,IAAA,EAAM,IAAM,EAAA,EAAA,EAAI,KAAO,EAAA,KAAA,CAAM,OAAO,CACtE,EAAA,CAAA;AAAA;AAEV,EAAA,uBAAQ,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,QAAU,EAAA;AAAA,IACpC,iBAAiB,KAAM,CAAA,UAAA;AAAA,IACvB,aAAa,KAAM,CAAA;AAAA,GACpB,CACS,EAAA,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,GAAI,EAAA,EAAA,OAAA,EAAkB,iBAAkB,EAAA,QAAA,EAAS,oBAAoB,CAAG,EAAA,KAAK,CAAK,EAAA,EAAA,KAAK,IAAI,KAAO,EAAA,MAAA,CAAO,YAAc,EAAA,YAAA,EAAc,KAAK,MACtI,EAAA,QAAA,EAAA;AAAA,MAAW,OAAA,IAAA,IAAA,GAAA,OAAA,mBAAA,GAAA,CAAC,0BAAuB,IAAM,EAAA,IAAA,EAAM,MAAM,EAAI,EAAA,KAAA,EAAO,MAAM,MAAQ,EAAA,CAAA;AAAA,sBAC9E,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,aAAe,EAAA;AAAA,QAC5C,OAAO,KAAM,CAAA;AAAA,OACd,CAAA,EAAG,aAAe,EAAA,CAAA,EACJ,QACL,EAAA,KAAA,EAAA;AAAA,KACJ,EAAA,CAAA;AAAA,IACC,OAAU,mBAAA,GAAA,CAAC,GAAI,EAAA,EAAA,OAAA,EAAS,SAAS,iBAAkB,EAAA,QAAA,EAAS,kBAAoB,EAAA,CAAA,OAAA,EAAU,MAAM,WAAY,EAAC,CAAI,CAAA,EAAA,OAAA,EAAS,GAAG,KAAO,EAAA,MAAA,CAAO,aAAe,EAAA,YAAA,EAAc,KACjK,QAAC,kBAAA,GAAA,CAAA,sBAAA,EAAA,EAAuB,IAAK,EAAA,cAAA,EAAe,MAAM,EAAI,EAAA,KAAA,EAAO,KAAM,CAAA,MAAA,EAAQ,GAC/E,CAAS,mBAAA,GAAA,CAAC,IAAK,EAAA,EAAA,KAAA,EAAO,OAAO,WAAa,EAAA;AAAA,GAClD,EAAA,CAAA;AACR;AAqBa,MAAA,QAAA,GAAW,UAAqC,CAAA,SAASA,SAAS,CAAA;AAAA,EAC7E,KAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,eAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAa,GAAA,IAAA;AAAA,EACb,SAAA;AAAA,EACA;AACF,CAAA,EAAG,GAAK,EAAA;AACN,EAAA,MAAM,WAAW,OAAW,IAAA,CAAC,WAAc,GAAA,SAAA,CAAU,OAAO,CAAI,GAAA,IAAA;AAChE,EAAM,MAAA,KAAA,GAAQ,aAAa,CAAC,UAAA;AAC5B,EAAA,uBAAQ,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,GAAK,EAAA;AAAA,IAC/B,iBAAiB,KAAM,CAAA,IAAA;AAAA,IACvB,aAAa,KAAM,CAAA,MAAA;AAAA,IACnB,WAAA,EAAa,KAAM,CAAA,MAAA,GAAS,MAAS,GAAA;AAAA,GACtC,CACS,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,SAAU,EAAA,EAAA,GAAA,EAAU,KAAc,EAAA,YAAA,EAA4B,aAAY,2CAAuC,EAAA,oBAAA,EAAsB,KAAM,CAAA,KAAA,EAAO,SAAS,EAAA,IAAA,EAAC,KAAO,EAAA,CAAC,OAAO,KAAO,EAAA;AAAA,MAC3L,OAAO,KAAM,CAAA;AAAA,KACd,CAAA,EAAG,kBAAmB,EAAA,iCAAA,EAAkC,QAAO,kBAAmB,EAAA,CAAA;AAAA,IAE1E,2BAAY,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,IAAM,EAAA;AAAA,MAC7C,iBAAiB,KAAM,CAAA,IAAA;AAAA,MACvB,WAAA,EAAa,WAAc,GAAA,KAAA,CAAM,IAAO,GAAA;AAAA,KACzC,CACe,EAAA,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,0BAAuB,IAAK,EAAA,KAAA,EAAM,MAAM,EAAI,EAAA,KAAA,EAAO,MAAM,KAAO,EAAA,CAAA;AAAA,sBAChE,GAAA,CAAA,SAAA,EAAA,EAAU,KAAO,EAAA,OAAA,EAAS,YAAc,EAAA,SAAA,EAAW,WAAY,EAAA,oCAAA,EAAgC,oBAAsB,EAAA,KAAA,CAAM,KAAO,EAAA,cAAA,EAAe,MAAO,EAAA,WAAA,EAAa,KAAO,EAAA,YAAA,EAAa,KAAM,EAAA,SAAA,EAAW,CAAC,OAAA,EAAS,eAAiB,EAAA,MAAM,UAAW,CAAA,KAAK,CAAG,EAAA,KAAA,EAAO,CAAC,MAAA,CAAO,SAAW,EAAA;AAAA,QACrS,OAAO,KAAM,CAAA;AAAA,OACd,CAAA,EAAG,kBAAmB,EAAA,6BAAA,EAA8B,QAAO,iBAAkB,EAAA,CAAA;AAAA,sBAChE,GAAA,CAAC,GAAI,EAAA,EAAA,OAAA,EAAS,MAAM;AAChC,QAAA,SAAA,CAAU,EAAE,CAAA;AACZ,QAAA,UAAA,CAAW,KAAK,CAAA;AAAA,SACf,iBAAkB,EAAA,QAAA,EAAS,oBAAmB,4BAA6B,EAAA,OAAA,EAAS,GAAG,YAAc,EAAA,GAAA,EACtF,QAAC,kBAAA,GAAA,CAAA,sBAAA,EAAA,EAAuB,MAAK,OAAQ,EAAA,IAAA,EAAM,IAAI,KAAO,EAAA,KAAA,CAAM,OAAO,CACvE,EAAA;AAAA,KAAA,EACJ,CAAU,GAAA,IAAA;AAAA,IAEb,6BAAc,IAAA,CAAA,IAAA,EAAA,EAAK,OAAO,MAAO,CAAA,MAAA,EAAQ,yBAAwB,QAC1D,EAAA,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,IAAK,EAAA,EAAA,KAAA,EAAO,CAAC,MAAA,CAAO,SAAW,EAAA;AAAA,QAC5C,iBAAiB,KAAM,CAAA;AAAA,OACxB,CAAG,EAAA,CAAA;AAAA,sBACW,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,UAAY,EAAA;AAAA,QAC7C,OAAO,KAAM,CAAA;AAAA,OACd,CAAA,EAAG,aAAe,EAAA,CAAA,EACA,QACL,EAAA,UAAA,EAAA;AAAA,KAAA,EACJ,CAAU,GAAA,IAAA;AAAA,oBAEb,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,OAAS,EAAA;AAAA,MACpC,gBAAgB,KAAM,CAAA;AAAA,KACvB,CACW,EAAA,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,UAAW,EAAA,EAAA,UAAA,EAAU,IAAC,EAAA,8BAAA,EAAgC,KAAO,EAAA,yBAAA,EAA0B,SAAU,EAAA,KAAA,EAAO,MAAO,CAAA,KAAA,EAAO,qBAAuB,EAAA,MAAA,CAAO,YACjJ,EAAA,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,QAAK,IAAK,EAAA,wBAAA,EAAyB,KAAM,EAAA,UAAA,EAAW,OAAO,QAAW,GAAA,YAAA,CAAa,QAAQ,CAAA,GAAI,QAAW,OAAS,EAAA,UAAA,EAAY,SAAS,eAAiB,EAAA,KAAA,EAAc,QAAO,8BAA+B,EAAA,CAAA;AAAA,wBAC9M,GAAA,CAAC,QAAK,IAAK,EAAA,KAAA,EAAM,OAAM,WAAY,EAAA,KAAA,EAAO,QAAW,GAAA,IAAA,GAAO,QAAU,EAAA,OAAA,EAAS,MAAM,UAAW,CAAA,IAAI,GAAG,OAAS,EAAA,MAAM,UAAU,EAAE,CAAA,EAAG,KAAc,EAAA,MAAA,EAAO,0BAA2B,EAAA,CAAA;AAAA,4BACpL,IAAK,EAAA,EAAA,IAAA,EAAK,iBAAkB,EAAA,KAAA,EAAM,aAAY,KAAO,EAAA,KAAA,GAAQ,KAAM,CAAA,IAAA,IAAQ,UAAU,IAAM,EAAA,OAAA,EAAS,OAAS,EAAA,KAAA,EAAc,UAAS,KAAO,IAAA,IAAA,GAAA,MAAA,GAAA,KAAA,CAAA,MAAA,CAAO,MAAS,oBAAA,GAAA,CAAC,QAAK,KAAO,EAAA,MAAA,CAAO,IAC/J,EAAA,QAAA,EAAA,KAAA,CAAM,OAAO,KAAM,CAAA,CAAA,EAAG,CAAC,CAAA,CAAE,IAAI,CAAK,CAAA,qBAAA,GAAA,CAAC,QAAa,KAAO,EAAA,CAAC,OAAO,GAAK,EAAA;AAAA,UAC7F,eAAiB,EAAA,CAAA;AAAA,UACjB,aAAa,KAAM,CAAA;AAAA,SACpB,KAHuE,CAGpE,CAAE,GACgB,CAAU,GAAA,MAAA,EAAW,QAAO,2BAA4B,EAAA;AAAA,OACxE,EAAA,CAAA;AAAA,sBACA,GAAA,CAAC,GAAI,EAAA,EAAA,OAAA,EAAS,QAAU,EAAA,QAAA,EAAU,CAAC,KAAA,EAAO,iBAAkB,EAAA,QAAA,EAAS,kBAAmB,EAAA,gBAAA,EAAiB,kBAAoB,EAAA;AAAA,QACrI,UAAU,CAAC;AAAA,OACV,EAAA,KAAA,EAAO,CAAC,MAAA,CAAO,IAAM,EAAA;AAAA,QACtB,eAAiB,EAAA,KAAA,GAAQ,KAAM,CAAA,MAAA,GAAS,KAAM,CAAA;AAAA,OAC/C,CAAG,EAAA,YAAA,EAAc,KAAK,MAAO,EAAA,kBAAA,EAChB,8BAAC,sBAAuB,EAAA,EAAA,IAAA,EAAK,UAAW,EAAA,IAAA,EAAM,IAAI,KAAO,EAAA,KAAA,GAAQ,MAAM,SAAY,GAAA,KAAA,CAAM,OAAO,CACpG,EAAA;AAAA,KACJ,EAAA;AAAA,GACJ,EAAA,CAAA;AACR,CAAC;AACD,MAAM,MAAA,GAAS,WAAW,MAAO,CAAA;AAAA,EAC/B,GAAK,EAAA;AAAA,IACH,YAAc,EAAA,EAAA;AAAA,IACd,aAAa,UAAW,CAAA,aAAA;AAAA,IACxB,UAAY,EAAA,EAAA;AAAA,IACZ,iBAAmB,EAAA,EAAA;AAAA,IACnB,aAAe,EAAA,EAAA;AAAA,IACf,GAAK,EAAA,EAAA;AAAA,IACL,aAAe,EAAA,IAAA;AAAA,IACf,YAAc,EAAA,EAAA;AAAA,IACd,YAAc,EAAA;AAAA,MACZ,KAAO,EAAA,CAAA;AAAA,MACP,MAAQ,EAAA;AAAA,KACV;AAAA,IACA,SAAW,EAAA;AAAA,GACb;AAAA,EACA,KAAO,EAAA;AAAA,IACL,SAAW,EAAA,EAAA;AAAA,IACX,SAAW,EAAA,GAAA;AAAA,IACX,QAAU,EAAA,EAAA;AAAA,IACV,UAAY,EAAA,EAAA;AAAA,IACZ,OAAS,EAAA,CAAA;AAAA,IACT,iBAAmB,EAAA;AAAA,GACrB;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,aAAe,EAAA,KAAA;AAAA,IACf,UAAY,EAAA,QAAA;AAAA,IACZ,GAAK,EAAA,CAAA;AAAA,IACL,YAAc,EAAA,EAAA;AAAA,IACd,WAAa,EAAA,CAAA;AAAA,IACb,iBAAmB,EAAA;AAAA,GACrB;AAAA,EACA,SAAW,EAAA;AAAA,IACT,IAAM,EAAA,CAAA;AAAA,IACN,QAAU,EAAA,EAAA;AAAA,IACV,eAAiB,EAAA;AAAA,GACnB;AAAA,EACA,MAAQ,EAAA;AAAA,IACN,aAAe,EAAA,KAAA;AAAA,IACf,UAAY,EAAA,QAAA;AAAA,IACZ,GAAK,EAAA;AAAA,GACP;AAAA,EACA,SAAW,EAAA;AAAA,IACT,KAAO,EAAA,CAAA;AAAA,IACP,MAAQ,EAAA,CAAA;AAAA,IACR,YAAc,EAAA;AAAA,GAChB;AAAA,EACA,UAAY,EAAA;AAAA,IACV,IAAM,EAAA,CAAA;AAAA,IACN,QAAU,EAAA;AAAA,GACZ;AAAA,EACA,OAAS,EAAA;AAAA,IACP,aAAe,EAAA,KAAA;AAAA,IACf,UAAY,EAAA,QAAA;AAAA,IACZ,GAAK,EAAA,EAAA;AAAA,IACL,UAAY,EAAA,EAAA;AAAA,IACZ,gBAAgB,UAAW,CAAA;AAAA,GAC7B;AAAA,EACA,KAAO,EAAA;AAAA,IACL,IAAM,EAAA;AAAA,GACR;AAAA,EACA,YAAc,EAAA;AAAA,IACZ,GAAK,EAAA,CAAA;AAAA,IACL,UAAY,EAAA;AAAA,GACd;AAAA,EACA,QAAU,EAAA;AAAA,IACR,KAAO,EAAA,EAAA;AAAA,IACP,MAAQ,EAAA,EAAA;AAAA,IACR,YAAc,EAAA,EAAA;AAAA,IACd,aAAa,UAAW,CAAA,aAAA;AAAA,IACxB,UAAY,EAAA,QAAA;AAAA,IACZ,cAAgB,EAAA;AAAA,GAClB;AAAA,EACA,QAAU,EAAA;AAAA,IACR,aAAe,EAAA,KAAA;AAAA,IACf,UAAY,EAAA,QAAA;AAAA,IACZ,MAAQ,EAAA,EAAA;AAAA,IACR,QAAU,EAAA,GAAA;AAAA,IACV,YAAc,EAAA,EAAA;AAAA,IACd,aAAa,UAAW,CAAA;AAAA,GAC1B;AAAA,EACA,YAAc,EAAA;AAAA,IACZ,aAAe,EAAA,KAAA;AAAA,IACf,UAAY,EAAA,QAAA;AAAA,IACZ,GAAK,EAAA,CAAA;AAAA,IACL,WAAa,EAAA,EAAA;AAAA,IACb,UAAY,EAAA;AAAA,GACd;AAAA,EACA,aAAe,EAAA;AAAA,IACb,QAAU,EAAA,EAAA;AAAA,IACV,UAAY,EAAA,KAAA;AAAA,IACZ,UAAY,EAAA;AAAA,GACd;AAAA,EACA,aAAe,EAAA;AAAA,IACb,WAAa,EAAA,CAAA;AAAA,IACb,YAAc,EAAA,EAAA;AAAA,IACd,MAAQ,EAAA,EAAA;AAAA,IACR,cAAgB,EAAA;AAAA,GAClB;AAAA,EACA,WAAa,EAAA;AAAA,IACX,KAAO,EAAA;AAAA,GACT;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,aAAe,EAAA,KAAA;AAAA,IACf,WAAa,EAAA;AAAA,GACf;AAAA,EACA,GAAK,EAAA;AAAA,IACH,KAAO,EAAA,EAAA;AAAA,IACP,MAAQ,EAAA,EAAA;AAAA,IACR,YAAc,EAAA,CAAA;AAAA,IACd,WAAa,EAAA,GAAA;AAAA,IACb,WAAa,EAAA;AAAA,GACf;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,KAAO,EAAA,EAAA;AAAA,IACP,MAAQ,EAAA,EAAA;AAAA,IACR,YAAc,EAAA,EAAA;AAAA,IACd,UAAY,EAAA,QAAA;AAAA,IACZ,cAAgB,EAAA;AAAA;AAEpB,CAAC,CAAA"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {jsxs,jsx}from'react/jsx-runtime';import {useState,useMemo,useEffect}from'react';import {StyleSheet,View,Text}from'react-native';import {WebView}from'react-native-webview';import {cacheBustedUrl}from'../buildFragments.js';import {Tap,DIM}from'../../inbox/components/Tap.js';import {PreviewPlaceholder}from'./PreviewPlaceholder.js';var __defProp = Object.defineProperty;
|
|
1
|
+
import {jsxs,jsx}from'react/jsx-runtime';import {useState,useMemo,useEffect}from'react';import {StyleSheet,View,Text}from'react-native';import {WebView}from'react-native-webview';import {cacheBustedUrl}from'../buildFragments.js';import {Tap,DIM}from'../../inbox/components/Tap.js';import {PreviewPlaceholder}from'./PreviewPlaceholder.js';import {probePreview,mayFrame}from'../previewProbe.js';var __defProp = Object.defineProperty;
|
|
2
2
|
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
3
3
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
4
4
|
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
@@ -25,12 +25,23 @@ function PreviewFrame({
|
|
|
25
25
|
waking = false,
|
|
26
26
|
starting = false
|
|
27
27
|
}) {
|
|
28
|
-
const [state, setState] = useState("
|
|
28
|
+
const [state, setState] = useState("checking");
|
|
29
29
|
const [retry, setRetry] = useState(0);
|
|
30
30
|
const source = useMemo(() => ({
|
|
31
31
|
uri: nonce || retry ? cacheBustedUrl(url, `${nonce}-${retry}`) : url
|
|
32
32
|
}), [url, nonce, retry]);
|
|
33
|
-
useEffect(() =>
|
|
33
|
+
useEffect(() => {
|
|
34
|
+
let live = true;
|
|
35
|
+
setState("checking");
|
|
36
|
+
probePreview(source.uri).then((probe) => {
|
|
37
|
+
if (live) setState(mayFrame(probe) ? "loading" : "asleep");
|
|
38
|
+
}).catch(() => {
|
|
39
|
+
if (live) setState("loading");
|
|
40
|
+
});
|
|
41
|
+
return () => {
|
|
42
|
+
live = false;
|
|
43
|
+
};
|
|
44
|
+
}, [source.uri, viewport]);
|
|
34
45
|
useEffect(() => {
|
|
35
46
|
if (state === "asleep" && !starting) onWake == null ? void 0 : onWake();
|
|
36
47
|
}, [state, starting]);
|
|
@@ -60,6 +71,11 @@ function PreviewFrame({
|
|
|
60
71
|
}], children: "Try again" }) }) : null
|
|
61
72
|
] });
|
|
62
73
|
}
|
|
74
|
+
if (state === "checking") {
|
|
75
|
+
return /* @__PURE__ */ jsx(View, { style: [styles.fill, {
|
|
76
|
+
backgroundColor: theme.card
|
|
77
|
+
}], testID: "webbuilder-preview-checking", children: /* @__PURE__ */ jsx(PreviewPlaceholder, { theme, label: "Checking the preview\u2026" }) });
|
|
78
|
+
}
|
|
63
79
|
return /* @__PURE__ */ jsxs(View, { style: [styles.fill, {
|
|
64
80
|
backgroundColor: theme.card
|
|
65
81
|
}], children: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PreviewFrame.js","sources":["../../../../src/features/webbuilder/components/PreviewFrame.tsx"],"sourcesContent":["/**\n * The live preview: the build's sandbox dev server in a WebView, the phone\n * twin of the web CreationView iframe. `nonce` re-fetches it (the web\n * `?wb=<n>` cache-bust); `viewport` 'desktop' lays the page out at 1280px and\n * fits it to the screen, the way the web device toggle shows a wide layout.\n *\n * A sandbox that slept or whose dev server stopped answers 5xx from the\n * sandbox host (\"Closed Port\", \"Sandbox not found\"). That reads as asleep,\n * with a way to wake it, not as an error page inside the frame.\n */\nimport React, { useEffect, useMemo, useState } from 'react';\nimport { StyleSheet, Text, View } from 'react-native';\nimport { WebView } from 'react-native-webview';\nimport { cacheBustedUrl } from '../buildFragments';\nimport type { WebBuilderTheme } from '../webbuilderTheme';\nimport { DIM, Tap } from '../../inbox/components/Tap';\nimport { PreviewPlaceholder } from './PreviewPlaceholder';\n\nexport type PreviewViewport = 'phone' | 'desktop';\n\n/** Lays the page out at desktop width; the WebView then fits it to the frame. */\nexport const DESKTOP_VIEWPORT_SCRIPT = `(function(){try{var m=document.querySelector('meta[name=\"viewport\"]');if(!m){m=document.createElement('meta');m.setAttribute('name','viewport');(document.head||document.documentElement).appendChild(m);}m.setAttribute('content','width=1280');}catch(e){}})();true;`;\n\ntype FrameState = 'loading' | 'ready' | 'asleep' | 'failed';\n\n/** How often a starting agent preview is checked again (web #431). */\nconst STARTING_RECHECK_MS = 3_000;\n\nexport function PreviewFrame({\n url,\n nonce,\n viewport,\n theme,\n onWake,\n waking = false,\n starting = false,\n}: {\n url: string;\n nonce: number;\n viewport: PreviewViewport;\n theme: WebBuilderTheme;\n /** Ask the agent to restart the preview. */\n onWake?: () => void;\n /** A wake (or any build) is running; the asleep state shows progress instead of the button. */\n waking?: boolean;\n /**\n * The agent's turn is running: its dev server may not be up yet, and the sandbox\n * is the agent's. A 5xx then means \"starting\" - check again every 3 s, never wake\n * (web #431). The wake runs once the turn ends, if the page still does not answer.\n */\n starting?: boolean;\n}) {\n const [state, setState] = useState<FrameState>('loading');\n const [retry, setRetry] = useState(0);\n const source = useMemo(\n () => ({ uri: nonce || retry ? cacheBustedUrl(url, `${nonce}-${retry}`) : url }),\n [url, nonce, retry],\n );\n\n useEffect(() => setState('loading'), [source.uri, viewport]);\n // A sandbox that answers 5xx slept or stopped: start it right away, once per page load.\n useEffect(() => {\n if (state === 'asleep' && !starting) onWake?.();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [state, starting]);\n useEffect(() => {\n if (state !== 'asleep' || !starting) return undefined;\n const timer = setTimeout(() => setRetry((n) => n + 1), STARTING_RECHECK_MS);\n return () => clearTimeout(timer);\n }, [state, starting]);\n\n if (state === 'asleep' && starting) {\n return (\n <View style={[styles.fill, { backgroundColor: theme.card }]} testID=\"webbuilder-preview-starting\">\n <PreviewPlaceholder theme={theme} label=\"Starting the live preview…\" />\n <Text style={[styles.hint, { color: theme.muted }]}>\n Your site appears here in a moment and updates as the assistant builds it.\n </Text>\n </View>\n );\n }\n\n if (state === 'asleep' || state === 'failed') {\n // Asleep is not an error the person has to deal with: the wake already started\n // (effect above), so they see the page on its way, not the sandbox host's 502.\n const trying = state === 'asleep' && waking;\n return (\n <View style={[styles.fill, { backgroundColor: theme.card }]} testID=\"webbuilder-preview-down\">\n <PreviewPlaceholder\n theme={theme}\n label={\n trying || state === 'asleep'\n ? 'Loading preview, please wait…'\n : \"The preview didn't load. Check your connection.\"\n }\n />\n {!trying ? (\n <Tap\n onPress={() => setRetry((n) => n + 1)}\n accessibilityRole=\"button\"\n style={styles.retry}\n pressedStyle={DIM}\n testID=\"webbuilder-preview-retry\"\n >\n <Text style={[styles.retryText, { color: theme.accent }]}>Try again</Text>\n </Tap>\n ) : null}\n </View>\n );\n }\n\n return (\n <View style={[styles.fill, { backgroundColor: theme.card }]}>\n <WebView\n key={`${source.uri}-${viewport}`}\n source={source}\n style={styles.fill}\n originWhitelist={['*']}\n javaScriptEnabled\n domStorageEnabled\n allowsInlineMediaPlayback\n setSupportMultipleWindows={false}\n scalesPageToFit={viewport === 'desktop'}\n injectedJavaScript={viewport === 'desktop' ? DESKTOP_VIEWPORT_SCRIPT : undefined}\n onLoadEnd={() => setState((s) => (s === 'loading' ? 'ready' : s))}\n onError={() => setState('failed')}\n onHttpError={(event) => {\n if (event.nativeEvent.statusCode >= 500) setState('asleep');\n }}\n testID=\"webbuilder-preview\"\n />\n {state === 'loading' ? (\n <View style={[styles.loading, { backgroundColor: theme.card }]} pointerEvents=\"none\">\n <PreviewPlaceholder theme={theme} label=\"Loading preview, please wait…\" />\n </View>\n ) : null}\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n fill: { flex: 1 },\n loading: { ...StyleSheet.absoluteFillObject },\n retry: { position: 'absolute', bottom: 40, alignSelf: 'center', padding: 10 },\n hint: { position: 'absolute', bottom: 40, left: 24, right: 24, textAlign: 'center', fontSize: 13 },\n retryText: { fontSize: 15, fontWeight: '600' },\n});\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PreviewFrame.js","sources":["../../../../src/features/webbuilder/components/PreviewFrame.tsx"],"sourcesContent":["/**\n * The live preview: the build's sandbox dev server in a WebView, the phone\n * twin of the web CreationView iframe. `nonce` re-fetches it (the web\n * `?wb=<n>` cache-bust); `viewport` 'desktop' lays the page out at 1280px and\n * fits it to the screen, the way the web device toggle shows a wide layout.\n *\n * A sandbox that slept or whose dev server stopped answers 5xx from the\n * sandbox host (\"Closed Port\", \"Sandbox not found\"). That reads as asleep,\n * with a way to wake it, not as an error page inside the frame.\n */\nimport React, { useEffect, useMemo, useState } from 'react';\nimport { StyleSheet, Text, View } from 'react-native';\nimport { WebView } from 'react-native-webview';\nimport { cacheBustedUrl } from '../buildFragments';\nimport type { WebBuilderTheme } from '../webbuilderTheme';\nimport { DIM, Tap } from '../../inbox/components/Tap';\nimport { PreviewPlaceholder } from './PreviewPlaceholder';\nimport { mayFrame, probePreview } from '../previewProbe';\n\nexport type PreviewViewport = 'phone' | 'desktop';\n\n/** Lays the page out at desktop width; the WebView then fits it to the frame. */\nexport const DESKTOP_VIEWPORT_SCRIPT = `(function(){try{var m=document.querySelector('meta[name=\"viewport\"]');if(!m){m=document.createElement('meta');m.setAttribute('name','viewport');(document.head||document.documentElement).appendChild(m);}m.setAttribute('content','width=1280');}catch(e){}})();true;`;\n\ntype FrameState = 'checking' | 'loading' | 'ready' | 'asleep' | 'failed';\n\n/** How often a starting agent preview is checked again (web #431). */\nconst STARTING_RECHECK_MS = 3_000;\n\nexport function PreviewFrame({\n url,\n nonce,\n viewport,\n theme,\n onWake,\n waking = false,\n starting = false,\n}: {\n url: string;\n nonce: number;\n viewport: PreviewViewport;\n theme: WebBuilderTheme;\n /** Ask the agent to restart the preview. */\n onWake?: () => void;\n /** A wake (or any build) is running; the asleep state shows progress instead of the button. */\n waking?: boolean;\n /**\n * The agent's turn is running: its dev server may not be up yet, and the sandbox\n * is the agent's. A 5xx then means \"starting\" - check again every 3 s, never wake\n * (web #431). The wake runs once the turn ends, if the page still does not answer.\n */\n starting?: boolean;\n}) {\n const [state, setState] = useState<FrameState>('checking');\n const [retry, setRetry] = useState(0);\n const source = useMemo(\n () => ({ uri: nonce || retry ? cacheBustedUrl(url, `${nonce}-${retry}`) : url }),\n [url, nonce, retry],\n );\n\n // Never frame a sandbox nobody saw alive (web #f99bd580): e2b's \"Sandbox not found\" or\n // \"Closed port\" page can come back as HTTP 200, which the WebView would show raw.\n useEffect(() => {\n let live = true;\n setState('checking');\n probePreview(source.uri)\n .then((probe) => {\n if (live) setState(mayFrame(probe) ? 'loading' : 'asleep');\n })\n .catch(() => {\n if (live) setState('loading');\n });\n return () => {\n live = false;\n };\n }, [source.uri, viewport]);\n // A sandbox that answers 5xx slept or stopped: start it right away, once per page load.\n useEffect(() => {\n if (state === 'asleep' && !starting) onWake?.();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [state, starting]);\n useEffect(() => {\n if (state !== 'asleep' || !starting) return undefined;\n const timer = setTimeout(() => setRetry((n) => n + 1), STARTING_RECHECK_MS);\n return () => clearTimeout(timer);\n }, [state, starting]);\n\n if (state === 'asleep' && starting) {\n return (\n <View style={[styles.fill, { backgroundColor: theme.card }]} testID=\"webbuilder-preview-starting\">\n <PreviewPlaceholder theme={theme} label=\"Starting the live preview…\" />\n <Text style={[styles.hint, { color: theme.muted }]}>\n Your site appears here in a moment and updates as the assistant builds it.\n </Text>\n </View>\n );\n }\n\n if (state === 'asleep' || state === 'failed') {\n // Asleep is not an error the person has to deal with: the wake already started\n // (effect above), so they see the page on its way, not the sandbox host's 502.\n const trying = state === 'asleep' && waking;\n return (\n <View style={[styles.fill, { backgroundColor: theme.card }]} testID=\"webbuilder-preview-down\">\n <PreviewPlaceholder\n theme={theme}\n label={\n trying || state === 'asleep'\n ? 'Loading preview, please wait…'\n : \"The preview didn't load. Check your connection.\"\n }\n />\n {!trying ? (\n <Tap\n onPress={() => setRetry((n) => n + 1)}\n accessibilityRole=\"button\"\n style={styles.retry}\n pressedStyle={DIM}\n testID=\"webbuilder-preview-retry\"\n >\n <Text style={[styles.retryText, { color: theme.accent }]}>Try again</Text>\n </Tap>\n ) : null}\n </View>\n );\n }\n\n if (state === 'checking') {\n return (\n <View style={[styles.fill, { backgroundColor: theme.card }]} testID=\"webbuilder-preview-checking\">\n <PreviewPlaceholder theme={theme} label=\"Checking the preview…\" />\n </View>\n );\n }\n\n return (\n <View style={[styles.fill, { backgroundColor: theme.card }]}>\n <WebView\n key={`${source.uri}-${viewport}`}\n source={source}\n style={styles.fill}\n originWhitelist={['*']}\n javaScriptEnabled\n domStorageEnabled\n allowsInlineMediaPlayback\n setSupportMultipleWindows={false}\n scalesPageToFit={viewport === 'desktop'}\n injectedJavaScript={viewport === 'desktop' ? DESKTOP_VIEWPORT_SCRIPT : undefined}\n onLoadEnd={() => setState((s) => (s === 'loading' ? 'ready' : s))}\n onError={() => setState('failed')}\n onHttpError={(event) => {\n if (event.nativeEvent.statusCode >= 500) setState('asleep');\n }}\n testID=\"webbuilder-preview\"\n />\n {state === 'loading' ? (\n <View style={[styles.loading, { backgroundColor: theme.card }]} pointerEvents=\"none\">\n <PreviewPlaceholder theme={theme} label=\"Loading preview, please wait…\" />\n </View>\n ) : null}\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n fill: { flex: 1 },\n loading: { ...StyleSheet.absoluteFillObject },\n retry: { position: 'absolute', bottom: 40, alignSelf: 'center', padding: 10 },\n hint: { position: 'absolute', bottom: 40, left: 24, right: 24, textAlign: 'center', fontSize: 13 },\n retryText: { fontSize: 15, fontWeight: '600' },\n});\n"],"names":[],"mappings":"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"}
|