From 6cd44579e2bd677456bc8aff3059f57c808cc670 Mon Sep 17 00:00:00 2001 From: rzen Date: Sun, 13 Jul 2025 08:55:07 -0400 Subject: [PATCH] initial requirements and direction for windsurf --- .windsurf/prompt.md | 108 +++++++++++++++++ MODEL.md | 81 +++++++++++++ TECH.md | 5 + UI.md | 157 +++++++++++++++++++++++++ Workouts/Resources/exercise-types.json | 42 +++++++ Workouts/Resources/exercises.json | 151 ++++++++++++++++++++++++ Workouts/Resources/muscle-groups.json | 58 +++++++++ Workouts/Resources/muscles.json | 60 ++++++++++ Workouts/Resources/splits.json | 50 ++++++++ 9 files changed, 712 insertions(+) create mode 100644 .windsurf/prompt.md create mode 100644 MODEL.md create mode 100644 TECH.md create mode 100644 UI.md create mode 100644 Workouts/Resources/exercise-types.json create mode 100644 Workouts/Resources/exercises.json create mode 100644 Workouts/Resources/muscle-groups.json create mode 100644 Workouts/Resources/muscles.json create mode 100644 Workouts/Resources/splits.json diff --git a/.windsurf/prompt.md b/.windsurf/prompt.md new file mode 100644 index 0000000..8e91fc0 --- /dev/null +++ b/.windsurf/prompt.md @@ -0,0 +1,108 @@ +# General Guidelines + +## Technology Stack + +Technology stack is described in TECH.md file. + +## Data Model + +Data model is defined in MODEL.md file. + +## Persistence + +When implementing an edit form for a SwiftData model, ensure proper loading: + +1. BEFORE PRESENTING THE FORM: + - Ensure the model is fully loaded with all its relationships + - Use a deep fetch pattern to eagerly load all relationships + - Access each property to force SwiftData to materialize lazy-loaded relationships + - Consider creating a deep copy of the model if relationships are complex + +2. IN THE EDIT VIEW: + - Accept the model as a @State parameter (e.g., @State var modelObject: ModelType) + - Create separate @State variables for each editable field + - Initialize each state variable in the init() method using State(initialValue:) + - Use the modelContext for persisting changes back to the data store + +3. SAVING CHANGES: + - When saving, update the model object properties from state variables + - Use modelContext.save() to persist changes + - Handle errors appropriately + + +## User Interface and User Experience + +Each view struct should be placed in its own file under "Views" directory. + +The user interface and user experience should follow Apple's Human Interface Guidelines (HIG) and best practices for iOS development. + +Avoid custom UI components, instead rely on available SwiftUI views and modifiers. + +When creating a add/edit functionality for a model, unless otherwise instructed use a single Add/Edit View for both add and edit functionality. + +Unless otherwise instructed, use a sheet to present both add and edit views. + +Whenever a list view has no entries, show a placeholder view with text "No [ListName] yet." and a button "Add [ListName]". + +Before presenting an add/edit view, ensure the model is fully loaded with all its relationships. Make use of async/await mechanism to load the model. Show an overlay with a loading indicator while the model is being loaded. + +## Logger + +Use custom logger instead of print statements. + +Make a custom logger as follows: + +```swift +import OSLog + +struct AppLogger { + private let logger: Logger + private let subsystem: String + private let category: String + + init(subsystem: String, category: String) { + self.subsystem = subsystem + self.category = category + self.logger = Logger(subsystem: subsystem, category: category) + } + + func timestamp () -> String { + Date.now.formatDateET(format: "yyyy-MM-dd HH:mm:ss") + } + + func formattedMessage (_ message: String) -> String { + "\(timestamp()) [\(subsystem):\(category)] \(message)" + } + + func debug(_ message: String) { + logger.debug("\(formattedMessage(message))") + } + + func info(_ message: String) { + logger.info("\(formattedMessage(message))") + } + + func warning(_ message: String) { + logger.warning("\(formattedMessage(message))") + } + + func error(_ message: String) { + logger.error("\(formattedMessage(message))") + } +} +``` + +```swift +extension Date { + func formatDateET(format: String = "MMMM, d yyyy @ h:mm a z") -> String { + let formatter = DateFormatter() + formatter.timeZone = TimeZone(identifier: "America/New_York") + formatter.dateFormat = format + return formatter.string(from: self) + } + + static var ISO8601: String { + "yyyy-MM-dd'T'HH:mm:ssZ" + } +} +``` \ No newline at end of file diff --git a/MODEL.md b/MODEL.md new file mode 100644 index 0000000..b23d410 --- /dev/null +++ b/MODEL.md @@ -0,0 +1,81 @@ +# Data Model + +## Guidelines + +### General + +- When implementing a SwiftData model, allocate each model into its own file under "Models" directory. + +### Schema Versioning + +- Keep schema configurations in a separate folder called "Schema" +- Setup an enum for schema versioning +- Create SchemaMigrationPlan struct in Schema/SchemaMigrationPlan.swift for managing schema migrations +- Use schema versioning to manage changes to the data model +- When adding a new model, increment the schema version +- When removing a model, increment the schema version +- When modifying a model, increment the schema version + +### SwiftData Relationship Rules + +- DO NOT create any relationships that are not explicitly defined in the data model +- AVOID circular references in all cases +- Infer type of relationship from the property name (to many for plural, to one for singular) + +## Models + +ExerciseType +- name (String) +- descr (String) +- exercises (Set?) // deleteRule: nullify, inverse: Exercise.types + +MuscleGroup +- name (String) +- descr (String) +- muscles (Set?) // deleteRule: nullify, inverse: Muscle.groups + +Muscle +- name (String) +- descr (String) +- groups (Set) // deleteRule: nullify, inverse: MuscleGroup.muscles +- exercises (Set?) // deleteRule: nullify, inverse: Exercise.muscles + +Exercise +- types (Set?) // deleteRule: .nullify, inverse: ExerciseType.exercises +- name (String) +- setup (String) +- descr (String) +- muscles (Set?) // deleteRule: .nullify, inverse: Muscle.exercises +- sets (Int) +- reps (Int) +- weight (Int) +- splits (Set?) // deleteRule: .nullify, inverse: SplitExerciseAssignment.exercise +- logs (Set?) // deleteRule: .nullify, inverse: WorkoutLog.exercise + +SplitExerciseAssignment +- split (Split?) // deleteRule: .nullify, inverse: Split.exercises +- exercise (Exercise?) // deleteRule: .nullify, inverse: Exercise.splits +- order (Int) +- sets (Int) +- reps (Int) +- weight (Int) + +Split +- name (String) +- intro (String) +- exercises (Set?) // deleteRule: .cascade, inverse: SplitExerciseAssignment.split + +WorkoutLog +- workout (Workout?) // deleteRule: .nullify, inverse: Workout.logs +- exercise (Exercise?) // deleteRule: .nullify, inverse: Exercise.logs +- date (Date) +- sets (Int) +- reps (Int) +- weight (Int) +- completed (Bool) + +Workout +- split (Split?) // deleteRule: .nullify, inverse: Split.workouts +- start (Date) +- end (Date?) +- logs (Set?) // deleteRule: .cascade, inverse: WorkoutLog.workout diff --git a/TECH.md b/TECH.md new file mode 100644 index 0000000..43e450d --- /dev/null +++ b/TECH.md @@ -0,0 +1,5 @@ +# Technology Stack + +- Swift +- SwiftData +- SwiftUI diff --git a/UI.md b/UI.md new file mode 100644 index 0000000..d5f9057 --- /dev/null +++ b/UI.md @@ -0,0 +1,157 @@ +# User Interface + +## Tabs + +Each tab is a root of its own navigation stack. + +- Workout Log +- Reports +- Settings + +## Workout Log + +- toolbar + - left bar button: none + - title: Workout Log + - right bar button: Add Workout +- main view: + - List of WorkoutLog objects + - Grouped by date, in descending order + - Group header shows date and split name + - Each row shows: + - Time + - Exercise + - Sets + - Reps + - Weight + + - When main view list has no entries, show a placeholder view with text "No workouts yet." and a button "Start Split" + +### Start Split View + +Start Split View slides on top of Workout Log View navigation stack. + +- left bar button: default (back to Workout Log) +- title: Start Split +- right bar button: none + +- main view: + - list of available splits + - button "Start [SplitName] Split" -> Workout Split + +### Workout Split View + +Workout Split View slides on top of Workout Log View navigation stack. + +- left bar button: default (back to Start Split) +- title: [SplitName] Split +- right bar button: Add Exercise + +- main view: + - list of exercises in the split + - actions: + - on row slide to left + - button "Edit" + - on row slide to right + - button "Completed" + - on row tap + - open Exercise View + +### Exercise View + +Exercise View slides on top of Workout Split View navigation stack. + +- left bar button: default (back to Workout Split) +- title: [ExerciseName] +- right bar button: Edit (pencil icon) + - action: open Add/Edit Exercise Assignment View + +- main view: + - form + sections: + - split + - split name + - exercise assignment (titled "Planned") + - exercise + - name + - setup + - description + - muscles + - weight + - sets (read only) + - reps (read only) + - weight (read only) + - workout log (titled "Actual") + - date (date/time picker) + - sets (integer picker) + - reps (integer picker) + - weight (integer picker) + - status + - Completed (checkbox) + + - actions: + - swipe left + - open Exercise View for the previous ExerciseAssignment + - swipe right + - open Exercise View for the next ExerciseAssignment + +### Add/Edit Exercise to Split View + +This view should be opened as a sheet. + +- left bar button: default (back to Workout Split) +- title: Add/Edit Exercise to Split +- right bar button: Save + +- main view: + - before an exercise is selected + - list of available exercises + - button "Add [ExerciseName]" + - after an exercise is selected + - a form for model SplitExerciseAssignment + - sets + - reps + - weight + +## Settings + +- left bar button: none +- title: Settings +- right bar button: none + +- main view: + - list + - Splits + - Exercises + - Muscle Groups + - Muscles + - Exercise Types + + - actions: + - on row tap + - open corresponding list view (e.g. for "Splits" open "Splits List View") + +### (Splits|Exercises|Muscle Groups|Muscles|Exercise Types) List View + +- left bar button: default (back to Settings) +- title: [ListName] +- right bar button: Add (plus icon) + - action: open corresponding add/edit view (e.g. for "Splits" open "Splits Add/Edit View") + +- main view: + - list of [ListName] + - actions: + - on row tap + - open corresponding add/edit view (e.g. for "Splits" open "Splits Add/Edit View") + +### (Splits|Exercises|Muscle Groups|Muscles|Exercise Types) Add/Edit View + +Add/Edit views typically open as sheets. + +- left bar button: default (back to Settings) +- title: [Add/Edit] [ListName] +- right bar button: Save + +- main view: + - form with editable fields + diff --git a/Workouts/Resources/exercise-types.json b/Workouts/Resources/exercise-types.json new file mode 100644 index 0000000..d10b07b --- /dev/null +++ b/Workouts/Resources/exercise-types.json @@ -0,0 +1,42 @@ +[ + { + "name": "Bodyweight", + "descr": "Exercises that use your own body as resistance, requiring no equipment." + }, + { + "name": "Free Weight", + "descr": "Exercises using handheld weights such as dumbbells, barbells, or kettlebells." + }, + { + "name": "Resistance Band", + "descr": "Exercises performed with elastic bands that provide variable resistance." + }, + { + "name": "Machine-Based", + "descr": "Exercises performed on gym equipment with guided movement paths." + }, + { + "name": "Suspension", + "descr": "Exercises using bodyweight and adjustable straps anchored to a point." + }, + { + "name": "Calisthenics", + "descr": "Advanced bodyweight movements focusing on control, balance, and strength." + }, + { + "name": "Stretching - Static", + "descr": "Stretching muscles by holding a position for a prolonged time." + }, + { + "name": "Stretching - Dynamic", + "descr": "Active movements that stretch muscles and joints through full range of motion." + }, + { + "name": "Plyometric", + "descr": "Explosive movements designed to build power and speed." + }, + { + "name": "Isometric", + "descr": "Exercises that involve holding a position under tension without movement." + } +] \ No newline at end of file diff --git a/Workouts/Resources/exercises.json b/Workouts/Resources/exercises.json new file mode 100644 index 0000000..9ee69da --- /dev/null +++ b/Workouts/Resources/exercises.json @@ -0,0 +1,151 @@ +[ + { + "name": "Lat Pull Down", + "setup": "Seat: 3, Thigh Pad: 4", + "descr": "Sit upright with your knees secured under the pad. Grip the bar wider than shoulder-width. Pull the bar down to your chest, squeezing your shoulder blades together. Avoid leaning back excessively or using momentum.", + "sets": 3, + "reps": 10, + "weight": 60, + "type": "Machine-Based", + "muscles": ["Latissimus Dorsi", "Trapezius", "Rhomboids", "Biceps Brachii"] + }, + { + "name": "Seated Row", + "setup": "Seat: 2, Chest Pad: 3", + "descr": "With your chest firmly against the pad, grip the handles and pull straight back while keeping your elbows close to your body. Focus on retracting your shoulder blades and avoid rounding your back.", + "sets": 3, + "reps": 10, + "weight": 60, + "type": "Machine-Based", + "muscles": ["Latissimus Dorsi", "Rhomboids", "Trapezius", "Biceps Brachii"] + }, + { + "name": "Shoulder Press", + "setup": "Seat: 4", + "descr": "Sit with your back against the pad, grip the handles just outside shoulder-width. Press upward without locking out your elbows. Keep your neck relaxed and avoid shrugging your shoulders.", + "sets": 3, + "reps": 10, + "weight": 30, + "type": "Machine-Based", + "muscles": ["Deltoid (Anterior)", "Deltoid (Lateral)", "Triceps Brachii"] + }, + { + "name": "Chest Press", + "setup": "Seat: 3", + "descr": "Adjust the seat so the handles are at mid-chest height. Push forward until arms are nearly extended, then return slowly. Keep wrists straight and don’t let your elbows drop too low.", + "sets": 3, + "reps": 10, + "weight": 40, + "type": "Machine-Based", + "muscles": ["Pectoralis Major", "Triceps Brachii", "Deltoid (Anterior)"] + }, + { + "name": "Tricep Press", + "setup": "Seat: 2", + "descr": "With elbows close to your sides, press the handles downward in a controlled motion. Avoid flaring your elbows or using your shoulders to assist the motion.", + "sets": 3, + "reps": 10, + "weight": 60, + "type": "Machine-Based", + "muscles": ["Triceps Brachii"] + }, + { + "name": "Arm Curl", + "setup": "Seat: 3", + "descr": "Position your arms over the pad and grip the handles. Curl the weight upward while keeping your upper arms stationary. Avoid using momentum and fully control the lowering phase.", + "sets": 3, + "reps": 10, + "weight": 30, + "type": "Machine-Based", + "muscles": ["Biceps Brachii", "Brachialis"] + }, + { + "name": "Abdominal", + "setup": "Seat: 2, Back Pad: 3", + "descr": "Sit with the pads resting against your chest. Contract your abs to curl forward, keeping your lower back in contact with the pad. Avoid pulling with your arms or hips.", + "sets": 3, + "reps": 10, + "weight": 60, + "type": "Machine-Based", + "muscles": ["Rectus Abdominis", "Internal Obliques"] + }, + { + "name": "Rotary", + "setup": "Seat: 3, Start Angle: Centered", + "descr": "Rotate your torso from side to side in a controlled motion, keeping your hips still. Focus on using your obliques to generate the twist, not momentum or the arms.", + "sets": 3, + "reps": 10, + "weight": 60, + "type": "Machine-Based", + "muscles": ["Internal Obliques", "External Obliques"] + }, + { + "name": "Leg Press", + "setup": "Seat Angle: 4, Platform: Middle", + "descr": "Place your feet shoulder-width on the platform. Press upward through your heels without locking your knees. Keep your back flat against the pad throughout the motion.", + "sets": 3, + "reps": 10, + "weight": 130, + "type": "Machine-Based", + "muscles": [ + "Gluteus Maximus", + "Rectus Femoris", + "Vastus Lateralis", + "Vastus Medialis", + "Vastus Intermedius", + "Biceps Femoris", + "Semitendinosus", + "Semimembranosus" + ] + }, + { + "name": "Leg Extension", + "setup": "Seat: 3, Pad: Above ankle", + "descr": "Sit upright and align your knees with the pivot point. Extend your legs to a straightened position, then lower with control. Avoid jerky movements or lifting your hips off the seat.", + "sets": 3, + "reps": 10, + "weight": 70, + "type": "Machine-Based", + "muscles": ["Rectus Femoris", "Vastus Lateralis", "Vastus Medialis", "Vastus Intermedius"] + }, + { + "name": "Leg Curl", + "setup": "Seat: 2, Pad: Above ankle", + "descr": "Lie face down or sit depending on the version. Curl your legs toward your glutes, focusing on hamstring engagement. Avoid arching your back or using momentum.", + "sets": 3, + "reps": 10, + "weight": 60, + "type": "Machine-Based", + "muscles": ["Biceps Femoris", "Semitendinosus", "Semimembranosus"] + }, + { + "name": "Adductor", + "setup": "Seat: 3, Start Position: Wide", + "descr": "Sit with legs placed outside the pads. Bring your legs together using inner thigh muscles. Control the motion both in and out, avoiding fast swings.", + "sets": 3, + "reps": 10, + "weight": 110, + "type": "Machine-Based", + "muscles": ["Adductor Longus", "Adductor Brevis", "Adductor Magnus", "Gracilis"] + }, + { + "name": "Abductor", + "setup": "Seat: 3, Start Position: Narrow", + "descr": "Sit with legs inside the pads and push outward to engage outer thighs and glutes. Avoid leaning forward and keep the motion controlled throughout.", + "sets": 3, + "reps": 10, + "weight": 110, + "type": "Machine-Based", + "muscles": ["Gluteus Medius", "Tensor Fasciae Latae"] + }, + { + "name": "Calfs", + "setup": "Seat: 3, Toe Bar: Midfoot", + "descr": "Place the balls of your feet on the platform with heels hanging off. Raise your heels by contracting your calves, then slowly lower them below the platform level for a full stretch.", + "sets": 3, + "reps": 10, + "weight": 60, + "type": "Machine-Based", + "muscles": ["Gastrocnemius", "Soleus"] + } +] diff --git a/Workouts/Resources/muscle-groups.json b/Workouts/Resources/muscle-groups.json new file mode 100644 index 0000000..82174fb --- /dev/null +++ b/Workouts/Resources/muscle-groups.json @@ -0,0 +1,58 @@ +[ + { + "name": "Chest", + "descr": "Muscles at the front of the upper torso responsible for pushing movements." + }, + { + "name": "Back", + "descr": "Muscles along the spine and upper back involved in pulling, posture, and lifting." + }, + { + "name": "Shoulders", + "descr": "Muscles surrounding the shoulder joint, enabling arm rotation and elevation." + }, + { + "name": "Arms", + "descr": "Upper limb muscles responsible for flexion, extension, and grip strength." + }, + { + "name": "Abdominals", + "descr": "Core muscles on the front and sides of the torso, key for stability and trunk movement." + }, + { + "name": "Glutes", + "descr": "Powerful hip muscles that drive hip extension, rotation, and posture." + }, + { + "name": "Quadriceps", + "descr": "Four muscles at the front of the thigh responsible for knee extension." + }, + { + "name": "Hamstrings", + "descr": "Muscles at the back of the thigh that bend the knee and extend the hip." + }, + { + "name": "Calves", + "descr": "Muscles of the lower leg that control ankle movement and propulsion." + }, + { + "name": "Forearms", + "descr": "Muscles between the elbow and wrist that manage wrist and finger motion." + }, + { + "name": "Neck", + "descr": "Muscles supporting the head and enabling neck movement and posture." + }, + { + "name": "Hip Flexors", + "descr": "Muscles at the front of the hip that lift the thigh toward the torso." + }, + { + "name": "Adductors", + "descr": "Inner thigh muscles that pull the legs toward the midline of the body." + }, + { + "name": "Abductors", + "descr": "Outer hip muscles that move the legs away from the body’s midline." + } +] diff --git a/Workouts/Resources/muscles.json b/Workouts/Resources/muscles.json new file mode 100644 index 0000000..97bc1ea --- /dev/null +++ b/Workouts/Resources/muscles.json @@ -0,0 +1,60 @@ +[ + { "name": "Pectoralis Major", "muscleGroup": "Chest", "descr": "Large chest muscle located on the front of the upper torso, responsible for arm flexion and pushing." }, + { "name": "Pectoralis Minor", "muscleGroup": "Chest", "descr": "Thin, triangular muscle beneath the pectoralis major, stabilizes the scapula." }, + + { "name": "Latissimus Dorsi", "muscleGroup": "Back", "descr": "Broad muscle on the mid to lower back, responsible for pulling and shoulder extension." }, + { "name": "Trapezius", "muscleGroup": "Back", "descr": "Large muscle covering the upper back and neck, involved in shoulder movement and posture." }, + { "name": "Rhomboids", "muscleGroup": "Back", "descr": "Muscles between the shoulder blades, responsible for scapular retraction." }, + { "name": "Erector Spinae", "muscleGroup": "Back", "descr": "Long vertical muscles along the spine that maintain posture and extend the back." }, + + { "name": "Deltoid (Anterior)", "muscleGroup": "Shoulders", "descr": "Front portion of the shoulder muscle, raises the arm forward." }, + { "name": "Deltoid (Lateral)", "muscleGroup": "Shoulders", "descr": "Middle portion of the shoulder muscle, raises the arm to the side." }, + { "name": "Deltoid (Posterior)", "muscleGroup": "Shoulders", "descr": "Rear portion of the shoulder muscle, moves the arm backward." }, + { "name": "Rotator Cuff Muscles", "muscleGroup": "Shoulders", "descr": "Group of four muscles surrounding the shoulder joint, stabilizing and rotating the arm." }, + + { "name": "Biceps Brachii", "muscleGroup": "Arms", "descr": "Front upper arm muscle, responsible for elbow flexion and forearm rotation." }, + { "name": "Triceps Brachii", "muscleGroup": "Arms", "descr": "Back upper arm muscle, responsible for elbow extension." }, + { "name": "Brachialis", "muscleGroup": "Arms", "descr": "Muscle beneath the biceps, assists in elbow flexion." }, + { "name": "Brachioradialis", "muscleGroup": "Arms", "descr": "Forearm muscle on the thumb side, aids in elbow flexion." }, + + { "name": "Rectus Abdominis", "muscleGroup": "Abdominals", "descr": "Vertical muscle on the front of the abdomen, responsible for trunk flexion (the 'six-pack')." }, + { "name": "Transverse Abdominis", "muscleGroup": "Abdominals", "descr": "Deepest abdominal muscle, wraps around the torso to stabilize the core." }, + { "name": "Internal Obliques", "muscleGroup": "Abdominals", "descr": "Muscles located beneath the external obliques, involved in trunk rotation and lateral flexion." }, + { "name": "External Obliques", "muscleGroup": "Abdominals", "descr": "Muscles on the sides of the abdomen, responsible for trunk twisting and side bending." }, + + { "name": "Gluteus Maximus", "muscleGroup": "Glutes", "descr": "Largest glute muscle located in the buttocks, responsible for hip extension and rotation." }, + { "name": "Gluteus Medius", "muscleGroup": "Glutes", "descr": "Muscle on the outer surface of the pelvis, important for hip abduction and stability." }, + { "name": "Gluteus Minimus", "muscleGroup": "Glutes", "descr": "Smallest glute muscle, located beneath the medius, assists in hip abduction." }, + + { "name": "Rectus Femoris", "muscleGroup": "Quadriceps", "descr": "Front thigh muscle, part of the quadriceps group, helps extend the knee and flex the hip." }, + { "name": "Vastus Lateralis", "muscleGroup": "Quadriceps", "descr": "Outer thigh muscle, part of the quadriceps, involved in knee extension." }, + { "name": "Vastus Medialis", "muscleGroup": "Quadriceps", "descr": "Inner thigh muscle, part of the quadriceps, assists in knee extension and stabilization." }, + { "name": "Vastus Intermedius", "muscleGroup": "Quadriceps", "descr": "Deep thigh muscle beneath rectus femoris, assists in knee extension." }, + + { "name": "Biceps Femoris", "muscleGroup": "Hamstrings", "descr": "Muscle on the back of the thigh, responsible for knee flexion and hip extension." }, + { "name": "Semitendinosus", "muscleGroup": "Hamstrings", "descr": "Medial hamstring muscle, assists in knee flexion and internal rotation." }, + { "name": "Semimembranosus", "muscleGroup": "Hamstrings", "descr": "Deep medial hamstring muscle, also assists in knee flexion and hip extension." }, + + { "name": "Gastrocnemius", "muscleGroup": "Calves", "descr": "Large calf muscle visible on the back of the lower leg, responsible for plantar flexion of the foot." }, + { "name": "Soleus", "muscleGroup": "Calves", "descr": "Flat muscle beneath the gastrocnemius, aids in plantar flexion when the knee is bent." }, + + { "name": "Flexor Carpi Radialis", "muscleGroup": "Forearms", "descr": "Muscle on the front of the forearm, flexes and abducts the wrist." }, + { "name": "Flexor Carpi Ulnaris", "muscleGroup": "Forearms", "descr": "Forearm muscle that flexes and adducts the wrist." }, + { "name": "Extensor Carpi Radialis", "muscleGroup": "Forearms", "descr": "Posterior forearm muscle that extends and abducts the wrist." }, + { "name": "Pronator Teres", "muscleGroup": "Forearms", "descr": "Muscle running across the forearm that pronates the forearm (palm down)." }, + + { "name": "Sternocleidomastoid", "muscleGroup": "Neck", "descr": "Prominent neck muscle responsible for rotating and flexing the head." }, + { "name": "Splenius Capitis", "muscleGroup": "Neck", "descr": "Back of neck muscle that extends and rotates the head." }, + { "name": "Scalenes", "muscleGroup": "Neck", "descr": "Lateral neck muscles that assist in neck flexion and elevate the ribs during breathing." }, + + { "name": "Iliopsoas", "muscleGroup": "Hip Flexors", "descr": "Deep muscle group connecting the lower spine to the femur, main hip flexor." }, + { "name": "Rectus Femoris", "muscleGroup": "Hip Flexors", "descr": "Also part of the quadriceps, helps flex the hip and extend the knee." }, + { "name": "Sartorius", "muscleGroup": "Hip Flexors", "descr": "Longest muscle in the body, crosses the thigh to flex and rotate the hip and knee." }, + + { "name": "Adductor Longus", "muscleGroup": "Adductors", "descr": "Medial thigh muscle that adducts the leg and assists with hip flexion." }, + { "name": "Adductor Brevis", "muscleGroup": "Adductors", "descr": "Short adductor muscle that helps pull the thigh inward." }, + { "name": "Adductor Magnus", "muscleGroup": "Adductors", "descr": "Large, deep inner thigh muscle that performs hip adduction and extension." }, + { "name": "Gracilis", "muscleGroup": "Adductors", "descr": "Thin inner thigh muscle that assists in adduction and knee flexion." }, + + { "name": "Tensor Fasciae Latae", "muscleGroup": "Abductors", "descr": "Lateral hip muscle that abducts and medially rotates the thigh." } +] diff --git a/Workouts/Resources/splits.json b/Workouts/Resources/splits.json new file mode 100644 index 0000000..7b2c793 --- /dev/null +++ b/Workouts/Resources/splits.json @@ -0,0 +1,50 @@ +[ + { + "name": "Upper Body", + "intro": "Focuses on muscles of the chest, back, shoulders, arms, and core. Ideal for developing strength and symmetry above the waist.", + "splitExerciseAssignments": [ + { "exercise": "Lat Pull Down", "weight": 70, "sets": 3, "reps": 10 }, + { "exercise": "Seated Row", "weight": 80, "sets": 3, "reps": 10 }, + { "exercise": "Shoulder Press", "weight": 40, "sets": 3, "reps": 10 }, + { "exercise": "Chest Press", "weight": 50, "sets": 3, "reps": 10 }, + { "exercise": "Tricep Press", "weight": 40, "sets": 3, "reps": 10 }, + { "exercise": "Arm Curl", "weight": 35, "sets": 3, "reps": 10 }, + { "exercise": "Abdominal", "weight": 50, "sets": 3, "reps": 15 }, + { "exercise": "Rotary", "weight": 40, "sets": 3, "reps": 12 } + ] + }, + { + "name": "Lower Body", + "intro": "Targets the legs, glutes, calves, and lower core. Essential for building power, stability, and balanced physique.", + "splitExerciseAssignments": [ + { "exercise": "Leg Press", "weight": 120, "sets": 3, "reps": 10 }, + { "exercise": "Leg Extension", "weight": 60, "sets": 3, "reps": 10 }, + { "exercise": "Leg Curl", "weight": 55, "sets": 3, "reps": 10 }, + { "exercise": "Adductor", "weight": 50, "sets": 3, "reps": 12 }, + { "exercise": "Abductor", "weight": 50, "sets": 3, "reps": 12 }, + { "exercise": "Calfs", "weight": 70, "sets": 3, "reps": 15 }, + { "exercise": "Abdominal", "weight": 50, "sets": 3, "reps": 15 }, + { "exercise": "Rotary", "weight": 40, "sets": 3, "reps": 12 } + ] + }, + { + "name": "Full Body", + "intro": "Combines upper and lower body exercises to target all major muscle groups in a single session. Ideal for general fitness and efficient training.", + "splitExerciseAssignments": [ + { "exercise": "Lat Pull Down", "weight": 70, "sets": 3, "reps": 10 }, + { "exercise": "Seated Row", "weight": 80, "sets": 3, "reps": 10 }, + { "exercise": "Shoulder Press", "weight": 40, "sets": 3, "reps": 10 }, + { "exercise": "Chest Press", "weight": 50, "sets": 3, "reps": 10 }, + { "exercise": "Tricep Press", "weight": 40, "sets": 3, "reps": 10 }, + { "exercise": "Arm Curl", "weight": 35, "sets": 3, "reps": 10 }, + { "exercise": "Lat Pull Down", "weight": 70, "sets": 3, "reps": 10 }, + { "exercise": "Shoulder Press", "weight": 40, "sets": 3, "reps": 10 }, + { "exercise": "Chest Press", "weight": 50, "sets": 3, "reps": 10 }, + { "exercise": "Leg Press", "weight": 120, "sets": 3, "reps": 10 }, + { "exercise": "Leg Curl", "weight": 55, "sets": 3, "reps": 10 }, + { "exercise": "Calfs", "weight": 70, "sets": 3, "reps": 15 }, + { "exercise": "Abdominal", "weight": 50, "sets": 3, "reps": 15 }, + { "exercise": "Rotary", "weight": 40, "sets": 3, "reps": 12 } + ] + } +]