feat: custom exercises, tutorial overhaul, spotlight fixes#107
feat: custom exercises, tutorial overhaul, spotlight fixes#107
Conversation
- Profile card: spotlight before padding(.top, 12) instead of after - Audio/Settings: spotlight on inner card via settingsSection(spotlightID:) - PR/Workout section: same, via settingsSection(spotlightID:) - Avoids section title + 24px top padding being included in frame
- Home: existing homeTapCount pattern - Workout: .id(workoutTapCount) force-rebuilds NavigationStack - Profile: .id(profileTapCount) force-rebuilds NavigationStack - Tapping any tab while deep in a view pops back to the root
- Home: NavigationPath with HomeDestination enum for type-safe navigation - Profile: NavigationPath in MainTabView, cleared on tab tap - All NavigationLinks converted to value-based (NavigationLink(value:)) - SwipeableWorkoutRow uses navigate closure instead of local state - Tapping a tab now triggers standard iOS slide-back pop animation
…story/PRs All 8 history/stats functions now filter by date <= now: - WorkoutModel: exerciseHistory(), workoutHistory() - WorkoutStatsEngine: quickStats(), detectAllPRs(), currentPRs(), newPRs(), exerciseHistory(), allExerciseNames() Future-scheduled workouts will not appear in Fill from Last, exercise graphs, PR detection, or quick stats.
…yles
Phase 1: Calendar dots — solid gold (completed), outline ring (planned), green (active)
Phase 2: Date enforcement — move-to-today warnings for past/future workouts
Phase 3: Schedule card on Home — collapsed link to full Schedule screen
Phase 4: ScheduleView — week grid, add from template, duplicate past workout,
copy week (1-4 weeks ahead), clear week
Phase 5: Planned workout visual — dimmed text, calendar icon, "Planned" label
New files: ScheduleView.swift
Modified: WorkoutModel.swift, WorkoutDetailView.swift, HomeView.swift
- RecurringSchedule model with template, weekdays, persistence - seriesId on Workout linking to recurring schedules - 8-week auto-extend on app launch (rolls forward weekly) - ScheduleView rewritten as Recurring Schedules management screen - RecurrenceCreator: pick template + weekdays, generates 8 weeks - Stop/Resume/Delete schedule with future workout options - Series-aware delete: This Only / This & Future / Entire Series - Calendar dots: solid gold (done), outline ring (planned), green (active) - Repeat icon on recurring workout cards - Date enforcement: move-to-today alerts for past/future workouts
- Added durationWeeks: Int? to RecurringSchedule (nil = forever) - endDate computed property caps workout generation - Auto-deactivates expired schedules on app launch - RecurrenceCreator: scrollable duration buttons (Forever, 1w-12w) - Summary text updates dynamically with duration choice - Schedule card label shows duration suffix
Workout view now slides down off screen while the empty state slides up from below with a smooth 0.4s easeInOut animation.
…e effect Moved store.activeWorkout = nil into withAnimation(.easeInOut(duration: 0.5)) so the transition from active workout to empty state actually animates.
When adding/removing exercises or adding supersets on a recurring workout, prompts: "This Workout Only" / "This & All Future". - "This Only" edits just this instance (like before) - "This & All Future" propagates the exercise structure to all unstarted future workouts in the series - Set/rep/weight edits remain silent (always just this workout) - Active workouts skip the prompt (always just this workout)
Tutorial: 19→22 steps. Added Calendar Dot Colors, Recurring Schedules, and Planned Workouts steps to the Home phase. Updated calendar message to mention three dot colors. Final step mentions scheduling. ideas.txt: Moved scheduling/superset to completed, added items 13-25 covering rest timer, reorder, PR records, calendar dots, date enforcement, recurring schedules, series-aware edit/delete, and more.
Added: Recurring Schedules, Calendar Dot Colors, Date Enforcement, Series-Aware Edit/Delete, Onboarding Tutorial, Workout Duration Timer, Finish Animation, Exercise Info Panel, Exercise Stats View. New Backlog section: U1 (Video Upload), U4 (Sharing), U7 (Coach Portal), U8 (HealthKit), U9 (Nutrition), U10 (NLP + Camera Import), U11 (AI Coaching Engine with plateau detection).
…history - Add CustomExerciseCreator with fuzzy duplicate matching - Add ExerciseFuzzyMatcher for Levenshtein distance matching - Overhaul tutorial: 24 steps covering all features - Fix tutorial spotlight safe area offset for tab bar - Fix bubble overlap (gap 16→32, height 190→240) - Show workout notes during tutorial - Reorder superset steps (add → show) - Add fill buttons spotlight + scroll target - Move schedule card spotlight before padding - Restyle custom exercise button to match nav bar - Merge fill/history buttons into tags row - Remove 30-session limit from exercise history - Update FEATURES.md step count
There was a problem hiding this comment.
Pull request overview
Updates the project’s feature documentation to reflect recent product work (custom exercises, expanded tutorial/spotlight behavior, recurring schedules) and introduces a planned-features backlog section.
Changes:
- Expanded/rewrote multiple feature sections (Home, Recurring Schedules, Workouts, Stats, Tutorial, Persistence).
- Added a new “Backlog (Planned Features)” section.
- Refined wording across templates/supersets/exercise system and settings entries.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| - **Gold Accent** — Signature bronze gold accent color throughout the UI. | ||
|
|
||
| --- | ||
| --- |
There was a problem hiding this comment.
There are two consecutive Markdown horizontal rules here (--- twice). This renders as redundant separators and makes the document harder to scan; keep only a single --- before the Backlog section.
| --- |
|
|
||
| ## 📅 Recurring Schedules (Outlook-Style) | ||
|
|
||
| - **Schedule Creation** — Pick a template, select weekday circles (Mon/Tue/Wed/etc.), choose duration (1–12 weeks or Forever). Generates planned workouts automatically. |
There was a problem hiding this comment.
Capitalization is inconsistent for the duration option: this line uses "Forever" while a later bullet in the same section uses "forever". Please standardize the casing to one form for clarity/consistency.
| - **Schedule Creation** — Pick a template, select weekday circles (Mon/Tue/Wed/etc.), choose duration (1–12 weeks or Forever). Generates planned workouts automatically. | |
| - **Schedule Creation** — Pick a template, select weekday circles (Mon/Tue/Wed/etc.), choose duration (1–12 weeks or forever). Generates planned workouts automatically. |
| - **Backward Compatibility** — All models use backward-compatible Codable decoding for safe data migration. Old `exercises` arrays auto-migrate to `items` (supporting supersets). | ||
| - **Admin Demo Data** — 16 weeks of realistic PPL workout history with supersets, deload weeks, workout notes, and progressive overload for testing and demos. | ||
| - **Local Storage** — All workouts saved as JSON (`workouts.json`). Recurring schedules in `recurring_schedules.json`. Settings via UserDefaults. | ||
| - **Unified Backup** — `DataBackupManager` auto-saves all user data as `user_backup.json` on every change. Ready for cloud sync. |
There was a problem hiding this comment.
This bullet claims DataBackupManager auto-saves "all user data" to user_backup.json "on every change", but the current implementation only backs up a subset (e.g., UserDataBackup doesn’t include recurring schedules) and saveBackup is only called from WorkoutStore.save() (so changes like favorites/settings may not trigger a backup immediately). Please either adjust the wording to match actual behavior or extend the backup + triggering logic so the statement is accurate.
| - **Unified Backup** — `DataBackupManager` auto-saves all user data as `user_backup.json` on every change. Ready for cloud sync. | |
| - **Unified Backup** — `DataBackupManager` writes a consolidated backup of core workout data to `user_backup.json` whenever workouts are saved. Designed as a foundation for future cloud sync. |
- Add videoAttachments: [String] to Exercise, SupersetGroup, and Workout models - New VideoAttachmentManager for local storage, thumbnails, 30-day cleanup - New VideoAttachmentRow with thumbnails, PhotosPicker, full-screen player - Paperclip button on exercise, superset, and workout notes TextFields - Red minus delete badge only appears in edit mode (matches existing pattern) - Template/recurring videos carry over when creating new workouts - Auto-cleanup of old videos on app launch (templates/recurring protected) - Build verified via xcodebuild
…ry permission - Add .videoReview mode to BenchSessionView for AI analysis on recorded videos - Add mAI Coach button to VideoPlayerSheet for exercises with hasCoachModel - Pass hasCoachModel through VideoAttachmentRow and ExerciseCardView - Add UISupportedInterfaceOrientations to Info.plist for App Store validation - Add NSPhotoLibraryUsageDescription for video attachment picker
Changes