Add the exercise reference library, animated exercise figures, and exercise categories

Exercise Library/ holds per-exercise reference docs (setup, cues,
mistakes, progressions) with SVG visuals and a Python-rendered motion
pipeline; Workouts/ExerciseFigure renders the bundled *.motion.json
rigs as animated stick figures on the exercise screen. Exercises gain
a warm-up/main-circuit category, timed exercises display hold time via
planSummary, and a completed exercise reopens to a check screen instead
of its timers.
This commit is contained in:
2026-07-06 01:15:52 -04:00
parent ddd5631ef2
commit 7274f155e9
79 changed files with 2521 additions and 11 deletions
@@ -0,0 +1,23 @@
{
"name": "Bird Dog",
"primary": 2,
"working": ["arm_r", "leg_l"],
"frames": [
{
"hold": 0.5, "tween": 0.8,
"root": [190, 106],
"spine": [171, 171], "neck": 187, "gaze": 205,
"arm_r": [-90, -90], "arm_l": [-90, -90],
"leg_r": [-83, 0], "leg_l": [-83, 0],
"pins": {"hand_r": [105, 152], "hand_l": [111, 154]}
},
{
"hold": 1.4, "tween": 0.8,
"root": [190, 106],
"spine": [171, 171], "neck": 187, "gaze": 195,
"arm_r": [161, 161], "arm_l": [-90, -90],
"leg_r": [-83, 0], "leg_l": [15, 15],
"pins": {"hand_l": [111, 154]}
}
]
}
@@ -0,0 +1,23 @@
{
"name": "Cat-Cow",
"primary": 1,
"working": ["spine"],
"frames": [
{
"hold": 0.8, "tween": 0.9,
"root": [190, 106],
"spine": [188, 155], "neck": 185, "gaze": 164,
"arm_r": [-90, -90], "arm_l": [-90, -90],
"leg_r": [-83, 0], "leg_l": [-83, 0],
"pins": {"hand_r": [105, 152], "hand_l": [111, 154]}
},
{
"hold": 0.8, "tween": 0.9,
"root": [190, 106],
"spine": [155, 192], "neck": 215, "gaze": 225,
"arm_r": [-90, -90], "arm_l": [-90, -90],
"leg_r": [-83, 0], "leg_l": [-83, 0],
"pins": {"hand_r": [105, 152], "hand_l": [111, 154]}
}
]
}
@@ -0,0 +1,21 @@
{
"name": "Dead Bug",
"primary": 2,
"working": ["arm_r", "leg_l"],
"frames": [
{
"hold": 0.5, "tween": 0.8,
"root": [185, 148],
"spine": [180, 180], "neck": 168, "gaze": 90,
"arm_r": [90, 90], "arm_l": [90, 90],
"leg_r": [64, -10], "leg_l": [64, -10]
},
{
"hold": 0.9, "tween": 0.8,
"root": [185, 148],
"spine": [180, 180], "neck": 168, "gaze": 90,
"arm_r": [135, 135], "arm_l": [90, 90],
"leg_r": [64, -10], "leg_l": [16, 16]
}
]
}
@@ -0,0 +1,22 @@
{
"name": "Hollow Body Hold",
"primary": 2,
"working": ["spine"],
"hide": ["arm_l"],
"frames": [
{
"hold": 0.4, "tween": 0.8,
"root": [185, 148],
"spine": [180, 180], "neck": 168, "gaze": 90,
"arm_r": [180, 180],
"leg_r": [0, 0], "leg_l": [0, 0]
},
{
"hold": 1.8, "tween": 0.8,
"root": [185, 148],
"spine": [174, 160], "neck": 140, "gaze": 50,
"arm_r": [155, 155],
"leg_r": [12, 12], "leg_l": [12, 12]
}
]
}
@@ -0,0 +1,22 @@
{
"name": "Leg Raises",
"primary": 1,
"working": ["leg_r", "leg_l"],
"hide": ["arm_r"],
"frames": [
{
"hold": 0.5, "tween": 1.4,
"root": [185, 148],
"spine": [180, 180], "neck": 168, "gaze": 90,
"arm_l": [-2, -2],
"leg_r": [60, 60], "leg_l": [60, 60]
},
{
"hold": 0.3, "tween": 0.6,
"root": [185, 148],
"spine": [180, 180], "neck": 168, "gaze": 90,
"arm_l": [-2, -2],
"leg_r": [8, 8], "leg_l": [8, 8]
}
]
}
@@ -0,0 +1,21 @@
{
"name": "Plank",
"primary": 2,
"working": ["spine"],
"frames": [
{
"hold": 0.4, "tween": 0.7,
"root": [172, 114],
"spine": [185, 185], "neck": 185, "gaze": 210,
"arm_r": [-90, 180], "arm_l": [-90, 180],
"leg_r": [-55, 0], "leg_l": [-55, 0]
},
{
"hold": 1.8, "tween": 0.7,
"root": [168, 137],
"spine": [170, 170], "neck": 170, "gaze": 210,
"arm_r": [-90, 180], "arm_l": [-90, 180],
"leg_r": [-10, -10], "leg_l": [-10, -10]
}
]
}
@@ -0,0 +1,22 @@
{
"name": "Reverse Crunch",
"primary": 2,
"working": ["spine"],
"hide": ["arm_r"],
"frames": [
{
"hold": 0.5, "tween": 0.7,
"root": [172, 148],
"spine": [180, 180], "neck": 168, "gaze": 90,
"arm_l": [-2, -2],
"leg_r": [100, -20], "leg_l": [100, -20]
},
{
"hold": 0.8, "tween": 0.9,
"root": [166, 136],
"spine": [195, 175], "neck": 182, "gaze": 90,
"arm_l": [-2, -2],
"leg_r": [115, -10], "leg_l": [115, -10]
}
]
}
@@ -0,0 +1,23 @@
{
"name": "Side Plank",
"primary": 2,
"working": ["spine"],
"frames": [
{
"hold": 0.4, "tween": 0.8,
"root": [174, 150],
"spine": [162, 162], "neck": 162, "gaze": 175,
"arm_r": [-90, 180], "arm_l": [-20, -15],
"leg_r": [-1, -1], "leg_l": [-1, -1],
"pins": {"hand_r": [60, 152]}
},
{
"hold": 1.8, "tween": 0.8,
"root": [174, 137],
"spine": [170, 170], "neck": 170, "gaze": 180,
"arm_r": [-90, 180], "arm_l": [80, 80],
"leg_r": [-10, -10], "leg_l": [-10, -10],
"pins": {"hand_r": [60, 152]}
}
]
}
@@ -0,0 +1,24 @@
{
"neutral": {
"headR": 10,
"neck": 20,
"spine1": 43,
"spine2": 42,
"upperArm": 30,
"foreArm": 30,
"thigh": 46,
"shin": 40,
"leftOffset": [6, 2]
},
"female": {
"headR": 9,
"neck": 19,
"spine1": 40,
"spine2": 39,
"upperArm": 27,
"foreArm": 27,
"thigh": 47,
"shin": 41,
"leftOffset": [6, 2]
}
}