Repository navigation
Add detailed muscle anatomy, gender setup, and exercise phase views #86
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from all commits
Commits
Show all changes
34 commits
Select commit
Hold shift + click to select a range
7f8371d
feat: register muscle artwork license
Devasy 110ba3c
feat: ask optional gender during onboarding
Devasy 3018c58
feat: show detailed selectable muscle anatomy
Devasy 763a2c8
feat: render detailed muscle figures and intensity palettes
Devasy baacae9
feat: show exercise muscle movement phases
Devasy 1246529
feat: highlight selected muscle anatomy
Devasy d5a0fd9
feat: add optional gender and diagram preferences
Devasy 139a5fe
feat: persist independent gender and body figure preferences
Devasy e66c354
feat: lock path parsing dependency
Devasy c66cc48
feat: bundle muscle artwork notices and path parser
Devasy 93553c6
feat: attribute MIT-licensed MuscleMap geometry
Devasy f8c016c
feat: define body figure and optional gender preferences
Devasy 3bac708
feat: add detailed front and back anatomical outlines
Devasy eb58fd0
feat: define standard exercise muscle motion phases
Devasy 9deabe0
feat: show labelled blue and red exercise muscle phases
Devasy d83fca6
feat: add optional gender picker
Devasy 733f017
feat: test detailed muscle rendering and selection
Devasy ed9b6fb
docs: add release notes for muscle anatomy and phase views
Devasy 6c17a5a
test: cover gender preferences onboarding and exercise phase palettes
Devasy ce0b2c7
fix: keep gender selection controlled by saved preference
Devasy 840f349
fix: match shoulder press phase targets to catalogue IDs
Devasy 7f982eb
test: cover failed gender saves and shoulder press phase maps
Devasy 493387a
Make saved gender the app-wide muscle diagram selection
Devasy 62d5503
Make saved gender the app-wide muscle diagram selection
Devasy 6e277cd
Make saved gender the app-wide muscle diagram selection
Devasy a8f0085
Prompt existing users once for gender before entering the app
Devasy 687eb6a
Prompt existing users once for gender before entering the app
Devasy 8d88cb2
Prompt existing users once for gender before entering the app
Devasy cd08b3a
Document and verify one-time gender setup and shared diagrams
Devasy d1a8e0f
Document and verify one-time gender setup and shared diagrams
Devasy 49dd666
Document and verify one-time gender setup and shared diagrams
Devasy 2b64317
Test upgrade gender prompt persistence restart and failed saves
Devasy 815ad86
Enclose profile save error feedback in a mounted guard block
Devasy 0e61cf7
Assert both shoulder press catalogue targets in phase regression test
Devasy File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,26 @@ | ||
| # Body diagram geometry | ||
|
|
||
| Muscle outlines are derived from MuscleMap by Melih Colpan (https://github.com/melihcolpan/MuscleMap), via openGym's body-paths.js at commit f049465c1e4732c84e7077286dc99a66fdd2ed23 (https://github.com/DuarteSantos8/openGym). | ||
| Only the MIT-licensed geometry is reused. The Flutter renderer and RepForge muscle mapping are implemented for RepForge. | ||
|
|
||
| MIT License | ||
|
|
||
| Copyright (c) 2026 Melih Colpan | ||
|
|
||
| Permission is hereby granted, free of charge, to any person obtaining a copy | ||
| of this software and associated documentation files (the "Software"), to deal | ||
| in the Software without restriction, including without limitation the rights | ||
| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||
| copies of the Software, and to permit persons to whom the Software is | ||
| furnished to do so, subject to the following conditions: | ||
|
|
||
| The above copyright notice and this permission notice shall be included in all | ||
| copies or substantial portions of the Software. | ||
|
|
||
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||
| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||
| SOFTWARE. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,4 @@ | ||
| /// Diagram geometry selected from the saved gender; not used for health scores. | ||
| enum BodyFigure { male, female } | ||
|
|
||
| enum UserGender { male, female, preferNotToSay } |
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,160 @@ | ||
| import '../models/models.dart'; | ||
|
|
||
| /// Illustrative prime movers for standard technique, excluding stabilizers. | ||
| /// Activation percentages come from the catalogue; they are not measurements | ||
| /// of muscle length or contraction force. Unknown/custom/isometric exercises | ||
| /// deliberately have no inferred motion phases. | ||
| class ExerciseMuscleMotion { | ||
| const ExerciseMuscleMotion(this.muscles, this.stretched, this.contracted); | ||
| final List<String> muscles; | ||
| final String stretched; | ||
| final String contracted; | ||
|
|
||
| static ExerciseMuscleMotion? forExercise(Exercise exercise) => | ||
| exercise.isCustom ? null : _motions[exercise.id]; | ||
| } | ||
|
|
||
| const _chestPress = ExerciseMuscleMotion( | ||
| ['chest', 'upper_chest', 'triceps', 'front_delts'], | ||
| 'Lower the weight with control toward your chest.', | ||
| 'Press the weight away from your chest.', | ||
| ); | ||
| const _chestFly = ExerciseMuscleMotion( | ||
| ['chest'], | ||
| 'Open your arms with control.', | ||
| 'Bring your arms together.', | ||
| ); | ||
| const _curl = ExerciseMuscleMotion( | ||
| ['biceps'], | ||
| 'Lower the weight as your elbows extend.', | ||
| 'Curl the weight as your elbows bend.', | ||
| ); | ||
| const _triceps = ExerciseMuscleMotion( | ||
| ['triceps'], | ||
| 'Allow your elbows to bend with control.', | ||
| 'Extend your elbows against resistance.', | ||
| ); | ||
| const _squat = ExerciseMuscleMotion( | ||
| ['quads', 'glutes'], | ||
| 'Lower into the squat as your knees and hips bend.', | ||
| 'Stand up by extending your knees and hips.', | ||
| ); | ||
| const _row = ExerciseMuscleMotion( | ||
| ['back', 'lats', 'biceps', 'rear_delts'], | ||
| 'Extend your arms and allow your shoulder blades to move forward with control.', | ||
| 'Pull toward your torso, drawing your shoulder blades back.', | ||
| ); | ||
| const _pulldown = ExerciseMuscleMotion( | ||
| ['lats', 'biceps'], | ||
| 'Return toward the overhead position with control.', | ||
| 'Pull down by bending your elbows and bringing your upper arms toward your torso.', | ||
| ); | ||
| const _shoulderPress = ExerciseMuscleMotion( | ||
| ['shoulders', 'triceps'], | ||
| 'Lower the weight toward shoulder height with control.', | ||
| 'Press the weight overhead.', | ||
| ); | ||
| const _motions = <String, ExerciseMuscleMotion>{ | ||
| 'bench_press': _chestPress, | ||
| 'incline_bench_press': _chestPress, | ||
| 'dumbbell_bench_press': _chestPress, | ||
| 'incline_dumbbell_press': _chestPress, | ||
| 'close_grip_bench': _chestPress, | ||
| 'cable_fly': _chestFly, | ||
| 'pec_deck': _chestFly, | ||
| 'push_ups': ExerciseMuscleMotion( | ||
| ['chest', 'triceps', 'front_delts'], | ||
| 'Lower your body toward the floor with control.', | ||
| 'Push your body away from the floor.', | ||
| ), | ||
| 'dips': ExerciseMuscleMotion( | ||
| ['chest', 'triceps', 'front_delts'], | ||
| 'Lower your body as your elbows bend.', | ||
| 'Press up by extending your elbows.', | ||
| ), | ||
| 'lat_pulldown': _pulldown, | ||
| 'pull_ups': ExerciseMuscleMotion( | ||
| ['lats', 'biceps'], | ||
| 'Lower your body toward a hang with control.', | ||
| 'Pull your body upward.', | ||
| ), | ||
| 'chin_ups': ExerciseMuscleMotion( | ||
| ['lats', 'biceps'], | ||
| 'Lower your body toward a hang with control.', | ||
| 'Pull your body upward.', | ||
| ), | ||
| 'barbell_row': _row, | ||
| 'dumbbell_row': _row, | ||
| 'seated_cable_row': _row, | ||
| 't_bar_row': _row, | ||
| 'overhead_press': _shoulderPress, | ||
| 'dumbbell_shoulder_press': _shoulderPress, | ||
| 'lateral_raise': ExerciseMuscleMotion( | ||
| ['side_delts'], | ||
| 'Lower your arms toward your sides.', | ||
| 'Raise your arms out to your sides.', | ||
| ), | ||
| 'front_raise': ExerciseMuscleMotion( | ||
| ['front_delts'], | ||
| 'Lower your arms with control.', | ||
| 'Raise your arms in front of you.', | ||
| ), | ||
| 'rear_delt_fly': ExerciseMuscleMotion( | ||
| ['rear_delts'], | ||
| 'Bring your arms forward with control.', | ||
| 'Open your arms out to the sides.', | ||
| ), | ||
| 'shrugs': ExerciseMuscleMotion( | ||
| ['traps'], | ||
| 'Lower your shoulders with control.', | ||
| 'Lift your shoulders upward.', | ||
| ), | ||
| 'squat': _squat, | ||
| 'leg_press': ExerciseMuscleMotion( | ||
| ['quads', 'glutes'], | ||
| 'Bring the platform toward you as your knees and hips bend.', | ||
| 'Press the platform away by extending your knees and hips.', | ||
| ), | ||
| 'leg_extension': ExerciseMuscleMotion( | ||
| ['quads'], | ||
| 'Bend your knees as you lower the weight.', | ||
| 'Straighten your knees against resistance.', | ||
| ), | ||
| 'leg_curl': ExerciseMuscleMotion( | ||
| ['hamstrings'], | ||
| 'Extend your knees as you lower the weight.', | ||
| 'Bend your knees against resistance.', | ||
| ), | ||
| 'romanian_deadlift': ExerciseMuscleMotion( | ||
| ['hamstrings', 'glutes'], | ||
| 'Hinge at your hips, moving them back as you lower the weight.', | ||
| 'Extend your hips to stand upright.', | ||
| ), | ||
| 'hip_thrust': ExerciseMuscleMotion( | ||
| ['glutes'], | ||
| 'Lower your hips with control.', | ||
| 'Drive your hips upward.', | ||
| ), | ||
| 'calf_raise': ExerciseMuscleMotion( | ||
| ['calves'], | ||
| 'Lower your heels with control.', | ||
| 'Raise your heels by pushing through your forefoot.', | ||
| ), | ||
| 'bicep_curl': _curl, | ||
| 'hammer_curl': _curl, | ||
| 'preacher_curl': _curl, | ||
| 'concentration_curl': _curl, | ||
| 'tricep_pushdown': _triceps, | ||
| 'skull_crushers': _triceps, | ||
| 'overhead_tricep_extension': _triceps, | ||
| 'crunches': ExerciseMuscleMotion( | ||
| ['core'], | ||
| 'Uncurl your torso with control.', | ||
| 'Curl your torso toward your pelvis.', | ||
| ), | ||
| 'cable_crunch': ExerciseMuscleMotion( | ||
| ['core'], | ||
| 'Uncurl your torso with control.', | ||
| 'Curl your torso against resistance.', | ||
| ), | ||
| }; | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.