@adminide-stack/yantra-mobile 12.0.55 → 12.0.56
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/assets/apps/billing.webp +0 -0
- package/lib/assets/apps/canvas.webp +0 -0
- package/lib/assets/apps/cards-wallet.webp +0 -0
- package/lib/assets/apps/character.webp +0 -0
- package/lib/assets/apps/chat-native.webp +0 -0
- package/lib/assets/apps/codezen.webp +0 -0
- package/lib/assets/apps/computer.webp +0 -0
- package/lib/assets/apps/crm.webp +0 -0
- package/lib/assets/apps/design.webp +0 -0
- package/lib/assets/apps/expenses.webp +0 -0
- package/lib/assets/apps/inbox.webp +0 -0
- package/lib/assets/apps/issue-ticket.webp +0 -0
- package/lib/assets/apps/job-search.webp +0 -0
- package/lib/assets/apps/kpi-motivation.webp +0 -0
- package/lib/assets/apps/mailcampaign.webp +0 -0
- package/lib/assets/apps/notebook.webp +0 -0
- package/lib/assets/apps/paper2poster.webp +0 -0
- package/lib/assets/apps/resume.webp +0 -0
- package/lib/assets/apps/salesiq.webp +0 -0
- package/lib/assets/apps/shop.webp +0 -0
- package/lib/assets/apps/smscampaign.webp +0 -0
- package/lib/assets/apps/social-events.webp +0 -0
- package/lib/assets/apps/travel.webp +0 -0
- package/lib/assets/apps/webbuilder.webp +0 -0
- package/lib/assets/apps/workflow.webp +0 -0
- package/lib/features/apps/AppsCatalog.js +232 -62
- package/lib/features/apps/AppsCatalog.js.map +1 -1
- package/lib/features/apps/appArt.js +31 -0
- package/lib/features/apps/appArt.js.map +1 -0
- package/lib/features/apps/appFavorites.js +63 -0
- package/lib/features/apps/appFavorites.js.map +1 -0
- package/lib/features/apps/mobileAppCatalog.js +45 -11
- package/lib/features/apps/mobileAppCatalog.js.map +1 -1
- package/lib/hooks/messengerStream.js +15 -0
- package/lib/hooks/messengerStream.js.map +1 -0
- package/lib/hooks/useCdecliChannel.js +1 -16
- package/lib/hooks/useCdecliChannel.js.map +1 -1
- package/lib/hooks/useChatApi.js +15 -5
- package/lib/hooks/useChatApi.js.map +1 -1
- package/lib/hooks/useHistoryRunWatcher.js +81 -0
- package/lib/hooks/useHistoryRunWatcher.js.map +1 -0
- package/lib/screens/Home/components/ChatHistoryLanding.js +12 -1
- package/lib/screens/Home/components/ChatHistoryLanding.js.map +1 -1
- package/lib/theme/mobileTokens.js +4 -1
- package/lib/theme/mobileTokens.js.map +1 -1
- package/package.json +4 -4
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {jsxs,jsx}from'react/jsx-runtime';import {useState,useMemo,useCallback}from'react';import {useColorScheme,View,StyleSheet,TextInput,ScrollView
|
|
1
|
+
import {jsxs,jsx,Fragment}from'react/jsx-runtime';import React,{useState,useMemo,useCallback}from'react';import {useColorScheme,useWindowDimensions,View,StyleSheet,Pressable,Text,TextInput,ScrollView}from'react-native';import {useNavigation,useRoute,CommonActions}from'@react-navigation/native';import {MaterialCommunityIcons}from'@expo/vector-icons';import {Image}from'expo-image';import {v4}from'uuid';import {config}from'../../config/env-config.js';import {mobileTokens}from'../../theme/mobileTokens.js';import {useChatMutations}from'../../hooks/useChatApi.js';import {resolveSurfaceUrl}from'./resolveSurfaceUrl.js';import {useAppFavorites}from'./appFavorites.js';import {APP_ART}from'./appArt.js';import {filterMobileApps,MOBILE_APP_CATALOG,APP_GROUP_ART}from'./mobileAppCatalog.js';var __defProp = Object.defineProperty;
|
|
2
2
|
var __defProps = Object.defineProperties;
|
|
3
3
|
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
4
|
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
@@ -17,6 +17,9 @@ var __spreadValues = (a, b) => {
|
|
|
17
17
|
return a;
|
|
18
18
|
};
|
|
19
19
|
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
20
|
+
const H_PAD = 16;
|
|
21
|
+
const GAP = 12;
|
|
22
|
+
const MIN_CARD = 104;
|
|
20
23
|
function buildChannelTitle(channelId) {
|
|
21
24
|
return `chat-channel-${channelId}`;
|
|
22
25
|
}
|
|
@@ -31,22 +34,39 @@ function AppsCatalog({
|
|
|
31
34
|
const {
|
|
32
35
|
createChannel
|
|
33
36
|
} = useChatMutations();
|
|
37
|
+
const {
|
|
38
|
+
width: screenWidth
|
|
39
|
+
} = useWindowDimensions();
|
|
34
40
|
const [query, setQuery] = useState("");
|
|
41
|
+
const [tab, setTab] = useState("all");
|
|
42
|
+
const {
|
|
43
|
+
favorites,
|
|
44
|
+
toggle: toggleFavorite
|
|
45
|
+
} = useAppFavorites();
|
|
35
46
|
const orgName = useMemo(() => {
|
|
36
47
|
var _a2, _b;
|
|
37
48
|
if (typeof orgNameProp === "string" && orgNameProp.trim()) return orgNameProp.trim();
|
|
38
49
|
const raw = (_b = (_a2 = route == null ? void 0 : route.params) == null ? void 0 : _a2.orgName) != null ? _b : "";
|
|
39
50
|
return typeof raw === "string" && raw.trim() ? raw.trim() : null;
|
|
40
51
|
}, [orgNameProp, (_a = route == null ? void 0 : route.params) == null ? void 0 : _a.orgName]);
|
|
41
|
-
const
|
|
52
|
+
const apps = useMemo(() => filterMobileApps(MOBILE_APP_CATALOG, query, tab, favorites), [favorites, query, tab]);
|
|
53
|
+
const columns = Math.max(3, Math.min(6, Math.floor((screenWidth - H_PAD * 2 + GAP) / (MIN_CARD + GAP))));
|
|
54
|
+
const cardWidth = Math.floor((screenWidth - H_PAD * 2 - GAP * (columns - 1)) / columns);
|
|
42
55
|
const muted = isDark ? "#94a3b8" : mobileTokens.color.textMuted;
|
|
43
56
|
const foreground = isDark ? "#e2e8f0" : mobileTokens.color.text;
|
|
44
57
|
const surface = isDark ? "#111827" : mobileTokens.color.surface;
|
|
45
58
|
const screenBg = isDark ? "#0f172a" : mobileTokens.color.bg;
|
|
46
59
|
const borderColor = isDark ? "rgba(148,163,184,0.22)" : mobileTokens.color.border;
|
|
47
60
|
const fieldBg = isDark ? "#1e293b" : mobileTokens.color.surfaceMuted;
|
|
48
|
-
const
|
|
49
|
-
|
|
61
|
+
const cardTheme = {
|
|
62
|
+
surface,
|
|
63
|
+
border: borderColor,
|
|
64
|
+
foreground,
|
|
65
|
+
muted,
|
|
66
|
+
pressed: isDark ? "rgba(148,163,184,0.10)" : "rgba(15,23,42,0.05)"
|
|
67
|
+
};
|
|
68
|
+
const segmentBg = isDark ? "rgba(148,163,184,0.12)" : mobileTokens.color.surfaceMuted;
|
|
69
|
+
const segmentActiveBg = isDark ? "rgba(148,163,184,0.24)" : mobileTokens.color.surface;
|
|
50
70
|
const openApp = useCallback((app) => {
|
|
51
71
|
const channelId = v4();
|
|
52
72
|
const params = {
|
|
@@ -137,57 +157,160 @@ function AppsCatalog({
|
|
|
137
157
|
})
|
|
138
158
|
}));
|
|
139
159
|
}, [createChannel, navigation, orgName]);
|
|
160
|
+
const emptyState = tab === "favorites" && !query.trim() ? {
|
|
161
|
+
icon: "heart-outline",
|
|
162
|
+
title: "No favorites yet",
|
|
163
|
+
hint: "Tap the heart on any app to keep it here."
|
|
164
|
+
} : {
|
|
165
|
+
icon: "magnify",
|
|
166
|
+
title: "No apps match that search",
|
|
167
|
+
hint: tab === "favorites" ? "Try All apps, or a shorter name." : "Try a shorter name."
|
|
168
|
+
};
|
|
140
169
|
return /* @__PURE__ */ jsxs(View, { style: [styles.root, {
|
|
141
170
|
backgroundColor: screenBg
|
|
142
171
|
}], children: [
|
|
172
|
+
/* @__PURE__ */ jsx(View, { style: [styles.segment, {
|
|
173
|
+
backgroundColor: segmentBg,
|
|
174
|
+
borderColor
|
|
175
|
+
}], accessibilityRole: "tablist", children: [{
|
|
176
|
+
key: "all",
|
|
177
|
+
label: "All apps"
|
|
178
|
+
}, {
|
|
179
|
+
key: "favorites",
|
|
180
|
+
label: "Favorites"
|
|
181
|
+
}].map(({
|
|
182
|
+
key,
|
|
183
|
+
label
|
|
184
|
+
}) => {
|
|
185
|
+
const selected = tab === key;
|
|
186
|
+
return /* @__PURE__ */ jsx(Pressable, { onPress: () => setTab(key), accessibilityRole: "tab", accessibilityState: {
|
|
187
|
+
selected
|
|
188
|
+
}, style: [styles.segmentItem, selected && [styles.segmentItemActive, {
|
|
189
|
+
backgroundColor: segmentActiveBg
|
|
190
|
+
}]], children: /* @__PURE__ */ jsx(Text, { style: [styles.segmentLabel, {
|
|
191
|
+
color: selected ? foreground : muted
|
|
192
|
+
}, selected && styles.segmentLabelActive], children: label }) }, key);
|
|
193
|
+
}) }),
|
|
143
194
|
/* @__PURE__ */ jsxs(View, { style: [styles.searchWrap, {
|
|
144
195
|
backgroundColor: fieldBg,
|
|
145
196
|
borderColor
|
|
146
197
|
}], children: [
|
|
147
198
|
/* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "magnify", size: 18, color: muted }),
|
|
148
|
-
/* @__PURE__ */ jsx(TextInput, { value: query, onChangeText: setQuery, placeholder: "Search apps", placeholderTextColor: muted, autoCorrect: false, autoCapitalize: "none", style: [styles.searchInput, {
|
|
199
|
+
/* @__PURE__ */ jsx(TextInput, { value: query, onChangeText: setQuery, placeholder: "Search apps", placeholderTextColor: muted, autoCorrect: false, autoCapitalize: "none", clearButtonMode: "while-editing", style: [styles.searchInput, {
|
|
149
200
|
color: foreground
|
|
150
201
|
}] })
|
|
151
202
|
] }),
|
|
152
|
-
/* @__PURE__ */ jsx(ScrollView, { keyboardShouldPersistTaps: "handled", contentContainerStyle: styles.list, children:
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
/* @__PURE__ */ jsx(
|
|
203
|
+
/* @__PURE__ */ jsx(ScrollView, { keyboardShouldPersistTaps: "handled", contentContainerStyle: styles.list, children: apps.length === 0 ? /* @__PURE__ */ jsxs(View, { style: styles.empty, children: [
|
|
204
|
+
/* @__PURE__ */ jsx(View, { style: [styles.emptyMark, {
|
|
205
|
+
backgroundColor: segmentBg
|
|
206
|
+
}], children: /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: emptyState.icon, size: 26, color: muted }) }),
|
|
207
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.emptyTitle, {
|
|
208
|
+
color: foreground
|
|
209
|
+
}], children: emptyState.title }),
|
|
210
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.emptyHint, {
|
|
156
211
|
color: muted
|
|
157
|
-
}], children:
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
backgroundColor: surface,
|
|
162
|
-
borderColor
|
|
163
|
-
}, pressed && {
|
|
164
|
-
backgroundColor: accentSoft
|
|
165
|
-
}], children: [
|
|
166
|
-
/* @__PURE__ */ jsx(View, { style: [styles.appIcon, {
|
|
167
|
-
backgroundColor: accentSoft
|
|
168
|
-
}], children: /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: app.icon, size: 18, color: accent }) }),
|
|
169
|
-
/* @__PURE__ */ jsx(Text, { style: [styles.appLabel, {
|
|
170
|
-
color: foreground
|
|
171
|
-
}], numberOfLines: 2, children: app.label })
|
|
172
|
-
] }, app.key)) })
|
|
173
|
-
] }, group.label)) })
|
|
212
|
+
}], children: emptyState.hint })
|
|
213
|
+
] }) : /* @__PURE__ */ jsx(View, { style: [styles.grid, {
|
|
214
|
+
gap: GAP
|
|
215
|
+
}], children: apps.map((app) => /* @__PURE__ */ jsx(AppCard, { app, width: cardWidth, theme: cardTheme, favorite: favorites.has(app.key), onOpen: openApp, onToggleFavorite: toggleFavorite }, app.key)) }) })
|
|
174
216
|
] });
|
|
175
217
|
}
|
|
218
|
+
const AppCard = React.memo(function AppCard2({
|
|
219
|
+
app,
|
|
220
|
+
width,
|
|
221
|
+
theme,
|
|
222
|
+
favorite,
|
|
223
|
+
onOpen,
|
|
224
|
+
onToggleFavorite
|
|
225
|
+
}) {
|
|
226
|
+
const poster = APP_GROUP_ART[app.group];
|
|
227
|
+
const artwork = APP_ART[app.key];
|
|
228
|
+
const glyph = Math.round(width * 0.36);
|
|
229
|
+
const echo = Math.round(width * 0.95);
|
|
230
|
+
return /* @__PURE__ */ jsxs(Pressable, { onPress: () => onOpen(app), accessibilityRole: "button", accessibilityLabel: `${app.label}, ${app.group}`, accessibilityHint: "Opens the app", style: ({
|
|
231
|
+
pressed
|
|
232
|
+
}) => [styles.card, {
|
|
233
|
+
width,
|
|
234
|
+
backgroundColor: theme.surface,
|
|
235
|
+
borderColor: theme.border
|
|
236
|
+
}, pressed && {
|
|
237
|
+
backgroundColor: theme.pressed,
|
|
238
|
+
transform: [{
|
|
239
|
+
scale: 0.97
|
|
240
|
+
}]
|
|
241
|
+
}], children: [
|
|
242
|
+
/* @__PURE__ */ jsxs(View, { style: [styles.tile, {
|
|
243
|
+
backgroundColor: poster.base
|
|
244
|
+
}], children: [
|
|
245
|
+
artwork ? /* @__PURE__ */ jsx(Image, { source: artwork, style: StyleSheet.absoluteFill, contentFit: "cover", transition: 120, accessibilityIgnoresInvertColors: true }) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
246
|
+
/* @__PURE__ */ jsx(View, { style: [styles.tileHighlight, {
|
|
247
|
+
width: width * 0.9,
|
|
248
|
+
height: width * 0.9,
|
|
249
|
+
borderRadius: width
|
|
250
|
+
}] }),
|
|
251
|
+
/* @__PURE__ */ jsx(MaterialCommunityIcons, { name: app.icon, size: echo, color: poster.glow, style: [styles.tileEcho, {
|
|
252
|
+
right: -echo * 0.28,
|
|
253
|
+
bottom: -echo * 0.3
|
|
254
|
+
}] }),
|
|
255
|
+
/* @__PURE__ */ jsx(MaterialCommunityIcons, { name: app.icon, size: glyph, color: "#ffffff", style: styles.tileGlyph })
|
|
256
|
+
] }),
|
|
257
|
+
/* @__PURE__ */ jsx(Pressable, { onPress: () => onToggleFavorite(app.key), hitSlop: 8, accessibilityRole: "button", accessibilityLabel: favorite ? `Remove ${app.label} from favorites` : `Add ${app.label} to favorites`, accessibilityState: {
|
|
258
|
+
selected: favorite
|
|
259
|
+
}, style: ({
|
|
260
|
+
pressed
|
|
261
|
+
}) => [styles.heart, pressed && styles.heartPressed], children: /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: favorite ? "heart" : "heart-outline", size: 16, color: favorite ? "#fb7185" : "#ffffff" }) })
|
|
262
|
+
] }),
|
|
263
|
+
/* @__PURE__ */ jsxs(View, { style: styles.cardBody, children: [
|
|
264
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.cardTitle, {
|
|
265
|
+
color: theme.foreground
|
|
266
|
+
}], numberOfLines: 2, children: app.label }),
|
|
267
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.cardCaption, {
|
|
268
|
+
color: theme.muted
|
|
269
|
+
}], numberOfLines: 1, children: app.group })
|
|
270
|
+
] })
|
|
271
|
+
] });
|
|
272
|
+
});
|
|
176
273
|
const styles = StyleSheet.create({
|
|
177
274
|
root: {
|
|
178
275
|
flex: 1
|
|
179
276
|
},
|
|
277
|
+
segment: {
|
|
278
|
+
flexDirection: "row",
|
|
279
|
+
alignSelf: "center",
|
|
280
|
+
marginTop: 12,
|
|
281
|
+
padding: 4,
|
|
282
|
+
borderRadius: mobileTokens.radius.pill,
|
|
283
|
+
borderWidth: 1,
|
|
284
|
+
minWidth: 240,
|
|
285
|
+
maxWidth: 320,
|
|
286
|
+
width: "70%"
|
|
287
|
+
},
|
|
288
|
+
segmentItem: {
|
|
289
|
+
flex: 1,
|
|
290
|
+
minHeight: 36,
|
|
291
|
+
alignItems: "center",
|
|
292
|
+
justifyContent: "center",
|
|
293
|
+
borderRadius: mobileTokens.radius.pill
|
|
294
|
+
},
|
|
295
|
+
segmentItemActive: __spreadValues({}, mobileTokens.shadow.card),
|
|
296
|
+
segmentLabel: {
|
|
297
|
+
fontSize: 15,
|
|
298
|
+
fontWeight: "600"
|
|
299
|
+
},
|
|
300
|
+
segmentLabelActive: {
|
|
301
|
+
fontWeight: "700"
|
|
302
|
+
},
|
|
180
303
|
searchWrap: {
|
|
181
304
|
flexDirection: "row",
|
|
182
305
|
alignItems: "center",
|
|
183
306
|
gap: 8,
|
|
184
|
-
marginHorizontal:
|
|
307
|
+
marginHorizontal: H_PAD,
|
|
185
308
|
marginTop: 12,
|
|
186
|
-
marginBottom:
|
|
309
|
+
marginBottom: 4,
|
|
187
310
|
borderWidth: 1,
|
|
188
|
-
borderRadius:
|
|
311
|
+
borderRadius: mobileTokens.radius.md,
|
|
189
312
|
paddingHorizontal: 12,
|
|
190
|
-
minHeight:
|
|
313
|
+
minHeight: 44
|
|
191
314
|
},
|
|
192
315
|
searchInput: {
|
|
193
316
|
flex: 1,
|
|
@@ -195,51 +318,98 @@ const styles = StyleSheet.create({
|
|
|
195
318
|
paddingVertical: 8
|
|
196
319
|
},
|
|
197
320
|
list: {
|
|
198
|
-
paddingHorizontal:
|
|
199
|
-
paddingTop:
|
|
200
|
-
paddingBottom:
|
|
201
|
-
gap: 16
|
|
202
|
-
},
|
|
203
|
-
group: {
|
|
204
|
-
gap: 8
|
|
321
|
+
paddingHorizontal: H_PAD,
|
|
322
|
+
paddingTop: 12,
|
|
323
|
+
paddingBottom: 32
|
|
205
324
|
},
|
|
206
|
-
|
|
207
|
-
fontSize: 11,
|
|
208
|
-
fontWeight: "600",
|
|
209
|
-
letterSpacing: 0.7,
|
|
210
|
-
textTransform: "uppercase"
|
|
211
|
-
},
|
|
212
|
-
groupGrid: {
|
|
325
|
+
grid: {
|
|
213
326
|
flexDirection: "row",
|
|
214
327
|
flexWrap: "wrap",
|
|
215
|
-
|
|
328
|
+
alignItems: "stretch"
|
|
216
329
|
},
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
flexGrow: 1,
|
|
220
|
-
minWidth: 96,
|
|
221
|
-
maxWidth: "32.5%",
|
|
330
|
+
card: {
|
|
331
|
+
borderRadius: mobileTokens.radius.lg,
|
|
222
332
|
borderWidth: 1,
|
|
223
|
-
|
|
224
|
-
paddingHorizontal: 10,
|
|
225
|
-
paddingVertical: 12,
|
|
226
|
-
gap: 8
|
|
333
|
+
overflow: "hidden"
|
|
227
334
|
},
|
|
228
|
-
|
|
335
|
+
tile: {
|
|
336
|
+
aspectRatio: 1,
|
|
337
|
+
alignItems: "center",
|
|
338
|
+
justifyContent: "center",
|
|
339
|
+
overflow: "hidden"
|
|
340
|
+
},
|
|
341
|
+
tileHighlight: {
|
|
342
|
+
position: "absolute",
|
|
343
|
+
top: "-45%",
|
|
344
|
+
left: "-35%",
|
|
345
|
+
backgroundColor: "rgba(255,255,255,0.12)"
|
|
346
|
+
},
|
|
347
|
+
tileEcho: {
|
|
348
|
+
position: "absolute",
|
|
349
|
+
opacity: 0.28
|
|
350
|
+
},
|
|
351
|
+
tileGlyph: {
|
|
352
|
+
textShadowColor: "rgba(15,23,42,0.28)",
|
|
353
|
+
textShadowOffset: {
|
|
354
|
+
width: 0,
|
|
355
|
+
height: 2
|
|
356
|
+
},
|
|
357
|
+
textShadowRadius: 6
|
|
358
|
+
},
|
|
359
|
+
heart: {
|
|
360
|
+
position: "absolute",
|
|
361
|
+
top: 8,
|
|
362
|
+
right: 8,
|
|
229
363
|
width: 32,
|
|
230
364
|
height: 32,
|
|
231
|
-
borderRadius:
|
|
365
|
+
borderRadius: 16,
|
|
232
366
|
alignItems: "center",
|
|
233
|
-
justifyContent: "center"
|
|
367
|
+
justifyContent: "center",
|
|
368
|
+
backgroundColor: "rgba(15,23,42,0.36)"
|
|
369
|
+
},
|
|
370
|
+
heartPressed: {
|
|
371
|
+
backgroundColor: "rgba(15,23,42,0.55)"
|
|
234
372
|
},
|
|
235
|
-
|
|
236
|
-
|
|
373
|
+
cardBody: {
|
|
374
|
+
paddingHorizontal: 10,
|
|
375
|
+
paddingTop: 10,
|
|
376
|
+
paddingBottom: 12,
|
|
377
|
+
gap: 3
|
|
378
|
+
},
|
|
379
|
+
cardTitle: {
|
|
380
|
+
fontSize: 14,
|
|
381
|
+
fontWeight: "700",
|
|
382
|
+
lineHeight: 18,
|
|
383
|
+
// Two lines reserved so every row lines up whether a name wraps or not.
|
|
384
|
+
minHeight: 36
|
|
385
|
+
},
|
|
386
|
+
cardCaption: {
|
|
387
|
+
fontSize: 11,
|
|
237
388
|
fontWeight: "600",
|
|
238
|
-
|
|
389
|
+
letterSpacing: 0.8,
|
|
390
|
+
textTransform: "uppercase"
|
|
239
391
|
},
|
|
240
392
|
empty: {
|
|
393
|
+
alignItems: "center",
|
|
394
|
+
paddingTop: 56,
|
|
395
|
+
paddingHorizontal: 32,
|
|
396
|
+
gap: 6
|
|
397
|
+
},
|
|
398
|
+
emptyMark: {
|
|
399
|
+
width: 56,
|
|
400
|
+
height: 56,
|
|
401
|
+
borderRadius: 28,
|
|
402
|
+
alignItems: "center",
|
|
403
|
+
justifyContent: "center",
|
|
404
|
+
marginBottom: 8
|
|
405
|
+
},
|
|
406
|
+
emptyTitle: {
|
|
407
|
+
fontSize: 16,
|
|
408
|
+
fontWeight: "700"
|
|
409
|
+
},
|
|
410
|
+
emptyHint: {
|
|
411
|
+
fontSize: 14,
|
|
241
412
|
textAlign: "center",
|
|
242
|
-
|
|
243
|
-
fontSize: 14
|
|
413
|
+
lineHeight: 20
|
|
244
414
|
}
|
|
245
415
|
});export{AppsCatalog};//# sourceMappingURL=AppsCatalog.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AppsCatalog.js","sources":["../../../src/features/apps/AppsCatalog.tsx"],"sourcesContent":["/**\n * Full-screen Apps catalog: search + grouped tiles, then navigate into a\n * native surface or a new chat. Shared by the Apps screen (not a popup).\n */\nimport React, { useCallback, useMemo, useState } from 'react';\nimport { Pressable, ScrollView, StyleSheet, Text, TextInput, View, useColorScheme } from 'react-native';\nimport { CommonActions, useNavigation, useRoute } from '@react-navigation/native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { v4 as uuidv4 } from 'uuid';\nimport { config } from '../../config/env-config';\nimport { mobileTokens } from '../../theme/mobileTokens';\nimport { useChatMutations } from '../../hooks/useChatApi';\nimport { resolveSurfaceUrl } from './resolveSurfaceUrl';\nimport { groupMobileApps, MOBILE_APP_CATALOG, type MobileAppItem } from './mobileAppCatalog';\n\nfunction buildChannelTitle(channelId: string): string {\n return `chat-channel-${channelId}`;\n}\n\nexport function AppsCatalog({ orgName: orgNameProp }: { orgName?: string | null }) {\n const navigation = useNavigation<any>();\n const route = useRoute<any>();\n const colorScheme = useColorScheme();\n const isDark = colorScheme === 'dark';\n const { createChannel } = useChatMutations();\n const [query, setQuery] = useState('');\n\n const orgName = useMemo(() => {\n if (typeof orgNameProp === 'string' && orgNameProp.trim()) return orgNameProp.trim();\n const raw = (route?.params?.orgName as string | undefined) ?? '';\n return typeof raw === 'string' && raw.trim() ? raw.trim() : null;\n }, [orgNameProp, route?.params?.orgName]);\n\n const grouped = useMemo(() => groupMobileApps(MOBILE_APP_CATALOG, query), [query]);\n\n const muted = isDark ? '#94a3b8' : mobileTokens.color.textMuted;\n const foreground = isDark ? '#e2e8f0' : mobileTokens.color.text;\n const surface = isDark ? '#111827' : mobileTokens.color.surface;\n const screenBg = isDark ? '#0f172a' : mobileTokens.color.bg;\n const borderColor = isDark ? 'rgba(148,163,184,0.22)' : mobileTokens.color.border;\n const fieldBg = isDark ? '#1e293b' : mobileTokens.color.surfaceMuted;\n const accent = isDark ? '#a5b4fc' : mobileTokens.color.primary;\n const accentSoft = isDark ? 'rgba(99,102,241,0.18)' : mobileTokens.color.primarySoft;\n\n const openApp = useCallback(\n (app: MobileAppItem) => {\n const channelId = uuidv4();\n const params: Record<string, unknown> = {\n orgName: orgName ?? undefined,\n channelId,\n appTitle: app.label,\n };\n\n if (app.nativeRoute === 'characters-native') {\n // Same wiring as AppsMenu: the tile opens the self-contained native\n // character studio (never a chat with the tile's prompt). The host\n // contributes only the session token + subgraph endpoint, built in\n // the screen, so no manifest/handoff params are needed here.\n navigation.dispatch(\n CommonActions.navigate({\n name: 'MainStack.CharactersNative',\n params,\n }),\n );\n return;\n }\n\n if (app.nativeRoute === 'canvas-native') {\n // Web canvas opens the boards grid first. Do not mint a chat\n // channelId here — that id is not an index row, and passing it\n // looks like a deep link into a board that does not exist.\n navigation.dispatch(\n CommonActions.navigate({\n name: 'MainStack.CanvasNative',\n params: { orgName: orgName ?? undefined, appTitle: 'Canvas' },\n }),\n );\n return;\n }\n\n if (app.nativeRoute === 'chat-native') {\n // Opens the conversation list. Deliberately no channelId: the\n // uuid minted above is an AI-chat channel, not a messenger\n // channel, and passing it would read as a deep link into a\n // thread that does not exist.\n navigation.dispatch(\n CommonActions.navigate({\n name: 'MainStack.ChatNative',\n params: { orgName: orgName ?? undefined },\n }),\n );\n return;\n }\n\n if (app.nativeRoute === 'billing-native') {\n navigation.navigate('MainStack.Billing', { orgName: orgName ?? undefined });\n return;\n }\n\n if (app.nativeRoute === 'shopping-native') {\n navigation.dispatch(\n CommonActions.navigate({\n name: 'MainStack.ShoppingNative',\n params: { orgName: orgName ?? undefined, appTitle: 'Shop' },\n }),\n );\n return;\n }\n\n if (app.nativeRoute === 'travel-native') {\n navigation.dispatch(\n CommonActions.navigate({\n name: 'MainStack.TravelNative',\n params: { orgName: orgName ?? undefined, appTitle: 'Travel' },\n }),\n );\n return;\n }\n\n if (app.nativeRoute === 'webbuilder') {\n const surfaceUrl = resolveSurfaceUrl(app, config);\n navigation.dispatch(\n CommonActions.navigate({\n name: 'MainStack.WebBuilder',\n params: surfaceUrl ? { ...params, url: surfaceUrl } : params,\n }),\n );\n return;\n }\n\n void createChannel({\n id: channelId,\n title: buildChannelTitle(channelId),\n isShared: false,\n sharedSlug: null,\n isArchived: false,\n isPinned: false,\n model: null,\n systemPrompt: null,\n orgName,\n } as any).catch((err) => {\n console.error('[AppsCatalog] createChannel failed:', err);\n });\n\n navigation.dispatch(\n CommonActions.navigate({\n name: 'MainStack.Chat',\n params: {\n ...params,\n initialQuery: app.prompt,\n initialMode: 'chat',\n },\n }),\n );\n },\n [createChannel, navigation, orgName],\n );\n\n return (\n <View style={[styles.root, { backgroundColor: screenBg }]}>\n <View style={[styles.searchWrap, { backgroundColor: fieldBg, borderColor }]}>\n <MaterialCommunityIcons name=\"magnify\" size={18} color={muted} />\n <TextInput\n value={query}\n onChangeText={setQuery}\n placeholder=\"Search apps\"\n placeholderTextColor={muted}\n autoCorrect={false}\n autoCapitalize=\"none\"\n style={[styles.searchInput, { color: foreground }]}\n />\n </View>\n <ScrollView keyboardShouldPersistTaps=\"handled\" contentContainerStyle={styles.list}>\n {grouped.length === 0 ? (\n <Text style={[styles.empty, { color: muted }]}>No apps match that search.</Text>\n ) : (\n grouped.map((group) => (\n <View key={group.label} style={styles.group}>\n <Text style={[styles.groupLabel, { color: muted }]}>{group.label}</Text>\n <View style={styles.groupGrid}>\n {group.items.map((app) => (\n <Pressable\n key={app.key}\n onPress={() => openApp(app)}\n accessibilityRole=\"button\"\n accessibilityLabel={app.label}\n style={({ pressed }) => [\n styles.appTile,\n {\n backgroundColor: surface,\n borderColor,\n },\n pressed && { backgroundColor: accentSoft },\n ]}\n >\n <View style={[styles.appIcon, { backgroundColor: accentSoft }]}>\n <MaterialCommunityIcons name={app.icon} size={18} color={accent} />\n </View>\n <Text style={[styles.appLabel, { color: foreground }]} numberOfLines={2}>\n {app.label}\n </Text>\n </Pressable>\n ))}\n </View>\n </View>\n ))\n )}\n </ScrollView>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n root: {\n flex: 1,\n },\n searchWrap: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 8,\n marginHorizontal: 16,\n marginTop: 12,\n marginBottom: 8,\n borderWidth: 1,\n borderRadius: 12,\n paddingHorizontal: 12,\n minHeight: 42,\n },\n searchInput: {\n flex: 1,\n fontSize: 15,\n paddingVertical: 8,\n },\n list: {\n paddingHorizontal: 16,\n paddingTop: 8,\n paddingBottom: 28,\n gap: 16,\n },\n group: {\n gap: 8,\n },\n groupLabel: {\n fontSize: 11,\n fontWeight: '600',\n letterSpacing: 0.7,\n textTransform: 'uppercase',\n },\n groupGrid: {\n flexDirection: 'row',\n flexWrap: 'wrap',\n gap: 8,\n },\n appTile: {\n width: '31%',\n flexGrow: 1,\n minWidth: 96,\n maxWidth: '32.5%',\n borderWidth: 1,\n borderRadius: 14,\n paddingHorizontal: 10,\n paddingVertical: 12,\n gap: 8,\n },\n appIcon: {\n width: 32,\n height: 32,\n borderRadius: 10,\n alignItems: 'center',\n justifyContent: 'center',\n },\n appLabel: {\n fontSize: 13,\n fontWeight: '600',\n lineHeight: 17,\n },\n empty: {\n textAlign: 'center',\n paddingVertical: 28,\n fontSize: 14,\n },\n});\n"],"names":["_a","uuidv4"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AppsCatalog.js","sources":["../../../src/features/apps/AppsCatalog.tsx"],"sourcesContent":["/**\n * Full-screen Apps catalog: All / Favorites tabs, search, then a flat grid of\n * poster cards (square artwork tile, bold name, group caption) - the\n * game-launcher layout, so 30 apps scan as one dense wall instead of six\n * short sections. Tapping a card opens its native surface or a new chat.\n *\n * Tile artwork comes from `appArt.ts` (bundled 480px illustrations, one per\n * app). A tile without artwork falls back to the group's poster color with\n * the app glyph centered and a large faded copy bleeding off the corner.\n */\nimport React, { useCallback, useMemo, useState } from 'react';\nimport {\n Pressable,\n ScrollView,\n StyleSheet,\n Text,\n TextInput,\n View,\n useColorScheme,\n useWindowDimensions,\n} from 'react-native';\nimport { CommonActions, useNavigation, useRoute } from '@react-navigation/native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { Image } from 'expo-image';\nimport { v4 as uuidv4 } from 'uuid';\nimport { config } from '../../config/env-config';\nimport { mobileTokens } from '../../theme/mobileTokens';\nimport { useChatMutations } from '../../hooks/useChatApi';\nimport { resolveSurfaceUrl } from './resolveSurfaceUrl';\nimport { useAppFavorites } from './appFavorites';\nimport { APP_ART } from './appArt';\nimport {\n APP_GROUP_ART,\n filterMobileApps,\n MOBILE_APP_CATALOG,\n type AppsTab,\n type MobileAppItem,\n} from './mobileAppCatalog';\n\nconst H_PAD = 16;\nconst GAP = 12;\n/** Narrowest card that still fits a 2-line name; more columns on wider screens. */\nconst MIN_CARD = 104;\n\ninterface CardTheme {\n surface: string;\n border: string;\n foreground: string;\n muted: string;\n pressed: string;\n}\n\nfunction buildChannelTitle(channelId: string): string {\n return `chat-channel-${channelId}`;\n}\n\nexport function AppsCatalog({ orgName: orgNameProp }: { orgName?: string | null }) {\n const navigation = useNavigation<any>();\n const route = useRoute<any>();\n const colorScheme = useColorScheme();\n const isDark = colorScheme === 'dark';\n const { createChannel } = useChatMutations();\n const { width: screenWidth } = useWindowDimensions();\n const [query, setQuery] = useState('');\n const [tab, setTab] = useState<AppsTab>('all');\n const { favorites, toggle: toggleFavorite } = useAppFavorites();\n\n const orgName = useMemo(() => {\n if (typeof orgNameProp === 'string' && orgNameProp.trim()) return orgNameProp.trim();\n const raw = (route?.params?.orgName as string | undefined) ?? '';\n return typeof raw === 'string' && raw.trim() ? raw.trim() : null;\n }, [orgNameProp, route?.params?.orgName]);\n\n const apps = useMemo(() => filterMobileApps(MOBILE_APP_CATALOG, query, tab, favorites), [favorites, query, tab]);\n const columns = Math.max(3, Math.min(6, Math.floor((screenWidth - H_PAD * 2 + GAP) / (MIN_CARD + GAP))));\n const cardWidth = Math.floor((screenWidth - H_PAD * 2 - GAP * (columns - 1)) / columns);\n\n const muted = isDark ? '#94a3b8' : mobileTokens.color.textMuted;\n const foreground = isDark ? '#e2e8f0' : mobileTokens.color.text;\n const surface = isDark ? '#111827' : mobileTokens.color.surface;\n const screenBg = isDark ? '#0f172a' : mobileTokens.color.bg;\n const borderColor = isDark ? 'rgba(148,163,184,0.22)' : mobileTokens.color.border;\n const fieldBg = isDark ? '#1e293b' : mobileTokens.color.surfaceMuted;\n const cardTheme: CardTheme = {\n surface,\n border: borderColor,\n foreground,\n muted,\n pressed: isDark ? 'rgba(148,163,184,0.10)' : 'rgba(15,23,42,0.05)',\n };\n const segmentBg = isDark ? 'rgba(148,163,184,0.12)' : mobileTokens.color.surfaceMuted;\n const segmentActiveBg = isDark ? 'rgba(148,163,184,0.24)' : mobileTokens.color.surface;\n\n const openApp = useCallback(\n (app: MobileAppItem) => {\n const channelId = uuidv4();\n const params: Record<string, unknown> = {\n orgName: orgName ?? undefined,\n channelId,\n appTitle: app.label,\n };\n\n if (app.nativeRoute === 'characters-native') {\n // Same wiring as AppsMenu: the tile opens the self-contained native\n // character studio (never a chat with the tile's prompt). The host\n // contributes only the session token + subgraph endpoint, built in\n // the screen, so no manifest/handoff params are needed here.\n navigation.dispatch(\n CommonActions.navigate({\n name: 'MainStack.CharactersNative',\n params,\n }),\n );\n return;\n }\n\n if (app.nativeRoute === 'canvas-native') {\n // Web canvas opens the boards grid first. Do not mint a chat\n // channelId here — that id is not an index row, and passing it\n // looks like a deep link into a board that does not exist.\n navigation.dispatch(\n CommonActions.navigate({\n name: 'MainStack.CanvasNative',\n params: { orgName: orgName ?? undefined, appTitle: 'Canvas' },\n }),\n );\n return;\n }\n\n if (app.nativeRoute === 'chat-native') {\n // Opens the conversation list. Deliberately no channelId: the\n // uuid minted above is an AI-chat channel, not a messenger\n // channel, and passing it would read as a deep link into a\n // thread that does not exist.\n navigation.dispatch(\n CommonActions.navigate({\n name: 'MainStack.ChatNative',\n params: { orgName: orgName ?? undefined },\n }),\n );\n return;\n }\n\n if (app.nativeRoute === 'billing-native') {\n navigation.navigate('MainStack.Billing', { orgName: orgName ?? undefined });\n return;\n }\n\n if (app.nativeRoute === 'shopping-native') {\n navigation.dispatch(\n CommonActions.navigate({\n name: 'MainStack.ShoppingNative',\n params: { orgName: orgName ?? undefined, appTitle: 'Shop' },\n }),\n );\n return;\n }\n\n if (app.nativeRoute === 'travel-native') {\n navigation.dispatch(\n CommonActions.navigate({\n name: 'MainStack.TravelNative',\n params: { orgName: orgName ?? undefined, appTitle: 'Travel' },\n }),\n );\n return;\n }\n\n if (app.nativeRoute === 'webbuilder') {\n const surfaceUrl = resolveSurfaceUrl(app, config);\n navigation.dispatch(\n CommonActions.navigate({\n name: 'MainStack.WebBuilder',\n params: surfaceUrl ? { ...params, url: surfaceUrl } : params,\n }),\n );\n return;\n }\n\n void createChannel({\n id: channelId,\n title: buildChannelTitle(channelId),\n isShared: false,\n sharedSlug: null,\n isArchived: false,\n isPinned: false,\n model: null,\n systemPrompt: null,\n orgName,\n } as any).catch((err) => {\n console.error('[AppsCatalog] createChannel failed:', err);\n });\n\n navigation.dispatch(\n CommonActions.navigate({\n name: 'MainStack.Chat',\n params: {\n ...params,\n initialQuery: app.prompt,\n initialMode: 'chat',\n },\n }),\n );\n },\n [createChannel, navigation, orgName],\n );\n\n const emptyState =\n tab === 'favorites' && !query.trim()\n ? {\n icon: 'heart-outline' as const,\n title: 'No favorites yet',\n hint: 'Tap the heart on any app to keep it here.',\n }\n : {\n icon: 'magnify' as const,\n title: 'No apps match that search',\n hint: tab === 'favorites' ? 'Try All apps, or a shorter name.' : 'Try a shorter name.',\n };\n\n return (\n <View style={[styles.root, { backgroundColor: screenBg }]}>\n <View style={[styles.segment, { backgroundColor: segmentBg, borderColor }]} accessibilityRole=\"tablist\">\n {(\n [\n { key: 'all', label: 'All apps' },\n { key: 'favorites', label: 'Favorites' },\n ] as const\n ).map(({ key, label }) => {\n const selected = tab === key;\n return (\n <Pressable\n key={key}\n onPress={() => setTab(key)}\n accessibilityRole=\"tab\"\n accessibilityState={{ selected }}\n style={[\n styles.segmentItem,\n selected && [styles.segmentItemActive, { backgroundColor: segmentActiveBg }],\n ]}\n >\n <Text\n style={[\n styles.segmentLabel,\n { color: selected ? foreground : muted },\n selected && styles.segmentLabelActive,\n ]}\n >\n {label}\n </Text>\n </Pressable>\n );\n })}\n </View>\n <View style={[styles.searchWrap, { backgroundColor: fieldBg, borderColor }]}>\n <MaterialCommunityIcons name=\"magnify\" size={18} color={muted} />\n <TextInput\n value={query}\n onChangeText={setQuery}\n placeholder=\"Search apps\"\n placeholderTextColor={muted}\n autoCorrect={false}\n autoCapitalize=\"none\"\n clearButtonMode=\"while-editing\"\n style={[styles.searchInput, { color: foreground }]}\n />\n </View>\n <ScrollView keyboardShouldPersistTaps=\"handled\" contentContainerStyle={styles.list}>\n {apps.length === 0 ? (\n <View style={styles.empty}>\n <View style={[styles.emptyMark, { backgroundColor: segmentBg }]}>\n <MaterialCommunityIcons name={emptyState.icon} size={26} color={muted} />\n </View>\n <Text style={[styles.emptyTitle, { color: foreground }]}>{emptyState.title}</Text>\n <Text style={[styles.emptyHint, { color: muted }]}>{emptyState.hint}</Text>\n </View>\n ) : (\n <View style={[styles.grid, { gap: GAP }]}>\n {apps.map((app) => (\n <AppCard\n key={app.key}\n app={app}\n width={cardWidth}\n theme={cardTheme}\n favorite={favorites.has(app.key)}\n onOpen={openApp}\n onToggleFavorite={toggleFavorite}\n />\n ))}\n </View>\n )}\n </ScrollView>\n </View>\n );\n}\n\nconst AppCard = React.memo(function AppCard({\n app,\n width,\n theme,\n favorite,\n onOpen,\n onToggleFavorite,\n}: {\n app: MobileAppItem;\n width: number;\n theme: CardTheme;\n favorite: boolean;\n onOpen: (app: MobileAppItem) => void;\n onToggleFavorite: (key: string) => void;\n}) {\n const poster = APP_GROUP_ART[app.group];\n const artwork = APP_ART[app.key];\n // Glyph scales with the tile so a 3-column phone and a 5-column tablet read alike.\n const glyph = Math.round(width * 0.36);\n const echo = Math.round(width * 0.95);\n return (\n <Pressable\n onPress={() => onOpen(app)}\n accessibilityRole=\"button\"\n accessibilityLabel={`${app.label}, ${app.group}`}\n accessibilityHint=\"Opens the app\"\n style={({ pressed }) => [\n styles.card,\n { width, backgroundColor: theme.surface, borderColor: theme.border },\n pressed && { backgroundColor: theme.pressed, transform: [{ scale: 0.97 }] },\n ]}\n >\n <View style={[styles.tile, { backgroundColor: poster.base }]}>\n {artwork ? (\n <Image\n source={artwork}\n style={StyleSheet.absoluteFill}\n contentFit=\"cover\"\n transition={120}\n accessibilityIgnoresInvertColors\n />\n ) : (\n <>\n <View\n style={[\n styles.tileHighlight,\n { width: width * 0.9, height: width * 0.9, borderRadius: width },\n ]}\n />\n <MaterialCommunityIcons\n name={app.icon}\n size={echo}\n color={poster.glow}\n style={[styles.tileEcho, { right: -echo * 0.28, bottom: -echo * 0.3 }]}\n />\n <MaterialCommunityIcons name={app.icon} size={glyph} color=\"#ffffff\" style={styles.tileGlyph} />\n </>\n )}\n <Pressable\n onPress={() => onToggleFavorite(app.key)}\n hitSlop={8}\n accessibilityRole=\"button\"\n accessibilityLabel={\n favorite ? `Remove ${app.label} from favorites` : `Add ${app.label} to favorites`\n }\n accessibilityState={{ selected: favorite }}\n style={({ pressed }) => [styles.heart, pressed && styles.heartPressed]}\n >\n <MaterialCommunityIcons\n name={favorite ? 'heart' : 'heart-outline'}\n size={16}\n color={favorite ? '#fb7185' : '#ffffff'}\n />\n </Pressable>\n </View>\n <View style={styles.cardBody}>\n <Text style={[styles.cardTitle, { color: theme.foreground }]} numberOfLines={2}>\n {app.label}\n </Text>\n <Text style={[styles.cardCaption, { color: theme.muted }]} numberOfLines={1}>\n {app.group}\n </Text>\n </View>\n </Pressable>\n );\n});\n\nconst styles = StyleSheet.create({\n root: {\n flex: 1,\n },\n segment: {\n flexDirection: 'row',\n alignSelf: 'center',\n marginTop: 12,\n padding: 4,\n borderRadius: mobileTokens.radius.pill,\n borderWidth: 1,\n minWidth: 240,\n maxWidth: 320,\n width: '70%',\n },\n segmentItem: {\n flex: 1,\n minHeight: 36,\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: mobileTokens.radius.pill,\n },\n segmentItemActive: {\n ...mobileTokens.shadow.card,\n },\n segmentLabel: {\n fontSize: 15,\n fontWeight: '600',\n },\n segmentLabelActive: {\n fontWeight: '700',\n },\n searchWrap: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 8,\n marginHorizontal: H_PAD,\n marginTop: 12,\n marginBottom: 4,\n borderWidth: 1,\n borderRadius: mobileTokens.radius.md,\n paddingHorizontal: 12,\n minHeight: 44,\n },\n searchInput: {\n flex: 1,\n fontSize: 15,\n paddingVertical: 8,\n },\n list: {\n paddingHorizontal: H_PAD,\n paddingTop: 12,\n paddingBottom: 32,\n },\n grid: {\n flexDirection: 'row',\n flexWrap: 'wrap',\n alignItems: 'stretch',\n },\n card: {\n borderRadius: mobileTokens.radius.lg,\n borderWidth: 1,\n overflow: 'hidden',\n },\n tile: {\n aspectRatio: 1,\n alignItems: 'center',\n justifyContent: 'center',\n overflow: 'hidden',\n },\n tileHighlight: {\n position: 'absolute',\n top: '-45%',\n left: '-35%',\n backgroundColor: 'rgba(255,255,255,0.12)',\n },\n tileEcho: {\n position: 'absolute',\n opacity: 0.28,\n },\n tileGlyph: {\n textShadowColor: 'rgba(15,23,42,0.28)',\n textShadowOffset: { width: 0, height: 2 },\n textShadowRadius: 6,\n },\n heart: {\n position: 'absolute',\n top: 8,\n right: 8,\n width: 32,\n height: 32,\n borderRadius: 16,\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: 'rgba(15,23,42,0.36)',\n },\n heartPressed: {\n backgroundColor: 'rgba(15,23,42,0.55)',\n },\n cardBody: {\n paddingHorizontal: 10,\n paddingTop: 10,\n paddingBottom: 12,\n gap: 3,\n },\n cardTitle: {\n fontSize: 14,\n fontWeight: '700',\n lineHeight: 18,\n // Two lines reserved so every row lines up whether a name wraps or not.\n minHeight: 36,\n },\n cardCaption: {\n fontSize: 11,\n fontWeight: '600',\n letterSpacing: 0.8,\n textTransform: 'uppercase',\n },\n empty: {\n alignItems: 'center',\n paddingTop: 56,\n paddingHorizontal: 32,\n gap: 6,\n },\n emptyMark: {\n width: 56,\n height: 56,\n borderRadius: 28,\n alignItems: 'center',\n justifyContent: 'center',\n marginBottom: 8,\n },\n emptyTitle: {\n fontSize: 16,\n fontWeight: '700',\n },\n emptyHint: {\n fontSize: 14,\n textAlign: 'center',\n lineHeight: 20,\n },\n});\n"],"names":["_a","uuidv4","AppCard"],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
const APP_ART = {
|
|
2
|
+
billing: require("../../assets/apps/billing.webp"),
|
|
3
|
+
canvas: require("../../assets/apps/canvas.webp"),
|
|
4
|
+
"cards-wallet": require("../../assets/apps/cards-wallet.webp"),
|
|
5
|
+
character: require("../../assets/apps/character.webp"),
|
|
6
|
+
"chat-native": require("../../assets/apps/chat-native.webp"),
|
|
7
|
+
codezen: require("../../assets/apps/codezen.webp"),
|
|
8
|
+
computer: require("../../assets/apps/computer.webp"),
|
|
9
|
+
crm: require("../../assets/apps/crm.webp"),
|
|
10
|
+
design: require("../../assets/apps/design.webp"),
|
|
11
|
+
expenses: require("../../assets/apps/expenses.webp"),
|
|
12
|
+
inbox: require("../../assets/apps/inbox.webp"),
|
|
13
|
+
"issue-ticket": require("../../assets/apps/issue-ticket.webp"),
|
|
14
|
+
"job-search": require("../../assets/apps/job-search.webp"),
|
|
15
|
+
"kpi-motivation": require("../../assets/apps/kpi-motivation.webp"),
|
|
16
|
+
mailcampaign: require("../../assets/apps/mailcampaign.webp"),
|
|
17
|
+
notebook: require("../../assets/apps/notebook.webp"),
|
|
18
|
+
paper2poster: require("../../assets/apps/paper2poster.webp"),
|
|
19
|
+
resume: require("../../assets/apps/resume.webp"),
|
|
20
|
+
salesiq: require("../../assets/apps/salesiq.webp"),
|
|
21
|
+
shop: require("../../assets/apps/shop.webp"),
|
|
22
|
+
smscampaign: require("../../assets/apps/smscampaign.webp"),
|
|
23
|
+
"social-events": require("../../assets/apps/social-events.webp"),
|
|
24
|
+
travel: require("../../assets/apps/travel.webp"),
|
|
25
|
+
webbuilder: require("../../assets/apps/webbuilder.webp"),
|
|
26
|
+
workflow: require("../../assets/apps/workflow.webp"),
|
|
27
|
+
"canvas-native": require("../../assets/apps/canvas.webp"),
|
|
28
|
+
"characters-native": require("../../assets/apps/character.webp"),
|
|
29
|
+
"shopping-native": require("../../assets/apps/shop.webp"),
|
|
30
|
+
"travel-native": require("../../assets/apps/travel.webp")
|
|
31
|
+
};export{APP_ART};//# sourceMappingURL=appArt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"appArt.js","sources":["../../../src/features/apps/appArt.ts"],"sourcesContent":["/**\n * Bundled tile artwork for the Apps launcher, keyed by catalog `key`.\n *\n * Static `require` calls are mandatory: Metro resolves assets at build time,\n * so a computed path never bundles. Images are 480px square WebP (~25 KB\n * each); a key missing here simply falls back to the glyph poster.\n * Native twins (canvas-native, characters-native, shopping-native,\n * travel-native) share their web sibling's artwork.\n */\nimport type { ImageSourcePropType } from 'react-native';\n\n/* eslint-disable global-require, @typescript-eslint/no-var-requires */\nexport const APP_ART: Partial<Record<string, ImageSourcePropType>> = {\n billing: require('../../assets/apps/billing.webp'),\n canvas: require('../../assets/apps/canvas.webp'),\n 'cards-wallet': require('../../assets/apps/cards-wallet.webp'),\n character: require('../../assets/apps/character.webp'),\n 'chat-native': require('../../assets/apps/chat-native.webp'),\n codezen: require('../../assets/apps/codezen.webp'),\n computer: require('../../assets/apps/computer.webp'),\n crm: require('../../assets/apps/crm.webp'),\n design: require('../../assets/apps/design.webp'),\n expenses: require('../../assets/apps/expenses.webp'),\n inbox: require('../../assets/apps/inbox.webp'),\n 'issue-ticket': require('../../assets/apps/issue-ticket.webp'),\n 'job-search': require('../../assets/apps/job-search.webp'),\n 'kpi-motivation': require('../../assets/apps/kpi-motivation.webp'),\n mailcampaign: require('../../assets/apps/mailcampaign.webp'),\n notebook: require('../../assets/apps/notebook.webp'),\n paper2poster: require('../../assets/apps/paper2poster.webp'),\n resume: require('../../assets/apps/resume.webp'),\n salesiq: require('../../assets/apps/salesiq.webp'),\n shop: require('../../assets/apps/shop.webp'),\n smscampaign: require('../../assets/apps/smscampaign.webp'),\n 'social-events': require('../../assets/apps/social-events.webp'),\n travel: require('../../assets/apps/travel.webp'),\n webbuilder: require('../../assets/apps/webbuilder.webp'),\n workflow: require('../../assets/apps/workflow.webp'),\n 'canvas-native': require('../../assets/apps/canvas.webp'),\n 'characters-native': require('../../assets/apps/character.webp'),\n 'shopping-native': require('../../assets/apps/shop.webp'),\n 'travel-native': require('../../assets/apps/travel.webp'),\n};\n"],"names":[],"mappings":"AAYO,MAAM,OAAwD,GAAA;AAAA,EACnE,OAAA,EAAS,QAAQ,gCAAgC,CAAA;AAAA,EACjD,MAAA,EAAQ,QAAQ,+BAA+B,CAAA;AAAA,EAC/C,cAAA,EAAgB,QAAQ,qCAAqC,CAAA;AAAA,EAC7D,SAAA,EAAW,QAAQ,kCAAkC,CAAA;AAAA,EACrD,aAAA,EAAe,QAAQ,oCAAoC,CAAA;AAAA,EAC3D,OAAA,EAAS,QAAQ,gCAAgC,CAAA;AAAA,EACjD,QAAA,EAAU,QAAQ,iCAAiC,CAAA;AAAA,EACnD,GAAA,EAAK,QAAQ,4BAA4B,CAAA;AAAA,EACzC,MAAA,EAAQ,QAAQ,+BAA+B,CAAA;AAAA,EAC/C,QAAA,EAAU,QAAQ,iCAAiC,CAAA;AAAA,EACnD,KAAA,EAAO,QAAQ,8BAA8B,CAAA;AAAA,EAC7C,cAAA,EAAgB,QAAQ,qCAAqC,CAAA;AAAA,EAC7D,YAAA,EAAc,QAAQ,mCAAmC,CAAA;AAAA,EACzD,gBAAA,EAAkB,QAAQ,uCAAuC,CAAA;AAAA,EACjE,YAAA,EAAc,QAAQ,qCAAqC,CAAA;AAAA,EAC3D,QAAA,EAAU,QAAQ,iCAAiC,CAAA;AAAA,EACnD,YAAA,EAAc,QAAQ,qCAAqC,CAAA;AAAA,EAC3D,MAAA,EAAQ,QAAQ,+BAA+B,CAAA;AAAA,EAC/C,OAAA,EAAS,QAAQ,gCAAgC,CAAA;AAAA,EACjD,IAAA,EAAM,QAAQ,6BAA6B,CAAA;AAAA,EAC3C,WAAA,EAAa,QAAQ,oCAAoC,CAAA;AAAA,EACzD,eAAA,EAAiB,QAAQ,sCAAsC,CAAA;AAAA,EAC/D,MAAA,EAAQ,QAAQ,+BAA+B,CAAA;AAAA,EAC/C,UAAA,EAAY,QAAQ,mCAAmC,CAAA;AAAA,EACvD,QAAA,EAAU,QAAQ,iCAAiC,CAAA;AAAA,EACnD,eAAA,EAAiB,QAAQ,+BAA+B,CAAA;AAAA,EACxD,mBAAA,EAAqB,QAAQ,kCAAkC,CAAA;AAAA,EAC/D,iBAAA,EAAmB,QAAQ,6BAA6B,CAAA;AAAA,EACxD,eAAA,EAAiB,QAAQ,+BAA+B;AAC1D"}
|