1. Sugar + Fiber bars in TodayView macro summary card
2. Goals page: editable text fields + Save button (PUT /api/fitness/goals)
3. AI Chat: keyboard dismisses on send + tap chat area to dismiss
4. Entry detail: edit quantity (stepper) + meal type picker + Save
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- DragGesture with minimumDistance:15 as highPriorityGesture
- Tap only navigates when not swiping
- Tapping while swiped closes the delete button
- Hidden NavigationLink for programmatic navigation
- Reverted FitnessTabView back to page-style TabView
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replaced .tabViewStyle(.page) with Group/switch.
Tab switching only via top buttons, no horizontal page swipe.
This prevents swipe-to-delete from accidentally switching tabs.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Button outside ScrollView using safeAreaInset(edge: .bottom)
- No more scroll gesture eating the first tap
- scrollDismissesKeyboard(.immediately) for keyboard handling
- Swipe to delete on meal entries
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Custom SwipeToDeleteRow with drag gesture
- Swipe left reveals red trash button
- Tap still opens EntryDetailView with delete option
- Both paths call the same onDelete callback
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Exact replica of ReactFlux confetti:
- 200 tiny rectangles scattered across full screen width
- Drop from above the screen, fall down with gravity
- Gentle horizontal drift + 3D rotation (tumbling effect)
- 10 vivid colors matching ReactFlux palette
- Staggered delays (0-0.4s) for natural rain effect
- 1.5-2.5s fall duration, fade at 80%
- No overlay/checkmark — just pure confetti rain
- Haptic feedback on trigger
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Custom sheet header with warm canvas background (no white bar)
- Tab picker styled as warm pills (not default segmented control)
- AI Chat welcome state: sparkles icon + 'What did you eat?' prompt
- All backgrounds use canvas color consistently
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Calorie widget: half width with animated ring (spring animation)
- Removed floating + from dashboard (only on fitness tab)
- surfaceCard changed from white to warm white (#FFFCF8)
- AssistantChatView gets canvas background
- Future widget placeholder on right side of grid
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Dashboard:
- Removed LazyVGrid, calorie widget is full-width HStack
- Ring (90px) + text info side by side
- No more vertical text issue
Meal sections:
- Title3 bold font for meal name
- Meal icon in tinted circle background
- Item count subtitle
- Calorie total in meal color (bold)
- Subtle tinted background on header
- Clear visual separation from food entries
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
iOS App (complete rebuild):
- Audited all fitness API endpoints against live responses
- Models match exact API field names (snapshot_ prefixes, UUID strings)
- FoodEntry uses computed properties (foodName, calories, etc.) wrapping snapshot fields
- Flexible Int/Double decoding for all numeric fields
- AI assistant with raw JSON state management (JSONSerialization, not Codable)
- Home dashboard with custom background, frosted glass calorie widget
- Fitness: Today/Templates/Goals/Foods tabs
- Food search with recent + all sections
- Meal sections with colored accent bars, swipe to delete
- 120fps ProMotion, iOS 17+ @Observable
Podcast/Media Service:
- FastAPI backend for podcast RSS + local audiobook folders
- Shows, episodes, playback progress, queue management
- RSS feed fetching with feedparser + ETag support
- Local folder scanning with mutagen for audio metadata
- HTTP Range streaming for local audio files
- Playback events logging (play/pause/seek/complete)
- Reuses brain's PostgreSQL + Redis
- media_ prefixed tables
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>