@adminide-stack/yantra-mobile 12.0.41 → 12.0.42-alpha.1

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 (54) hide show
  1. package/lib/components/AppsMenu/AppsMenu.js +2 -2
  2. package/lib/components/AppsMenu/AppsMenu.js.map +1 -1
  3. package/lib/components/GatewayToolbarButtonMobile.js +3 -4
  4. package/lib/components/GatewayToolbarButtonMobile.js.map +1 -1
  5. package/lib/components/KeyboardComposerDock.js +27 -0
  6. package/lib/components/KeyboardComposerDock.js.map +1 -0
  7. package/lib/components/NavigationHeader/ChatHistoryToggleMobile.js +6 -0
  8. package/lib/components/NavigationHeader/ChatHistoryToggleMobile.js.map +1 -0
  9. package/lib/components/NavigationHeader/HeaderMoreMenu.js +67 -0
  10. package/lib/components/NavigationHeader/HeaderMoreMenu.js.map +1 -0
  11. package/lib/components/NavigationHeader/HeaderSettingsMenu.js +132 -0
  12. package/lib/components/NavigationHeader/HeaderSettingsMenu.js.map +1 -0
  13. package/lib/components/NavigationHeader/HeaderSheet.js +130 -0
  14. package/lib/components/NavigationHeader/HeaderSheet.js.map +1 -0
  15. package/lib/components/NavigationHeader/HeaderSkillsButton.js +120 -0
  16. package/lib/components/NavigationHeader/HeaderSkillsButton.js.map +1 -0
  17. package/lib/components/NavigationHeader/HeaderTasksButton.js +157 -0
  18. package/lib/components/NavigationHeader/HeaderTasksButton.js.map +1 -0
  19. package/lib/components/NavigationHeader/HeaderToolbarButton.js +68 -0
  20. package/lib/components/NavigationHeader/HeaderToolbarButton.js.map +1 -0
  21. package/lib/components/NavigationHeader/NavigationHeader.js +35 -63
  22. package/lib/components/NavigationHeader/NavigationHeader.js.map +1 -1
  23. package/lib/compute.js +1 -1
  24. package/lib/compute.js.map +1 -1
  25. package/lib/contexts/GatewayContext.js +8 -1
  26. package/lib/contexts/GatewayContext.js.map +1 -1
  27. package/lib/features/chat/temporaryChatStore.js +19 -0
  28. package/lib/features/chat/temporaryChatStore.js.map +1 -0
  29. package/lib/hooks/useAgentSessionState.js +5 -0
  30. package/lib/hooks/useAgentSessionState.js.map +1 -0
  31. package/lib/hooks/useCdecliChannel.js +84 -2
  32. package/lib/hooks/useCdecliChannel.js.map +1 -1
  33. package/lib/hooks/useChatApi.js +22 -1
  34. package/lib/hooks/useChatApi.js.map +1 -1
  35. package/lib/hooks/useChatStream.js +81 -11
  36. package/lib/hooks/useChatStream.js.map +1 -1
  37. package/lib/hooks/useKeyboardBottomOffset.js +22 -0
  38. package/lib/hooks/useKeyboardBottomOffset.js.map +1 -0
  39. package/lib/hooks/useMarketplaceTemplateGroups.js +1 -1
  40. package/lib/hooks/useMarketplaceTemplateGroups.js.map +1 -1
  41. package/lib/routes.json +1 -1
  42. package/lib/screens/Chat/index.js +56 -100
  43. package/lib/screens/Chat/index.js.map +1 -1
  44. package/lib/screens/ChatHistory/index.js +12 -1
  45. package/lib/screens/ChatHistory/index.js.map +1 -1
  46. package/lib/screens/Home/HomeScreen.js +58 -58
  47. package/lib/screens/Home/HomeScreen.js.map +1 -1
  48. package/lib/screens/Home/components/BuildTemplatesSection.js +12 -33
  49. package/lib/screens/Home/components/BuildTemplatesSection.js.map +1 -1
  50. package/lib/screens/Home/components/ChatHistoryLanding.js +16 -3
  51. package/lib/screens/Home/components/ChatHistoryLanding.js.map +1 -1
  52. package/lib/screens/Home/components/HomeSuggestions.js +7 -2
  53. package/lib/screens/Home/components/HomeSuggestions.js.map +1 -1
  54. package/package.json +5 -4
@@ -172,14 +172,14 @@ const styles = StyleSheet.create({
172
172
  flexShrink: 0,
173
173
  gap: 4,
174
174
  height: 36,
175
- paddingHorizontal: 8,
175
+ paddingHorizontal: 6,
176
176
  borderRadius: 10
177
177
  },
178
178
  triggerPressed: {
179
179
  opacity: 0.7
180
180
  },
181
181
  triggerLabel: {
182
- fontSize: 15,
182
+ fontSize: 13,
183
183
  fontWeight: "600",
184
184
  letterSpacing: -0.2
185
185
  },
@@ -1 +1 @@
1
- {"version":3,"file":"AppsMenu.js","sources":["../../../src/components/AppsMenu/AppsMenu.tsx"],"sourcesContent":["/**\n * Apps launcher for the mobile header. Mirrors the browser ChatTopBar Apps menu:\n * one trigger, grouped catalog, search, then navigate into a native surface or chat.\n *\n * The trigger is a separate component so Apollo/chat hooks cannot prevent the\n * header control from mounting.\n */\nimport React, { useCallback, useMemo, useState } from 'react';\nimport { Modal, Pressable, ScrollView, StyleSheet, Text, TextInput, View, useWindowDimensions } from 'react-native';\nimport { CommonActions, useNavigation, useRoute } from '@react-navigation/native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\nimport { v4 as uuidv4 } from 'uuid';\nimport { groupMobileApps, MOBILE_APP_CATALOG, type MobileAppItem } from '../../features/apps/mobileAppCatalog';\nimport { useChatMutations } from '../../hooks/useChatApi';\nimport { mobileTokens } from '../../theme/mobileTokens';\n\nexport type AppsMenuProps = {\n isDark: boolean;\n compact?: boolean;\n orgName?: string | null;\n};\n\nfunction buildChannelTitle(channelId: string): string {\n return `chat-channel-${channelId}`;\n}\n\nfunction AppsMenuTrigger({ isDark, compact, onPress }: { isDark: boolean; compact: boolean; onPress: () => void }) {\n const ink = isDark ? '#e2e8f0' : mobileTokens.color.text;\n const muted = isDark ? '#94a3b8' : mobileTokens.color.textMuted;\n\n return (\n <Pressable\n onPress={onPress}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Apps\"\n hitSlop={6}\n style={({ pressed }) => [styles.trigger, pressed && styles.triggerPressed]}\n >\n <MaterialCommunityIcons name=\"view-grid-outline\" size={18} color={ink} />\n {compact ? null : (\n <Text style={[styles.triggerLabel, { color: ink }]} numberOfLines={1}>\n Apps\n </Text>\n )}\n <MaterialCommunityIcons name=\"chevron-down\" size={14} color={muted} />\n </Pressable>\n );\n}\n\nfunction AppsMenuSheet({\n isDark,\n orgName: orgNameProp,\n onClose,\n}: {\n isDark: boolean;\n orgName?: string | null;\n onClose: () => void;\n}) {\n const navigation = useNavigation<any>();\n const route = useRoute<any>();\n const insets = useSafeAreaInsets();\n const { height: windowHeight } = useWindowDimensions();\n const { createChannel } = useChatMutations();\n const [query, setQuery] = useState('');\n\n const orgName = useMemo(() => {\n if (typeof orgNameProp === 'string' && orgNameProp.trim()) return orgNameProp.trim();\n const raw = (route?.params?.orgName as string | undefined) ?? '';\n return typeof raw === 'string' && raw.trim() ? raw.trim() : null;\n }, [orgNameProp, route?.params?.orgName]);\n\n const grouped = useMemo(() => groupMobileApps(MOBILE_APP_CATALOG, query), [query]);\n\n const muted = isDark ? '#94a3b8' : mobileTokens.color.textMuted;\n const foreground = isDark ? '#e2e8f0' : mobileTokens.color.text;\n const surface = isDark ? '#111827' : mobileTokens.color.surface;\n const sheetBg = isDark ? '#0f172a' : mobileTokens.color.surface;\n const borderColor = isDark ? 'rgba(148,163,184,0.22)' : mobileTokens.color.border;\n const fieldBg = isDark ? '#1e293b' : mobileTokens.color.surfaceMuted;\n const accent = isDark ? '#a5b4fc' : mobileTokens.color.primary;\n const accentSoft = isDark ? 'rgba(99,102,241,0.18)' : mobileTokens.color.primarySoft;\n\n const openApp = useCallback(\n (app: MobileAppItem) => {\n onClose();\n const channelId = uuidv4();\n const params: Record<string, unknown> = {\n orgName: orgName ?? undefined,\n channelId,\n };\n\n if (app.nativeRoute === 'webbuilder') {\n navigation.dispatch(\n CommonActions.navigate({\n name: 'MainStack.WebBuilder',\n params,\n }),\n );\n return;\n }\n\n void createChannel({\n id: channelId,\n title: buildChannelTitle(channelId),\n isShared: false,\n sharedSlug: null,\n isArchived: false,\n isPinned: false,\n model: null,\n systemPrompt: null,\n orgName,\n } as any).catch((err) => {\n console.error('[AppsMenu] 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, onClose, orgName],\n );\n\n return (\n <Modal visible animationType=\"slide\" transparent onRequestClose={onClose}>\n <View style={styles.modalRoot}>\n <Pressable style={styles.backdrop} onPress={onClose} accessibilityLabel=\"Close apps\" />\n <View\n style={[\n styles.sheet,\n {\n backgroundColor: sheetBg,\n maxHeight: Math.round(windowHeight * 0.86),\n paddingBottom: Math.max(insets.bottom, 12),\n },\n ]}\n >\n <View style={styles.handleWrap}>\n <View style={[styles.handle, { backgroundColor: borderColor }]} />\n </View>\n <View style={styles.header}>\n <Text style={[styles.title, { color: foreground }]}>Apps</Text>\n <Pressable onPress={onClose} hitSlop={10} accessibilityLabel=\"Close\" accessibilityRole=\"button\">\n <MaterialCommunityIcons name=\"close\" size={22} color={muted} />\n </Pressable>\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 style={[styles.searchInput, { color: foreground }]}\n />\n </View>\n <ScrollView keyboardShouldPersistTaps=\"handled\" contentContainerStyle={styles.list}>\n {grouped.length === 0 ? (\n <Text style={[styles.empty, { color: muted }]}>No apps match that search.</Text>\n ) : (\n grouped.map((group) => (\n <View key={group.label} style={styles.group}>\n <Text style={[styles.groupLabel, { color: muted }]}>{group.label}</Text>\n <View style={styles.groupGrid}>\n {group.items.map((app) => (\n <Pressable\n key={app.key}\n onPress={() => openApp(app)}\n accessibilityRole=\"button\"\n accessibilityLabel={app.label}\n style={({ pressed }) => [\n styles.appTile,\n {\n backgroundColor: surface,\n borderColor,\n },\n pressed && { backgroundColor: accentSoft },\n ]}\n >\n <View style={[styles.appIcon, { backgroundColor: accentSoft }]}>\n <MaterialCommunityIcons name={app.icon} size={18} color={accent} />\n </View>\n <Text\n style={[styles.appLabel, { color: foreground }]}\n numberOfLines={2}\n >\n {app.label}\n </Text>\n </Pressable>\n ))}\n </View>\n </View>\n ))\n )}\n </ScrollView>\n </View>\n </View>\n </Modal>\n );\n}\n\nexport function AppsMenu({ isDark, compact = false, orgName }: AppsMenuProps) {\n const [open, setOpen] = useState(false);\n const close = useCallback(() => setOpen(false), []);\n\n return (\n <>\n <AppsMenuTrigger isDark={isDark} compact={compact} onPress={() => setOpen(true)} />\n {open ? <AppsMenuSheet isDark={isDark} orgName={orgName} onClose={close} /> : null}\n </>\n );\n}\n\nconst styles = StyleSheet.create({\n trigger: {\n flexDirection: 'row',\n alignItems: 'center',\n flexShrink: 0,\n gap: 4,\n height: 36,\n paddingHorizontal: 8,\n borderRadius: 10,\n },\n triggerPressed: {\n opacity: 0.7,\n },\n triggerLabel: {\n fontSize: 15,\n fontWeight: '600',\n letterSpacing: -0.2,\n },\n modalRoot: {\n flex: 1,\n justifyContent: 'flex-end',\n },\n backdrop: {\n ...StyleSheet.absoluteFillObject,\n backgroundColor: 'rgba(15, 23, 42, 0.36)',\n },\n sheet: {\n borderTopLeftRadius: 18,\n borderTopRightRadius: 18,\n width: '100%',\n overflow: 'hidden',\n },\n handleWrap: {\n alignItems: 'center',\n paddingTop: 8,\n paddingBottom: 4,\n },\n handle: {\n width: 36,\n height: 4,\n borderRadius: 999,\n },\n header: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingHorizontal: 16,\n paddingBottom: 8,\n },\n title: {\n fontSize: 20,\n fontWeight: '700',\n letterSpacing: -0.4,\n },\n searchWrap: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 8,\n marginHorizontal: 16,\n marginBottom: 8,\n borderWidth: 1,\n borderRadius: 12,\n paddingHorizontal: 12,\n minHeight: 42,\n },\n searchInput: {\n flex: 1,\n fontSize: 15,\n paddingVertical: 8,\n },\n list: {\n paddingHorizontal: 16,\n paddingTop: 8,\n paddingBottom: 20,\n gap: 16,\n },\n group: {\n gap: 8,\n },\n groupLabel: {\n fontSize: 11,\n fontWeight: '600',\n letterSpacing: 0.7,\n textTransform: 'uppercase',\n },\n groupGrid: {\n flexDirection: 'row',\n flexWrap: 'wrap',\n gap: 8,\n },\n appTile: {\n width: '31%',\n flexGrow: 1,\n minWidth: 96,\n maxWidth: '32.5%',\n borderWidth: 1,\n borderRadius: 14,\n paddingHorizontal: 10,\n paddingVertical: 12,\n gap: 8,\n },\n appIcon: {\n width: 32,\n height: 32,\n borderRadius: 10,\n alignItems: 'center',\n justifyContent: 'center',\n },\n appLabel: {\n fontSize: 13,\n fontWeight: '600',\n lineHeight: 17,\n },\n empty: {\n textAlign: 'center',\n paddingVertical: 28,\n fontSize: 14,\n },\n});\n\nexport default AppsMenu;\n"],"names":["_a","uuidv4"],"mappings":"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"}
1
+ {"version":3,"file":"AppsMenu.js","sources":["../../../src/components/AppsMenu/AppsMenu.tsx"],"sourcesContent":["/**\n * Apps launcher for the mobile header. Mirrors the browser ChatTopBar Apps menu:\n * one trigger, grouped catalog, search, then navigate into a native surface or chat.\n *\n * The trigger is a separate component so Apollo/chat hooks cannot prevent the\n * header control from mounting.\n */\nimport React, { useCallback, useMemo, useState } from 'react';\nimport { Modal, Pressable, ScrollView, StyleSheet, Text, TextInput, View, useWindowDimensions } from 'react-native';\nimport { CommonActions, useNavigation, useRoute } from '@react-navigation/native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\nimport { v4 as uuidv4 } from 'uuid';\nimport { groupMobileApps, MOBILE_APP_CATALOG, type MobileAppItem } from '../../features/apps/mobileAppCatalog';\nimport { useChatMutations } from '../../hooks/useChatApi';\nimport { mobileTokens } from '../../theme/mobileTokens';\n\nexport type AppsMenuProps = {\n isDark: boolean;\n compact?: boolean;\n orgName?: string | null;\n};\n\nfunction buildChannelTitle(channelId: string): string {\n return `chat-channel-${channelId}`;\n}\n\nfunction AppsMenuTrigger({ isDark, compact, onPress }: { isDark: boolean; compact: boolean; onPress: () => void }) {\n const ink = isDark ? '#e2e8f0' : mobileTokens.color.text;\n const muted = isDark ? '#94a3b8' : mobileTokens.color.textMuted;\n\n return (\n <Pressable\n onPress={onPress}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Apps\"\n hitSlop={6}\n style={({ pressed }) => [styles.trigger, pressed && styles.triggerPressed]}\n >\n <MaterialCommunityIcons name=\"view-grid-outline\" size={18} color={ink} />\n {compact ? null : (\n <Text style={[styles.triggerLabel, { color: ink }]} numberOfLines={1}>\n Apps\n </Text>\n )}\n <MaterialCommunityIcons name=\"chevron-down\" size={14} color={muted} />\n </Pressable>\n );\n}\n\nfunction AppsMenuSheet({\n isDark,\n orgName: orgNameProp,\n onClose,\n}: {\n isDark: boolean;\n orgName?: string | null;\n onClose: () => void;\n}) {\n const navigation = useNavigation<any>();\n const route = useRoute<any>();\n const insets = useSafeAreaInsets();\n const { height: windowHeight } = useWindowDimensions();\n const { createChannel } = useChatMutations();\n const [query, setQuery] = useState('');\n\n const orgName = useMemo(() => {\n if (typeof orgNameProp === 'string' && orgNameProp.trim()) return orgNameProp.trim();\n const raw = (route?.params?.orgName as string | undefined) ?? '';\n return typeof raw === 'string' && raw.trim() ? raw.trim() : null;\n }, [orgNameProp, route?.params?.orgName]);\n\n const grouped = useMemo(() => groupMobileApps(MOBILE_APP_CATALOG, query), [query]);\n\n const muted = isDark ? '#94a3b8' : mobileTokens.color.textMuted;\n const foreground = isDark ? '#e2e8f0' : mobileTokens.color.text;\n const surface = isDark ? '#111827' : mobileTokens.color.surface;\n const sheetBg = isDark ? '#0f172a' : mobileTokens.color.surface;\n const borderColor = isDark ? 'rgba(148,163,184,0.22)' : mobileTokens.color.border;\n const fieldBg = isDark ? '#1e293b' : mobileTokens.color.surfaceMuted;\n const accent = isDark ? '#a5b4fc' : mobileTokens.color.primary;\n const accentSoft = isDark ? 'rgba(99,102,241,0.18)' : mobileTokens.color.primarySoft;\n\n const openApp = useCallback(\n (app: MobileAppItem) => {\n onClose();\n const channelId = uuidv4();\n const params: Record<string, unknown> = {\n orgName: orgName ?? undefined,\n channelId,\n };\n\n if (app.nativeRoute === 'webbuilder') {\n navigation.dispatch(\n CommonActions.navigate({\n name: 'MainStack.WebBuilder',\n params,\n }),\n );\n return;\n }\n\n void createChannel({\n id: channelId,\n title: buildChannelTitle(channelId),\n isShared: false,\n sharedSlug: null,\n isArchived: false,\n isPinned: false,\n model: null,\n systemPrompt: null,\n orgName,\n } as any).catch((err) => {\n console.error('[AppsMenu] 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, onClose, orgName],\n );\n\n return (\n <Modal visible animationType=\"slide\" transparent onRequestClose={onClose}>\n <View style={styles.modalRoot}>\n <Pressable style={styles.backdrop} onPress={onClose} accessibilityLabel=\"Close apps\" />\n <View\n style={[\n styles.sheet,\n {\n backgroundColor: sheetBg,\n maxHeight: Math.round(windowHeight * 0.86),\n paddingBottom: Math.max(insets.bottom, 12),\n },\n ]}\n >\n <View style={styles.handleWrap}>\n <View style={[styles.handle, { backgroundColor: borderColor }]} />\n </View>\n <View style={styles.header}>\n <Text style={[styles.title, { color: foreground }]}>Apps</Text>\n <Pressable onPress={onClose} hitSlop={10} accessibilityLabel=\"Close\" accessibilityRole=\"button\">\n <MaterialCommunityIcons name=\"close\" size={22} color={muted} />\n </Pressable>\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 style={[styles.searchInput, { color: foreground }]}\n />\n </View>\n <ScrollView keyboardShouldPersistTaps=\"handled\" contentContainerStyle={styles.list}>\n {grouped.length === 0 ? (\n <Text style={[styles.empty, { color: muted }]}>No apps match that search.</Text>\n ) : (\n grouped.map((group) => (\n <View key={group.label} style={styles.group}>\n <Text style={[styles.groupLabel, { color: muted }]}>{group.label}</Text>\n <View style={styles.groupGrid}>\n {group.items.map((app) => (\n <Pressable\n key={app.key}\n onPress={() => openApp(app)}\n accessibilityRole=\"button\"\n accessibilityLabel={app.label}\n style={({ pressed }) => [\n styles.appTile,\n {\n backgroundColor: surface,\n borderColor,\n },\n pressed && { backgroundColor: accentSoft },\n ]}\n >\n <View style={[styles.appIcon, { backgroundColor: accentSoft }]}>\n <MaterialCommunityIcons name={app.icon} size={18} color={accent} />\n </View>\n <Text\n style={[styles.appLabel, { color: foreground }]}\n numberOfLines={2}\n >\n {app.label}\n </Text>\n </Pressable>\n ))}\n </View>\n </View>\n ))\n )}\n </ScrollView>\n </View>\n </View>\n </Modal>\n );\n}\n\nexport function AppsMenu({ isDark, compact = false, orgName }: AppsMenuProps) {\n const [open, setOpen] = useState(false);\n const close = useCallback(() => setOpen(false), []);\n\n return (\n <>\n <AppsMenuTrigger isDark={isDark} compact={compact} onPress={() => setOpen(true)} />\n {open ? <AppsMenuSheet isDark={isDark} orgName={orgName} onClose={close} /> : null}\n </>\n );\n}\n\nconst styles = StyleSheet.create({\n trigger: {\n flexDirection: 'row',\n alignItems: 'center',\n flexShrink: 0,\n gap: 4,\n height: 36,\n paddingHorizontal: 6,\n borderRadius: 10,\n },\n triggerPressed: {\n opacity: 0.7,\n },\n triggerLabel: {\n fontSize: 13,\n fontWeight: '600',\n letterSpacing: -0.2,\n },\n modalRoot: {\n flex: 1,\n justifyContent: 'flex-end',\n },\n backdrop: {\n ...StyleSheet.absoluteFillObject,\n backgroundColor: 'rgba(15, 23, 42, 0.36)',\n },\n sheet: {\n borderTopLeftRadius: 18,\n borderTopRightRadius: 18,\n width: '100%',\n overflow: 'hidden',\n },\n handleWrap: {\n alignItems: 'center',\n paddingTop: 8,\n paddingBottom: 4,\n },\n handle: {\n width: 36,\n height: 4,\n borderRadius: 999,\n },\n header: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingHorizontal: 16,\n paddingBottom: 8,\n },\n title: {\n fontSize: 20,\n fontWeight: '700',\n letterSpacing: -0.4,\n },\n searchWrap: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 8,\n marginHorizontal: 16,\n marginBottom: 8,\n borderWidth: 1,\n borderRadius: 12,\n paddingHorizontal: 12,\n minHeight: 42,\n },\n searchInput: {\n flex: 1,\n fontSize: 15,\n paddingVertical: 8,\n },\n list: {\n paddingHorizontal: 16,\n paddingTop: 8,\n paddingBottom: 20,\n gap: 16,\n },\n group: {\n gap: 8,\n },\n groupLabel: {\n fontSize: 11,\n fontWeight: '600',\n letterSpacing: 0.7,\n textTransform: 'uppercase',\n },\n groupGrid: {\n flexDirection: 'row',\n flexWrap: 'wrap',\n gap: 8,\n },\n appTile: {\n width: '31%',\n flexGrow: 1,\n minWidth: 96,\n maxWidth: '32.5%',\n borderWidth: 1,\n borderRadius: 14,\n paddingHorizontal: 10,\n paddingVertical: 12,\n gap: 8,\n },\n appIcon: {\n width: 32,\n height: 32,\n borderRadius: 10,\n alignItems: 'center',\n justifyContent: 'center',\n },\n appLabel: {\n fontSize: 13,\n fontWeight: '600',\n lineHeight: 17,\n },\n empty: {\n textAlign: 'center',\n paddingVertical: 28,\n fontSize: 14,\n },\n});\n\nexport default AppsMenu;\n"],"names":["_a","uuidv4"],"mappings":"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"}
@@ -30,15 +30,14 @@ function GatewayToolbarButtonMobile({
30
30
  }
31
31
  const styles = StyleSheet.create({
32
32
  wrap: {
33
- marginRight: 2,
34
33
  flexShrink: 0
35
34
  },
36
35
  mainBtn: {
37
36
  flexDirection: "row",
38
37
  alignItems: "center",
39
- gap: 5,
38
+ gap: 4,
40
39
  height: 36,
41
- paddingHorizontal: 8,
40
+ paddingHorizontal: 6,
42
41
  borderRadius: 10,
43
42
  justifyContent: "flex-start"
44
43
  },
@@ -49,7 +48,7 @@ const styles = StyleSheet.create({
49
48
  opacity: 0.45
50
49
  },
51
50
  label: {
52
- fontSize: 15,
51
+ fontSize: 13,
53
52
  fontWeight: "600",
54
53
  letterSpacing: -0.2
55
54
  }
@@ -1 +1 @@
1
- {"version":3,"file":"GatewayToolbarButtonMobile.js","sources":["../../src/components/GatewayToolbarButtonMobile.tsx"],"sourcesContent":["/**\n * Connect/disconnect + gateway provider picker — mirrors web\n * `GatewayToolbarButton` for React Native header usage.\n *\n * Connection state lives in the icon color (green / amber / red), not a filled\n * pill. The label is the selected gateway name (\"Yantra\"), same as the browser.\n */\n\nimport React from 'react';\nimport { ActivityIndicator, Pressable, StyleSheet, Text, View, useColorScheme } from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { mobileTokens } from '../theme/mobileTokens';\n\nexport type GatewayToolbarMobileStatus = 'connected' | 'connecting' | 'disconnected' | 'error';\n\nexport interface GatewayToolbarButtonMobileProps {\n gatewayStatus: GatewayToolbarMobileStatus;\n gatewayError?: string | null;\n onToggleGateway: () => void;\n disabled?: boolean;\n /** Replaces the gateway name, e.g. \"Checking...\" */\n statusLabel?: string;\n /** Selected gateway display name from the registry. */\n gatewayName?: string;\n /** Visual override when workspace (not link status) is provisioning / error */\n tone?: 'default' | 'provisioning' | 'workspace-error';\n}\n\nfunction iconColor(status: GatewayToolbarMobileStatus, tone: GatewayToolbarButtonMobileProps['tone'], isDark: boolean) {\n if (tone === 'provisioning') return '#2563eb';\n if (tone === 'workspace-error') return mobileTokens.color.dangerText;\n if (status === 'connected') return isDark ? '#4ade80' : '#16a34a';\n if (status === 'connecting') return isDark ? '#fbbf24' : '#ca8a04';\n if (status === 'error') return isDark ? '#f87171' : '#dc2626';\n return isDark ? '#94a3b8' : '#64748b';\n}\n\nexport function GatewayToolbarButtonMobile({\n gatewayStatus,\n gatewayError,\n onToggleGateway,\n disabled,\n statusLabel,\n gatewayName = 'Yantra',\n tone = 'default',\n}: GatewayToolbarButtonMobileProps) {\n const isDark = useColorScheme() === 'dark';\n const color = iconColor(gatewayStatus, tone, isDark);\n const labelColor = isDark ? '#e2e8f0' : mobileTokens.color.text;\n\n const mainTitle = gatewayStatus === 'connected' ? 'Disconnect Yantra' : gatewayError || 'Connect to Yantra';\n\n return (\n <View style={styles.wrap}>\n <Pressable\n onPress={onToggleGateway}\n disabled={disabled}\n accessibilityLabel={mainTitle}\n style={({ pressed }) => [styles.mainBtn, pressed && styles.pressed, disabled && styles.disabled]}\n >\n {gatewayStatus === 'connecting' ? (\n <ActivityIndicator size=\"small\" color={color} />\n ) : (\n <MaterialCommunityIcons\n name={gatewayStatus === 'connected' ? 'wifi' : 'wifi-off'}\n size={16}\n color={color}\n />\n )}\n <Text style={[styles.label, { color: labelColor }]}>{statusLabel ?? gatewayName}</Text>\n </Pressable>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n wrap: { marginRight: 2, flexShrink: 0 },\n mainBtn: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 5,\n height: 36,\n paddingHorizontal: 8,\n borderRadius: 10,\n justifyContent: 'flex-start',\n },\n pressed: { opacity: 0.7 },\n disabled: { opacity: 0.45 },\n label: { fontSize: 15, fontWeight: '600', letterSpacing: -0.2 },\n});\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"GatewayToolbarButtonMobile.js","sources":["../../src/components/GatewayToolbarButtonMobile.tsx"],"sourcesContent":["/**\n * Connect/disconnect + gateway provider picker — mirrors web\n * `GatewayToolbarButton` for React Native header usage.\n *\n * Connection state lives in the icon color (green / amber / red), not a filled\n * pill. The label is the selected gateway name (\"Yantra\"), same as the browser.\n */\n\nimport React from 'react';\nimport { ActivityIndicator, Pressable, StyleSheet, Text, View, useColorScheme } from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { mobileTokens } from '../theme/mobileTokens';\n\nexport type GatewayToolbarMobileStatus = 'connected' | 'connecting' | 'disconnected' | 'error';\n\nexport interface GatewayToolbarButtonMobileProps {\n gatewayStatus: GatewayToolbarMobileStatus;\n gatewayError?: string | null;\n onToggleGateway: () => void;\n disabled?: boolean;\n /** Replaces the gateway name, e.g. \"Checking...\" */\n statusLabel?: string;\n /** Selected gateway display name from the registry. */\n gatewayName?: string;\n /** Visual override when workspace (not link status) is provisioning / error */\n tone?: 'default' | 'provisioning' | 'workspace-error';\n}\n\nfunction iconColor(status: GatewayToolbarMobileStatus, tone: GatewayToolbarButtonMobileProps['tone'], isDark: boolean) {\n if (tone === 'provisioning') return '#2563eb';\n if (tone === 'workspace-error') return mobileTokens.color.dangerText;\n if (status === 'connected') return isDark ? '#4ade80' : '#16a34a';\n if (status === 'connecting') return isDark ? '#fbbf24' : '#ca8a04';\n if (status === 'error') return isDark ? '#f87171' : '#dc2626';\n return isDark ? '#94a3b8' : '#64748b';\n}\n\nexport function GatewayToolbarButtonMobile({\n gatewayStatus,\n gatewayError,\n onToggleGateway,\n disabled,\n statusLabel,\n gatewayName = 'Yantra',\n tone = 'default',\n}: GatewayToolbarButtonMobileProps) {\n const isDark = useColorScheme() === 'dark';\n const color = iconColor(gatewayStatus, tone, isDark);\n const labelColor = isDark ? '#e2e8f0' : mobileTokens.color.text;\n\n const mainTitle = gatewayStatus === 'connected' ? 'Disconnect Yantra' : gatewayError || 'Connect to Yantra';\n\n return (\n <View style={styles.wrap}>\n <Pressable\n onPress={onToggleGateway}\n disabled={disabled}\n accessibilityLabel={mainTitle}\n style={({ pressed }) => [styles.mainBtn, pressed && styles.pressed, disabled && styles.disabled]}\n >\n {gatewayStatus === 'connecting' ? (\n <ActivityIndicator size=\"small\" color={color} />\n ) : (\n <MaterialCommunityIcons\n name={gatewayStatus === 'connected' ? 'wifi' : 'wifi-off'}\n size={16}\n color={color}\n />\n )}\n <Text style={[styles.label, { color: labelColor }]}>{statusLabel ?? gatewayName}</Text>\n </Pressable>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n wrap: { flexShrink: 0 },\n mainBtn: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 4,\n height: 36,\n paddingHorizontal: 6,\n borderRadius: 10,\n justifyContent: 'flex-start',\n },\n pressed: { opacity: 0.7 },\n disabled: { opacity: 0.45 },\n label: { fontSize: 13, fontWeight: '600', letterSpacing: -0.2 },\n});\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import {jsx}from'react/jsx-runtime';import {Platform,StyleSheet}from'react-native';import Animated,{useAnimatedKeyboard,useAnimatedStyle}from'react-native-reanimated';const OPEN_GAP = 8;
2
+ function KeyboardComposerDock({
3
+ children,
4
+ closedInset,
5
+ keyboardVisible = false
6
+ }) {
7
+ const keyboard = useAnimatedKeyboard();
8
+ const closedPadding = Math.max(closedInset, OPEN_GAP);
9
+ const dockStyle = useAnimatedStyle(() => {
10
+ if (Platform.OS === "android") {
11
+ return {};
12
+ }
13
+ return {
14
+ paddingBottom: Math.max(keyboard.height.value, closedPadding)
15
+ };
16
+ });
17
+ return /* @__PURE__ */ jsx(Animated.View, { style: [styles.dock, Platform.OS === "android" ? {
18
+ paddingBottom: keyboardVisible ? OPEN_GAP : closedPadding
19
+ } : null, dockStyle], children });
20
+ }
21
+ const styles = StyleSheet.create({
22
+ dock: {
23
+ width: "100%",
24
+ alignItems: "center",
25
+ zIndex: 20
26
+ }
27
+ });export{KeyboardComposerDock};//# sourceMappingURL=KeyboardComposerDock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KeyboardComposerDock.js","sources":["../../src/components/KeyboardComposerDock.tsx"],"sourcesContent":["import React from 'react';\nimport { Platform, StyleSheet } from 'react-native';\nimport Animated, { useAnimatedKeyboard, useAnimatedStyle } from 'react-native-reanimated';\n\nconst OPEN_GAP = 8;\n\nexport type KeyboardComposerDockProps = {\n children: React.ReactNode;\n /** Home-indicator inset applied when the keyboard is closed. */\n closedInset: number;\n /** Android resize already lifts the window; only used to drop closed inset. */\n keyboardVisible?: boolean;\n};\n\n/**\n * Pins the composer above the keyboard using Reanimated (works in Expo Go).\n * Android `adjustResize` already shrinks the window, so extra iOS padding is skipped there.\n */\nexport function KeyboardComposerDock({ children, closedInset, keyboardVisible = false }: KeyboardComposerDockProps) {\n const keyboard = useAnimatedKeyboard();\n const closedPadding = Math.max(closedInset, OPEN_GAP);\n const dockStyle = useAnimatedStyle(() => {\n if (Platform.OS === 'android') {\n return {};\n }\n return {\n paddingBottom: Math.max(keyboard.height.value, closedPadding),\n };\n });\n\n return (\n <Animated.View\n style={[\n styles.dock,\n Platform.OS === 'android' ? { paddingBottom: keyboardVisible ? OPEN_GAP : closedPadding } : null,\n dockStyle,\n ]}\n >\n {children}\n </Animated.View>\n );\n}\n\nconst styles = StyleSheet.create({\n dock: {\n width: '100%',\n alignItems: 'center',\n zIndex: 20,\n },\n});\n"],"names":[],"mappings":"uKAGA,MAAM,QAAW,GAAA,CAAA;AAaV,SAAS,oBAAqB,CAAA;AAAA,EACnC,QAAA;AAAA,EACA,WAAA;AAAA,EACA,eAAkB,GAAA;AACpB,CAA8B,EAAA;AAC5B,EAAA,MAAM,WAAW,mBAAoB,EAAA;AACrC,EAAA,MAAM,aAAgB,GAAA,IAAA,CAAK,GAAI,CAAA,WAAA,EAAa,QAAQ,CAAA;AACpD,EAAM,MAAA,SAAA,GAAY,iBAAiB,MAAM;AACvC,IAAI,IAAA,QAAA,CAAS,OAAO,SAAW,EAAA;AAC7B,MAAA,OAAO,EAAC;AAAA;AAEV,IAAO,OAAA;AAAA,MACL,eAAe,IAAK,CAAA,GAAA,CAAI,QAAS,CAAA,MAAA,CAAO,OAAO,aAAa;AAAA,KAC9D;AAAA,GACD,CAAA;AACD,EAAO,uBAAA,GAAA,CAAC,QAAS,CAAA,IAAA,EAAT,EAAc,KAAA,EAAO,CAAC,MAAO,CAAA,IAAA,EAAM,QAAS,CAAA,EAAA,KAAO,SAAY,GAAA;AAAA,IACrE,aAAA,EAAe,kBAAkB,QAAW,GAAA;AAAA,GAC1C,GAAA,IAAA,EAAM,SAAS,CAAA,EACR,QACL,EAAA,CAAA;AACR;AACA,MAAM,MAAA,GAAS,WAAW,MAAO,CAAA;AAAA,EAC/B,IAAM,EAAA;AAAA,IACJ,KAAO,EAAA,MAAA;AAAA,IACP,UAAY,EAAA,QAAA;AAAA,IACZ,MAAQ,EAAA;AAAA;AAEZ,CAAC,CAAA"}
@@ -0,0 +1,6 @@
1
+ import {jsx}from'react/jsx-runtime';import {HeaderToolbarButton}from'./HeaderToolbarButton.js';function ChatHistoryToggleMobile({
2
+ onPress,
3
+ isDark
4
+ }) {
5
+ return /* @__PURE__ */ jsx(HeaderToolbarButton, { icon: "history", label: "History", trailingIcon: "chevron-right", onPress, accessibilityLabel: "Chat history", isDark });
6
+ }export{ChatHistoryToggleMobile};//# sourceMappingURL=ChatHistoryToggleMobile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatHistoryToggleMobile.js","sources":["../../../src/components/NavigationHeader/ChatHistoryToggleMobile.tsx"],"sourcesContent":["import React from 'react';\nimport { HeaderToolbarButton } from './HeaderToolbarButton';\n\ntype Props = {\n onPress: () => void;\n isDark: boolean;\n};\n\nexport function ChatHistoryToggleMobile({ onPress, isDark }: Props) {\n return (\n <HeaderToolbarButton\n icon=\"history\"\n label=\"History\"\n trailingIcon=\"chevron-right\"\n onPress={onPress}\n accessibilityLabel=\"Chat history\"\n isDark={isDark}\n />\n );\n}\n"],"names":[],"mappings":"+FAMO,SAAS,uBAAwB,CAAA;AAAA,EACtC,OAAA;AAAA,EACA;AACF,CAAU,EAAA;AACR,EAAO,uBAAA,GAAA,CAAC,mBAAoB,EAAA,EAAA,IAAA,EAAK,SAAU,EAAA,KAAA,EAAM,SAAU,EAAA,YAAA,EAAa,eAAgB,EAAA,OAAA,EAAkB,kBAAmB,EAAA,cAAA,EAAe,MAAgB,EAAA,CAAA;AAC9J"}
@@ -0,0 +1,67 @@
1
+ import {jsxs,Fragment,jsx}from'react/jsx-runtime';import {useState,useSyncExternalStore,useCallback}from'react';import {View,StyleSheet,Pressable,Text}from'react-native';import {MaterialCommunityIcons}from'@expo/vector-icons';import {subscribeTemporaryChat,getTemporaryChatActive,setTemporaryChatActive}from'../../features/chat/temporaryChatStore.js';import {mobileTokens}from'../../theme/mobileTokens.js';import {HeaderSheet}from'./HeaderSheet.js';import {useComputerSettings,SettingRow,ComputerSettingsPanel}from'./HeaderSettingsMenu.js';import {HeaderToolbarButton}from'./HeaderToolbarButton.js';function HeaderMoreMenu({
2
+ isDark,
3
+ onNewChat
4
+ }) {
5
+ const [open, setOpen] = useState(false);
6
+ const temporary = useSyncExternalStore(subscribeTemporaryChat, getTemporaryChatActive, getTemporaryChatActive);
7
+ const {
8
+ settings,
9
+ patchSettings
10
+ } = useComputerSettings();
11
+ const foreground = isDark ? "#e2e8f0" : mobileTokens.color.text;
12
+ const muted = isDark ? "#94a3b8" : mobileTokens.color.textMuted;
13
+ const onToggleTemporary = useCallback((next) => {
14
+ setTemporaryChatActive(next);
15
+ }, []);
16
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
17
+ /* @__PURE__ */ jsx(HeaderToolbarButton, { icon: "dots-horizontal", onPress: () => setOpen(true), accessibilityLabel: "More", isDark, active: open || temporary }),
18
+ open ? /* @__PURE__ */ jsxs(HeaderSheet, { visible: true, title: "More", subtitle: "Temporary chat and settings", isDark, onClose: () => setOpen(false), children: [
19
+ /* @__PURE__ */ jsxs(View, { style: styles.section, children: [
20
+ /* @__PURE__ */ jsx(SettingRow, { isDark, label: "Temporary", description: "This session will not be saved to history.", value: temporary, onValueChange: onToggleTemporary }),
21
+ onNewChat ? /* @__PURE__ */ jsxs(Pressable, { onPress: () => {
22
+ setOpen(false);
23
+ onNewChat();
24
+ }, style: ({
25
+ pressed
26
+ }) => [styles.newTask, pressed && styles.pressed], children: [
27
+ /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "chat-plus-outline", size: 18, color: foreground }),
28
+ /* @__PURE__ */ jsx(Text, { style: [styles.newTaskLabel, {
29
+ color: foreground
30
+ }], children: "Start new task" })
31
+ ] }) : null,
32
+ /* @__PURE__ */ jsx(Text, { style: [styles.sectionLabel, {
33
+ color: muted
34
+ }], children: "Settings" })
35
+ ] }),
36
+ /* @__PURE__ */ jsx(ComputerSettingsPanel, { isDark, settings, onChange: patchSettings })
37
+ ] }) : null
38
+ ] });
39
+ }
40
+ const styles = StyleSheet.create({
41
+ section: {
42
+ paddingHorizontal: 16
43
+ },
44
+ sectionLabel: {
45
+ fontSize: 11,
46
+ fontWeight: "700",
47
+ letterSpacing: 0.7,
48
+ textTransform: "uppercase",
49
+ paddingTop: 16,
50
+ paddingBottom: 4
51
+ },
52
+ newTask: {
53
+ flexDirection: "row",
54
+ alignItems: "center",
55
+ gap: 10,
56
+ paddingVertical: 12,
57
+ borderBottomWidth: StyleSheet.hairlineWidth,
58
+ borderBottomColor: "rgba(148,163,184,0.18)"
59
+ },
60
+ newTaskLabel: {
61
+ fontSize: 14,
62
+ fontWeight: "600"
63
+ },
64
+ pressed: {
65
+ opacity: 0.7
66
+ }
67
+ });export{HeaderMoreMenu};//# sourceMappingURL=HeaderMoreMenu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HeaderMoreMenu.js","sources":["../../../src/components/NavigationHeader/HeaderMoreMenu.tsx"],"sourcesContent":["/**\n * Overflow menu for ChatTopBar system controls (Temporary + Settings).\n * Keeps the header row to History / Apps / Yantra / Tasks / Skills + More.\n */\nimport React, { useCallback, useState, useSyncExternalStore } from 'react';\nimport { Pressable, StyleSheet, Text, View } from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport {\n getTemporaryChatActive,\n subscribeTemporaryChat,\n setTemporaryChatActive,\n} from '../../features/chat/temporaryChatStore';\nimport { mobileTokens } from '../../theme/mobileTokens';\nimport { HeaderSheet } from './HeaderSheet';\nimport { ComputerSettingsPanel, SettingRow, useComputerSettings } from './HeaderSettingsMenu';\nimport { HeaderToolbarButton } from './HeaderToolbarButton';\n\ntype Props = {\n isDark: boolean;\n onNewChat?: () => void;\n};\n\nexport function HeaderMoreMenu({ isDark, onNewChat }: Props) {\n const [open, setOpen] = useState(false);\n const temporary = useSyncExternalStore(subscribeTemporaryChat, getTemporaryChatActive, getTemporaryChatActive);\n const { settings, patchSettings } = useComputerSettings();\n const foreground = isDark ? '#e2e8f0' : mobileTokens.color.text;\n const muted = isDark ? '#94a3b8' : mobileTokens.color.textMuted;\n\n const onToggleTemporary = useCallback((next: boolean) => {\n setTemporaryChatActive(next);\n }, []);\n\n return (\n <>\n <HeaderToolbarButton\n icon=\"dots-horizontal\"\n onPress={() => setOpen(true)}\n accessibilityLabel=\"More\"\n isDark={isDark}\n active={open || temporary}\n />\n {open ? (\n <HeaderSheet\n visible\n title=\"More\"\n subtitle=\"Temporary chat and settings\"\n isDark={isDark}\n onClose={() => setOpen(false)}\n >\n <View style={styles.section}>\n <SettingRow\n isDark={isDark}\n label=\"Temporary\"\n description=\"This session will not be saved to history.\"\n value={temporary}\n onValueChange={onToggleTemporary}\n />\n {onNewChat ? (\n <Pressable\n onPress={() => {\n setOpen(false);\n onNewChat();\n }}\n style={({ pressed }) => [styles.newTask, pressed && styles.pressed]}\n >\n <MaterialCommunityIcons name=\"chat-plus-outline\" size={18} color={foreground} />\n <Text style={[styles.newTaskLabel, { color: foreground }]}>Start new task</Text>\n </Pressable>\n ) : null}\n <Text style={[styles.sectionLabel, { color: muted }]}>Settings</Text>\n </View>\n <ComputerSettingsPanel isDark={isDark} settings={settings} onChange={patchSettings} />\n </HeaderSheet>\n ) : null}\n </>\n );\n}\n\nconst styles = StyleSheet.create({\n section: {\n paddingHorizontal: 16,\n },\n sectionLabel: {\n fontSize: 11,\n fontWeight: '700',\n letterSpacing: 0.7,\n textTransform: 'uppercase',\n paddingTop: 16,\n paddingBottom: 4,\n },\n newTask: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 10,\n paddingVertical: 12,\n borderBottomWidth: StyleSheet.hairlineWidth,\n borderBottomColor: 'rgba(148,163,184,0.18)',\n },\n newTaskLabel: {\n fontSize: 14,\n fontWeight: '600',\n },\n pressed: {\n opacity: 0.7,\n },\n});\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,132 @@
1
+ import {jsxs,jsx}from'react/jsx-runtime';import AsyncStorage from'@react-native-async-storage/async-storage';import {useState,useEffect,useCallback}from'react';import {View,StyleSheet,Text,Switch}from'react-native';import {mobileTokens}from'../../theme/mobileTokens.js';var __defProp = Object.defineProperty;
2
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
3
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
4
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
5
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
6
+ var __spreadValues = (a, b) => {
7
+ for (var prop in b || (b = {}))
8
+ if (__hasOwnProp.call(b, prop))
9
+ __defNormalProp(a, prop, b[prop]);
10
+ if (__getOwnPropSymbols)
11
+ for (var prop of __getOwnPropSymbols(b)) {
12
+ if (__propIsEnum.call(b, prop))
13
+ __defNormalProp(a, prop, b[prop]);
14
+ }
15
+ return a;
16
+ };
17
+ const STORAGE_KEY = "yantra-computer-settings";
18
+ const DEFAULT_SETTINGS = {
19
+ skipAuthorization: false,
20
+ allowCrossBrowser: false,
21
+ autoOpenBrowser: false
22
+ };
23
+ async function loadSettings() {
24
+ try {
25
+ const raw = await AsyncStorage.getItem(STORAGE_KEY);
26
+ if (!raw) return DEFAULT_SETTINGS;
27
+ return __spreadValues(__spreadValues({}, DEFAULT_SETTINGS), JSON.parse(raw));
28
+ } catch (e) {
29
+ return DEFAULT_SETTINGS;
30
+ }
31
+ }
32
+ async function saveSettings(values) {
33
+ try {
34
+ await AsyncStorage.setItem(STORAGE_KEY, JSON.stringify(values));
35
+ } catch (e) {
36
+ }
37
+ }
38
+ function SettingRow({
39
+ label,
40
+ description,
41
+ value,
42
+ onValueChange,
43
+ isDark
44
+ }) {
45
+ const foreground = isDark ? "#e2e8f0" : mobileTokens.color.text;
46
+ const muted = isDark ? "#94a3b8" : mobileTokens.color.textMuted;
47
+ return /* @__PURE__ */ jsxs(View, { style: styles.settingRow, children: [
48
+ /* @__PURE__ */ jsxs(View, { style: styles.settingCopy, children: [
49
+ /* @__PURE__ */ jsx(Text, { style: [styles.settingLabel, {
50
+ color: foreground
51
+ }], children: label }),
52
+ /* @__PURE__ */ jsx(Text, { style: [styles.settingDesc, {
53
+ color: muted
54
+ }], children: description })
55
+ ] }),
56
+ /* @__PURE__ */ jsx(Switch, { value, onValueChange, trackColor: {
57
+ false: isDark ? "#334155" : "#cbd5e1",
58
+ true: mobileTokens.color.primary
59
+ }, thumbColor: "#f8fafc" })
60
+ ] });
61
+ }
62
+ function ComputerSettingsPanel({
63
+ isDark,
64
+ settings,
65
+ onChange,
66
+ headerExtra
67
+ }) {
68
+ return /* @__PURE__ */ jsxs(View, { style: styles.settingsBody, children: [
69
+ headerExtra,
70
+ /* @__PURE__ */ jsx(SettingRow, { isDark, label: "Skip authorization for this device", description: "Requests from this phone are authorized automatically. Other clients still need approval.", value: settings.skipAuthorization, onValueChange: (skipAuthorization) => onChange({
71
+ skipAuthorization
72
+ }) }),
73
+ /* @__PURE__ */ jsx(SettingRow, { isDark, label: "Allow cross-device tasks", description: "Use this device for tasks you start from your account on other clients.", value: settings.allowCrossBrowser, onValueChange: (allowCrossBrowser) => onChange({
74
+ allowCrossBrowser
75
+ }) }),
76
+ /* @__PURE__ */ jsx(SettingRow, { isDark, label: "Auto-open Computer panel", description: "Show the computer panel when the assistant uses computer tools.", value: settings.autoOpenBrowser, onValueChange: (autoOpenBrowser) => onChange({
77
+ autoOpenBrowser
78
+ }) })
79
+ ] });
80
+ }
81
+ function useComputerSettings() {
82
+ const [settings, setSettings] = useState(DEFAULT_SETTINGS);
83
+ useEffect(() => {
84
+ let cancelled = false;
85
+ loadSettings().then((next) => {
86
+ if (!cancelled) setSettings(next);
87
+ });
88
+ return () => {
89
+ cancelled = true;
90
+ };
91
+ }, []);
92
+ const patchSettings = useCallback((patch) => {
93
+ setSettings((prev) => {
94
+ const next = __spreadValues(__spreadValues({}, prev), patch);
95
+ void saveSettings(next);
96
+ return next;
97
+ });
98
+ }, []);
99
+ return {
100
+ settings,
101
+ patchSettings
102
+ };
103
+ }
104
+ const styles = StyleSheet.create({
105
+ settingsBody: {
106
+ paddingHorizontal: 16,
107
+ paddingBottom: 8
108
+ },
109
+ settingRow: {
110
+ flexDirection: "row",
111
+ alignItems: "center",
112
+ justifyContent: "space-between",
113
+ gap: 12,
114
+ paddingVertical: 12,
115
+ borderBottomWidth: StyleSheet.hairlineWidth,
116
+ borderBottomColor: "rgba(148,163,184,0.18)"
117
+ },
118
+ settingCopy: {
119
+ flex: 1,
120
+ minWidth: 0,
121
+ paddingRight: 8,
122
+ gap: 4
123
+ },
124
+ settingLabel: {
125
+ fontSize: 14,
126
+ fontWeight: "600"
127
+ },
128
+ settingDesc: {
129
+ fontSize: 12,
130
+ lineHeight: 16
131
+ }
132
+ });export{ComputerSettingsPanel,SettingRow,useComputerSettings};//# sourceMappingURL=HeaderSettingsMenu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HeaderSettingsMenu.js","sources":["../../../src/components/NavigationHeader/HeaderSettingsMenu.tsx"],"sourcesContent":["import AsyncStorage from '@react-native-async-storage/async-storage';\nimport React, { useCallback, useEffect, useState } from 'react';\nimport { StyleSheet, Switch, Text, View } from 'react-native';\nimport { mobileTokens } from '../../theme/mobileTokens';\n\ntype ComputerSettingsValues = {\n skipAuthorization: boolean;\n allowCrossBrowser: boolean;\n autoOpenBrowser: boolean;\n};\n\nconst STORAGE_KEY = 'yantra-computer-settings';\n\nconst DEFAULT_SETTINGS: ComputerSettingsValues = {\n skipAuthorization: false,\n allowCrossBrowser: false,\n autoOpenBrowser: false,\n};\n\nasync function loadSettings(): Promise<ComputerSettingsValues> {\n try {\n const raw = await AsyncStorage.getItem(STORAGE_KEY);\n if (!raw) return DEFAULT_SETTINGS;\n return { ...DEFAULT_SETTINGS, ...JSON.parse(raw) };\n } catch {\n return DEFAULT_SETTINGS;\n }\n}\n\nasync function saveSettings(values: ComputerSettingsValues): Promise<void> {\n try {\n await AsyncStorage.setItem(STORAGE_KEY, JSON.stringify(values));\n } catch {\n /* Ignore quota / unavailable storage. */\n }\n}\n\nexport function SettingRow({\n label,\n description,\n value,\n onValueChange,\n isDark,\n}: {\n label: string;\n description: string;\n value: boolean;\n onValueChange: (next: boolean) => void;\n isDark: boolean;\n}) {\n const foreground = isDark ? '#e2e8f0' : mobileTokens.color.text;\n const muted = isDark ? '#94a3b8' : mobileTokens.color.textMuted;\n return (\n <View style={styles.settingRow}>\n <View style={styles.settingCopy}>\n <Text style={[styles.settingLabel, { color: foreground }]}>{label}</Text>\n <Text style={[styles.settingDesc, { color: muted }]}>{description}</Text>\n </View>\n <Switch\n value={value}\n onValueChange={onValueChange}\n trackColor={{ false: isDark ? '#334155' : '#cbd5e1', true: mobileTokens.color.primary }}\n thumbColor=\"#f8fafc\"\n />\n </View>\n );\n}\n\nexport function ComputerSettingsPanel({\n isDark,\n settings,\n onChange,\n headerExtra,\n}: {\n isDark: boolean;\n settings: ComputerSettingsValues;\n onChange: (patch: Partial<ComputerSettingsValues>) => void;\n headerExtra?: React.ReactNode;\n}) {\n return (\n <View style={styles.settingsBody}>\n {headerExtra}\n <SettingRow\n isDark={isDark}\n label=\"Skip authorization for this device\"\n description=\"Requests from this phone are authorized automatically. Other clients still need approval.\"\n value={settings.skipAuthorization}\n onValueChange={(skipAuthorization) => onChange({ skipAuthorization })}\n />\n <SettingRow\n isDark={isDark}\n label=\"Allow cross-device tasks\"\n description=\"Use this device for tasks you start from your account on other clients.\"\n value={settings.allowCrossBrowser}\n onValueChange={(allowCrossBrowser) => onChange({ allowCrossBrowser })}\n />\n <SettingRow\n isDark={isDark}\n label=\"Auto-open Computer panel\"\n description=\"Show the computer panel when the assistant uses computer tools.\"\n value={settings.autoOpenBrowser}\n onValueChange={(autoOpenBrowser) => onChange({ autoOpenBrowser })}\n />\n </View>\n );\n}\n\nexport function useComputerSettings() {\n const [settings, setSettings] = useState<ComputerSettingsValues>(DEFAULT_SETTINGS);\n\n useEffect(() => {\n let cancelled = false;\n loadSettings().then((next) => {\n if (!cancelled) setSettings(next);\n });\n return () => {\n cancelled = true;\n };\n }, []);\n\n const patchSettings = useCallback((patch: Partial<ComputerSettingsValues>) => {\n setSettings((prev) => {\n const next = { ...prev, ...patch };\n void saveSettings(next);\n return next;\n });\n }, []);\n\n return { settings, patchSettings };\n}\n\nconst styles = StyleSheet.create({\n settingsBody: {\n paddingHorizontal: 16,\n paddingBottom: 8,\n },\n settingRow: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 12,\n paddingVertical: 12,\n borderBottomWidth: StyleSheet.hairlineWidth,\n borderBottomColor: 'rgba(148,163,184,0.18)',\n },\n settingCopy: {\n flex: 1,\n minWidth: 0,\n paddingRight: 8,\n gap: 4,\n },\n settingLabel: {\n fontSize: 14,\n fontWeight: '600',\n },\n settingDesc: {\n fontSize: 12,\n lineHeight: 16,\n },\n});\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,130 @@
1
+ import {jsx,jsxs}from'react/jsx-runtime';import {useWindowDimensions,Modal,View,StyleSheet,Pressable,Text}from'react-native';import {MaterialCommunityIcons}from'@expo/vector-icons';import {useSafeAreaInsets}from'react-native-safe-area-context';import {mobileTokens}from'../../theme/mobileTokens.js';var __defProp = Object.defineProperty;
2
+ var __defProps = Object.defineProperties;
3
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
7
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
+ var __spreadValues = (a, b) => {
9
+ for (var prop in b || (b = {}))
10
+ if (__hasOwnProp.call(b, prop))
11
+ __defNormalProp(a, prop, b[prop]);
12
+ if (__getOwnPropSymbols)
13
+ for (var prop of __getOwnPropSymbols(b)) {
14
+ if (__propIsEnum.call(b, prop))
15
+ __defNormalProp(a, prop, b[prop]);
16
+ }
17
+ return a;
18
+ };
19
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
+ function HeaderSheet({
21
+ visible,
22
+ title,
23
+ subtitle,
24
+ isDark,
25
+ onClose,
26
+ headerRight,
27
+ children
28
+ }) {
29
+ const insets = useSafeAreaInsets();
30
+ const {
31
+ height: windowHeight
32
+ } = useWindowDimensions();
33
+ const sheetBg = isDark ? "#0f172a" : mobileTokens.color.surface;
34
+ const borderColor = isDark ? "rgba(148,163,184,0.22)" : mobileTokens.color.border;
35
+ const foreground = isDark ? "#e2e8f0" : mobileTokens.color.text;
36
+ const muted = isDark ? "#94a3b8" : mobileTokens.color.textMuted;
37
+ return /* @__PURE__ */ jsx(Modal, { visible, transparent: true, animationType: "slide", onRequestClose: onClose, children: /* @__PURE__ */ jsxs(View, { style: styles.modalRoot, children: [
38
+ /* @__PURE__ */ jsx(Pressable, { style: styles.backdrop, onPress: onClose, accessibilityLabel: "Close" }),
39
+ /* @__PURE__ */ jsxs(View, { style: [styles.sheet, {
40
+ backgroundColor: sheetBg,
41
+ borderColor,
42
+ maxHeight: windowHeight * 0.72,
43
+ paddingBottom: Math.max(insets.bottom, 16)
44
+ }], children: [
45
+ /* @__PURE__ */ jsx(View, { style: styles.handleWrap, children: /* @__PURE__ */ jsx(View, { style: [styles.handle, {
46
+ backgroundColor: borderColor
47
+ }] }) }),
48
+ /* @__PURE__ */ jsxs(View, { style: styles.header, children: [
49
+ /* @__PURE__ */ jsxs(View, { style: styles.headerText, children: [
50
+ /* @__PURE__ */ jsx(Text, { style: [styles.title, {
51
+ color: foreground
52
+ }], children: title }),
53
+ subtitle ? /* @__PURE__ */ jsx(Text, { style: [styles.subtitle, {
54
+ color: muted
55
+ }], children: subtitle }) : null
56
+ ] }),
57
+ /* @__PURE__ */ jsxs(View, { style: styles.headerActions, children: [
58
+ headerRight,
59
+ /* @__PURE__ */ jsx(Pressable, { onPress: onClose, accessibilityLabel: "Close", accessibilityRole: "button", hitSlop: 8, style: ({
60
+ pressed
61
+ }) => [styles.closeBtn, pressed && styles.pressed], children: /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "close", size: 18, color: muted }) })
62
+ ] })
63
+ ] }),
64
+ children
65
+ ] })
66
+ ] }) });
67
+ }
68
+ const styles = StyleSheet.create({
69
+ modalRoot: {
70
+ flex: 1,
71
+ justifyContent: "flex-end"
72
+ },
73
+ backdrop: __spreadProps(__spreadValues({}, StyleSheet.absoluteFillObject), {
74
+ backgroundColor: "rgba(15, 23, 42, 0.36)"
75
+ }),
76
+ sheet: {
77
+ borderTopLeftRadius: 18,
78
+ borderTopRightRadius: 18,
79
+ width: "100%",
80
+ overflow: "hidden",
81
+ borderWidth: StyleSheet.hairlineWidth
82
+ },
83
+ handleWrap: {
84
+ alignItems: "center",
85
+ paddingTop: 8,
86
+ paddingBottom: 4
87
+ },
88
+ handle: {
89
+ width: 36,
90
+ height: 4,
91
+ borderRadius: 999
92
+ },
93
+ header: {
94
+ flexDirection: "row",
95
+ alignItems: "flex-start",
96
+ justifyContent: "space-between",
97
+ paddingHorizontal: 16,
98
+ paddingBottom: 10,
99
+ gap: 12
100
+ },
101
+ headerText: {
102
+ flex: 1,
103
+ minWidth: 0,
104
+ gap: 2
105
+ },
106
+ headerActions: {
107
+ flexDirection: "row",
108
+ alignItems: "center",
109
+ gap: 4
110
+ },
111
+ title: {
112
+ fontSize: 20,
113
+ fontWeight: "700",
114
+ letterSpacing: -0.4
115
+ },
116
+ subtitle: {
117
+ fontSize: 13,
118
+ lineHeight: 18
119
+ },
120
+ closeBtn: {
121
+ width: 32,
122
+ height: 32,
123
+ alignItems: "center",
124
+ justifyContent: "center",
125
+ borderRadius: 16
126
+ },
127
+ pressed: {
128
+ opacity: 0.6
129
+ }
130
+ });export{HeaderSheet};//# sourceMappingURL=HeaderSheet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HeaderSheet.js","sources":["../../../src/components/NavigationHeader/HeaderSheet.tsx"],"sourcesContent":["/**\n * Bottom sheet chrome for header pickers (Tasks, Skills, Settings).\n * Matches the Apps launcher sheet so every toolbar menu feels like one family.\n */\nimport React, { type ReactNode } from 'react';\nimport { Modal, Pressable, StyleSheet, Text, View, useWindowDimensions } from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\nimport { mobileTokens } from '../../theme/mobileTokens';\n\nexport type HeaderSheetProps = {\n visible: boolean;\n title: string;\n subtitle?: string;\n isDark: boolean;\n onClose: () => void;\n headerRight?: ReactNode;\n children: ReactNode;\n};\n\nexport function HeaderSheet({ visible, title, subtitle, isDark, onClose, headerRight, children }: HeaderSheetProps) {\n const insets = useSafeAreaInsets();\n const { height: windowHeight } = useWindowDimensions();\n const sheetBg = isDark ? '#0f172a' : mobileTokens.color.surface;\n const borderColor = isDark ? 'rgba(148,163,184,0.22)' : mobileTokens.color.border;\n const foreground = isDark ? '#e2e8f0' : mobileTokens.color.text;\n const muted = isDark ? '#94a3b8' : mobileTokens.color.textMuted;\n\n return (\n <Modal visible={visible} transparent animationType=\"slide\" onRequestClose={onClose}>\n <View style={styles.modalRoot}>\n <Pressable style={styles.backdrop} onPress={onClose} accessibilityLabel=\"Close\" />\n <View\n style={[\n styles.sheet,\n {\n backgroundColor: sheetBg,\n borderColor,\n maxHeight: windowHeight * 0.72,\n paddingBottom: Math.max(insets.bottom, 16),\n },\n ]}\n >\n <View style={styles.handleWrap}>\n <View style={[styles.handle, { backgroundColor: borderColor }]} />\n </View>\n <View style={styles.header}>\n <View style={styles.headerText}>\n <Text style={[styles.title, { color: foreground }]}>{title}</Text>\n {subtitle ? <Text style={[styles.subtitle, { color: muted }]}>{subtitle}</Text> : null}\n </View>\n <View style={styles.headerActions}>\n {headerRight}\n <Pressable\n onPress={onClose}\n accessibilityLabel=\"Close\"\n accessibilityRole=\"button\"\n hitSlop={8}\n style={({ pressed }) => [styles.closeBtn, pressed && styles.pressed]}\n >\n <MaterialCommunityIcons name=\"close\" size={18} color={muted} />\n </Pressable>\n </View>\n </View>\n {children}\n </View>\n </View>\n </Modal>\n );\n}\n\nconst styles = StyleSheet.create({\n modalRoot: {\n flex: 1,\n justifyContent: 'flex-end',\n },\n backdrop: {\n ...StyleSheet.absoluteFillObject,\n backgroundColor: 'rgba(15, 23, 42, 0.36)',\n },\n sheet: {\n borderTopLeftRadius: 18,\n borderTopRightRadius: 18,\n width: '100%',\n overflow: 'hidden',\n borderWidth: StyleSheet.hairlineWidth,\n },\n handleWrap: {\n alignItems: 'center',\n paddingTop: 8,\n paddingBottom: 4,\n },\n handle: {\n width: 36,\n height: 4,\n borderRadius: 999,\n },\n header: {\n flexDirection: 'row',\n alignItems: 'flex-start',\n justifyContent: 'space-between',\n paddingHorizontal: 16,\n paddingBottom: 10,\n gap: 12,\n },\n headerText: {\n flex: 1,\n minWidth: 0,\n gap: 2,\n },\n headerActions: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 4,\n },\n title: {\n fontSize: 20,\n fontWeight: '700',\n letterSpacing: -0.4,\n },\n subtitle: {\n fontSize: 13,\n lineHeight: 18,\n },\n closeBtn: {\n width: 32,\n height: 32,\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: 16,\n },\n pressed: {\n opacity: 0.6,\n },\n});\n"],"names":[],"mappings":"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"}