diff --git a/docs/HEADER_STICKY_POSITIONING.md b/docs/HEADER_STICKY_POSITIONING.md
new file mode 100644
index 0000000..82955fe
--- /dev/null
+++ b/docs/HEADER_STICKY_POSITIONING.md
@@ -0,0 +1,152 @@
+# Header Sticky Positioning Implementation
+
+## Overview
+This document describes the implementation of native sticky positioning for the MobileHeader component to improve scroll performance and reduce JavaScript computations.
+
+## Implementation Details
+
+### MobileHeader Component Updates
+The `MobileHeader` component now supports native sticky positioning through React Native's `position: 'sticky'` style property.
+
+#### New Props
+- `sticky?: boolean` - Enable sticky positioning for the header (default: false)
+- `stickyTop?: number` - Top offset for sticky positioning (default: 0)
+
+#### Performance Benefits
+- ⚡ **Smoother scroll performance**: Native sticky positioning is handled by the native rendering engine, reducing JavaScript overhead
+- 📊 **Less JavaScript computation**: No need for manual scroll event listeners and position calculations
+- 🎯 **Better user experience**: Headers stay visible during scrolling without janky re-renders
+
+## Usage Examples
+
+### Basic Usage with Sticky Positioning
+```tsx
+import { MobileHeader } from '@/components';
+
+
+
+ {/* Scrollable content */}
+
+```
+
+### Usage with Safe Area
+```tsx
+import { MobileHeader } from '@/components';
+import { useSafeArea } from '@/hooks';
+
+const MyScreen = () => {
+ const { top } = useSafeArea();
+
+ return (
+
+
+ {/* Scrollable content */}
+
+ );
+};
+```
+
+### Non-Sticky (Default Behavior)
+```tsx
+import { MobileHeader } from '@/components';
+
+
+{/* Header will scroll with content */}
+```
+
+## Technical Implementation
+
+### React Native Sticky Positioning
+The implementation uses React Native's native `position: 'sticky'` style property:
+
+```typescript
+const styles = StyleSheet.create({
+ stickyHeader: {
+ position: 'sticky' as const,
+ zIndex: 1000,
+ elevation: 3,
+ shadowColor: '#000',
+ shadowOffset: { width: 0, height: 2 },
+ shadowOpacity: 0.1,
+ shadowRadius: 4,
+ },
+});
+```
+
+### Key Features
+- **Native performance**: Leverages the platform's native sticky positioning implementation
+- **Shadow/Elevation**: Adds subtle shadow for depth perception when sticky
+- **Z-index management**: Ensures header stays above scrollable content
+- **Cross-platform**: Works on both iOS and Android
+
+## Migration Guide
+
+### From JavaScript-based Sticky Headers
+If you were previously using JavaScript scroll listeners to achieve sticky headers:
+
+**Before (JavaScript-based):**
+```tsx
+const [headerStyle, setHeaderStyle] = useState({});
+const handleScroll = (event) => {
+ const offsetY = event.nativeEvent.contentOffset.y;
+ setHeaderStyle(offsetY > 50 ? { position: 'absolute', top: 0 } : {});
+};
+
+
+
+ {/* Header content */}
+
+
+```
+
+**After (Native sticky positioning):**
+```tsx
+
+
+
+```
+
+### Benefits of Migration
+- Eliminates scroll event listeners
+- Removes re-render cycles during scrolling
+- Reduces JavaScript execution overhead
+- Improves battery life on mobile devices
+
+## Testing
+
+### Manual Testing Checklist
+- [ ] Header stays visible when scrolling down
+- [ ] Header returns to normal position when scrolling up
+- [ ] Smooth scrolling performance (60fps)
+- [ ] No visual flickering or jumping
+- [ ] Safe area insets are respected
+- [ ] Works correctly on both iOS and Android
+
+### Performance Testing
+Test scroll performance using React Native's built-in performance monitoring:
+```typescript
+// Enable performance overlay in development
+if (__DEV__) {
+ const { default: DevSettings } = require('react-native/Libraries/Utilities/DevSettings');
+ DevSettings.setHotLoadingEnabled(false);
+}
+```
+
+## Related Issues
+- #365 - Implement header/nav performance optimization with sticky positioning
+- #35 - Performance optimization
+- #36 - Scroll performance improvements
+- #43 - Native component utilization
+
+## Future Enhancements
+- Consider adding `stickyBackgroundColor` prop for dynamic header styling
+- Add animation support for smooth transitions between sticky/non-sticky states
+- Implement collapsible header behavior option
diff --git a/src/components/mobile/MobileHeader.tsx b/src/components/mobile/MobileHeader.tsx
index 5408e3a..453d900 100644
--- a/src/components/mobile/MobileHeader.tsx
+++ b/src/components/mobile/MobileHeader.tsx
@@ -2,7 +2,7 @@ import { DrawerNavigationProp } from '@react-navigation/drawer';
import { useNavigation } from '@react-navigation/native';
import { ArrowLeft, Bell, Menu } from 'lucide-react-native';
import React from 'react';
-import { TouchableOpacity, View } from 'react-native';
+import { TouchableOpacity, View, StyleSheet } from 'react-native';
import { useDynamicFontSize, usePendingRequests, useSafeArea } from '../../hooks';
import { AppText } from '../common/AppText';
@@ -16,18 +16,26 @@ interface MobileHeaderProps {
showBack?: boolean;
/** Optional custom right action component */
rightAction?: React.ReactNode;
+ /** Whether to use sticky positioning for scroll performance */
+ sticky?: boolean;
+ /** Top offset for sticky positioning (default: 0) */
+ stickyTop?: number;
}
-export const MobileHeader = ({ title, showBack = false, rightAction }: MobileHeaderProps) => {
+export const MobileHeader = ({ title, showBack = false, rightAction, sticky = false, stickyTop = 0 }: MobileHeaderProps) => {
const { top } = useSafeArea();
const navigation = useNavigation>();
const pendingCount = usePendingRequests();
const { scale } = useDynamicFontSize();
+ const headerStyle = sticky
+ ? [styles.header, styles.stickyHeader, { top: stickyTop }]
+ : styles.header;
+
return (
@@ -78,3 +86,18 @@ export const MobileHeader = ({ title, showBack = false, rightAction }: MobileHea
);
};
+
+const styles = StyleSheet.create({
+ header: {
+ paddingTop: 0, // Will be set dynamically via style prop
+ },
+ stickyHeader: {
+ position: 'sticky' as const,
+ zIndex: 1000,
+ elevation: 3,
+ shadowColor: '#000',
+ shadowOffset: { width: 0, height: 2 },
+ shadowOpacity: 0.1,
+ shadowRadius: 4,
+ },
+});
\ No newline at end of file
diff --git a/src/components/mobile/index.ts b/src/components/mobile/index.ts
index 535196e..6af5a75 100644
--- a/src/components/mobile/index.ts
+++ b/src/components/mobile/index.ts
@@ -8,6 +8,7 @@ export * from './HealthDashboard';
export * from './HomeScreenSkeleton';
export * from './InfiniteVirtualList';
export * from './MobileFormInput';
+export * from './MobileHeader';
export * from './MobileProfile';
export * from './MobileSearch';
export * from './MobileSettings';
@@ -31,4 +32,3 @@ export * from './SwipeableCoordinator';
export * from './SwipeableRow';
export * from './VirtualList';
export * from './VoiceSearch';
-