@adminide-stack/yantra-mobile 12.0.142 → 12.0.145-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/features/attachments/displayUserMessageText.js +2 -2
- package/lib/features/attachments/displayUserMessageText.js.map +1 -1
- package/lib/features/devices/readings.js.map +1 -1
- package/lib/features/devices/session.js +2 -22
- 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 +3 -205
- 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
- package/lib/features/devices/bodyComposition.js +0 -116
- package/lib/features/devices/bodyComposition.js.map +0 -1
|
@@ -1,4 +1,23 @@
|
|
|
1
|
-
import {jsx,jsxs}from'react/jsx-runtime';import {useState,useEffect}from'react';import {StyleSheet,View,
|
|
1
|
+
import {jsx,jsxs,Fragment}from'react/jsx-runtime';import {useState,useRef,useEffect,useMemo}from'react';import {StyleSheet,View,TextInput,ActivityIndicator,Linking,Text,Modal,Pressable,ScrollView}from'react-native';import {MaterialCommunityIcons}from'@expo/vector-icons';import {Tap,DIM}from'../../inbox/components/Tap.js';import {BuildingStage}from'./BuildingStage.js';import {PreviewFrame}from'./PreviewFrame.js';import {PreviewPlaceholder}from'./PreviewPlaceholder.js';import {CenteredState}from'./ui.js';import {isGenericTitle}from'../buildFragments.js';import {extractPreviewRoutes,buildPreviewUrl,matchPreviewRoutes}from'../previewRoutes.js';var __defProp = Object.defineProperty;
|
|
2
|
+
var __defProps = Object.defineProperties;
|
|
3
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
7
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
8
|
+
var __spreadValues = (a, b) => {
|
|
9
|
+
for (var prop in b || (b = {}))
|
|
10
|
+
if (__hasOwnProp.call(b, prop))
|
|
11
|
+
__defNormalProp(a, prop, b[prop]);
|
|
12
|
+
if (__getOwnPropSymbols)
|
|
13
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
14
|
+
if (__propIsEnum.call(b, prop))
|
|
15
|
+
__defNormalProp(a, prop, b[prop]);
|
|
16
|
+
}
|
|
17
|
+
return a;
|
|
18
|
+
};
|
|
19
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
20
|
+
function BarButton({
|
|
2
21
|
icon,
|
|
3
22
|
label,
|
|
4
23
|
onPress,
|
|
@@ -14,7 +33,7 @@ import {jsx,jsxs}from'react/jsx-runtime';import {useState,useEffect}from'react';
|
|
|
14
33
|
const VIEW_OPTIONS = [{
|
|
15
34
|
label: "Preview",
|
|
16
35
|
value: "preview",
|
|
17
|
-
icon: "
|
|
36
|
+
icon: "television-play"
|
|
18
37
|
}, {
|
|
19
38
|
label: "Code",
|
|
20
39
|
value: "code",
|
|
@@ -29,37 +48,152 @@ function ViewPicker({
|
|
|
29
48
|
}) {
|
|
30
49
|
var _a, _b;
|
|
31
50
|
const options = VIEW_OPTIONS.filter((o) => o.value !== "code" || canShowCode);
|
|
51
|
+
const chipRef = useRef(null);
|
|
52
|
+
const [anchor, setAnchor] = useState(null);
|
|
32
53
|
const open = () => {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
}, (index) => {
|
|
39
|
-
const picked = options[index];
|
|
40
|
-
if (picked) onPick(picked.value);
|
|
41
|
-
});
|
|
42
|
-
return;
|
|
43
|
-
}
|
|
44
|
-
Alert.alert("Show", void 0, options.map((o) => ({
|
|
45
|
-
text: o.label,
|
|
46
|
-
onPress: () => onPick(o.value)
|
|
47
|
-
})), {
|
|
48
|
-
cancelable: true
|
|
49
|
-
});
|
|
54
|
+
var _a2;
|
|
55
|
+
(_a2 = chipRef.current) == null ? void 0 : _a2.measureInWindow((x, y, _w, h) => setAnchor({
|
|
56
|
+
top: y + h + 8,
|
|
57
|
+
left: x
|
|
58
|
+
}));
|
|
50
59
|
};
|
|
51
|
-
const
|
|
52
|
-
|
|
60
|
+
const close = () => setAnchor(null);
|
|
61
|
+
const icon = (_b = (_a = VIEW_OPTIONS.find((o) => o.value === value)) == null ? void 0 : _a.icon) != null ? _b : "television-play";
|
|
62
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
63
|
+
/* @__PURE__ */ jsx(View, { ref: chipRef, collapsable: false, children: /* @__PURE__ */ jsxs(Tap, { onPress: open, disabled, accessibilityRole: "button", accessibilityLabel: `Showing ${value}. Change`, accessibilityState: {
|
|
64
|
+
expanded: Boolean(anchor)
|
|
65
|
+
}, style: [styles.device, {
|
|
66
|
+
borderColor: theme.border,
|
|
67
|
+
backgroundColor: theme.card
|
|
68
|
+
}, disabled && styles.disabled], pressedStyle: DIM, testID: "webbuilder-preview-device", children: [
|
|
69
|
+
/* @__PURE__ */ jsx(MaterialCommunityIcons, { name: icon, size: 22, color: theme.ink }),
|
|
70
|
+
/* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "chevron-down", size: 18, color: theme.muted })
|
|
71
|
+
] }) }),
|
|
72
|
+
/* @__PURE__ */ jsxs(Modal, { visible: Boolean(anchor), transparent: true, animationType: "fade", onRequestClose: close, children: [
|
|
73
|
+
/* @__PURE__ */ jsx(Pressable, { style: StyleSheet.absoluteFill, onPress: close, accessibilityLabel: "Close the menu" }),
|
|
74
|
+
anchor ? /* @__PURE__ */ jsx(View, { style: [styles.menu, {
|
|
75
|
+
top: anchor.top,
|
|
76
|
+
left: anchor.left,
|
|
77
|
+
backgroundColor: theme.card,
|
|
78
|
+
borderColor: theme.border,
|
|
79
|
+
shadowColor: theme.isDark ? "#000" : "#1c1917"
|
|
80
|
+
}], accessibilityRole: "menu", children: options.map((o) => /* @__PURE__ */ jsxs(Tap, { onPress: () => {
|
|
81
|
+
close();
|
|
82
|
+
if (o.value !== value) onPick(o.value);
|
|
83
|
+
}, accessibilityRole: "menuitem", accessibilityState: {
|
|
84
|
+
selected: o.value === value
|
|
85
|
+
}, style: styles.menuRow, pressedStyle: DIM, testID: `webbuilder-view-${o.value}`, children: [
|
|
86
|
+
/* @__PURE__ */ jsx(MaterialCommunityIcons, { name: o.icon, size: 22, color: theme.ink }),
|
|
87
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.menuLabel, {
|
|
88
|
+
color: theme.ink
|
|
89
|
+
}], children: o.label }),
|
|
90
|
+
o.value === value ? /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "check", size: 20, color: theme.ink }) : null
|
|
91
|
+
] }, o.value)) }) : null
|
|
92
|
+
] })
|
|
93
|
+
] });
|
|
94
|
+
}
|
|
95
|
+
function ViewportToggle({
|
|
96
|
+
viewport,
|
|
97
|
+
onViewport,
|
|
98
|
+
disabled = false,
|
|
99
|
+
theme,
|
|
100
|
+
style
|
|
101
|
+
}) {
|
|
102
|
+
return /* @__PURE__ */ jsx(Tap, { onPress: () => onViewport(viewport === "phone" ? "desktop" : "phone"), disabled, accessibilityRole: "button", accessibilityLabel: viewport === "phone" ? "Showing phone width. Show desktop" : "Showing desktop width. Show phone", style: [style, disabled && styles.disabled], pressedStyle: DIM, testID: "webbuilder-viewport-toggle", children: /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: viewport === "phone" ? "cellphone" : "monitor", size: 24, color: theme.ink }) });
|
|
103
|
+
}
|
|
104
|
+
function RouteMenu({
|
|
105
|
+
routes,
|
|
106
|
+
selected,
|
|
107
|
+
onPick,
|
|
108
|
+
theme
|
|
109
|
+
}) {
|
|
110
|
+
return /* @__PURE__ */ jsx(View, { style: [styles.routeMenu, {
|
|
111
|
+
backgroundColor: theme.card,
|
|
53
112
|
borderColor: theme.border,
|
|
113
|
+
shadowColor: theme.isDark ? "#000" : "#1c1917"
|
|
114
|
+
}], accessibilityRole: "menu", testID: "webbuilder-route-menu", children: routes.length === 0 ? /* @__PURE__ */ jsx(Text, { style: [styles.routeEmpty, {
|
|
115
|
+
color: theme.muted
|
|
116
|
+
}], children: "No pages found" }) : /* @__PURE__ */ jsx(ScrollView, { keyboardShouldPersistTaps: "handled", style: styles.routeScroll, children: routes.map((r) => {
|
|
117
|
+
const active = r.path === selected;
|
|
118
|
+
return /* @__PURE__ */ jsxs(Tap, { onPress: () => onPick(r.path), accessibilityRole: "menuitem", accessibilityState: {
|
|
119
|
+
selected: active
|
|
120
|
+
}, style: [styles.routeRow, active && {
|
|
121
|
+
backgroundColor: theme.chip
|
|
122
|
+
}], pressedStyle: DIM, children: [
|
|
123
|
+
/* @__PURE__ */ jsxs(View, { style: styles.routeText, children: [
|
|
124
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.routeLabel, {
|
|
125
|
+
color: theme.ink
|
|
126
|
+
}], numberOfLines: 1, children: r.path }),
|
|
127
|
+
r.label !== r.path && r.path !== "/" ? /* @__PURE__ */ jsx(Text, { style: [styles.routeSub, {
|
|
128
|
+
color: theme.muted
|
|
129
|
+
}], numberOfLines: 1, children: r.label }) : null
|
|
130
|
+
] }),
|
|
131
|
+
active ? /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "check", size: 20, color: theme.ink }) : null
|
|
132
|
+
] }, r.path);
|
|
133
|
+
}) }) });
|
|
134
|
+
}
|
|
135
|
+
function BuildingCover({
|
|
136
|
+
title,
|
|
137
|
+
step,
|
|
138
|
+
theme
|
|
139
|
+
}) {
|
|
140
|
+
const name = isGenericTitle(title) ? "your site" : title;
|
|
141
|
+
return /* @__PURE__ */ jsxs(View, { style: [StyleSheet.absoluteFill, styles.cover, {
|
|
54
142
|
backgroundColor: theme.card
|
|
55
|
-
},
|
|
56
|
-
/* @__PURE__ */ jsx(
|
|
57
|
-
/* @__PURE__ */
|
|
143
|
+
}], accessibilityRole: "progressbar", accessibilityLiveRegion: "polite", testID: "webbuilder-building-cover", children: [
|
|
144
|
+
/* @__PURE__ */ jsx(ActivityIndicator, { size: "large", color: theme.accent }),
|
|
145
|
+
/* @__PURE__ */ jsxs(Text, { style: [styles.coverTitle, {
|
|
146
|
+
color: theme.ink
|
|
147
|
+
}], children: [
|
|
148
|
+
"Building ",
|
|
149
|
+
name,
|
|
150
|
+
"\u2026"
|
|
151
|
+
] }),
|
|
152
|
+
/* @__PURE__ */ jsxs(Text, { style: [styles.coverBody, {
|
|
153
|
+
color: theme.muted
|
|
154
|
+
}], children: [
|
|
155
|
+
step ? `${step}. ` : "",
|
|
156
|
+
"Your site appears here as soon as its first pages are written."
|
|
157
|
+
] })
|
|
58
158
|
] });
|
|
59
159
|
}
|
|
60
|
-
function
|
|
61
|
-
|
|
62
|
-
|
|
160
|
+
function PreviewTroubleCard({
|
|
161
|
+
trouble,
|
|
162
|
+
onRetry,
|
|
163
|
+
onRestore,
|
|
164
|
+
onAskAiRestore,
|
|
165
|
+
agentBusy,
|
|
166
|
+
theme
|
|
167
|
+
}) {
|
|
168
|
+
const askAi = onAskAiRestore && !agentBusy ? {
|
|
169
|
+
label: "Ask the AI to restore it",
|
|
170
|
+
onPress: () => onAskAiRestore(trouble.reason, trouble.snapshotId)
|
|
171
|
+
} : void 0;
|
|
172
|
+
const restore = onRestore ? {
|
|
173
|
+
label: "Restore from saved copy",
|
|
174
|
+
onPress: onRestore,
|
|
175
|
+
icon: "backup-restore"
|
|
176
|
+
} : void 0;
|
|
177
|
+
if (trouble.kind === "restoring") {
|
|
178
|
+
return /* @__PURE__ */ jsx(CenteredState, { icon: "backup-restore", title: "Restoring your site\u2026", body: "Booting its saved copy in a new sandbox. This takes a minute.", busy: true, theme, testID: "webbuilder-preview-restoring" });
|
|
179
|
+
}
|
|
180
|
+
if (trouble.kind === "restoreFailed") {
|
|
181
|
+
const retry = onRetry ? {
|
|
182
|
+
label: "Try again",
|
|
183
|
+
onPress: onRetry
|
|
184
|
+
} : void 0;
|
|
185
|
+
return /* @__PURE__ */ jsx(CenteredState, { icon: "alert-circle-outline", title: "Couldn't restore the preview", body: `${trouble.reason || "The saved copy could not be opened."} Your site is saved${askAi ? "; the AI can restore it for you." : "."}`, primary: askAi ? __spreadProps(__spreadValues({}, askAi), {
|
|
186
|
+
icon: "creation"
|
|
187
|
+
}) : retry, theme, testID: "webbuilder-preview-restore-failed" });
|
|
188
|
+
}
|
|
189
|
+
if (trouble.kind === "gone") {
|
|
190
|
+
return /* @__PURE__ */ jsx(CenteredState, { icon: "backup-restore", title: "This preview was cleaned up", body: "Its sandbox is gone after a long sleep, but your site is saved. Restore it from its saved copy to keep editing.", primary: restore != null ? restore : askAi, theme, testID: "webbuilder-preview-gone" });
|
|
191
|
+
}
|
|
192
|
+
return /* @__PURE__ */ jsx(CenteredState, { icon: "alert-circle-outline", title: "Couldn't wake the preview", body: "Your site is saved. Try again in a moment, or restore it from its saved copy.", primary: onRetry ? {
|
|
193
|
+
label: "Try again",
|
|
194
|
+
onPress: onRetry,
|
|
195
|
+
icon: "refresh"
|
|
196
|
+
} : restore, secondary: onRetry ? restore != null ? restore : askAi : void 0, theme, testID: "webbuilder-preview-failed" });
|
|
63
197
|
}
|
|
64
198
|
function PreviewScreen({
|
|
65
199
|
build,
|
|
@@ -67,7 +201,6 @@ function PreviewScreen({
|
|
|
67
201
|
loading,
|
|
68
202
|
previewNonce,
|
|
69
203
|
onReload,
|
|
70
|
-
onHome,
|
|
71
204
|
onWake,
|
|
72
205
|
waking = false,
|
|
73
206
|
steps = [],
|
|
@@ -77,19 +210,51 @@ function PreviewScreen({
|
|
|
77
210
|
theme,
|
|
78
211
|
bottomInset,
|
|
79
212
|
viewport: viewportProp,
|
|
80
|
-
|
|
81
|
-
|
|
213
|
+
onShowCode,
|
|
214
|
+
buildingCover = null,
|
|
215
|
+
trouble = null,
|
|
216
|
+
onRetry,
|
|
217
|
+
onRestore,
|
|
218
|
+
onAskAiRestore,
|
|
219
|
+
agentBusy = false,
|
|
220
|
+
unpublished = false
|
|
82
221
|
}) {
|
|
83
|
-
var _a;
|
|
222
|
+
var _a, _b;
|
|
84
223
|
const [ownViewport, setOwnViewport] = useState("phone");
|
|
85
224
|
const viewport = viewportProp != null ? viewportProp : ownViewport;
|
|
86
|
-
const
|
|
87
|
-
const url = (_a = build == null ? void 0 : build.previewUrl) != null ? _a : null;
|
|
225
|
+
const baseUrl = (_a = build == null ? void 0 : build.previewUrl) != null ? _a : null;
|
|
88
226
|
const canPublish = Boolean(build == null ? void 0 : build.sandboxId);
|
|
89
|
-
|
|
227
|
+
const [route, setRoute] = useState("/");
|
|
228
|
+
const [pathDraft, setPathDraft] = useState(null);
|
|
229
|
+
const pathInput = useRef(null);
|
|
230
|
+
useEffect(() => {
|
|
231
|
+
setOwnViewport("phone");
|
|
232
|
+
setRoute("/");
|
|
233
|
+
setPathDraft(null);
|
|
234
|
+
}, [build == null ? void 0 : build.key]);
|
|
235
|
+
const routes = useMemo(() => extractPreviewRoutes(build == null ? void 0 : build.files), [build == null ? void 0 : build.files]);
|
|
236
|
+
const url = baseUrl ? (_b = buildPreviewUrl(baseUrl, route)) != null ? _b : baseUrl : null;
|
|
237
|
+
const editingPath = pathDraft !== null;
|
|
238
|
+
const routeOptions = editingPath ? matchPreviewRoutes(routes, pathDraft) : routes;
|
|
239
|
+
const goTo = (path) => {
|
|
240
|
+
var _a2;
|
|
241
|
+
const next = `/${path.trim().replace(/^\/+/, "")}`;
|
|
242
|
+
setPathDraft(null);
|
|
243
|
+
(_a2 = pathInput.current) == null ? void 0 : _a2.blur();
|
|
244
|
+
if (next === route) onReload();
|
|
245
|
+
else setRoute(next);
|
|
246
|
+
};
|
|
90
247
|
let stage;
|
|
91
|
-
if (
|
|
248
|
+
if (trouble) {
|
|
249
|
+
stage = /* @__PURE__ */ jsx(PreviewTroubleCard, { trouble, onRetry, onRestore, onAskAiRestore, agentBusy, theme });
|
|
250
|
+
} else if (url) {
|
|
92
251
|
stage = /* @__PURE__ */ jsx(PreviewFrame, { url, nonce: previewNonce, viewport, theme, onWake, waking, starting: Boolean(building) });
|
|
252
|
+
if (buildingCover) {
|
|
253
|
+
stage = /* @__PURE__ */ jsxs(View, { style: styles.fill, children: [
|
|
254
|
+
stage,
|
|
255
|
+
/* @__PURE__ */ jsx(BuildingCover, { title: buildingCover.title, step: buildingCover.step, theme })
|
|
256
|
+
] });
|
|
257
|
+
}
|
|
93
258
|
} else if (building) {
|
|
94
259
|
stage = /* @__PURE__ */ jsx(BuildingStage, { statusText: building.statusText, startedAt: building.startedAt, steps, theme });
|
|
95
260
|
} else if (loading) {
|
|
@@ -111,11 +276,13 @@ function PreviewScreen({
|
|
|
111
276
|
borderColor: theme.border,
|
|
112
277
|
backgroundColor: theme.screen
|
|
113
278
|
}], children: [
|
|
114
|
-
/* @__PURE__ */ jsx(
|
|
279
|
+
/* @__PURE__ */ jsx(TextInput, { ref: pathInput, value: editingPath ? pathDraft : route, onFocus: () => setPathDraft(""), onChangeText: setPathDraft, onSubmitEditing: () => {
|
|
280
|
+
var _a2, _b2, _c;
|
|
281
|
+
return goTo((_c = (_b2 = (_a2 = routeOptions[0]) == null ? void 0 : _a2.path) != null ? _b2 : pathDraft) != null ? _c : "/");
|
|
282
|
+
}, onBlur: () => setPathDraft(null), editable: Boolean(baseUrl), placeholder: route, placeholderTextColor: theme.faint, autoCapitalize: "none", autoCorrect: false, returnKeyType: "go", selectionColor: theme.accent, style: [styles.path, {
|
|
115
283
|
color: theme.ink
|
|
116
|
-
}],
|
|
284
|
+
}], accessibilityLabel: "Page path. Find a page or enter a path", testID: "webbuilder-preview-path" }),
|
|
117
285
|
building && url ? /* @__PURE__ */ jsx(ActivityIndicator, { size: "small", color: theme.accent, style: styles.barSpin }) : null,
|
|
118
|
-
/* @__PURE__ */ jsx(BarButton, { icon: viewport === "phone" ? "cellphone" : "monitor", label: viewport === "phone" ? "Showing phone width. Show desktop" : "Showing desktop width. Show phone", onPress: () => setViewport(viewport === "phone" ? "desktop" : "phone"), theme, disabled: !url }),
|
|
119
286
|
/* @__PURE__ */ jsx(BarButton, { icon: "open-in-new", label: "Open in the browser", onPress: () => {
|
|
120
287
|
if (url) Linking.openURL(url).catch(() => void 0);
|
|
121
288
|
}, theme, disabled: !url }),
|
|
@@ -127,9 +294,13 @@ function PreviewScreen({
|
|
|
127
294
|
/* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "export-variant", size: 17, color: theme.card }),
|
|
128
295
|
/* @__PURE__ */ jsx(Text, { style: [styles.publishText, {
|
|
129
296
|
color: theme.card
|
|
130
|
-
}], children: publishLabel })
|
|
297
|
+
}], children: publishLabel }),
|
|
298
|
+
unpublished && canPublish ? /* @__PURE__ */ jsx(View, { style: [styles.publishDot, {
|
|
299
|
+
borderColor: theme.card
|
|
300
|
+
}], accessibilityLabel: "Unpublished changes", testID: "webbuilder-publish-dot" }) : null
|
|
131
301
|
] })
|
|
132
302
|
] }),
|
|
303
|
+
editingPath ? /* @__PURE__ */ jsx(RouteMenu, { routes: routeOptions, selected: route, onPick: goTo, theme }) : null,
|
|
133
304
|
/* @__PURE__ */ jsx(View, { style: [styles.stage, {
|
|
134
305
|
paddingBottom: bottomInset + 10
|
|
135
306
|
}], children: /* @__PURE__ */ jsx(View, { style: [styles.frame, {
|
|
@@ -170,14 +341,12 @@ const styles = StyleSheet.create({
|
|
|
170
341
|
borderRadius: 22,
|
|
171
342
|
borderWidth: StyleSheet.hairlineWidth
|
|
172
343
|
},
|
|
173
|
-
pathTap: {
|
|
174
|
-
flex: 1,
|
|
175
|
-
justifyContent: "center",
|
|
176
|
-
height: 44
|
|
177
|
-
},
|
|
178
344
|
path: {
|
|
345
|
+
flex: 1,
|
|
179
346
|
fontSize: 15,
|
|
180
|
-
fontWeight: "500"
|
|
347
|
+
fontWeight: "500",
|
|
348
|
+
height: 44,
|
|
349
|
+
paddingVertical: 0
|
|
181
350
|
},
|
|
182
351
|
barButton: {
|
|
183
352
|
width: 36,
|
|
@@ -201,9 +370,104 @@ const styles = StyleSheet.create({
|
|
|
201
370
|
fontSize: 15,
|
|
202
371
|
fontWeight: "700"
|
|
203
372
|
},
|
|
373
|
+
publishDot: {
|
|
374
|
+
position: "absolute",
|
|
375
|
+
top: -3,
|
|
376
|
+
right: -3,
|
|
377
|
+
width: 12,
|
|
378
|
+
height: 12,
|
|
379
|
+
borderRadius: 6,
|
|
380
|
+
borderWidth: 2,
|
|
381
|
+
backgroundColor: "#3b82f6"
|
|
382
|
+
},
|
|
383
|
+
menu: {
|
|
384
|
+
position: "absolute",
|
|
385
|
+
minWidth: 220,
|
|
386
|
+
paddingVertical: 6,
|
|
387
|
+
borderRadius: 16,
|
|
388
|
+
borderWidth: StyleSheet.hairlineWidth,
|
|
389
|
+
shadowOpacity: 0.12,
|
|
390
|
+
shadowRadius: 18,
|
|
391
|
+
shadowOffset: {
|
|
392
|
+
width: 0,
|
|
393
|
+
height: 8
|
|
394
|
+
},
|
|
395
|
+
elevation: 8
|
|
396
|
+
},
|
|
397
|
+
menuRow: {
|
|
398
|
+
flexDirection: "row",
|
|
399
|
+
alignItems: "center",
|
|
400
|
+
gap: 14,
|
|
401
|
+
paddingHorizontal: 16,
|
|
402
|
+
paddingVertical: 13
|
|
403
|
+
},
|
|
404
|
+
menuLabel: {
|
|
405
|
+
flex: 1,
|
|
406
|
+
fontSize: 17
|
|
407
|
+
},
|
|
408
|
+
routeMenu: {
|
|
409
|
+
position: "absolute",
|
|
410
|
+
top: 62,
|
|
411
|
+
left: 72,
|
|
412
|
+
right: 72,
|
|
413
|
+
zIndex: 20,
|
|
414
|
+
padding: 6,
|
|
415
|
+
borderRadius: 16,
|
|
416
|
+
borderWidth: StyleSheet.hairlineWidth,
|
|
417
|
+
shadowOpacity: 0.12,
|
|
418
|
+
shadowRadius: 18,
|
|
419
|
+
shadowOffset: {
|
|
420
|
+
width: 0,
|
|
421
|
+
height: 8
|
|
422
|
+
},
|
|
423
|
+
elevation: 8
|
|
424
|
+
},
|
|
425
|
+
routeScroll: {
|
|
426
|
+
maxHeight: 280
|
|
427
|
+
},
|
|
428
|
+
routeRow: {
|
|
429
|
+
flexDirection: "row",
|
|
430
|
+
alignItems: "center",
|
|
431
|
+
gap: 10,
|
|
432
|
+
paddingHorizontal: 12,
|
|
433
|
+
paddingVertical: 12,
|
|
434
|
+
borderRadius: 10
|
|
435
|
+
},
|
|
436
|
+
routeText: {
|
|
437
|
+
flex: 1
|
|
438
|
+
},
|
|
439
|
+
routeLabel: {
|
|
440
|
+
fontSize: 15,
|
|
441
|
+
fontWeight: "500"
|
|
442
|
+
},
|
|
443
|
+
routeSub: {
|
|
444
|
+
fontSize: 12,
|
|
445
|
+
marginTop: 2
|
|
446
|
+
},
|
|
447
|
+
routeEmpty: {
|
|
448
|
+
fontSize: 14,
|
|
449
|
+
padding: 12
|
|
450
|
+
},
|
|
204
451
|
disabled: {
|
|
205
452
|
opacity: 0.35
|
|
206
453
|
},
|
|
454
|
+
cover: {
|
|
455
|
+
alignItems: "center",
|
|
456
|
+
justifyContent: "center",
|
|
457
|
+
gap: 12,
|
|
458
|
+
paddingHorizontal: 28,
|
|
459
|
+
zIndex: 2
|
|
460
|
+
},
|
|
461
|
+
coverTitle: {
|
|
462
|
+
fontSize: 17,
|
|
463
|
+
fontWeight: "700",
|
|
464
|
+
textAlign: "center"
|
|
465
|
+
},
|
|
466
|
+
coverBody: {
|
|
467
|
+
fontSize: 14,
|
|
468
|
+
lineHeight: 20,
|
|
469
|
+
textAlign: "center"
|
|
470
|
+
},
|
|
207
471
|
stage: {
|
|
208
472
|
flex: 1,
|
|
209
473
|
padding: 12
|
|
@@ -221,4 +485,4 @@ const styles = StyleSheet.create({
|
|
|
221
485
|
},
|
|
222
486
|
elevation: 2
|
|
223
487
|
}
|
|
224
|
-
});export{PreviewScreen,ViewPicker};//# sourceMappingURL=PreviewScreen.js.map
|
|
488
|
+
});export{PreviewScreen,ViewPicker,ViewportToggle};//# sourceMappingURL=PreviewScreen.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PreviewScreen.js","sources":["../../../../src/features/webbuilder/components/PreviewScreen.tsx"],"sourcesContent":["/**\n * The site, full screen - what the chat's site card opens, as Manus shows it: a\n * slim address bar (home, the page, open in the browser, reload) over the live\n * preview. While the agent is still building it says so instead of a blank page.\n */\nimport React, { useEffect, useState } from 'react';\nimport { ActionSheetIOS, ActivityIndicator, Alert, Linking, Platform, StyleSheet, Text, View } from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { DIM, Tap } from '../../inbox/components/Tap';\nimport type { WebBuilderBuild, WebBuilderBuilding } from '../types';\nimport type { WebBuilderTheme } from '../webbuilderTheme';\nimport type { ToolStep } from '../../chat/toolActivity';\nimport { BuildingStage } from './BuildingStage';\nimport { PreviewFrame, type PreviewViewport } from './PreviewFrame';\nimport { PreviewPlaceholder } from './PreviewPlaceholder';\nimport { CenteredState, type IconName } from './ui';\n\nfunction BarButton({\n icon,\n label,\n onPress,\n theme,\n active = false,\n disabled = false,\n}: {\n icon: IconName;\n label: string;\n onPress: () => void;\n theme: WebBuilderTheme;\n active?: boolean;\n disabled?: boolean;\n}) {\n return (\n <Tap\n onPress={onPress}\n disabled={disabled}\n accessibilityRole=\"button\"\n accessibilityLabel={label}\n accessibilityState={{ selected: active, disabled }}\n hitSlop={6}\n style={[styles.barButton, disabled && styles.disabled]}\n pressedStyle={DIM}\n >\n <MaterialCommunityIcons name={icon} size={20} color={active ? theme.accent : theme.ink} />\n </Tap>\n );\n}\n\n/** What the picker shows: the running site, or its code. */\nexport type SiteView = 'preview' | 'code';\n\nconst VIEW_OPTIONS: Array<{ label: string; value: SiteView; icon: 'eye-outline' | 'code-tags' }> = [\n { label: 'Preview', value: 'preview', icon: 'eye-outline' },\n { label: 'Code', value: 'code', icon: 'code-tags' },\n];\n\n/** The view picker (Preview / Code), the same chip on the preview and the code view. */\nexport function ViewPicker({\n value,\n onPick,\n canShowCode,\n disabled = false,\n theme,\n}: {\n value: SiteView;\n onPick: (value: SiteView) => void;\n canShowCode: boolean;\n disabled?: boolean;\n theme: WebBuilderTheme;\n}) {\n const options = VIEW_OPTIONS.filter((o) => o.value !== 'code' || canShowCode);\n const open = () => {\n if (Platform.OS === 'ios') {\n ActionSheetIOS.showActionSheetWithOptions(\n {\n title: 'Show',\n options: [...options.map((o) => (o.value === value ? `✓ ${o.label}` : o.label)), 'Cancel'],\n cancelButtonIndex: options.length,\n },\n (index) => {\n const picked = options[index];\n if (picked) onPick(picked.value);\n },\n );\n return;\n }\n // Two choices, so Android's alert holds them (dismissed by tapping outside).\n Alert.alert(\n 'Show',\n undefined,\n options.map((o) => ({ text: o.label, onPress: () => onPick(o.value) })),\n {\n cancelable: true,\n },\n );\n };\n const icon = VIEW_OPTIONS.find((o) => o.value === value)?.icon ?? 'eye-outline';\n return (\n <Tap\n onPress={open}\n disabled={disabled}\n accessibilityRole=\"button\"\n accessibilityLabel={`Showing ${value}. Change`}\n style={[\n styles.device,\n { borderColor: theme.border, backgroundColor: theme.card },\n disabled && styles.disabled,\n ]}\n pressedStyle={DIM}\n testID=\"webbuilder-preview-device\"\n >\n <MaterialCommunityIcons name={icon} size={20} color={theme.ink} />\n <MaterialCommunityIcons name=\"chevron-down\" size={18} color={theme.muted} />\n </Tap>\n );\n}\n\nfunction pathOf(url: string | null): string {\n const match = /^https?:\\/\\/[^/]+(\\/[^?#]*)?/i.exec(url ?? '');\n return match?.[1] || '/';\n}\n\nexport function PreviewScreen({\n build,\n building,\n loading,\n previewNonce,\n onReload,\n onHome,\n onWake,\n waking = false,\n steps = [],\n onPublish,\n publishLabel = 'Publish',\n error,\n theme,\n bottomInset,\n viewport: viewportProp,\n onViewport,\n onShowCode,\n}: {\n build: WebBuilderBuild | null;\n building: WebBuilderBuilding | null;\n loading: boolean;\n previewNonce: number;\n onReload: () => void;\n onHome: () => void;\n onWake: () => void;\n /** A wake is running: the page stays \"on its way\". */\n waking?: boolean;\n /** The agent's steps so far, while it builds. */\n steps?: ToolStep[];\n onPublish: () => void;\n /** \"Publish\", or \"Publishing…\" while it runs. */\n publishLabel?: string;\n error?: string | null;\n theme: WebBuilderTheme;\n bottomInset: number;\n /** The width shown, when the parent holds it. */\n viewport?: PreviewViewport;\n onViewport?: (viewport: PreviewViewport) => void;\n /** Code in the view picker; without it the picker offers Phone / Desktop only. */\n onShowCode?: () => void;\n}) {\n const [ownViewport, setOwnViewport] = useState<PreviewViewport>('phone');\n // The host of this screen may hold the width (so the code view's picker can come back to it).\n const viewport = viewportProp ?? ownViewport;\n const setViewport = onViewport ?? setOwnViewport;\n const url = build?.previewUrl ?? null;\n const canPublish = Boolean(build?.sandboxId);\n useEffect(() => setOwnViewport('phone'), [build?.key]);\n\n let stage: React.ReactNode;\n if (url) {\n stage = (\n <PreviewFrame\n url={url}\n nonce={previewNonce}\n viewport={viewport}\n theme={theme}\n onWake={onWake}\n waking={waking}\n starting={Boolean(building)}\n />\n );\n } else if (building) {\n stage = (\n <BuildingStage\n statusText={building.statusText}\n startedAt={building.startedAt}\n steps={steps}\n theme={theme}\n />\n );\n } else if (loading) {\n stage = <PreviewPlaceholder theme={theme} label=\"Loading preview, please wait…\" />;\n } else {\n stage = (\n <CenteredState\n icon={error ? 'alert-circle-outline' : 'application-outline'}\n title={error ? \"The build didn't finish\" : 'No preview yet'}\n body={error ?? 'Ask the agent to build the site; the preview shows up here.'}\n theme={theme}\n />\n );\n }\n\n return (\n <View style={[styles.fill, { backgroundColor: theme.stage }]}>\n <View style={[styles.toolbar, { backgroundColor: theme.card, borderBottomColor: theme.border }]}>\n {onShowCode ? (\n <ViewPicker\n value=\"preview\"\n onPick={(picked) => {\n if (picked === 'code') onShowCode();\n }}\n canShowCode\n theme={theme}\n />\n ) : null}\n <View style={[styles.bar, { borderColor: theme.border, backgroundColor: theme.screen }]}>\n <Tap\n onPress={onHome}\n disabled={!url}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Back to the home page\"\n style={styles.pathTap}\n pressedStyle={DIM}\n >\n <Text style={[styles.path, { color: theme.ink }]} numberOfLines={1}>\n {pathOf(url)}\n </Text>\n </Tap>\n {building && url ? (\n <ActivityIndicator size=\"small\" color={theme.accent} style={styles.barSpin} />\n ) : null}\n <BarButton\n icon={viewport === 'phone' ? 'cellphone' : 'monitor'}\n label={\n viewport === 'phone'\n ? 'Showing phone width. Show desktop'\n : 'Showing desktop width. Show phone'\n }\n onPress={() => setViewport(viewport === 'phone' ? 'desktop' : 'phone')}\n theme={theme}\n disabled={!url}\n />\n <BarButton\n icon=\"open-in-new\"\n label=\"Open in the browser\"\n onPress={() => {\n if (url) Linking.openURL(url).catch(() => undefined);\n }}\n theme={theme}\n disabled={!url}\n />\n <BarButton icon=\"refresh\" label=\"Reload\" onPress={onReload} theme={theme} disabled={!url} />\n </View>\n <Tap\n onPress={onPublish}\n disabled={!canPublish}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Publish\"\n style={[styles.publish, { backgroundColor: theme.ink }, !canPublish && styles.disabled]}\n pressedStyle={DIM}\n testID=\"webbuilder-preview-publish\"\n >\n <MaterialCommunityIcons name=\"export-variant\" size={17} color={theme.card} />\n <Text style={[styles.publishText, { color: theme.card }]}>{publishLabel}</Text>\n </Tap>\n </View>\n <View style={[styles.stage, { paddingBottom: bottomInset + 10 }]}>\n <View\n style={[\n styles.frame,\n {\n backgroundColor: theme.card,\n borderColor: theme.border,\n shadowColor: theme.isDark ? '#000' : '#1c1917',\n },\n ]}\n >\n {stage}\n </View>\n </View>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n fill: { flex: 1 },\n toolbar: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 8,\n paddingHorizontal: 12,\n paddingVertical: 10,\n borderBottomWidth: StyleSheet.hairlineWidth,\n },\n device: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 4,\n height: 44,\n paddingHorizontal: 10,\n borderRadius: 12,\n borderWidth: StyleSheet.hairlineWidth,\n },\n bar: {\n flex: 1,\n flexDirection: 'row',\n alignItems: 'center',\n height: 44,\n paddingLeft: 14,\n paddingRight: 4,\n borderRadius: 22,\n borderWidth: StyleSheet.hairlineWidth,\n },\n pathTap: { flex: 1, justifyContent: 'center', height: 44 },\n path: { fontSize: 15, fontWeight: '500' },\n barButton: { width: 36, height: 36, borderRadius: 18, alignItems: 'center', justifyContent: 'center' },\n barSpin: { marginRight: 4 },\n publish: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 6,\n height: 44,\n paddingHorizontal: 14,\n borderRadius: 12,\n },\n publishText: { fontSize: 15, fontWeight: '700' },\n disabled: { opacity: 0.35 },\n stage: { flex: 1, padding: 12 },\n frame: {\n flex: 1,\n borderRadius: 22,\n borderWidth: StyleSheet.hairlineWidth,\n overflow: 'hidden',\n shadowOpacity: 0.06,\n shadowRadius: 14,\n shadowOffset: { width: 0, height: 4 },\n elevation: 2,\n },\n});\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PreviewScreen.js","sources":["../../../../src/features/webbuilder/components/PreviewScreen.tsx"],"sourcesContent":["/**\n * The site, full screen - what the chat's site card opens, as Manus shows it: a\n * slim address bar (home, the page, open in the browser, reload) over the live\n * preview. While the agent is still building it says so instead of a blank page.\n */\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport {\n ActivityIndicator,\n Linking,\n Modal,\n Pressable,\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 { WebBuilderBuild, WebBuilderBuilding } from '../types';\nimport type { WebBuilderTheme } from '../webbuilderTheme';\nimport type { ToolStep } from '../../chat/toolActivity';\nimport { BuildingStage } from './BuildingStage';\nimport { PreviewFrame, type PreviewViewport } from './PreviewFrame';\nimport { PreviewPlaceholder } from './PreviewPlaceholder';\nimport { CenteredState, type IconName } from './ui';\nimport { isGenericTitle } from '../buildFragments';\nimport { buildPreviewUrl, extractPreviewRoutes, matchPreviewRoutes, type PreviewRoute } from '../previewRoutes';\n\nfunction BarButton({\n icon,\n label,\n onPress,\n theme,\n active = false,\n disabled = false,\n}: {\n icon: IconName;\n label: string;\n onPress: () => void;\n theme: WebBuilderTheme;\n active?: boolean;\n disabled?: boolean;\n}) {\n return (\n <Tap\n onPress={onPress}\n disabled={disabled}\n accessibilityRole=\"button\"\n accessibilityLabel={label}\n accessibilityState={{ selected: active, disabled }}\n hitSlop={6}\n style={[styles.barButton, disabled && styles.disabled]}\n pressedStyle={DIM}\n >\n <MaterialCommunityIcons name={icon} size={20} color={active ? theme.accent : theme.ink} />\n </Tap>\n );\n}\n\n/** What the picker shows: the running site, or its code. */\nexport type SiteView = 'preview' | 'code';\n\nconst VIEW_OPTIONS: Array<{ label: string; value: SiteView; icon: IconName }> = [\n { label: 'Preview', value: 'preview', icon: 'television-play' },\n { label: 'Code', value: 'code', icon: 'code-tags' },\n];\n\n/** The view picker (Preview / Code): a chip that drops its menu under itself, the web toolbar's picker. */\nexport function ViewPicker({\n value,\n onPick,\n canShowCode,\n disabled = false,\n theme,\n}: {\n value: SiteView;\n onPick: (value: SiteView) => void;\n canShowCode: boolean;\n disabled?: boolean;\n theme: WebBuilderTheme;\n}) {\n const options = VIEW_OPTIONS.filter((o) => o.value !== 'code' || canShowCode);\n const chipRef = useRef<View>(null);\n const [anchor, setAnchor] = useState<{ top: number; left: number } | null>(null);\n const open = () => {\n chipRef.current?.measureInWindow((x, y, _w, h) => setAnchor({ top: y + h + 8, left: x }));\n };\n const close = () => setAnchor(null);\n const icon = VIEW_OPTIONS.find((o) => o.value === value)?.icon ?? 'television-play';\n return (\n <>\n <View ref={chipRef} collapsable={false}>\n <Tap\n onPress={open}\n disabled={disabled}\n accessibilityRole=\"button\"\n accessibilityLabel={`Showing ${value}. Change`}\n accessibilityState={{ expanded: Boolean(anchor) }}\n style={[\n styles.device,\n { borderColor: theme.border, backgroundColor: theme.card },\n disabled && styles.disabled,\n ]}\n pressedStyle={DIM}\n testID=\"webbuilder-preview-device\"\n >\n <MaterialCommunityIcons name={icon} size={22} color={theme.ink} />\n <MaterialCommunityIcons name=\"chevron-down\" size={18} color={theme.muted} />\n </Tap>\n </View>\n <Modal visible={Boolean(anchor)} transparent animationType=\"fade\" onRequestClose={close}>\n <Pressable style={StyleSheet.absoluteFill} onPress={close} accessibilityLabel=\"Close the menu\" />\n {anchor ? (\n <View\n style={[\n styles.menu,\n {\n top: anchor.top,\n left: anchor.left,\n backgroundColor: theme.card,\n borderColor: theme.border,\n shadowColor: theme.isDark ? '#000' : '#1c1917',\n },\n ]}\n accessibilityRole=\"menu\"\n >\n {options.map((o) => (\n <Tap\n key={o.value}\n onPress={() => {\n close();\n if (o.value !== value) onPick(o.value);\n }}\n accessibilityRole=\"menuitem\"\n accessibilityState={{ selected: o.value === value }}\n style={styles.menuRow}\n pressedStyle={DIM}\n testID={`webbuilder-view-${o.value}`}\n >\n <MaterialCommunityIcons name={o.icon} size={22} color={theme.ink} />\n <Text style={[styles.menuLabel, { color: theme.ink }]}>{o.label}</Text>\n {o.value === value ? (\n <MaterialCommunityIcons name=\"check\" size={20} color={theme.ink} />\n ) : null}\n </Tap>\n ))}\n </View>\n ) : null}\n </Modal>\n </>\n );\n}\n\n/** Phone / desktop width: the header's toggle (the web toolbar's device switch). */\nexport function ViewportToggle({\n viewport,\n onViewport,\n disabled = false,\n theme,\n style,\n}: {\n viewport: PreviewViewport;\n onViewport: (viewport: PreviewViewport) => void;\n disabled?: boolean;\n theme: WebBuilderTheme;\n style?: object;\n}) {\n return (\n <Tap\n onPress={() => onViewport(viewport === 'phone' ? 'desktop' : 'phone')}\n disabled={disabled}\n accessibilityRole=\"button\"\n accessibilityLabel={\n viewport === 'phone' ? 'Showing phone width. Show desktop' : 'Showing desktop width. Show phone'\n }\n style={[style, disabled && styles.disabled]}\n pressedStyle={DIM}\n testID=\"webbuilder-viewport-toggle\"\n >\n <MaterialCommunityIcons name={viewport === 'phone' ? 'cellphone' : 'monitor'} size={24} color={theme.ink} />\n </Tap>\n );\n}\n\n/** The page list under the path pill: the site's routes (or the typed path), the open one checked. */\nfunction RouteMenu({\n routes,\n selected,\n onPick,\n theme,\n}: {\n routes: PreviewRoute[];\n selected: string;\n onPick: (path: string) => void;\n theme: WebBuilderTheme;\n}) {\n return (\n <View\n style={[\n styles.routeMenu,\n {\n backgroundColor: theme.card,\n borderColor: theme.border,\n shadowColor: theme.isDark ? '#000' : '#1c1917',\n },\n ]}\n accessibilityRole=\"menu\"\n testID=\"webbuilder-route-menu\"\n >\n {routes.length === 0 ? (\n <Text style={[styles.routeEmpty, { color: theme.muted }]}>No pages found</Text>\n ) : (\n <ScrollView keyboardShouldPersistTaps=\"handled\" style={styles.routeScroll}>\n {routes.map((r) => {\n const active = r.path === selected;\n return (\n <Tap\n key={r.path}\n onPress={() => onPick(r.path)}\n accessibilityRole=\"menuitem\"\n accessibilityState={{ selected: active }}\n style={[styles.routeRow, active && { backgroundColor: theme.chip }]}\n pressedStyle={DIM}\n >\n <View style={styles.routeText}>\n <Text style={[styles.routeLabel, { color: theme.ink }]} numberOfLines={1}>\n {r.path}\n </Text>\n {r.label !== r.path && r.path !== '/' ? (\n <Text style={[styles.routeSub, { color: theme.muted }]} numberOfLines={1}>\n {r.label}\n </Text>\n ) : null}\n </View>\n {active ? <MaterialCommunityIcons name=\"check\" size={20} color={theme.ink} /> : null}\n </Tap>\n );\n })}\n </ScrollView>\n )}\n </View>\n );\n}\n\n/** Over the preview while a new site is built: its starter template (another business's demo) stays hidden. */\nfunction BuildingCover({ title, step, theme }: { title: string; step: string | null; theme: WebBuilderTheme }) {\n const name = isGenericTitle(title) ? 'your site' : title;\n return (\n <View\n style={[StyleSheet.absoluteFill, styles.cover, { backgroundColor: theme.card }]}\n accessibilityRole=\"progressbar\"\n accessibilityLiveRegion=\"polite\"\n testID=\"webbuilder-building-cover\"\n >\n <ActivityIndicator size=\"large\" color={theme.accent} />\n <Text style={[styles.coverTitle, { color: theme.ink }]}>Building {name}…</Text>\n <Text style={[styles.coverBody, { color: theme.muted }]}>\n {step ? `${step}. ` : ''}Your site appears here as soon as its first pages are written.\n </Text>\n </View>\n );\n}\n\n/** Why the preview is not showing, once waking it did not bring it back (web `PreviewStatusCard`). */\nexport interface PreviewTrouble {\n /** The build it is about. */\n key: string;\n kind: 'gone' | 'failed' | 'restoring' | 'restoreFailed';\n /** Why a restore failed, in one sentence. */\n reason?: string;\n /** The restore point a failed restore tried (for the AI's note). */\n snapshotId?: string | null;\n}\n\nfunction PreviewTroubleCard({\n trouble,\n onRetry,\n onRestore,\n onAskAiRestore,\n agentBusy,\n theme,\n}: {\n trouble: PreviewTrouble;\n onRetry?: () => void;\n onRestore?: () => void;\n onAskAiRestore?: (reason?: string | null, snapshotId?: string | null) => void;\n agentBusy: boolean;\n theme: WebBuilderTheme;\n}) {\n const askAi =\n onAskAiRestore && !agentBusy\n ? {\n label: 'Ask the AI to restore it',\n onPress: () => onAskAiRestore(trouble.reason, trouble.snapshotId),\n }\n : undefined;\n const restore = onRestore\n ? { label: 'Restore from saved copy', onPress: onRestore, icon: 'backup-restore' as const }\n : undefined;\n if (trouble.kind === 'restoring') {\n return (\n <CenteredState\n icon=\"backup-restore\"\n title=\"Restoring your site…\"\n body=\"Booting its saved copy in a new sandbox. This takes a minute.\"\n busy\n theme={theme}\n testID=\"webbuilder-preview-restoring\"\n />\n );\n }\n if (trouble.kind === 'restoreFailed') {\n const retry = onRetry ? { label: 'Try again', onPress: onRetry } : undefined;\n return (\n <CenteredState\n icon=\"alert-circle-outline\"\n title=\"Couldn't restore the preview\"\n body={`${trouble.reason || 'The saved copy could not be opened.'} Your site is saved${\n askAi ? '; the AI can restore it for you.' : '.'\n }`}\n primary={askAi ? { ...askAi, icon: 'creation' } : retry}\n theme={theme}\n testID=\"webbuilder-preview-restore-failed\"\n />\n );\n }\n if (trouble.kind === 'gone') {\n return (\n <CenteredState\n icon=\"backup-restore\"\n title=\"This preview was cleaned up\"\n body=\"Its sandbox is gone after a long sleep, but your site is saved. Restore it from its saved copy to keep editing.\"\n primary={restore ?? askAi}\n theme={theme}\n testID=\"webbuilder-preview-gone\"\n />\n );\n }\n return (\n <CenteredState\n icon=\"alert-circle-outline\"\n title=\"Couldn't wake the preview\"\n body=\"Your site is saved. Try again in a moment, or restore it from its saved copy.\"\n primary={onRetry ? { label: 'Try again', onPress: onRetry, icon: 'refresh' } : restore}\n secondary={onRetry ? (restore ?? askAi) : undefined}\n theme={theme}\n testID=\"webbuilder-preview-failed\"\n />\n );\n}\n\nexport function PreviewScreen({\n build,\n building,\n loading,\n previewNonce,\n onReload,\n onWake,\n waking = false,\n steps = [],\n onPublish,\n publishLabel = 'Publish',\n error,\n theme,\n bottomInset,\n viewport: viewportProp,\n onShowCode,\n buildingCover = null,\n trouble = null,\n onRetry,\n onRestore,\n onAskAiRestore,\n agentBusy = false,\n unpublished = false,\n}: {\n build: WebBuilderBuild | null;\n building: WebBuilderBuilding | null;\n loading: boolean;\n previewNonce: number;\n onReload: () => void;\n /** @deprecated The path pill picks the page now. */\n onHome?: () => void;\n onWake: () => void;\n /** A wake is running: the page stays \"on its way\". */\n waking?: boolean;\n /** The agent's steps so far, while it builds. */\n steps?: ToolStep[];\n onPublish: () => void;\n /** \"Publish\", or \"Publishing…\" while it runs. */\n publishLabel?: string;\n error?: string | null;\n theme: WebBuilderTheme;\n bottomInset: number;\n /** The width shown, when the parent holds it (its toggle sits in the header). */\n viewport?: PreviewViewport;\n /** @deprecated The width toggle moved to the header (`ViewportToggle`). */\n onViewport?: (viewport: PreviewViewport) => void;\n /** Code in the view picker; without it the picker offers Phone / Desktop only. */\n onShowCode?: () => void;\n /** A new site whose first content pass has not landed: its starter template stays covered. */\n buildingCover?: { title: string; step: string | null } | null;\n /** The preview could not be brought back: cleaned up, failed, restoring, or a restore that failed. */\n trouble?: PreviewTrouble | null;\n /** Wake it again (the person asked). */\n onRetry?: () => void;\n /** Restore from saved copy (a new sandbox from its restore point). */\n onRestore?: () => void;\n /** Ask the AI to restore it, with why the app could not. */\n onAskAiRestore?: (reason?: string | null, snapshotId?: string | null) => void;\n /** An AI turn is running: asking it again waits. */\n agentBusy?: boolean;\n /** Changes not on the live site yet: a dot on Publish. */\n unpublished?: boolean;\n}) {\n const [ownViewport, setOwnViewport] = useState<PreviewViewport>('phone');\n // The host of this screen may hold the width (so the code view's picker can come back to it).\n const viewport = viewportProp ?? ownViewport;\n const baseUrl = build?.previewUrl ?? null;\n const canPublish = Boolean(build?.sandboxId);\n // The page shown (web `previewRoute`): picked or typed in the path pill.\n const [route, setRoute] = useState('/');\n const [pathDraft, setPathDraft] = useState<string | null>(null);\n const pathInput = useRef<TextInput>(null);\n useEffect(() => {\n setOwnViewport('phone');\n setRoute('/');\n setPathDraft(null);\n }, [build?.key]);\n const routes = useMemo(() => extractPreviewRoutes(build?.files), [build?.files]);\n const url = baseUrl ? (buildPreviewUrl(baseUrl, route) ?? baseUrl) : null;\n const editingPath = pathDraft !== null;\n const routeOptions = editingPath ? matchPreviewRoutes(routes, pathDraft) : routes;\n const goTo = (path: string) => {\n const next = `/${path.trim().replace(/^\\/+/, '')}`;\n setPathDraft(null);\n pathInput.current?.blur();\n if (next === route) onReload();\n else setRoute(next);\n };\n\n let stage: React.ReactNode;\n if (trouble) {\n stage = (\n <PreviewTroubleCard\n trouble={trouble}\n onRetry={onRetry}\n onRestore={onRestore}\n onAskAiRestore={onAskAiRestore}\n agentBusy={agentBusy}\n theme={theme}\n />\n );\n } else if (url) {\n stage = (\n <PreviewFrame\n url={url}\n nonce={previewNonce}\n viewport={viewport}\n theme={theme}\n onWake={onWake}\n waking={waking}\n starting={Boolean(building)}\n />\n );\n if (buildingCover) {\n stage = (\n <View style={styles.fill}>\n {stage}\n <BuildingCover title={buildingCover.title} step={buildingCover.step} theme={theme} />\n </View>\n );\n }\n } else if (building) {\n stage = (\n <BuildingStage\n statusText={building.statusText}\n startedAt={building.startedAt}\n steps={steps}\n theme={theme}\n />\n );\n } else if (loading) {\n stage = <PreviewPlaceholder theme={theme} label=\"Loading preview, please wait…\" />;\n } else {\n stage = (\n <CenteredState\n icon={error ? 'alert-circle-outline' : 'application-outline'}\n title={error ? \"The build didn't finish\" : 'No preview yet'}\n body={error ?? 'Ask the agent to build the site; the preview shows up here.'}\n theme={theme}\n />\n );\n }\n\n return (\n <View style={[styles.fill, { backgroundColor: theme.stage }]}>\n <View style={[styles.toolbar, { backgroundColor: theme.card, borderBottomColor: theme.border }]}>\n {onShowCode ? (\n <ViewPicker\n value=\"preview\"\n onPick={(picked) => {\n if (picked === 'code') onShowCode();\n }}\n canShowCode\n theme={theme}\n />\n ) : null}\n <View style={[styles.bar, { borderColor: theme.border, backgroundColor: theme.screen }]}>\n <TextInput\n ref={pathInput}\n value={editingPath ? pathDraft : route}\n onFocus={() => setPathDraft('')}\n onChangeText={setPathDraft}\n onSubmitEditing={() => goTo(routeOptions[0]?.path ?? pathDraft ?? '/')}\n onBlur={() => setPathDraft(null)}\n editable={Boolean(baseUrl)}\n placeholder={route}\n placeholderTextColor={theme.faint}\n autoCapitalize=\"none\"\n autoCorrect={false}\n returnKeyType=\"go\"\n selectionColor={theme.accent}\n style={[styles.path, { color: theme.ink }]}\n accessibilityLabel=\"Page path. Find a page or enter a path\"\n testID=\"webbuilder-preview-path\"\n />\n {building && url ? (\n <ActivityIndicator size=\"small\" color={theme.accent} style={styles.barSpin} />\n ) : null}\n <BarButton\n icon=\"open-in-new\"\n label=\"Open in the browser\"\n onPress={() => {\n if (url) Linking.openURL(url).catch(() => undefined);\n }}\n theme={theme}\n disabled={!url}\n />\n <BarButton icon=\"refresh\" label=\"Reload\" onPress={onReload} theme={theme} disabled={!url} />\n </View>\n <Tap\n onPress={onPublish}\n disabled={!canPublish}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Publish\"\n style={[styles.publish, { backgroundColor: theme.ink }, !canPublish && styles.disabled]}\n pressedStyle={DIM}\n testID=\"webbuilder-preview-publish\"\n >\n <MaterialCommunityIcons name=\"export-variant\" size={17} color={theme.card} />\n <Text style={[styles.publishText, { color: theme.card }]}>{publishLabel}</Text>\n {unpublished && canPublish ? (\n <View\n style={[styles.publishDot, { borderColor: theme.card }]}\n accessibilityLabel=\"Unpublished changes\"\n testID=\"webbuilder-publish-dot\"\n />\n ) : null}\n </Tap>\n </View>\n {editingPath ? <RouteMenu routes={routeOptions} selected={route} onPick={goTo} theme={theme} /> : null}\n <View style={[styles.stage, { paddingBottom: bottomInset + 10 }]}>\n <View\n style={[\n styles.frame,\n {\n backgroundColor: theme.card,\n borderColor: theme.border,\n shadowColor: theme.isDark ? '#000' : '#1c1917',\n },\n ]}\n >\n {stage}\n </View>\n </View>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n fill: { flex: 1 },\n toolbar: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 8,\n paddingHorizontal: 12,\n paddingVertical: 10,\n borderBottomWidth: StyleSheet.hairlineWidth,\n },\n device: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 4,\n height: 44,\n paddingHorizontal: 10,\n borderRadius: 12,\n borderWidth: StyleSheet.hairlineWidth,\n },\n bar: {\n flex: 1,\n flexDirection: 'row',\n alignItems: 'center',\n height: 44,\n paddingLeft: 14,\n paddingRight: 4,\n borderRadius: 22,\n borderWidth: StyleSheet.hairlineWidth,\n },\n path: { flex: 1, fontSize: 15, fontWeight: '500', height: 44, paddingVertical: 0 },\n barButton: { width: 36, height: 36, borderRadius: 18, alignItems: 'center', justifyContent: 'center' },\n barSpin: { marginRight: 4 },\n publish: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 6,\n height: 44,\n paddingHorizontal: 14,\n borderRadius: 12,\n },\n publishText: { fontSize: 15, fontWeight: '700' },\n publishDot: {\n position: 'absolute',\n top: -3,\n right: -3,\n width: 12,\n height: 12,\n borderRadius: 6,\n borderWidth: 2,\n backgroundColor: '#3b82f6',\n },\n menu: {\n position: 'absolute',\n minWidth: 220,\n paddingVertical: 6,\n borderRadius: 16,\n borderWidth: StyleSheet.hairlineWidth,\n shadowOpacity: 0.12,\n shadowRadius: 18,\n shadowOffset: { width: 0, height: 8 },\n elevation: 8,\n },\n menuRow: { flexDirection: 'row', alignItems: 'center', gap: 14, paddingHorizontal: 16, paddingVertical: 13 },\n menuLabel: { flex: 1, fontSize: 17 },\n routeMenu: {\n position: 'absolute',\n top: 62,\n left: 72,\n right: 72,\n zIndex: 20,\n padding: 6,\n borderRadius: 16,\n borderWidth: StyleSheet.hairlineWidth,\n shadowOpacity: 0.12,\n shadowRadius: 18,\n shadowOffset: { width: 0, height: 8 },\n elevation: 8,\n },\n routeScroll: { maxHeight: 280 },\n routeRow: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 10,\n paddingHorizontal: 12,\n paddingVertical: 12,\n borderRadius: 10,\n },\n routeText: { flex: 1 },\n routeLabel: { fontSize: 15, fontWeight: '500' },\n routeSub: { fontSize: 12, marginTop: 2 },\n routeEmpty: { fontSize: 14, padding: 12 },\n disabled: { opacity: 0.35 },\n cover: { alignItems: 'center', justifyContent: 'center', gap: 12, paddingHorizontal: 28, zIndex: 2 },\n coverTitle: { fontSize: 17, fontWeight: '700', textAlign: 'center' },\n coverBody: { fontSize: 14, lineHeight: 20, textAlign: 'center' },\n stage: { flex: 1, padding: 12 },\n frame: {\n flex: 1,\n borderRadius: 22,\n borderWidth: StyleSheet.hairlineWidth,\n overflow: 'hidden',\n shadowOpacity: 0.06,\n shadowRadius: 14,\n shadowOffset: { width: 0, height: 4 },\n elevation: 2,\n },\n});\n"],"names":["_a","_b"],"mappings":"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"}
|