- **EULA Persistence Fix**: Fixed EULA dialog showing on every login
- Added eulaAcceptedAt/eulaVersion to AuthResponse interface
- Updated login/register/getUserById endpoints to return EULA fields
- Changed EULACheck to use refreshUser() instead of window.reload()
- **Touch Target Accessibility**: All interactive elements now meet 48x48px minimum
- Fixed 14 undersized IconButtons across 5 files
- Changed size="small" to size="medium" with minWidth/minHeight constraints
- Updated children page, AI chat, analytics cards, legal viewer
- **Alt Text for Images**: Complete image accessibility for screen readers
- Added photoAlt field to children table (Migration V009)
- PhotoUpload component now includes alt text input field
- All Avatar components have meaningful alt text
- Default alt text: "Photo of {childName}", "{userName}'s profile photo"
- **Medical Tracking Consolidation**: Unified medical page with tabs
- Medicine page now has 3 tabs: Medication, Temperature, Doctor Visit
- Backward compatibility for legacy 'medicine' activity type
- Created dedicated /track/growth page for physical measurements
- **Track Page Updates**:
- Simplified to 6 options: Feeding, Sleep, Diaper, Medical, Activity, Growth
- Fixed grid layout to 3 cards per row with minWidth: 200px
- Updated terminology from "Medicine" to "Medical"
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Completely removed TextField from PhotoUpload component (not just hidden)
- Added console logging to AppShell to debug user photo updates
- Rebuilt frontend to ensure changes are deployed
The TextField was showing base64 strings even with display:none due to
Next.js caching. Complete removal ensures clean UI.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
UI improvements for photo upload feature:
1. Hidden the photo URL text field completely (users don't need to see base64)
2. Added key prop to Avatar to force re-render when photoUrl changes
3. Added error handling for avatar image loading
4. Changed value display to hide base64 strings in hidden field
The camera icon is now the primary way to upload photos, with the URL field
completely hidden from view for a cleaner UX.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
The MinIO/Sharp approach doesn't work on the current server CPU architecture.
Switched to simple base64 encoding for photo uploads.
Changes:
- PhotoUpload component converts images to base64 data URLs
- 5MB file size limit
- Works on all platforms without external dependencies
- Stores photos directly in database (photoUrl field)
This is a temporary solution. For production scalability, we can:
- Upgrade server CPU to support Sharp
- Build Sharp from source
- Use Docker with prebuilt Sharp binaries
- Migrate to a proper CDN/object storage later
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add file input with hidden native picker
- Convert selected images to base64 data URLs
- Validate file type (images only) and size (max 5MB)
- Display error alerts for invalid uploads
- Show preview immediately after selection
- Update help text to indicate camera button functionality
- Handle image load/error states properly
Now clicking the camera button opens file picker and uploads work fully.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Created reusable PhotoUpload component with avatar preview
- Added photo upload to child create/edit dialog
- Added profile photo upload to settings page
- Show photo preview with fallback icon
- Display camera button for future file upload integration
- Support URL paste for immediate photo display
- Updated API types to support photoUrl field
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>