@adminide-stack/yantra-mobile 12.0.39-alpha.9 → 12.0.39

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 (37) hide show
  1. package/lib/components/AppsMenu/AppsMenu.js +285 -0
  2. package/lib/components/AppsMenu/AppsMenu.js.map +1 -0
  3. package/lib/components/GatewayConnector/GatewayConnector.js +5 -2
  4. package/lib/components/GatewayConnector/GatewayConnector.js.map +1 -1
  5. package/lib/components/GatewayToolbarButtonMobile.js +25 -53
  6. package/lib/components/GatewayToolbarButtonMobile.js.map +1 -1
  7. package/lib/components/NavigationHeader/NavigationHeader.js +19 -11
  8. package/lib/components/NavigationHeader/NavigationHeader.js.map +1 -1
  9. package/lib/compute.js +2 -0
  10. package/lib/compute.js.map +1 -1
  11. package/lib/config/constants.js +2 -2
  12. package/lib/config/constants.js.map +1 -1
  13. package/lib/contexts/GatewayContext.js +1 -1
  14. package/lib/features/apps/mobileAppCatalog.js +153 -0
  15. package/lib/features/apps/mobileAppCatalog.js.map +1 -0
  16. package/lib/features/templates/__tests__/buildTemplateCards.test.ts +57 -0
  17. package/lib/features/templates/buildTemplateCards.js +28 -2
  18. package/lib/features/templates/buildTemplateCards.js.map +1 -1
  19. package/lib/features/templates/buildTemplateCards.ts +44 -1
  20. package/lib/hooks/useMarketplaceTemplateCards.js +5 -2
  21. package/lib/hooks/useMarketplaceTemplateCards.js.map +1 -1
  22. package/lib/hooks/useMarketplaceTemplateGroups.js +9 -2
  23. package/lib/hooks/useMarketplaceTemplateGroups.js.map +1 -1
  24. package/lib/routes.json +2 -0
  25. package/lib/screens/Home/HomeScreen.js +44 -150
  26. package/lib/screens/Home/HomeScreen.js.map +1 -1
  27. package/lib/screens/Home/components/BuildTemplatesSection.js +142 -87
  28. package/lib/screens/Home/components/BuildTemplatesSection.js.map +1 -1
  29. package/lib/screens/Home/components/ChooseTemplateModal.js +261 -0
  30. package/lib/screens/Home/components/ChooseTemplateModal.js.map +1 -0
  31. package/lib/screens/Home/components/HomeSuggestions.js +109 -0
  32. package/lib/screens/Home/components/HomeSuggestions.js.map +1 -0
  33. package/lib/screens/Home/components/TemplateBrowserModal.js +237 -0
  34. package/lib/screens/Home/components/TemplateBrowserModal.js.map +1 -0
  35. package/lib/theme/mobileTokens.js +0 -5
  36. package/lib/theme/mobileTokens.js.map +1 -1
  37. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"NavigationHeader.js","sources":["../../../src/components/NavigationHeader/NavigationHeader.tsx"],"sourcesContent":["/**\n * Universal navigation header for the Yantra mobile app.\n *\n * Wired via `customHeader` in `compute.ts`, so the React Navigation runtime\n * passes us TWO sets of props on every render:\n *\n * 1. The standard navigator props — `navigation`, `route`, `options`, `back`,\n * `layout`. We read EVERYTHING visual out of `options` (set by `props.options`\n * in compute.ts):\n * • `options.title` / `options.headerTitle` — visible title text\n * • `options.headerTitleAlign` — `'left' | 'center'`\n * • `options.headerTitleStyle` — text style overrides (fontWeight, etc.)\n * • `options.headerTintColor` — title + icon tint (light-mode default)\n * • `options.headerStyle` — outer header view style overrides\n *\n * 2. The static `customHeader.props` from compute.ts — the layout flags\n * describing what the header should render for this route:\n * • `showTitle, showToggle, showBack, showFilter, isSearchBack`\n * • `showGateway, showHistory, showNewChat` (`showGateway` is intended for Home only)\n * • `headerBgColor`\n *\n * Screens never touch the header — no `setOptions`, no slot registration.\n * If a route needs a different header configuration, change its\n * `customHeader.props` / `props.options` in `compute.ts`.\n */\nimport React, { useCallback, useMemo } from 'react';\nimport { Pressable, StyleSheet, View, useColorScheme } from 'react-native';\nimport { SafeAreaView, useSafeAreaInsets } from 'react-native-safe-area-context';\nimport { StatusBar } from 'expo-status-bar';\nimport { CommonActions, DrawerActions, useNavigation } from '@react-navigation/native';\nimport { getHeaderTitle } from '@react-navigation/elements';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { Text } from '@admin-layout/gluestack-ui-mobile';\nimport { GatewayConnector } from '../GatewayConnector';\nimport { mobileTokens } from '../../theme/mobileTokens';\nimport { tryWebBuilderBack } from '../../screens/WebBuilder/webbuilderBackHandler';\n\ninterface NavigationHeaderProps {\n /** React Navigation header props (typed loose because they vary per navigator). */\n navigation?: any;\n route?: any;\n options?: any;\n /** Set by the native-stack navigator when there's a previous screen on the stack. */\n back?: { title?: string };\n\n showTitle?: boolean;\n showToggle?: boolean;\n showBack?: boolean;\n showFilter?: boolean;\n isSearchBack?: boolean;\n showGateway?: boolean;\n showHistory?: boolean;\n showNewChat?: boolean;\n headerBgColor?: string;\n}\n\nconst ICON_SIZE = 22;\n\nfunction resolveTitle(options: any, route: any): string {\n if (typeof options?.title === 'string' && options.title.trim()) {\n return options.title.trim();\n }\n if (typeof options?.headerTitle === 'string' && options.headerTitle.trim()) {\n return options.headerTitle.trim();\n }\n const fallback = getHeaderTitle?.(options ?? {}, route?.name ?? 'Yantra');\n return typeof fallback === 'string' && fallback.trim() ? fallback : 'Yantra';\n}\n\nconst NavigationHeader: React.FC<NavigationHeaderProps> = (props) => {\n const {\n navigation: navProp,\n route,\n options,\n back,\n showTitle = true,\n showToggle = false,\n showBack = false,\n showGateway = false,\n showHistory = false,\n showNewChat = false,\n headerBgColor,\n } = props;\n\n const fallbackNav = useNavigation<any>();\n const navigation = navProp ?? fallbackNav;\n\n const colorScheme = useColorScheme();\n const isDark = colorScheme === 'dark';\n const insets = useSafeAreaInsets();\n\n /* ── Theme + options-driven colours / styles ─────────────────────────── */\n const themeTitleColor = isDark ? '#f1f5f9' : '#0f172a';\n const themeAccentColor = isDark ? '#a5b4fc' : '#4338ca';\n const themeNewChatIconColor = isDark ? '#e5e7eb' : '#000000';\n\n /**\n * Honour `options.headerTintColor` (set in `compute.ts` → `props.options`).\n * In dark mode we ignore a hard \"black\" tint so the title stays legible —\n * but any non-black tint is respected in both modes.\n */\n const optionTint = typeof options?.headerTintColor === 'string' ? options.headerTintColor : null;\n const tintLooksDark = optionTint && /^(#?000(000)?|black)$/i.test(optionTint.trim());\n const effectiveTint = optionTint && !(isDark && tintLooksDark) ? optionTint : null;\n\n const titleColor = effectiveTint ?? themeTitleColor;\n const iconColor = effectiveTint ?? themeTitleColor;\n const accentColor = effectiveTint ?? themeAccentColor;\n const newChatIconColor = effectiveTint ?? themeNewChatIconColor;\n\n const surfaceColor = headerBgColor ?? (isDark ? '#0f172a' : '#ffffff');\n const dividerColor = isDark ? 'rgba(148, 163, 184, 0.18)' : 'rgba(15, 23, 42, 0.06)';\n\n const titleAlignLeft = options?.headerTitleAlign === 'left';\n const title = useMemo(() => resolveTitle(options, route), [options, route]);\n const optionTitleStyle = options?.headerTitleStyle ?? null;\n\n /** Org slug used by header navigation actions; falls back to route params. */\n const orgName = useMemo(() => {\n const raw = (route?.params?.orgName as string | undefined) ?? '';\n return typeof raw === 'string' && raw.trim() ? raw.trim() : null;\n }, [route?.params?.orgName]);\n\n /* ── Action handlers ─────────────────────────────────────────────────── */\n const handleBack = useCallback(() => {\n // WebBuilder: dismiss in-app preview first; otherwise leave the screen.\n const routeName = typeof route?.name === 'string' ? route.name : '';\n if (/webbuilder/i.test(routeName) && tryWebBuilderBack()) {\n return;\n }\n if (navigation?.canGoBack?.()) {\n navigation.goBack();\n return;\n }\n // Fallback when WebBuilder was opened without stack history (e.g. deep link).\n navigation?.dispatch?.(\n CommonActions.navigate({\n name: 'MainStack.Layout.Home',\n params: orgName ? { orgName } : undefined,\n }),\n );\n }, [navigation, orgName, route?.name]);\n\n const handleToggleDrawer = useCallback(() => {\n try {\n navigation?.dispatch?.(DrawerActions.openDrawer());\n } catch {\n /* Current navigator may not be a drawer — ignore. */\n }\n }, [navigation]);\n\n const handleOpenChatHistory = useCallback(() => {\n navigation?.dispatch?.(\n CommonActions.navigate({\n name: 'MainStack.ChatHistory',\n params: orgName ? { orgName } : undefined,\n }),\n );\n }, [navigation, orgName]);\n\n const handleNewChat = useCallback(() => {\n navigation?.dispatch?.(\n CommonActions.navigate({\n name: 'MainStack.Layout.Home',\n params: orgName ? { orgName } : undefined,\n merge: true,\n }),\n );\n }, [navigation, orgName]);\n\n /* ── Slot composition (left → title → right) ─────────────────────────── */\n const wantsBack = Boolean(back) || showBack;\n\n const leftSlot = wantsBack ? (\n <Pressable\n onPress={handleBack}\n accessibilityLabel=\"Go back\"\n accessibilityRole=\"button\"\n style={({ pressed }) => [styles.iconButton, pressed && styles.iconButtonPressed]}\n hitSlop={8}\n >\n <MaterialCommunityIcons name=\"chevron-left\" size={ICON_SIZE + 4} color={iconColor} />\n </Pressable>\n ) : showToggle ? (\n <Pressable\n onPress={handleToggleDrawer}\n accessibilityLabel=\"Open menu\"\n accessibilityRole=\"button\"\n style={({ pressed }) => [styles.iconButton, pressed && styles.iconButtonPressed]}\n hitSlop={8}\n >\n <MaterialCommunityIcons name=\"menu\" size={ICON_SIZE} color={iconColor} />\n </Pressable>\n ) : null;\n\n const titleSlot = showTitle ? (\n <Text\n style={[\n styles.title,\n titleAlignLeft ? styles.titleAlignLeft : styles.titleAlignCenter,\n { color: titleColor },\n optionTitleStyle,\n ]}\n numberOfLines={1}\n ellipsizeMode=\"tail\"\n >\n {title}\n </Text>\n ) : null;\n\n const showRightSlot = showGateway || showHistory || showNewChat;\n const rightSlot = showRightSlot ? (\n <View style={styles.rightActions}>\n {showGateway ? <GatewayConnector /> : null}\n {showHistory ? (\n <Pressable\n onPress={handleOpenChatHistory}\n style={({ pressed }) => [styles.actionButton, pressed && styles.actionButtonPressed]}\n accessibilityLabel=\"Chat history\"\n accessibilityRole=\"button\"\n hitSlop={8}\n >\n <View style={[styles.actionButtonInner, isDark ? styles.actionButtonInnerDark : null]}>\n <MaterialCommunityIcons name=\"history\" size={19} color={accentColor} />\n </View>\n </Pressable>\n ) : null}\n {showNewChat ? (\n <Pressable\n onPress={handleNewChat}\n style={({ pressed }) => [styles.actionButton, pressed && styles.actionButtonPressed]}\n accessibilityLabel=\"New chat\"\n accessibilityRole=\"button\"\n hitSlop={8}\n >\n <View style={[styles.actionButtonInner, isDark ? styles.actionButtonInnerDark : null]}>\n <MaterialCommunityIcons name=\"chat-plus-outline\" size={20} color={newChatIconColor} />\n </View>\n </Pressable>\n ) : null}\n </View>\n ) : null;\n\n return (\n <>\n <StatusBar style={isDark ? 'light' : 'dark'} />\n <SafeAreaView edges={['top']} style={{ backgroundColor: surfaceColor }}>\n <View\n style={[\n styles.row,\n {\n backgroundColor: surfaceColor,\n borderBottomColor: dividerColor,\n paddingTop: insets.top > 0 ? 0 : 6,\n },\n options?.headerStyle ?? null,\n ]}\n >\n <View style={styles.leftSlot}>{leftSlot}</View>\n <View style={[styles.titleSlot, titleAlignLeft && styles.titleSlotLeft]}>{titleSlot}</View>\n <View style={styles.rightSlot}>{rightSlot}</View>\n </View>\n </SafeAreaView>\n </>\n );\n};\n\nconst styles = StyleSheet.create({\n row: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 12,\n paddingVertical: 10,\n minHeight: 52,\n borderBottomWidth: StyleSheet.hairlineWidth,\n },\n leftSlot: {\n minWidth: 40,\n alignItems: 'flex-start',\n justifyContent: 'center',\n },\n titleSlot: {\n flex: 1,\n alignItems: 'center',\n justifyContent: 'center',\n paddingHorizontal: 8,\n minWidth: 0,\n },\n titleSlotLeft: {\n alignItems: 'flex-start',\n },\n rightSlot: {\n minWidth: 40,\n alignItems: 'flex-end',\n justifyContent: 'center',\n },\n rightActions: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 6,\n },\n title: {\n fontSize: 17,\n fontWeight: '700',\n letterSpacing: -0.2,\n width: '100%',\n },\n titleAlignCenter: {\n textAlign: 'center',\n },\n titleAlignLeft: {\n textAlign: 'left',\n },\n iconButton: {\n width: 36,\n height: 36,\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: 18,\n },\n iconButtonPressed: {\n opacity: 0.6,\n },\n actionButton: {\n padding: 0,\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: 22,\n },\n actionButtonPressed: {\n opacity: 0.6,\n },\n actionButtonInner: {\n width: 32,\n height: 32,\n borderRadius: 16,\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: mobileTokens.color.surface,\n borderWidth: 1,\n borderColor: mobileTokens.color.border,\n shadowColor: '#0f172a',\n shadowOpacity: 0.08,\n shadowRadius: 5,\n shadowOffset: { width: 0, height: 2 },\n elevation: 2,\n },\n actionButtonInnerDark: {\n backgroundColor: '#0f172a',\n borderColor: '#334155',\n },\n});\n\nexport default React.memo(NavigationHeader);\n"],"names":["_a","_b"],"mappings":"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"}
1
+ {"version":3,"file":"NavigationHeader.js","sources":["../../../src/components/NavigationHeader/NavigationHeader.tsx"],"sourcesContent":["/**\n * Universal navigation header for the Yantra mobile app.\n *\n * Wired via `customHeader` in `compute.ts`, so the React Navigation runtime\n * passes us TWO sets of props on every render:\n *\n * 1. The standard navigator props — `navigation`, `route`, `options`, `back`,\n * `layout`. We read EVERYTHING visual out of `options` (set by `props.options`\n * in compute.ts):\n * • `options.title` / `options.headerTitle` — visible title text\n * • `options.headerTitleAlign` — `'left' | 'center'`\n * • `options.headerTitleStyle` — text style overrides (fontWeight, etc.)\n * • `options.headerTintColor` — title + icon tint (light-mode default)\n * • `options.headerStyle` — outer header view style overrides\n *\n * 2. The static `customHeader.props` from compute.ts — the layout flags\n * describing what the header should render for this route:\n * • `showTitle, showToggle, showBack, showFilter, isSearchBack`\n * • `showGateway, showApps, showHistory, showNewChat` (`showGateway` / `showApps` are intended for Home and Chat)\n * • `headerBgColor`\n *\n * Screens never touch the header — no `setOptions`, no slot registration.\n * If a route needs a different header configuration, change its\n * `customHeader.props` / `props.options` in `compute.ts`.\n */\nimport React, { useCallback, useMemo } from 'react';\nimport { Pressable, StyleSheet, View, useColorScheme } from 'react-native';\nimport { SafeAreaView, useSafeAreaInsets } from 'react-native-safe-area-context';\nimport { StatusBar } from 'expo-status-bar';\nimport { CommonActions, DrawerActions, useNavigation } from '@react-navigation/native';\nimport { getHeaderTitle } from '@react-navigation/elements';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { Text } from '@admin-layout/gluestack-ui-mobile';\nimport { GatewayConnector } from '../GatewayConnector';\nimport { AppsMenu } from '../AppsMenu';\nimport { mobileTokens } from '../../theme/mobileTokens';\nimport { tryWebBuilderBack } from '../../screens/WebBuilder/webbuilderBackHandler';\n\ninterface NavigationHeaderProps {\n /** React Navigation header props (typed loose because they vary per navigator). */\n navigation?: any;\n route?: any;\n options?: any;\n /** Set by the native-stack navigator when there's a previous screen on the stack. */\n back?: { title?: string };\n\n showTitle?: boolean;\n showToggle?: boolean;\n showBack?: boolean;\n showFilter?: boolean;\n isSearchBack?: boolean;\n showGateway?: boolean;\n showApps?: boolean;\n showHistory?: boolean;\n showNewChat?: boolean;\n headerBgColor?: string;\n}\n\nconst ICON_SIZE = 22;\n\nfunction resolveTitle(options: any, route: any): string {\n if (typeof options?.title === 'string' && options.title.trim()) {\n return options.title.trim();\n }\n if (typeof options?.headerTitle === 'string' && options.headerTitle.trim()) {\n return options.headerTitle.trim();\n }\n const fallback = getHeaderTitle?.(options ?? {}, route?.name ?? 'Yantra');\n return typeof fallback === 'string' && fallback.trim() ? fallback : 'Yantra';\n}\n\nconst NavigationHeader: React.FC<NavigationHeaderProps> = (props) => {\n const {\n navigation: navProp,\n route,\n options,\n back,\n showTitle = true,\n showToggle = false,\n showBack = false,\n showGateway = false,\n showApps = false,\n showHistory = false,\n showNewChat = false,\n headerBgColor,\n } = props;\n\n const showAppsLauncher = showGateway || showApps;\n\n const fallbackNav = useNavigation<any>();\n const navigation = navProp ?? fallbackNav;\n\n const colorScheme = useColorScheme();\n const isDark = colorScheme === 'dark';\n const insets = useSafeAreaInsets();\n\n /* ── Theme + options-driven colours / styles ─────────────────────────── */\n const themeTitleColor = isDark ? '#f1f5f9' : '#0f172a';\n const themeAccentColor = isDark ? '#a5b4fc' : '#4338ca';\n const themeNewChatIconColor = isDark ? '#e5e7eb' : '#000000';\n\n /**\n * Honour `options.headerTintColor` (set in `compute.ts` → `props.options`).\n * In dark mode we ignore a hard \"black\" tint so the title stays legible —\n * but any non-black tint is respected in both modes.\n */\n const optionTint = typeof options?.headerTintColor === 'string' ? options.headerTintColor : null;\n const tintLooksDark = optionTint && /^(#?000(000)?|black)$/i.test(optionTint.trim());\n const effectiveTint = optionTint && !(isDark && tintLooksDark) ? optionTint : null;\n\n const titleColor = effectiveTint ?? themeTitleColor;\n const iconColor = effectiveTint ?? themeTitleColor;\n const accentColor = effectiveTint ?? themeAccentColor;\n const newChatIconColor = effectiveTint ?? themeNewChatIconColor;\n\n const surfaceColor = headerBgColor ?? (isDark ? '#0f172a' : '#ffffff');\n const dividerColor = isDark ? 'rgba(148, 163, 184, 0.18)' : 'rgba(15, 23, 42, 0.06)';\n\n const titleAlignLeft = options?.headerTitleAlign === 'left';\n const title = useMemo(() => resolveTitle(options, route), [options, route]);\n const optionTitleStyle = options?.headerTitleStyle ?? null;\n\n /** Org slug used by header navigation actions; falls back to route params. */\n const orgName = useMemo(() => {\n const raw = (route?.params?.orgName as string | undefined) ?? '';\n return typeof raw === 'string' && raw.trim() ? raw.trim() : null;\n }, [route?.params?.orgName]);\n\n /* ── Action handlers ─────────────────────────────────────────────────── */\n const handleBack = useCallback(() => {\n // WebBuilder: dismiss in-app preview first; otherwise leave the screen.\n const routeName = typeof route?.name === 'string' ? route.name : '';\n if (/webbuilder/i.test(routeName) && tryWebBuilderBack()) {\n return;\n }\n if (navigation?.canGoBack?.()) {\n navigation.goBack();\n return;\n }\n // Fallback when WebBuilder was opened without stack history (e.g. deep link).\n navigation?.dispatch?.(\n CommonActions.navigate({\n name: 'MainStack.Layout.Home',\n params: orgName ? { orgName } : undefined,\n }),\n );\n }, [navigation, orgName, route?.name]);\n\n const handleToggleDrawer = useCallback(() => {\n try {\n navigation?.dispatch?.(DrawerActions.openDrawer());\n } catch {\n /* Current navigator may not be a drawer — ignore. */\n }\n }, [navigation]);\n\n const handleOpenChatHistory = useCallback(() => {\n navigation?.dispatch?.(\n CommonActions.navigate({\n name: 'MainStack.ChatHistory',\n params: orgName ? { orgName } : undefined,\n }),\n );\n }, [navigation, orgName]);\n\n const handleNewChat = useCallback(() => {\n navigation?.dispatch?.(\n CommonActions.navigate({\n name: 'MainStack.Layout.Home',\n params: orgName ? { orgName } : undefined,\n merge: true,\n }),\n );\n }, [navigation, orgName]);\n\n /* ── Slot composition (left → title → right) ─────────────────────────── */\n const wantsBack = Boolean(back) || showBack;\n\n const leftSlot = wantsBack ? (\n <Pressable\n onPress={handleBack}\n accessibilityLabel=\"Go back\"\n accessibilityRole=\"button\"\n style={({ pressed }) => [styles.iconButton, pressed && styles.iconButtonPressed]}\n hitSlop={8}\n >\n <MaterialCommunityIcons name=\"chevron-left\" size={ICON_SIZE + 4} color={iconColor} />\n </Pressable>\n ) : showToggle ? (\n <Pressable\n onPress={handleToggleDrawer}\n accessibilityLabel=\"Open menu\"\n accessibilityRole=\"button\"\n style={({ pressed }) => [styles.iconButton, pressed && styles.iconButtonPressed]}\n hitSlop={8}\n >\n <MaterialCommunityIcons name=\"menu\" size={ICON_SIZE} color={iconColor} />\n </Pressable>\n ) : null;\n\n const hideBrandTitle = showAppsLauncher && title === 'Yantra';\n const titleSlot =\n showTitle && !hideBrandTitle ? (\n <Text\n style={[\n styles.title,\n titleAlignLeft ? styles.titleAlignLeft : styles.titleAlignCenter,\n { color: titleColor },\n optionTitleStyle,\n ]}\n numberOfLines={1}\n ellipsizeMode=\"tail\"\n >\n {title}\n </Text>\n ) : null;\n\n const showRightSlot = showHistory || showNewChat;\n const rightSlot = showRightSlot ? (\n <View style={styles.rightActions}>\n {showHistory ? (\n <Pressable\n onPress={handleOpenChatHistory}\n style={({ pressed }) => [styles.actionButton, pressed && styles.actionButtonPressed]}\n accessibilityLabel=\"Chat history\"\n accessibilityRole=\"button\"\n hitSlop={8}\n >\n <View style={[styles.actionButtonInner, isDark ? styles.actionButtonInnerDark : null]}>\n <MaterialCommunityIcons name=\"history\" size={19} color={accentColor} />\n </View>\n </Pressable>\n ) : null}\n {showNewChat ? (\n <Pressable\n onPress={handleNewChat}\n style={({ pressed }) => [styles.actionButton, pressed && styles.actionButtonPressed]}\n accessibilityLabel=\"New chat\"\n accessibilityRole=\"button\"\n hitSlop={8}\n >\n <View style={[styles.actionButtonInner, isDark ? styles.actionButtonInnerDark : null]}>\n <MaterialCommunityIcons name=\"chat-plus-outline\" size={20} color={newChatIconColor} />\n </View>\n </Pressable>\n ) : null}\n </View>\n ) : null;\n\n return (\n <>\n <StatusBar style={isDark ? 'light' : 'dark'} />\n <SafeAreaView edges={['top']} style={{ backgroundColor: surfaceColor }}>\n <View\n style={[\n styles.row,\n {\n backgroundColor: surfaceColor,\n borderBottomColor: dividerColor,\n paddingTop: insets.top > 0 ? 0 : 6,\n },\n options?.headerStyle ?? null,\n ]}\n >\n <View style={styles.leftSlot}>\n {leftSlot}\n {showAppsLauncher ? <AppsMenu isDark={isDark} orgName={orgName} /> : null}\n {showGateway ? <GatewayConnector /> : null}\n </View>\n <View style={[styles.titleSlot, titleAlignLeft && styles.titleSlotLeft]}>{titleSlot}</View>\n <View style={styles.rightSlot}>{rightSlot}</View>\n </View>\n </SafeAreaView>\n </>\n );\n};\n\nconst styles = StyleSheet.create({\n row: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 8,\n paddingVertical: 8,\n minHeight: 52,\n borderBottomWidth: StyleSheet.hairlineWidth,\n overflow: 'visible',\n },\n leftSlot: {\n flexDirection: 'row',\n alignItems: 'center',\n flexShrink: 0,\n gap: 0,\n },\n titleSlot: {\n flex: 1,\n alignItems: 'center',\n justifyContent: 'center',\n paddingHorizontal: 8,\n minWidth: 0,\n },\n titleSlotLeft: {\n alignItems: 'flex-start',\n },\n rightSlot: {\n minWidth: 40,\n alignItems: 'flex-end',\n justifyContent: 'center',\n },\n rightActions: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 6,\n },\n title: {\n fontSize: 17,\n fontWeight: '700',\n letterSpacing: -0.2,\n width: '100%',\n },\n titleAlignCenter: {\n textAlign: 'center',\n },\n titleAlignLeft: {\n textAlign: 'left',\n },\n iconButton: {\n width: 36,\n height: 36,\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: 18,\n },\n iconButtonPressed: {\n opacity: 0.6,\n },\n actionButton: {\n padding: 0,\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: 22,\n },\n actionButtonPressed: {\n opacity: 0.6,\n },\n actionButtonInner: {\n width: 32,\n height: 32,\n borderRadius: 16,\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: mobileTokens.color.surface,\n borderWidth: 1,\n borderColor: mobileTokens.color.border,\n shadowColor: '#0f172a',\n shadowOpacity: 0.08,\n shadowRadius: 5,\n shadowOffset: { width: 0, height: 2 },\n elevation: 2,\n },\n actionButtonInnerDark: {\n backgroundColor: '#0f172a',\n borderColor: '#334155',\n },\n});\n\nexport default React.memo(NavigationHeader);\n"],"names":["_a","_b"],"mappings":"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"}
package/lib/compute.js CHANGED
@@ -21,6 +21,7 @@ const yantraMobilePageStore = [{
21
21
  showFilter: true,
22
22
  isSearchBack: false,
23
23
  showGateway: true,
24
+ showApps: true,
24
25
  showHistory: true,
25
26
  showNewChat: true
26
27
  }
@@ -67,6 +68,7 @@ const yantraMobilePageStore = [{
67
68
  isSearchBack: false,
68
69
  showBack: true,
69
70
  showGateway: true,
71
+ showApps: true,
70
72
  showHistory: false,
71
73
  showNewChat: true
72
74
  }
@@ -1 +1 @@
1
- {"version":3,"file":"compute.js","sources":["../src/compute.ts"],"sourcesContent":["/* eslint-disable import/no-extraneous-dependencies */\nimport { getFilteredRoutes } from '@common-stack/client-react/lib/utils/filteredRoutes.js';\nimport type { IRouteModule } from '@common-stack/core';\n\nexport const yantraMobilePageStore: IRouteModule[] = [\n {\n key: 'home',\n path: '/:orgName/l/home',\n name: 'Home',\n exact: true,\n index: true,\n priority: 1,\n hideInMenu: true,\n auth: true,\n menu_position: 'side',\n component: () => import('./screens/Home'),\n importPaths: {\n navigationHeader: () => import('./components/NavigationHeader/NavigationHeader'),\n },\n customHeader: {\n name: 'NavigationHeader',\n component: '$.importPaths.navigationHeader',\n props: {\n showTitle: true,\n showToggle: true,\n showFilter: true,\n isSearchBack: false,\n showGateway: true,\n showHistory: true,\n showNewChat: true,\n },\n },\n props: {\n initialParams: { initialSessionId: null, orgName: null },\n options: {\n title: 'Yantra',\n headerTintColor: 'black',\n headerTitleStyle: {\n fontWeight: 'bold',\n },\n drawerLabel: 'Chat',\n headerTitleAlign: 'left',\n gestureEnabled: false,\n swipeEnabled: false,\n animation: 'fade',\n animationTypeForReplace: 'pop',\n },\n },\n },\n {\n key: 'chat',\n path: '/:orgName/chat/:channelId',\n name: 'Chat',\n exact: false,\n priority: 2,\n hideInMenu: true,\n auth: true,\n component: () => import('./screens/Chat'),\n importPaths: {\n navigationHeader: () => import('./components/NavigationHeader/NavigationHeader'),\n },\n customHeader: {\n name: 'NavigationHeader',\n component: '$.importPaths.navigationHeader',\n props: {\n showTitle: true,\n showToggle: false,\n showFilter: false,\n isSearchBack: false,\n showBack: true,\n showGateway: true,\n showHistory: false,\n showNewChat: true,\n },\n },\n props: {\n initialParams: { channelId: null, orgName: null },\n options: {\n title: 'Yantra',\n headerTintColor: 'black',\n headerTitleStyle: {\n fontWeight: 'bold',\n },\n drawerLabel: 'Chat',\n headerTitleAlign: 'left',\n gestureEnabled: false,\n swipeEnabled: false,\n animation: 'fade',\n animationTypeForReplace: 'pop',\n },\n },\n },\n {\n key: 'chathistory',\n path: '/:orgName/chathistory',\n name: 'ChatHistory',\n exact: false,\n priority: 3,\n hideInMenu: true,\n auth: true,\n component: () => import('./screens/ChatHistory'),\n importPaths: {\n navigationHeader: () => import('./components/NavigationHeader/NavigationHeader'),\n },\n customHeader: {\n name: 'NavigationHeader',\n component: '$.importPaths.navigationHeader',\n props: {\n showTitle: true,\n showToggle: false,\n showFilter: false,\n isSearchBack: false,\n showBack: true,\n showGateway: false,\n showHistory: false,\n showNewChat: true,\n },\n },\n props: {\n initialParams: { orgName: null },\n options: {\n title: 'Chat history',\n headerTintColor: 'black',\n headerTitleStyle: {\n fontWeight: 'bold',\n },\n headerTitleAlign: 'left',\n gestureEnabled: false,\n swipeEnabled: false,\n animation: 'fade',\n animationTypeForReplace: 'pop',\n },\n },\n },\n {\n key: 'webbuilder',\n path: '/:orgName/c/:channelId/webbuilder',\n name: 'WebBuilder',\n exact: true,\n priority: 4,\n hideInMenu: true,\n auth: true,\n menu_position: 'side',\n component: () => import('./screens/WebBuilder'),\n importPaths: {\n navigationHeader: () => import('./components/NavigationHeader/NavigationHeader'),\n },\n customHeader: {\n name: 'NavigationHeader',\n component: '$.importPaths.navigationHeader',\n props: {\n showTitle: true,\n showToggle: false,\n showFilter: false,\n isSearchBack: false,\n showBack: true,\n showGateway: false,\n showHistory: false,\n showNewChat: false,\n },\n },\n props: {\n initialParams: { orgName: null, url: null, channelId: null, projectId: null, message: null },\n options: {\n title: 'Web Builder',\n headerTintColor: 'black',\n headerTitleStyle: {\n fontWeight: 'bold',\n },\n // Reachable only via Build-mode submit — never list in the drawer.\n drawerItemStyle: { display: 'none' },\n headerTitleAlign: 'left',\n gestureEnabled: false,\n swipeEnabled: false,\n animation: 'fade',\n animationTypeForReplace: 'pop',\n },\n },\n },\n];\n\nconst selectedRoutes = ['home', 'chat', 'chathistory', 'webbuilder'];\n\nconst filteredRoutes = getFilteredRoutes(yantraMobilePageStore, selectedRoutes);\n\nexport { filteredRoutes };\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"compute.js","sources":["../src/compute.ts"],"sourcesContent":["/* eslint-disable import/no-extraneous-dependencies */\nimport { getFilteredRoutes } from '@common-stack/client-react/lib/utils/filteredRoutes.js';\nimport type { IRouteModule } from '@common-stack/core';\n\nexport const yantraMobilePageStore: IRouteModule[] = [\n {\n key: 'home',\n path: '/:orgName/l/home',\n name: 'Home',\n exact: true,\n index: true,\n priority: 1,\n hideInMenu: true,\n auth: true,\n menu_position: 'side',\n component: () => import('./screens/Home'),\n importPaths: {\n navigationHeader: () => import('./components/NavigationHeader/NavigationHeader'),\n },\n customHeader: {\n name: 'NavigationHeader',\n component: '$.importPaths.navigationHeader',\n props: {\n showTitle: true,\n showToggle: true,\n showFilter: true,\n isSearchBack: false,\n showGateway: true,\n showApps: true,\n showHistory: true,\n showNewChat: true,\n },\n },\n props: {\n initialParams: { initialSessionId: null, orgName: null },\n options: {\n title: 'Yantra',\n headerTintColor: 'black',\n headerTitleStyle: {\n fontWeight: 'bold',\n },\n drawerLabel: 'Chat',\n headerTitleAlign: 'left',\n gestureEnabled: false,\n swipeEnabled: false,\n animation: 'fade',\n animationTypeForReplace: 'pop',\n },\n },\n },\n {\n key: 'chat',\n path: '/:orgName/chat/:channelId',\n name: 'Chat',\n exact: false,\n priority: 2,\n hideInMenu: true,\n auth: true,\n component: () => import('./screens/Chat'),\n importPaths: {\n navigationHeader: () => import('./components/NavigationHeader/NavigationHeader'),\n },\n customHeader: {\n name: 'NavigationHeader',\n component: '$.importPaths.navigationHeader',\n props: {\n showTitle: true,\n showToggle: false,\n showFilter: false,\n isSearchBack: false,\n showBack: true,\n showGateway: true,\n showApps: true,\n showHistory: false,\n showNewChat: true,\n },\n },\n props: {\n initialParams: { channelId: null, orgName: null },\n options: {\n title: 'Yantra',\n headerTintColor: 'black',\n headerTitleStyle: {\n fontWeight: 'bold',\n },\n drawerLabel: 'Chat',\n headerTitleAlign: 'left',\n gestureEnabled: false,\n swipeEnabled: false,\n animation: 'fade',\n animationTypeForReplace: 'pop',\n },\n },\n },\n {\n key: 'chathistory',\n path: '/:orgName/chathistory',\n name: 'ChatHistory',\n exact: false,\n priority: 3,\n hideInMenu: true,\n auth: true,\n component: () => import('./screens/ChatHistory'),\n importPaths: {\n navigationHeader: () => import('./components/NavigationHeader/NavigationHeader'),\n },\n customHeader: {\n name: 'NavigationHeader',\n component: '$.importPaths.navigationHeader',\n props: {\n showTitle: true,\n showToggle: false,\n showFilter: false,\n isSearchBack: false,\n showBack: true,\n showGateway: false,\n showHistory: false,\n showNewChat: true,\n },\n },\n props: {\n initialParams: { orgName: null },\n options: {\n title: 'Chat history',\n headerTintColor: 'black',\n headerTitleStyle: {\n fontWeight: 'bold',\n },\n headerTitleAlign: 'left',\n gestureEnabled: false,\n swipeEnabled: false,\n animation: 'fade',\n animationTypeForReplace: 'pop',\n },\n },\n },\n {\n key: 'webbuilder',\n path: '/:orgName/c/:channelId/webbuilder',\n name: 'WebBuilder',\n exact: true,\n priority: 4,\n hideInMenu: true,\n auth: true,\n menu_position: 'side',\n component: () => import('./screens/WebBuilder'),\n importPaths: {\n navigationHeader: () => import('./components/NavigationHeader/NavigationHeader'),\n },\n customHeader: {\n name: 'NavigationHeader',\n component: '$.importPaths.navigationHeader',\n props: {\n showTitle: true,\n showToggle: false,\n showFilter: false,\n isSearchBack: false,\n showBack: true,\n showGateway: false,\n showHistory: false,\n showNewChat: false,\n },\n },\n props: {\n initialParams: { orgName: null, url: null, channelId: null, projectId: null, message: null },\n options: {\n title: 'Web Builder',\n headerTintColor: 'black',\n headerTitleStyle: {\n fontWeight: 'bold',\n },\n // Reachable only via Build-mode submit — never list in the drawer.\n drawerItemStyle: { display: 'none' },\n headerTitleAlign: 'left',\n gestureEnabled: false,\n swipeEnabled: false,\n animation: 'fade',\n animationTypeForReplace: 'pop',\n },\n },\n },\n];\n\nconst selectedRoutes = ['home', 'chat', 'chathistory', 'webbuilder'];\n\nconst filteredRoutes = getFilteredRoutes(yantraMobilePageStore, selectedRoutes);\n\nexport { filteredRoutes };\n"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  const CDECLI_GATEWAY = {
2
- name: "CDeCLI",
3
- description: "CDeCLI agent and skills",
2
+ name: "Yantra",
3
+ description: "Default cdecli-serve gateway for AI chat routing.",
4
4
  channelType: "cdecli-serve",
5
5
  extensionId: "",
6
6
  icon: "terminal",
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sources":["../../src/config/constants.ts"],"sourcesContent":["/** Minimal gateway types for mobile — aligned with account/browser. */\n\nexport type GatewayId = string;\n\nexport interface GatewayEntry {\n name: string;\n description: string;\n channelType: string;\n extensionId: string;\n icon: string;\n isBuiltin: boolean;\n priority: number;\n endpoint?: string;\n persistenceMode?: 'backend' | 'frontend';\n}\n\n/** CDeCLI / cdecli-serve (hosted agent). */\nconst CDECLI_GATEWAY: GatewayEntry = {\n name: 'CDeCLI',\n description: 'CDeCLI agent and skills',\n channelType: 'cdecli-serve',\n extensionId: '',\n icon: 'terminal',\n isBuiltin: true,\n priority: 90,\n /** Server persists chat posts via gateway — client must not call `saveMessages`. */\n persistenceMode: 'backend',\n};\n\n/** Built-in gateways when UiLayout settings are not loaded (e.g. React Native). */\nexport const BUILTIN_MOBILE_GATEWAYS: Record<string, GatewayEntry> = {\n cdecli: CDECLI_GATEWAY,\n};\n\nexport const STORAGE_KEYS = {\n GATEWAY_SELECTION: 'yantra_gateway_selection',\n} as const;\n\n/** Maximum concurrent agent tasks (same cap as browser). */\nexport const MAX_CONCURRENT_TASKS = 3;\n"],"names":[],"mappings":"AAgBA,MAAM,cAA+B,GAAA;AAAA,EACnC,IAAM,EAAA,QAAA;AAAA,EACN,WAAa,EAAA,yBAAA;AAAA,EACb,WAAa,EAAA,cAAA;AAAA,EACb,WAAa,EAAA,EAAA;AAAA,EACb,IAAM,EAAA,UAAA;AAAA,EACN,SAAW,EAAA,IAAA;AAAA,EACX,QAAU,EAAA,EAAA;AAAA;AAAA,EAEV,eAAiB,EAAA;AACnB,CAAA;AAGO,MAAM,uBAAwD,GAAA;AAAA,EACnE,MAAQ,EAAA;AACV;AACO,MAAM,YAAe,GAAA;AAAA,EAC1B,iBAAmB,EAAA;AACrB;AAGO,MAAM,oBAAuB,GAAA"}
1
+ {"version":3,"file":"constants.js","sources":["../../src/config/constants.ts"],"sourcesContent":["/** Minimal gateway types for mobile — aligned with account/browser. */\n\nexport type GatewayId = string;\n\nexport interface GatewayEntry {\n name: string;\n description: string;\n channelType: string;\n extensionId: string;\n icon: string;\n isBuiltin: boolean;\n priority: number;\n endpoint?: string;\n persistenceMode?: 'backend' | 'frontend';\n}\n\n/** CDeCLI / cdecli-serve (hosted agent). Display name matches the browser registry. */\nconst CDECLI_GATEWAY: GatewayEntry = {\n name: 'Yantra',\n description: 'Default cdecli-serve gateway for AI chat routing.',\n channelType: 'cdecli-serve',\n extensionId: '',\n icon: 'terminal',\n isBuiltin: true,\n priority: 90,\n /** Server persists chat posts via gateway — client must not call `saveMessages`. */\n persistenceMode: 'backend',\n};\n\n/** Built-in gateways when UiLayout settings are not loaded (e.g. React Native). */\nexport const BUILTIN_MOBILE_GATEWAYS: Record<string, GatewayEntry> = {\n cdecli: CDECLI_GATEWAY,\n};\n\nexport const STORAGE_KEYS = {\n GATEWAY_SELECTION: 'yantra_gateway_selection',\n} as const;\n\n/** Maximum concurrent agent tasks (same cap as browser). */\nexport const MAX_CONCURRENT_TASKS = 3;\n"],"names":[],"mappings":"AAgBA,MAAM,cAA+B,GAAA;AAAA,EACnC,IAAM,EAAA,QAAA;AAAA,EACN,WAAa,EAAA,mDAAA;AAAA,EACb,WAAa,EAAA,cAAA;AAAA,EACb,WAAa,EAAA,EAAA;AAAA,EACb,IAAM,EAAA,UAAA;AAAA,EACN,SAAW,EAAA,IAAA;AAAA,EACX,QAAU,EAAA,EAAA;AAAA;AAAA,EAEV,eAAiB,EAAA;AACnB,CAAA;AAGO,MAAM,uBAAwD,GAAA;AAAA,EACnE,MAAQ,EAAA;AACV;AACO,MAAM,YAAe,GAAA;AAAA,EAC1B,iBAAmB,EAAA;AACrB;AAGO,MAAM,oBAAuB,GAAA"}
@@ -1,4 +1,4 @@
1
- import {jsx}from'react/jsx-runtime';import {createContext,useState,useEffect,useCallback,useMemo,useContext}from'react';import {useGatewayRegistry}from'../hooks/useGatewayRegistry.js';import {GatewaySelectionStorage}from'../utils/gatewaySelectionStorage.js';const GatewayContext = createContext(null);
1
+ import {jsx}from'react/jsx-runtime';import {useContext,createContext,useState,useEffect,useCallback,useMemo}from'react';import {useGatewayRegistry}from'../hooks/useGatewayRegistry.js';import {GatewaySelectionStorage}from'../utils/gatewaySelectionStorage.js';const GatewayContext = createContext(null);
2
2
  GatewayContext.displayName = "GatewayContext";
3
3
  function GatewayContextProvider({
4
4
  children
@@ -0,0 +1,153 @@
1
+ const MOBILE_APP_CATALOG = [{
2
+ key: "design",
3
+ label: "Design",
4
+ icon: "palette-outline",
5
+ group: "Create",
6
+ prompt: "Design a 10-slide pitch deck for a coffee subscription startup"
7
+ }, {
8
+ key: "canvas",
9
+ label: "Canvas",
10
+ icon: "view-grid-outline",
11
+ group: "Create",
12
+ prompt: "Open a canvas and help me lay out the assets for this project."
13
+ }, {
14
+ key: "webbuilder",
15
+ label: "Web Builder",
16
+ icon: "application-outline",
17
+ group: "Create",
18
+ prompt: "Build a landing page for my bakery with a menu and a contact form",
19
+ nativeRoute: "webbuilder"
20
+ }, {
21
+ key: "paper2poster",
22
+ label: "Paper 2 Poster",
23
+ icon: "presentation",
24
+ group: "Create",
25
+ prompt: "Turn this research paper into a conference poster I can edit."
26
+ }, {
27
+ key: "codezen",
28
+ label: "Codezen",
29
+ icon: "code-braces",
30
+ group: "Create",
31
+ prompt: "Clone my repository and fix the failing test"
32
+ }, {
33
+ key: "character",
34
+ label: "Characters",
35
+ icon: "drama-masks",
36
+ group: "Create",
37
+ prompt: "Create a stoic philosophy mentor character I can chat with"
38
+ }, {
39
+ key: "workflow",
40
+ label: "Workflow",
41
+ icon: "sitemap",
42
+ group: "Automate",
43
+ prompt: "Build a workflow that runs every morning and sends me a summary of what changed."
44
+ }, {
45
+ key: "computer",
46
+ label: "Computer",
47
+ icon: "monitor",
48
+ group: "Automate",
49
+ prompt: "Open a browser and compare the top 5 CRM tools with screenshots"
50
+ }, {
51
+ key: "crm",
52
+ label: "CRM",
53
+ icon: "account-group-outline",
54
+ group: "Sell",
55
+ prompt: "Look at my pipeline and tell me which deals are going cold and what I should send them."
56
+ }, {
57
+ key: "salesiq",
58
+ label: "SalesIQ",
59
+ icon: "radar",
60
+ group: "Sell",
61
+ prompt: "Show me who is on my website right now"
62
+ }, {
63
+ key: "inbox",
64
+ label: "Inbox",
65
+ icon: "inbox-outline",
66
+ group: "Sell",
67
+ prompt: "Go through my inbox, tell me what actually needs a reply, and draft those replies."
68
+ }, {
69
+ key: "mailcampaign",
70
+ label: "Mail Campaigns",
71
+ icon: "bullhorn-outline",
72
+ group: "Sell",
73
+ prompt: "Draft an email campaign announcing what we shipped this month."
74
+ }, {
75
+ key: "expenses",
76
+ label: "Expenses",
77
+ icon: "receipt-outline",
78
+ group: "Money",
79
+ prompt: "Summarise my spend this month and flag anything unusual."
80
+ }, {
81
+ key: "cards-wallet",
82
+ label: "Cards & Wallet",
83
+ icon: "credit-card-outline",
84
+ group: "Money",
85
+ prompt: "Issue a $200 virtual card for monthly ad spend"
86
+ }, {
87
+ key: "billing",
88
+ label: "Billing",
89
+ icon: "currency-usd",
90
+ group: "Money",
91
+ prompt: "Create an invoice for a $2,400 consulting project"
92
+ }, {
93
+ key: "kpi-motivation",
94
+ label: "KPI Motivation",
95
+ icon: "trophy-outline",
96
+ group: "Team",
97
+ prompt: "Set up a weekly sales KPI scoreboard for my team"
98
+ }, {
99
+ key: "issue-ticket",
100
+ label: "Issue Ticket",
101
+ icon: "bug-outline",
102
+ group: "Team",
103
+ prompt: "Create a bug board and triage my open issues"
104
+ }, {
105
+ key: "notebook",
106
+ label: "Study",
107
+ icon: "school-outline",
108
+ group: "Team",
109
+ prompt: "Make a study guide from my lecture notes"
110
+ }, {
111
+ key: "resume",
112
+ label: "Resume",
113
+ icon: "file-account-outline",
114
+ group: "Team",
115
+ prompt: "Draft a resume for a senior product designer with 8 years of experience"
116
+ }, {
117
+ key: "job-search",
118
+ label: "Job Search",
119
+ icon: "briefcase-outline",
120
+ group: "Team",
121
+ prompt: "Find remote senior backend engineer roles and tailor my resume for one"
122
+ }, {
123
+ key: "shop",
124
+ label: "Shop",
125
+ icon: "cart-outline",
126
+ group: "More",
127
+ prompt: "Compare the best options for what I need and show me the tradeoffs."
128
+ }, {
129
+ key: "travel",
130
+ label: "Travel",
131
+ icon: "airplane",
132
+ group: "More",
133
+ prompt: "Plan a 4-day trip for me: flights, somewhere to stay, and what to do each day."
134
+ }, {
135
+ key: "social-events",
136
+ label: "yantra.live",
137
+ icon: "ticket-outline",
138
+ group: "More",
139
+ prompt: "What concerts are happening nearby this weekend?"
140
+ }];
141
+ const APP_GROUP_ORDER = ["Create", "Automate", "Sell", "Money", "Team", "More"];
142
+ function matchesAppQuery(label, query) {
143
+ const q = query.toLowerCase().replace(/[^a-z0-9]/g, "");
144
+ if (!q) return true;
145
+ return label.toLowerCase().replace(/[^a-z0-9]/g, "").includes(q);
146
+ }
147
+ function groupMobileApps(items, query) {
148
+ const hits = items.filter((item) => matchesAppQuery(item.label, query));
149
+ return APP_GROUP_ORDER.map((label) => ({
150
+ label,
151
+ items: hits.filter((item) => item.group === label)
152
+ })).filter((group) => group.items.length > 0);
153
+ }export{APP_GROUP_ORDER,MOBILE_APP_CATALOG,groupMobileApps,matchesAppQuery};//# sourceMappingURL=mobileAppCatalog.js.map
@@ -0,0 +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' | '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 /** Native stack route, if this surface already exists on mobile. */\n nativeRoute?: 'webbuilder';\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 },\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 },\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 },\n {\n key: 'paper2poster',\n label: 'Paper 2 Poster',\n icon: 'presentation',\n group: 'Create',\n prompt: 'Turn this research paper into a conference poster I can edit.',\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 },\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 },\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 },\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 },\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 },\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 },\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 },\n {\n key: 'expenses',\n label: 'Expenses',\n icon: 'receipt-outline',\n group: 'Money',\n prompt: 'Summarise my spend this month and flag anything unusual.',\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 },\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 },\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 },\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 },\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 },\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 },\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 },\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 },\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 },\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 },\n];\n\nexport const APP_GROUP_ORDER: readonly AppGroupId[] = ['Create', 'Automate', 'Sell', 'Money', 'Team', 'More'];\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\nexport function groupMobileApps(items: readonly MobileAppItem[], query: string) {\n const hits = 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"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ import { describe, expect, it } from '@jest/globals';
2
+ import { extractMarketplaceTemplateGroups, resolveGroupTemplatesPayload } from '../buildTemplateCards';
3
+
4
+ describe('extractMarketplaceTemplateGroups', () => {
5
+ it('lists top-level marketplace groups', () => {
6
+ const groups = extractMarketplaceTemplateGroups({
7
+ aiTemplates: {},
8
+ codeAssistant: {},
9
+ designSystems: {},
10
+ });
11
+ expect(groups.map((group) => group.id)).toEqual(['aiTemplates', 'codeAssistant']);
12
+ expect(groups[0].label).toBe('Ai Templates');
13
+ expect(groups[1].label).toBe('Code Assistant');
14
+ });
15
+
16
+ it('does not treat nested template keys as groups after a cards-cache swap', () => {
17
+ const groups = extractMarketplaceTemplateGroups({
18
+ 'aieditor-for-vite': {
19
+ forms: { default: { title: 'Aieditor For Vite', previewUrl: 'https://example.com' } },
20
+ },
21
+ 'db-github-model': {
22
+ forms: { default: { title: 'Db Github', snapshotId: 'snap-1' } },
23
+ },
24
+ });
25
+ expect(groups).toEqual([]);
26
+ });
27
+
28
+ it('drops grafted sibling namespaces', () => {
29
+ const groups = extractMarketplaceTemplateGroups({
30
+ figma: {},
31
+ marketplace: { templates: { codeAssistant: {} } },
32
+ aisearch: { integration: {} },
33
+ });
34
+ expect(groups.map((group) => group.id)).toEqual(['codeAssistant', 'figma']);
35
+ });
36
+ });
37
+
38
+ describe('resolveGroupTemplatesPayload', () => {
39
+ it('lifts the selected group when the cache still holds the full map', () => {
40
+ const payload = {
41
+ codeAssistant: {
42
+ 'aieditor-for-vite': { forms: { default: { title: 'Vite' } } },
43
+ },
44
+ aiTemplates: {
45
+ 'other-form': { forms: { default: { title: 'Other' } } },
46
+ },
47
+ };
48
+ expect(resolveGroupTemplatesPayload(payload, 'codeAssistant')).toEqual(payload.codeAssistant);
49
+ });
50
+
51
+ it('returns the payload as-is when it is already the group contents', () => {
52
+ const payload = {
53
+ 'aieditor-for-vite': { forms: { default: { title: 'Vite' } } },
54
+ };
55
+ expect(resolveGroupTemplatesPayload(payload, 'codeAssistant')).toBe(payload);
56
+ });
57
+ });
@@ -65,14 +65,28 @@ function normalizeMarketplaceTemplatesPayload(payload) {
65
65
  ]);
66
66
  return __spreadValues(__spreadValues({}, leanGroups), grafted);
67
67
  }
68
+ const GRAFTED_NAMESPACE_KEYS = /* @__PURE__ */ new Set(["marketplace", "aisearch", "credential", "appSettings"]);
69
+ function isTemplateShapedEntry(value) {
70
+ if (value.forms && typeof value.forms === "object") return true;
71
+ if (typeof value.templateName === "string" && (value.formId || value.formExtensionId)) return true;
72
+ return false;
73
+ }
74
+ function payloadLooksLikeGroupContents(groupsMap) {
75
+ const values = Object.entries(groupsMap).filter(([key, value]) => value && typeof value === "object" && !GRAFTED_NAMESPACE_KEYS.has(key) && key !== "designSystems");
76
+ if (values.length === 0) return false;
77
+ const templateCount = values.filter(([, value]) => isTemplateShapedEntry(value)).length;
78
+ return templateCount > 0 && templateCount >= Math.ceil(values.length / 2);
79
+ }
68
80
  function extractMarketplaceTemplateGroups(payload) {
69
81
  const raw = unwrapSettingsPayload(payload);
70
82
  if (!raw) return [];
71
83
  const groupsMap = normalizeMarketplaceTemplatesPayload(raw);
84
+ if (payloadLooksLikeGroupContents(groupsMap)) return [];
72
85
  const groups = [];
73
86
  Object.entries(groupsMap).forEach(([groupKey, groupValue]) => {
74
87
  if (!groupValue || typeof groupValue !== "object") return;
75
- if (groupKey === "designSystems") return;
88
+ if (groupKey === "designSystems" || GRAFTED_NAMESPACE_KEYS.has(groupKey)) return;
89
+ if (isTemplateShapedEntry(groupValue)) return;
76
90
  groups.push({
77
91
  id: groupKey,
78
92
  label: humanizeGroupKey(groupKey),
@@ -82,6 +96,18 @@ function extractMarketplaceTemplateGroups(payload) {
82
96
  });
83
97
  return groups.sort((a, b) => a.label.localeCompare(b.label));
84
98
  }
99
+ function resolveGroupTemplatesPayload(payload, group) {
100
+ const selectedGroup = group.trim();
101
+ if (!selectedGroup) return payload;
102
+ const raw = unwrapSettingsPayload(payload);
103
+ if (!raw) return payload;
104
+ const normalized = normalizeMarketplaceTemplatesPayload(raw);
105
+ const nested = normalized[selectedGroup];
106
+ if (nested && typeof nested === "object" && !isTemplateShapedEntry(nested)) {
107
+ return nested;
108
+ }
109
+ return payload;
110
+ }
85
111
  function resolveSettingsUrl(form, parentGroup, key) {
86
112
  const direct = toNonEmptyString(form[key]);
87
113
  if (direct) return direct;
@@ -147,4 +173,4 @@ function extractGroupTemplateCards(payload) {
147
173
  }
148
174
  }
149
175
  return [...bestByUrl.values()].sort((a, b) => a.title.localeCompare(b.title));
150
- }export{extractGroupTemplateCards,extractMarketplaceTemplateGroups,normalizeMarketplaceTemplatesPayload,unwrapSettingsPayload};//# sourceMappingURL=buildTemplateCards.js.map
176
+ }export{extractGroupTemplateCards,extractMarketplaceTemplateGroups,normalizeMarketplaceTemplatesPayload,resolveGroupTemplatesPayload,unwrapSettingsPayload};//# sourceMappingURL=buildTemplateCards.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"buildTemplateCards.js","sources":["../../../src/features/templates/buildTemplateCards.ts"],"sourcesContent":["/**\n * Marketplace template helpers for mobile Build mode.\n * Mirrors browser `codeAssistantDefaultTemplates` / webbuilder `listCodeAssistantTemplates`\n * without pulling in browser-only marketplace packages.\n */\n\nexport type MarketplaceTemplateGroup = {\n id: string;\n label: string;\n description?: string;\n category: string;\n};\n\nexport type BuildTemplateCard = {\n id: string;\n title: string;\n description: string;\n category?: string;\n coverImageUrl?: string;\n previewUrl?: string;\n deployUrl?: string;\n chatPrompt?: string;\n snapshotId?: string;\n templateKey?: string;\n /** Stack hint (`vite-react` | `nextjs` | …) when present on the form/group. */\n templateName?: string;\n formTemplateId?: string;\n};\n\nfunction toNonEmptyString(value: unknown): string {\n return typeof value === 'string' ? value.trim() : '';\n}\n\nfunction isSettingsEntryDisabled(value: Record<string, unknown>): boolean {\n return value.enabled === false || value.enabled === 'false' || value.enable === false || value.enable === 'false';\n}\n\nfunction humanizeGroupKey(key: string): string {\n const spaced = key\n .replace(/([a-z0-9])([A-Z])/g, '$1 $2')\n .replace(/[_-]+/g, ' ')\n .trim();\n if (!spaced) return key;\n return spaced.replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n\nfunction humanizeFormKey(key: string): string {\n return humanizeGroupKey(key);\n}\n\n/** Unwrap immediate-mode `{ settings, keysPage, keys }` payloads to the settings map. */\nexport function unwrapSettingsPayload(payload: unknown): Record<string, unknown> | null {\n const wrapper = payload as Record<string, unknown> | undefined;\n if (!wrapper || typeof wrapper !== 'object') return null;\n if (wrapper.settings && typeof wrapper.settings === 'object') {\n return wrapper.settings as Record<string, unknown>;\n }\n return wrapper;\n}\n\n/**\n * Lift grafted `marketplace.templates` over lean route payloads (browser parity).\n */\nexport function normalizeMarketplaceTemplatesPayload(payload: Record<string, unknown>): Record<string, unknown> {\n const grafted = (payload as { marketplace?: { templates?: unknown } })?.marketplace?.templates;\n if (!grafted || typeof grafted !== 'object') return payload;\n const {\n marketplace: _marketplace,\n aisearch: _aisearch,\n credential: _credential,\n appSettings: _appSettings,\n ...leanGroups\n } = payload;\n return { ...leanGroups, ...(grafted as Record<string, unknown>) };\n}\n\nexport function extractMarketplaceTemplateGroups(payload: unknown): MarketplaceTemplateGroup[] {\n const raw = unwrapSettingsPayload(payload);\n if (!raw) return [];\n const groupsMap = normalizeMarketplaceTemplatesPayload(raw);\n const groups: MarketplaceTemplateGroup[] = [];\n\n Object.entries(groupsMap).forEach(([groupKey, groupValue]) => {\n if (!groupValue || typeof groupValue !== 'object') return;\n if (groupKey === 'designSystems') return;\n groups.push({\n id: groupKey,\n label: humanizeGroupKey(groupKey),\n description: toNonEmptyString((groupValue as Record<string, unknown>).description) || undefined,\n category: 'Assistant',\n });\n });\n\n return groups.sort((a, b) => a.label.localeCompare(b.label));\n}\n\nfunction resolveSettingsUrl(\n form: Record<string, unknown>,\n parentGroup: Record<string, unknown> | undefined,\n key: string,\n): string | undefined {\n const direct = toNonEmptyString(form[key]);\n if (direct) return direct;\n const inherited = parentGroup ? toNonEmptyString(parentGroup[key]) : '';\n return inherited || undefined;\n}\n\nfunction resolveCoverImageUrl(\n form: Record<string, unknown>,\n parentGroup?: Record<string, unknown>,\n): string | undefined {\n return (\n toNonEmptyString(form.coverImageUrl) ||\n toNonEmptyString(form.previewImageUrl) ||\n toNonEmptyString(parentGroup?.coverImageUrl) ||\n undefined\n );\n}\n\nfunction formHasOwnPreviewableUrl(form: Record<string, unknown>): boolean {\n return Boolean(toNonEmptyString(form.previewUrl) || toNonEmptyString(form.deployUrl));\n}\n\nfunction resolveSnapshotId(form: Record<string, unknown>, group?: Record<string, unknown>): string | undefined {\n return (\n toNonEmptyString(form.snapshotId) ||\n toNonEmptyString(form.sourceSnapshotId) ||\n (group ? toNonEmptyString(group.snapshotId) : '') ||\n undefined\n );\n}\n\nfunction resolveStackHint(form: Record<string, unknown>, group?: Record<string, unknown>): string | undefined {\n return (\n toNonEmptyString(form.templateName) ||\n toNonEmptyString(form.projectType) ||\n (group ? toNonEmptyString(group.templateName) : '') ||\n undefined\n );\n}\n\n/**\n * Map `marketplace.templates.<group>` → remixable cards (preview/deploy URL required).\n */\nexport function extractGroupTemplateCards(payload: unknown): BuildTemplateCard[] {\n const groupObj = unwrapSettingsPayload(payload);\n if (!groupObj) return [];\n\n const raw: BuildTemplateCard[] = [];\n\n Object.entries(groupObj).forEach(([templateKey, templateGroup]) => {\n if (!templateGroup || typeof templateGroup !== 'object') return;\n const group = templateGroup as Record<string, unknown>;\n if (isSettingsEntryDisabled(group)) return;\n\n const { forms } = group;\n if (!forms || typeof forms !== 'object') return;\n\n Object.entries(forms as Record<string, unknown>).forEach(([formKey, formRaw]) => {\n if (!formRaw || typeof formRaw !== 'object') return;\n const form = formRaw as Record<string, unknown>;\n if (isSettingsEntryDisabled(form)) return;\n if (!formHasOwnPreviewableUrl(form) && !resolveSnapshotId(form, group)) return;\n\n const formTemplateId = toNonEmptyString(form.formTemplateId);\n const ownTitle = toNonEmptyString(form.title);\n const title = ownTitle || humanizeFormKey(formKey) || 'Untitled';\n const id = formTemplateId || formKey;\n\n raw.push({\n id,\n title,\n description: toNonEmptyString(form.description) || 'Yantra starter template',\n category: toNonEmptyString(form.category) || undefined,\n coverImageUrl: resolveCoverImageUrl(form, group),\n previewUrl: resolveSettingsUrl(form, group, 'previewUrl'),\n deployUrl: resolveSettingsUrl(form, group, 'deployUrl'),\n chatPrompt: toNonEmptyString(form.chatPrompt) || undefined,\n snapshotId: resolveSnapshotId(form, group),\n templateKey,\n templateName: resolveStackHint(form, group),\n formTemplateId: formTemplateId || undefined,\n });\n });\n });\n\n // Dedupe by preview/deploy URL — titled card wins.\n const bestByUrl = new Map<string, BuildTemplateCard>();\n for (const card of raw) {\n const key = (card.previewUrl || card.deployUrl || card.snapshotId || card.id).toLowerCase();\n const existing = bestByUrl.get(key);\n if (!existing || (card.title && card.title.length > (existing.title?.length ?? 0))) {\n bestByUrl.set(key, card);\n }\n }\n\n return [...bestByUrl.values()].sort((a, b) => a.title.localeCompare(b.title));\n}\n\nexport function defaultCloneTemplateDescription(templateDetailTitle: string): string {\n const title = templateDetailTitle.trim() || 'Template';\n return `Create project based on ${title} template`;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BA,SAAS,iBAAiB,KAAwB,EAAA;AAChD,EAAA,OAAO,OAAO,KAAA,KAAU,QAAW,GAAA,KAAA,CAAM,MAAS,GAAA,EAAA;AACpD;AACA,SAAS,wBAAwB,KAAyC,EAAA;AACxE,EAAO,OAAA,KAAA,CAAM,OAAY,KAAA,KAAA,IAAS,KAAM,CAAA,OAAA,KAAY,WAAW,KAAM,CAAA,MAAA,KAAW,KAAS,IAAA,KAAA,CAAM,MAAW,KAAA,OAAA;AAC5G;AACA,SAAS,iBAAiB,GAAqB,EAAA;AAC7C,EAAM,MAAA,MAAA,GAAS,GAAI,CAAA,OAAA,CAAQ,oBAAsB,EAAA,OAAO,EAAE,OAAQ,CAAA,QAAA,EAAU,GAAG,CAAA,CAAE,IAAK,EAAA;AACtF,EAAI,IAAA,CAAC,QAAe,OAAA,GAAA;AACpB,EAAA,OAAO,OAAO,OAAQ,CAAA,OAAA,EAAS,CAAK,CAAA,KAAA,CAAA,CAAE,aAAa,CAAA;AACrD;AACA,SAAS,gBAAgB,GAAqB,EAAA;AAC5C,EAAA,OAAO,iBAAiB,GAAG,CAAA;AAC7B;AAGO,SAAS,sBAAsB,OAAkD,EAAA;AACtF,EAAA,MAAM,OAAU,GAAA,OAAA;AAChB,EAAA,IAAI,CAAC,OAAA,IAAW,OAAO,OAAA,KAAY,UAAiB,OAAA,IAAA;AACpD,EAAA,IAAI,OAAQ,CAAA,QAAA,IAAY,OAAO,OAAA,CAAQ,aAAa,QAAU,EAAA;AAC5D,IAAA,OAAO,OAAQ,CAAA,QAAA;AAAA;AAEjB,EAAO,OAAA,OAAA;AACT;AAKO,SAAS,qCAAqC,OAA2D,EAAA;AAvDhH,EAAA,IAAA,EAAA;AAwDE,EAAM,MAAA,OAAA,GAAA,CAAW,EAIb,GAAA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAA,WAAA,KAJa,IAIA,GAAA,MAAA,GAAA,EAAA,CAAA,SAAA;AACjB,EAAA,IAAI,CAAC,OAAA,IAAW,OAAO,OAAA,KAAY,UAAiB,OAAA,OAAA;AACpD,EAAA,MAMI,EALF,GAAA,OAAA,EAAA;AAAA,IAAa,WAAA,EAAA,YAAA;AAAA,IACb,QAAU,EAAA,SAAA;AAAA,IACV,UAAY,EAAA,WAAA;AAAA,IACZ,WAAa,EAAA;AAAA,GAlEjB,GAoEM,EADC,EAAA,UAAA,GAAA,SAAA,CACD,EADC,EAAA;AAAA,IAJH,aAAA;AAAA,IACA,UAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GAAA,CAAA;AAGF,EAAA,OAAO,kCACF,UACC,CAAA,EAAA,OAAA,CAAA;AAER;AACO,SAAS,iCAAiC,OAA8C,EAAA;AAC7F,EAAM,MAAA,GAAA,GAAM,sBAAsB,OAAO,CAAA;AACzC,EAAI,IAAA,CAAC,GAAK,EAAA,OAAO,EAAC;AAClB,EAAM,MAAA,SAAA,GAAY,qCAAqC,GAAG,CAAA;AAC1D,EAAA,MAAM,SAAqC,EAAC;AAC5C,EAAO,MAAA,CAAA,OAAA,CAAQ,SAAS,CAAE,CAAA,OAAA,CAAQ,CAAC,CAAC,QAAA,EAAU,UAAU,CAAM,KAAA;AAC5D,IAAA,IAAI,CAAC,UAAA,IAAc,OAAO,UAAA,KAAe,QAAU,EAAA;AACnD,IAAA,IAAI,aAAa,eAAiB,EAAA;AAClC,IAAA,MAAA,CAAO,IAAK,CAAA;AAAA,MACV,EAAI,EAAA,QAAA;AAAA,MACJ,KAAA,EAAO,iBAAiB,QAAQ,CAAA;AAAA,MAChC,WAAa,EAAA,gBAAA,CAAkB,UAAuC,CAAA,WAAW,CAAK,IAAA,MAAA;AAAA,MACtF,QAAU,EAAA;AAAA,KACX,CAAA;AAAA,GACF,CAAA;AACD,EAAO,OAAA,MAAA,CAAO,IAAK,CAAA,CAAC,CAAG,EAAA,CAAA,KAAM,EAAE,KAAM,CAAA,aAAA,CAAc,CAAE,CAAA,KAAK,CAAC,CAAA;AAC7D;AACA,SAAS,kBAAA,CAAmB,IAA+B,EAAA,WAAA,EAAkD,GAAiC,EAAA;AAC5I,EAAA,MAAM,MAAS,GAAA,gBAAA,CAAiB,IAAK,CAAA,GAAG,CAAC,CAAA;AACzC,EAAA,IAAI,QAAe,OAAA,MAAA;AACnB,EAAA,MAAM,YAAY,WAAc,GAAA,gBAAA,CAAiB,WAAY,CAAA,GAAG,CAAC,CAAI,GAAA,EAAA;AACrE,EAAA,OAAO,SAAa,IAAA,MAAA;AACtB;AACA,SAAS,oBAAA,CAAqB,MAA+B,WAA2D,EAAA;AACtH,EAAO,OAAA,gBAAA,CAAiB,IAAK,CAAA,aAAa,CAAK,IAAA,gBAAA,CAAiB,IAAK,CAAA,eAAe,CAAK,IAAA,gBAAA,CAAiB,WAAa,IAAA,IAAA,GAAA,MAAA,GAAA,WAAA,CAAA,aAAa,CAAK,IAAA,MAAA;AAC3I;AACA,SAAS,yBAAyB,IAAwC,EAAA;AACxE,EAAO,OAAA,OAAA,CAAQ,iBAAiB,IAAK,CAAA,UAAU,KAAK,gBAAiB,CAAA,IAAA,CAAK,SAAS,CAAC,CAAA;AACtF;AACA,SAAS,iBAAA,CAAkB,MAA+B,KAAqD,EAAA;AAC7G,EAAA,OAAO,gBAAiB,CAAA,IAAA,CAAK,UAAU,CAAA,IAAK,gBAAiB,CAAA,IAAA,CAAK,gBAAgB,CAAA,KAAM,KAAQ,GAAA,gBAAA,CAAiB,KAAM,CAAA,UAAU,IAAI,EAAO,CAAA,IAAA,MAAA;AAC9I;AACA,SAAS,gBAAA,CAAiB,MAA+B,KAAqD,EAAA;AAC5G,EAAA,OAAO,gBAAiB,CAAA,IAAA,CAAK,YAAY,CAAA,IAAK,gBAAiB,CAAA,IAAA,CAAK,WAAW,CAAA,KAAM,KAAQ,GAAA,gBAAA,CAAiB,KAAM,CAAA,YAAY,IAAI,EAAO,CAAA,IAAA,MAAA;AAC7I;AAKO,SAAS,0BAA0B,OAAuC,EAAA;AAjHjF,EAAA,IAAA,EAAA,EAAA,EAAA;AAkHE,EAAM,MAAA,QAAA,GAAW,sBAAsB,OAAO,CAAA;AAC9C,EAAI,IAAA,CAAC,QAAU,EAAA,OAAO,EAAC;AACvB,EAAA,MAAM,MAA2B,EAAC;AAClC,EAAO,MAAA,CAAA,OAAA,CAAQ,QAAQ,CAAE,CAAA,OAAA,CAAQ,CAAC,CAAC,WAAA,EAAa,aAAa,CAAM,KAAA;AACjE,IAAA,IAAI,CAAC,aAAA,IAAiB,OAAO,aAAA,KAAkB,QAAU,EAAA;AACzD,IAAA,MAAM,KAAQ,GAAA,aAAA;AACd,IAAI,IAAA,uBAAA,CAAwB,KAAK,CAAG,EAAA;AACpC,IAAM,MAAA;AAAA,MACJ;AAAA,KACE,GAAA,KAAA;AACJ,IAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAU,EAAA;AACzC,IAAO,MAAA,CAAA,OAAA,CAAQ,KAAgC,CAAE,CAAA,OAAA,CAAQ,CAAC,CAAC,OAAA,EAAS,OAAO,CAAM,KAAA;AAC/E,MAAA,IAAI,CAAC,OAAA,IAAW,OAAO,OAAA,KAAY,QAAU,EAAA;AAC7C,MAAA,MAAM,IAAO,GAAA,OAAA;AACb,MAAI,IAAA,uBAAA,CAAwB,IAAI,CAAG,EAAA;AACnC,MAAI,IAAA,CAAC,yBAAyB,IAAI,CAAA,IAAK,CAAC,iBAAkB,CAAA,IAAA,EAAM,KAAK,CAAG,EAAA;AACxE,MAAM,MAAA,cAAA,GAAiB,gBAAiB,CAAA,IAAA,CAAK,cAAc,CAAA;AAC3D,MAAM,MAAA,QAAA,GAAW,gBAAiB,CAAA,IAAA,CAAK,KAAK,CAAA;AAC5C,MAAA,MAAM,KAAQ,GAAA,QAAA,IAAY,eAAgB,CAAA,OAAO,CAAK,IAAA,UAAA;AACtD,MAAA,MAAM,KAAK,cAAkB,IAAA,OAAA;AAC7B,MAAA,GAAA,CAAI,IAAK,CAAA;AAAA,QACP,EAAA;AAAA,QACA,KAAA;AAAA,QACA,WAAa,EAAA,gBAAA,CAAiB,IAAK,CAAA,WAAW,CAAK,IAAA,yBAAA;AAAA,QACnD,QAAU,EAAA,gBAAA,CAAiB,IAAK,CAAA,QAAQ,CAAK,IAAA,MAAA;AAAA,QAC7C,aAAA,EAAe,oBAAqB,CAAA,IAAA,EAAM,KAAK,CAAA;AAAA,QAC/C,UAAY,EAAA,kBAAA,CAAmB,IAAM,EAAA,KAAA,EAAO,YAAY,CAAA;AAAA,QACxD,SAAW,EAAA,kBAAA,CAAmB,IAAM,EAAA,KAAA,EAAO,WAAW,CAAA;AAAA,QACtD,UAAY,EAAA,gBAAA,CAAiB,IAAK,CAAA,UAAU,CAAK,IAAA,MAAA;AAAA,QACjD,UAAA,EAAY,iBAAkB,CAAA,IAAA,EAAM,KAAK,CAAA;AAAA,QACzC,WAAA;AAAA,QACA,YAAA,EAAc,gBAAiB,CAAA,IAAA,EAAM,KAAK,CAAA;AAAA,QAC1C,gBAAgB,cAAkB,IAAA;AAAA,OACnC,CAAA;AAAA,KACF,CAAA;AAAA,GACF,CAAA;AAGD,EAAM,MAAA,SAAA,uBAAgB,GAA+B,EAAA;AACrD,EAAA,KAAA,MAAW,QAAQ,GAAK,EAAA;AACtB,IAAM,MAAA,GAAA,GAAA,CAAO,KAAK,UAAc,IAAA,IAAA,CAAK,aAAa,IAAK,CAAA,UAAA,IAAc,IAAK,CAAA,EAAA,EAAI,WAAY,EAAA;AAC1F,IAAM,MAAA,QAAA,GAAW,SAAU,CAAA,GAAA,CAAI,GAAG,CAAA;AAClC,IAAA,IAAI,CAAC,QAAA,IAAY,IAAK,CAAA,KAAA,IAAS,IAAK,CAAA,KAAA,CAAM,MAAU,IAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,QAAA,CAAS,KAAT,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAgB,MAAhB,KAAA,IAAA,GAAA,EAAA,GAA0B,CAAI,CAAA,EAAA;AAChF,MAAU,SAAA,CAAA,GAAA,CAAI,KAAK,IAAI,CAAA;AAAA;AACzB;AAEF,EAAA,OAAO,CAAC,GAAG,SAAU,CAAA,MAAA,EAAQ,CAAE,CAAA,IAAA,CAAK,CAAC,CAAA,EAAG,MAAM,CAAE,CAAA,KAAA,CAAM,aAAc,CAAA,CAAA,CAAE,KAAK,CAAC,CAAA;AAC9E"}
1
+ {"version":3,"file":"buildTemplateCards.js","sources":["../../../src/features/templates/buildTemplateCards.ts"],"sourcesContent":["/**\n * Marketplace template helpers for mobile Build mode.\n * Mirrors browser `codeAssistantDefaultTemplates` / webbuilder `listCodeAssistantTemplates`\n * without pulling in browser-only marketplace packages.\n */\n\nexport type MarketplaceTemplateGroup = {\n id: string;\n label: string;\n description?: string;\n category: string;\n};\n\nexport type BuildTemplateCard = {\n id: string;\n title: string;\n description: string;\n category?: string;\n coverImageUrl?: string;\n previewUrl?: string;\n deployUrl?: string;\n chatPrompt?: string;\n snapshotId?: string;\n templateKey?: string;\n /** Stack hint (`vite-react` | `nextjs` | …) when present on the form/group. */\n templateName?: string;\n formTemplateId?: string;\n};\n\nfunction toNonEmptyString(value: unknown): string {\n return typeof value === 'string' ? value.trim() : '';\n}\n\nfunction isSettingsEntryDisabled(value: Record<string, unknown>): boolean {\n return value.enabled === false || value.enabled === 'false' || value.enable === false || value.enable === 'false';\n}\n\nfunction humanizeGroupKey(key: string): string {\n const spaced = key\n .replace(/([a-z0-9])([A-Z])/g, '$1 $2')\n .replace(/[_-]+/g, ' ')\n .trim();\n if (!spaced) return key;\n return spaced.replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n\nfunction humanizeFormKey(key: string): string {\n return humanizeGroupKey(key);\n}\n\n/** Unwrap immediate-mode `{ settings, keysPage, keys }` payloads to the settings map. */\nexport function unwrapSettingsPayload(payload: unknown): Record<string, unknown> | null {\n const wrapper = payload as Record<string, unknown> | undefined;\n if (!wrapper || typeof wrapper !== 'object') return null;\n if (wrapper.settings && typeof wrapper.settings === 'object') {\n return wrapper.settings as Record<string, unknown>;\n }\n return wrapper;\n}\n\n/**\n * Lift grafted `marketplace.templates` over lean route payloads (browser parity).\n */\nexport function normalizeMarketplaceTemplatesPayload(payload: Record<string, unknown>): Record<string, unknown> {\n const grafted = (payload as { marketplace?: { templates?: unknown } })?.marketplace?.templates;\n if (!grafted || typeof grafted !== 'object') return payload;\n const {\n marketplace: _marketplace,\n aisearch: _aisearch,\n credential: _credential,\n appSettings: _appSettings,\n ...leanGroups\n } = payload;\n return { ...leanGroups, ...(grafted as Record<string, unknown>) };\n}\n\nconst GRAFTED_NAMESPACE_KEYS = new Set(['marketplace', 'aisearch', 'credential', 'appSettings']);\n\n/** Template entries (not groups) expose a `forms` map or credential-style ids. */\nfunction isTemplateShapedEntry(value: Record<string, unknown>): boolean {\n if (value.forms && typeof value.forms === 'object') return true;\n if (typeof value.templateName === 'string' && (value.formId || value.formExtensionId)) return true;\n return false;\n}\n\n/**\n * After `marketplace.templates.<group>` loads, a shared settings cache can replace the\n * group map with that group's contents (`aieditor-…` keys). Those must not render as groups.\n */\nfunction payloadLooksLikeGroupContents(groupsMap: Record<string, unknown>): boolean {\n const values = Object.entries(groupsMap).filter(\n ([key, value]) =>\n value && typeof value === 'object' && !GRAFTED_NAMESPACE_KEYS.has(key) && key !== 'designSystems',\n );\n if (values.length === 0) return false;\n const templateCount = values.filter(([, value]) => isTemplateShapedEntry(value as Record<string, unknown>)).length;\n return templateCount > 0 && templateCount >= Math.ceil(values.length / 2);\n}\n\nexport function extractMarketplaceTemplateGroups(payload: unknown): MarketplaceTemplateGroup[] {\n const raw = unwrapSettingsPayload(payload);\n if (!raw) return [];\n const groupsMap = normalizeMarketplaceTemplatesPayload(raw);\n if (payloadLooksLikeGroupContents(groupsMap)) return [];\n\n const groups: MarketplaceTemplateGroup[] = [];\n\n Object.entries(groupsMap).forEach(([groupKey, groupValue]) => {\n if (!groupValue || typeof groupValue !== 'object') return;\n if (groupKey === 'designSystems' || GRAFTED_NAMESPACE_KEYS.has(groupKey)) return;\n if (isTemplateShapedEntry(groupValue as Record<string, unknown>)) return;\n groups.push({\n id: groupKey,\n label: humanizeGroupKey(groupKey),\n description: toNonEmptyString((groupValue as Record<string, unknown>).description) || undefined,\n category: 'Assistant',\n });\n });\n\n return groups.sort((a, b) => a.label.localeCompare(b.label));\n}\n\n/**\n * Cards fetch is scoped to `marketplace.templates.<group>`. If a shared cache still\n * returns the full group map, lift the selected group so extraction stays correct.\n */\nexport function resolveGroupTemplatesPayload(payload: unknown, group: string): unknown {\n const selectedGroup = group.trim();\n if (!selectedGroup) return payload;\n const raw = unwrapSettingsPayload(payload);\n if (!raw) return payload;\n const normalized = normalizeMarketplaceTemplatesPayload(raw);\n const nested = normalized[selectedGroup];\n if (nested && typeof nested === 'object' && !isTemplateShapedEntry(nested as Record<string, unknown>)) {\n return nested;\n }\n return payload;\n}\n\nfunction resolveSettingsUrl(\n form: Record<string, unknown>,\n parentGroup: Record<string, unknown> | undefined,\n key: string,\n): string | undefined {\n const direct = toNonEmptyString(form[key]);\n if (direct) return direct;\n const inherited = parentGroup ? toNonEmptyString(parentGroup[key]) : '';\n return inherited || undefined;\n}\n\nfunction resolveCoverImageUrl(\n form: Record<string, unknown>,\n parentGroup?: Record<string, unknown>,\n): string | undefined {\n return (\n toNonEmptyString(form.coverImageUrl) ||\n toNonEmptyString(form.previewImageUrl) ||\n toNonEmptyString(parentGroup?.coverImageUrl) ||\n undefined\n );\n}\n\nfunction formHasOwnPreviewableUrl(form: Record<string, unknown>): boolean {\n return Boolean(toNonEmptyString(form.previewUrl) || toNonEmptyString(form.deployUrl));\n}\n\nfunction resolveSnapshotId(form: Record<string, unknown>, group?: Record<string, unknown>): string | undefined {\n return (\n toNonEmptyString(form.snapshotId) ||\n toNonEmptyString(form.sourceSnapshotId) ||\n (group ? toNonEmptyString(group.snapshotId) : '') ||\n undefined\n );\n}\n\nfunction resolveStackHint(form: Record<string, unknown>, group?: Record<string, unknown>): string | undefined {\n return (\n toNonEmptyString(form.templateName) ||\n toNonEmptyString(form.projectType) ||\n (group ? toNonEmptyString(group.templateName) : '') ||\n undefined\n );\n}\n\n/**\n * Map `marketplace.templates.<group>` → remixable cards (preview/deploy URL required).\n */\nexport function extractGroupTemplateCards(payload: unknown): BuildTemplateCard[] {\n const groupObj = unwrapSettingsPayload(payload);\n if (!groupObj) return [];\n\n const raw: BuildTemplateCard[] = [];\n\n Object.entries(groupObj).forEach(([templateKey, templateGroup]) => {\n if (!templateGroup || typeof templateGroup !== 'object') return;\n const group = templateGroup as Record<string, unknown>;\n if (isSettingsEntryDisabled(group)) return;\n\n const { forms } = group;\n if (!forms || typeof forms !== 'object') return;\n\n Object.entries(forms as Record<string, unknown>).forEach(([formKey, formRaw]) => {\n if (!formRaw || typeof formRaw !== 'object') return;\n const form = formRaw as Record<string, unknown>;\n if (isSettingsEntryDisabled(form)) return;\n if (!formHasOwnPreviewableUrl(form) && !resolveSnapshotId(form, group)) return;\n\n const formTemplateId = toNonEmptyString(form.formTemplateId);\n const ownTitle = toNonEmptyString(form.title);\n const title = ownTitle || humanizeFormKey(formKey) || 'Untitled';\n const id = formTemplateId || formKey;\n\n raw.push({\n id,\n title,\n description: toNonEmptyString(form.description) || 'Yantra starter template',\n category: toNonEmptyString(form.category) || undefined,\n coverImageUrl: resolveCoverImageUrl(form, group),\n previewUrl: resolveSettingsUrl(form, group, 'previewUrl'),\n deployUrl: resolveSettingsUrl(form, group, 'deployUrl'),\n chatPrompt: toNonEmptyString(form.chatPrompt) || undefined,\n snapshotId: resolveSnapshotId(form, group),\n templateKey,\n templateName: resolveStackHint(form, group),\n formTemplateId: formTemplateId || undefined,\n });\n });\n });\n\n // Dedupe by preview/deploy URL — titled card wins.\n const bestByUrl = new Map<string, BuildTemplateCard>();\n for (const card of raw) {\n const key = (card.previewUrl || card.deployUrl || card.snapshotId || card.id).toLowerCase();\n const existing = bestByUrl.get(key);\n if (!existing || (card.title && card.title.length > (existing.title?.length ?? 0))) {\n bestByUrl.set(key, card);\n }\n }\n\n return [...bestByUrl.values()].sort((a, b) => a.title.localeCompare(b.title));\n}\n\nexport function defaultCloneTemplateDescription(templateDetailTitle: string): string {\n const title = templateDetailTitle.trim() || 'Template';\n return `Create project based on ${title} template`;\n}\n"],"names":[],"mappings":"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"}