@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":"PublishSheet.js","sources":["../../../../src/features/webbuilder/components/PublishSheet.tsx"],"sourcesContent":["/**\n * Publish a build: the web PublishControls dialog on a sheet. The person\n * picks the site's name (`<name>.yarntra.com`), the host starts the deploy, and\n * the live address arrives later on a chat post - so the sheet says\n * \"Publishing…\" until the build carries it, then shows it with Open / Share.\n */\nimport React, { useEffect, useState } from 'react';\nimport { Linking, Share, StyleSheet, Text, TextInput, View } from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { displayHost, isValidPublishSlug, publishSlug } from '../buildFragments';\nimport type { WebBuilderBuild, WebBuilderPublishResult } from '../types';\nimport type { WebBuilderTheme } from '../webbuilderTheme';\nimport { PrimaryButton, SecondaryButton, Sheet } from './ui';\n\nexport function PublishSheet({\n visible,\n build,\n publishing,\n onPublish,\n onClose,\n theme,\n}: {\n visible: boolean;\n build: WebBuilderBuild | null;\n /** A deploy is running on this site (started here, or seen on the chat). */\n publishing: boolean;\n onPublish?: (build: WebBuilderBuild, projectName: string) => Promise<WebBuilderPublishResult>;\n onClose: () => void;\n theme: WebBuilderTheme;\n}) {\n const [name, setName] = useState('');\n const [starting, setStarting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (!visible || !build) return;\n setName((prev) => prev || publishSlug(build.title));\n setError(null);\n }, [visible, build]);\n\n const live = build?.liveUrl ?? null;\n const valid = isValidPublishSlug(name);\n\n const publish = async () => {\n if (!build || !onPublish || !valid) return;\n setStarting(true);\n setError(null);\n try {\n const result = await onPublish(build, name);\n if (!result.ok) setError(result.message || \"Publishing didn't start. Try again.\");\n } catch {\n setError(\"Publishing didn't start. Check your connection and try again.\");\n } finally {\n setStarting(false);\n }\n };\n\n let body: React.ReactNode;\n if (!build?.sandboxId) {\n body = (\n <Text style={[styles.note, { color: theme.muted }]}>\n There is nothing to publish yet. Build the site first, then publish it here.\n </Text>\n );\n } else if (publishing && !starting) {\n body = (\n <View style={styles.block} testID=\"webbuilder-publishing\">\n <PrimaryButton label=\"Publishing…\" onPress={() => undefined} theme={theme} busy />\n <Text style={[styles.note, { color: theme.muted }]}>\n This takes a minute or two. You can keep editing; the address appears here when it is live.\n </Text>\n </View>\n );\n } else {\n body = (\n <View style={styles.block}>\n {live ? (\n <View style={[styles.liveCard, { backgroundColor: theme.goodSoft }]} testID=\"webbuilder-live\">\n <MaterialCommunityIcons name=\"earth\" size={20} color={theme.good} />\n <Text style={[styles.liveHost, { color: theme.good }]} numberOfLines={1}>\n {displayHost(live)}\n </Text>\n </View>\n ) : null}\n {live ? (\n <View style={styles.row}>\n <SecondaryButton\n label=\"Open\"\n icon=\"open-in-new\"\n onPress={() => {\n Linking.openURL(live).catch(() => undefined);\n }}\n theme={theme}\n />\n <SecondaryButton\n label=\"Share\"\n icon=\"share-variant-outline\"\n onPress={() => {\n Share.share({ message: live, url: live }).catch(() => undefined);\n }}\n theme={theme}\n />\n </View>\n ) : null}\n <Text style={[styles.label, { color: theme.muted }]}>\n {live ? 'Publish the latest version' : 'Site address'}\n </Text>\n <View\n style={[\n styles.field,\n { backgroundColor: theme.chip, borderColor: valid ? theme.border : theme.crit },\n ]}\n >\n <TextInput\n value={name}\n onChangeText={(text) =>\n setName(\n text\n .toLowerCase()\n .replace(/[^a-z0-9-]/g, '')\n .slice(0, 58),\n )\n }\n autoCapitalize=\"none\"\n autoCorrect={false}\n placeholder=\"my-site\"\n placeholderTextColor={theme.faint}\n style={[styles.input, { color: theme.ink }]}\n accessibilityLabel=\"Site name\"\n testID=\"webbuilder-publish-name\"\n />\n <Text style={[styles.suffix, { color: theme.muted }]}>.yarntra.com</Text>\n </View>\n {!valid && name ? (\n <Text style={[styles.help, { color: theme.crit }]}>\n Letters, numbers and dashes; it cannot start or end with a dash.\n </Text>\n ) : null}\n {error ? <Text style={[styles.help, { color: theme.crit }]}>{error}</Text> : null}\n <PrimaryButton\n label={live ? 'Publish update' : 'Publish'}\n icon=\"rocket-launch-outline\"\n onPress={() => {\n publish().catch(() => undefined);\n }}\n theme={theme}\n busy={starting}\n disabled={!valid || !onPublish}\n testID=\"webbuilder-publish-submit\"\n />\n </View>\n );\n }\n\n return (\n <Sheet visible={visible} title=\"Publish\" onClose={onClose} theme={theme} testID=\"webbuilder-publish-sheet\">\n {body}\n </Sheet>\n );\n}\n\nconst styles = StyleSheet.create({\n block: { gap: 12, paddingTop: 4 },\n row: { flexDirection: 'row', gap: 10 },\n liveCard: { flexDirection: 'row', alignItems: 'center', gap: 10, padding: 14, borderRadius: 12 },\n liveHost: { flex: 1, fontSize: 15, fontWeight: '700' },\n label: { fontSize: 13, fontWeight: '600', marginTop: 4 },\n field: {\n flexDirection: 'row',\n alignItems: 'center',\n borderRadius: 12,\n borderWidth: StyleSheet.hairlineWidth,\n paddingHorizontal: 14,\n minHeight: 48,\n },\n input: { flex: 1, fontSize: 16, paddingVertical: 10 },\n suffix: { fontSize: 15 },\n help: { fontSize: 13 },\n note: { fontSize: 14, lineHeight: 20, paddingVertical: 8 },\n});\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PublishSheet.js","sources":["../../../../src/features/webbuilder/components/PublishSheet.tsx"],"sourcesContent":["/**\n * Publish - the web Publish menu on a sheet: the status line with the live link\n * (copy, open), Publish / Update site, Your domain (add it, the DNS records, verify),\n * Review site (security, SEO and speed checks, each with Fix with AI), Export\n * (download the code, or host it elsewhere) and Unpublish. The first publish asks\n * for the site's name (`<name>.yarntra.com`); a live site republishes in one tap.\n * The live address arrives later on a chat post, so it says \"Publishing…\" until then.\n */\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport {\n ActivityIndicator,\n Alert,\n Clipboard,\n Linking,\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 { displayHost, isValidPublishSlug, publishSlug } from '../buildFragments';\nimport { EXPORT_TARGETS, type ExportTarget } from '../exportCode';\nimport {\n AI_BUSY_TEXT,\n attachDomainParams,\n CUSTOM_DOMAIN_ACTION,\n dnsStateLabel,\n dnsStateText,\n domainStatusParams,\n domainSteps,\n findingsForTab,\n formatTtl,\n isNotAttachedError,\n isValidDomain,\n normalizeDomain,\n parseDomainDns,\n parsePrePublishReport,\n plainActionError,\n projectNameOfLiveUrl,\n publishKind,\n publishPrimaryLabel,\n publishStatusLine,\n recordHostLabel,\n recordValueLabel,\n REGISTRAR_GUIDES,\n removeDomainParams,\n reviewFindings,\n scoreBadges,\n SEVERITY_LABEL,\n TAB_EMPTY,\n UNPUBLISH_ACTION,\n unpublishParams,\n type DomainDnsView,\n type PrePublishReport,\n type RegistrarId,\n type ReviewFinding,\n type ReviewTab,\n type StatusTone,\n} from '../publishTools';\nimport type { WebBuilderBuild, WebBuilderPublishResult, WebBuilderPublishTools } from '../types';\nimport type { WebBuilderTheme } from '../webbuilderTheme';\nimport { PrimaryButton, SecondaryButton, Sheet, type IconName } from './ui';\n\ntype StorageLike = {\n getItem: (key: string) => Promise<string | null>;\n setItem: (key: string, value: string) => Promise<void>;\n removeItem: (key: string) => Promise<void>;\n};\n\nlet AsyncStorage: StorageLike | null = null;\ntry {\n // eslint-disable-next-line @typescript-eslint/no-var-requires, global-require\n AsyncStorage = require('@react-native-async-storage/async-storage').default ?? null;\n} catch {\n AsyncStorage = null;\n}\n\n/** The domain connected here, per project (the web keeps it in localStorage the same way). */\nconst domainKey = (projectName: string) => `yantra.webbuilder.customDomain.${projectName}`;\n\nconst DOMAIN_TIMEOUT_MS = 60_000;\nconst UNPUBLISH_TIMEOUT_MS = 120_000;\n\ntype Page = 'menu' | 'name' | 'domain' | 'review';\n\nfunction toneColors(tone: StatusTone, theme: WebBuilderTheme): { bg: string; ink: string } {\n if (tone === 'success') return { bg: theme.goodSoft, ink: theme.good };\n if (tone === 'warning') return { bg: theme.warnSoft, ink: theme.warn };\n if (tone === 'info') return { bg: theme.infoSoft, ink: theme.info };\n return { bg: theme.chip, ink: theme.muted };\n}\n\nfunction StatusPill({ tone, text, theme }: { tone: StatusTone; text: string; theme: WebBuilderTheme }) {\n const c = toneColors(tone, theme);\n return (\n <View style={[styles.pill, { backgroundColor: c.bg }]} testID=\"webbuilder-publish-status\">\n <View style={[styles.pillDot, { backgroundColor: c.ink }]} />\n <Text style={[styles.pillText, { color: c.ink }]}>{text}</Text>\n </View>\n );\n}\n\nfunction SectionTitle({ children, theme }: { children: string; theme: WebBuilderTheme }) {\n return <Text style={[styles.section, { color: theme.muted }]}>{children}</Text>;\n}\n\nfunction MenuRow({\n icon,\n label,\n hint,\n onPress,\n theme,\n trailing = 'chevron-right',\n disabled = false,\n danger = false,\n testID,\n}: {\n icon: IconName;\n label: string;\n hint?: string;\n onPress: () => void;\n theme: WebBuilderTheme;\n trailing?: IconName | null;\n disabled?: boolean;\n danger?: boolean;\n testID?: string;\n}) {\n return (\n <Tap\n onPress={onPress}\n disabled={disabled}\n accessibilityRole=\"button\"\n accessibilityLabel={hint ? `${label}. ${hint}` : label}\n style={[styles.row, disabled && styles.disabled]}\n pressedStyle={DIM}\n testID={testID}\n >\n <MaterialCommunityIcons name={icon} size={20} color={danger ? theme.crit : theme.muted} />\n <View style={styles.rowText}>\n <Text style={[styles.rowLabel, { color: danger ? theme.crit : theme.ink }]}>{label}</Text>\n {hint ? <Text style={[styles.rowHint, { color: theme.muted }]}>{hint}</Text> : null}\n </View>\n {trailing ? <MaterialCommunityIcons name={trailing} size={20} color={theme.faint} /> : null}\n </Tap>\n );\n}\n\nfunction Divider({ theme }: { theme: WebBuilderTheme }) {\n return <View style={[styles.divider, { backgroundColor: theme.border }]} />;\n}\n\nfunction BackRow({ label, onPress, theme }: { label: string; onPress: () => void; theme: WebBuilderTheme }) {\n return (\n <Tap\n onPress={onPress}\n accessibilityRole=\"button\"\n accessibilityLabel={`Back to ${label}`}\n style={styles.back}\n pressedStyle={DIM}\n >\n <MaterialCommunityIcons name=\"chevron-left\" size={22} color={theme.ink} />\n <Text style={[styles.backText, { color: theme.ink }]}>{label}</Text>\n </Tap>\n );\n}\n\nfunction copy(text: string) {\n try {\n Clipboard.setString(text);\n } catch {\n // Copy is a convenience; the text stays on screen.\n }\n}\n\n// ── Your domain ──────────────────────────────────────────────────────────\n\nfunction StepList({\n view,\n attached,\n theme,\n}: {\n view: DomainDnsView | null;\n attached: boolean;\n theme: WebBuilderTheme;\n}) {\n const steps = domainSteps({ attached, state: view?.state, autoConfigured: view?.autoConfigured });\n return (\n <View style={styles.steps}>\n {steps.map((s, i) => {\n const done = s.status === 'done';\n const failed = s.status === 'failed';\n const active = s.status === 'active';\n let ring = theme.border;\n if (done) ring = theme.good;\n else if (failed) ring = theme.crit;\n else if (active) ring = theme.accent;\n return (\n <View key={s.id} style={styles.step}>\n <View\n style={[\n styles.stepDot,\n { borderColor: ring, backgroundColor: done ? theme.good : 'transparent' },\n ]}\n >\n {done ? (\n <MaterialCommunityIcons name=\"check\" size={14} color={theme.card} />\n ) : (\n <Text style={[styles.stepNum, { color: failed ? theme.crit : theme.muted }]}>\n {i + 1}\n </Text>\n )}\n </View>\n <Text\n style={[styles.stepLabel, { color: active || done ? theme.ink : theme.muted }]}\n numberOfLines={2}\n >\n {s.label}\n </Text>\n </View>\n );\n })}\n </View>\n );\n}\n\nfunction RecordCard({\n row,\n domain,\n theme,\n}: {\n row: DomainDnsView['records'][number];\n domain: string;\n theme: WebBuilderTheme;\n}) {\n const ttl = formatTtl(row.ttl);\n return (\n <View style={[styles.record, { borderColor: theme.border, backgroundColor: theme.screen }]}>\n <View style={styles.recordHead}>\n <Text style={[styles.recordType, { color: theme.ink, backgroundColor: theme.chip }]}>{row.type}</Text>\n {row.state ? (\n <Text style={[styles.rowHint, { color: row.state === 'active' ? theme.good : theme.muted }]}>\n {dnsStateLabel(row.state)}\n </Text>\n ) : null}\n {ttl ? <Text style={[styles.rowHint, { color: theme.muted }]}>TTL {ttl}</Text> : null}\n </View>\n {[\n { label: recordHostLabel(row.name, domain), value: row.name },\n { label: recordValueLabel(row.type), value: row.value },\n ].map((f) => (\n <View key={f.label} style={styles.recordField}>\n <View style={styles.rowText}>\n <Text style={[styles.rowHint, { color: theme.muted }]}>{f.label}</Text>\n <Text style={[styles.mono, { color: theme.ink }]} selectable>\n {f.value}\n </Text>\n </View>\n <Tap\n onPress={() => copy(f.value)}\n accessibilityRole=\"button\"\n accessibilityLabel={`Copy ${f.label}`}\n hitSlop={8}\n pressedStyle={DIM}\n >\n <MaterialCommunityIcons name=\"content-copy\" size={18} color={theme.muted} />\n </Tap>\n </View>\n ))}\n {row.note ? <Text style={[styles.rowHint, { color: theme.muted }]}>{row.note}</Text> : null}\n </View>\n );\n}\n\nfunction DomainPage({\n build,\n live,\n projectName,\n tools,\n aiBusy,\n onPublishWithDomain,\n onBack,\n theme,\n}: {\n build: WebBuilderBuild;\n live: boolean;\n projectName: string;\n tools: WebBuilderPublishTools;\n aiBusy: boolean;\n onPublishWithDomain: (domain: string) => void;\n onBack: () => void;\n theme: WebBuilderTheme;\n}) {\n const [input, setInput] = useState('');\n const [domain, setDomain] = useState<string | null>(null);\n const [view, setView] = useState<DomainDnsView | null>(null);\n const [busy, setBusy] = useState<'attach' | 'status' | 'remove' | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [guide, setGuide] = useState<RegistrarId | null>(null);\n\n const status = useCallback(\n async (d: string, retry = false) => {\n setBusy('status');\n setError(null);\n const r = await tools.run(\n build,\n CUSTOM_DOMAIN_ACTION,\n domainStatusParams(projectName, d, retry),\n DOMAIN_TIMEOUT_MS,\n );\n setBusy(null);\n if (r.successful) {\n setView(parseDomainDns(r.data, d));\n return;\n }\n if (isNotAttachedError(r.error, r.data)) {\n // Remembered here but no longer on the project: offer to connect it again.\n setDomain(null);\n setView(null);\n setInput(d);\n AsyncStorage?.removeItem(domainKey(projectName)).catch(() => undefined);\n return;\n }\n setError(plainActionError(r.error, \"Couldn't read the domain's status. Try again.\"));\n },\n [build, projectName, tools],\n );\n\n // The domain connected earlier: its records and status straight away.\n useEffect(() => {\n if (!projectName || !live) return;\n let alive = true;\n AsyncStorage?.getItem(domainKey(projectName))\n .then((stored) => {\n const d = normalizeDomain(stored || '');\n if (!alive || !d) return;\n setDomain(d);\n status(d).catch(() => undefined);\n })\n .catch(() => undefined);\n return () => {\n alive = false;\n };\n }, [projectName, live, status]);\n\n const typed = normalizeDomain(input);\n const valid = isValidDomain(typed);\n\n const attach = async () => {\n if (!valid) return;\n if (!live) {\n onPublishWithDomain(typed);\n return;\n }\n setBusy('attach');\n setError(null);\n const r = await tools.run(\n build,\n CUSTOM_DOMAIN_ACTION,\n attachDomainParams(projectName, typed),\n DOMAIN_TIMEOUT_MS,\n );\n setBusy(null);\n if (!r.successful) {\n setError(plainActionError(r.error, \"Couldn't add the domain. Check the spelling, then try again.\"));\n return;\n }\n setDomain(typed);\n setView(parseDomainDns(r.data, typed));\n AsyncStorage?.setItem(domainKey(projectName), typed).catch(() => undefined);\n };\n\n const remove = () => {\n if (!domain) return;\n Alert.alert(`Remove ${domain}?`, 'The site stays live on its own address.', [\n { text: 'Cancel', style: 'cancel' },\n {\n text: 'Remove',\n style: 'destructive',\n onPress: () => {\n setBusy('remove');\n tools\n .run(build, CUSTOM_DOMAIN_ACTION, removeDomainParams(projectName, domain), DOMAIN_TIMEOUT_MS)\n .then((r) => {\n if (!r.successful) {\n setError(plainActionError(r.error, \"Couldn't remove the domain. Try again.\"));\n return;\n }\n AsyncStorage?.removeItem(domainKey(projectName)).catch(() => undefined);\n setDomain(null);\n setView(null);\n setInput('');\n })\n .catch(() => setError(\"Couldn't remove the domain. Try again.\"))\n .finally(() => setBusy(null));\n },\n },\n ]);\n };\n\n const attached = Boolean(domain);\n return (\n <ScrollView style={styles.page} contentContainerStyle={styles.pageBody} keyboardShouldPersistTaps=\"handled\">\n <BackRow label=\"Publish\" onPress={onBack} theme={theme} />\n <StepList view={view} attached={attached} theme={theme} />\n {attached && domain ? (\n <View style={styles.block}>\n <View style={styles.domainHead}>\n <MaterialCommunityIcons name=\"web\" size={20} color={theme.ink} />\n <Text style={[styles.domainName, { color: theme.ink }]} numberOfLines={1}>\n {domain}\n </Text>\n {busy === 'status' ? <ActivityIndicator size=\"small\" color={theme.accent} /> : null}\n </View>\n {view ? (\n <Text\n style={[\n styles.note,\n { color: view.state === 'error' ? theme.crit : theme.muted },\n view.state === 'active' && { color: theme.good },\n ]}\n >\n {view.errorMessage || dnsStateText(view.state)}\n </Text>\n ) : null}\n {view?.suggestion ? (\n <Text style={[styles.note, { color: theme.muted }]}>\n {view.suggestion.why || 'Connect this address instead:'} {view.suggestion.domain}\n </Text>\n ) : null}\n {view?.records.map((row) => (\n <RecordCard\n key={`${row.type}-${row.name}-${row.value}`}\n row={row}\n domain={domain}\n theme={theme}\n />\n ))}\n {view?.records.length ? (\n <View style={styles.block}>\n <Text style={[styles.label, { color: theme.muted }]}>Where you bought the domain</Text>\n <View style={styles.chips}>\n {REGISTRAR_GUIDES.map((g) => (\n <Tap\n key={g.id}\n onPress={() => setGuide(guide === g.id ? null : g.id)}\n accessibilityRole=\"button\"\n accessibilityState={{ selected: guide === g.id }}\n style={[\n styles.chip,\n {\n borderColor: guide === g.id ? theme.accent : theme.border,\n backgroundColor: guide === g.id ? theme.accentSoft : theme.card,\n },\n ]}\n pressedStyle={DIM}\n >\n <Text style={[styles.chipText, { color: theme.ink }]}>{g.label}</Text>\n </Tap>\n ))}\n </View>\n {guide\n ? REGISTRAR_GUIDES.find((g) => g.id === guide)?.steps.map((step, i) => (\n <Text key={step} style={[styles.note, { color: theme.ink }]}>\n {i + 1}. {step}\n </Text>\n ))\n : null}\n </View>\n ) : null}\n {view?.state !== 'active' ? (\n <PrimaryButton\n label=\"Check again\"\n icon=\"refresh\"\n onPress={() => {\n status(domain, true).catch(() => undefined);\n }}\n theme={theme}\n busy={busy === 'status'}\n />\n ) : null}\n <SecondaryButton label=\"Remove domain\" icon=\"trash-can-outline\" onPress={remove} theme={theme} />\n </View>\n ) : (\n <View style={styles.block}>\n <Text style={[styles.label, { color: theme.ink }]}>Domain you own</Text>\n <TextInput\n value={input}\n onChangeText={setInput}\n placeholder=\"www.yourname.com\"\n placeholderTextColor={theme.faint}\n autoCapitalize=\"none\"\n autoCorrect={false}\n keyboardType=\"url\"\n returnKeyType=\"done\"\n onSubmitEditing={() => {\n attach().catch(() => undefined);\n }}\n style={[\n styles.input,\n styles.field,\n { color: theme.ink, borderColor: input && !valid ? theme.crit : theme.accent },\n ]}\n accessibilityLabel=\"Domain you own\"\n testID=\"webbuilder-domain-input\"\n />\n <Text style={[styles.help, { color: theme.muted }]}>\n {live\n ? 'We add it to your site and show the DNS record to add where you bought it.'\n : 'Your site needs to be published first: we publish it with this domain.'}\n </Text>\n {aiBusy && !live ? (\n <Text style={[styles.help, { color: theme.muted }]}>{AI_BUSY_TEXT}, then publish.</Text>\n ) : null}\n <PrimaryButton\n label={live ? 'Add domain' : 'Publish with this domain'}\n onPress={() => {\n attach().catch(() => undefined);\n }}\n theme={theme}\n busy={busy === 'attach'}\n disabled={!valid || (!live && aiBusy)}\n testID=\"webbuilder-domain-submit\"\n />\n </View>\n )}\n {error ? <Text style={[styles.help, { color: theme.crit }]}>{error}</Text> : null}\n </ScrollView>\n );\n}\n\n// ── Review site ──────────────────────────────────────────────────────────\n\nconst TABS: Array<{ id: ReviewTab; label: string; icon: IconName }> = [\n { id: 'security', label: 'Security', icon: 'shield-check-outline' },\n { id: 'seo', label: 'SEO', icon: 'magnify' },\n { id: 'speed', label: 'Speed', icon: 'speedometer' },\n];\n\nfunction FindingCard({\n finding,\n onFix,\n fixDisabled,\n theme,\n}: {\n finding: ReviewFinding;\n onFix?: (text: string) => void;\n fixDisabled: boolean;\n theme: WebBuilderTheme;\n}) {\n const problem = finding.status === 'problem';\n let icon: IconName = 'minus-circle-outline';\n let tint = theme.muted;\n if (finding.status === 'ok') {\n icon = 'check-circle-outline';\n tint = theme.good;\n } else if (problem) {\n icon = finding.severity === 'critical' ? 'alert-octagon-outline' : 'alert-outline';\n tint = finding.severity === 'critical' ? theme.crit : theme.warn;\n }\n return (\n <View style={[styles.finding, { borderColor: theme.border }]}>\n <View style={styles.findingHead}>\n <MaterialCommunityIcons name={icon} size={20} color={tint} />\n <Text style={[styles.rowLabel, styles.rowText, { color: theme.ink }]}>{finding.title}</Text>\n {problem && finding.severity ? (\n <Text style={[styles.rowHint, { color: tint }]}>{SEVERITY_LABEL[finding.severity]}</Text>\n ) : null}\n </View>\n {finding.detail ? <Text style={[styles.note, { color: theme.muted }]}>{finding.detail}</Text> : null}\n {problem && finding.why ? <Text style={[styles.note, { color: theme.muted }]}>{finding.why}</Text> : null}\n {finding.fixText && onFix ? (\n <SecondaryButton\n label=\"Fix with AI\"\n icon=\"auto-fix\"\n onPress={() => {\n if (!fixDisabled && finding.fixText) onFix(finding.fixText);\n }}\n theme={theme}\n />\n ) : null}\n </View>\n );\n}\n\nfunction ReviewPage({\n build,\n tools,\n aiBusy,\n onFix,\n onPublish,\n onBack,\n theme,\n}: {\n build: WebBuilderBuild;\n tools: WebBuilderPublishTools;\n aiBusy: boolean;\n onFix?: (text: string) => void;\n onPublish: () => void;\n onBack: () => void;\n theme: WebBuilderTheme;\n}) {\n const [tab, setTab] = useState<ReviewTab>('security');\n const [report, setReport] = useState<PrePublishReport | null>(null);\n const [loading, setLoading] = useState(true);\n const [nonce, setNonce] = useState(0);\n useEffect(() => {\n if (!tools.review) {\n setLoading(false);\n return undefined;\n }\n let alive = true;\n setLoading(true);\n tools\n .review(build)\n .then((raw) => {\n if (alive) setReport(parsePrePublishReport(raw));\n })\n .catch(() => {\n if (alive) setReport(null);\n })\n .finally(() => {\n if (alive) setLoading(false);\n });\n return () => {\n alive = false;\n };\n }, [build, tools, nonce]);\n\n const findings = useMemo(() => reviewFindings(report), [report]);\n const shown = findingsForTab(findings, tab);\n const badges = tab === 'speed' ? scoreBadges(report) : [];\n const empty = TAB_EMPTY[tab];\n const toneOf = (t: 'good' | 'ok' | 'poor') => {\n if (t === 'good') return theme.good;\n return t === 'ok' ? theme.warn : theme.crit;\n };\n\n return (\n <View style={styles.page}>\n <View style={styles.reviewHead}>\n <BackRow label=\"Publish\" onPress={onBack} theme={theme} />\n <Tap\n onPress={() => setNonce((n) => n + 1)}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Run the checks again\"\n hitSlop={8}\n pressedStyle={DIM}\n >\n <MaterialCommunityIcons name=\"refresh\" size={20} color={theme.muted} />\n </Tap>\n </View>\n <View style={[styles.tabs, { borderBottomColor: theme.border }]}>\n {TABS.map((t) => (\n <Tap\n key={t.id}\n onPress={() => setTab(t.id)}\n accessibilityRole=\"tab\"\n accessibilityState={{ selected: tab === t.id }}\n style={[styles.tab, tab === t.id && { backgroundColor: theme.chip }]}\n pressedStyle={DIM}\n testID={`webbuilder-review-${t.id}`}\n >\n <MaterialCommunityIcons\n name={t.icon}\n size={16}\n color={tab === t.id ? theme.ink : theme.muted}\n />\n <Text style={[styles.tabText, { color: tab === t.id ? theme.ink : theme.muted }]}>\n {t.label}\n </Text>\n </Tap>\n ))}\n </View>\n <ScrollView style={styles.page} contentContainerStyle={styles.pageBody}>\n {loading ? <ActivityIndicator color={theme.accent} style={styles.spin} /> : null}\n {!loading && badges.length ? (\n <View style={styles.badges}>\n {badges.map((b) => (\n <View key={b.key} style={[styles.badge, { borderColor: theme.border }]}>\n <Text style={[styles.badgeValue, { color: toneOf(b.tone) }]}>{b.value}</Text>\n <Text style={[styles.rowHint, { color: theme.muted }]}>{b.label}</Text>\n </View>\n ))}\n </View>\n ) : null}\n {!loading && !shown.length && !badges.length ? (\n <View style={styles.empty}>\n <MaterialCommunityIcons name=\"shield-check-outline\" size={26} color={theme.muted} />\n <Text style={[styles.emptyTitle, { color: theme.ink }]}>{empty.title}</Text>\n <Text style={[styles.note, styles.center, { color: theme.muted }]}>{empty.body}</Text>\n </View>\n ) : null}\n {!loading\n ? shown.map((f) => (\n <FindingCard key={f.key} finding={f} onFix={onFix} fixDisabled={aiBusy} theme={theme} />\n ))\n : null}\n {aiBusy && shown.some((f) => f.fixText) ? (\n <Text style={[styles.help, { color: theme.muted }]}>{AI_BUSY_TEXT}, then fix.</Text>\n ) : null}\n </ScrollView>\n <View style={[styles.footer, { borderTopColor: theme.border }]}>\n <PrimaryButton label=\"Publish…\" onPress={onPublish} theme={theme} disabled={aiBusy} />\n </View>\n </View>\n );\n}\n\n// ── The sheet ────────────────────────────────────────────────────────────\n\nexport function PublishSheet({\n visible,\n build,\n publishing,\n onPublish,\n onClose,\n theme,\n liveUrl,\n aiBusy = false,\n tools,\n onDownloadCode,\n onExport,\n onOwnCloudflare,\n onFixWithAi,\n onUnpublished,\n}: {\n visible: boolean;\n build: WebBuilderBuild | null;\n /** A deploy is running on this site (started here, or seen on the chat). */\n publishing: boolean;\n onPublish?: (\n build: WebBuilderBuild,\n projectName: string,\n customDomain?: string,\n ) => Promise<WebBuilderPublishResult>;\n onClose: () => void;\n theme: WebBuilderTheme;\n /** The site's live address (any build's), when it is on the internet. */\n liveUrl?: string | null;\n /** An AI turn is running: publishing and fixes wait for it. */\n aiBusy?: boolean;\n /** Domain, Unpublish and Review calls; without them those rows are hidden. */\n tools?: WebBuilderPublishTools;\n onDownloadCode?: () => void;\n onExport?: (target: ExportTarget) => void;\n onOwnCloudflare?: () => void;\n onFixWithAi?: (text: string) => void;\n /** The site was taken offline here. */\n onUnpublished?: () => void;\n}) {\n const [page, setPage] = useState<Page>('menu');\n const [name, setName] = useState('');\n const [pendingDomain, setPendingDomain] = useState<string | null>(null);\n const [starting, setStarting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [exportOpen, setExportOpen] = useState(false);\n const [unpublishing, setUnpublishing] = useState(false);\n const [offline, setOffline] = useState(false);\n\n const live = offline ? null : liveUrl || build?.liveUrl || null;\n const kind = publishKind({ liveUrl: live, buildLive: Boolean(build?.liveUrl) });\n const status = publishStatusLine(kind, publishing);\n const liveName = projectNameOfLiveUrl(live);\n const projectName = liveName || name;\n\n useEffect(() => {\n if (!visible) return;\n setPage('menu');\n setError(null);\n setExportOpen(false);\n setPendingDomain(null);\n }, [visible]);\n useEffect(() => {\n if (!build) return;\n setName((prev) => prev || liveName || publishSlug(build.title));\n }, [build, liveName]);\n useEffect(() => setOffline(false), [liveUrl]);\n\n const valid = isValidPublishSlug(name);\n const blocked = aiBusy && !publishing ? `${AI_BUSY_TEXT}, then publish.` : null;\n\n const start = async (projectNameToUse: string, customDomain?: string) => {\n if (!build || !onPublish) return;\n setStarting(true);\n setError(null);\n try {\n const result = await onPublish(build, projectNameToUse, customDomain);\n if (!result.ok) setError(result.message || \"Publishing didn't start. Try again.\");\n else setPage('menu');\n } catch {\n setError(\"Publishing didn't start. Check your connection and try again.\");\n } finally {\n setStarting(false);\n }\n };\n\n // A live site keeps its address: updating it is one tap, without asking for the name again.\n const primary = () => {\n if (kind !== 'never' && liveName) {\n start(liveName).catch(() => undefined);\n return;\n }\n setPage('name');\n };\n\n const unpublish = () => {\n if (!build || !tools || !liveName) return;\n Alert.alert('Unpublish this site?', `${displayHost(live)} stops working until you publish again.`, [\n { text: 'Cancel', style: 'cancel' },\n {\n text: 'Unpublish',\n style: 'destructive',\n onPress: () => {\n setUnpublishing(true);\n setError(null);\n AsyncStorage?.getItem(domainKey(liveName))\n .catch(() => null)\n .then((domain) =>\n tools.run(build, UNPUBLISH_ACTION, unpublishParams(liveName, domain), UNPUBLISH_TIMEOUT_MS),\n )\n .then((r) => {\n const data =\n r.data && typeof r.data === 'object' ? (r.data as Record<string, unknown>) : {};\n if (r.successful && data.unpublished !== false) {\n setOffline(true);\n onUnpublished?.();\n } else {\n setError(plainActionError(r.error, \"Couldn't take the site offline. Try again.\"));\n }\n })\n .catch(() => setError(\"Couldn't take the site offline. Try again.\"))\n .finally(() => setUnpublishing(false));\n },\n },\n ]);\n };\n\n let body: React.ReactNode;\n if (!build?.sandboxId) {\n body = (\n <Text style={[styles.note, { color: theme.muted }]}>\n There is nothing to publish yet. Build the site first, then publish it here.\n </Text>\n );\n } else if (page === 'domain' && tools) {\n body = (\n <DomainPage\n build={build}\n live={kind !== 'never'}\n projectName={projectName}\n tools={tools}\n aiBusy={aiBusy}\n onPublishWithDomain={(domain) => {\n setPendingDomain(domain);\n setPage('name');\n }}\n onBack={() => setPage('menu')}\n theme={theme}\n />\n );\n } else if (page === 'review' && tools) {\n body = (\n <ReviewPage\n build={build}\n tools={tools}\n aiBusy={aiBusy}\n onFix={\n onFixWithAi\n ? (text) => {\n onClose();\n onFixWithAi(text);\n }\n : undefined\n }\n onPublish={() => setPage('menu')}\n onBack={() => setPage('menu')}\n theme={theme}\n />\n );\n } else if (page === 'name') {\n body = (\n <View style={styles.block}>\n <BackRow label=\"Publish\" onPress={() => setPage('menu')} theme={theme} />\n <Text style={[styles.label, { color: theme.muted }]}>Site address</Text>\n <View\n style={[\n styles.field,\n styles.nameField,\n { backgroundColor: theme.chip, borderColor: valid ? theme.border : theme.crit },\n ]}\n >\n <TextInput\n value={name}\n onChangeText={(text) =>\n setName(\n text\n .toLowerCase()\n .replace(/[^a-z0-9-]/g, '')\n .slice(0, 58),\n )\n }\n autoCapitalize=\"none\"\n autoCorrect={false}\n placeholder=\"my-site\"\n placeholderTextColor={theme.faint}\n style={[styles.input, { color: theme.ink }]}\n accessibilityLabel=\"Site name\"\n testID=\"webbuilder-publish-name\"\n />\n <Text style={[styles.suffix, { color: theme.muted }]}>.yarntra.com</Text>\n </View>\n {!valid && name ? (\n <Text style={[styles.help, { color: theme.crit }]}>\n Letters, numbers and dashes; it cannot start or end with a dash.\n </Text>\n ) : null}\n {pendingDomain ? (\n <Text style={[styles.help, { color: theme.muted }]}>\n Published with {pendingDomain} as its domain.\n </Text>\n ) : null}\n {blocked ? <Text style={[styles.help, { color: theme.muted }]}>{blocked}</Text> : null}\n {error ? <Text style={[styles.help, { color: theme.crit }]}>{error}</Text> : null}\n <PrimaryButton\n label={pendingDomain ? 'Publish with this domain' : 'Publish'}\n icon=\"rocket-launch-outline\"\n onPress={() => {\n start(name, pendingDomain ?? undefined).catch(() => undefined);\n }}\n theme={theme}\n busy={starting}\n disabled={!valid || !onPublish || Boolean(blocked)}\n testID=\"webbuilder-publish-submit\"\n />\n </View>\n );\n } else {\n body = (\n <ScrollView style={styles.page} contentContainerStyle={styles.menuBody}>\n <View style={styles.block}>\n <StatusPill tone={status.tone} text={status.text} theme={theme} />\n {live ? (\n <View style={styles.linkRow}>\n <Tap\n onPress={() => {\n Linking.openURL(live).catch(() => undefined);\n }}\n accessibilityRole=\"link\"\n accessibilityLabel={`Open ${displayHost(live)}`}\n style={[styles.link, { borderColor: theme.border }]}\n pressedStyle={DIM}\n testID=\"webbuilder-live\"\n >\n <Text style={[styles.linkText, { color: theme.accent }]} numberOfLines={1}>\n {displayHost(live)}\n </Text>\n </Tap>\n <Tap\n onPress={() => copy(live)}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Copy link\"\n style={[styles.linkBtn, { borderColor: theme.border }]}\n pressedStyle={DIM}\n >\n <MaterialCommunityIcons name=\"content-copy\" size={18} color={theme.muted} />\n </Tap>\n <Tap\n onPress={() => {\n Linking.openURL(live).catch(() => undefined);\n }}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Open site\"\n style={[styles.linkBtn, { borderColor: theme.border }]}\n pressedStyle={DIM}\n >\n <MaterialCommunityIcons name=\"open-in-new\" size={18} color={theme.muted} />\n </Tap>\n </View>\n ) : (\n <Text style={[styles.note, { color: theme.muted }]}>\n Put this site on the internet with its own address.\n </Text>\n )}\n {publishing && !starting ? (\n <View testID=\"webbuilder-publishing\">\n <PrimaryButton label=\"Publishing…\" onPress={() => undefined} theme={theme} busy />\n <Text style={[styles.help, { color: theme.muted }]}>\n This takes a minute or two. You can keep editing; the address appears here when it is\n live.\n </Text>\n </View>\n ) : (\n <PrimaryButton\n label={publishPrimaryLabel(kind)}\n icon=\"rocket-launch-outline\"\n onPress={primary}\n theme={theme}\n busy={starting}\n disabled={!onPublish || Boolean(blocked)}\n testID=\"webbuilder-publish-primary\"\n />\n )}\n {blocked ? <Text style={[styles.help, { color: theme.muted }]}>{blocked}</Text> : null}\n {error ? <Text style={[styles.help, { color: theme.crit }]}>{error}</Text> : null}\n </View>\n\n {tools ? (\n <>\n <Divider theme={theme} />\n <SectionTitle theme={theme}>YOUR DOMAIN</SectionTitle>\n <MenuRow\n icon=\"web\"\n label=\"Add your own domain\"\n hint=\"Use an address like www.yourname.com\"\n onPress={() => setPage('domain')}\n theme={theme}\n testID=\"webbuilder-publish-domains\"\n />\n <Divider theme={theme} />\n <MenuRow\n icon=\"clipboard-check-outline\"\n label=\"Review site\"\n hint=\"Security, SEO and speed\"\n onPress={() => setPage('review')}\n theme={theme}\n trailing={null}\n testID=\"webbuilder-publish-review\"\n />\n </>\n ) : null}\n\n {onDownloadCode || onExport ? (\n <>\n <Divider theme={theme} />\n <MenuRow\n icon=\"package-variant\"\n label=\"Export\"\n hint=\"Download the code or host it elsewhere\"\n onPress={() => setExportOpen((v) => !v)}\n theme={theme}\n trailing={exportOpen ? 'chevron-down' : 'chevron-right'}\n testID=\"webbuilder-publish-export\"\n />\n {exportOpen ? (\n <View style={[styles.sub, { borderLeftColor: theme.border }]}>\n {onDownloadCode ? (\n <MenuRow\n icon=\"download-outline\"\n label=\"Download code\"\n hint=\"ZIP + Dockerfile, ready to run\"\n onPress={() => {\n onClose();\n onDownloadCode();\n }}\n theme={theme}\n trailing={null}\n />\n ) : null}\n {onExport\n ? EXPORT_TARGETS.map((t) => (\n <MenuRow\n key={t.target}\n icon={\n t.target === 'fly'\n ? 'package-variant-closed'\n : 'rocket-launch-outline'\n }\n label={t.label}\n hint={t.hint}\n disabled={aiBusy}\n onPress={() => {\n onClose();\n onExport(t.target);\n }}\n theme={theme}\n trailing={null}\n />\n ))\n : null}\n {onOwnCloudflare ? (\n <MenuRow\n icon=\"cloud-outline\"\n label=\"Publish to my Cloudflare\"\n hint=\"With your own Cloudflare account\"\n disabled={aiBusy}\n onPress={() => {\n onClose();\n onOwnCloudflare();\n }}\n theme={theme}\n trailing={null}\n testID=\"webbuilder-export-own-cloudflare\"\n />\n ) : null}\n </View>\n ) : null}\n </>\n ) : null}\n\n {live && tools && liveName ? (\n <>\n <Divider theme={theme} />\n <MenuRow\n icon=\"cloud-off-outline\"\n label={unpublishing ? 'Unpublishing…' : 'Unpublish'}\n onPress={unpublish}\n disabled={unpublishing}\n danger\n theme={theme}\n trailing={null}\n testID=\"webbuilder-publish-unpublish\"\n />\n </>\n ) : null}\n </ScrollView>\n );\n }\n\n let title = 'Publish';\n if (page === 'domain') title = 'Your domain';\n else if (page === 'review') title = 'Review site';\n return (\n <Sheet visible={visible} title={title} onClose={onClose} theme={theme} testID=\"webbuilder-publish-sheet\">\n {body}\n </Sheet>\n );\n}\n\nconst styles = StyleSheet.create({\n page: { flexGrow: 0 },\n pageBody: { gap: 12, paddingBottom: 12 },\n menuBody: { paddingBottom: 12 },\n block: { gap: 12, paddingTop: 4 },\n pill: {\n flexDirection: 'row',\n alignItems: 'center',\n alignSelf: 'flex-start',\n gap: 6,\n paddingHorizontal: 10,\n paddingVertical: 4,\n borderRadius: 999,\n },\n pillDot: { width: 6, height: 6, borderRadius: 3 },\n pillText: { fontSize: 13, fontWeight: '600' },\n linkRow: { flexDirection: 'row', alignItems: 'center', gap: 8 },\n link: {\n flex: 1,\n borderWidth: StyleSheet.hairlineWidth,\n borderRadius: 10,\n paddingHorizontal: 12,\n paddingVertical: 10,\n },\n linkText: { fontSize: 15, fontWeight: '600' },\n linkBtn: {\n width: 42,\n height: 42,\n borderRadius: 10,\n borderWidth: StyleSheet.hairlineWidth,\n alignItems: 'center',\n justifyContent: 'center',\n },\n section: { fontSize: 12, fontWeight: '700', letterSpacing: 0.6, paddingTop: 12, paddingBottom: 2 },\n row: { flexDirection: 'row', alignItems: 'center', gap: 12, paddingVertical: 12, minHeight: 52 },\n rowText: { flex: 1 },\n rowLabel: { fontSize: 16, fontWeight: '500' },\n rowHint: { fontSize: 13, marginTop: 2 },\n sub: { marginLeft: 10, paddingLeft: 12, borderLeftWidth: StyleSheet.hairlineWidth },\n divider: { height: StyleSheet.hairlineWidth, marginTop: 8 },\n disabled: { opacity: 0.4 },\n back: { flexDirection: 'row', alignItems: 'center', gap: 2, alignSelf: 'flex-start', paddingVertical: 4 },\n backText: { fontSize: 15, fontWeight: '600' },\n label: { fontSize: 14, fontWeight: '600', marginTop: 4 },\n field: {\n borderRadius: 12,\n borderWidth: 1.5,\n paddingHorizontal: 14,\n minHeight: 48,\n },\n nameField: { flexDirection: 'row', alignItems: 'center', borderWidth: StyleSheet.hairlineWidth },\n input: { flex: 1, fontSize: 16, paddingVertical: 10 },\n suffix: { fontSize: 15 },\n help: { fontSize: 13, lineHeight: 18 },\n note: { fontSize: 14, lineHeight: 20 },\n center: { textAlign: 'center' },\n steps: { flexDirection: 'row', gap: 10, paddingVertical: 4 },\n step: { flex: 1, flexDirection: 'row', alignItems: 'center', gap: 8 },\n stepDot: {\n width: 24,\n height: 24,\n borderRadius: 12,\n borderWidth: 1.5,\n alignItems: 'center',\n justifyContent: 'center',\n },\n stepNum: { fontSize: 12, fontWeight: '700' },\n stepLabel: { flex: 1, fontSize: 13, lineHeight: 17 },\n domainHead: { flexDirection: 'row', alignItems: 'center', gap: 8 },\n domainName: { flex: 1, fontSize: 17, fontWeight: '700' },\n record: { gap: 8, padding: 12, borderRadius: 12, borderWidth: StyleSheet.hairlineWidth },\n recordHead: { flexDirection: 'row', alignItems: 'center', gap: 10 },\n recordType: {\n fontSize: 12,\n fontWeight: '700',\n paddingHorizontal: 8,\n paddingVertical: 2,\n borderRadius: 6,\n overflow: 'hidden',\n },\n recordField: { flexDirection: 'row', alignItems: 'center', gap: 10 },\n mono: { fontSize: 14, fontFamily: 'Menlo', marginTop: 2 },\n chips: { flexDirection: 'row', flexWrap: 'wrap', gap: 8 },\n chip: { paddingHorizontal: 12, paddingVertical: 7, borderRadius: 999, borderWidth: 1 },\n chipText: { fontSize: 14, fontWeight: '500' },\n reviewHead: { flexDirection: 'row', alignItems: 'center', justifyContent: 'space-between' },\n tabs: {\n flexDirection: 'row',\n gap: 6,\n paddingVertical: 8,\n borderBottomWidth: StyleSheet.hairlineWidth,\n marginBottom: 8,\n },\n tab: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 6,\n paddingHorizontal: 12,\n paddingVertical: 8,\n borderRadius: 10,\n },\n tabText: { fontSize: 14, fontWeight: '600' },\n spin: { paddingVertical: 24 },\n empty: { alignItems: 'center', gap: 8, paddingVertical: 28, paddingHorizontal: 12 },\n emptyTitle: { fontSize: 16, fontWeight: '700', textAlign: 'center' },\n finding: { gap: 8, padding: 12, borderRadius: 12, borderWidth: StyleSheet.hairlineWidth },\n findingHead: { flexDirection: 'row', alignItems: 'center', gap: 10 },\n badges: { flexDirection: 'row', flexWrap: 'wrap', gap: 10 },\n badge: {\n minWidth: 90,\n alignItems: 'center',\n paddingVertical: 10,\n paddingHorizontal: 12,\n borderRadius: 12,\n borderWidth: StyleSheet.hairlineWidth,\n },\n badgeValue: { fontSize: 22, fontWeight: '800' },\n footer: { paddingTop: 10, borderTopWidth: StyleSheet.hairlineWidth },\n});\n"],"names":["_a"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {jsxs,jsx}from'react/jsx-runtime';import {useState}from'react';import {StyleSheet,View,Text}from'react-native';import {Image}from'expo-image';import {MaterialCommunityIcons}from'@expo/vector-icons';import {Tap,DIM}from'../../inbox/components/Tap.js';function TemplateCover({
|
|
1
|
+
import {jsxs,jsx}from'react/jsx-runtime';import {useState}from'react';import {StyleSheet,View,Text}from'react-native';import {Image}from'expo-image';import {MaterialCommunityIcons}from'@expo/vector-icons';import {Tap,DIM}from'../../inbox/components/Tap.js';import {templateName,templateCategoryLabel,usefulTemplateDescription}from'../templateCatalog.js';function TemplateCover({
|
|
2
2
|
uri,
|
|
3
3
|
theme,
|
|
4
4
|
style
|
|
@@ -17,9 +17,12 @@ function TemplateCard({
|
|
|
17
17
|
width,
|
|
18
18
|
selected = false
|
|
19
19
|
}) {
|
|
20
|
+
const name = templateName(template);
|
|
21
|
+
const category = templateCategoryLabel(template.category);
|
|
22
|
+
const description = usefulTemplateDescription(template);
|
|
20
23
|
return /* @__PURE__ */ jsxs(Tap, { onPress, accessibilityRole: "button", accessibilityState: {
|
|
21
24
|
selected
|
|
22
|
-
}, accessibilityLabel: `Use template ${
|
|
25
|
+
}, accessibilityLabel: `Use template ${name}`, style: [styles.card, {
|
|
23
26
|
width
|
|
24
27
|
}], pressedStyle: DIM, testID: `webbuilder-template-${template.id}`, children: [
|
|
25
28
|
/* @__PURE__ */ jsxs(View, { style: [styles.frame, {
|
|
@@ -32,10 +35,10 @@ function TemplateCard({
|
|
|
32
35
|
] }),
|
|
33
36
|
/* @__PURE__ */ jsx(Text, { style: [styles.title, {
|
|
34
37
|
color: theme.ink
|
|
35
|
-
}], numberOfLines: 1, children:
|
|
36
|
-
|
|
38
|
+
}], numberOfLines: 1, children: name }),
|
|
39
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.meta, {
|
|
37
40
|
color: theme.muted
|
|
38
|
-
}], numberOfLines: 1, children:
|
|
41
|
+
}], numberOfLines: 1, accessibilityElementsHidden: !description && !category, children: description || category || "\xA0" })
|
|
39
42
|
] });
|
|
40
43
|
}
|
|
41
44
|
const styles = StyleSheet.create({
|
|
@@ -49,7 +52,7 @@ const styles = StyleSheet.create({
|
|
|
49
52
|
marginBottom: 6
|
|
50
53
|
},
|
|
51
54
|
cover: {
|
|
52
|
-
aspectRatio: 16 /
|
|
55
|
+
aspectRatio: 16 / 9,
|
|
53
56
|
alignItems: "center",
|
|
54
57
|
justifyContent: "center"
|
|
55
58
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TemplateCard.js","sources":["../../../../src/features/webbuilder/components/TemplateCard.tsx"],"sourcesContent":["/**\n * One starter template: its cover, name and category - the web StudioSidebar\n * card. Tapping it hands the template to the composer (the web \"Use template\").\n */\nimport React, { useState } from 'react';\nimport { StyleSheet, Text, View, type StyleProp, type ViewStyle } from 'react-native';\nimport { Image } from 'expo-image';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { DIM, Tap } from '../../inbox/components/Tap';\nimport type { WebBuilderTemplate } from '../workflow';\nimport type { WebBuilderTheme } from '../webbuilderTheme';\n\nexport function TemplateCover({\n uri,\n theme,\n style,\n}: {\n uri?: string | null;\n theme: WebBuilderTheme;\n style?: StyleProp<ViewStyle>;\n}) {\n const [failed, setFailed] = useState(false);\n return (\n <View style={[styles.cover, { backgroundColor: theme.chip }, style]}>\n {uri && !failed ? (\n <Image\n source={{ uri }}\n style={StyleSheet.absoluteFill}\n contentFit=\"cover\"\n contentPosition=\"top\"\n cachePolicy=\"memory-disk\"\n transition={150}\n onError={() => setFailed(true)}\n accessibilityIgnoresInvertColors\n />\n ) : (\n <MaterialCommunityIcons name=\"page-layout-body\" size={26} color={theme.faint} />\n )}\n </View>\n );\n}\n\nexport function TemplateCard({\n template,\n onPress,\n theme,\n width,\n selected = false,\n}: {\n template: WebBuilderTemplate;\n onPress: () => void;\n theme: WebBuilderTheme;\n width: number;\n selected?: boolean;\n}) {\n return (\n <Tap\n onPress={onPress}\n accessibilityRole=\"button\"\n accessibilityState={{ selected }}\n accessibilityLabel={`Use template ${
|
|
1
|
+
{"version":3,"file":"TemplateCard.js","sources":["../../../../src/features/webbuilder/components/TemplateCard.tsx"],"sourcesContent":["/**\n * One starter template: its cover, name and category - the web StudioSidebar\n * card. Tapping it hands the template to the composer (the web \"Use template\").\n */\nimport React, { useState } from 'react';\nimport { StyleSheet, Text, View, type StyleProp, type ViewStyle } from 'react-native';\nimport { Image } from 'expo-image';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { DIM, Tap } from '../../inbox/components/Tap';\nimport type { WebBuilderTemplate } from '../workflow';\nimport type { WebBuilderTheme } from '../webbuilderTheme';\nimport { templateCategoryLabel, templateName, usefulTemplateDescription } from '../templateCatalog';\n\nexport function TemplateCover({\n uri,\n theme,\n style,\n}: {\n uri?: string | null;\n theme: WebBuilderTheme;\n style?: StyleProp<ViewStyle>;\n}) {\n const [failed, setFailed] = useState(false);\n return (\n <View style={[styles.cover, { backgroundColor: theme.chip }, style]}>\n {uri && !failed ? (\n <Image\n source={{ uri }}\n style={StyleSheet.absoluteFill}\n contentFit=\"cover\"\n contentPosition=\"top\"\n cachePolicy=\"memory-disk\"\n transition={150}\n onError={() => setFailed(true)}\n accessibilityIgnoresInvertColors\n />\n ) : (\n <MaterialCommunityIcons name=\"page-layout-body\" size={26} color={theme.faint} />\n )}\n </View>\n );\n}\n\nexport function TemplateCard({\n template,\n onPress,\n theme,\n width,\n selected = false,\n}: {\n template: WebBuilderTemplate;\n onPress: () => void;\n theme: WebBuilderTheme;\n width: number;\n selected?: boolean;\n}) {\n const name = templateName(template);\n const category = templateCategoryLabel(template.category);\n const description = usefulTemplateDescription(template);\n return (\n <Tap\n onPress={onPress}\n accessibilityRole=\"button\"\n accessibilityState={{ selected }}\n accessibilityLabel={`Use template ${name}`}\n style={[styles.card, { width }]}\n pressedStyle={DIM}\n testID={`webbuilder-template-${template.id}`}\n >\n <View style={[styles.frame, { borderColor: selected ? theme.accent : theme.border }]}>\n <TemplateCover uri={template.cover} theme={theme} />\n {selected ? (\n <View style={[styles.check, { backgroundColor: theme.accent }]}>\n <MaterialCommunityIcons name=\"check\" size={14} color={theme.accentInk} />\n </View>\n ) : null}\n </View>\n <Text style={[styles.title, { color: theme.ink }]} numberOfLines={1}>\n {name}\n </Text>\n {/* A blank line keeps card heights even when a template has no real description. */}\n <Text\n style={[styles.meta, { color: theme.muted }]}\n numberOfLines={1}\n accessibilityElementsHidden={!description && !category}\n >\n {description || category || '\\u00a0'}\n </Text>\n </Tap>\n );\n}\n\nconst styles = StyleSheet.create({\n card: { gap: 4 },\n frame: { borderRadius: 14, borderWidth: StyleSheet.hairlineWidth, overflow: 'hidden', marginBottom: 6 },\n cover: { aspectRatio: 16 / 9, alignItems: 'center', justifyContent: 'center' },\n check: {\n position: 'absolute',\n top: 8,\n right: 8,\n width: 22,\n height: 22,\n borderRadius: 11,\n alignItems: 'center',\n justifyContent: 'center',\n },\n title: { fontSize: 14, fontWeight: '600' },\n meta: { fontSize: 12 },\n});\n"],"names":[],"mappings":"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"}
|
|
@@ -1,20 +1,8 @@
|
|
|
1
|
-
import {jsx,jsxs}from'react/jsx-runtime';import {useState,useMemo}from'react';import {StyleSheet,useWindowDimensions,View,Modal,Text,ScrollView,TextInput,Platform}from'react-native';import {MaterialCommunityIcons}from'@expo/vector-icons';import {Tap,DIM}from'../../inbox/components/Tap.js';import {useSafeInsets}from'../../canvas/withRemoteSafeArea.js';import {TemplateCard}from'./TemplateCard.js';import {CenteredState,IconButton}from'./ui.js';const GUTTER = 16;
|
|
1
|
+
import {jsx,jsxs}from'react/jsx-runtime';import {useState,useMemo}from'react';import {StyleSheet,useWindowDimensions,View,Modal,Text,ScrollView,TextInput,Platform}from'react-native';import {MaterialCommunityIcons}from'@expo/vector-icons';import {Tap,DIM}from'../../inbox/components/Tap.js';import {useSafeInsets}from'../../canvas/withRemoteSafeArea.js';import {TemplateCard}from'./TemplateCard.js';import {templateCategories,templateCategoryLabel,searchTemplates,newestTemplateVersions}from'../templateCatalog.js';import {CenteredState,IconButton}from'./ui.js';const GUTTER = 16;
|
|
2
2
|
const GAP = 12;
|
|
3
|
-
function templateCategories(list) {
|
|
4
|
-
var _a, _b;
|
|
5
|
-
const counts = /* @__PURE__ */ new Map();
|
|
6
|
-
for (const t of list) {
|
|
7
|
-
const c = (_a = t.category) == null ? void 0 : _a.trim();
|
|
8
|
-
if (c) counts.set(c, ((_b = counts.get(c)) != null ? _b : 0) + 1);
|
|
9
|
-
}
|
|
10
|
-
return [...counts.entries()].sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0])).map(([c]) => c);
|
|
11
|
-
}
|
|
12
3
|
function filterTemplates(list, query, category) {
|
|
13
|
-
const
|
|
14
|
-
return
|
|
15
|
-
var _a, _b;
|
|
16
|
-
return (!category || t.category === category) && (!q || `${t.title} ${(_a = t.description) != null ? _a : ""} ${(_b = t.category) != null ? _b : ""}`.toLowerCase().includes(q));
|
|
17
|
-
});
|
|
4
|
+
const inCategory = category ? list.filter((t) => templateCategoryLabel(t.category) === category) : list;
|
|
5
|
+
return searchTemplates(newestTemplateVersions(inCategory), query);
|
|
18
6
|
}
|
|
19
7
|
function TemplatesSheet({
|
|
20
8
|
visible,
|
|
@@ -167,7 +155,7 @@ const styles = StyleSheet.create({
|
|
|
167
155
|
gap: 8
|
|
168
156
|
},
|
|
169
157
|
skeletonCover: {
|
|
170
|
-
aspectRatio: 16 /
|
|
158
|
+
aspectRatio: 16 / 9,
|
|
171
159
|
borderRadius: 14
|
|
172
160
|
},
|
|
173
161
|
skeletonLine: {
|
|
@@ -175,4 +163,4 @@ const styles = StyleSheet.create({
|
|
|
175
163
|
width: "70%",
|
|
176
164
|
borderRadius: 6
|
|
177
165
|
}
|
|
178
|
-
});export{TemplatesSheet,filterTemplates
|
|
166
|
+
});export{TemplatesSheet,filterTemplates};//# sourceMappingURL=TemplatesSheet.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TemplatesSheet.js","sources":["../../../../src/features/webbuilder/components/TemplatesSheet.tsx"],"sourcesContent":["/**\n * Templates - the web StudioSidebar's Templates section as a sheet: search,\n * category chips, cover cards. Picking one hands it to the composer (the web\n * \"Use template\"); the build then remixes it through the agent.\n */\nimport React, { useMemo, useState } from 'react';\nimport { Modal, Platform, ScrollView, StyleSheet, Text, TextInput, useWindowDimensions, View } from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { DIM, Tap } from '../../inbox/components/Tap';\nimport { useSafeInsets } from '../../canvas/withRemoteSafeArea';\nimport type { WebBuilderTemplate } from '../workflow';\nimport type { WebBuilderTheme } from '../webbuilderTheme';\nimport { TemplateCard } from './TemplateCard';\nimport { CenteredState, IconButton } from './ui';\n\nconst GUTTER = 16;\nconst GAP = 12;\n\n/** Category chips: the categories in use, most used first (web `templateCategories`). */\nexport function templateCategories(list: readonly WebBuilderTemplate[]): string[] {\n const counts = new Map<string, number>();\n for (const t of list) {\n const c = t.category?.trim();\n if (c) counts.set(c, (counts.get(c) ?? 0) + 1);\n }\n return [...counts.entries()].sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0])).map(([c]) => c);\n}\n\nexport function filterTemplates(list: readonly WebBuilderTemplate[], query: string, category: string | null) {\n const q = query.trim().toLowerCase();\n return list.filter(\n (t) =>\n (!category || t.category === category) &&\n (!q || `${t.title} ${t.description ?? ''} ${t.category ?? ''}`.toLowerCase().includes(q)),\n );\n}\n\nexport function TemplatesSheet({\n visible,\n onClose,\n templates,\n loading,\n error,\n onReload,\n selectedId,\n onPick,\n theme,\n}: {\n visible: boolean;\n onClose: () => void;\n templates: WebBuilderTemplate[];\n loading: boolean;\n error: string | null;\n onReload?: () => void;\n selectedId: string | null;\n onPick: (template: WebBuilderTemplate) => void;\n theme: WebBuilderTheme;\n}) {\n const insets = useSafeInsets();\n const { width } = useWindowDimensions();\n const cardWidth = Math.floor((width - GUTTER * 2 - GAP) / 2);\n const [query, setQuery] = useState('');\n const [category, setCategory] = useState<string | null>(null);\n const categories = useMemo(() => templateCategories(templates), [templates]);\n const shown = useMemo(() => filterTemplates(templates, query, category), [templates, query, category]);\n\n let body: React.ReactNode;\n if (loading && templates.length === 0) {\n body = (\n <View style={styles.grid}>\n {[0, 1, 2, 3, 4, 5].map((i) => (\n <View key={i} style={[styles.skeleton, { width: cardWidth }]}>\n <View style={[styles.skeletonCover, { backgroundColor: theme.chip }]} />\n <View style={[styles.skeletonLine, { backgroundColor: theme.chip }]} />\n </View>\n ))}\n </View>\n );\n } else if (error && templates.length === 0) {\n body = (\n <CenteredState\n icon=\"cloud-off-outline\"\n title=\"Templates didn't load\"\n body={error}\n theme={theme}\n primary={onReload ? { label: 'Try again', icon: 'refresh', onPress: onReload } : undefined}\n />\n );\n } else if (shown.length === 0) {\n body = (\n <CenteredState\n icon=\"text-search\"\n title={templates.length ? 'No template matches' : 'No templates yet'}\n body={\n templates.length\n ? 'Try another word, or clear the category.'\n : 'Your workspace has no starter templates. Describe the site instead.'\n }\n theme={theme}\n />\n );\n } else {\n body = (\n <View style={styles.grid}>\n {shown.map((t) => (\n <TemplateCard\n key={t.id}\n template={t}\n width={cardWidth}\n theme={theme}\n selected={t.id === selectedId}\n onPress={() => onPick(t)}\n />\n ))}\n </View>\n );\n }\n\n return (\n <Modal\n visible={visible}\n animationType=\"slide\"\n presentationStyle={Platform.OS === 'ios' ? 'pageSheet' : 'fullScreen'}\n onRequestClose={onClose}\n >\n <View\n style={[\n styles.root,\n { backgroundColor: theme.screen, paddingTop: Platform.OS === 'ios' ? 12 : insets.top },\n ]}\n testID=\"webbuilder-templates-sheet\"\n >\n <View style={styles.header}>\n <View style={styles.headerText}>\n <Text style={[styles.title, { color: theme.ink }]}>Templates</Text>\n <Text style={[styles.subtitle, { color: theme.muted }]}>\n Start from a design and make it yours.\n </Text>\n </View>\n <IconButton icon=\"close\" label=\"Close\" onPress={onClose} theme={theme} />\n </View>\n <ScrollView\n contentContainerStyle={[styles.body, { paddingBottom: insets.bottom + 24 }]}\n keyboardShouldPersistTaps=\"handled\"\n >\n <View style={[styles.search, { backgroundColor: theme.card, borderColor: theme.border }]}>\n <MaterialCommunityIcons name=\"magnify\" size={18} color={theme.faint} />\n <TextInput\n value={query}\n onChangeText={setQuery}\n placeholder=\"Search templates\"\n placeholderTextColor={theme.faint}\n style={[styles.searchInput, { color: theme.ink }]}\n accessibilityLabel=\"Search templates\"\n testID=\"webbuilder-template-search\"\n />\n </View>\n {categories.length > 1 ? (\n <ScrollView\n horizontal\n showsHorizontalScrollIndicator={false}\n contentContainerStyle={styles.cats}\n >\n {[null, ...categories].map((c) => {\n const active = c === category;\n return (\n <Tap\n key={c ?? 'all'}\n onPress={() => setCategory(c)}\n accessibilityRole=\"button\"\n accessibilityState={{ selected: active }}\n style={[\n styles.cat,\n active\n ? { backgroundColor: theme.ink, borderColor: theme.ink }\n : { backgroundColor: theme.card, borderColor: theme.border },\n ]}\n pressedStyle={DIM}\n >\n <Text style={[styles.catLabel, { color: active ? theme.card : theme.ink }]}>\n {c ?? 'All'}\n </Text>\n </Tap>\n );\n })}\n </ScrollView>\n ) : null}\n {body}\n </ScrollView>\n </View>\n </Modal>\n );\n}\n\nconst styles = StyleSheet.create({\n root: { flex: 1 },\n header: { flexDirection: 'row', alignItems: 'flex-start', gap: 8, paddingHorizontal: GUTTER, paddingBottom: 12 },\n headerText: { flex: 1, gap: 2 },\n title: { fontSize: 22, fontWeight: '700', letterSpacing: -0.4 },\n subtitle: { fontSize: 14 },\n body: { paddingHorizontal: GUTTER, gap: 14 },\n search: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 8,\n borderRadius: 12,\n borderWidth: StyleSheet.hairlineWidth,\n paddingHorizontal: 12,\n },\n searchInput: { flex: 1, fontSize: 15, paddingVertical: 11 },\n cats: { gap: 8 },\n cat: { paddingHorizontal: 14, paddingVertical: 7, borderRadius: 999, borderWidth: StyleSheet.hairlineWidth },\n catLabel: { fontSize: 13, fontWeight: '600' },\n grid: { flexDirection: 'row', flexWrap: 'wrap', columnGap: GAP, rowGap: 18 },\n skeleton: { gap: 8 },\n skeletonCover: { aspectRatio: 16 / 10, borderRadius: 14 },\n skeletonLine: { height: 12, width: '70%', borderRadius: 6 },\n});\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TemplatesSheet.js","sources":["../../../../src/features/webbuilder/components/TemplatesSheet.tsx"],"sourcesContent":["/**\n * Templates - the web StudioSidebar's Templates section as a sheet: search,\n * category chips, cover cards. Picking one hands it to the composer (the web\n * \"Use template\"); the build then remixes it through the agent.\n */\nimport React, { useMemo, useState } from 'react';\nimport { Modal, Platform, ScrollView, StyleSheet, Text, TextInput, useWindowDimensions, View } from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { DIM, Tap } from '../../inbox/components/Tap';\nimport { useSafeInsets } from '../../canvas/withRemoteSafeArea';\nimport type { WebBuilderTemplate } from '../workflow';\nimport type { WebBuilderTheme } from '../webbuilderTheme';\nimport { TemplateCard } from './TemplateCard';\nimport { newestTemplateVersions, searchTemplates, templateCategories, templateCategoryLabel } from '../templateCatalog';\nimport { CenteredState, IconButton } from './ui';\n\nconst GUTTER = 16;\nconst GAP = 12;\n\n/**\n * The cards for a search and a category chip: one card per look-alike version, every word\n * matching the name, category, description or tags (a word finds its kind of site), best first.\n */\nexport function filterTemplates(list: readonly WebBuilderTemplate[], query: string, category: string | null) {\n const inCategory = category ? list.filter((t) => templateCategoryLabel(t.category) === category) : list;\n return searchTemplates(newestTemplateVersions(inCategory), query);\n}\n\nexport function TemplatesSheet({\n visible,\n onClose,\n templates,\n loading,\n error,\n onReload,\n selectedId,\n onPick,\n theme,\n}: {\n visible: boolean;\n onClose: () => void;\n templates: WebBuilderTemplate[];\n loading: boolean;\n error: string | null;\n onReload?: () => void;\n selectedId: string | null;\n onPick: (template: WebBuilderTemplate) => void;\n theme: WebBuilderTheme;\n}) {\n const insets = useSafeInsets();\n const { width } = useWindowDimensions();\n const cardWidth = Math.floor((width - GUTTER * 2 - GAP) / 2);\n const [query, setQuery] = useState('');\n const [category, setCategory] = useState<string | null>(null);\n const categories = useMemo(() => templateCategories(templates), [templates]);\n const shown = useMemo(() => filterTemplates(templates, query, category), [templates, query, category]);\n\n let body: React.ReactNode;\n if (loading && templates.length === 0) {\n body = (\n <View style={styles.grid}>\n {[0, 1, 2, 3, 4, 5].map((i) => (\n <View key={i} style={[styles.skeleton, { width: cardWidth }]}>\n <View style={[styles.skeletonCover, { backgroundColor: theme.chip }]} />\n <View style={[styles.skeletonLine, { backgroundColor: theme.chip }]} />\n </View>\n ))}\n </View>\n );\n } else if (error && templates.length === 0) {\n body = (\n <CenteredState\n icon=\"cloud-off-outline\"\n title=\"Templates didn't load\"\n body={error}\n theme={theme}\n primary={onReload ? { label: 'Try again', icon: 'refresh', onPress: onReload } : undefined}\n />\n );\n } else if (shown.length === 0) {\n body = (\n <CenteredState\n icon=\"text-search\"\n title={templates.length ? 'No template matches' : 'No templates yet'}\n body={\n templates.length\n ? 'Try another word, or clear the category.'\n : 'Your workspace has no starter templates. Describe the site instead.'\n }\n theme={theme}\n />\n );\n } else {\n body = (\n <View style={styles.grid}>\n {shown.map((t) => (\n <TemplateCard\n key={t.id}\n template={t}\n width={cardWidth}\n theme={theme}\n selected={t.id === selectedId}\n onPress={() => onPick(t)}\n />\n ))}\n </View>\n );\n }\n\n return (\n <Modal\n visible={visible}\n animationType=\"slide\"\n presentationStyle={Platform.OS === 'ios' ? 'pageSheet' : 'fullScreen'}\n onRequestClose={onClose}\n >\n <View\n style={[\n styles.root,\n { backgroundColor: theme.screen, paddingTop: Platform.OS === 'ios' ? 12 : insets.top },\n ]}\n testID=\"webbuilder-templates-sheet\"\n >\n <View style={styles.header}>\n <View style={styles.headerText}>\n <Text style={[styles.title, { color: theme.ink }]}>Templates</Text>\n <Text style={[styles.subtitle, { color: theme.muted }]}>\n Start from a design and make it yours.\n </Text>\n </View>\n <IconButton icon=\"close\" label=\"Close\" onPress={onClose} theme={theme} />\n </View>\n <ScrollView\n contentContainerStyle={[styles.body, { paddingBottom: insets.bottom + 24 }]}\n keyboardShouldPersistTaps=\"handled\"\n >\n <View style={[styles.search, { backgroundColor: theme.card, borderColor: theme.border }]}>\n <MaterialCommunityIcons name=\"magnify\" size={18} color={theme.faint} />\n <TextInput\n value={query}\n onChangeText={setQuery}\n placeholder=\"Search templates\"\n placeholderTextColor={theme.faint}\n style={[styles.searchInput, { color: theme.ink }]}\n accessibilityLabel=\"Search templates\"\n testID=\"webbuilder-template-search\"\n />\n </View>\n {categories.length > 1 ? (\n <ScrollView\n horizontal\n showsHorizontalScrollIndicator={false}\n contentContainerStyle={styles.cats}\n >\n {[null, ...categories].map((c) => {\n const active = c === category;\n return (\n <Tap\n key={c ?? 'all'}\n onPress={() => setCategory(c)}\n accessibilityRole=\"button\"\n accessibilityState={{ selected: active }}\n style={[\n styles.cat,\n active\n ? { backgroundColor: theme.ink, borderColor: theme.ink }\n : { backgroundColor: theme.card, borderColor: theme.border },\n ]}\n pressedStyle={DIM}\n >\n <Text style={[styles.catLabel, { color: active ? theme.card : theme.ink }]}>\n {c ?? 'All'}\n </Text>\n </Tap>\n );\n })}\n </ScrollView>\n ) : null}\n {body}\n </ScrollView>\n </View>\n </Modal>\n );\n}\n\nconst styles = StyleSheet.create({\n root: { flex: 1 },\n header: { flexDirection: 'row', alignItems: 'flex-start', gap: 8, paddingHorizontal: GUTTER, paddingBottom: 12 },\n headerText: { flex: 1, gap: 2 },\n title: { fontSize: 22, fontWeight: '700', letterSpacing: -0.4 },\n subtitle: { fontSize: 14 },\n body: { paddingHorizontal: GUTTER, gap: 14 },\n search: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 8,\n borderRadius: 12,\n borderWidth: StyleSheet.hairlineWidth,\n paddingHorizontal: 12,\n },\n searchInput: { flex: 1, fontSize: 15, paddingVertical: 11 },\n cats: { gap: 8 },\n cat: { paddingHorizontal: 14, paddingVertical: 7, borderRadius: 999, borderWidth: StyleSheet.hairlineWidth },\n catLabel: { fontSize: 13, fontWeight: '600' },\n grid: { flexDirection: 'row', flexWrap: 'wrap', columnGap: GAP, rowGap: 18 },\n skeleton: { gap: 8 },\n skeletonCover: { aspectRatio: 16 / 9, borderRadius: 14 },\n skeletonLine: { height: 12, width: '70%', borderRadius: 6 },\n});\n"],"names":[],"mappings":"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"}
|