@adminide-stack/yantra-mobile 12.0.136-alpha.0 → 12.0.136-alpha.2

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 (30) hide show
  1. package/lib/compute.js +51 -1
  2. package/lib/compute.js.map +1 -1
  3. package/lib/features/apps/AppsCatalog.js +10 -0
  4. package/lib/features/apps/AppsCatalog.js.map +1 -1
  5. package/lib/features/apps/mobileAppCatalog.js +9 -0
  6. package/lib/features/apps/mobileAppCatalog.js.map +1 -1
  7. package/lib/features/apps/nativeSurfaceTwin.js +1 -0
  8. package/lib/features/apps/nativeSurfaceTwin.js.map +1 -1
  9. package/lib/features/dictate/DictateExperience.js +387 -0
  10. package/lib/features/dictate/DictateExperience.js.map +1 -0
  11. package/lib/features/dictate/components/DictationList.js +110 -0
  12. package/lib/features/dictate/components/DictationList.js.map +1 -0
  13. package/lib/features/dictate/components/NoteView.js +330 -0
  14. package/lib/features/dictate/components/NoteView.js.map +1 -0
  15. package/lib/features/dictate/components/RecordPanel.js +218 -0
  16. package/lib/features/dictate/components/RecordPanel.js.map +1 -0
  17. package/lib/features/dictate/dictateClient.js +98 -0
  18. package/lib/features/dictate/dictateClient.js.map +1 -0
  19. package/lib/features/dictate/dictateTheme.js +46 -0
  20. package/lib/features/dictate/dictateTheme.js.map +1 -0
  21. package/lib/features/dictate/dictationStore.js +107 -0
  22. package/lib/features/dictate/dictationStore.js.map +1 -0
  23. package/lib/features/dictate/noteText.js +35 -0
  24. package/lib/features/dictate/noteText.js.map +1 -0
  25. package/lib/features/dictate/useDictationRecorder.js +121 -0
  26. package/lib/features/dictate/useDictationRecorder.js.map +1 -0
  27. package/lib/routes.json +50 -0
  28. package/lib/screens/DictateNative/index.js +36 -0
  29. package/lib/screens/DictateNative/index.js.map +1 -0
  30. package/package.json +4 -4
@@ -1 +1 @@
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, useEffect, useMemo, useState } from 'react';\nimport {\n InteractionManager,\n Pressable,\n ScrollView,\n StyleSheet,\n Text,\n TextInput,\n View,\n useColorScheme,\n useWindowDimensions,\n} from 'react-native';\nimport {\n CommonActions,\n useNavigation,\n useRoute,\n type NavigationProp,\n type ParamListBase,\n type RouteProp,\n} 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 { preloadNativeWebBuilderExperience } from '../webbuilder/nativeWebBuilderRegistry';\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<NavigationProp<ParamListBase>>();\n const route = useRoute<RouteProp<Record<string, { orgName?: string | null } | undefined>, string>>();\n const colorScheme = useColorScheme();\n const isDark = colorScheme === 'dark';\n const { createChannel } = useChatMutations();\n const { width: screenWidth } = useWindowDimensions();\n // Someone browsing the apps may open Web Builder next: load its code once this screen\n // has settled, so it opens without the loading spinner.\n useEffect(() => {\n const task = InteractionManager.runAfterInteractions(() => {\n preloadNativeWebBuilderExperience().catch(() => undefined);\n });\n return () => task.cancel();\n }, []);\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.surface;\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.surface;\n const segmentActiveBg = isDark ? 'rgba(148,163,184,0.24)' : mobileTokens.color.surface;\n const emptyMarkBg = isDark ? 'rgba(234,88,12,0.22)' : 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 === 'job-search-native') {\n navigation.dispatch(\n CommonActions.navigate({\n name: 'MainStack.JobSearchNative',\n params: { orgName: orgName ?? undefined, appTitle: 'Job Search' },\n }),\n );\n return;\n }\n\n if (app.nativeRoute === 'resume-native') {\n navigation.dispatch(\n CommonActions.navigate({\n name: 'MainStack.ResumeNative',\n params: { orgName: orgName ?? undefined, appTitle: 'Resume' },\n }),\n );\n return;\n }\n\n if (app.nativeRoute === 'inbox-native') {\n navigation.dispatch(\n CommonActions.navigate({\n name: 'MainStack.InboxNative',\n params: { orgName: orgName ?? undefined, appTitle: 'Inbox' },\n }),\n );\n return;\n }\n\n if (app.nativeRoute === 'study-native') {\n navigation.dispatch(\n CommonActions.navigate({\n name: 'MainStack.StudyNative',\n params: { orgName: orgName ?? undefined, appTitle: 'Study' },\n }),\n );\n return;\n }\n\n if (app.nativeRoute === 'local-services-native') {\n navigation.dispatch(\n CommonActions.navigate({\n name: 'MainStack.LocalServicesNative',\n params: { orgName: orgName ?? undefined, appTitle: 'Local Services' },\n }),\n );\n return;\n }\n\n if (app.nativeRoute === 'movies-native') {\n navigation.dispatch(\n CommonActions.navigate({\n name: 'MainStack.MoviesNative',\n params: { orgName: orgName ?? undefined, appTitle: 'Movies' },\n }),\n );\n return;\n }\n\n if (app.nativeRoute === 'expenses-native') {\n navigation.dispatch(\n CommonActions.navigate({\n name: 'MainStack.ExpensesNative',\n params: { orgName: orgName ?? undefined, appTitle: 'Expenses' },\n }),\n );\n return;\n }\n\n if (app.nativeRoute === 'webbuilder-native') {\n navigation.dispatch(\n CommonActions.navigate({\n name: 'MainStack.WebBuilderNative',\n params: { orgName: orgName ?? undefined, appTitle: 'Web Builder' },\n }),\n );\n return;\n }\n\n if (app.nativeRoute === 'design-native') {\n navigation.dispatch(\n CommonActions.navigate({\n name: 'MainStack.DesignNative',\n params: { orgName: orgName ?? undefined, appTitle: 'Design' },\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 }).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: emptyMarkBg }]}>\n <MaterialCommunityIcons\n name={emptyState.icon}\n size={26}\n color={mobileTokens.color.primary}\n />\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","React","AppCard"],"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, useEffect, useMemo, useState } from 'react';\nimport {\n InteractionManager,\n Pressable,\n ScrollView,\n StyleSheet,\n Text,\n TextInput,\n View,\n useColorScheme,\n useWindowDimensions,\n} from 'react-native';\nimport {\n CommonActions,\n useNavigation,\n useRoute,\n type NavigationProp,\n type ParamListBase,\n type RouteProp,\n} 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 { preloadNativeWebBuilderExperience } from '../webbuilder/nativeWebBuilderRegistry';\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<NavigationProp<ParamListBase>>();\n const route = useRoute<RouteProp<Record<string, { orgName?: string | null } | undefined>, string>>();\n const colorScheme = useColorScheme();\n const isDark = colorScheme === 'dark';\n const { createChannel } = useChatMutations();\n const { width: screenWidth } = useWindowDimensions();\n // Someone browsing the apps may open Web Builder next: load its code once this screen\n // has settled, so it opens without the loading spinner.\n useEffect(() => {\n const task = InteractionManager.runAfterInteractions(() => {\n preloadNativeWebBuilderExperience().catch(() => undefined);\n });\n return () => task.cancel();\n }, []);\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.surface;\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.surface;\n const segmentActiveBg = isDark ? 'rgba(148,163,184,0.24)' : mobileTokens.color.surface;\n const emptyMarkBg = isDark ? 'rgba(234,88,12,0.22)' : 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 === 'job-search-native') {\n navigation.dispatch(\n CommonActions.navigate({\n name: 'MainStack.JobSearchNative',\n params: { orgName: orgName ?? undefined, appTitle: 'Job Search' },\n }),\n );\n return;\n }\n\n if (app.nativeRoute === 'resume-native') {\n navigation.dispatch(\n CommonActions.navigate({\n name: 'MainStack.ResumeNative',\n params: { orgName: orgName ?? undefined, appTitle: 'Resume' },\n }),\n );\n return;\n }\n\n if (app.nativeRoute === 'inbox-native') {\n navigation.dispatch(\n CommonActions.navigate({\n name: 'MainStack.InboxNative',\n params: { orgName: orgName ?? undefined, appTitle: 'Inbox' },\n }),\n );\n return;\n }\n\n if (app.nativeRoute === 'study-native') {\n navigation.dispatch(\n CommonActions.navigate({\n name: 'MainStack.StudyNative',\n params: { orgName: orgName ?? undefined, appTitle: 'Study' },\n }),\n );\n return;\n }\n\n if (app.nativeRoute === 'local-services-native') {\n navigation.dispatch(\n CommonActions.navigate({\n name: 'MainStack.LocalServicesNative',\n params: { orgName: orgName ?? undefined, appTitle: 'Local Services' },\n }),\n );\n return;\n }\n\n if (app.nativeRoute === 'movies-native') {\n navigation.dispatch(\n CommonActions.navigate({\n name: 'MainStack.MoviesNative',\n params: { orgName: orgName ?? undefined, appTitle: 'Movies' },\n }),\n );\n return;\n }\n\n if (app.nativeRoute === 'dictate-native') {\n navigation.dispatch(\n CommonActions.navigate({\n name: 'MainStack.DictateNative',\n params: { orgName: orgName ?? undefined, appTitle: 'Dictate' },\n }),\n );\n return;\n }\n\n if (app.nativeRoute === 'expenses-native') {\n navigation.dispatch(\n CommonActions.navigate({\n name: 'MainStack.ExpensesNative',\n params: { orgName: orgName ?? undefined, appTitle: 'Expenses' },\n }),\n );\n return;\n }\n\n if (app.nativeRoute === 'webbuilder-native') {\n navigation.dispatch(\n CommonActions.navigate({\n name: 'MainStack.WebBuilderNative',\n params: { orgName: orgName ?? undefined, appTitle: 'Web Builder' },\n }),\n );\n return;\n }\n\n if (app.nativeRoute === 'design-native') {\n navigation.dispatch(\n CommonActions.navigate({\n name: 'MainStack.DesignNative',\n params: { orgName: orgName ?? undefined, appTitle: 'Design' },\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 }).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: emptyMarkBg }]}>\n <MaterialCommunityIcons\n name={emptyState.icon}\n size={26}\n color={mobileTokens.color.primary}\n />\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","React","AppCard"],"mappings":";;;;;;;;;;;;;;;;;;;AAwBA,MAAM,KAAQ,GAAA,EAAA;AACd,MAAM,GAAM,GAAA,EAAA;AAEZ,MAAM,QAAW,GAAA,GAAA;AAQjB,SAAS,kBAAkB,SAA2B,EAAA;AACpD,EAAA,OAAO,gBAAgB,SAAS,CAAA,CAAA;AAClC;AACO,SAAS,WAAY,CAAA;AAAA,EAC1B,OAAS,EAAA;AACX,CAEG,EAAA;AA1CH,EAAA,IAAA,EAAA;AA2CE,EAAA,MAAM,aAAa,aAA6C,EAAA;AAChE,EAAA,MAAM,QAAQ,QAEW,EAAA;AACzB,EAAA,MAAM,cAAc,cAAe,EAAA;AACnC,EAAA,MAAM,SAAS,WAAgB,KAAA,MAAA;AAC/B,EAAM,MAAA;AAAA,IACJ;AAAA,MACE,gBAAiB,EAAA;AACrB,EAAM,MAAA;AAAA,IACJ,KAAO,EAAA;AAAA,MACL,mBAAoB,EAAA;AAGxB,EAAA,SAAA,CAAU,MAAM;AACd,IAAM,MAAA,IAAA,GAAO,kBAAmB,CAAA,oBAAA,CAAqB,MAAM;AACzD,MAAkC,iCAAA,EAAA,CAAE,KAAM,CAAA,MAAM,MAAS,CAAA;AAAA,KAC1D,CAAA;AACD,IAAO,OAAA,MAAM,KAAK,MAAO,EAAA;AAAA,GAC3B,EAAG,EAAE,CAAA;AACL,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAS,EAAE,CAAA;AACrC,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAI,SAAkB,KAAK,CAAA;AAC7C,EAAM,MAAA;AAAA,IACJ,SAAA;AAAA,IACA,MAAQ,EAAA;AAAA,MACN,eAAgB,EAAA;AACpB,EAAM,MAAA,OAAA,GAAU,QAAQ,MAAM;AArEhC,IAAA,IAAAA,GAAA,EAAA,EAAA;AAsEI,IAAI,IAAA,OAAO,gBAAgB,QAAY,IAAA,WAAA,CAAY,MAAQ,EAAA,OAAO,YAAY,IAAK,EAAA;AACnF,IAAM,MAAA,GAAA,GAAA,CAAM,MAAAA,GAAA,GAAA,KAAA,IAAA,IAAA,GAAA,MAAA,GAAA,KAAA,CAAO,WAAP,IAAAA,GAAAA,MAAAA,GAAAA,GAAAA,CAAe,YAAf,IAAgD,GAAA,EAAA,GAAA,EAAA;AAC5D,IAAO,OAAA,OAAO,QAAQ,QAAY,IAAA,GAAA,CAAI,MAAS,GAAA,GAAA,CAAI,MAAS,GAAA,IAAA;AAAA,KAC3D,CAAC,WAAA,EAAA,CAAa,oCAAO,MAAP,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAe,OAAO,CAAC,CAAA;AACxC,EAAA,MAAM,IAAO,GAAA,OAAA,CAAQ,MAAM,gBAAA,CAAiB,kBAAoB,EAAA,KAAA,EAAO,GAAK,EAAA,SAAS,CAAG,EAAA,CAAC,SAAW,EAAA,KAAA,EAAO,GAAG,CAAC,CAAA;AAC/G,EAAA,MAAM,UAAU,IAAK,CAAA,GAAA,CAAI,CAAG,EAAA,IAAA,CAAK,IAAI,CAAG,EAAA,IAAA,CAAK,KAAO,CAAA,CAAA,WAAA,GAAc,QAAQ,CAAI,GAAA,GAAA,KAAQ,QAAW,GAAA,GAAA,CAAI,CAAC,CAAC,CAAA;AACvG,EAAM,MAAA,SAAA,GAAY,KAAK,KAAO,CAAA,CAAA,WAAA,GAAc,QAAQ,CAAI,GAAA,GAAA,IAAO,OAAU,GAAA,CAAA,CAAA,IAAM,OAAO,CAAA;AACtF,EAAA,MAAM,KAAQ,GAAA,MAAA,GAAS,SAAY,GAAA,YAAA,CAAa,KAAM,CAAA,SAAA;AACtD,EAAA,MAAM,UAAa,GAAA,MAAA,GAAS,SAAY,GAAA,YAAA,CAAa,KAAM,CAAA,IAAA;AAC3D,EAAA,MAAM,OAAU,GAAA,MAAA,GAAS,SAAY,GAAA,YAAA,CAAa,KAAM,CAAA,OAAA;AACxD,EAAA,MAAM,QAAW,GAAA,MAAA,GAAS,SAAY,GAAA,YAAA,CAAa,KAAM,CAAA,EAAA;AACzD,EAAA,MAAM,WAAc,GAAA,MAAA,GAAS,wBAA2B,GAAA,YAAA,CAAa,KAAM,CAAA,MAAA;AAC3E,EAAA,MAAM,OAAU,GAAA,MAAA,GAAS,SAAY,GAAA,YAAA,CAAa,KAAM,CAAA,OAAA;AACxD,EAAA,MAAM,SAAuB,GAAA;AAAA,IAC3B,OAAA;AAAA,IACA,MAAQ,EAAA,WAAA;AAAA,IACR,UAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAA,EAAS,SAAS,wBAA2B,GAAA;AAAA,GAC/C;AACA,EAAA,MAAM,SAAY,GAAA,MAAA,GAAS,wBAA2B,GAAA,YAAA,CAAa,KAAM,CAAA,OAAA;AACzE,EAAA,MAAM,eAAkB,GAAA,MAAA,GAAS,wBAA2B,GAAA,YAAA,CAAa,KAAM,CAAA,OAAA;AAC/E,EAAA,MAAM,WAAc,GAAA,MAAA,GAAS,sBAAyB,GAAA,YAAA,CAAa,KAAM,CAAA,WAAA;AACzE,EAAM,MAAA,OAAA,GAAU,WAAY,CAAA,CAAC,GAAuB,KAAA;AAClD,IAAA,MAAM,YAAYC,EAAO,EAAA;AACzB,IAAA,MAAM,MAAkC,GAAA;AAAA,MACtC,SAAS,OAAW,IAAA,IAAA,GAAA,OAAA,GAAA,MAAA;AAAA,MACpB,SAAA;AAAA,MACA,UAAU,GAAI,CAAA;AAAA,KAChB;AACA,IAAI,IAAA,GAAA,CAAI,gBAAgB,mBAAqB,EAAA;AAK3C,MAAW,UAAA,CAAA,QAAA,CAAS,cAAc,QAAS,CAAA;AAAA,QACzC,IAAM,EAAA,4BAAA;AAAA,QACN;AAAA,OACD,CAAC,CAAA;AACF,MAAA;AAAA;AAEF,IAAI,IAAA,GAAA,CAAI,gBAAgB,eAAiB,EAAA;AAIvC,MAAW,UAAA,CAAA,QAAA,CAAS,cAAc,QAAS,CAAA;AAAA,QACzC,IAAM,EAAA,wBAAA;AAAA,QACN,MAAQ,EAAA;AAAA,UACN,SAAS,OAAW,IAAA,IAAA,GAAA,OAAA,GAAA,MAAA;AAAA,UACpB,QAAU,EAAA;AAAA;AACZ,OACD,CAAC,CAAA;AACF,MAAA;AAAA;AAEF,IAAI,IAAA,GAAA,CAAI,gBAAgB,aAAe,EAAA;AAKrC,MAAW,UAAA,CAAA,QAAA,CAAS,cAAc,QAAS,CAAA;AAAA,QACzC,IAAM,EAAA,sBAAA;AAAA,QACN,MAAQ,EAAA;AAAA,UACN,SAAS,OAAW,IAAA,IAAA,GAAA,OAAA,GAAA;AAAA;AACtB,OACD,CAAC,CAAA;AACF,MAAA;AAAA;AAEF,IAAI,IAAA,GAAA,CAAI,gBAAgB,gBAAkB,EAAA;AACxC,MAAA,UAAA,CAAW,SAAS,mBAAqB,EAAA;AAAA,QACvC,SAAS,OAAW,IAAA,IAAA,GAAA,OAAA,GAAA;AAAA,OACrB,CAAA;AACD,MAAA;AAAA;AAEF,IAAI,IAAA,GAAA,CAAI,gBAAgB,iBAAmB,EAAA;AACzC,MAAW,UAAA,CAAA,QAAA,CAAS,cAAc,QAAS,CAAA;AAAA,QACzC,IAAM,EAAA,0BAAA;AAAA,QACN,MAAQ,EAAA;AAAA,UACN,SAAS,OAAW,IAAA,IAAA,GAAA,OAAA,GAAA,MAAA;AAAA,UACpB,QAAU,EAAA;AAAA;AACZ,OACD,CAAC,CAAA;AACF,MAAA;AAAA;AAEF,IAAI,IAAA,GAAA,CAAI,gBAAgB,eAAiB,EAAA;AACvC,MAAW,UAAA,CAAA,QAAA,CAAS,cAAc,QAAS,CAAA;AAAA,QACzC,IAAM,EAAA,wBAAA;AAAA,QACN,MAAQ,EAAA;AAAA,UACN,SAAS,OAAW,IAAA,IAAA,GAAA,OAAA,GAAA,MAAA;AAAA,UACpB,QAAU,EAAA;AAAA;AACZ,OACD,CAAC,CAAA;AACF,MAAA;AAAA;AAEF,IAAI,IAAA,GAAA,CAAI,gBAAgB,mBAAqB,EAAA;AAC3C,MAAW,UAAA,CAAA,QAAA,CAAS,cAAc,QAAS,CAAA;AAAA,QACzC,IAAM,EAAA,2BAAA;AAAA,QACN,MAAQ,EAAA;AAAA,UACN,SAAS,OAAW,IAAA,IAAA,GAAA,OAAA,GAAA,MAAA;AAAA,UACpB,QAAU,EAAA;AAAA;AACZ,OACD,CAAC,CAAA;AACF,MAAA;AAAA;AAEF,IAAI,IAAA,GAAA,CAAI,gBAAgB,eAAiB,EAAA;AACvC,MAAW,UAAA,CAAA,QAAA,CAAS,cAAc,QAAS,CAAA;AAAA,QACzC,IAAM,EAAA,wBAAA;AAAA,QACN,MAAQ,EAAA;AAAA,UACN,SAAS,OAAW,IAAA,IAAA,GAAA,OAAA,GAAA,MAAA;AAAA,UACpB,QAAU,EAAA;AAAA;AACZ,OACD,CAAC,CAAA;AACF,MAAA;AAAA;AAEF,IAAI,IAAA,GAAA,CAAI,gBAAgB,cAAgB,EAAA;AACtC,MAAW,UAAA,CAAA,QAAA,CAAS,cAAc,QAAS,CAAA;AAAA,QACzC,IAAM,EAAA,uBAAA;AAAA,QACN,MAAQ,EAAA;AAAA,UACN,SAAS,OAAW,IAAA,IAAA,GAAA,OAAA,GAAA,MAAA;AAAA,UACpB,QAAU,EAAA;AAAA;AACZ,OACD,CAAC,CAAA;AACF,MAAA;AAAA;AAEF,IAAI,IAAA,GAAA,CAAI,gBAAgB,cAAgB,EAAA;AACtC,MAAW,UAAA,CAAA,QAAA,CAAS,cAAc,QAAS,CAAA;AAAA,QACzC,IAAM,EAAA,uBAAA;AAAA,QACN,MAAQ,EAAA;AAAA,UACN,SAAS,OAAW,IAAA,IAAA,GAAA,OAAA,GAAA,MAAA;AAAA,UACpB,QAAU,EAAA;AAAA;AACZ,OACD,CAAC,CAAA;AACF,MAAA;AAAA;AAEF,IAAI,IAAA,GAAA,CAAI,gBAAgB,uBAAyB,EAAA;AAC/C,MAAW,UAAA,CAAA,QAAA,CAAS,cAAc,QAAS,CAAA;AAAA,QACzC,IAAM,EAAA,+BAAA;AAAA,QACN,MAAQ,EAAA;AAAA,UACN,SAAS,OAAW,IAAA,IAAA,GAAA,OAAA,GAAA,MAAA;AAAA,UACpB,QAAU,EAAA;AAAA;AACZ,OACD,CAAC,CAAA;AACF,MAAA;AAAA;AAEF,IAAI,IAAA,GAAA,CAAI,gBAAgB,eAAiB,EAAA;AACvC,MAAW,UAAA,CAAA,QAAA,CAAS,cAAc,QAAS,CAAA;AAAA,QACzC,IAAM,EAAA,wBAAA;AAAA,QACN,MAAQ,EAAA;AAAA,UACN,SAAS,OAAW,IAAA,IAAA,GAAA,OAAA,GAAA,MAAA;AAAA,UACpB,QAAU,EAAA;AAAA;AACZ,OACD,CAAC,CAAA;AACF,MAAA;AAAA;AAEF,IAAI,IAAA,GAAA,CAAI,gBAAgB,gBAAkB,EAAA;AACxC,MAAW,UAAA,CAAA,QAAA,CAAS,cAAc,QAAS,CAAA;AAAA,QACzC,IAAM,EAAA,yBAAA;AAAA,QACN,MAAQ,EAAA;AAAA,UACN,SAAS,OAAW,IAAA,IAAA,GAAA,OAAA,GAAA,MAAA;AAAA,UACpB,QAAU,EAAA;AAAA;AACZ,OACD,CAAC,CAAA;AACF,MAAA;AAAA;AAEF,IAAI,IAAA,GAAA,CAAI,gBAAgB,iBAAmB,EAAA;AACzC,MAAW,UAAA,CAAA,QAAA,CAAS,cAAc,QAAS,CAAA;AAAA,QACzC,IAAM,EAAA,0BAAA;AAAA,QACN,MAAQ,EAAA;AAAA,UACN,SAAS,OAAW,IAAA,IAAA,GAAA,OAAA,GAAA,MAAA;AAAA,UACpB,QAAU,EAAA;AAAA;AACZ,OACD,CAAC,CAAA;AACF,MAAA;AAAA;AAEF,IAAI,IAAA,GAAA,CAAI,gBAAgB,mBAAqB,EAAA;AAC3C,MAAW,UAAA,CAAA,QAAA,CAAS,cAAc,QAAS,CAAA;AAAA,QACzC,IAAM,EAAA,4BAAA;AAAA,QACN,MAAQ,EAAA;AAAA,UACN,SAAS,OAAW,IAAA,IAAA,GAAA,OAAA,GAAA,MAAA;AAAA,UACpB,QAAU,EAAA;AAAA;AACZ,OACD,CAAC,CAAA;AACF,MAAA;AAAA;AAEF,IAAI,IAAA,GAAA,CAAI,gBAAgB,eAAiB,EAAA;AACvC,MAAW,UAAA,CAAA,QAAA,CAAS,cAAc,QAAS,CAAA;AAAA,QACzC,IAAM,EAAA,wBAAA;AAAA,QACN,MAAQ,EAAA;AAAA,UACN,SAAS,OAAW,IAAA,IAAA,GAAA,OAAA,GAAA,MAAA;AAAA,UACpB,QAAU,EAAA;AAAA;AACZ,OACD,CAAC,CAAA;AACF,MAAA;AAAA;AAEF,IAAI,IAAA,GAAA,CAAI,gBAAgB,YAAc,EAAA;AACpC,MAAM,MAAA,UAAA,GAAa,iBAAkB,CAAA,GAAA,EAAK,MAAM,CAAA;AAChD,MAAW,UAAA,CAAA,QAAA,CAAS,cAAc,QAAS,CAAA;AAAA,QACzC,IAAM,EAAA,sBAAA;AAAA,QACN,MAAA,EAAQ,UAAa,GAAA,aAAA,CAAA,cAAA,CAAA,EAAA,EAChB,MADgB,CAAA,EAAA;AAAA,UAEnB,GAAK,EAAA;AAAA,SACH,CAAA,GAAA;AAAA,OACL,CAAC,CAAA;AACF,MAAA;AAAA;AAEF,IAAA,KAAK,aAAc,CAAA;AAAA,MACjB,EAAI,EAAA,SAAA;AAAA,MACJ,KAAA,EAAO,kBAAkB,SAAS,CAAA;AAAA,MAClC,QAAU,EAAA,KAAA;AAAA,MACV,UAAY,EAAA,IAAA;AAAA,MACZ,UAAY,EAAA,KAAA;AAAA,MACZ,QAAU,EAAA,KAAA;AAAA,MACV,KAAO,EAAA,IAAA;AAAA,MACP,YAAc,EAAA,IAAA;AAAA,MACd;AAAA,KACD,CAAE,CAAA,KAAA,CAAM,CAAO,GAAA,KAAA;AACd,MAAQ,OAAA,CAAA,KAAA,CAAM,uCAAuC,GAAG,CAAA;AAAA,KACzD,CAAA;AACD,IAAW,UAAA,CAAA,QAAA,CAAS,cAAc,QAAS,CAAA;AAAA,MACzC,IAAM,EAAA,gBAAA;AAAA,MACN,MAAA,EAAQ,iCACH,MADG,CAAA,EAAA;AAAA,QAEN,cAAc,GAAI,CAAA,MAAA;AAAA,QAClB,WAAa,EAAA;AAAA,OACf;AAAA,KACD,CAAC,CAAA;AAAA,GACD,EAAA,CAAC,aAAe,EAAA,UAAA,EAAY,OAAO,CAAC,CAAA;AACvC,EAAA,MAAM,aAAa,GAAQ,KAAA,WAAA,IAAe,CAAC,KAAA,CAAM,MAAS,GAAA;AAAA,IACxD,IAAM,EAAA,eAAA;AAAA,IACN,KAAO,EAAA,kBAAA;AAAA,IACP,IAAM,EAAA;AAAA,GACJ,GAAA;AAAA,IACF,IAAM,EAAA,SAAA;AAAA,IACN,KAAO,EAAA,2BAAA;AAAA,IACP,IAAA,EAAM,GAAQ,KAAA,WAAA,GAAc,kCAAqC,GAAA;AAAA,GACnE;AACA,EAAA,uBAAQ,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,IAAM,EAAA;AAAA,IAChC,eAAiB,EAAA;AAAA,GAClB,CACS,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,IAAK,EAAA,EAAA,KAAA,EAAO,CAAC,MAAA,CAAO,OAAS,EAAA;AAAA,MACpC,eAAiB,EAAA,SAAA;AAAA,MACjB;AAAA,KACD,CAAA,EAAG,iBAAkB,EAAA,SAAA,EACR,QAAC,EAAA,CAAA;AAAA,MACX,GAAK,EAAA,KAAA;AAAA,MACL,KAAO,EAAA;AAAA,KACN,EAAA;AAAA,MACD,GAAK,EAAA,WAAA;AAAA,MACL,KAAO,EAAA;AAAA,KACR,CAAY,CAAA,GAAA,CAAI,CAAC;AAAA,MAChB,GAAA;AAAA,MACA;AAAA,KACI,KAAA;AACJ,MAAA,MAAM,WAAW,GAAQ,KAAA,GAAA;AACzB,MAAO,uBAAA,GAAA,CAAC,aAAoB,OAAS,EAAA,MAAM,OAAO,GAAG,CAAA,EAAG,iBAAkB,EAAA,KAAA,EAAM,kBAAoB,EAAA;AAAA,QAClG;AAAA,OACF,EAAG,OAAO,CAAC,MAAA,CAAO,aAAa,QAAY,IAAA,CAAC,OAAO,iBAAmB,EAAA;AAAA,QACpE,eAAiB,EAAA;AAAA,OAClB,CAAC,CACkB,EAAA,QAAA,kBAAA,GAAA,CAAC,QAAK,KAAO,EAAA,CAAC,OAAO,YAAc,EAAA;AAAA,QACnD,KAAA,EAAO,WAAW,UAAa,GAAA;AAAA,SAC9B,QAAY,IAAA,MAAA,CAAO,kBAAkB,CACjB,EAAA,QAAA,EAAA,KAAA,EACL,KATG,GAUP,CAAA;AAAA,KACjB,CACK,EAAA,CAAA;AAAA,oBACC,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,UAAY,EAAA;AAAA,MACvC,eAAiB,EAAA,OAAA;AAAA,MACjB;AAAA,KACD,CACW,EAAA,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,0BAAuB,IAAK,EAAA,SAAA,EAAU,IAAM,EAAA,EAAA,EAAI,OAAO,KAAO,EAAA,CAAA;AAAA,0BAC9D,SAAU,EAAA,EAAA,KAAA,EAAO,OAAO,YAAc,EAAA,QAAA,EAAU,aAAY,aAAc,EAAA,oBAAA,EAAsB,OAAO,WAAa,EAAA,KAAA,EAAO,gBAAe,MAAO,EAAA,eAAA,EAAgB,iBAAgB,KAAO,EAAA,CAAC,OAAO,WAAa,EAAA;AAAA,QACtN,KAAO,EAAA;AAAA,OACR,CAAG,EAAA;AAAA,KACE,EAAA,CAAA;AAAA,oBACC,GAAA,CAAA,UAAA,EAAA,EAAW,yBAA0B,EAAA,SAAA,EAAU,uBAAuB,MAAO,CAAA,IAAA,EACzE,QAAK,EAAA,IAAA,CAAA,MAAA,KAAW,CAAI,mBAAA,IAAA,CAAC,IAAK,EAAA,EAAA,KAAA,EAAO,OAAO,KACjC,EAAA,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,IAAK,EAAA,EAAA,KAAA,EAAO,CAAC,MAAA,CAAO,SAAW,EAAA;AAAA,QAC9C,eAAiB,EAAA;AAAA,OAClB,CAAA,EACmB,QAAC,kBAAA,GAAA,CAAA,sBAAA,EAAA,EAAuB,IAAM,EAAA,UAAA,CAAW,IAAM,EAAA,IAAA,EAAM,EAAI,EAAA,KAAA,EAAO,YAAa,CAAA,KAAA,CAAM,SAAS,CAChG,EAAA,CAAA;AAAA,sBACC,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,UAAY,EAAA;AAAA,QAC/C,KAAO,EAAA;AAAA,OACR,CAAI,EAAA,QAAA,EAAA,UAAA,CAAW,KAAM,EAAA,CAAA;AAAA,sBACL,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,SAAW,EAAA;AAAA,QAC9C,KAAO,EAAA;AAAA,OACR,CAAI,EAAA,QAAA,EAAA,UAAA,CAAW,IAAK,EAAA;AAAA,KAAA,EACT,oBAAW,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,IAAM,EAAA;AAAA,MACjD,GAAK,EAAA;AAAA,KACN,CACkB,EAAA,QAAA,EAAA,IAAA,CAAK,GAAI,CAAA,CAAA,GAAA,qBAAQ,GAAA,CAAA,OAAA,EAAA,EAAsB,GAAU,EAAA,KAAA,EAAO,SAAW,EAAA,KAAA,EAAO,SAAW,EAAA,QAAA,EAAU,UAAU,GAAI,CAAA,GAAA,CAAI,GAAG,CAAA,EAAG,MAAQ,EAAA,OAAA,EAAS,gBAAkB,EAAA,cAAA,EAAA,EAA5H,GAAI,CAAA,GAAwI,CAAE,CAAA,EACjL,CACR,EAAA;AAAA,GACJ,EAAA,CAAA;AACR;AACA,MAAM,OAAU,GAAAC,cAAA,CAAM,IAAK,CAAA,SAASC,QAAQ,CAAA;AAAA,EAC1C,GAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAOG,EAAA;AACD,EAAM,MAAA,MAAA,GAAS,aAAc,CAAA,GAAA,CAAI,KAAK,CAAA;AACtC,EAAM,MAAA,OAAA,GAAU,OAAQ,CAAA,GAAA,CAAI,GAAG,CAAA;AAE/B,EAAA,MAAM,KAAQ,GAAA,IAAA,CAAK,KAAM,CAAA,KAAA,GAAQ,IAAI,CAAA;AACrC,EAAA,MAAM,IAAO,GAAA,IAAA,CAAK,KAAM,CAAA,KAAA,GAAQ,IAAI,CAAA;AACpC,EAAO,uBAAA,IAAA,CAAC,aAAU,OAAS,EAAA,MAAM,OAAO,GAAG,CAAA,EAAG,mBAAkB,QAAS,EAAA,kBAAA,EAAoB,GAAG,GAAI,CAAA,KAAK,KAAK,GAAI,CAAA,KAAK,IAAI,iBAAkB,EAAA,eAAA,EAAgB,OAAO,CAAC;AAAA,IACnK;AAAA,GACF,KAAM,CAAC,MAAA,CAAO,IAAM,EAAA;AAAA,IAClB,KAAA;AAAA,IACA,iBAAiB,KAAM,CAAA,OAAA;AAAA,IACvB,aAAa,KAAM,CAAA;AAAA,KAClB,OAAW,IAAA;AAAA,IACZ,iBAAiB,KAAM,CAAA,OAAA;AAAA,IACvB,WAAW,CAAC;AAAA,MACV,KAAO,EAAA;AAAA,KACR;AAAA,GACF,CACS,EAAA,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,IAAK,EAAA,EAAA,KAAA,EAAO,CAAC,MAAA,CAAO,IAAM,EAAA;AAAA,MACjC,iBAAiB,MAAO,CAAA;AAAA,KACzB,CACY,EAAA,QAAA,EAAA;AAAA,MAAA,OAAA,mBAAW,GAAA,CAAA,KAAA,EAAA,EAAM,MAAQ,EAAA,OAAA,EAAS,OAAO,UAAW,CAAA,YAAA,EAAc,UAAW,EAAA,OAAA,EAAQ,UAAY,EAAA,GAAA,EAAK,gCAAgC,EAAA,IAAA,EAAC,oBAChI,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,IAAK,EAAA,EAAA,KAAA,EAAO,CAAC,MAAA,CAAO,aAAe,EAAA;AAAA,UAClD,OAAO,KAAQ,GAAA,GAAA;AAAA,UACf,QAAQ,KAAQ,GAAA,GAAA;AAAA,UAChB,YAAc,EAAA;AAAA,SACf,CAAG,EAAA,CAAA;AAAA,wBACa,GAAA,CAAA,sBAAA,EAAA,EAAuB,IAAM,EAAA,GAAA,CAAI,IAAM,EAAA,IAAA,EAAM,IAAM,EAAA,KAAA,EAAO,MAAO,CAAA,IAAA,EAAM,KAAO,EAAA,CAAC,OAAO,QAAU,EAAA;AAAA,UAC/G,KAAA,EAAO,CAAC,IAAO,GAAA,IAAA;AAAA,UACf,MAAA,EAAQ,CAAC,IAAO,GAAA;AAAA,SACjB,CAAG,EAAA,CAAA;AAAA,wBACY,GAAA,CAAC,sBAAuB,EAAA,EAAA,IAAA,EAAM,GAAI,CAAA,IAAA,EAAM,IAAM,EAAA,KAAA,EAAO,KAAM,EAAA,SAAA,EAAU,KAAO,EAAA,MAAA,CAAO,SAAW,EAAA;AAAA,OAClG,EAAA,CAAA;AAAA,sBACJ,GAAA,CAAC,aAAU,OAAS,EAAA,MAAM,iBAAiB,GAAI,CAAA,GAAG,CAAG,EAAA,OAAA,EAAS,CAAG,EAAA,iBAAA,EAAkB,UAAS,kBAAoB,EAAA,QAAA,GAAW,UAAU,GAAI,CAAA,KAAK,oBAAoB,CAAO,IAAA,EAAA,GAAA,CAAI,KAAK,CAAA,aAAA,CAAA,EAAiB,kBAAoB,EAAA;AAAA,QAC/N,QAAU,EAAA;AAAA,OACZ,EAAG,OAAO,CAAC;AAAA,QACT;AAAA,OACF,KAAM,CAAC,MAAO,CAAA,KAAA,EAAO,WAAW,MAAO,CAAA,YAAY,GACrC,QAAC,kBAAA,GAAA,CAAA,sBAAA,EAAA,EAAuB,MAAM,QAAW,GAAA,OAAA,GAAU,iBAAiB,IAAM,EAAA,EAAA,EAAI,OAAO,QAAW,GAAA,SAAA,GAAY,WAAW,CAC3H,EAAA;AAAA,KACJ,EAAA,CAAA;AAAA,oBACC,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,QAChB,EAAA,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,IAAK,EAAA,EAAA,KAAA,EAAO,CAAC,MAAA,CAAO,SAAW,EAAA;AAAA,QACxC,OAAO,KAAM,CAAA;AAAA,OACd,CAAA,EAAG,aAAe,EAAA,CAAA,EACJ,cAAI,KACT,EAAA,CAAA;AAAA,sBACC,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,WAAa,EAAA;AAAA,QAC1C,OAAO,KAAM,CAAA;AAAA,OACd,CAAA,EAAG,aAAe,EAAA,CAAA,EACJ,cAAI,KACT,EAAA;AAAA,KACJ,EAAA;AAAA,GACJ,EAAA,CAAA;AACR,CAAC,CAAA;AACD,MAAM,MAAA,GAAS,WAAW,MAAO,CAAA;AAAA,EAC/B,IAAM,EAAA;AAAA,IACJ,IAAM,EAAA;AAAA,GACR;AAAA,EACA,OAAS,EAAA;AAAA,IACP,aAAe,EAAA,KAAA;AAAA,IACf,SAAW,EAAA,QAAA;AAAA,IACX,SAAW,EAAA,EAAA;AAAA,IACX,OAAS,EAAA,CAAA;AAAA,IACT,YAAA,EAAc,aAAa,MAAO,CAAA,IAAA;AAAA,IAClC,WAAa,EAAA,CAAA;AAAA,IACb,QAAU,EAAA,GAAA;AAAA,IACV,QAAU,EAAA,GAAA;AAAA,IACV,KAAO,EAAA;AAAA,GACT;AAAA,EACA,WAAa,EAAA;AAAA,IACX,IAAM,EAAA,CAAA;AAAA,IACN,SAAW,EAAA,EAAA;AAAA,IACX,UAAY,EAAA,QAAA;AAAA,IACZ,cAAgB,EAAA,QAAA;AAAA,IAChB,YAAA,EAAc,aAAa,MAAO,CAAA;AAAA,GACpC;AAAA,EACA,iBAAA,EAAmB,cACd,CAAA,EAAA,EAAA,YAAA,CAAa,MAAO,CAAA,IAAA,CAAA;AAAA,EAEzB,YAAc,EAAA;AAAA,IACZ,QAAU,EAAA,EAAA;AAAA,IACV,UAAY,EAAA;AAAA,GACd;AAAA,EACA,kBAAoB,EAAA;AAAA,IAClB,UAAY,EAAA;AAAA,GACd;AAAA,EACA,UAAY,EAAA;AAAA,IACV,aAAe,EAAA,KAAA;AAAA,IACf,UAAY,EAAA,QAAA;AAAA,IACZ,GAAK,EAAA,CAAA;AAAA,IACL,gBAAkB,EAAA,KAAA;AAAA,IAClB,SAAW,EAAA,EAAA;AAAA,IACX,YAAc,EAAA,CAAA;AAAA,IACd,WAAa,EAAA,CAAA;AAAA,IACb,YAAA,EAAc,aAAa,MAAO,CAAA,EAAA;AAAA,IAClC,iBAAmB,EAAA,EAAA;AAAA,IACnB,SAAW,EAAA;AAAA,GACb;AAAA,EACA,WAAa,EAAA;AAAA,IACX,IAAM,EAAA,CAAA;AAAA,IACN,QAAU,EAAA,EAAA;AAAA,IACV,eAAiB,EAAA;AAAA,GACnB;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,iBAAmB,EAAA,KAAA;AAAA,IACnB,UAAY,EAAA,EAAA;AAAA,IACZ,aAAe,EAAA;AAAA,GACjB;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,aAAe,EAAA,KAAA;AAAA,IACf,QAAU,EAAA,MAAA;AAAA,IACV,UAAY,EAAA;AAAA,GACd;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,YAAA,EAAc,aAAa,MAAO,CAAA,EAAA;AAAA,IAClC,WAAa,EAAA,CAAA;AAAA,IACb,QAAU,EAAA;AAAA,GACZ;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,WAAa,EAAA,CAAA;AAAA,IACb,UAAY,EAAA,QAAA;AAAA,IACZ,cAAgB,EAAA,QAAA;AAAA,IAChB,QAAU,EAAA;AAAA,GACZ;AAAA,EACA,aAAe,EAAA;AAAA,IACb,QAAU,EAAA,UAAA;AAAA,IACV,GAAK,EAAA,MAAA;AAAA,IACL,IAAM,EAAA,MAAA;AAAA,IACN,eAAiB,EAAA;AAAA,GACnB;AAAA,EACA,QAAU,EAAA;AAAA,IACR,QAAU,EAAA,UAAA;AAAA,IACV,OAAS,EAAA;AAAA,GACX;AAAA,EACA,SAAW,EAAA;AAAA,IACT,eAAiB,EAAA,qBAAA;AAAA,IACjB,gBAAkB,EAAA;AAAA,MAChB,KAAO,EAAA,CAAA;AAAA,MACP,MAAQ,EAAA;AAAA,KACV;AAAA,IACA,gBAAkB,EAAA;AAAA,GACpB;AAAA,EACA,KAAO,EAAA;AAAA,IACL,QAAU,EAAA,UAAA;AAAA,IACV,GAAK,EAAA,CAAA;AAAA,IACL,KAAO,EAAA,CAAA;AAAA,IACP,KAAO,EAAA,EAAA;AAAA,IACP,MAAQ,EAAA,EAAA;AAAA,IACR,YAAc,EAAA,EAAA;AAAA,IACd,UAAY,EAAA,QAAA;AAAA,IACZ,cAAgB,EAAA,QAAA;AAAA,IAChB,eAAiB,EAAA;AAAA,GACnB;AAAA,EACA,YAAc,EAAA;AAAA,IACZ,eAAiB,EAAA;AAAA,GACnB;AAAA,EACA,QAAU,EAAA;AAAA,IACR,iBAAmB,EAAA,EAAA;AAAA,IACnB,UAAY,EAAA,EAAA;AAAA,IACZ,aAAe,EAAA,EAAA;AAAA,IACf,GAAK,EAAA;AAAA,GACP;AAAA,EACA,SAAW,EAAA;AAAA,IACT,QAAU,EAAA,EAAA;AAAA,IACV,UAAY,EAAA,KAAA;AAAA,IACZ,UAAY,EAAA,EAAA;AAAA;AAAA,IAEZ,SAAW,EAAA;AAAA,GACb;AAAA,EACA,WAAa,EAAA;AAAA,IACX,QAAU,EAAA,EAAA;AAAA,IACV,UAAY,EAAA,KAAA;AAAA,IACZ,aAAe,EAAA,GAAA;AAAA,IACf,aAAe,EAAA;AAAA,GACjB;AAAA,EACA,KAAO,EAAA;AAAA,IACL,UAAY,EAAA,QAAA;AAAA,IACZ,UAAY,EAAA,EAAA;AAAA,IACZ,iBAAmB,EAAA,EAAA;AAAA,IACnB,GAAK,EAAA;AAAA,GACP;AAAA,EACA,SAAW,EAAA;AAAA,IACT,KAAO,EAAA,EAAA;AAAA,IACP,MAAQ,EAAA,EAAA;AAAA,IACR,YAAc,EAAA,EAAA;AAAA,IACd,UAAY,EAAA,QAAA;AAAA,IACZ,cAAgB,EAAA,QAAA;AAAA,IAChB,YAAc,EAAA;AAAA,GAChB;AAAA,EACA,UAAY,EAAA;AAAA,IACV,QAAU,EAAA,EAAA;AAAA,IACV,UAAY,EAAA;AAAA,GACd;AAAA,EACA,SAAW,EAAA;AAAA,IACT,QAAU,EAAA,EAAA;AAAA,IACV,SAAW,EAAA,QAAA;AAAA,IACX,UAAY,EAAA;AAAA;AAEhB,CAAC,CAAA"}
@@ -286,6 +286,15 @@ const MOBILE_APP_CATALOG = [
286
286
  // approvals, budgets, recurring payments, accounts.
287
287
  nativeRoute: "expenses-native"
288
288
  },
289
+ {
290
+ key: "dictate-native",
291
+ label: "Dictate",
292
+ icon: "microphone-outline",
293
+ group: "Office",
294
+ prompt: "Turn my dictated visit into a SOAP note.",
295
+ // A clinician speaks a visit note; it comes back as a SOAP note with what to check.
296
+ nativeRoute: "dictate-native"
297
+ },
289
298
  {
290
299
  key: "cards-wallet",
291
300
  label: "Cards & Wallet",
@@ -1 +1 @@
1
- {"version":3,"file":"mobileAppCatalog.js","sources":["../../../src/features/apps/mobileAppCatalog.ts"],"sourcesContent":["import type { ComponentProps } from 'react';\nimport type { MaterialCommunityIcons } from '@expo/vector-icons';\n\ntype IconName = ComponentProps<typeof MaterialCommunityIcons>['name'];\n\nexport type AppGroupId = 'Create' | 'Office' | 'Automate' | 'Sell' | 'Money' | 'Team' | 'More';\n\nexport type MobileAppItem = {\n key: string;\n label: string;\n icon: IconName;\n group: AppGroupId;\n /** Prompt sent as the first chat turn when the app has no native screen. */\n prompt: string;\n /**\n * Which surface host opens this app, if it has one. `webbuilder` is the\n * historical name of the shared WebView surface shell (`screens/WebBuilder`),\n * which is not web-builder-specific: it takes a `url` route param, mints the\n * system token, injects the bridge + cdecli token, stamps `embed=mobile` and\n * owns the timeout/retry UI. Anything with a deployed surface SPA can use it.\n */\n nativeRoute?:\n | 'webbuilder'\n | 'canvas-native'\n | 'characters-native'\n | 'chat-native'\n | 'billing-native'\n | 'shopping-native'\n | 'travel-native'\n | 'job-search-native'\n | 'resume-native'\n | 'inbox-native'\n | 'study-native'\n | 'local-services-native'\n | 'movies-native'\n | 'expenses-native'\n | 'webbuilder-native'\n | 'design-native';\n /**\n * Deployed surface SPA for this app, as the `<slug>-surface` name. Resolved\n * against SURFACE_URL_TEMPLATE so one env var covers every surface and stays\n * per-environment, instead of 20+ near-identical URLs in eas.json.\n *\n * The slug is the SURFACE's name, which is not always the tile key\n * (issue-ticket -> issues, shop -> shopping, notebook -> notebooklm).\n */\n surfaceSlug?: string;\n /**\n * Explicit env override, for the surfaces people actually run locally\n * (design 5174, canvas 5175, webbuilder). Wins over `surfaceSlug`.\n */\n surfaceUrlKey?: 'WEB_BUILDER_URL' | 'CANVAS_SURFACE_URL' | 'DESIGN_SURFACE_URL';\n /**\n * Key of the web tile this native tile replaces in every launcher list.\n * The web entry stays in the catalog (deep links, tests, the WebView\n * lane) but users see one tile per app, the native one, under the\n * shared name. Also the key of a retired tile this one took over from\n * (Posters for Paper 2 Poster). Either way a favorite pinned under the\n * old key carries over to this tile.\n */\n supersedes?: string;\n /**\n * Account chrome, not a product app. Stays in the catalog so drawer /\n * deep-link routing still knows the native host, but never appears as\n * a tile in Apps or the Apps menu.\n */\n hideInLauncher?: boolean;\n};\n\n/**\n * Mobile Apps launcher. Labels, groups, and prompts stay in lockstep with the\n * browser ChatTopBar Apps menu (`packages-modules/account/browser`).\n */\nexport const MOBILE_APP_CATALOG: readonly MobileAppItem[] = [\n {\n key: 'design',\n label: 'Design',\n icon: 'palette-outline',\n group: 'Create',\n prompt: 'Design a 10-slide pitch deck for a coffee subscription startup',\n nativeRoute: 'webbuilder',\n surfaceUrlKey: 'DESIGN_SURFACE_URL',\n surfaceSlug: 'design',\n },\n {\n key: 'design-native',\n label: 'Design',\n supersedes: 'design',\n icon: 'palette-outline',\n group: 'Create',\n prompt: 'Design a 10-slide pitch deck for a coffee subscription startup',\n // The native design studio (features/design): templates, saved designs and the\n // editor, drawn natively over the same designs as the web Design Studio. No WebView.\n nativeRoute: 'design-native',\n },\n {\n key: 'canvas',\n label: 'Canvas',\n icon: 'view-grid-outline',\n group: 'Create',\n prompt: 'Open a canvas and help me lay out the assets for this project.',\n nativeRoute: 'webbuilder',\n surfaceUrlKey: 'CANVAS_SURFACE_URL',\n surfaceSlug: 'canvas',\n },\n {\n key: 'canvas-native',\n label: 'Canvas',\n supersedes: 'canvas',\n icon: 'vector-square',\n group: 'Create',\n prompt: 'Open a canvas and help me lay out the assets for this project.',\n // Renders through Module Federation: the viewer downloads from the\n // canvas-surface origin on open. First native surface; the classic\n // Canvas tile keeps the full web editor in the WebView host.\n nativeRoute: 'canvas-native',\n },\n {\n key: 'webbuilder',\n label: 'Web Builder',\n icon: 'application-outline',\n group: 'Create',\n prompt: 'Build a landing page for my bakery with a menu and a contact form',\n nativeRoute: 'webbuilder',\n surfaceUrlKey: 'WEB_BUILDER_URL',\n surfaceSlug: 'webbuilder',\n },\n {\n key: 'webbuilder-native',\n label: 'Web Builder',\n supersedes: 'webbuilder',\n icon: 'application-outline',\n group: 'Create',\n prompt: 'Build a landing page for my bakery with a menu and a contact form',\n // Native web builder over the same projects as the web surface: your sites,\n // build and edit with the agent, live preview, versions, publish.\n nativeRoute: 'webbuilder-native',\n },\n {\n key: 'codezen',\n label: 'Codezen',\n icon: 'code-braces',\n group: 'Create',\n prompt: 'Clone my repository and fix the failing test',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'codezen',\n },\n {\n key: 'character',\n label: 'Characters',\n icon: 'drama-masks',\n group: 'Create',\n prompt: 'Create a stoic philosophy mentor character I can chat with',\n // Native federated experience (gallery -> detail -> chat); the web\n // surface remains reachable through the surface lane if ever needed.\n nativeRoute: 'characters-native',\n surfaceSlug: 'character',\n },\n {\n key: 'characters-native',\n label: 'Characters',\n supersedes: 'character',\n icon: 'account-star',\n group: 'Create',\n prompt: 'Show me characters I can chat with.',\n nativeRoute: 'characters-native',\n surfaceSlug: 'character',\n },\n // Word, Excel, PowerPoint and PDF files, pictures, interface designs and research posters,\n // each in its own browser editor (yantra-office).\n {\n key: 'word',\n label: 'Documents',\n icon: 'file-document-outline',\n group: 'Office',\n prompt: 'Write a one-page project proposal as a Word document',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'word',\n },\n {\n key: 'excel',\n label: 'Spreadsheets',\n icon: 'file-table-outline',\n group: 'Office',\n prompt: 'Make a monthly budget spreadsheet with totals and a chart',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'excel',\n },\n {\n key: 'presentation',\n label: 'Presentations',\n icon: 'presentation',\n group: 'Office',\n prompt: 'Turn my notes into a six-slide project update deck',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'presentation',\n },\n {\n key: 'pdf',\n label: 'PDFs',\n icon: 'file-pdf-box',\n group: 'Office',\n prompt: 'Make a one-page PDF checklist for moving house',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'pdf',\n },\n {\n key: 'photo',\n label: 'Photos',\n icon: 'image-edit-outline',\n group: 'Office',\n prompt: 'Make an Instagram post from a template with our spring sale headline',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'photo',\n },\n {\n key: 'figdesign',\n label: 'FigDesign',\n // The pen tool, not Design's palette or Canvas's vector-square: Design is AI web-design\n // boards and Canvas is media, this is the interface design editor.\n icon: 'fountain-pen-tip',\n group: 'Office',\n prompt: 'Start a mobile app design for my bakery in our brand green, with Light and Dark modes',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'figdesign',\n },\n {\n key: 'poster',\n label: 'Posters',\n // A printed sheet with a headline over its text, as on the web launcher, not\n // Presentations' easel: a poster is one big page, not a deck.\n icon: 'post-outline',\n group: 'Office',\n prompt: 'Turn this research paper into a 48 x 36 inch conference poster I can edit and print.',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'poster',\n // Posters replaced Paper 2 Poster: a tile pinned under the old key stays pinned.\n supersedes: 'paper2poster',\n },\n {\n key: 'chat-native',\n label: 'Chats',\n icon: 'message-text-outline',\n group: 'Team',\n prompt: 'Show me my conversations.',\n // Person-to-person messaging, federated like canvas: the whole UI\n // downloads from the chat-native surface on open. Not the AI chat -\n // that is the Home tab.\n nativeRoute: 'chat-native',\n },\n {\n key: 'workflow',\n label: 'Workflow',\n icon: 'sitemap',\n group: 'Automate',\n prompt: 'Build a workflow that runs every morning and sends me a summary of what changed.',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'workflow',\n },\n {\n key: 'computer',\n label: 'Computer',\n icon: 'monitor',\n group: 'Automate',\n prompt: 'Open a browser and compare the top 5 CRM tools with screenshots',\n },\n {\n key: 'crm',\n label: 'CRM',\n icon: 'account-group-outline',\n group: 'Sell',\n prompt: 'Look at my pipeline and tell me which deals are going cold and what I should send them.',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'crm',\n },\n {\n key: 'salesiq',\n label: 'SalesIQ',\n icon: 'radar',\n group: 'Sell',\n prompt: 'Show me who is on my website right now',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'salesiq',\n },\n {\n key: 'inbox',\n label: 'Inbox',\n icon: 'inbox-outline',\n group: 'Sell',\n prompt: 'Go through my inbox, tell me what actually needs a reply, and draft those replies.',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'inbox',\n },\n {\n key: 'inbox-native',\n label: 'Inbox',\n supersedes: 'inbox',\n icon: 'inbox-outline',\n group: 'Sell',\n prompt: 'Go through my inbox, tell me what actually needs a reply, and draft those replies.',\n // Native mail client over the same yantra-mailer store as the web Inbox.\n nativeRoute: 'inbox-native',\n },\n {\n key: 'mailcampaign',\n label: 'Mail Campaigns',\n icon: 'bullhorn-outline',\n group: 'Sell',\n prompt: 'Draft an email campaign announcing what we shipped this month.',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'mailcampaign',\n },\n {\n key: 'smscampaign',\n label: 'SMS Campaigns',\n icon: 'message-text-outline',\n group: 'Sell',\n prompt: \"Text my customers a short reminder about this week's offer.\",\n nativeRoute: 'webbuilder',\n surfaceSlug: 'smscampaign',\n },\n {\n key: 'social-post',\n label: 'Social Posts',\n icon: 'send-outline',\n group: 'Sell',\n prompt: 'Draft a launch post for X and LinkedIn and schedule it for Tuesday morning.',\n nativeRoute: 'webbuilder',\n // The deployed surface is `posts-surface`, not `social-post-surface`.\n surfaceSlug: 'posts',\n },\n {\n key: 'invoices',\n label: 'Invoices',\n icon: 'cash-check',\n group: 'Money',\n prompt: 'Show me which invoices are still unpaid.',\n // The served Invoices surface (yantra-surface packages/invoices) in the shared WebView.\n nativeRoute: 'webbuilder',\n surfaceSlug: 'invoices',\n },\n {\n key: 'expenses',\n label: 'Expenses',\n icon: 'receipt',\n group: 'Money',\n prompt: 'Summarise my spend this month and flag anything unusual.',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'expenses',\n },\n {\n key: 'expenses-native',\n label: 'Expenses',\n supersedes: 'expenses',\n icon: 'receipt',\n group: 'Money',\n prompt: 'Summarise my spend this month and flag anything unusual.',\n // Native expenses over the same expenses subgraph as the web app: scan receipts,\n // approvals, budgets, recurring payments, accounts.\n nativeRoute: 'expenses-native',\n },\n {\n key: 'cards-wallet',\n label: 'Cards & Wallet',\n icon: 'credit-card-outline',\n group: 'Money',\n prompt: 'Issue a $200 virtual card for monthly ad spend',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'cards-wallet',\n },\n {\n key: 'billing',\n label: 'Billing',\n icon: 'currency-usd',\n group: 'Money',\n prompt: 'Create an invoice for a $2,400 consulting project',\n nativeRoute: 'billing-native',\n surfaceSlug: 'billing',\n // Plan / subscription for this account — already in the drawer.\n hideInLauncher: true,\n },\n {\n key: 'kpi-motivation',\n label: 'KPI Motivation',\n icon: 'trophy-outline',\n group: 'Team',\n prompt: 'Set up a weekly sales KPI scoreboard for my team',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'kpi-motivation',\n },\n {\n key: 'issue-ticket',\n label: 'Issue Ticket',\n icon: 'bug-outline',\n group: 'Team',\n prompt: 'Create a bug board and triage my open issues',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'issues',\n },\n {\n key: 'notebook',\n label: 'Study',\n icon: 'school-outline',\n group: 'Team',\n prompt: 'Make a study guide from my lecture notes',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'notebooklm',\n },\n {\n key: 'study-native',\n label: 'Study',\n supersedes: 'notebook',\n icon: 'school-outline',\n group: 'Team',\n prompt: 'Make a study guide from my lecture notes',\n // Native study notebooks over the same yantra-notebook store as the web Study.\n nativeRoute: 'study-native',\n },\n {\n key: 'resume',\n label: 'Resume',\n icon: 'file-account-outline',\n group: 'Team',\n prompt: 'Draft a resume for a senior product designer with 8 years of experience',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'resume',\n },\n {\n key: 'resume-native',\n label: 'Resume',\n supersedes: 'resume',\n icon: 'file-account-outline',\n group: 'Team',\n prompt: 'Draft a resume for a senior product designer with 8 years of experience',\n nativeRoute: 'resume-native',\n },\n {\n key: 'job-search',\n label: 'Job Search',\n icon: 'briefcase-outline',\n group: 'Team',\n prompt: 'Find remote senior backend engineer roles and tailor my resume for one',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'job-search',\n },\n {\n key: 'job-search-native',\n label: 'Job Search',\n supersedes: 'job-search',\n icon: 'briefcase-search-outline',\n group: 'Team',\n prompt: 'Find remote senior backend engineer roles and tailor my resume for one',\n nativeRoute: 'job-search-native',\n },\n {\n key: 'shop',\n label: 'Shop',\n icon: 'cart-outline',\n group: 'More',\n prompt: 'Compare the best options for what I need and show me the tradeoffs.',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'shopping',\n },\n {\n key: 'shopping-native',\n label: 'Shop',\n supersedes: 'shop',\n icon: 'storefront-outline',\n group: 'More',\n prompt: 'Compare the best options for what I need and show me the tradeoffs.',\n // Federated storefront: search + cart download from shopping_native/Shop.\n // The classic Shop tile keeps the web surface in the WebView host.\n nativeRoute: 'shopping-native',\n },\n {\n key: 'travel-native',\n label: 'Travel',\n supersedes: 'travel',\n icon: 'airplane-takeoff',\n group: 'More',\n prompt: 'Plan a 4-day trip for me: flights, somewhere to stay, and what to do each day.',\n nativeRoute: 'travel-native',\n },\n {\n key: 'travel',\n label: 'Travel',\n icon: 'airplane',\n group: 'More',\n prompt: 'Plan a 4-day trip for me: flights, somewhere to stay, and what to do each day.',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'travel',\n },\n {\n key: 'social-events',\n label: 'yantra.live',\n icon: 'ticket-outline',\n group: 'More',\n prompt: 'What concerts are happening nearby this weekend?',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'social-events',\n },\n {\n key: 'movies',\n label: 'Movies',\n icon: 'popcorn',\n group: 'More',\n prompt: 'What movies are playing near me tonight?',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'movies',\n },\n {\n key: 'movies-native',\n label: 'Movies',\n supersedes: 'movies',\n icon: 'popcorn',\n group: 'More',\n prompt: 'What movies are playing near me tonight?',\n // Native cinema app over the yantra-movies connector: discover, trailers, showtimes, watchlist.\n nativeRoute: 'movies-native',\n },\n {\n key: 'local-services',\n label: 'Local Services',\n icon: 'wrench',\n group: 'More',\n prompt: 'Find an electrician near me',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'local-services',\n },\n {\n key: 'local-services-native',\n label: 'Local Services',\n supersedes: 'local-services',\n icon: 'wrench',\n group: 'More',\n prompt: 'Find an electrician near me',\n // Native search, details and saved pros over the same yantra-local-services\n // connector as the web Local Services surface.\n nativeRoute: 'local-services-native',\n },\n {\n key: 'fitness',\n label: 'Fitness',\n icon: 'dumbbell',\n group: 'More',\n prompt: 'Build me a workout plan for this week',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'fitness',\n },\n];\n\nexport const APP_GROUP_ORDER: readonly AppGroupId[] = ['Create', 'Office', 'Automate', 'Sell', 'Money', 'Team', 'More'];\n\nexport type AppsTab = 'all' | 'favorites';\n\n/**\n * Poster colors per group - the tile artwork. Deliberately the same in light\n * and dark themes: artwork is content, the card chrome is what adapts.\n */\nexport const APP_GROUP_ART: Record<AppGroupId, { base: string; glow: string }> = {\n Create: { base: '#4f46e5', glow: '#c4b5fd' },\n Office: { base: '#334155', glow: '#cbd5e1' },\n Automate: { base: '#0f766e', glow: '#99f6e4' },\n Sell: { base: '#c2410c', glow: '#fed7aa' },\n Money: { base: '#15803d', glow: '#bbf7d0' },\n Team: { base: '#0369a1', glow: '#bae6fd' },\n More: { base: '#be185d', glow: '#fbcfe8' },\n};\n\nexport function matchesAppQuery(label: string, query: string): boolean {\n const q = query.toLowerCase().replace(/[^a-z0-9]/g, '');\n if (!q) return true;\n return label\n .toLowerCase()\n .replace(/[^a-z0-9]/g, '')\n .includes(q);\n}\n\n/**\n * Favorites keyed by a web tile that a native tile now replaces, carried over to\n * the native tile, so pinning \"Inbox\" before it went native still pins it after.\n */\nexport function carryOverSupersededFavorites(\n favorites: ReadonlySet<string>,\n items: readonly MobileAppItem[] = MOBILE_APP_CATALOG,\n): Set<string> {\n const replacement = new Map<string, string>();\n for (const item of items) if (item.supersedes) replacement.set(item.supersedes, item.key);\n const out = new Set<string>();\n for (const key of favorites) out.add(replacement.get(key) ?? key);\n return out;\n}\n\n/** One tile per app: a web tile disappears when its native replacement is in the list. */\nexport function visibleMobileApps(items: readonly MobileAppItem[]): MobileAppItem[] {\n const replaced = new Set(items.map((item) => item.supersedes).filter(Boolean));\n return items.filter((item) => !item.hideInLauncher && !replaced.has(item.key));\n}\n\nexport function groupMobileApps(items: readonly MobileAppItem[], query: string) {\n const hits = visibleMobileApps(items).filter((item) => matchesAppQuery(item.label, query));\n return APP_GROUP_ORDER.map((label) => ({\n label,\n items: hits.filter((item) => item.group === label),\n })).filter((group) => group.items.length > 0);\n}\n\n/**\n * One flat grid (Manus/game-launcher style) instead of grouped sections: rows\n * stay dense and the group reads from each card's caption. Catalog order is\n * kept inside a group; groups follow APP_GROUP_ORDER.\n */\nexport function filterMobileApps(\n items: readonly MobileAppItem[],\n query: string,\n tab: AppsTab,\n favorites: ReadonlySet<string>,\n): MobileAppItem[] {\n const rank = new Map(APP_GROUP_ORDER.map((group, index) => [group, index]));\n return visibleMobileApps(items)\n .filter((item) => matchesAppQuery(item.label, query))\n .filter((item) => tab !== 'favorites' || favorites.has(item.key))\n .sort((a, b) => (rank.get(a.group) ?? APP_GROUP_ORDER.length) - (rank.get(b.group) ?? APP_GROUP_ORDER.length));\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mobileAppCatalog.js","sources":["../../../src/features/apps/mobileAppCatalog.ts"],"sourcesContent":["import type { ComponentProps } from 'react';\nimport type { MaterialCommunityIcons } from '@expo/vector-icons';\n\ntype IconName = ComponentProps<typeof MaterialCommunityIcons>['name'];\n\nexport type AppGroupId = 'Create' | 'Office' | 'Automate' | 'Sell' | 'Money' | 'Team' | 'More';\n\nexport type MobileAppItem = {\n key: string;\n label: string;\n icon: IconName;\n group: AppGroupId;\n /** Prompt sent as the first chat turn when the app has no native screen. */\n prompt: string;\n /**\n * Which surface host opens this app, if it has one. `webbuilder` is the\n * historical name of the shared WebView surface shell (`screens/WebBuilder`),\n * which is not web-builder-specific: it takes a `url` route param, mints the\n * system token, injects the bridge + cdecli token, stamps `embed=mobile` and\n * owns the timeout/retry UI. Anything with a deployed surface SPA can use it.\n */\n nativeRoute?:\n | 'webbuilder'\n | 'canvas-native'\n | 'characters-native'\n | 'chat-native'\n | 'billing-native'\n | 'shopping-native'\n | 'travel-native'\n | 'job-search-native'\n | 'resume-native'\n | 'inbox-native'\n | 'study-native'\n | 'local-services-native'\n | 'movies-native'\n | 'expenses-native'\n | 'dictate-native'\n | 'webbuilder-native'\n | 'design-native';\n /**\n * Deployed surface SPA for this app, as the `<slug>-surface` name. Resolved\n * against SURFACE_URL_TEMPLATE so one env var covers every surface and stays\n * per-environment, instead of 20+ near-identical URLs in eas.json.\n *\n * The slug is the SURFACE's name, which is not always the tile key\n * (issue-ticket -> issues, shop -> shopping, notebook -> notebooklm).\n */\n surfaceSlug?: string;\n /**\n * Explicit env override, for the surfaces people actually run locally\n * (design 5174, canvas 5175, webbuilder). Wins over `surfaceSlug`.\n */\n surfaceUrlKey?: 'WEB_BUILDER_URL' | 'CANVAS_SURFACE_URL' | 'DESIGN_SURFACE_URL';\n /**\n * Key of the web tile this native tile replaces in every launcher list.\n * The web entry stays in the catalog (deep links, tests, the WebView\n * lane) but users see one tile per app, the native one, under the\n * shared name. Also the key of a retired tile this one took over from\n * (Posters for Paper 2 Poster). Either way a favorite pinned under the\n * old key carries over to this tile.\n */\n supersedes?: string;\n /**\n * Account chrome, not a product app. Stays in the catalog so drawer /\n * deep-link routing still knows the native host, but never appears as\n * a tile in Apps or the Apps menu.\n */\n hideInLauncher?: boolean;\n};\n\n/**\n * Mobile Apps launcher. Labels, groups, and prompts stay in lockstep with the\n * browser ChatTopBar Apps menu (`packages-modules/account/browser`).\n */\nexport const MOBILE_APP_CATALOG: readonly MobileAppItem[] = [\n {\n key: 'design',\n label: 'Design',\n icon: 'palette-outline',\n group: 'Create',\n prompt: 'Design a 10-slide pitch deck for a coffee subscription startup',\n nativeRoute: 'webbuilder',\n surfaceUrlKey: 'DESIGN_SURFACE_URL',\n surfaceSlug: 'design',\n },\n {\n key: 'design-native',\n label: 'Design',\n supersedes: 'design',\n icon: 'palette-outline',\n group: 'Create',\n prompt: 'Design a 10-slide pitch deck for a coffee subscription startup',\n // The native design studio (features/design): templates, saved designs and the\n // editor, drawn natively over the same designs as the web Design Studio. No WebView.\n nativeRoute: 'design-native',\n },\n {\n key: 'canvas',\n label: 'Canvas',\n icon: 'view-grid-outline',\n group: 'Create',\n prompt: 'Open a canvas and help me lay out the assets for this project.',\n nativeRoute: 'webbuilder',\n surfaceUrlKey: 'CANVAS_SURFACE_URL',\n surfaceSlug: 'canvas',\n },\n {\n key: 'canvas-native',\n label: 'Canvas',\n supersedes: 'canvas',\n icon: 'vector-square',\n group: 'Create',\n prompt: 'Open a canvas and help me lay out the assets for this project.',\n // Renders through Module Federation: the viewer downloads from the\n // canvas-surface origin on open. First native surface; the classic\n // Canvas tile keeps the full web editor in the WebView host.\n nativeRoute: 'canvas-native',\n },\n {\n key: 'webbuilder',\n label: 'Web Builder',\n icon: 'application-outline',\n group: 'Create',\n prompt: 'Build a landing page for my bakery with a menu and a contact form',\n nativeRoute: 'webbuilder',\n surfaceUrlKey: 'WEB_BUILDER_URL',\n surfaceSlug: 'webbuilder',\n },\n {\n key: 'webbuilder-native',\n label: 'Web Builder',\n supersedes: 'webbuilder',\n icon: 'application-outline',\n group: 'Create',\n prompt: 'Build a landing page for my bakery with a menu and a contact form',\n // Native web builder over the same projects as the web surface: your sites,\n // build and edit with the agent, live preview, versions, publish.\n nativeRoute: 'webbuilder-native',\n },\n {\n key: 'codezen',\n label: 'Codezen',\n icon: 'code-braces',\n group: 'Create',\n prompt: 'Clone my repository and fix the failing test',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'codezen',\n },\n {\n key: 'character',\n label: 'Characters',\n icon: 'drama-masks',\n group: 'Create',\n prompt: 'Create a stoic philosophy mentor character I can chat with',\n // Native federated experience (gallery -> detail -> chat); the web\n // surface remains reachable through the surface lane if ever needed.\n nativeRoute: 'characters-native',\n surfaceSlug: 'character',\n },\n {\n key: 'characters-native',\n label: 'Characters',\n supersedes: 'character',\n icon: 'account-star',\n group: 'Create',\n prompt: 'Show me characters I can chat with.',\n nativeRoute: 'characters-native',\n surfaceSlug: 'character',\n },\n // Word, Excel, PowerPoint and PDF files, pictures, interface designs and research posters,\n // each in its own browser editor (yantra-office).\n {\n key: 'word',\n label: 'Documents',\n icon: 'file-document-outline',\n group: 'Office',\n prompt: 'Write a one-page project proposal as a Word document',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'word',\n },\n {\n key: 'excel',\n label: 'Spreadsheets',\n icon: 'file-table-outline',\n group: 'Office',\n prompt: 'Make a monthly budget spreadsheet with totals and a chart',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'excel',\n },\n {\n key: 'presentation',\n label: 'Presentations',\n icon: 'presentation',\n group: 'Office',\n prompt: 'Turn my notes into a six-slide project update deck',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'presentation',\n },\n {\n key: 'pdf',\n label: 'PDFs',\n icon: 'file-pdf-box',\n group: 'Office',\n prompt: 'Make a one-page PDF checklist for moving house',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'pdf',\n },\n {\n key: 'photo',\n label: 'Photos',\n icon: 'image-edit-outline',\n group: 'Office',\n prompt: 'Make an Instagram post from a template with our spring sale headline',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'photo',\n },\n {\n key: 'figdesign',\n label: 'FigDesign',\n // The pen tool, not Design's palette or Canvas's vector-square: Design is AI web-design\n // boards and Canvas is media, this is the interface design editor.\n icon: 'fountain-pen-tip',\n group: 'Office',\n prompt: 'Start a mobile app design for my bakery in our brand green, with Light and Dark modes',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'figdesign',\n },\n {\n key: 'poster',\n label: 'Posters',\n // A printed sheet with a headline over its text, as on the web launcher, not\n // Presentations' easel: a poster is one big page, not a deck.\n icon: 'post-outline',\n group: 'Office',\n prompt: 'Turn this research paper into a 48 x 36 inch conference poster I can edit and print.',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'poster',\n // Posters replaced Paper 2 Poster: a tile pinned under the old key stays pinned.\n supersedes: 'paper2poster',\n },\n {\n key: 'chat-native',\n label: 'Chats',\n icon: 'message-text-outline',\n group: 'Team',\n prompt: 'Show me my conversations.',\n // Person-to-person messaging, federated like canvas: the whole UI\n // downloads from the chat-native surface on open. Not the AI chat -\n // that is the Home tab.\n nativeRoute: 'chat-native',\n },\n {\n key: 'workflow',\n label: 'Workflow',\n icon: 'sitemap',\n group: 'Automate',\n prompt: 'Build a workflow that runs every morning and sends me a summary of what changed.',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'workflow',\n },\n {\n key: 'computer',\n label: 'Computer',\n icon: 'monitor',\n group: 'Automate',\n prompt: 'Open a browser and compare the top 5 CRM tools with screenshots',\n },\n {\n key: 'crm',\n label: 'CRM',\n icon: 'account-group-outline',\n group: 'Sell',\n prompt: 'Look at my pipeline and tell me which deals are going cold and what I should send them.',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'crm',\n },\n {\n key: 'salesiq',\n label: 'SalesIQ',\n icon: 'radar',\n group: 'Sell',\n prompt: 'Show me who is on my website right now',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'salesiq',\n },\n {\n key: 'inbox',\n label: 'Inbox',\n icon: 'inbox-outline',\n group: 'Sell',\n prompt: 'Go through my inbox, tell me what actually needs a reply, and draft those replies.',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'inbox',\n },\n {\n key: 'inbox-native',\n label: 'Inbox',\n supersedes: 'inbox',\n icon: 'inbox-outline',\n group: 'Sell',\n prompt: 'Go through my inbox, tell me what actually needs a reply, and draft those replies.',\n // Native mail client over the same yantra-mailer store as the web Inbox.\n nativeRoute: 'inbox-native',\n },\n {\n key: 'mailcampaign',\n label: 'Mail Campaigns',\n icon: 'bullhorn-outline',\n group: 'Sell',\n prompt: 'Draft an email campaign announcing what we shipped this month.',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'mailcampaign',\n },\n {\n key: 'smscampaign',\n label: 'SMS Campaigns',\n icon: 'message-text-outline',\n group: 'Sell',\n prompt: \"Text my customers a short reminder about this week's offer.\",\n nativeRoute: 'webbuilder',\n surfaceSlug: 'smscampaign',\n },\n {\n key: 'social-post',\n label: 'Social Posts',\n icon: 'send-outline',\n group: 'Sell',\n prompt: 'Draft a launch post for X and LinkedIn and schedule it for Tuesday morning.',\n nativeRoute: 'webbuilder',\n // The deployed surface is `posts-surface`, not `social-post-surface`.\n surfaceSlug: 'posts',\n },\n {\n key: 'invoices',\n label: 'Invoices',\n icon: 'cash-check',\n group: 'Money',\n prompt: 'Show me which invoices are still unpaid.',\n // The served Invoices surface (yantra-surface packages/invoices) in the shared WebView.\n nativeRoute: 'webbuilder',\n surfaceSlug: 'invoices',\n },\n {\n key: 'expenses',\n label: 'Expenses',\n icon: 'receipt',\n group: 'Money',\n prompt: 'Summarise my spend this month and flag anything unusual.',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'expenses',\n },\n {\n key: 'expenses-native',\n label: 'Expenses',\n supersedes: 'expenses',\n icon: 'receipt',\n group: 'Money',\n prompt: 'Summarise my spend this month and flag anything unusual.',\n // Native expenses over the same expenses subgraph as the web app: scan receipts,\n // approvals, budgets, recurring payments, accounts.\n nativeRoute: 'expenses-native',\n },\n {\n key: 'dictate-native',\n label: 'Dictate',\n icon: 'microphone-outline',\n group: 'Office',\n prompt: 'Turn my dictated visit into a SOAP note.',\n // A clinician speaks a visit note; it comes back as a SOAP note with what to check.\n nativeRoute: 'dictate-native',\n },\n {\n key: 'cards-wallet',\n label: 'Cards & Wallet',\n icon: 'credit-card-outline',\n group: 'Money',\n prompt: 'Issue a $200 virtual card for monthly ad spend',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'cards-wallet',\n },\n {\n key: 'billing',\n label: 'Billing',\n icon: 'currency-usd',\n group: 'Money',\n prompt: 'Create an invoice for a $2,400 consulting project',\n nativeRoute: 'billing-native',\n surfaceSlug: 'billing',\n // Plan / subscription for this account — already in the drawer.\n hideInLauncher: true,\n },\n {\n key: 'kpi-motivation',\n label: 'KPI Motivation',\n icon: 'trophy-outline',\n group: 'Team',\n prompt: 'Set up a weekly sales KPI scoreboard for my team',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'kpi-motivation',\n },\n {\n key: 'issue-ticket',\n label: 'Issue Ticket',\n icon: 'bug-outline',\n group: 'Team',\n prompt: 'Create a bug board and triage my open issues',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'issues',\n },\n {\n key: 'notebook',\n label: 'Study',\n icon: 'school-outline',\n group: 'Team',\n prompt: 'Make a study guide from my lecture notes',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'notebooklm',\n },\n {\n key: 'study-native',\n label: 'Study',\n supersedes: 'notebook',\n icon: 'school-outline',\n group: 'Team',\n prompt: 'Make a study guide from my lecture notes',\n // Native study notebooks over the same yantra-notebook store as the web Study.\n nativeRoute: 'study-native',\n },\n {\n key: 'resume',\n label: 'Resume',\n icon: 'file-account-outline',\n group: 'Team',\n prompt: 'Draft a resume for a senior product designer with 8 years of experience',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'resume',\n },\n {\n key: 'resume-native',\n label: 'Resume',\n supersedes: 'resume',\n icon: 'file-account-outline',\n group: 'Team',\n prompt: 'Draft a resume for a senior product designer with 8 years of experience',\n nativeRoute: 'resume-native',\n },\n {\n key: 'job-search',\n label: 'Job Search',\n icon: 'briefcase-outline',\n group: 'Team',\n prompt: 'Find remote senior backend engineer roles and tailor my resume for one',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'job-search',\n },\n {\n key: 'job-search-native',\n label: 'Job Search',\n supersedes: 'job-search',\n icon: 'briefcase-search-outline',\n group: 'Team',\n prompt: 'Find remote senior backend engineer roles and tailor my resume for one',\n nativeRoute: 'job-search-native',\n },\n {\n key: 'shop',\n label: 'Shop',\n icon: 'cart-outline',\n group: 'More',\n prompt: 'Compare the best options for what I need and show me the tradeoffs.',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'shopping',\n },\n {\n key: 'shopping-native',\n label: 'Shop',\n supersedes: 'shop',\n icon: 'storefront-outline',\n group: 'More',\n prompt: 'Compare the best options for what I need and show me the tradeoffs.',\n // Federated storefront: search + cart download from shopping_native/Shop.\n // The classic Shop tile keeps the web surface in the WebView host.\n nativeRoute: 'shopping-native',\n },\n {\n key: 'travel-native',\n label: 'Travel',\n supersedes: 'travel',\n icon: 'airplane-takeoff',\n group: 'More',\n prompt: 'Plan a 4-day trip for me: flights, somewhere to stay, and what to do each day.',\n nativeRoute: 'travel-native',\n },\n {\n key: 'travel',\n label: 'Travel',\n icon: 'airplane',\n group: 'More',\n prompt: 'Plan a 4-day trip for me: flights, somewhere to stay, and what to do each day.',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'travel',\n },\n {\n key: 'social-events',\n label: 'yantra.live',\n icon: 'ticket-outline',\n group: 'More',\n prompt: 'What concerts are happening nearby this weekend?',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'social-events',\n },\n {\n key: 'movies',\n label: 'Movies',\n icon: 'popcorn',\n group: 'More',\n prompt: 'What movies are playing near me tonight?',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'movies',\n },\n {\n key: 'movies-native',\n label: 'Movies',\n supersedes: 'movies',\n icon: 'popcorn',\n group: 'More',\n prompt: 'What movies are playing near me tonight?',\n // Native cinema app over the yantra-movies connector: discover, trailers, showtimes, watchlist.\n nativeRoute: 'movies-native',\n },\n {\n key: 'local-services',\n label: 'Local Services',\n icon: 'wrench',\n group: 'More',\n prompt: 'Find an electrician near me',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'local-services',\n },\n {\n key: 'local-services-native',\n label: 'Local Services',\n supersedes: 'local-services',\n icon: 'wrench',\n group: 'More',\n prompt: 'Find an electrician near me',\n // Native search, details and saved pros over the same yantra-local-services\n // connector as the web Local Services surface.\n nativeRoute: 'local-services-native',\n },\n {\n key: 'fitness',\n label: 'Fitness',\n icon: 'dumbbell',\n group: 'More',\n prompt: 'Build me a workout plan for this week',\n nativeRoute: 'webbuilder',\n surfaceSlug: 'fitness',\n },\n];\n\nexport const APP_GROUP_ORDER: readonly AppGroupId[] = ['Create', 'Office', 'Automate', 'Sell', 'Money', 'Team', 'More'];\n\nexport type AppsTab = 'all' | 'favorites';\n\n/**\n * Poster colors per group - the tile artwork. Deliberately the same in light\n * and dark themes: artwork is content, the card chrome is what adapts.\n */\nexport const APP_GROUP_ART: Record<AppGroupId, { base: string; glow: string }> = {\n Create: { base: '#4f46e5', glow: '#c4b5fd' },\n Office: { base: '#334155', glow: '#cbd5e1' },\n Automate: { base: '#0f766e', glow: '#99f6e4' },\n Sell: { base: '#c2410c', glow: '#fed7aa' },\n Money: { base: '#15803d', glow: '#bbf7d0' },\n Team: { base: '#0369a1', glow: '#bae6fd' },\n More: { base: '#be185d', glow: '#fbcfe8' },\n};\n\nexport function matchesAppQuery(label: string, query: string): boolean {\n const q = query.toLowerCase().replace(/[^a-z0-9]/g, '');\n if (!q) return true;\n return label\n .toLowerCase()\n .replace(/[^a-z0-9]/g, '')\n .includes(q);\n}\n\n/**\n * Favorites keyed by a web tile that a native tile now replaces, carried over to\n * the native tile, so pinning \"Inbox\" before it went native still pins it after.\n */\nexport function carryOverSupersededFavorites(\n favorites: ReadonlySet<string>,\n items: readonly MobileAppItem[] = MOBILE_APP_CATALOG,\n): Set<string> {\n const replacement = new Map<string, string>();\n for (const item of items) if (item.supersedes) replacement.set(item.supersedes, item.key);\n const out = new Set<string>();\n for (const key of favorites) out.add(replacement.get(key) ?? key);\n return out;\n}\n\n/** One tile per app: a web tile disappears when its native replacement is in the list. */\nexport function visibleMobileApps(items: readonly MobileAppItem[]): MobileAppItem[] {\n const replaced = new Set(items.map((item) => item.supersedes).filter(Boolean));\n return items.filter((item) => !item.hideInLauncher && !replaced.has(item.key));\n}\n\nexport function groupMobileApps(items: readonly MobileAppItem[], query: string) {\n const hits = visibleMobileApps(items).filter((item) => matchesAppQuery(item.label, query));\n return APP_GROUP_ORDER.map((label) => ({\n label,\n items: hits.filter((item) => item.group === label),\n })).filter((group) => group.items.length > 0);\n}\n\n/**\n * One flat grid (Manus/game-launcher style) instead of grouped sections: rows\n * stay dense and the group reads from each card's caption. Catalog order is\n * kept inside a group; groups follow APP_GROUP_ORDER.\n */\nexport function filterMobileApps(\n items: readonly MobileAppItem[],\n query: string,\n tab: AppsTab,\n favorites: ReadonlySet<string>,\n): MobileAppItem[] {\n const rank = new Map(APP_GROUP_ORDER.map((group, index) => [group, index]));\n return visibleMobileApps(items)\n .filter((item) => matchesAppQuery(item.label, query))\n .filter((item) => tab !== 'favorites' || favorites.has(item.key))\n .sort((a, b) => (rank.get(a.group) ?? APP_GROUP_ORDER.length) - (rank.get(b.group) ?? APP_GROUP_ORDER.length));\n}\n"],"names":[],"mappings":"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"}
@@ -13,6 +13,7 @@ import {MOBILE_APP_CATALOG}from'./mobileAppCatalog.js';const NATIVE_ROUTE_SCREEN
13
13
  "local-services-native": "MainStack.LocalServicesNative",
14
14
  "movies-native": "MainStack.MoviesNative",
15
15
  "expenses-native": "MainStack.ExpensesNative",
16
+ "dictate-native": "MainStack.DictateNative",
16
17
  "webbuilder-native": "MainStack.WebBuilderNative"
17
18
  };
18
19
  function nativeScreenOf(app) {
@@ -1 +1 @@
1
- {"version":3,"file":"nativeSurfaceTwin.js","sources":["../../../src/features/apps/nativeSurfaceTwin.ts"],"sourcesContent":["/**\n * The native screen that stands in for a web surface on the phone.\n *\n * A link the gateway says belongs on a surface (`shopping`, `travel`, ...) used\n * to open that surface's web SPA in the WebView shell. When the app has a\n * native twin in the catalog (a tile that `supersedes` the surface's web tile),\n * the link opens the native screen instead - the same screen the Apps tile\n * opens. Surfaces with no native twin still open in the WebView shell.\n *\n * Pure: no navigation imports, so it runs under jest.\n */\nimport { MOBILE_APP_CATALOG, type MobileAppItem } from './mobileAppCatalog';\n\ntype NativeRoute = NonNullable<MobileAppItem['nativeRoute']>;\n\n/** Native host -> its MainStack screen. `webbuilder` is the WebView shell, so it is not here. */\nexport const NATIVE_ROUTE_SCREENS: Readonly<Partial<Record<NativeRoute, string>>> = {\n 'design-native': 'MainStack.DesignNative',\n 'canvas-native': 'MainStack.CanvasNative',\n 'characters-native': 'MainStack.CharactersNative',\n 'chat-native': 'MainStack.ChatNative',\n 'billing-native': 'MainStack.Billing',\n 'shopping-native': 'MainStack.ShoppingNative',\n 'travel-native': 'MainStack.TravelNative',\n 'job-search-native': 'MainStack.JobSearchNative',\n 'resume-native': 'MainStack.ResumeNative',\n 'inbox-native': 'MainStack.InboxNative',\n 'study-native': 'MainStack.StudyNative',\n 'local-services-native': 'MainStack.LocalServicesNative',\n 'movies-native': 'MainStack.MoviesNative',\n 'expenses-native': 'MainStack.ExpensesNative',\n 'webbuilder-native': 'MainStack.WebBuilderNative',\n};\n\nexport interface NativeSurfaceTwin {\n screen: string;\n title: string;\n}\n\nfunction nativeScreenOf(app: MobileAppItem | undefined): NativeSurfaceTwin | null {\n const screen = app?.nativeRoute ? NATIVE_ROUTE_SCREENS[app.nativeRoute] : undefined;\n return app && screen ? { screen, title: app.label } : null;\n}\n\n/**\n * The native screen for a surface slug (the `<slug>-surface` name, as the\n * gateway's `open.surface` carries it), or null when the surface has none.\n */\nexport function nativeTwinForSurface(\n surface: string | null | undefined,\n catalog: readonly MobileAppItem[] = MOBILE_APP_CATALOG,\n): NativeSurfaceTwin | null {\n const slug = surface\n ?.trim()\n .toLowerCase()\n .replace(/-surface$/, '');\n if (!slug) return null;\n const webTiles = catalog.filter((app) => app.surfaceSlug === slug || app.key === slug);\n for (const web of webTiles) {\n // A tile that is itself native (Billing, Characters), else the native tile replacing it.\n const twin = nativeScreenOf(web) ?? nativeScreenOf(catalog.find((app) => app.supersedes === web.key));\n if (twin) return twin;\n }\n return null;\n}\n"],"names":[],"mappings":"uDAeO,MAAM,oBAAuE,GAAA;AAAA,EAClF,eAAiB,EAAA,wBAAA;AAAA,EACjB,eAAiB,EAAA,wBAAA;AAAA,EACjB,mBAAqB,EAAA,4BAAA;AAAA,EACrB,aAAe,EAAA,sBAAA;AAAA,EACf,gBAAkB,EAAA,mBAAA;AAAA,EAClB,iBAAmB,EAAA,0BAAA;AAAA,EACnB,eAAiB,EAAA,wBAAA;AAAA,EACjB,mBAAqB,EAAA,2BAAA;AAAA,EACrB,eAAiB,EAAA,wBAAA;AAAA,EACjB,cAAgB,EAAA,uBAAA;AAAA,EAChB,cAAgB,EAAA,uBAAA;AAAA,EAChB,uBAAyB,EAAA,+BAAA;AAAA,EACzB,eAAiB,EAAA,wBAAA;AAAA,EACjB,iBAAmB,EAAA,0BAAA;AAAA,EACnB,mBAAqB,EAAA;AACvB;AAKA,SAAS,eAAe,GAA0D,EAAA;AAChF,EAAA,MAAM,UAAS,GAAK,IAAA,IAAA,GAAA,MAAA,GAAA,GAAA,CAAA,WAAA,IAAc,oBAAqB,CAAA,GAAA,CAAI,WAAW,CAAI,GAAA,MAAA;AAC1E,EAAA,OAAO,OAAO,MAAS,GAAA;AAAA,IACrB,MAAA;AAAA,IACA,OAAO,GAAI,CAAA;AAAA,GACT,GAAA,IAAA;AACN;AAMgB,SAAA,oBAAA,CAAqB,OAAoC,EAAA,OAAA,GAAoC,kBAA8C,EAAA;AAhD3J,EAAA,IAAA,EAAA;AAiDE,EAAA,MAAM,IAAO,GAAA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,IAAO,EAAA,CAAA,WAAA,EAAA,CAAc,QAAQ,WAAa,EAAA,EAAA,CAAA;AAChE,EAAI,IAAA,CAAC,MAAa,OAAA,IAAA;AAClB,EAAM,MAAA,QAAA,GAAW,QAAQ,MAAO,CAAA,CAAA,GAAA,KAAO,IAAI,WAAgB,KAAA,IAAA,IAAQ,GAAI,CAAA,GAAA,KAAQ,IAAI,CAAA;AACnF,EAAA,KAAA,MAAW,OAAO,QAAU,EAAA;AAE1B,IAAA,MAAM,IAAO,GAAA,CAAA,EAAA,GAAA,cAAA,CAAe,GAAG,CAAA,KAAlB,IAAuB,GAAA,EAAA,GAAA,cAAA,CAAe,OAAQ,CAAA,IAAA,CAAK,CAAO,GAAA,KAAA,GAAA,CAAI,UAAe,KAAA,GAAA,CAAI,GAAG,CAAC,CAAA;AAClG,IAAA,IAAI,MAAa,OAAA,IAAA;AAAA;AAEnB,EAAO,OAAA,IAAA;AACT"}
1
+ {"version":3,"file":"nativeSurfaceTwin.js","sources":["../../../src/features/apps/nativeSurfaceTwin.ts"],"sourcesContent":["/**\n * The native screen that stands in for a web surface on the phone.\n *\n * A link the gateway says belongs on a surface (`shopping`, `travel`, ...) used\n * to open that surface's web SPA in the WebView shell. When the app has a\n * native twin in the catalog (a tile that `supersedes` the surface's web tile),\n * the link opens the native screen instead - the same screen the Apps tile\n * opens. Surfaces with no native twin still open in the WebView shell.\n *\n * Pure: no navigation imports, so it runs under jest.\n */\nimport { MOBILE_APP_CATALOG, type MobileAppItem } from './mobileAppCatalog';\n\ntype NativeRoute = NonNullable<MobileAppItem['nativeRoute']>;\n\n/** Native host -> its MainStack screen. `webbuilder` is the WebView shell, so it is not here. */\nexport const NATIVE_ROUTE_SCREENS: Readonly<Partial<Record<NativeRoute, string>>> = {\n 'design-native': 'MainStack.DesignNative',\n 'canvas-native': 'MainStack.CanvasNative',\n 'characters-native': 'MainStack.CharactersNative',\n 'chat-native': 'MainStack.ChatNative',\n 'billing-native': 'MainStack.Billing',\n 'shopping-native': 'MainStack.ShoppingNative',\n 'travel-native': 'MainStack.TravelNative',\n 'job-search-native': 'MainStack.JobSearchNative',\n 'resume-native': 'MainStack.ResumeNative',\n 'inbox-native': 'MainStack.InboxNative',\n 'study-native': 'MainStack.StudyNative',\n 'local-services-native': 'MainStack.LocalServicesNative',\n 'movies-native': 'MainStack.MoviesNative',\n 'expenses-native': 'MainStack.ExpensesNative',\n 'dictate-native': 'MainStack.DictateNative',\n 'webbuilder-native': 'MainStack.WebBuilderNative',\n};\n\nexport interface NativeSurfaceTwin {\n screen: string;\n title: string;\n}\n\nfunction nativeScreenOf(app: MobileAppItem | undefined): NativeSurfaceTwin | null {\n const screen = app?.nativeRoute ? NATIVE_ROUTE_SCREENS[app.nativeRoute] : undefined;\n return app && screen ? { screen, title: app.label } : null;\n}\n\n/**\n * The native screen for a surface slug (the `<slug>-surface` name, as the\n * gateway's `open.surface` carries it), or null when the surface has none.\n */\nexport function nativeTwinForSurface(\n surface: string | null | undefined,\n catalog: readonly MobileAppItem[] = MOBILE_APP_CATALOG,\n): NativeSurfaceTwin | null {\n const slug = surface\n ?.trim()\n .toLowerCase()\n .replace(/-surface$/, '');\n if (!slug) return null;\n const webTiles = catalog.filter((app) => app.surfaceSlug === slug || app.key === slug);\n for (const web of webTiles) {\n // A tile that is itself native (Billing, Characters), else the native tile replacing it.\n const twin = nativeScreenOf(web) ?? nativeScreenOf(catalog.find((app) => app.supersedes === web.key));\n if (twin) return twin;\n }\n return null;\n}\n"],"names":[],"mappings":"uDAeO,MAAM,oBAAuE,GAAA;AAAA,EAClF,eAAiB,EAAA,wBAAA;AAAA,EACjB,eAAiB,EAAA,wBAAA;AAAA,EACjB,mBAAqB,EAAA,4BAAA;AAAA,EACrB,aAAe,EAAA,sBAAA;AAAA,EACf,gBAAkB,EAAA,mBAAA;AAAA,EAClB,iBAAmB,EAAA,0BAAA;AAAA,EACnB,eAAiB,EAAA,wBAAA;AAAA,EACjB,mBAAqB,EAAA,2BAAA;AAAA,EACrB,eAAiB,EAAA,wBAAA;AAAA,EACjB,cAAgB,EAAA,uBAAA;AAAA,EAChB,cAAgB,EAAA,uBAAA;AAAA,EAChB,uBAAyB,EAAA,+BAAA;AAAA,EACzB,eAAiB,EAAA,wBAAA;AAAA,EACjB,iBAAmB,EAAA,0BAAA;AAAA,EACnB,gBAAkB,EAAA,yBAAA;AAAA,EAClB,mBAAqB,EAAA;AACvB;AAKA,SAAS,eAAe,GAA0D,EAAA;AAChF,EAAA,MAAM,UAAS,GAAK,IAAA,IAAA,GAAA,MAAA,GAAA,GAAA,CAAA,WAAA,IAAc,oBAAqB,CAAA,GAAA,CAAI,WAAW,CAAI,GAAA,MAAA;AAC1E,EAAA,OAAO,OAAO,MAAS,GAAA;AAAA,IACrB,MAAA;AAAA,IACA,OAAO,GAAI,CAAA;AAAA,GACT,GAAA,IAAA;AACN;AAMgB,SAAA,oBAAA,CAAqB,OAAoC,EAAA,OAAA,GAAoC,kBAA8C,EAAA;AAjD3J,EAAA,IAAA,EAAA;AAkDE,EAAA,MAAM,IAAO,GAAA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,IAAO,EAAA,CAAA,WAAA,EAAA,CAAc,QAAQ,WAAa,EAAA,EAAA,CAAA;AAChE,EAAI,IAAA,CAAC,MAAa,OAAA,IAAA;AAClB,EAAM,MAAA,QAAA,GAAW,QAAQ,MAAO,CAAA,CAAA,GAAA,KAAO,IAAI,WAAgB,KAAA,IAAA,IAAQ,GAAI,CAAA,GAAA,KAAQ,IAAI,CAAA;AACnF,EAAA,KAAA,MAAW,OAAO,QAAU,EAAA;AAE1B,IAAA,MAAM,IAAO,GAAA,CAAA,EAAA,GAAA,cAAA,CAAe,GAAG,CAAA,KAAlB,IAAuB,GAAA,EAAA,GAAA,cAAA,CAAe,OAAQ,CAAA,IAAA,CAAK,CAAO,GAAA,KAAA,GAAA,CAAI,UAAe,KAAA,GAAA,CAAI,GAAG,CAAC,CAAA;AAClG,IAAA,IAAI,MAAa,OAAA,IAAA;AAAA;AAEnB,EAAO,OAAA,IAAA;AACT"}