@adminide-stack/yantra-mobile 12.0.108-alpha.0 → 12.0.109-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/compute.js +57 -1
- package/lib/compute.js.map +1 -1
- package/lib/config/env-config.js +8 -0
- package/lib/config/env-config.js.map +1 -1
- package/lib/features/apps/AppsCatalog.js +10 -0
- package/lib/features/apps/AppsCatalog.js.map +1 -1
- package/lib/features/apps/appArt.js +2 -1
- package/lib/features/apps/appArt.js.map +1 -1
- package/lib/features/apps/mobileAppCatalog.js +11 -0
- package/lib/features/apps/mobileAppCatalog.js.map +1 -1
- package/lib/features/apps/nativeAppHandoff.js +2 -1
- package/lib/features/apps/nativeAppHandoff.js.map +1 -1
- package/lib/features/health/healthSyncStore.js +7 -1
- package/lib/features/health/healthSyncStore.js.map +1 -1
- package/lib/features/messaging/NewGroupScreen.js.map +1 -1
- package/lib/features/messaging/useChatViewer.js +3 -2
- package/lib/features/messaging/useChatViewer.js.map +1 -1
- package/lib/features/webbuilder/WebBuilderExperience.js +474 -0
- package/lib/features/webbuilder/WebBuilderExperience.js.map +1 -0
- package/lib/features/webbuilder/brandKitStorage.js +69 -0
- package/lib/features/webbuilder/brandKitStorage.js.map +1 -0
- package/lib/features/webbuilder/buildFragments.js +360 -0
- package/lib/features/webbuilder/buildFragments.js.map +1 -0
- package/lib/features/webbuilder/components/BottomTabs.js +65 -0
- package/lib/features/webbuilder/components/BottomTabs.js.map +1 -0
- package/lib/features/webbuilder/components/BrandKitSheet.js +197 -0
- package/lib/features/webbuilder/components/BrandKitSheet.js.map +1 -0
- package/lib/features/webbuilder/components/CodeView.js +99 -0
- package/lib/features/webbuilder/components/CodeView.js.map +1 -0
- package/lib/features/webbuilder/components/Composer.js +217 -0
- package/lib/features/webbuilder/components/Composer.js.map +1 -0
- package/lib/features/webbuilder/components/PreviewFrame.js +72 -0
- package/lib/features/webbuilder/components/PreviewFrame.js.map +1 -0
- package/lib/features/webbuilder/components/PreviewPlaceholder.js +107 -0
- package/lib/features/webbuilder/components/PreviewPlaceholder.js.map +1 -0
- package/lib/features/webbuilder/components/PreviewScreen.js +200 -0
- package/lib/features/webbuilder/components/PreviewScreen.js.map +1 -0
- package/lib/features/webbuilder/components/ProjectChat.js +580 -0
- package/lib/features/webbuilder/components/ProjectChat.js.map +1 -0
- package/lib/features/webbuilder/components/ProjectsScreen.js +339 -0
- package/lib/features/webbuilder/components/ProjectsScreen.js.map +1 -0
- package/lib/features/webbuilder/components/PublishSheet.js +143 -0
- package/lib/features/webbuilder/components/PublishSheet.js.map +1 -0
- package/lib/features/webbuilder/components/SiteScoreSheet.js +73 -0
- package/lib/features/webbuilder/components/SiteScoreSheet.js.map +1 -0
- package/lib/features/webbuilder/components/StudioHome.js +367 -0
- package/lib/features/webbuilder/components/StudioHome.js.map +1 -0
- package/lib/features/webbuilder/components/TemplateCard.js +73 -0
- package/lib/features/webbuilder/components/TemplateCard.js.map +1 -0
- package/lib/features/webbuilder/components/TemplatesSheet.js +178 -0
- package/lib/features/webbuilder/components/TemplatesSheet.js.map +1 -0
- package/lib/features/webbuilder/components/VersionsSheet.js +57 -0
- package/lib/features/webbuilder/components/VersionsSheet.js.map +1 -0
- package/lib/features/webbuilder/components/ui.js +291 -0
- package/lib/features/webbuilder/components/ui.js.map +1 -0
- package/lib/features/webbuilder/nativeWebBuilderRegistry.js +15 -0
- package/lib/features/webbuilder/nativeWebBuilderRegistry.js.map +1 -0
- package/lib/features/webbuilder/studioCatalog.js +147 -0
- package/lib/features/webbuilder/studioCatalog.js.map +1 -0
- package/lib/features/webbuilder/webbuilderPrompts.js +42 -0
- package/lib/features/webbuilder/webbuilderPrompts.js.map +1 -0
- package/lib/features/webbuilder/webbuilderTheme.js +63 -0
- package/lib/features/webbuilder/webbuilderTheme.js.map +1 -0
- package/lib/features/webbuilder/workflow.js +540 -0
- package/lib/features/webbuilder/workflow.js.map +1 -0
- package/lib/hooks/useChatApi.js +7 -2
- package/lib/hooks/useChatApi.js.map +1 -1
- package/lib/hooks/useChatStream.js +1 -1
- package/lib/hooks/useChatStream.js.map +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/routes.json +106 -0
- package/lib/screens/WebBuilderNative/index.js +71 -0
- package/lib/screens/WebBuilderNative/index.js.map +1 -0
- package/lib/screens/WebBuilderNative/useCodeAssistantCatalog.js +45 -0
- package/lib/screens/WebBuilderNative/useCodeAssistantCatalog.js.map +1 -0
- package/lib/screens/WebBuilderNative/useWebBuilderGallery.js +125 -0
- package/lib/screens/WebBuilderNative/useWebBuilderGallery.js.map +1 -0
- package/lib/screens/WebBuilderNative/useWebBuilderHost.js +408 -0
- package/lib/screens/WebBuilderNative/useWebBuilderHost.js.map +1 -0
- package/lib/screens/WebBuilderNative/webbuilderTransport.js +88 -0
- package/lib/screens/WebBuilderNative/webbuilderTransport.js.map +1 -0
- package/package.json +4 -4
|
@@ -0,0 +1,178 @@
|
|
|
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;
|
|
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
|
+
function filterTemplates(list, query, category) {
|
|
13
|
+
const q = query.trim().toLowerCase();
|
|
14
|
+
return list.filter((t) => {
|
|
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
|
+
});
|
|
18
|
+
}
|
|
19
|
+
function TemplatesSheet({
|
|
20
|
+
visible,
|
|
21
|
+
onClose,
|
|
22
|
+
templates,
|
|
23
|
+
loading,
|
|
24
|
+
error,
|
|
25
|
+
onReload,
|
|
26
|
+
selectedId,
|
|
27
|
+
onPick,
|
|
28
|
+
theme
|
|
29
|
+
}) {
|
|
30
|
+
const insets = useSafeInsets();
|
|
31
|
+
const {
|
|
32
|
+
width
|
|
33
|
+
} = useWindowDimensions();
|
|
34
|
+
const cardWidth = Math.floor((width - GUTTER * 2 - GAP) / 2);
|
|
35
|
+
const [query, setQuery] = useState("");
|
|
36
|
+
const [category, setCategory] = useState(null);
|
|
37
|
+
const categories = useMemo(() => templateCategories(templates), [templates]);
|
|
38
|
+
const shown = useMemo(() => filterTemplates(templates, query, category), [templates, query, category]);
|
|
39
|
+
let body;
|
|
40
|
+
if (loading && templates.length === 0) {
|
|
41
|
+
body = /* @__PURE__ */ jsx(View, { style: styles.grid, children: [0, 1, 2, 3, 4, 5].map((i) => /* @__PURE__ */ jsxs(View, { style: [styles.skeleton, {
|
|
42
|
+
width: cardWidth
|
|
43
|
+
}], children: [
|
|
44
|
+
/* @__PURE__ */ jsx(View, { style: [styles.skeletonCover, {
|
|
45
|
+
backgroundColor: theme.chip
|
|
46
|
+
}] }),
|
|
47
|
+
/* @__PURE__ */ jsx(View, { style: [styles.skeletonLine, {
|
|
48
|
+
backgroundColor: theme.chip
|
|
49
|
+
}] })
|
|
50
|
+
] }, i)) });
|
|
51
|
+
} else if (error && templates.length === 0) {
|
|
52
|
+
body = /* @__PURE__ */ jsx(CenteredState, { icon: "cloud-off-outline", title: "Templates didn't load", body: error, theme, primary: onReload ? {
|
|
53
|
+
label: "Try again",
|
|
54
|
+
icon: "refresh",
|
|
55
|
+
onPress: onReload
|
|
56
|
+
} : void 0 });
|
|
57
|
+
} else if (shown.length === 0) {
|
|
58
|
+
body = /* @__PURE__ */ jsx(CenteredState, { icon: "text-search", title: templates.length ? "No template matches" : "No templates yet", body: templates.length ? "Try another word, or clear the category." : "Your workspace has no starter templates. Describe the site instead.", theme });
|
|
59
|
+
} else {
|
|
60
|
+
body = /* @__PURE__ */ jsx(View, { style: styles.grid, children: shown.map((t) => /* @__PURE__ */ jsx(TemplateCard, { template: t, width: cardWidth, theme, selected: t.id === selectedId, onPress: () => onPick(t) }, t.id)) });
|
|
61
|
+
}
|
|
62
|
+
return /* @__PURE__ */ jsx(Modal, { visible, animationType: "slide", presentationStyle: Platform.OS === "ios" ? "pageSheet" : "fullScreen", onRequestClose: onClose, children: /* @__PURE__ */ jsxs(View, { style: [styles.root, {
|
|
63
|
+
backgroundColor: theme.screen,
|
|
64
|
+
paddingTop: Platform.OS === "ios" ? 12 : insets.top
|
|
65
|
+
}], testID: "webbuilder-templates-sheet", children: [
|
|
66
|
+
/* @__PURE__ */ jsxs(View, { style: styles.header, children: [
|
|
67
|
+
/* @__PURE__ */ jsxs(View, { style: styles.headerText, children: [
|
|
68
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.title, {
|
|
69
|
+
color: theme.ink
|
|
70
|
+
}], children: "Templates" }),
|
|
71
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.subtitle, {
|
|
72
|
+
color: theme.muted
|
|
73
|
+
}], children: "Start from a design and make it yours." })
|
|
74
|
+
] }),
|
|
75
|
+
/* @__PURE__ */ jsx(IconButton, { icon: "close", label: "Close", onPress: onClose, theme })
|
|
76
|
+
] }),
|
|
77
|
+
/* @__PURE__ */ jsxs(ScrollView, { contentContainerStyle: [styles.body, {
|
|
78
|
+
paddingBottom: insets.bottom + 24
|
|
79
|
+
}], keyboardShouldPersistTaps: "handled", children: [
|
|
80
|
+
/* @__PURE__ */ jsxs(View, { style: [styles.search, {
|
|
81
|
+
backgroundColor: theme.card,
|
|
82
|
+
borderColor: theme.border
|
|
83
|
+
}], children: [
|
|
84
|
+
/* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "magnify", size: 18, color: theme.faint }),
|
|
85
|
+
/* @__PURE__ */ jsx(TextInput, { value: query, onChangeText: setQuery, placeholder: "Search templates", placeholderTextColor: theme.faint, style: [styles.searchInput, {
|
|
86
|
+
color: theme.ink
|
|
87
|
+
}], accessibilityLabel: "Search templates", testID: "webbuilder-template-search" })
|
|
88
|
+
] }),
|
|
89
|
+
categories.length > 1 ? /* @__PURE__ */ jsx(ScrollView, { horizontal: true, showsHorizontalScrollIndicator: false, contentContainerStyle: styles.cats, children: [null, ...categories].map((c) => {
|
|
90
|
+
const active = c === category;
|
|
91
|
+
return /* @__PURE__ */ jsx(Tap, { onPress: () => setCategory(c), accessibilityRole: "button", accessibilityState: {
|
|
92
|
+
selected: active
|
|
93
|
+
}, style: [styles.cat, active ? {
|
|
94
|
+
backgroundColor: theme.ink,
|
|
95
|
+
borderColor: theme.ink
|
|
96
|
+
} : {
|
|
97
|
+
backgroundColor: theme.card,
|
|
98
|
+
borderColor: theme.border
|
|
99
|
+
}], pressedStyle: DIM, children: /* @__PURE__ */ jsx(Text, { style: [styles.catLabel, {
|
|
100
|
+
color: active ? theme.card : theme.ink
|
|
101
|
+
}], children: c != null ? c : "All" }) }, c != null ? c : "all");
|
|
102
|
+
}) }) : null,
|
|
103
|
+
body
|
|
104
|
+
] })
|
|
105
|
+
] }) });
|
|
106
|
+
}
|
|
107
|
+
const styles = StyleSheet.create({
|
|
108
|
+
root: {
|
|
109
|
+
flex: 1
|
|
110
|
+
},
|
|
111
|
+
header: {
|
|
112
|
+
flexDirection: "row",
|
|
113
|
+
alignItems: "flex-start",
|
|
114
|
+
gap: 8,
|
|
115
|
+
paddingHorizontal: GUTTER,
|
|
116
|
+
paddingBottom: 12
|
|
117
|
+
},
|
|
118
|
+
headerText: {
|
|
119
|
+
flex: 1,
|
|
120
|
+
gap: 2
|
|
121
|
+
},
|
|
122
|
+
title: {
|
|
123
|
+
fontSize: 22,
|
|
124
|
+
fontWeight: "700",
|
|
125
|
+
letterSpacing: -0.4
|
|
126
|
+
},
|
|
127
|
+
subtitle: {
|
|
128
|
+
fontSize: 14
|
|
129
|
+
},
|
|
130
|
+
body: {
|
|
131
|
+
paddingHorizontal: GUTTER,
|
|
132
|
+
gap: 14
|
|
133
|
+
},
|
|
134
|
+
search: {
|
|
135
|
+
flexDirection: "row",
|
|
136
|
+
alignItems: "center",
|
|
137
|
+
gap: 8,
|
|
138
|
+
borderRadius: 12,
|
|
139
|
+
borderWidth: StyleSheet.hairlineWidth,
|
|
140
|
+
paddingHorizontal: 12
|
|
141
|
+
},
|
|
142
|
+
searchInput: {
|
|
143
|
+
flex: 1,
|
|
144
|
+
fontSize: 15,
|
|
145
|
+
paddingVertical: 11
|
|
146
|
+
},
|
|
147
|
+
cats: {
|
|
148
|
+
gap: 8
|
|
149
|
+
},
|
|
150
|
+
cat: {
|
|
151
|
+
paddingHorizontal: 14,
|
|
152
|
+
paddingVertical: 7,
|
|
153
|
+
borderRadius: 999,
|
|
154
|
+
borderWidth: StyleSheet.hairlineWidth
|
|
155
|
+
},
|
|
156
|
+
catLabel: {
|
|
157
|
+
fontSize: 13,
|
|
158
|
+
fontWeight: "600"
|
|
159
|
+
},
|
|
160
|
+
grid: {
|
|
161
|
+
flexDirection: "row",
|
|
162
|
+
flexWrap: "wrap",
|
|
163
|
+
columnGap: GAP,
|
|
164
|
+
rowGap: 18
|
|
165
|
+
},
|
|
166
|
+
skeleton: {
|
|
167
|
+
gap: 8
|
|
168
|
+
},
|
|
169
|
+
skeletonCover: {
|
|
170
|
+
aspectRatio: 16 / 10,
|
|
171
|
+
borderRadius: 14
|
|
172
|
+
},
|
|
173
|
+
skeletonLine: {
|
|
174
|
+
height: 12,
|
|
175
|
+
width: "70%",
|
|
176
|
+
borderRadius: 6
|
|
177
|
+
}
|
|
178
|
+
});export{TemplatesSheet,filterTemplates,templateCategories};//# sourceMappingURL=TemplatesSheet.js.map
|
|
@@ -0,0 +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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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import {jsx,jsxs}from'react/jsx-runtime';import {StyleSheet,ScrollView,View,Text}from'react-native';import {MaterialCommunityIcons}from'@expo/vector-icons';import {Tap,DIM}from'../../inbox/components/Tap.js';import {relativeTime}from'../buildFragments.js';import {Sheet,Pill}from'./ui.js';function VersionsSheet({
|
|
2
|
+
visible,
|
|
3
|
+
builds,
|
|
4
|
+
selectedKey,
|
|
5
|
+
onSelect,
|
|
6
|
+
onClose,
|
|
7
|
+
theme
|
|
8
|
+
}) {
|
|
9
|
+
return /* @__PURE__ */ jsx(Sheet, { visible, title: "Versions", onClose, theme, testID: "webbuilder-versions", children: /* @__PURE__ */ jsx(ScrollView, { style: styles.list, contentContainerStyle: styles.content, children: builds.map((build, index) => {
|
|
10
|
+
const selected = build.key === selectedKey || !selectedKey && index === 0;
|
|
11
|
+
return /* @__PURE__ */ jsxs(Tap, { onPress: () => onSelect(build), accessibilityRole: "button", accessibilityState: {
|
|
12
|
+
selected
|
|
13
|
+
}, accessibilityLabel: `Version ${builds.length - index}, ${relativeTime(build.updatedAt)}`, style: [styles.row, {
|
|
14
|
+
borderColor: selected ? theme.accent : theme.border,
|
|
15
|
+
backgroundColor: theme.card
|
|
16
|
+
}], pressedStyle: DIM, testID: `webbuilder-version-${index}`, children: [
|
|
17
|
+
/* @__PURE__ */ jsx(MaterialCommunityIcons, { name: selected ? "radiobox-marked" : "radiobox-blank", size: 20, color: selected ? theme.accent : theme.faint }),
|
|
18
|
+
/* @__PURE__ */ jsxs(View, { style: styles.text, children: [
|
|
19
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.title, {
|
|
20
|
+
color: theme.ink
|
|
21
|
+
}], numberOfLines: 1, children: index === 0 ? "Latest" : `Version ${builds.length - index}` }),
|
|
22
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.meta, {
|
|
23
|
+
color: theme.muted
|
|
24
|
+
}], numberOfLines: 1, children: relativeTime(build.updatedAt) })
|
|
25
|
+
] }),
|
|
26
|
+
build.liveUrl ? /* @__PURE__ */ jsx(Pill, { label: "Published", tone: "live", theme }) : null
|
|
27
|
+
] }, build.key);
|
|
28
|
+
}) }) });
|
|
29
|
+
}
|
|
30
|
+
const styles = StyleSheet.create({
|
|
31
|
+
list: {
|
|
32
|
+
maxHeight: 420
|
|
33
|
+
},
|
|
34
|
+
content: {
|
|
35
|
+
gap: 8,
|
|
36
|
+
paddingBottom: 8
|
|
37
|
+
},
|
|
38
|
+
row: {
|
|
39
|
+
flexDirection: "row",
|
|
40
|
+
alignItems: "center",
|
|
41
|
+
gap: 12,
|
|
42
|
+
padding: 14,
|
|
43
|
+
borderRadius: 12,
|
|
44
|
+
borderWidth: 1
|
|
45
|
+
},
|
|
46
|
+
text: {
|
|
47
|
+
flex: 1
|
|
48
|
+
},
|
|
49
|
+
title: {
|
|
50
|
+
fontSize: 15,
|
|
51
|
+
fontWeight: "600"
|
|
52
|
+
},
|
|
53
|
+
meta: {
|
|
54
|
+
fontSize: 13,
|
|
55
|
+
marginTop: 2
|
|
56
|
+
}
|
|
57
|
+
});export{VersionsSheet};//# sourceMappingURL=VersionsSheet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VersionsSheet.js","sources":["../../../../src/features/webbuilder/components/VersionsSheet.tsx"],"sourcesContent":["/**\n * Every build of the open site, newest first - the phone's version history.\n * Picking one previews it; the agent's next edit then works on that build.\n */\nimport React from 'react';\nimport { ScrollView, StyleSheet, Text, View } from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { DIM, Tap } from '../../inbox/components/Tap';\nimport { relativeTime } from '../buildFragments';\nimport type { WebBuilderBuild } from '../types';\nimport type { WebBuilderTheme } from '../webbuilderTheme';\nimport { Pill, Sheet } from './ui';\n\nexport function VersionsSheet({\n visible,\n builds,\n selectedKey,\n onSelect,\n onClose,\n theme,\n}: {\n visible: boolean;\n builds: WebBuilderBuild[];\n selectedKey: string | null;\n onSelect: (build: WebBuilderBuild) => void;\n onClose: () => void;\n theme: WebBuilderTheme;\n}) {\n return (\n <Sheet visible={visible} title=\"Versions\" onClose={onClose} theme={theme} testID=\"webbuilder-versions\">\n <ScrollView style={styles.list} contentContainerStyle={styles.content}>\n {builds.map((build, index) => {\n const selected = build.key === selectedKey || (!selectedKey && index === 0);\n return (\n <Tap\n key={build.key}\n onPress={() => onSelect(build)}\n accessibilityRole=\"button\"\n accessibilityState={{ selected }}\n accessibilityLabel={`Version ${builds.length - index}, ${relativeTime(build.updatedAt)}`}\n style={[\n styles.row,\n { borderColor: selected ? theme.accent : theme.border, backgroundColor: theme.card },\n ]}\n pressedStyle={DIM}\n testID={`webbuilder-version-${index}`}\n >\n <MaterialCommunityIcons\n name={selected ? 'radiobox-marked' : 'radiobox-blank'}\n size={20}\n color={selected ? theme.accent : theme.faint}\n />\n <View style={styles.text}>\n <Text style={[styles.title, { color: theme.ink }]} numberOfLines={1}>\n {index === 0 ? 'Latest' : `Version ${builds.length - index}`}\n </Text>\n <Text style={[styles.meta, { color: theme.muted }]} numberOfLines={1}>\n {relativeTime(build.updatedAt)}\n </Text>\n </View>\n {build.liveUrl ? <Pill label=\"Published\" tone=\"live\" theme={theme} /> : null}\n </Tap>\n );\n })}\n </ScrollView>\n </Sheet>\n );\n}\n\nconst styles = StyleSheet.create({\n list: { maxHeight: 420 },\n content: { gap: 8, paddingBottom: 8 },\n row: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 12,\n padding: 14,\n borderRadius: 12,\n borderWidth: 1,\n },\n text: { flex: 1 },\n title: { fontSize: 15, fontWeight: '600' },\n meta: { fontSize: 13, marginTop: 2 },\n});\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
import {jsx,jsxs,Fragment}from'react/jsx-runtime';import {useRef,useEffect}from'react';import {StyleSheet,Animated,Text,View,ActivityIndicator,Modal,KeyboardAvoidingView,Platform}from'react-native';import {MaterialCommunityIcons}from'@expo/vector-icons';import {Tap,DIM}from'../../inbox/components/Tap.js';function IconButton({
|
|
2
|
+
icon,
|
|
3
|
+
label,
|
|
4
|
+
onPress,
|
|
5
|
+
theme,
|
|
6
|
+
disabled = false,
|
|
7
|
+
tint,
|
|
8
|
+
testID
|
|
9
|
+
}) {
|
|
10
|
+
return /* @__PURE__ */ jsx(Tap, { onPress, disabled, accessibilityRole: "button", accessibilityLabel: label, hitSlop: 8, style: [styles.iconButton, disabled && styles.disabled], pressedStyle: DIM, testID, children: /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: icon, size: 22, color: tint != null ? tint : theme.ink }) });
|
|
11
|
+
}
|
|
12
|
+
function Pill({
|
|
13
|
+
label,
|
|
14
|
+
tone,
|
|
15
|
+
theme
|
|
16
|
+
}) {
|
|
17
|
+
const colors = {
|
|
18
|
+
live: {
|
|
19
|
+
ink: theme.good,
|
|
20
|
+
fill: theme.goodSoft
|
|
21
|
+
},
|
|
22
|
+
busy: {
|
|
23
|
+
ink: theme.accent,
|
|
24
|
+
fill: theme.accentSoft
|
|
25
|
+
},
|
|
26
|
+
draft: {
|
|
27
|
+
ink: theme.muted,
|
|
28
|
+
fill: theme.chip
|
|
29
|
+
}
|
|
30
|
+
}[tone];
|
|
31
|
+
return /* @__PURE__ */ jsxs(View, { style: [styles.pill, {
|
|
32
|
+
backgroundColor: colors.fill
|
|
33
|
+
}], children: [
|
|
34
|
+
tone === "live" ? /* @__PURE__ */ jsx(View, { style: [styles.dot, {
|
|
35
|
+
backgroundColor: colors.ink
|
|
36
|
+
}] }) : null,
|
|
37
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.pillLabel, {
|
|
38
|
+
color: colors.ink
|
|
39
|
+
}], children: label })
|
|
40
|
+
] });
|
|
41
|
+
}
|
|
42
|
+
function PrimaryButton({
|
|
43
|
+
label,
|
|
44
|
+
icon,
|
|
45
|
+
onPress,
|
|
46
|
+
theme,
|
|
47
|
+
busy = false,
|
|
48
|
+
disabled = false,
|
|
49
|
+
style,
|
|
50
|
+
testID
|
|
51
|
+
}) {
|
|
52
|
+
const off = disabled || busy;
|
|
53
|
+
return /* @__PURE__ */ jsx(Tap, { onPress, disabled: off, accessibilityRole: "button", accessibilityLabel: label, accessibilityState: {
|
|
54
|
+
disabled: off,
|
|
55
|
+
busy
|
|
56
|
+
}, style: [styles.primary, {
|
|
57
|
+
backgroundColor: theme.accent
|
|
58
|
+
}, disabled && styles.disabled, style], pressedStyle: DIM, testID, children: busy ? /* @__PURE__ */ jsx(ActivityIndicator, { size: "small", color: theme.accentInk }) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
59
|
+
icon ? /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: icon, size: 18, color: theme.accentInk }) : null,
|
|
60
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.primaryLabel, {
|
|
61
|
+
color: theme.accentInk
|
|
62
|
+
}], children: label })
|
|
63
|
+
] }) });
|
|
64
|
+
}
|
|
65
|
+
function SecondaryButton({
|
|
66
|
+
label,
|
|
67
|
+
icon,
|
|
68
|
+
onPress,
|
|
69
|
+
theme,
|
|
70
|
+
testID
|
|
71
|
+
}) {
|
|
72
|
+
return /* @__PURE__ */ jsxs(Tap, { onPress, accessibilityRole: "button", accessibilityLabel: label, style: [styles.secondary, {
|
|
73
|
+
borderColor: theme.border,
|
|
74
|
+
backgroundColor: theme.card
|
|
75
|
+
}], pressedStyle: DIM, testID, children: [
|
|
76
|
+
icon ? /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: icon, size: 18, color: theme.ink }) : null,
|
|
77
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.secondaryLabel, {
|
|
78
|
+
color: theme.ink
|
|
79
|
+
}], children: label })
|
|
80
|
+
] });
|
|
81
|
+
}
|
|
82
|
+
function CenteredState({
|
|
83
|
+
icon,
|
|
84
|
+
title,
|
|
85
|
+
body,
|
|
86
|
+
theme,
|
|
87
|
+
primary,
|
|
88
|
+
secondary,
|
|
89
|
+
busy = false,
|
|
90
|
+
testID
|
|
91
|
+
}) {
|
|
92
|
+
return /* @__PURE__ */ jsxs(View, { style: styles.center, testID, children: [
|
|
93
|
+
/* @__PURE__ */ jsx(View, { style: [styles.iconBubble, {
|
|
94
|
+
backgroundColor: theme.accentSoft
|
|
95
|
+
}], children: busy ? /* @__PURE__ */ jsx(ActivityIndicator, { color: theme.accent }) : /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: icon, size: 30, color: theme.accent }) }),
|
|
96
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.title, {
|
|
97
|
+
color: theme.ink
|
|
98
|
+
}], children: title }),
|
|
99
|
+
body ? /* @__PURE__ */ jsx(Text, { style: [styles.body, {
|
|
100
|
+
color: theme.muted
|
|
101
|
+
}], children: body }) : null,
|
|
102
|
+
primary ? /* @__PURE__ */ jsx(PrimaryButton, { label: primary.label, icon: primary.icon, onPress: primary.onPress, theme, style: styles.stateButton, testID: testID ? `${testID}-primary` : void 0 }) : null,
|
|
103
|
+
secondary ? /* @__PURE__ */ jsx(Tap, { onPress: secondary.onPress, accessibilityRole: "button", style: styles.link, pressedStyle: DIM, testID: testID ? `${testID}-secondary` : void 0, children: /* @__PURE__ */ jsx(Text, { style: [styles.linkLabel, {
|
|
104
|
+
color: theme.accent
|
|
105
|
+
}], children: secondary.label }) }) : null
|
|
106
|
+
] });
|
|
107
|
+
}
|
|
108
|
+
function Sheet({
|
|
109
|
+
visible,
|
|
110
|
+
title,
|
|
111
|
+
onClose,
|
|
112
|
+
theme,
|
|
113
|
+
children,
|
|
114
|
+
testID
|
|
115
|
+
}) {
|
|
116
|
+
return /* @__PURE__ */ jsx(Modal, { visible, transparent: true, animationType: "slide", onRequestClose: onClose, children: /* @__PURE__ */ jsxs(KeyboardAvoidingView, { style: styles.sheetRoot, behavior: Platform.OS === "ios" ? "padding" : void 0, testID, children: [
|
|
117
|
+
/* @__PURE__ */ jsx(Tap, { style: [StyleSheet.absoluteFill, {
|
|
118
|
+
backgroundColor: theme.backdrop
|
|
119
|
+
}], onPress: onClose, accessibilityLabel: "Close" }),
|
|
120
|
+
/* @__PURE__ */ jsxs(View, { style: [styles.sheet, {
|
|
121
|
+
backgroundColor: theme.card
|
|
122
|
+
}], children: [
|
|
123
|
+
/* @__PURE__ */ jsx(View, { style: [styles.grabber, {
|
|
124
|
+
backgroundColor: theme.border
|
|
125
|
+
}] }),
|
|
126
|
+
/* @__PURE__ */ jsxs(View, { style: styles.sheetHeader, children: [
|
|
127
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.sheetTitle, {
|
|
128
|
+
color: theme.ink
|
|
129
|
+
}], children: title }),
|
|
130
|
+
/* @__PURE__ */ jsx(IconButton, { icon: "close", label: "Close", onPress: onClose, theme, tint: theme.muted })
|
|
131
|
+
] }),
|
|
132
|
+
children
|
|
133
|
+
] })
|
|
134
|
+
] }) });
|
|
135
|
+
}
|
|
136
|
+
function Toast({
|
|
137
|
+
message,
|
|
138
|
+
theme,
|
|
139
|
+
bottom
|
|
140
|
+
}) {
|
|
141
|
+
const opacity = useRef(new Animated.Value(0)).current;
|
|
142
|
+
useEffect(() => {
|
|
143
|
+
Animated.timing(opacity, {
|
|
144
|
+
toValue: message ? 1 : 0,
|
|
145
|
+
duration: 180,
|
|
146
|
+
useNativeDriver: true
|
|
147
|
+
}).start();
|
|
148
|
+
}, [message, opacity]);
|
|
149
|
+
if (!message) return null;
|
|
150
|
+
return /* @__PURE__ */ jsx(Animated.View, { pointerEvents: "none", style: [styles.toast, {
|
|
151
|
+
backgroundColor: theme.toast,
|
|
152
|
+
bottom,
|
|
153
|
+
opacity
|
|
154
|
+
}], accessibilityLiveRegion: "polite", children: /* @__PURE__ */ jsx(Text, { style: [styles.toastLabel, {
|
|
155
|
+
color: theme.toastInk
|
|
156
|
+
}], children: message }) });
|
|
157
|
+
}
|
|
158
|
+
const styles = StyleSheet.create({
|
|
159
|
+
iconButton: {
|
|
160
|
+
width: 40,
|
|
161
|
+
height: 40,
|
|
162
|
+
alignItems: "center",
|
|
163
|
+
justifyContent: "center",
|
|
164
|
+
borderRadius: 20
|
|
165
|
+
},
|
|
166
|
+
disabled: {
|
|
167
|
+
opacity: 0.4
|
|
168
|
+
},
|
|
169
|
+
pill: {
|
|
170
|
+
flexDirection: "row",
|
|
171
|
+
alignItems: "center",
|
|
172
|
+
gap: 5,
|
|
173
|
+
paddingHorizontal: 8,
|
|
174
|
+
paddingVertical: 3,
|
|
175
|
+
borderRadius: 999
|
|
176
|
+
},
|
|
177
|
+
dot: {
|
|
178
|
+
width: 6,
|
|
179
|
+
height: 6,
|
|
180
|
+
borderRadius: 3
|
|
181
|
+
},
|
|
182
|
+
pillLabel: {
|
|
183
|
+
fontSize: 12,
|
|
184
|
+
fontWeight: "600"
|
|
185
|
+
},
|
|
186
|
+
primary: {
|
|
187
|
+
flexDirection: "row",
|
|
188
|
+
alignItems: "center",
|
|
189
|
+
justifyContent: "center",
|
|
190
|
+
gap: 8,
|
|
191
|
+
minHeight: 46,
|
|
192
|
+
paddingHorizontal: 18,
|
|
193
|
+
borderRadius: 12
|
|
194
|
+
},
|
|
195
|
+
primaryLabel: {
|
|
196
|
+
fontSize: 15,
|
|
197
|
+
fontWeight: "700"
|
|
198
|
+
},
|
|
199
|
+
secondary: {
|
|
200
|
+
flexDirection: "row",
|
|
201
|
+
alignItems: "center",
|
|
202
|
+
justifyContent: "center",
|
|
203
|
+
gap: 8,
|
|
204
|
+
minHeight: 46,
|
|
205
|
+
paddingHorizontal: 16,
|
|
206
|
+
borderRadius: 12,
|
|
207
|
+
borderWidth: StyleSheet.hairlineWidth
|
|
208
|
+
},
|
|
209
|
+
secondaryLabel: {
|
|
210
|
+
fontSize: 15,
|
|
211
|
+
fontWeight: "600"
|
|
212
|
+
},
|
|
213
|
+
center: {
|
|
214
|
+
flex: 1,
|
|
215
|
+
alignItems: "center",
|
|
216
|
+
justifyContent: "center",
|
|
217
|
+
paddingHorizontal: 32,
|
|
218
|
+
paddingVertical: 40
|
|
219
|
+
},
|
|
220
|
+
iconBubble: {
|
|
221
|
+
width: 64,
|
|
222
|
+
height: 64,
|
|
223
|
+
borderRadius: 32,
|
|
224
|
+
alignItems: "center",
|
|
225
|
+
justifyContent: "center",
|
|
226
|
+
marginBottom: 16
|
|
227
|
+
},
|
|
228
|
+
title: {
|
|
229
|
+
fontSize: 18,
|
|
230
|
+
fontWeight: "700",
|
|
231
|
+
textAlign: "center"
|
|
232
|
+
},
|
|
233
|
+
body: {
|
|
234
|
+
fontSize: 14,
|
|
235
|
+
lineHeight: 20,
|
|
236
|
+
textAlign: "center",
|
|
237
|
+
marginTop: 8
|
|
238
|
+
},
|
|
239
|
+
stateButton: {
|
|
240
|
+
marginTop: 20,
|
|
241
|
+
alignSelf: "stretch"
|
|
242
|
+
},
|
|
243
|
+
link: {
|
|
244
|
+
marginTop: 14,
|
|
245
|
+
padding: 6
|
|
246
|
+
},
|
|
247
|
+
linkLabel: {
|
|
248
|
+
fontSize: 15,
|
|
249
|
+
fontWeight: "600"
|
|
250
|
+
},
|
|
251
|
+
sheetRoot: {
|
|
252
|
+
flex: 1,
|
|
253
|
+
justifyContent: "flex-end"
|
|
254
|
+
},
|
|
255
|
+
sheet: {
|
|
256
|
+
borderTopLeftRadius: 20,
|
|
257
|
+
borderTopRightRadius: 20,
|
|
258
|
+
paddingHorizontal: 20,
|
|
259
|
+
paddingBottom: 32
|
|
260
|
+
},
|
|
261
|
+
grabber: {
|
|
262
|
+
alignSelf: "center",
|
|
263
|
+
width: 40,
|
|
264
|
+
height: 4,
|
|
265
|
+
borderRadius: 2,
|
|
266
|
+
marginTop: 8
|
|
267
|
+
},
|
|
268
|
+
sheetHeader: {
|
|
269
|
+
flexDirection: "row",
|
|
270
|
+
alignItems: "center",
|
|
271
|
+
justifyContent: "space-between",
|
|
272
|
+
paddingVertical: 10
|
|
273
|
+
},
|
|
274
|
+
sheetTitle: {
|
|
275
|
+
fontSize: 18,
|
|
276
|
+
fontWeight: "700"
|
|
277
|
+
},
|
|
278
|
+
toast: {
|
|
279
|
+
position: "absolute",
|
|
280
|
+
alignSelf: "center",
|
|
281
|
+
paddingHorizontal: 16,
|
|
282
|
+
paddingVertical: 10,
|
|
283
|
+
borderRadius: 999,
|
|
284
|
+
maxWidth: "86%"
|
|
285
|
+
},
|
|
286
|
+
toastLabel: {
|
|
287
|
+
fontSize: 14,
|
|
288
|
+
fontWeight: "600",
|
|
289
|
+
textAlign: "center"
|
|
290
|
+
}
|
|
291
|
+
});export{CenteredState,IconButton,Pill,PrimaryButton,SecondaryButton,Sheet,Toast};//# sourceMappingURL=ui.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui.js","sources":["../../../../src/features/webbuilder/components/ui.tsx"],"sourcesContent":["/**\n * The small pieces every Web Builder screen shares: icon buttons, status\n * pills, a whole-panel message, a bottom sheet and the toast.\n */\nimport React, { useEffect, useRef, type ReactNode } from 'react';\nimport {\n ActivityIndicator,\n Animated,\n KeyboardAvoidingView,\n Modal,\n Platform,\n StyleSheet,\n Text,\n View,\n type StyleProp,\n type ViewStyle,\n} from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { DIM, Tap } from '../../inbox/components/Tap';\nimport type { WebBuilderTheme } from '../webbuilderTheme';\n\nexport type IconName = React.ComponentProps<typeof MaterialCommunityIcons>['name'];\n\nexport function IconButton({\n icon,\n label,\n onPress,\n theme,\n disabled = false,\n tint,\n testID,\n}: {\n icon: IconName;\n label: string;\n onPress: () => void;\n theme: WebBuilderTheme;\n disabled?: boolean;\n tint?: string;\n testID?: string;\n}) {\n return (\n <Tap\n onPress={onPress}\n disabled={disabled}\n accessibilityRole=\"button\"\n accessibilityLabel={label}\n hitSlop={8}\n style={[styles.iconButton, disabled && styles.disabled]}\n pressedStyle={DIM}\n testID={testID}\n >\n <MaterialCommunityIcons name={icon} size={22} color={tint ?? theme.ink} />\n </Tap>\n );\n}\n\nexport function Pill({\n label,\n tone,\n theme,\n}: {\n label: string;\n tone: 'live' | 'busy' | 'draft';\n theme: WebBuilderTheme;\n}) {\n const colors = {\n live: { ink: theme.good, fill: theme.goodSoft },\n busy: { ink: theme.accent, fill: theme.accentSoft },\n draft: { ink: theme.muted, fill: theme.chip },\n }[tone];\n return (\n <View style={[styles.pill, { backgroundColor: colors.fill }]}>\n {tone === 'live' ? <View style={[styles.dot, { backgroundColor: colors.ink }]} /> : null}\n <Text style={[styles.pillLabel, { color: colors.ink }]}>{label}</Text>\n </View>\n );\n}\n\nexport function PrimaryButton({\n label,\n icon,\n onPress,\n theme,\n busy = false,\n disabled = false,\n style,\n testID,\n}: {\n label: string;\n icon?: IconName;\n onPress: () => void;\n theme: WebBuilderTheme;\n busy?: boolean;\n disabled?: boolean;\n style?: StyleProp<ViewStyle>;\n testID?: string;\n}) {\n const off = disabled || busy;\n return (\n <Tap\n onPress={onPress}\n disabled={off}\n accessibilityRole=\"button\"\n accessibilityLabel={label}\n accessibilityState={{ disabled: off, busy }}\n style={[styles.primary, { backgroundColor: theme.accent }, disabled && styles.disabled, style]}\n pressedStyle={DIM}\n testID={testID}\n >\n {busy ? (\n <ActivityIndicator size=\"small\" color={theme.accentInk} />\n ) : (\n <>\n {icon ? <MaterialCommunityIcons name={icon} size={18} color={theme.accentInk} /> : null}\n <Text style={[styles.primaryLabel, { color: theme.accentInk }]}>{label}</Text>\n </>\n )}\n </Tap>\n );\n}\n\nexport function SecondaryButton({\n label,\n icon,\n onPress,\n theme,\n testID,\n}: {\n label: string;\n icon?: IconName;\n onPress: () => void;\n theme: WebBuilderTheme;\n testID?: string;\n}) {\n return (\n <Tap\n onPress={onPress}\n accessibilityRole=\"button\"\n accessibilityLabel={label}\n style={[styles.secondary, { borderColor: theme.border, backgroundColor: theme.card }]}\n pressedStyle={DIM}\n testID={testID}\n >\n {icon ? <MaterialCommunityIcons name={icon} size={18} color={theme.ink} /> : null}\n <Text style={[styles.secondaryLabel, { color: theme.ink }]}>{label}</Text>\n </Tap>\n );\n}\n\nexport function CenteredState({\n icon,\n title,\n body,\n theme,\n primary,\n secondary,\n busy = false,\n testID,\n}: {\n icon: IconName;\n title: string;\n body?: string;\n theme: WebBuilderTheme;\n primary?: { label: string; onPress: () => void; icon?: IconName };\n secondary?: { label: string; onPress: () => void };\n busy?: boolean;\n testID?: string;\n}) {\n return (\n <View style={styles.center} testID={testID}>\n <View style={[styles.iconBubble, { backgroundColor: theme.accentSoft }]}>\n {busy ? (\n <ActivityIndicator color={theme.accent} />\n ) : (\n <MaterialCommunityIcons name={icon} size={30} color={theme.accent} />\n )}\n </View>\n <Text style={[styles.title, { color: theme.ink }]}>{title}</Text>\n {body ? <Text style={[styles.body, { color: theme.muted }]}>{body}</Text> : null}\n {primary ? (\n <PrimaryButton\n label={primary.label}\n icon={primary.icon}\n onPress={primary.onPress}\n theme={theme}\n style={styles.stateButton}\n testID={testID ? `${testID}-primary` : undefined}\n />\n ) : null}\n {secondary ? (\n <Tap\n onPress={secondary.onPress}\n accessibilityRole=\"button\"\n style={styles.link}\n pressedStyle={DIM}\n testID={testID ? `${testID}-secondary` : undefined}\n >\n <Text style={[styles.linkLabel, { color: theme.accent }]}>{secondary.label}</Text>\n </Tap>\n ) : null}\n </View>\n );\n}\n\nexport function Sheet({\n visible,\n title,\n onClose,\n theme,\n children,\n testID,\n}: {\n visible: boolean;\n title: string;\n onClose: () => void;\n theme: WebBuilderTheme;\n children: ReactNode;\n testID?: string;\n}) {\n return (\n <Modal visible={visible} transparent animationType=\"slide\" onRequestClose={onClose}>\n <KeyboardAvoidingView\n style={styles.sheetRoot}\n behavior={Platform.OS === 'ios' ? 'padding' : undefined}\n testID={testID}\n >\n <Tap\n style={[StyleSheet.absoluteFill, { backgroundColor: theme.backdrop }]}\n onPress={onClose}\n accessibilityLabel=\"Close\"\n />\n <View style={[styles.sheet, { backgroundColor: theme.card }]}>\n <View style={[styles.grabber, { backgroundColor: theme.border }]} />\n <View style={styles.sheetHeader}>\n <Text style={[styles.sheetTitle, { color: theme.ink }]}>{title}</Text>\n <IconButton icon=\"close\" label=\"Close\" onPress={onClose} theme={theme} tint={theme.muted} />\n </View>\n {children}\n </View>\n </KeyboardAvoidingView>\n </Modal>\n );\n}\n\nexport function Toast({ message, theme, bottom }: { message: string | null; theme: WebBuilderTheme; bottom: number }) {\n const opacity = useRef(new Animated.Value(0)).current;\n useEffect(() => {\n Animated.timing(opacity, { toValue: message ? 1 : 0, duration: 180, useNativeDriver: true }).start();\n }, [message, opacity]);\n if (!message) return null;\n return (\n <Animated.View\n pointerEvents=\"none\"\n style={[styles.toast, { backgroundColor: theme.toast, bottom, opacity }]}\n accessibilityLiveRegion=\"polite\"\n >\n <Text style={[styles.toastLabel, { color: theme.toastInk }]}>{message}</Text>\n </Animated.View>\n );\n}\n\nconst styles = StyleSheet.create({\n iconButton: { width: 40, height: 40, alignItems: 'center', justifyContent: 'center', borderRadius: 20 },\n disabled: { opacity: 0.4 },\n pill: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 5,\n paddingHorizontal: 8,\n paddingVertical: 3,\n borderRadius: 999,\n },\n dot: { width: 6, height: 6, borderRadius: 3 },\n pillLabel: { fontSize: 12, fontWeight: '600' },\n primary: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 8,\n minHeight: 46,\n paddingHorizontal: 18,\n borderRadius: 12,\n },\n primaryLabel: { fontSize: 15, fontWeight: '700' },\n secondary: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 8,\n minHeight: 46,\n paddingHorizontal: 16,\n borderRadius: 12,\n borderWidth: StyleSheet.hairlineWidth,\n },\n secondaryLabel: { fontSize: 15, fontWeight: '600' },\n center: { flex: 1, alignItems: 'center', justifyContent: 'center', paddingHorizontal: 32, paddingVertical: 40 },\n iconBubble: {\n width: 64,\n height: 64,\n borderRadius: 32,\n alignItems: 'center',\n justifyContent: 'center',\n marginBottom: 16,\n },\n title: { fontSize: 18, fontWeight: '700', textAlign: 'center' },\n body: { fontSize: 14, lineHeight: 20, textAlign: 'center', marginTop: 8 },\n stateButton: { marginTop: 20, alignSelf: 'stretch' },\n link: { marginTop: 14, padding: 6 },\n linkLabel: { fontSize: 15, fontWeight: '600' },\n sheetRoot: { flex: 1, justifyContent: 'flex-end' },\n sheet: { borderTopLeftRadius: 20, borderTopRightRadius: 20, paddingHorizontal: 20, paddingBottom: 32 },\n grabber: { alignSelf: 'center', width: 40, height: 4, borderRadius: 2, marginTop: 8 },\n sheetHeader: { flexDirection: 'row', alignItems: 'center', justifyContent: 'space-between', paddingVertical: 10 },\n sheetTitle: { fontSize: 18, fontWeight: '700' },\n toast: {\n position: 'absolute',\n alignSelf: 'center',\n paddingHorizontal: 16,\n paddingVertical: 10,\n borderRadius: 999,\n maxWidth: '86%',\n },\n toastLabel: { fontSize: 14, fontWeight: '600', textAlign: 'center' },\n});\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
let experience = null;
|
|
2
|
+
let experiencePreload = null;
|
|
3
|
+
function registerNativeWebBuilderExperience(component) {
|
|
4
|
+
experience = component;
|
|
5
|
+
}
|
|
6
|
+
function getNativeWebBuilderExperience() {
|
|
7
|
+
return experience;
|
|
8
|
+
}
|
|
9
|
+
function registerWebBuilderExperiencePreload(fn) {
|
|
10
|
+
experiencePreload = fn;
|
|
11
|
+
}
|
|
12
|
+
function preloadNativeWebBuilderExperience() {
|
|
13
|
+
var _a;
|
|
14
|
+
return (_a = experiencePreload == null ? void 0 : experiencePreload()) != null ? _a : Promise.resolve();
|
|
15
|
+
}export{getNativeWebBuilderExperience,preloadNativeWebBuilderExperience,registerNativeWebBuilderExperience,registerWebBuilderExperiencePreload};//# sourceMappingURL=nativeWebBuilderRegistry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nativeWebBuilderRegistry.js","sources":["../../../src/features/webbuilder/nativeWebBuilderRegistry.ts"],"sourcesContent":["/**\n * Seam between the app shell and this package for the FEDERATED web builder\n * experience. Same inversion as expenses / movies / study: the loader\n * (`import('webbuilder_native/WebBuilder')`) lives in the app so rollup never\n * sees the bare specifier; the WebBuilderNative screen reads it back here.\n */\nimport type { ComponentType } from 'react';\nimport type { WebBuilderExperienceProps } from './WebBuilderExperience';\n\nexport type WebBuilderExperienceComponent = ComponentType<WebBuilderExperienceProps>;\n\nlet experience: WebBuilderExperienceComponent | null = null;\nlet experiencePreload: (() => Promise<void>) | null = null;\n\nexport function registerNativeWebBuilderExperience(component: WebBuilderExperienceComponent): void {\n experience = component;\n}\n\nexport function getNativeWebBuilderExperience(): WebBuilderExperienceComponent | null {\n return experience;\n}\n\nexport function registerWebBuilderExperiencePreload(fn: () => Promise<void>): void {\n experiencePreload = fn;\n}\n\nexport function preloadNativeWebBuilderExperience(): Promise<void> {\n return experiencePreload?.() ?? Promise.resolve();\n}\n"],"names":[],"mappings":"AASA,IAAI,UAAmD,GAAA,IAAA;AACvD,IAAI,iBAAkD,GAAA,IAAA;AAC/C,SAAS,mCAAmC,SAAgD,EAAA;AACjG,EAAa,UAAA,GAAA,SAAA;AACf;AACO,SAAS,6BAAsE,GAAA;AACpF,EAAO,OAAA,UAAA;AACT;AACO,SAAS,oCAAoC,EAA+B,EAAA;AACjF,EAAoB,iBAAA,GAAA,EAAA;AACtB;AACO,SAAS,iCAAmD,GAAA;AApBnE,EAAA,IAAA,EAAA;AAqBE,EAAO,OAAA,CAAA,EAAA,GAAA,iBAAA,IAAA,IAAA,GAAA,MAAA,GAAA,iBAAA,EAAA,KAAA,IAAA,GAAA,EAAA,GAAyB,QAAQ,OAAQ,EAAA;AAClD"}
|