@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.
- package/lib/components/AppsMenu/AppsMenu.js +2 -2
- package/lib/components/AppsMenu/AppsMenu.js.map +1 -1
- package/lib/components/GatewayToolbarButtonMobile.js +3 -4
- package/lib/components/GatewayToolbarButtonMobile.js.map +1 -1
- package/lib/components/KeyboardComposerDock.js +27 -0
- package/lib/components/KeyboardComposerDock.js.map +1 -0
- package/lib/components/NavigationHeader/ChatHistoryToggleMobile.js +6 -0
- package/lib/components/NavigationHeader/ChatHistoryToggleMobile.js.map +1 -0
- package/lib/components/NavigationHeader/HeaderMoreMenu.js +67 -0
- package/lib/components/NavigationHeader/HeaderMoreMenu.js.map +1 -0
- package/lib/components/NavigationHeader/HeaderSettingsMenu.js +132 -0
- package/lib/components/NavigationHeader/HeaderSettingsMenu.js.map +1 -0
- package/lib/components/NavigationHeader/HeaderSheet.js +130 -0
- package/lib/components/NavigationHeader/HeaderSheet.js.map +1 -0
- package/lib/components/NavigationHeader/HeaderSkillsButton.js +120 -0
- package/lib/components/NavigationHeader/HeaderSkillsButton.js.map +1 -0
- package/lib/components/NavigationHeader/HeaderTasksButton.js +157 -0
- package/lib/components/NavigationHeader/HeaderTasksButton.js.map +1 -0
- package/lib/components/NavigationHeader/HeaderToolbarButton.js +68 -0
- package/lib/components/NavigationHeader/HeaderToolbarButton.js.map +1 -0
- package/lib/components/NavigationHeader/NavigationHeader.js +35 -63
- package/lib/components/NavigationHeader/NavigationHeader.js.map +1 -1
- package/lib/compute.js +1 -1
- package/lib/compute.js.map +1 -1
- package/lib/contexts/GatewayContext.js +8 -1
- package/lib/contexts/GatewayContext.js.map +1 -1
- package/lib/features/chat/temporaryChatStore.js +19 -0
- package/lib/features/chat/temporaryChatStore.js.map +1 -0
- package/lib/hooks/useAgentSessionState.js +5 -0
- package/lib/hooks/useAgentSessionState.js.map +1 -0
- package/lib/hooks/useCdecliChannel.js +84 -2
- package/lib/hooks/useCdecliChannel.js.map +1 -1
- package/lib/hooks/useChatApi.js +22 -1
- package/lib/hooks/useChatApi.js.map +1 -1
- package/lib/hooks/useChatStream.js +81 -11
- package/lib/hooks/useChatStream.js.map +1 -1
- package/lib/hooks/useKeyboardBottomOffset.js +22 -0
- package/lib/hooks/useKeyboardBottomOffset.js.map +1 -0
- package/lib/hooks/useMarketplaceTemplateGroups.js +1 -1
- package/lib/hooks/useMarketplaceTemplateGroups.js.map +1 -1
- package/lib/routes.json +1 -1
- package/lib/screens/Chat/index.js +56 -100
- package/lib/screens/Chat/index.js.map +1 -1
- package/lib/screens/ChatHistory/index.js +12 -1
- package/lib/screens/ChatHistory/index.js.map +1 -1
- package/lib/screens/Home/HomeScreen.js +58 -58
- package/lib/screens/Home/HomeScreen.js.map +1 -1
- package/lib/screens/Home/components/BuildTemplatesSection.js +12 -33
- package/lib/screens/Home/components/BuildTemplatesSection.js.map +1 -1
- package/lib/screens/Home/components/ChatHistoryLanding.js +16 -3
- package/lib/screens/Home/components/ChatHistoryLanding.js.map +1 -1
- package/lib/screens/Home/components/HomeSuggestions.js +7 -2
- package/lib/screens/Home/components/HomeSuggestions.js.map +1 -1
- 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:
|
|
175
|
+
paddingHorizontal: 6,
|
|
176
176
|
borderRadius: 10
|
|
177
177
|
},
|
|
178
178
|
triggerPressed: {
|
|
179
179
|
opacity: 0.7
|
|
180
180
|
},
|
|
181
181
|
triggerLabel: {
|
|
182
|
-
fontSize:
|
|
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:
|
|
38
|
+
gap: 4,
|
|
40
39
|
height: 36,
|
|
41
|
-
paddingHorizontal:
|
|
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:
|
|
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: {
|
|
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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"}
|