# Maternal App - UI Consistency & Alignment Guide ## Overview This document provides comprehensive instructions for fixing UI/UX inconsistencies across the Maternal app. The main dashboard screen serves as the design reference for all other screens. ## Reference Design Pattern (Main Dashboard) The main dashboard successfully implements: - **6 symmetric action cards** with consistent spacing - **Soft rounded corners** (borderRadius: 16-20px) - **Consistent color palette** with meaningful color associations - **Clear visual hierarchy** with proper typography scaling - **Adequate whitespace** between sections - **Mobile-first responsive design** ## Global Design Tokens to Apply ### Spacing System ```javascript const spacing = { xs: 8, // 0.5rem sm: 12, // 0.75rem md: 16, // 1rem (base unit) lg: 24, // 1.5rem xl: 32, // 2rem xxl: 48, // 3rem xxxl: 64 // 4rem } ``` ### Color Palette ```javascript const colors = { primary: { main: '#EC407A', // Pink (Feeding) light: '#FFB3C1', dark: '#C2185B' }, secondary: { sleep: '#2196F3', // Blue diaper: '#FF9800', // Orange medicine: '#F44336', // Red activities: '#66BB6A', // Green assistant: '#FF7043' // Deep Orange }, background: { default: '#FFF5F7', // Light pink background paper: '#FFFFFF', card: '#FFF0F3' // Slightly pink card background }, text: { primary: '#2D3436', secondary: '#636E72', disabled: '#B2BEC3' } } ``` ### Typography Scale ```javascript const typography = { h1: { fontSize: '2rem', fontWeight: 600, lineHeight: 1.2 }, h2: { fontSize: '1.5rem', fontWeight: 600, lineHeight: 1.3 }, h3: { fontSize: '1.25rem', fontWeight: 500, lineHeight: 1.4 }, body1: { fontSize: '1rem', fontWeight: 400, lineHeight: 1.5 }, body2: { fontSize: '0.875rem', fontWeight: 400, lineHeight: 1.5 }, caption: { fontSize: '0.75rem', fontWeight: 400, lineHeight: 1.4 } } ``` ## Screen-Specific Fixes ### 1. Track Activity Screen (`/track`) **Current Issues:** - Icons and labels not properly centered - Inconsistent spacing between activity options - No visual feedback on hover/press **Required Fixes:** ```javascript // Container structure Track Activity Select an activity to track {activities.map(activity => ( {activity.icon} {activity.label} ))} ``` ### 2. AI Assistant Screen (`/ai-assistant`) **Current Issues:** - Chat history sidebar has poor alignment - Suggested questions buttons inconsistent - Input field not properly styled - No proper container padding **Required Fixes:** ```javascript // Main layout structure {/* Sidebar */} Chat History {/* Chat list items */} {chats.map(chat => ( ))} {/* Main content */} {/* Header */} AI Parenting Assistant Ask me anything about parenting and childcare {/* Chat area */} {/* Welcome message */} Hi Andrei! How can I help you today? {/* Suggested questions */} {suggestions.map(suggestion => ( {}} sx={{ width: '100%', py: 2, borderRadius: 2, fontSize: '0.875rem', bgcolor: 'background.paper', border: 1, borderColor: 'divider', '&:hover': { bgcolor: 'primary.light', borderColor: 'primary.main' } }} /> ))} {/* Input area */} ) }} /> This AI assistant provides general information. Always consult healthcare professionals for medical advice. ``` ### 3. Insights & Analytics Screen (`/insights`) **Current Issues:** - Time period tabs not properly styled - Stats cards have inconsistent heights - Charts not properly aligned - Legend placement issues **Required Fixes:** ```javascript // Container and layout Insights & Analytics Track patterns and get insights about your child's activities {/* Time period selector */} {/* Stats cards */} {stats.map(stat => ( {stat.icon} {stat.value} {stat.label} ))} {/* Charts grid */} {charts.map(chart => ( {chart.icon} {chart.title} {/* Chart component here */} ))} ``` ### 4. Children Management Screen (`/children`) **Current Issues:** - Child card not properly structured - Age text alignment issues - Action buttons placement **Required Fixes:** ```javascript Children Manage your family's children profiles {children.map(child => ( {child.name[0]} {child.name} {child.gender} {child.birthDate} Age: {child.age} ))} ``` ### 5. Family Management Screen (`/family`) **Current Issues:** - Share code styling inconsistent - Member list alignment - Proper spacing between sections **Required Fixes:** ```javascript Family Manage your family members and share access Family Share Code Share this code with family members to give them access to your family's data Family Members ({members.length}) {members.map(member => ( {member.name[0]} ))} ``` ## Mobile-First Responsive Guidelines ### Breakpoint System ```javascript const breakpoints = { xs: 0, // Mobile phones sm: 600, // Small tablets md: 900, // Tablets lg: 1200, // Desktop xl: 1536 // Large screens } ``` ### Mobile-Specific Rules 1. **Touch targets**: Minimum 48x48px for all interactive elements 2. **Padding**: Use `px: { xs: 2, sm: 3 }` for container padding 3. **Font sizes**: Scale down by 10-15% on mobile 4. **Grid columns**: Use `xs={12}` for single column on mobile, `sm={6}` for two columns on tablets 5. **Navigation**: Hide sidebar on mobile, use bottom navigation or hamburger menu 6. **Modals**: Full screen on mobile, centered dialog on desktop ### Component Responsiveness ```javascript // Responsive spacing sx={{ p: { xs: 2, sm: 3, md: 4 }, m: { xs: 1, sm: 2, md: 3 } }} // Responsive typography sx={{ fontSize: { xs: '1rem', sm: '1.125rem', md: '1.25rem' } }} // Responsive grid ``` ## Common MUI Theme Overrides ```javascript const theme = createTheme({ palette: { primary: { main: '#EC407A' }, background: { default: '#FFF5F7', paper: '#FFFFFF' } }, shape: { borderRadius: 12 }, components: { MuiButton: { styleOverrides: { root: { borderRadius: 12, textTransform: 'none', fontWeight: 500, padding: '10px 24px' } } }, MuiPaper: { styleOverrides: { root: { borderRadius: 16, boxShadow: 'none', border: '1px solid rgba(0,0,0,0.08)' } } }, MuiTextField: { styleOverrides: { root: { '& .MuiOutlinedInput-root': { borderRadius: 12 } } } } } }); ``` ## Implementation Checklist - [ ] Apply consistent spacing using the defined spacing system - [ ] Update all color values to use the defined palette - [ ] Ensure all interactive elements have proper hover/active states - [ ] Add proper transitions (0.2s ease) for all interactive elements - [ ] Verify mobile responsiveness for all screens - [ ] Test touch target sizes on mobile (minimum 48x48px) - [ ] Ensure consistent border radius (12-16px for cards, 8-12px for buttons) - [ ] Add proper loading states for async operations - [ ] Implement consistent error messaging styles - [ ] Verify text hierarchy and readability on all screen sizes ## Testing Requirements 1. Test on iPhone SE (375px width) for minimum mobile size 2. Test on iPad (768px width) for tablet view 3. Test on desktop (1920px width) for full experience 4. Verify touch interactions on actual mobile devices 5. Check color contrast ratios for accessibility (WCAG AA compliance) 6. Test with both light and dark system preferences ## Critical Accessibility Fixes (Console Errors) ### 1. Color Contrast Issues (WCAG AA Compliance) **Problem**: Elements don't meet minimum color contrast ratio thresholds (4.5:1 for normal text, 3:1 for large text) **Fix for the color palette**: ```javascript const colors = { primary: { main: '#D81B60', // Darker pink for better contrast (was #EC407A) light: '#FFB3C1', dark: '#AD1457' // Even darker for text on light backgrounds }, secondary: { sleep: '#1976D2', // Darker blue (was #2196F3) diaper: '#F57C00', // Darker orange (was #FF9800) medicine: '#D32F2F', // Darker red (was #F44336) activities: '#388E3C', // Darker green (was #66BB6A) assistant: '#E64A19' // Darker deep orange (was #FF7043) }, background: { default: '#FFF5F7', paper: '#FFFFFF', card: '#FFF0F3' }, text: { primary: 'rgba(0, 0, 0, 0.87)', // Higher opacity for better contrast secondary: 'rgba(0, 0, 0, 0.6)', // Darker secondary text disabled: 'rgba(0, 0, 0, 0.38)' } } ``` **Fix for MUI TextField labels**: ```javascript // Global theme override for input labels const theme = createTheme({ components: { MuiInputLabel: { styleOverrides: { root: { color: 'rgba(0, 0, 0, 0.87)', // Darker label color '&.Mui-focused': { color: '#AD1457' // Dark pink when focused }, '&.MuiFormLabel-filled': { color: 'rgba(0, 0, 0, 0.87)' // Ensure filled state has good contrast } } } }, MuiOutlinedInput: { styleOverrides: { root: { '& .MuiOutlinedInput-notchedOutline': { borderColor: 'rgba(0, 0, 0, 0.38)' // Darker border }, '&:hover .MuiOutlinedInput-notchedOutline': { borderColor: 'rgba(0, 0, 0, 0.87)' }, '&.Mui-focused .MuiOutlinedInput-notchedOutline': { borderColor: '#AD1457' } } } }, MuiButton: { styleOverrides: { containedPrimary: { backgroundColor: '#D81B60', '&:hover': { backgroundColor: '#AD1457' } } } } } }); ``` ### 2. Viewport Meta Tag Issue **Problem**: Zooming and scaling must not be disabled (critical accessibility issue) **Fix for viewport meta tag**: ```html ``` **For Next.js apps**: ```javascript // In pages/_document.js or app/layout.js ``` ### 3. Additional Accessibility Enhancements **Form Input Enhancements**: ```javascript ``` **Button Accessibility**: ```javascript ``` **Focus Indicators**: ```javascript // Global focus styles const theme = createTheme({ components: { MuiButtonBase: { styleOverrides: { root: { '&:focus-visible': { outline: '2px solid #AD1457', outlineOffset: '2px' } } } } } }); ``` ### 4. Testing for Accessibility **Use these tools to verify fixes**: 1. **axe DevTools**: Browser extension for accessibility testing 2. **Chrome DevTools Lighthouse**: Run accessibility audit 3. **WAVE**: WebAIM's accessibility evaluation tool 4. **Contrast Checker**: Use WebAIM's contrast checker to verify color combinations **Minimum contrast ratios to maintain**: - Normal text: 4.5:1 - Large text (18pt or 14pt bold): 3:1 - UI components and graphics: 3:1 **Quick contrast check for main colors**: ```javascript // Verified color combinations with good contrast const safeColorCombos = { // Text on backgrounds darkTextOnLight: '#000000 on #FFF5F7', // 20.3:1 ✓ primaryTextOnWhite: '#D81B60 on #FFFFFF', // 4.7:1 ✓ whiteOnPrimary: '#FFFFFF on #D81B60', // 4.7:1 ✓ // Labels and secondary text labelOnWhite: 'rgba(0,0,0,0.87) on #FFFFFF', // 16:1 ✓ secondaryTextOnWhite: 'rgba(0,0,0,0.6) on #FFFFFF', // 7.4:1 ✓ } ``` ## Additional Notes - Maintain the soft, nurturing aesthetic with accessible color choices - Keep interactions smooth and delightful with subtle animations - Prioritize clarity and ease of use for sleep-deprived parents - Ensure all text is easily readable at a glance - Use icons consistently from the same icon library (Material Icons) - Maintain visual hierarchy with proper use of whitespace - Always test with screen readers and keyboard navigation