Skip to content

feat: custom exercises, tutorial overhaul, spotlight fixes#107

Open
TWhit229 wants to merge 24 commits intomainfrom
travis-winter-2026
Open

feat: custom exercises, tutorial overhaul, spotlight fixes#107
TWhit229 wants to merge 24 commits intomainfrom
travis-winter-2026

Conversation

@TWhit229
Copy link
Owner

@TWhit229 TWhit229 commented Mar 3, 2026

Changes

  • Custom Exercises: Add CustomExerciseCreator with fuzzy duplicate matching (Levenshtein distance)
  • Tutorial Overhaul: 24-step tutorial covering all features with correct spotlight positions
  • Spotlight Fixes: Fixed safe area offset for tab bar, bubble overlap, workout notes visibility
  • Exercise History: Removed 30-session limit from progress graphs
  • UI Polish: Restyled custom exercise button, reordered superset tutorial steps

TWhit229 added 22 commits March 1, 2026 10:47
- 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
Copilot AI review requested due to automatic review settings March 3, 2026 03:58
Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

---
---
Copy link

Copilot AI Mar 3, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Suggested change
---

Copilot uses AI. Check for mistakes.

## 📅 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.
Copy link

Copilot AI Mar 3, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Suggested change
- **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.

Copilot uses AI. Check for mistakes.
- **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.
Copy link

Copilot AI Mar 3, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Suggested change
- **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.

Copilot uses AI. Check for mistakes.
TWhit229 added 2 commits March 3, 2026 08:46
- 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
Copilot AI review requested due to automatic review settings March 3, 2026 18:55
Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants