@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
@@ -0,0 +1,120 @@
1
+ import {jsxs,Fragment,jsx}from'react/jsx-runtime';import {useState,useMemo,useCallback}from'react';import {ScrollView,StyleSheet,Text,Pressable,View}from'react-native';import {MaterialCommunityIcons}from'@expo/vector-icons';import {useCdecliConnection}from'../../contexts/CdecliConnectionContext.js';import {useGatewayContext,parseActiveSkills,skillDisplayName}from'../../contexts/GatewayContext.js';import {useAgentSessionState}from'../../hooks/useAgentSessionState.js';import {mobileTokens}from'../../theme/mobileTokens.js';import {HeaderSheet}from'./HeaderSheet.js';import {HeaderToolbarButton}from'./HeaderToolbarButton.js';const BUILTIN_SKILLS = [{
2
+ key: "yantra-github-search",
3
+ name: "GitHub Research",
4
+ description: "Search and summarize relevant GitHub repositories."
5
+ }];
6
+ function SkillsSheet({
7
+ isDark,
8
+ onClose
9
+ }) {
10
+ const {
11
+ activeSkill,
12
+ setActiveSkill
13
+ } = useGatewayContext();
14
+ const cdecli = useCdecliConnection();
15
+ const session = useAgentSessionState();
16
+ const activeKeys = useMemo(() => parseActiveSkills(activeSkill), [activeSkill]);
17
+ const foreground = isDark ? "#e2e8f0" : mobileTokens.color.text;
18
+ const muted = isDark ? "#94a3b8" : mobileTokens.color.textMuted;
19
+ const rows = useMemo(() => {
20
+ const fromGateway = session.skills.map((skill) => ({
21
+ key: skill.skillKey,
22
+ name: skill.name || skillDisplayName(skill.skillKey),
23
+ description: skill.description || (skill.eligible ? "Available" : "Not eligible")
24
+ }));
25
+ const seen = new Set(fromGateway.map((row) => row.key));
26
+ const extras = BUILTIN_SKILLS.filter((row) => !seen.has(row.key));
27
+ return [...extras, ...fromGateway];
28
+ }, [session.skills]);
29
+ const toggle = useCallback(async (key) => {
30
+ const next = activeKeys.includes(key) ? activeKeys.filter((item) => item !== key) : [...activeKeys, key];
31
+ const csv = next.length > 0 ? next.join(",") : null;
32
+ setActiveSkill(csv);
33
+ if (csv && cdecli.cdecliSelected) {
34
+ try {
35
+ await cdecli.connectWithSkill(csv);
36
+ } catch (e) {
37
+ }
38
+ }
39
+ }, [activeKeys, cdecli, setActiveSkill]);
40
+ return /* @__PURE__ */ jsx(HeaderSheet, { visible: true, title: "Skills", subtitle: activeKeys.length > 0 ? `${activeKeys.length} active` : "Pick a skill template for this session", isDark, onClose, children: /* @__PURE__ */ jsx(ScrollView, { contentContainerStyle: styles.list, keyboardShouldPersistTaps: "handled", children: rows.length === 0 ? /* @__PURE__ */ jsx(Text, { style: [styles.empty, {
41
+ color: muted
42
+ }], children: "No skill templates yet. Connect Yantra to load gateway skills." }) : rows.map((row) => {
43
+ const selected = activeKeys.includes(row.key);
44
+ return /* @__PURE__ */ jsxs(Pressable, { onPress: () => {
45
+ void toggle(row.key);
46
+ }, style: ({
47
+ pressed
48
+ }) => [styles.row, selected && styles.rowActive, isDark && selected && styles.rowActiveDark, pressed && styles.pressed], children: [
49
+ /* @__PURE__ */ jsxs(View, { style: styles.rowBody, children: [
50
+ /* @__PURE__ */ jsx(Text, { style: [styles.rowTitle, {
51
+ color: foreground
52
+ }], numberOfLines: 1, children: row.name }),
53
+ /* @__PURE__ */ jsx(Text, { style: [styles.rowMeta, {
54
+ color: muted
55
+ }], numberOfLines: 2, children: row.description })
56
+ ] }),
57
+ selected ? /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "check", size: 18, color: mobileTokens.color.primary }) : null
58
+ ] }, row.key);
59
+ }) }) });
60
+ }
61
+ function HeaderSkillsButton({
62
+ isDark
63
+ }) {
64
+ const {
65
+ activeSkill
66
+ } = useGatewayContext();
67
+ const [open, setOpen] = useState(false);
68
+ const count = parseActiveSkills(activeSkill).length;
69
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
70
+ /* @__PURE__ */ jsx(HeaderToolbarButton, { icon: "puzzle-outline", label: "Skills", badge: count, active: open || count > 0, onPress: () => setOpen(true), accessibilityLabel: "Skill templates", isDark }),
71
+ open ? /* @__PURE__ */ jsx(SkillsSheet, { isDark, onClose: () => setOpen(false) }) : null
72
+ ] });
73
+ }
74
+ const styles = StyleSheet.create({
75
+ list: {
76
+ paddingHorizontal: 16,
77
+ paddingBottom: 12,
78
+ gap: 8
79
+ },
80
+ row: {
81
+ flexDirection: "row",
82
+ alignItems: "center",
83
+ gap: 10,
84
+ borderRadius: 12,
85
+ borderWidth: 1,
86
+ borderColor: "transparent",
87
+ paddingHorizontal: 12,
88
+ paddingVertical: 10,
89
+ backgroundColor: mobileTokens.color.surfaceMuted
90
+ },
91
+ rowActive: {
92
+ borderColor: mobileTokens.color.primaryBorder,
93
+ backgroundColor: mobileTokens.color.primarySoft
94
+ },
95
+ rowActiveDark: {
96
+ backgroundColor: "rgba(79,70,229,0.18)"
97
+ },
98
+ pressed: {
99
+ opacity: 0.7
100
+ },
101
+ rowBody: {
102
+ flex: 1,
103
+ minWidth: 0,
104
+ gap: 2
105
+ },
106
+ rowTitle: {
107
+ fontSize: 14,
108
+ fontWeight: "600"
109
+ },
110
+ rowMeta: {
111
+ fontSize: 12,
112
+ lineHeight: 16
113
+ },
114
+ empty: {
115
+ fontSize: 14,
116
+ lineHeight: 20,
117
+ paddingVertical: 20,
118
+ textAlign: "center"
119
+ }
120
+ });export{HeaderSkillsButton};//# sourceMappingURL=HeaderSkillsButton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HeaderSkillsButton.js","sources":["../../../src/components/NavigationHeader/HeaderSkillsButton.tsx"],"sourcesContent":["import React, { useCallback, useMemo, useState } from 'react';\nimport { Pressable, ScrollView, StyleSheet, Text, View } from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { useCdecliConnection } from '../../contexts/CdecliConnectionContext';\nimport { parseActiveSkills, skillDisplayName, useGatewayContext } from '../../contexts/GatewayContext';\nimport { useAgentSessionState } from '../../hooks/useAgentSessionState';\nimport { mobileTokens } from '../../theme/mobileTokens';\nimport { HeaderSheet } from './HeaderSheet';\nimport { HeaderToolbarButton } from './HeaderToolbarButton';\n\ntype Props = {\n isDark: boolean;\n};\n\nconst BUILTIN_SKILLS = [\n {\n key: 'yantra-github-search',\n name: 'GitHub Research',\n description: 'Search and summarize relevant GitHub repositories.',\n },\n];\n\nfunction SkillsSheet({ isDark, onClose }: { isDark: boolean; onClose: () => void }) {\n const { activeSkill, setActiveSkill } = useGatewayContext();\n const cdecli = useCdecliConnection();\n const session = useAgentSessionState();\n const activeKeys = useMemo(() => parseActiveSkills(activeSkill), [activeSkill]);\n const foreground = isDark ? '#e2e8f0' : mobileTokens.color.text;\n const muted = isDark ? '#94a3b8' : mobileTokens.color.textMuted;\n\n const rows = useMemo(() => {\n const fromGateway = session.skills.map((skill) => ({\n key: skill.skillKey,\n name: skill.name || skillDisplayName(skill.skillKey),\n description: skill.description || (skill.eligible ? 'Available' : 'Not eligible'),\n }));\n const seen = new Set(fromGateway.map((row) => row.key));\n const extras = BUILTIN_SKILLS.filter((row) => !seen.has(row.key));\n return [...extras, ...fromGateway];\n }, [session.skills]);\n\n const toggle = useCallback(\n async (key: string) => {\n const next = activeKeys.includes(key) ? activeKeys.filter((item) => item !== key) : [...activeKeys, key];\n const csv = next.length > 0 ? next.join(',') : null;\n setActiveSkill(csv);\n if (csv && cdecli.cdecliSelected) {\n try {\n await cdecli.connectWithSkill(csv);\n } catch {\n /* connectWithSkill already records status on the connection. */\n }\n }\n },\n [activeKeys, cdecli, setActiveSkill],\n );\n\n return (\n <HeaderSheet\n visible\n title=\"Skills\"\n subtitle={activeKeys.length > 0 ? `${activeKeys.length} active` : 'Pick a skill template for this session'}\n isDark={isDark}\n onClose={onClose}\n >\n <ScrollView contentContainerStyle={styles.list} keyboardShouldPersistTaps=\"handled\">\n {rows.length === 0 ? (\n <Text style={[styles.empty, { color: muted }]}>\n No skill templates yet. Connect Yantra to load gateway skills.\n </Text>\n ) : (\n rows.map((row) => {\n const selected = activeKeys.includes(row.key);\n return (\n <Pressable\n key={row.key}\n onPress={() => {\n void toggle(row.key);\n }}\n style={({ pressed }) => [\n styles.row,\n selected && styles.rowActive,\n isDark && selected && styles.rowActiveDark,\n pressed && styles.pressed,\n ]}\n >\n <View style={styles.rowBody}>\n <Text style={[styles.rowTitle, { color: foreground }]} numberOfLines={1}>\n {row.name}\n </Text>\n <Text style={[styles.rowMeta, { color: muted }]} numberOfLines={2}>\n {row.description}\n </Text>\n </View>\n {selected ? (\n <MaterialCommunityIcons name=\"check\" size={18} color={mobileTokens.color.primary} />\n ) : null}\n </Pressable>\n );\n })\n )}\n </ScrollView>\n </HeaderSheet>\n );\n}\n\nexport function HeaderSkillsButton({ isDark }: Props) {\n const { activeSkill } = useGatewayContext();\n const [open, setOpen] = useState(false);\n const count = parseActiveSkills(activeSkill).length;\n\n return (\n <>\n <HeaderToolbarButton\n icon=\"puzzle-outline\"\n label=\"Skills\"\n badge={count}\n active={open || count > 0}\n onPress={() => setOpen(true)}\n accessibilityLabel=\"Skill templates\"\n isDark={isDark}\n />\n {open ? <SkillsSheet isDark={isDark} onClose={() => setOpen(false)} /> : null}\n </>\n );\n}\n\nconst styles = StyleSheet.create({\n list: {\n paddingHorizontal: 16,\n paddingBottom: 12,\n gap: 8,\n },\n row: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 10,\n borderRadius: 12,\n borderWidth: 1,\n borderColor: 'transparent',\n paddingHorizontal: 12,\n paddingVertical: 10,\n backgroundColor: mobileTokens.color.surfaceMuted,\n },\n rowActive: {\n borderColor: mobileTokens.color.primaryBorder,\n backgroundColor: mobileTokens.color.primarySoft,\n },\n rowActiveDark: {\n backgroundColor: 'rgba(79,70,229,0.18)',\n },\n pressed: {\n opacity: 0.7,\n },\n rowBody: {\n flex: 1,\n minWidth: 0,\n gap: 2,\n },\n rowTitle: {\n fontSize: 14,\n fontWeight: '600',\n },\n rowMeta: {\n fontSize: 12,\n lineHeight: 16,\n },\n empty: {\n fontSize: 14,\n lineHeight: 20,\n paddingVertical: 20,\n textAlign: 'center',\n },\n});\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,157 @@
1
+ import {jsxs,Fragment,jsx}from'react/jsx-runtime';import {useState,useCallback}from'react';import {ScrollView,StyleSheet,Text,Pressable,View}from'react-native';import {MaterialCommunityIcons}from'@expo/vector-icons';import {MAX_CONCURRENT_TASKS}from'../../config/constants.js';import {useAgentSessionState}from'../../hooks/useAgentSessionState.js';import {agentSessionManager}from'../../services/agentSessionManager.js';import {mobileTokens}from'../../theme/mobileTokens.js';import {HeaderSheet}from'./HeaderSheet.js';import {HeaderToolbarButton}from'./HeaderToolbarButton.js';const STATUS_LABEL = {
2
+ idle: "Idle",
3
+ connecting: "Connecting",
4
+ running: "Running",
5
+ completed: "Completed",
6
+ failed: "Failed",
7
+ aborted: "Aborted"
8
+ };
9
+ function statusColor(status, isDark) {
10
+ if (status === "running" || status === "connecting") return isDark ? "#60a5fa" : "#2563eb";
11
+ if (status === "completed") return isDark ? "#4ade80" : "#16a34a";
12
+ if (status === "failed") return isDark ? "#f87171" : "#dc2626";
13
+ if (status === "aborted") return isDark ? "#fb923c" : "#ea580c";
14
+ return isDark ? "#94a3b8" : mobileTokens.color.textMuted;
15
+ }
16
+ function TaskRow({
17
+ task,
18
+ isActive,
19
+ isDark,
20
+ onSelect,
21
+ onRemove
22
+ }) {
23
+ const foreground = isDark ? "#e2e8f0" : mobileTokens.color.text;
24
+ const muted = isDark ? "#94a3b8" : mobileTokens.color.textMuted;
25
+ const last = task.messages[task.messages.length - 1];
26
+ const preview = last ? last.content.length > 72 ? `${last.content.slice(0, 72)}\u2026` : last.content : "No messages yet";
27
+ return /* @__PURE__ */ jsxs(Pressable, { onPress: onSelect, style: ({
28
+ pressed
29
+ }) => [styles.row, isActive && styles.rowActive, isDark && isActive && styles.rowActiveDark, pressed && styles.pressed], children: [
30
+ /* @__PURE__ */ jsx(View, { style: [styles.dot, {
31
+ backgroundColor: statusColor(task.status, isDark)
32
+ }] }),
33
+ /* @__PURE__ */ jsxs(View, { style: styles.rowBody, children: [
34
+ /* @__PURE__ */ jsx(Text, { style: [styles.rowTitle, {
35
+ color: foreground
36
+ }], numberOfLines: 1, children: task.title }),
37
+ /* @__PURE__ */ jsxs(Text, { style: [styles.rowMeta, {
38
+ color: muted
39
+ }], numberOfLines: 1, children: [
40
+ STATUS_LABEL[task.status],
41
+ " \xB7 ",
42
+ preview
43
+ ] })
44
+ ] }),
45
+ /* @__PURE__ */ jsx(Pressable, { onPress: onRemove, hitSlop: 8, accessibilityLabel: "Remove task", children: /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "close", size: 16, color: muted }) })
46
+ ] });
47
+ }
48
+ function TasksSheet({
49
+ isDark,
50
+ onClose
51
+ }) {
52
+ const session = useAgentSessionState();
53
+ const muted = isDark ? "#94a3b8" : mobileTokens.color.textMuted;
54
+ const foreground = isDark ? "#e2e8f0" : mobileTokens.color.text;
55
+ const canCreate = session.tasks.length < MAX_CONCURRENT_TASKS;
56
+ const handleNew = useCallback(() => {
57
+ agentSessionManager.createTask({
58
+ title: "General Assistant"
59
+ });
60
+ }, []);
61
+ return /* @__PURE__ */ jsx(HeaderSheet, { visible: true, title: "Tasks", subtitle: session.gatewayConnected ? `${session.tasks.length} of ${MAX_CONCURRENT_TASKS} slots` : "Connect Yantra to keep agent sessions running", isDark, onClose, headerRight: /* @__PURE__ */ jsxs(Pressable, { onPress: handleNew, disabled: !canCreate, accessibilityLabel: "Start new task", style: ({
62
+ pressed
63
+ }) => [styles.newBtn, pressed && styles.pressed, !canCreate && styles.disabled], children: [
64
+ /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "plus", size: 16, color: mobileTokens.color.primary }),
65
+ /* @__PURE__ */ jsx(Text, { style: styles.newBtnLabel, children: "New" })
66
+ ] }), children: /* @__PURE__ */ jsxs(ScrollView, { contentContainerStyle: styles.list, keyboardShouldPersistTaps: "handled", children: [
67
+ session.tasks.length === 0 ? /* @__PURE__ */ jsx(Text, { style: [styles.empty, {
68
+ color: muted
69
+ }], children: "No running tasks. Start one to keep an agent session alive alongside chat." }) : session.tasks.map((task) => /* @__PURE__ */ jsx(TaskRow, { task, isActive: session.activeTaskId === task.id, isDark, onSelect: () => agentSessionManager.setActiveTask(task.id), onRemove: () => agentSessionManager.removeTask(task.id) }, task.id)),
70
+ !session.gatewayConnected ? /* @__PURE__ */ jsx(Text, { style: [styles.hint, {
71
+ color: foreground
72
+ }], children: "Tasks stay on this device until Yantra is connected." }) : null
73
+ ] }) });
74
+ }
75
+ function HeaderTasksButton({
76
+ isDark
77
+ }) {
78
+ const session = useAgentSessionState();
79
+ const [open, setOpen] = useState(false);
80
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
81
+ /* @__PURE__ */ jsx(HeaderToolbarButton, { icon: "pulse", label: "Tasks", badge: session.tasks.length, active: open, onPress: () => setOpen(true), accessibilityLabel: "Tasks", isDark }),
82
+ open ? /* @__PURE__ */ jsx(TasksSheet, { isDark, onClose: () => setOpen(false) }) : null
83
+ ] });
84
+ }
85
+ const styles = StyleSheet.create({
86
+ list: {
87
+ paddingHorizontal: 16,
88
+ paddingBottom: 12,
89
+ gap: 8
90
+ },
91
+ row: {
92
+ flexDirection: "row",
93
+ alignItems: "center",
94
+ gap: 10,
95
+ borderRadius: 12,
96
+ borderWidth: 1,
97
+ borderColor: "transparent",
98
+ paddingHorizontal: 12,
99
+ paddingVertical: 10,
100
+ backgroundColor: mobileTokens.color.surfaceMuted
101
+ },
102
+ rowActive: {
103
+ borderColor: mobileTokens.color.primaryBorder,
104
+ backgroundColor: mobileTokens.color.primarySoft
105
+ },
106
+ rowActiveDark: {
107
+ backgroundColor: "rgba(79,70,229,0.18)"
108
+ },
109
+ pressed: {
110
+ opacity: 0.7
111
+ },
112
+ disabled: {
113
+ opacity: 0.4
114
+ },
115
+ dot: {
116
+ width: 8,
117
+ height: 8,
118
+ borderRadius: 4
119
+ },
120
+ rowBody: {
121
+ flex: 1,
122
+ minWidth: 0,
123
+ gap: 2
124
+ },
125
+ rowTitle: {
126
+ fontSize: 14,
127
+ fontWeight: "600"
128
+ },
129
+ rowMeta: {
130
+ fontSize: 12
131
+ },
132
+ empty: {
133
+ fontSize: 14,
134
+ lineHeight: 20,
135
+ paddingVertical: 20,
136
+ textAlign: "center"
137
+ },
138
+ hint: {
139
+ fontSize: 12,
140
+ lineHeight: 18,
141
+ paddingTop: 4,
142
+ opacity: 0.7
143
+ },
144
+ newBtn: {
145
+ flexDirection: "row",
146
+ alignItems: "center",
147
+ gap: 2,
148
+ height: 32,
149
+ paddingHorizontal: 8,
150
+ borderRadius: 10
151
+ },
152
+ newBtnLabel: {
153
+ fontSize: 13,
154
+ fontWeight: "600",
155
+ color: mobileTokens.color.primary
156
+ }
157
+ });export{HeaderTasksButton};//# sourceMappingURL=HeaderTasksButton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HeaderTasksButton.js","sources":["../../../src/components/NavigationHeader/HeaderTasksButton.tsx"],"sourcesContent":["import React, { useCallback, useState } from 'react';\nimport { Pressable, ScrollView, StyleSheet, Text, View } from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { MAX_CONCURRENT_TASKS } from '../../config/constants';\nimport { useAgentSessionState } from '../../hooks/useAgentSessionState';\nimport { agentSessionManager, type AgentTask, type TaskStatus } from '../../services/agentSessionManager';\nimport { mobileTokens } from '../../theme/mobileTokens';\nimport { HeaderSheet } from './HeaderSheet';\nimport { HeaderToolbarButton } from './HeaderToolbarButton';\n\ntype Props = {\n isDark: boolean;\n};\n\nconst STATUS_LABEL: Record<TaskStatus, string> = {\n idle: 'Idle',\n connecting: 'Connecting',\n running: 'Running',\n completed: 'Completed',\n failed: 'Failed',\n aborted: 'Aborted',\n};\n\nfunction statusColor(status: TaskStatus, isDark: boolean): string {\n if (status === 'running' || status === 'connecting') return isDark ? '#60a5fa' : '#2563eb';\n if (status === 'completed') return isDark ? '#4ade80' : '#16a34a';\n if (status === 'failed') return isDark ? '#f87171' : '#dc2626';\n if (status === 'aborted') return isDark ? '#fb923c' : '#ea580c';\n return isDark ? '#94a3b8' : mobileTokens.color.textMuted;\n}\n\nfunction TaskRow({\n task,\n isActive,\n isDark,\n onSelect,\n onRemove,\n}: {\n task: AgentTask;\n isActive: boolean;\n isDark: boolean;\n onSelect: () => void;\n onRemove: () => void;\n}) {\n const foreground = isDark ? '#e2e8f0' : mobileTokens.color.text;\n const muted = isDark ? '#94a3b8' : mobileTokens.color.textMuted;\n const last = task.messages[task.messages.length - 1];\n const preview = last\n ? last.content.length > 72\n ? `${last.content.slice(0, 72)}…`\n : last.content\n : 'No messages yet';\n\n return (\n <Pressable\n onPress={onSelect}\n style={({ pressed }) => [\n styles.row,\n isActive && styles.rowActive,\n isDark && isActive && styles.rowActiveDark,\n pressed && styles.pressed,\n ]}\n >\n <View style={[styles.dot, { backgroundColor: statusColor(task.status, isDark) }]} />\n <View style={styles.rowBody}>\n <Text style={[styles.rowTitle, { color: foreground }]} numberOfLines={1}>\n {task.title}\n </Text>\n <Text style={[styles.rowMeta, { color: muted }]} numberOfLines={1}>\n {STATUS_LABEL[task.status]} · {preview}\n </Text>\n </View>\n <Pressable onPress={onRemove} hitSlop={8} accessibilityLabel=\"Remove task\">\n <MaterialCommunityIcons name=\"close\" size={16} color={muted} />\n </Pressable>\n </Pressable>\n );\n}\n\nfunction TasksSheet({ isDark, onClose }: { isDark: boolean; onClose: () => void }) {\n const session = useAgentSessionState();\n const muted = isDark ? '#94a3b8' : mobileTokens.color.textMuted;\n const foreground = isDark ? '#e2e8f0' : mobileTokens.color.text;\n const canCreate = session.tasks.length < MAX_CONCURRENT_TASKS;\n\n const handleNew = useCallback(() => {\n agentSessionManager.createTask({ title: 'General Assistant' });\n }, []);\n\n return (\n <HeaderSheet\n visible\n title=\"Tasks\"\n subtitle={\n session.gatewayConnected\n ? `${session.tasks.length} of ${MAX_CONCURRENT_TASKS} slots`\n : 'Connect Yantra to keep agent sessions running'\n }\n isDark={isDark}\n onClose={onClose}\n headerRight={\n <Pressable\n onPress={handleNew}\n disabled={!canCreate}\n accessibilityLabel=\"Start new task\"\n style={({ pressed }) => [styles.newBtn, pressed && styles.pressed, !canCreate && styles.disabled]}\n >\n <MaterialCommunityIcons name=\"plus\" size={16} color={mobileTokens.color.primary} />\n <Text style={styles.newBtnLabel}>New</Text>\n </Pressable>\n }\n >\n <ScrollView contentContainerStyle={styles.list} keyboardShouldPersistTaps=\"handled\">\n {session.tasks.length === 0 ? (\n <Text style={[styles.empty, { color: muted }]}>\n No running tasks. Start one to keep an agent session alive alongside chat.\n </Text>\n ) : (\n session.tasks.map((task) => (\n <TaskRow\n key={task.id}\n task={task}\n isActive={session.activeTaskId === task.id}\n isDark={isDark}\n onSelect={() => agentSessionManager.setActiveTask(task.id)}\n onRemove={() => agentSessionManager.removeTask(task.id)}\n />\n ))\n )}\n {!session.gatewayConnected ? (\n <Text style={[styles.hint, { color: foreground }]}>\n Tasks stay on this device until Yantra is connected.\n </Text>\n ) : null}\n </ScrollView>\n </HeaderSheet>\n );\n}\n\nexport function HeaderTasksButton({ isDark }: Props) {\n const session = useAgentSessionState();\n const [open, setOpen] = useState(false);\n\n return (\n <>\n <HeaderToolbarButton\n icon=\"pulse\"\n label=\"Tasks\"\n badge={session.tasks.length}\n active={open}\n onPress={() => setOpen(true)}\n accessibilityLabel=\"Tasks\"\n isDark={isDark}\n />\n {open ? <TasksSheet isDark={isDark} onClose={() => setOpen(false)} /> : null}\n </>\n );\n}\n\nconst styles = StyleSheet.create({\n list: {\n paddingHorizontal: 16,\n paddingBottom: 12,\n gap: 8,\n },\n row: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 10,\n borderRadius: 12,\n borderWidth: 1,\n borderColor: 'transparent',\n paddingHorizontal: 12,\n paddingVertical: 10,\n backgroundColor: mobileTokens.color.surfaceMuted,\n },\n rowActive: {\n borderColor: mobileTokens.color.primaryBorder,\n backgroundColor: mobileTokens.color.primarySoft,\n },\n rowActiveDark: {\n backgroundColor: 'rgba(79,70,229,0.18)',\n },\n pressed: {\n opacity: 0.7,\n },\n disabled: {\n opacity: 0.4,\n },\n dot: {\n width: 8,\n height: 8,\n borderRadius: 4,\n },\n rowBody: {\n flex: 1,\n minWidth: 0,\n gap: 2,\n },\n rowTitle: {\n fontSize: 14,\n fontWeight: '600',\n },\n rowMeta: {\n fontSize: 12,\n },\n empty: {\n fontSize: 14,\n lineHeight: 20,\n paddingVertical: 20,\n textAlign: 'center',\n },\n hint: {\n fontSize: 12,\n lineHeight: 18,\n paddingTop: 4,\n opacity: 0.7,\n },\n newBtn: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 2,\n height: 32,\n paddingHorizontal: 8,\n borderRadius: 10,\n },\n newBtnLabel: {\n fontSize: 13,\n fontWeight: '600',\n color: mobileTokens.color.primary,\n },\n});\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ import {jsxs,jsx}from'react/jsx-runtime';import {Pressable,StyleSheet,Text,View}from'react-native';import {MaterialCommunityIcons}from'@expo/vector-icons';import {mobileTokens}from'../../theme/mobileTokens.js';function HeaderToolbarButton({
2
+ icon,
3
+ label,
4
+ trailingIcon,
5
+ active = false,
6
+ badge,
7
+ onPress,
8
+ accessibilityLabel,
9
+ isDark,
10
+ iconColor
11
+ }) {
12
+ const ink = isDark ? "#e2e8f0" : mobileTokens.color.text;
13
+ const muted = isDark ? "#94a3b8" : mobileTokens.color.textMuted;
14
+ const color = iconColor != null ? iconColor : active ? mobileTokens.color.primary : ink;
15
+ const showBadge = typeof badge === "number" && badge > 0;
16
+ return /* @__PURE__ */ jsxs(Pressable, { onPress, accessibilityRole: "button", accessibilityLabel, accessibilityState: {
17
+ selected: active
18
+ }, hitSlop: 4, style: ({
19
+ pressed
20
+ }) => [styles.btn, active && styles.btnActive, pressed && styles.pressed], children: [
21
+ /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: icon, size: 18, color }),
22
+ label ? /* @__PURE__ */ jsx(Text, { style: [styles.label, {
23
+ color
24
+ }], numberOfLines: 1, children: label }) : null,
25
+ trailingIcon ? /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: trailingIcon, size: 14, color: muted }) : null,
26
+ showBadge ? /* @__PURE__ */ jsx(View, { style: [styles.badge, isDark ? styles.badgeDark : null], children: /* @__PURE__ */ jsx(Text, { style: [styles.badgeText, {
27
+ color: muted
28
+ }], children: badge > 9 ? "9+" : badge }) }) : null
29
+ ] });
30
+ }
31
+ const styles = StyleSheet.create({
32
+ btn: {
33
+ flexDirection: "row",
34
+ alignItems: "center",
35
+ flexShrink: 0,
36
+ gap: 4,
37
+ height: 36,
38
+ paddingHorizontal: 6,
39
+ borderRadius: 10
40
+ },
41
+ btnActive: {
42
+ backgroundColor: mobileTokens.color.primarySoft
43
+ },
44
+ pressed: {
45
+ opacity: 0.7
46
+ },
47
+ label: {
48
+ fontSize: 13,
49
+ fontWeight: "600",
50
+ letterSpacing: -0.2
51
+ },
52
+ badge: {
53
+ minWidth: 16,
54
+ height: 16,
55
+ paddingHorizontal: 4,
56
+ borderRadius: 8,
57
+ alignItems: "center",
58
+ justifyContent: "center",
59
+ backgroundColor: mobileTokens.color.surfaceMuted
60
+ },
61
+ badgeDark: {
62
+ backgroundColor: "#1e293b"
63
+ },
64
+ badgeText: {
65
+ fontSize: 10,
66
+ fontWeight: "700"
67
+ }
68
+ });export{HeaderToolbarButton};//# sourceMappingURL=HeaderToolbarButton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HeaderToolbarButton.js","sources":["../../../src/components/NavigationHeader/HeaderToolbarButton.tsx"],"sourcesContent":["/**\n * Ghost toolbar control shared by the ChatTopBar-style mobile header.\n * Icon + optional label + optional chevron, no circular chrome.\n */\nimport React from 'react';\nimport { Pressable, StyleSheet, Text, View } from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { mobileTokens } from '../../theme/mobileTokens';\n\nexport type HeaderToolbarButtonProps = {\n icon: React.ComponentProps<typeof MaterialCommunityIcons>['name'];\n label?: string;\n trailingIcon?: React.ComponentProps<typeof MaterialCommunityIcons>['name'];\n active?: boolean;\n badge?: number;\n onPress: () => void;\n accessibilityLabel: string;\n isDark: boolean;\n iconColor?: string;\n};\n\nexport function HeaderToolbarButton({\n icon,\n label,\n trailingIcon,\n active = false,\n badge,\n onPress,\n accessibilityLabel,\n isDark,\n iconColor,\n}: HeaderToolbarButtonProps) {\n const ink = isDark ? '#e2e8f0' : mobileTokens.color.text;\n const muted = isDark ? '#94a3b8' : mobileTokens.color.textMuted;\n const color = iconColor ?? (active ? mobileTokens.color.primary : ink);\n const showBadge = typeof badge === 'number' && badge > 0;\n\n return (\n <Pressable\n onPress={onPress}\n accessibilityRole=\"button\"\n accessibilityLabel={accessibilityLabel}\n accessibilityState={{ selected: active }}\n hitSlop={4}\n style={({ pressed }) => [styles.btn, active && styles.btnActive, pressed && styles.pressed]}\n >\n <MaterialCommunityIcons name={icon} size={18} color={color} />\n {label ? (\n <Text style={[styles.label, { color }]} numberOfLines={1}>\n {label}\n </Text>\n ) : null}\n {trailingIcon ? <MaterialCommunityIcons name={trailingIcon} size={14} color={muted} /> : null}\n {showBadge ? (\n <View style={[styles.badge, isDark ? styles.badgeDark : null]}>\n <Text style={[styles.badgeText, { color: muted }]}>{badge > 9 ? '9+' : badge}</Text>\n </View>\n ) : null}\n </Pressable>\n );\n}\n\nconst styles = StyleSheet.create({\n btn: {\n flexDirection: 'row',\n alignItems: 'center',\n flexShrink: 0,\n gap: 4,\n height: 36,\n paddingHorizontal: 6,\n borderRadius: 10,\n },\n btnActive: {\n backgroundColor: mobileTokens.color.primarySoft,\n },\n pressed: {\n opacity: 0.7,\n },\n label: {\n fontSize: 13,\n fontWeight: '600',\n letterSpacing: -0.2,\n },\n badge: {\n minWidth: 16,\n height: 16,\n paddingHorizontal: 4,\n borderRadius: 8,\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: mobileTokens.color.surfaceMuted,\n },\n badgeDark: {\n backgroundColor: '#1e293b',\n },\n badgeText: {\n fontSize: 10,\n fontWeight: '700',\n },\n});\n"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import {jsx,jsxs,Fragment}from'react/jsx-runtime';import React,{useMemo,useCallback}from'react';import {useColorScheme,StyleSheet,View,Pressable}from'react-native';import {useSafeAreaInsets,SafeAreaView}from'react-native-safe-area-context';import {StatusBar}from'expo-status-bar';import {useNavigation,CommonActions,DrawerActions}from'@react-navigation/native';import {getHeaderTitle}from'@react-navigation/elements';import {MaterialCommunityIcons}from'@expo/vector-icons';import {Text}from'@admin-layout/gluestack-ui-mobile';import GatewayConnector from'../GatewayConnector/GatewayConnector.js';import {AppsMenu}from'../AppsMenu/AppsMenu.js';import {mobileTokens}from'../../theme/mobileTokens.js';import {tryWebBuilderBack}from'../../screens/WebBuilder/webbuilderBackHandler.js';const ICON_SIZE = 22;
1
+ import {jsx,jsxs,Fragment}from'react/jsx-runtime';import React,{useMemo,useCallback}from'react';import {useColorScheme,StyleSheet,View,ScrollView,Pressable}from'react-native';import {useSafeAreaInsets,SafeAreaView}from'react-native-safe-area-context';import {StatusBar}from'expo-status-bar';import {useNavigation,CommonActions,DrawerActions}from'@react-navigation/native';import {getHeaderTitle}from'@react-navigation/elements';import {MaterialCommunityIcons}from'@expo/vector-icons';import {Text}from'@admin-layout/gluestack-ui-mobile';import GatewayConnector from'../GatewayConnector/GatewayConnector.js';import {AppsMenu}from'../AppsMenu/AppsMenu.js';import {tryWebBuilderBack}from'../../screens/WebBuilder/webbuilderBackHandler.js';import {ChatHistoryToggleMobile}from'./ChatHistoryToggleMobile.js';import {HeaderMoreMenu}from'./HeaderMoreMenu.js';import {HeaderSkillsButton}from'./HeaderSkillsButton.js';import {HeaderTasksButton}from'./HeaderTasksButton.js';import {HeaderToolbarButton}from'./HeaderToolbarButton.js';const ICON_SIZE = 22;
2
2
  function resolveTitle(options, route) {
3
3
  var _a, _b;
4
4
  if (typeof (options == null ? void 0 : options.title) === "string" && options.title.trim()) {
@@ -26,22 +26,18 @@ const NavigationHeader = (props) => {
26
26
  showNewChat = false,
27
27
  headerBgColor
28
28
  } = props;
29
- const showAppsLauncher = showGateway || showApps;
29
+ const showChatToolbar = showGateway || showApps;
30
30
  const fallbackNav = useNavigation();
31
31
  const navigation = navProp != null ? navProp : fallbackNav;
32
32
  const colorScheme = useColorScheme();
33
33
  const isDark = colorScheme === "dark";
34
34
  const insets = useSafeAreaInsets();
35
35
  const themeTitleColor = isDark ? "#f1f5f9" : "#0f172a";
36
- const themeAccentColor = isDark ? "#a5b4fc" : "#4338ca";
37
- const themeNewChatIconColor = isDark ? "#e5e7eb" : "#000000";
38
36
  const optionTint = typeof (options == null ? void 0 : options.headerTintColor) === "string" ? options.headerTintColor : null;
39
37
  const tintLooksDark = optionTint && /^(#?000(000)?|black)$/i.test(optionTint.trim());
40
38
  const effectiveTint = optionTint && !(isDark && tintLooksDark) ? optionTint : null;
41
39
  const titleColor = effectiveTint != null ? effectiveTint : themeTitleColor;
42
40
  const iconColor = effectiveTint != null ? effectiveTint : themeTitleColor;
43
- const accentColor = effectiveTint != null ? effectiveTint : themeAccentColor;
44
- const newChatIconColor = effectiveTint != null ? effectiveTint : themeNewChatIconColor;
45
41
  const surfaceColor = headerBgColor != null ? headerBgColor : isDark ? "#0f172a" : "#ffffff";
46
42
  const dividerColor = isDark ? "rgba(148, 163, 184, 0.18)" : "rgba(15, 23, 42, 0.06)";
47
43
  const titleAlignLeft = (options == null ? void 0 : options.headerTitleAlign) === "left";
@@ -101,19 +97,10 @@ const NavigationHeader = (props) => {
101
97
  }) => [styles.iconButton, pressed && styles.iconButtonPressed], hitSlop: 8, children: /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "chevron-left", size: ICON_SIZE + 4, color: iconColor }) }) : showToggle ? /* @__PURE__ */ jsx(Pressable, { onPress: handleToggleDrawer, accessibilityLabel: "Open menu", accessibilityRole: "button", style: ({
102
98
  pressed
103
99
  }) => [styles.iconButton, pressed && styles.iconButtonPressed], hitSlop: 8, children: /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "menu", size: ICON_SIZE, color: iconColor }) }) : null;
104
- const hideBrandTitle = showAppsLauncher && title === "Yantra";
100
+ const hideBrandTitle = showChatToolbar && title === "Yantra";
105
101
  const titleSlot = showTitle && !hideBrandTitle ? /* @__PURE__ */ jsx(Text, { style: [styles.title, titleAlignLeft ? styles.titleAlignLeft : styles.titleAlignCenter, {
106
102
  color: titleColor
107
103
  }, optionTitleStyle], numberOfLines: 1, ellipsizeMode: "tail", children: title }) : null;
108
- const showRightSlot = showHistory || showNewChat;
109
- const rightSlot = showRightSlot ? /* @__PURE__ */ jsxs(View, { style: styles.rightActions, children: [
110
- showHistory ? /* @__PURE__ */ jsx(Pressable, { onPress: handleOpenChatHistory, style: ({
111
- pressed
112
- }) => [styles.actionButton, pressed && styles.actionButtonPressed], accessibilityLabel: "Chat history", accessibilityRole: "button", hitSlop: 8, children: /* @__PURE__ */ jsx(View, { style: [styles.actionButtonInner, isDark ? styles.actionButtonInnerDark : null], children: /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "history", size: 19, color: accentColor }) }) }) : null,
113
- showNewChat ? /* @__PURE__ */ jsx(Pressable, { onPress: handleNewChat, style: ({
114
- pressed
115
- }) => [styles.actionButton, pressed && styles.actionButtonPressed], accessibilityLabel: "New chat", accessibilityRole: "button", hitSlop: 8, children: /* @__PURE__ */ jsx(View, { style: [styles.actionButtonInner, isDark ? styles.actionButtonInnerDark : null], children: /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "chat-plus-outline", size: 20, color: newChatIconColor }) }) }) : null
116
- ] }) : null;
117
104
  return /* @__PURE__ */ jsxs(Fragment, { children: [
118
105
  /* @__PURE__ */ jsx(StatusBar, { style: isDark ? "light" : "dark" }),
119
106
  /* @__PURE__ */ jsx(SafeAreaView, { edges: ["top"], style: {
@@ -123,13 +110,17 @@ const NavigationHeader = (props) => {
123
110
  borderBottomColor: dividerColor,
124
111
  paddingTop: insets.top > 0 ? 0 : 6
125
112
  }, (_c = options == null ? void 0 : options.headerStyle) != null ? _c : null], children: [
126
- /* @__PURE__ */ jsxs(View, { style: styles.leftSlot, children: [
127
- leftSlot,
128
- showAppsLauncher ? /* @__PURE__ */ jsx(AppsMenu, { isDark, orgName }) : null,
129
- showGateway ? /* @__PURE__ */ jsx(GatewayConnector, {}) : null
130
- ] }),
131
- /* @__PURE__ */ jsx(View, { style: [styles.titleSlot, titleAlignLeft && styles.titleSlotLeft], children: titleSlot }),
132
- /* @__PURE__ */ jsx(View, { style: styles.rightSlot, children: rightSlot })
113
+ /* @__PURE__ */ jsx(View, { style: styles.leftSlot, children: leftSlot }),
114
+ showChatToolbar ? /* @__PURE__ */ jsxs(ScrollView, { horizontal: true, showsHorizontalScrollIndicator: false, style: styles.toolsScroll, contentContainerStyle: styles.toolsContent, keyboardShouldPersistTaps: "handled", children: [
115
+ showHistory ? /* @__PURE__ */ jsx(ChatHistoryToggleMobile, { onPress: handleOpenChatHistory, isDark }) : null,
116
+ /* @__PURE__ */ jsx(AppsMenu, { isDark, orgName }),
117
+ /* @__PURE__ */ jsx(HeaderTasksButton, { isDark }),
118
+ /* @__PURE__ */ jsx(HeaderSkillsButton, { isDark })
119
+ ] }) : /* @__PURE__ */ jsx(View, { style: [styles.titleSlot, titleAlignLeft && styles.titleSlotLeft], children: titleSlot }),
120
+ /* @__PURE__ */ jsx(View, { style: styles.rightSlot, children: showChatToolbar ? /* @__PURE__ */ jsxs(View, { style: styles.rightActions, children: [
121
+ showGateway ? /* @__PURE__ */ jsx(GatewayConnector, {}) : null,
122
+ /* @__PURE__ */ jsx(HeaderMoreMenu, { isDark, onNewChat: showNewChat ? handleNewChat : void 0 })
123
+ ] }) : showNewChat ? /* @__PURE__ */ jsx(HeaderToolbarButton, { icon: "chat-plus-outline", onPress: handleNewChat, accessibilityLabel: "New chat", isDark }) : null })
133
124
  ] }) })
134
125
  ] });
135
126
  };
@@ -137,17 +128,28 @@ const styles = StyleSheet.create({
137
128
  row: {
138
129
  flexDirection: "row",
139
130
  alignItems: "center",
140
- paddingHorizontal: 8,
141
- paddingVertical: 8,
142
- minHeight: 52,
131
+ paddingLeft: 4,
132
+ paddingRight: 6,
133
+ paddingVertical: 4,
134
+ minHeight: 48,
143
135
  borderBottomWidth: StyleSheet.hairlineWidth,
144
136
  overflow: "visible"
145
137
  },
146
138
  leftSlot: {
147
139
  flexDirection: "row",
148
140
  alignItems: "center",
149
- flexShrink: 0,
150
- gap: 0
141
+ flexShrink: 0
142
+ },
143
+ toolsScroll: {
144
+ flex: 1,
145
+ minWidth: 0
146
+ },
147
+ toolsContent: {
148
+ flexDirection: "row",
149
+ alignItems: "center",
150
+ paddingLeft: 2,
151
+ paddingRight: 8,
152
+ gap: 2
151
153
  },
152
154
  titleSlot: {
153
155
  flex: 1,
@@ -160,14 +162,15 @@ const styles = StyleSheet.create({
160
162
  alignItems: "flex-start"
161
163
  },
162
164
  rightSlot: {
163
- minWidth: 40,
165
+ flexShrink: 0,
164
166
  alignItems: "flex-end",
165
- justifyContent: "center"
167
+ justifyContent: "center",
168
+ paddingLeft: 4
166
169
  },
167
170
  rightActions: {
168
171
  flexDirection: "row",
169
172
  alignItems: "center",
170
- gap: 6
173
+ flexShrink: 0
171
174
  },
172
175
  title: {
173
176
  fontSize: 17,
@@ -186,41 +189,10 @@ const styles = StyleSheet.create({
186
189
  height: 36,
187
190
  alignItems: "center",
188
191
  justifyContent: "center",
189
- borderRadius: 18
192
+ borderRadius: 10
190
193
  },
191
194
  iconButtonPressed: {
192
195
  opacity: 0.6
193
- },
194
- actionButton: {
195
- padding: 0,
196
- alignItems: "center",
197
- justifyContent: "center",
198
- borderRadius: 22
199
- },
200
- actionButtonPressed: {
201
- opacity: 0.6
202
- },
203
- actionButtonInner: {
204
- width: 32,
205
- height: 32,
206
- borderRadius: 16,
207
- alignItems: "center",
208
- justifyContent: "center",
209
- backgroundColor: mobileTokens.color.surface,
210
- borderWidth: 1,
211
- borderColor: mobileTokens.color.border,
212
- shadowColor: "#0f172a",
213
- shadowOpacity: 0.08,
214
- shadowRadius: 5,
215
- shadowOffset: {
216
- width: 0,
217
- height: 2
218
- },
219
- elevation: 2
220
- },
221
- actionButtonInnerDark: {
222
- backgroundColor: "#0f172a",
223
- borderColor: "#334155"
224
196
  }
225
197
  });
226
198
  var NavigationHeader$1 = React.memo(NavigationHeader);export{NavigationHeader$1 as default};//# sourceMappingURL=NavigationHeader.js.map