diff --git a/src/components/calendar/CalendarFab.tsx b/src/components/calendar/CalendarFab.tsx index c6783d5b..b9c83f0c 100644 --- a/src/components/calendar/CalendarFab.tsx +++ b/src/components/calendar/CalendarFab.tsx @@ -1,4 +1,5 @@ import React from 'react'; +import { useSafeAreaInsets } from 'react-native-safe-area-context'; import { Animated, Easing, Pressable, StyleSheet, Text, View } from 'react-native'; import { CalendarPlus, CircleCheck, Plus } from 'lucide-react-native'; import { componentSizes, radius, spacing, typography, type ThemePalette } from '../../theme/tokens'; @@ -39,6 +40,8 @@ export function CalendarFab({ onNewEvent, onNewTask }: CalendarFabProps) { action(); }; + const insets = useSafeAreaInsets(); + const onMainPress = () => { if (!onNewTask) { onNewEvent(); @@ -63,7 +66,8 @@ export function CalendarFab({ onNewEvent, onNewTask }: CalendarFabProps) { /> )} - + {/* Clear of a side inset (camera cutout, navigation bar) in landscape. */} + {open && onNewTask && ( {t('calendar.fab.task', 'Task')} diff --git a/src/screens/CalendarScreen.tsx b/src/screens/CalendarScreen.tsx index 982070fe..287e83f5 100644 --- a/src/screens/CalendarScreen.tsx +++ b/src/screens/CalendarScreen.tsx @@ -988,7 +988,7 @@ export default function CalendarScreen() { const titleDate = (monthPanelOpen && panelMonth) || visibleDate || focus.date; return ( - + setSidebarVisible(true)} diff --git a/src/screens/ContactDetailScreen.tsx b/src/screens/ContactDetailScreen.tsx index ab8e06f5..ebe82aa7 100644 --- a/src/screens/ContactDetailScreen.tsx +++ b/src/screens/ContactDetailScreen.tsx @@ -361,7 +361,7 @@ export default function ContactDetailScreen() { ].filter(Boolean) as MoreItem[]; return ( - + {/* In a split view's pane the list is right next to it: no back. */} {!inPane && ( diff --git a/src/screens/ContactFormScreen.tsx b/src/screens/ContactFormScreen.tsx index 4ccfe679..516fd99e 100644 --- a/src/screens/ContactFormScreen.tsx +++ b/src/screens/ContactFormScreen.tsx @@ -1070,7 +1070,7 @@ export default function ContactFormScreen() { if (asGroup) { // Groups are a name plus a member list - none of the person fields apply. return ( - + {header} + {header} + setDrawerOpen(false)} /> diff --git a/src/screens/EmailListScreen.tsx b/src/screens/EmailListScreen.tsx index f991a872..1fa95773 100644 --- a/src/screens/EmailListScreen.tsx +++ b/src/screens/EmailListScreen.tsx @@ -1151,7 +1151,7 @@ export default function EmailListScreen({ ); return ( - + {/* Header */} {selectionMode ? ( diff --git a/src/screens/EmailSourceScreen.tsx b/src/screens/EmailSourceScreen.tsx index ee99ee0e..2afcddc1 100644 --- a/src/screens/EmailSourceScreen.tsx +++ b/src/screens/EmailSourceScreen.tsx @@ -65,7 +65,7 @@ export default function EmailSourceScreen({ route, navigation }: Props) { }; return ( - + navigation.goBack()} diff --git a/src/screens/EmailThreadScreen.tsx b/src/screens/EmailThreadScreen.tsx index 8e4abf0f..b4a54b6b 100644 --- a/src/screens/EmailThreadScreen.tsx +++ b/src/screens/EmailThreadScreen.tsx @@ -689,7 +689,7 @@ function EmailViewer({ route, navigation, embedded = false, onActiveChange }: Pr : false; return ( - + {/* Toolbar */} {!embedded && ( @@ -827,7 +827,7 @@ function EmailViewer({ route, navigation, embedded = false, onActiveChange }: Pr {/* Bottom action bar (hidden while keyboard is up so quick reply stays visible) */} {kbObstruction === 0 && ( - + } label={t('email_viewer.previous', 'Prev')} diff --git a/src/screens/FilesScreen.tsx b/src/screens/FilesScreen.tsx index 6de93889..4183cfa7 100644 --- a/src/screens/FilesScreen.tsx +++ b/src/screens/FilesScreen.tsx @@ -168,14 +168,10 @@ export default function FilesScreen() { const styles = React.useMemo(() => makeStyles(c), [c]); const t = useLocaleStore((s) => s.t); const formatModified = useFormatModified(); - // Clear of the status bar and, in landscape, the side insets; the header - // used a fixed 60 px top padding instead. + // Clear of the status bar (the header used a fixed 60 px top padding); the + // whole screen keeps clear of the side insets in landscape. const insets = useSafeAreaInsets(); - const headerInsets = { - paddingTop: insets.top + spacing.sm, - paddingLeft: spacing.md + insets.left, - paddingRight: spacing.md + insets.right, - }; + const headerInsets = { paddingTop: insets.top + spacing.sm, paddingHorizontal: spacing.md }; // Folder navigation stack. Hierarchy is real parentId nesting (#379) — each // entry is the folder's node id (namespaced "accountId:nodeId" inside a @@ -1035,7 +1031,7 @@ export default function FilesScreen() { // On a wide window an open file shows beside the list instead of covering it. const previewDocked = isSplit && previewTarget != null; return ( - + {renderHeader()} {body} diff --git a/src/screens/GroupDetailScreen.tsx b/src/screens/GroupDetailScreen.tsx index 8a5c410b..6cce19d9 100644 --- a/src/screens/GroupDetailScreen.tsx +++ b/src/screens/GroupDetailScreen.tsx @@ -62,7 +62,7 @@ export default function GroupDetailScreen() { if (!group) { return ( - + navigation.goBack()} @@ -133,7 +133,7 @@ export default function GroupDetailScreen() { }; return ( - + {/* In a split view's pane the list is right next to it: no back. */} {!inPane && (