# 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
}
sx={{
mb: 3,
borderRadius: 2,
textTransform: 'none',
bgcolor: 'primary.light',
color: 'primary.main',
'&:hover': { bgcolor: 'primary.main', color: 'white' }
}}
>
New Chat
{/* 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
}
sx={{
borderRadius: 2,
textTransform: 'none',
px: 3
}}
>
Add Child
{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
}
sx={{ borderRadius: 2, textTransform: 'none' }}
>
Join Family
}
sx={{ borderRadius: 2, textTransform: 'none' }}
>
Invite Member
Family Share Code
Share this code with family members to give them access to your family's data
}
sx={{ borderRadius: 2, textTransform: 'none' }}
>
Copy Code
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