@adminide-stack/yantra-mobile 12.0.108 → 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.
Files changed (82) hide show
  1. package/lib/compute.js +57 -1
  2. package/lib/compute.js.map +1 -1
  3. package/lib/config/env-config.js +8 -0
  4. package/lib/config/env-config.js.map +1 -1
  5. package/lib/features/apps/AppsCatalog.js +10 -0
  6. package/lib/features/apps/AppsCatalog.js.map +1 -1
  7. package/lib/features/apps/appArt.js +2 -1
  8. package/lib/features/apps/appArt.js.map +1 -1
  9. package/lib/features/apps/mobileAppCatalog.js +11 -0
  10. package/lib/features/apps/mobileAppCatalog.js.map +1 -1
  11. package/lib/features/apps/nativeAppHandoff.js +2 -1
  12. package/lib/features/apps/nativeAppHandoff.js.map +1 -1
  13. package/lib/features/health/healthSyncStore.js +7 -1
  14. package/lib/features/health/healthSyncStore.js.map +1 -1
  15. package/lib/features/messaging/useChatViewer.js +3 -2
  16. package/lib/features/messaging/useChatViewer.js.map +1 -1
  17. package/lib/features/webbuilder/WebBuilderExperience.js +474 -0
  18. package/lib/features/webbuilder/WebBuilderExperience.js.map +1 -0
  19. package/lib/features/webbuilder/brandKitStorage.js +69 -0
  20. package/lib/features/webbuilder/brandKitStorage.js.map +1 -0
  21. package/lib/features/webbuilder/buildFragments.js +360 -0
  22. package/lib/features/webbuilder/buildFragments.js.map +1 -0
  23. package/lib/features/webbuilder/components/BottomTabs.js +65 -0
  24. package/lib/features/webbuilder/components/BottomTabs.js.map +1 -0
  25. package/lib/features/webbuilder/components/BrandKitSheet.js +197 -0
  26. package/lib/features/webbuilder/components/BrandKitSheet.js.map +1 -0
  27. package/lib/features/webbuilder/components/CodeView.js +99 -0
  28. package/lib/features/webbuilder/components/CodeView.js.map +1 -0
  29. package/lib/features/webbuilder/components/Composer.js +217 -0
  30. package/lib/features/webbuilder/components/Composer.js.map +1 -0
  31. package/lib/features/webbuilder/components/PreviewFrame.js +72 -0
  32. package/lib/features/webbuilder/components/PreviewFrame.js.map +1 -0
  33. package/lib/features/webbuilder/components/PreviewPlaceholder.js +107 -0
  34. package/lib/features/webbuilder/components/PreviewPlaceholder.js.map +1 -0
  35. package/lib/features/webbuilder/components/PreviewScreen.js +200 -0
  36. package/lib/features/webbuilder/components/PreviewScreen.js.map +1 -0
  37. package/lib/features/webbuilder/components/ProjectChat.js +580 -0
  38. package/lib/features/webbuilder/components/ProjectChat.js.map +1 -0
  39. package/lib/features/webbuilder/components/ProjectsScreen.js +339 -0
  40. package/lib/features/webbuilder/components/ProjectsScreen.js.map +1 -0
  41. package/lib/features/webbuilder/components/PublishSheet.js +143 -0
  42. package/lib/features/webbuilder/components/PublishSheet.js.map +1 -0
  43. package/lib/features/webbuilder/components/SiteScoreSheet.js +73 -0
  44. package/lib/features/webbuilder/components/SiteScoreSheet.js.map +1 -0
  45. package/lib/features/webbuilder/components/StudioHome.js +367 -0
  46. package/lib/features/webbuilder/components/StudioHome.js.map +1 -0
  47. package/lib/features/webbuilder/components/TemplateCard.js +73 -0
  48. package/lib/features/webbuilder/components/TemplateCard.js.map +1 -0
  49. package/lib/features/webbuilder/components/TemplatesSheet.js +178 -0
  50. package/lib/features/webbuilder/components/TemplatesSheet.js.map +1 -0
  51. package/lib/features/webbuilder/components/VersionsSheet.js +57 -0
  52. package/lib/features/webbuilder/components/VersionsSheet.js.map +1 -0
  53. package/lib/features/webbuilder/components/ui.js +291 -0
  54. package/lib/features/webbuilder/components/ui.js.map +1 -0
  55. package/lib/features/webbuilder/nativeWebBuilderRegistry.js +15 -0
  56. package/lib/features/webbuilder/nativeWebBuilderRegistry.js.map +1 -0
  57. package/lib/features/webbuilder/studioCatalog.js +147 -0
  58. package/lib/features/webbuilder/studioCatalog.js.map +1 -0
  59. package/lib/features/webbuilder/webbuilderPrompts.js +42 -0
  60. package/lib/features/webbuilder/webbuilderPrompts.js.map +1 -0
  61. package/lib/features/webbuilder/webbuilderTheme.js +63 -0
  62. package/lib/features/webbuilder/webbuilderTheme.js.map +1 -0
  63. package/lib/features/webbuilder/workflow.js +540 -0
  64. package/lib/features/webbuilder/workflow.js.map +1 -0
  65. package/lib/hooks/useChatApi.js +7 -2
  66. package/lib/hooks/useChatApi.js.map +1 -1
  67. package/lib/hooks/useChatStream.js +1 -1
  68. package/lib/hooks/useChatStream.js.map +1 -1
  69. package/lib/index.js +1 -1
  70. package/lib/index.js.map +1 -1
  71. package/lib/routes.json +106 -0
  72. package/lib/screens/WebBuilderNative/index.js +71 -0
  73. package/lib/screens/WebBuilderNative/index.js.map +1 -0
  74. package/lib/screens/WebBuilderNative/useCodeAssistantCatalog.js +45 -0
  75. package/lib/screens/WebBuilderNative/useCodeAssistantCatalog.js.map +1 -0
  76. package/lib/screens/WebBuilderNative/useWebBuilderGallery.js +125 -0
  77. package/lib/screens/WebBuilderNative/useWebBuilderGallery.js.map +1 -0
  78. package/lib/screens/WebBuilderNative/useWebBuilderHost.js +408 -0
  79. package/lib/screens/WebBuilderNative/useWebBuilderHost.js.map +1 -0
  80. package/lib/screens/WebBuilderNative/webbuilderTransport.js +88 -0
  81. package/lib/screens/WebBuilderNative/webbuilderTransport.js.map +1 -0
  82. 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"}