react-native-nitro-pose-exercises 1.0.8 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/NitroPoseExercises.podspec +2 -1
- package/README.md +137 -92
- package/android/build.gradle +9 -10
- package/android/src/main/java/com/margelo/nitro/nitroposeexercises/NitroPoseExercises.kt +148 -125
- package/ios/NitroPoseExercises.swift +113 -88
- package/lib/module/config/bicep-curl.js +61 -0
- package/lib/module/config/bicep-curl.js.map +1 -0
- package/lib/module/config/chair-pose.js +64 -0
- package/lib/module/config/chair-pose.js.map +1 -0
- package/lib/module/config/cobra-pose.js +57 -0
- package/lib/module/config/cobra-pose.js.map +1 -0
- package/lib/module/config/downward-dog.js +65 -0
- package/lib/module/config/downward-dog.js.map +1 -0
- package/lib/module/config/lunge.js +62 -0
- package/lib/module/config/lunge.js.map +1 -0
- package/lib/module/config/plank.js +57 -0
- package/lib/module/config/plank.js.map +1 -0
- package/lib/module/config/shoulder-press.js +62 -0
- package/lib/module/config/shoulder-press.js.map +1 -0
- package/lib/module/config/situp.js +48 -0
- package/lib/module/config/situp.js.map +1 -0
- package/lib/module/config/squat.js +69 -0
- package/lib/module/config/squat.js.map +1 -0
- package/lib/module/config/tree-pose.js +57 -0
- package/lib/module/config/tree-pose.js.map +1 -0
- package/lib/module/config/tricep-dip.js +55 -0
- package/lib/module/config/tricep-dip.js.map +1 -0
- package/lib/module/config/wall-sit.js +57 -0
- package/lib/module/config/wall-sit.js.map +1 -0
- package/lib/module/config/warrior-i.js +79 -0
- package/lib/module/config/warrior-i.js.map +1 -0
- package/lib/module/config/warrior-ii.js +86 -0
- package/lib/module/config/warrior-ii.js.map +1 -0
- package/lib/module/index.js +19 -0
- package/lib/module/index.js.map +1 -1
- package/lib/typescript/src/config/bicep-curl.d.ts +3 -0
- package/lib/typescript/src/config/bicep-curl.d.ts.map +1 -0
- package/lib/typescript/src/config/chair-pose.d.ts +3 -0
- package/lib/typescript/src/config/chair-pose.d.ts.map +1 -0
- package/lib/typescript/src/config/cobra-pose.d.ts +3 -0
- package/lib/typescript/src/config/cobra-pose.d.ts.map +1 -0
- package/lib/typescript/src/config/downward-dog.d.ts +3 -0
- package/lib/typescript/src/config/downward-dog.d.ts.map +1 -0
- package/lib/typescript/src/config/lunge.d.ts +3 -0
- package/lib/typescript/src/config/lunge.d.ts.map +1 -0
- package/lib/typescript/src/config/plank.d.ts +3 -0
- package/lib/typescript/src/config/plank.d.ts.map +1 -0
- package/lib/typescript/src/config/shoulder-press.d.ts +3 -0
- package/lib/typescript/src/config/shoulder-press.d.ts.map +1 -0
- package/lib/typescript/src/config/situp.d.ts +3 -0
- package/lib/typescript/src/config/situp.d.ts.map +1 -0
- package/lib/typescript/src/config/squat.d.ts +3 -0
- package/lib/typescript/src/config/squat.d.ts.map +1 -0
- package/lib/typescript/src/config/tree-pose.d.ts +3 -0
- package/lib/typescript/src/config/tree-pose.d.ts.map +1 -0
- package/lib/typescript/src/config/tricep-dip.d.ts +3 -0
- package/lib/typescript/src/config/tricep-dip.d.ts.map +1 -0
- package/lib/typescript/src/config/wall-sit.d.ts +3 -0
- package/lib/typescript/src/config/wall-sit.d.ts.map +1 -0
- package/lib/typescript/src/config/warrior-i.d.ts +3 -0
- package/lib/typescript/src/config/warrior-i.d.ts.map +1 -0
- package/lib/typescript/src/config/warrior-ii.d.ts +3 -0
- package/lib/typescript/src/config/warrior-ii.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +14 -0
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/nitro.json +8 -1
- package/package.json +10 -10
- package/src/config/bicep-curl.ts +64 -0
- package/src/config/chair-pose.ts +67 -0
- package/src/config/cobra-pose.ts +59 -0
- package/src/config/downward-dog.ts +68 -0
- package/src/config/lunge.ts +65 -0
- package/src/config/plank.ts +59 -0
- package/src/config/shoulder-press.ts +63 -0
- package/src/config/situp.ts +51 -0
- package/src/config/squat.ts +71 -0
- package/src/config/tree-pose.ts +59 -0
- package/src/config/tricep-dip.ts +58 -0
- package/src/config/wall-sit.ts +59 -0
- package/src/config/warrior-i.ts +82 -0
- package/src/config/warrior-ii.ts +88 -0
- package/src/index.tsx +19 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chair-pose.d.ts","sourceRoot":"","sources":["../../../../src/config/chair-pose.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAOlE,eAAO,MAAM,iBAAiB,EAAE,cA2D/B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cobra-pose.d.ts","sourceRoot":"","sources":["../../../../src/config/cobra-pose.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAOlE,eAAO,MAAM,iBAAiB,EAAE,cAmD/B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"downward-dog.d.ts","sourceRoot":"","sources":["../../../../src/config/downward-dog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAQlE,eAAO,MAAM,mBAAmB,EAAE,cA2DjC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lunge.d.ts","sourceRoot":"","sources":["../../../../src/config/lunge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAOlE,eAAO,MAAM,YAAY,EAAE,cAyD1B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plank.d.ts","sourceRoot":"","sources":["../../../../src/config/plank.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAOlE,eAAO,MAAM,YAAY,EAAE,cAmD1B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shoulder-press.d.ts","sourceRoot":"","sources":["../../../../src/config/shoulder-press.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAOlE,eAAO,MAAM,qBAAqB,EAAE,cAuDnC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"situp.d.ts","sourceRoot":"","sources":["../../../../src/config/situp.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAOlE,eAAO,MAAM,YAAY,EAAE,cA2C1B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"squat.d.ts","sourceRoot":"","sources":["../../../../src/config/squat.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAOlE,eAAO,MAAM,YAAY,EAAE,cA+D1B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tree-pose.d.ts","sourceRoot":"","sources":["../../../../src/config/tree-pose.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAOlE,eAAO,MAAM,gBAAgB,EAAE,cAmD9B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tricep-dip.d.ts","sourceRoot":"","sources":["../../../../src/config/tricep-dip.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAOlE,eAAO,MAAM,iBAAiB,EAAE,cAkD/B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wall-sit.d.ts","sourceRoot":"","sources":["../../../../src/config/wall-sit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAOlE,eAAO,MAAM,eAAe,EAAE,cAmD7B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"warrior-i.d.ts","sourceRoot":"","sources":["../../../../src/config/warrior-i.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAQlE,eAAO,MAAM,gBAAgB,EAAE,cAyE9B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"warrior-ii.d.ts","sourceRoot":"","sources":["../../../../src/config/warrior-ii.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAQlE,eAAO,MAAM,iBAAiB,EAAE,cA+E/B,CAAC"}
|
|
@@ -3,4 +3,18 @@ declare const nitroPoseExercises: NitroPoseExercises;
|
|
|
3
3
|
export { nitroPoseExercises };
|
|
4
4
|
export type { NitroPoseExercises, ExerciseConfig, ExerciseType, ExercisePhase, FormSeverity, SessionStatus, Landmark, AngleDefinition, PhaseThreshold, FormRule, RepData, AngleSnapshot, FormFeedback, HoldProgress, SessionResult, } from './NitroPoseExercises.nitro';
|
|
5
5
|
export { PUSHUP_CONFIG } from './config/pushup';
|
|
6
|
+
export { SQUAT_CONFIG } from './config/squat';
|
|
7
|
+
export { BICEP_CURL_CONFIG } from './config/bicep-curl';
|
|
8
|
+
export { SHOULDER_PRESS_CONFIG } from './config/shoulder-press';
|
|
9
|
+
export { LUNGE_CONFIG } from './config/lunge';
|
|
10
|
+
export { SITUP_CONFIG } from './config/situp';
|
|
11
|
+
export { TRICEP_DIP_CONFIG } from './config/tricep-dip';
|
|
12
|
+
export { PLANK_CONFIG } from './config/plank';
|
|
13
|
+
export { WALL_SIT_CONFIG } from './config/wall-sit';
|
|
14
|
+
export { TREE_POSE_CONFIG } from './config/tree-pose';
|
|
15
|
+
export { WARRIOR_I_CONFIG } from './config/warrior-i';
|
|
16
|
+
export { WARRIOR_II_CONFIG } from './config/warrior-ii';
|
|
17
|
+
export { DOWNWARD_DOG_CONFIG } from './config/downward-dog';
|
|
18
|
+
export { CHAIR_POSE_CONFIG } from './config/chair-pose';
|
|
19
|
+
export { COBRA_POSE_CONFIG } from './config/cobra-pose';
|
|
6
20
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAErE,QAAA,MAAM,kBAAkB,oBACmD,CAAC;AAE5E,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAE9B,YAAY,EACV,kBAAkB,EAClB,cAAc,EACd,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,aAAa,EACb,QAAQ,EACR,eAAe,EACf,cAAc,EACd,QAAQ,EACR,OAAO,EACP,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,aAAa,GACd,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAErE,QAAA,MAAM,kBAAkB,oBACmD,CAAC;AAE5E,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAE9B,YAAY,EACV,kBAAkB,EAClB,cAAc,EACd,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,aAAa,EACb,QAAQ,EACR,eAAe,EACf,cAAc,EACd,QAAQ,EACR,OAAO,EACP,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,aAAa,GACd,MAAM,4BAA4B,CAAC;AAGpC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAGxD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC"}
|
package/nitro.json
CHANGED
|
@@ -19,5 +19,12 @@
|
|
|
19
19
|
}
|
|
20
20
|
}
|
|
21
21
|
},
|
|
22
|
-
"ignorePaths": [
|
|
22
|
+
"ignorePaths": [
|
|
23
|
+
"node_modules",
|
|
24
|
+
"example",
|
|
25
|
+
"nitrogen/generated/android/kotlin/com/margelo/nitro/camera",
|
|
26
|
+
"nitrogen/generated/android/kotlin/com/margelo/nitro/image",
|
|
27
|
+
"nitrogen/generated/ios/swift/VisionCamera",
|
|
28
|
+
"nitrogen/generated/ios/swift/NitroImage"
|
|
29
|
+
]
|
|
23
30
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-native-nitro-pose-exercises",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.1",
|
|
4
4
|
"description": "Real-time on-device exercise tracking for React Native. Rep counting, form validation, and skeleton overlay powered by MediaPipe Pose Landmarker and VisionCamera v5 via Nitro Modules.",
|
|
5
5
|
"main": "./lib/module/index.js",
|
|
6
6
|
"types": "./lib/typescript/src/index.d.ts",
|
|
@@ -69,9 +69,9 @@
|
|
|
69
69
|
"@eslint/eslintrc": "^3.3.1",
|
|
70
70
|
"@eslint/js": "^9.35.0",
|
|
71
71
|
"@jest/globals": "^30.0.0",
|
|
72
|
-
"@react-native/babel-preset": "0.85.
|
|
73
|
-
"@react-native/eslint-config": "0.85.
|
|
74
|
-
"@react-native/jest-preset": "0.85.
|
|
72
|
+
"@react-native/babel-preset": "0.85.3",
|
|
73
|
+
"@react-native/eslint-config": "0.85.3",
|
|
74
|
+
"@react-native/jest-preset": "0.85.3",
|
|
75
75
|
"@release-it/conventional-changelog": "^10.0.6",
|
|
76
76
|
"@types/react": "^19.2.0",
|
|
77
77
|
"commitlint": "^20.5.0",
|
|
@@ -82,16 +82,16 @@
|
|
|
82
82
|
"eslint-plugin-prettier": "^5.5.4",
|
|
83
83
|
"jest": "^30.3.0",
|
|
84
84
|
"lefthook": "^2.1.4",
|
|
85
|
-
"nitrogen": "^0.35.
|
|
85
|
+
"nitrogen": "^0.35.9",
|
|
86
86
|
"prettier": "^3.8.1",
|
|
87
87
|
"react": "19.2.3",
|
|
88
|
-
"react-native": "0.85.
|
|
88
|
+
"react-native": "0.85.3",
|
|
89
89
|
"react-native-builder-bob": "^0.41.0",
|
|
90
|
-
"react-native-nitro-modules": "^0.35.
|
|
90
|
+
"react-native-nitro-modules": "^0.35.9",
|
|
91
91
|
"react-native-svg": "^15.15.5",
|
|
92
|
-
"react-native-vision-camera": "^5.0.
|
|
93
|
-
"react-native-vision-camera-worklets": "^5.0.
|
|
94
|
-
"react-native-worklets": "^0.
|
|
92
|
+
"react-native-vision-camera": "^5.0.11",
|
|
93
|
+
"react-native-vision-camera-worklets": "^5.0.11",
|
|
94
|
+
"react-native-worklets": "^0.9.1",
|
|
95
95
|
"release-it": "^19.2.4",
|
|
96
96
|
"turbo": "^2.8.21",
|
|
97
97
|
"typescript": "^6.0.2"
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import type { ExerciseConfig } from '../NitroPoseExercises.nitro';
|
|
2
|
+
|
|
3
|
+
// MediaPipe Pose Landmark indices
|
|
4
|
+
// 11 = left shoulder, 13 = left elbow, 15 = left wrist
|
|
5
|
+
// 12 = right shoulder, 14 = right elbow, 16 = right wrist
|
|
6
|
+
|
|
7
|
+
export const BICEP_CURL_CONFIG: ExerciseConfig = {
|
|
8
|
+
name: 'Bicep Curl',
|
|
9
|
+
type: 'rep',
|
|
10
|
+
angles: [
|
|
11
|
+
{
|
|
12
|
+
name: 'leftElbow',
|
|
13
|
+
landmarkA: 11, // left shoulder
|
|
14
|
+
landmarkB: 13, // left elbow (vertex)
|
|
15
|
+
landmarkC: 15, // left wrist
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
name: 'rightElbow',
|
|
19
|
+
landmarkA: 12, // right shoulder
|
|
20
|
+
landmarkB: 14, // right elbow (vertex)
|
|
21
|
+
landmarkC: 16, // right wrist
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
name: 'leftShoulder',
|
|
25
|
+
landmarkA: 23, // left hip
|
|
26
|
+
landmarkB: 11, // left shoulder (vertex)
|
|
27
|
+
landmarkC: 13, // left elbow
|
|
28
|
+
},
|
|
29
|
+
],
|
|
30
|
+
phases: [
|
|
31
|
+
{
|
|
32
|
+
phase: 'down',
|
|
33
|
+
angleName: 'leftElbow',
|
|
34
|
+
minAngle: 150,
|
|
35
|
+
maxAngle: 180,
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
phase: 'up',
|
|
39
|
+
angleName: 'leftElbow',
|
|
40
|
+
minAngle: 25,
|
|
41
|
+
maxAngle: 70,
|
|
42
|
+
},
|
|
43
|
+
],
|
|
44
|
+
repSequence: ['down', 'up', 'down'],
|
|
45
|
+
formRules: [
|
|
46
|
+
{
|
|
47
|
+
name: 'elbowFlare',
|
|
48
|
+
message: 'Keep your elbows pinned to your sides',
|
|
49
|
+
severity: 'warning',
|
|
50
|
+
angleName: 'leftShoulder',
|
|
51
|
+
minAngle: 0,
|
|
52
|
+
maxAngle: 30,
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
name: 'swinging',
|
|
56
|
+
message: "Don't swing — control the movement",
|
|
57
|
+
severity: 'error',
|
|
58
|
+
angleName: 'leftShoulder',
|
|
59
|
+
minAngle: 0,
|
|
60
|
+
maxAngle: 45,
|
|
61
|
+
},
|
|
62
|
+
],
|
|
63
|
+
holdDurationMs: 0,
|
|
64
|
+
};
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import type { ExerciseConfig } from '../NitroPoseExercises.nitro';
|
|
2
|
+
|
|
3
|
+
// MediaPipe Pose Landmark indices
|
|
4
|
+
// 11 = left shoulder, 13 = left elbow, 15 = left wrist
|
|
5
|
+
// 23 = left hip, 25 = left knee, 27 = left ankle
|
|
6
|
+
// 12 = right shoulder, 24 = right hip
|
|
7
|
+
|
|
8
|
+
export const CHAIR_POSE_CONFIG: ExerciseConfig = {
|
|
9
|
+
name: 'Chair Pose (Utkatasana)',
|
|
10
|
+
type: 'hold',
|
|
11
|
+
angles: [
|
|
12
|
+
{
|
|
13
|
+
name: 'leftKnee',
|
|
14
|
+
landmarkA: 23, // left hip
|
|
15
|
+
landmarkB: 25, // left knee (vertex)
|
|
16
|
+
landmarkC: 27, // left ankle
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
name: 'leftHip',
|
|
20
|
+
landmarkA: 11, // left shoulder
|
|
21
|
+
landmarkB: 23, // left hip (vertex)
|
|
22
|
+
landmarkC: 25, // left knee
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
name: 'leftArm',
|
|
26
|
+
landmarkA: 11, // left shoulder
|
|
27
|
+
landmarkB: 13, // left elbow (vertex)
|
|
28
|
+
landmarkC: 15, // left wrist
|
|
29
|
+
},
|
|
30
|
+
],
|
|
31
|
+
phases: [
|
|
32
|
+
{
|
|
33
|
+
phase: 'hold',
|
|
34
|
+
angleName: 'leftKnee',
|
|
35
|
+
minAngle: 90,
|
|
36
|
+
maxAngle: 130,
|
|
37
|
+
},
|
|
38
|
+
],
|
|
39
|
+
repSequence: [],
|
|
40
|
+
formRules: [
|
|
41
|
+
{
|
|
42
|
+
name: 'kneesTooStraight',
|
|
43
|
+
message: 'Sit deeper — bend your knees more',
|
|
44
|
+
severity: 'warning',
|
|
45
|
+
angleName: 'leftKnee',
|
|
46
|
+
minAngle: 90,
|
|
47
|
+
maxAngle: 130,
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
name: 'leaningForward',
|
|
51
|
+
message: "Keep your chest lifted — don't lean too far forward",
|
|
52
|
+
severity: 'warning',
|
|
53
|
+
angleName: 'leftHip',
|
|
54
|
+
minAngle: 70,
|
|
55
|
+
maxAngle: 130,
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
name: 'armsNotUp',
|
|
59
|
+
message: 'Reach your arms up overhead',
|
|
60
|
+
severity: 'info',
|
|
61
|
+
angleName: 'leftArm',
|
|
62
|
+
minAngle: 160,
|
|
63
|
+
maxAngle: 180,
|
|
64
|
+
},
|
|
65
|
+
],
|
|
66
|
+
holdDurationMs: 30000, // 30 seconds
|
|
67
|
+
};
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { ExerciseConfig } from '../NitroPoseExercises.nitro';
|
|
2
|
+
|
|
3
|
+
// MediaPipe Pose Landmark indices
|
|
4
|
+
// 11 = left shoulder, 13 = left elbow, 15 = left wrist
|
|
5
|
+
// 12 = right shoulder, 14 = right elbow, 16 = right wrist
|
|
6
|
+
// 23 = left hip, 25 = left knee, 27 = left ankle
|
|
7
|
+
|
|
8
|
+
export const COBRA_POSE_CONFIG: ExerciseConfig = {
|
|
9
|
+
name: 'Cobra Pose (Bhujangasana)',
|
|
10
|
+
type: 'hold',
|
|
11
|
+
angles: [
|
|
12
|
+
{
|
|
13
|
+
name: 'leftElbow',
|
|
14
|
+
landmarkA: 11, // left shoulder
|
|
15
|
+
landmarkB: 13, // left elbow (vertex)
|
|
16
|
+
landmarkC: 15, // left wrist
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
name: 'hipExtension',
|
|
20
|
+
landmarkA: 11, // left shoulder
|
|
21
|
+
landmarkB: 23, // left hip (vertex)
|
|
22
|
+
landmarkC: 25, // left knee
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
name: 'legStraight',
|
|
26
|
+
landmarkA: 23, // left hip
|
|
27
|
+
landmarkB: 25, // left knee (vertex)
|
|
28
|
+
landmarkC: 27, // left ankle
|
|
29
|
+
},
|
|
30
|
+
],
|
|
31
|
+
phases: [
|
|
32
|
+
{
|
|
33
|
+
phase: 'hold',
|
|
34
|
+
angleName: 'hipExtension',
|
|
35
|
+
minAngle: 120,
|
|
36
|
+
maxAngle: 170,
|
|
37
|
+
},
|
|
38
|
+
],
|
|
39
|
+
repSequence: [],
|
|
40
|
+
formRules: [
|
|
41
|
+
{
|
|
42
|
+
name: 'shouldersTensed',
|
|
43
|
+
message: 'Relax your shoulders away from your ears',
|
|
44
|
+
severity: 'info',
|
|
45
|
+
angleName: 'leftElbow',
|
|
46
|
+
minAngle: 140,
|
|
47
|
+
maxAngle: 180,
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
name: 'legsBending',
|
|
51
|
+
message: 'Keep your legs straight and pressed into the floor',
|
|
52
|
+
severity: 'warning',
|
|
53
|
+
angleName: 'legStraight',
|
|
54
|
+
minAngle: 160,
|
|
55
|
+
maxAngle: 180,
|
|
56
|
+
},
|
|
57
|
+
],
|
|
58
|
+
holdDurationMs: 30000, // 30 seconds
|
|
59
|
+
};
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type { ExerciseConfig } from '../NitroPoseExercises.nitro';
|
|
2
|
+
|
|
3
|
+
// MediaPipe Pose Landmark indices
|
|
4
|
+
// 11 = left shoulder, 13 = left elbow, 15 = left wrist
|
|
5
|
+
// 12 = right shoulder, 14 = right elbow, 16 = right wrist
|
|
6
|
+
// 23 = left hip, 25 = left knee, 27 = left ankle
|
|
7
|
+
// 24 = right hip, 26 = right knee, 28 = right ankle
|
|
8
|
+
|
|
9
|
+
export const DOWNWARD_DOG_CONFIG: ExerciseConfig = {
|
|
10
|
+
name: 'Downward Dog (Adho Mukha Svanasana)',
|
|
11
|
+
type: 'hold',
|
|
12
|
+
angles: [
|
|
13
|
+
{
|
|
14
|
+
name: 'hipAngle',
|
|
15
|
+
landmarkA: 11, // left shoulder
|
|
16
|
+
landmarkB: 23, // left hip (vertex)
|
|
17
|
+
landmarkC: 27, // left ankle
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
name: 'leftArm',
|
|
21
|
+
landmarkA: 11, // left shoulder
|
|
22
|
+
landmarkB: 13, // left elbow (vertex)
|
|
23
|
+
landmarkC: 15, // left wrist
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
name: 'leftLeg',
|
|
27
|
+
landmarkA: 23, // left hip
|
|
28
|
+
landmarkB: 25, // left knee (vertex)
|
|
29
|
+
landmarkC: 27, // left ankle
|
|
30
|
+
},
|
|
31
|
+
],
|
|
32
|
+
phases: [
|
|
33
|
+
{
|
|
34
|
+
phase: 'hold',
|
|
35
|
+
angleName: 'hipAngle',
|
|
36
|
+
minAngle: 55,
|
|
37
|
+
maxAngle: 100,
|
|
38
|
+
},
|
|
39
|
+
],
|
|
40
|
+
repSequence: [],
|
|
41
|
+
formRules: [
|
|
42
|
+
{
|
|
43
|
+
name: 'armsBent',
|
|
44
|
+
message: 'Straighten your arms — push the floor away',
|
|
45
|
+
severity: 'warning',
|
|
46
|
+
angleName: 'leftArm',
|
|
47
|
+
minAngle: 160,
|
|
48
|
+
maxAngle: 180,
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
name: 'legsBent',
|
|
52
|
+
message: 'Straighten your legs — press your heels toward the ground',
|
|
53
|
+
severity: 'info',
|
|
54
|
+
angleName: 'leftLeg',
|
|
55
|
+
minAngle: 155,
|
|
56
|
+
maxAngle: 180,
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
name: 'hipsTooLow',
|
|
60
|
+
message: 'Push your hips up higher toward the ceiling',
|
|
61
|
+
severity: 'warning',
|
|
62
|
+
angleName: 'hipAngle',
|
|
63
|
+
minAngle: 55,
|
|
64
|
+
maxAngle: 100,
|
|
65
|
+
},
|
|
66
|
+
],
|
|
67
|
+
holdDurationMs: 30000, // 30 seconds
|
|
68
|
+
};
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { ExerciseConfig } from '../NitroPoseExercises.nitro';
|
|
2
|
+
|
|
3
|
+
// MediaPipe Pose Landmark indices
|
|
4
|
+
// 23 = left hip, 25 = left knee, 27 = left ankle
|
|
5
|
+
// 24 = right hip, 26 = right knee, 28 = right ankle
|
|
6
|
+
// 11 = left shoulder, 12 = right shoulder
|
|
7
|
+
|
|
8
|
+
export const LUNGE_CONFIG: ExerciseConfig = {
|
|
9
|
+
name: 'Lunge',
|
|
10
|
+
type: 'rep',
|
|
11
|
+
angles: [
|
|
12
|
+
{
|
|
13
|
+
name: 'frontKnee',
|
|
14
|
+
landmarkA: 23, // left hip
|
|
15
|
+
landmarkB: 25, // left knee (vertex)
|
|
16
|
+
landmarkC: 27, // left ankle
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
name: 'backKnee',
|
|
20
|
+
landmarkA: 24, // right hip
|
|
21
|
+
landmarkB: 26, // right knee (vertex)
|
|
22
|
+
landmarkC: 28, // right ankle
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
name: 'torsoAngle',
|
|
26
|
+
landmarkA: 11, // left shoulder
|
|
27
|
+
landmarkB: 23, // left hip (vertex)
|
|
28
|
+
landmarkC: 25, // left knee
|
|
29
|
+
},
|
|
30
|
+
],
|
|
31
|
+
phases: [
|
|
32
|
+
{
|
|
33
|
+
phase: 'up',
|
|
34
|
+
angleName: 'frontKnee',
|
|
35
|
+
minAngle: 155,
|
|
36
|
+
maxAngle: 180,
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
phase: 'down',
|
|
40
|
+
angleName: 'frontKnee',
|
|
41
|
+
minAngle: 70,
|
|
42
|
+
maxAngle: 110,
|
|
43
|
+
},
|
|
44
|
+
],
|
|
45
|
+
repSequence: ['up', 'down', 'up'],
|
|
46
|
+
formRules: [
|
|
47
|
+
{
|
|
48
|
+
name: 'kneeOverToe',
|
|
49
|
+
message: "Don't let your front knee go past your toes",
|
|
50
|
+
severity: 'warning',
|
|
51
|
+
angleName: 'frontKnee',
|
|
52
|
+
minAngle: 75,
|
|
53
|
+
maxAngle: 180,
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
name: 'torsoLean',
|
|
57
|
+
message: 'Keep your torso upright',
|
|
58
|
+
severity: 'warning',
|
|
59
|
+
angleName: 'torsoAngle',
|
|
60
|
+
minAngle: 75,
|
|
61
|
+
maxAngle: 180,
|
|
62
|
+
},
|
|
63
|
+
],
|
|
64
|
+
holdDurationMs: 0,
|
|
65
|
+
};
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { ExerciseConfig } from '../NitroPoseExercises.nitro';
|
|
2
|
+
|
|
3
|
+
// MediaPipe Pose Landmark indices
|
|
4
|
+
// 11 = left shoulder, 13 = left elbow, 15 = left wrist
|
|
5
|
+
// 23 = left hip, 27 = left ankle
|
|
6
|
+
// 12 = right shoulder, 24 = right hip, 28 = right ankle
|
|
7
|
+
|
|
8
|
+
export const PLANK_CONFIG: ExerciseConfig = {
|
|
9
|
+
name: 'Plank',
|
|
10
|
+
type: 'hold',
|
|
11
|
+
angles: [
|
|
12
|
+
{
|
|
13
|
+
name: 'leftHip',
|
|
14
|
+
landmarkA: 11, // left shoulder
|
|
15
|
+
landmarkB: 23, // left hip (vertex)
|
|
16
|
+
landmarkC: 27, // left ankle
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
name: 'rightHip',
|
|
20
|
+
landmarkA: 12, // right shoulder
|
|
21
|
+
landmarkB: 24, // right hip (vertex)
|
|
22
|
+
landmarkC: 28, // right ankle
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
name: 'leftElbow',
|
|
26
|
+
landmarkA: 11, // left shoulder
|
|
27
|
+
landmarkB: 13, // left elbow (vertex)
|
|
28
|
+
landmarkC: 15, // left wrist
|
|
29
|
+
},
|
|
30
|
+
],
|
|
31
|
+
phases: [
|
|
32
|
+
{
|
|
33
|
+
phase: 'hold',
|
|
34
|
+
angleName: 'leftHip',
|
|
35
|
+
minAngle: 155,
|
|
36
|
+
maxAngle: 180,
|
|
37
|
+
},
|
|
38
|
+
],
|
|
39
|
+
repSequence: [],
|
|
40
|
+
formRules: [
|
|
41
|
+
{
|
|
42
|
+
name: 'hipSag',
|
|
43
|
+
message: 'Hips are dropping — tighten your core',
|
|
44
|
+
severity: 'warning',
|
|
45
|
+
angleName: 'leftHip',
|
|
46
|
+
minAngle: 155,
|
|
47
|
+
maxAngle: 180,
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
name: 'hipPike',
|
|
51
|
+
message: "Lower your hips — you're piking up",
|
|
52
|
+
severity: 'warning',
|
|
53
|
+
angleName: 'leftHip',
|
|
54
|
+
minAngle: 155,
|
|
55
|
+
maxAngle: 180,
|
|
56
|
+
},
|
|
57
|
+
],
|
|
58
|
+
holdDurationMs: 60000, // 60 seconds default
|
|
59
|
+
};
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { ExerciseConfig } from '../NitroPoseExercises.nitro';
|
|
2
|
+
|
|
3
|
+
// MediaPipe Pose Landmark indices
|
|
4
|
+
// 11 = left shoulder, 13 = left elbow, 15 = left wrist
|
|
5
|
+
// 12 = right shoulder, 14 = right elbow, 16 = right wrist
|
|
6
|
+
// 23 = left hip
|
|
7
|
+
|
|
8
|
+
export const SHOULDER_PRESS_CONFIG: ExerciseConfig = {
|
|
9
|
+
name: 'Shoulder Press',
|
|
10
|
+
type: 'rep',
|
|
11
|
+
angles: [
|
|
12
|
+
{
|
|
13
|
+
name: 'leftElbow',
|
|
14
|
+
landmarkA: 11, // left shoulder
|
|
15
|
+
landmarkB: 13, // left elbow (vertex)
|
|
16
|
+
landmarkC: 15, // left wrist
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
name: 'rightElbow',
|
|
20
|
+
landmarkA: 12, // right shoulder
|
|
21
|
+
landmarkB: 14, // right elbow (vertex)
|
|
22
|
+
landmarkC: 16, // right wrist
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
name: 'leftShoulderAngle',
|
|
26
|
+
landmarkA: 23, // left hip
|
|
27
|
+
landmarkB: 11, // left shoulder (vertex)
|
|
28
|
+
landmarkC: 13, // left elbow
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
name: 'rightShoulderAngle',
|
|
32
|
+
landmarkA: 24, // right hip
|
|
33
|
+
landmarkB: 12, // right shoulder (vertex)
|
|
34
|
+
landmarkC: 14, // right elbow
|
|
35
|
+
},
|
|
36
|
+
],
|
|
37
|
+
phases: [
|
|
38
|
+
{
|
|
39
|
+
phase: 'up',
|
|
40
|
+
angleName: 'leftElbow',
|
|
41
|
+
minAngle: 155,
|
|
42
|
+
maxAngle: 180,
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
phase: 'down',
|
|
46
|
+
angleName: 'leftElbow',
|
|
47
|
+
minAngle: 60,
|
|
48
|
+
maxAngle: 100,
|
|
49
|
+
},
|
|
50
|
+
],
|
|
51
|
+
repSequence: ['down', 'up', 'down'],
|
|
52
|
+
formRules: [
|
|
53
|
+
{
|
|
54
|
+
name: 'backArch',
|
|
55
|
+
message: "Keep your core tight — don't arch your back",
|
|
56
|
+
severity: 'warning',
|
|
57
|
+
angleName: 'leftShoulderAngle',
|
|
58
|
+
minAngle: 80,
|
|
59
|
+
maxAngle: 180,
|
|
60
|
+
},
|
|
61
|
+
],
|
|
62
|
+
holdDurationMs: 0,
|
|
63
|
+
};
|