@franzenzenhofer/asanakit 0.1.0

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.
Files changed (174) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +153 -0
  3. package/dist/anatomy/muscles.d.ts +55 -0
  4. package/dist/anatomy/muscles.d.ts.map +1 -0
  5. package/dist/anatomy/muscles.js +79 -0
  6. package/dist/anatomy/muscles.js.map +1 -0
  7. package/dist/anatomy/validate.d.ts +11 -0
  8. package/dist/anatomy/validate.d.ts.map +1 -0
  9. package/dist/anatomy/validate.js +94 -0
  10. package/dist/anatomy/validate.js.map +1 -0
  11. package/dist/cli/commands/export.d.ts +3 -0
  12. package/dist/cli/commands/export.d.ts.map +1 -0
  13. package/dist/cli/commands/export.js +45 -0
  14. package/dist/cli/commands/export.js.map +1 -0
  15. package/dist/cli/commands/info.d.ts +3 -0
  16. package/dist/cli/commands/info.d.ts.map +1 -0
  17. package/dist/cli/commands/info.js +101 -0
  18. package/dist/cli/commands/info.js.map +1 -0
  19. package/dist/cli/commands/render.d.ts +3 -0
  20. package/dist/cli/commands/render.d.ts.map +1 -0
  21. package/dist/cli/commands/render.js +103 -0
  22. package/dist/cli/commands/render.js.map +1 -0
  23. package/dist/cli/index.d.ts +3 -0
  24. package/dist/cli/index.d.ts.map +1 -0
  25. package/dist/cli/index.js +31 -0
  26. package/dist/cli/index.js.map +1 -0
  27. package/dist/cli/resolve.d.ts +12 -0
  28. package/dist/cli/resolve.d.ts.map +1 -0
  29. package/dist/cli/resolve.js +46 -0
  30. package/dist/cli/resolve.js.map +1 -0
  31. package/dist/core/angles.d.ts +12 -0
  32. package/dist/core/angles.d.ts.map +1 -0
  33. package/dist/core/angles.js +27 -0
  34. package/dist/core/angles.js.map +1 -0
  35. package/dist/core/rig.d.ts +8 -0
  36. package/dist/core/rig.d.ts.map +1 -0
  37. package/dist/core/rig.js +97 -0
  38. package/dist/core/rig.js.map +1 -0
  39. package/dist/core/skeleton.d.ts +17 -0
  40. package/dist/core/skeleton.d.ts.map +1 -0
  41. package/dist/core/skeleton.js +144 -0
  42. package/dist/core/skeleton.js.map +1 -0
  43. package/dist/core/types.d.ts +105 -0
  44. package/dist/core/types.d.ts.map +1 -0
  45. package/dist/core/types.js +47 -0
  46. package/dist/core/types.js.map +1 -0
  47. package/dist/core/vec2.d.ts +19 -0
  48. package/dist/core/vec2.d.ts.map +1 -0
  49. package/dist/core/vec2.js +41 -0
  50. package/dist/core/vec2.js.map +1 -0
  51. package/dist/index.d.ts +11 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +11 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/library/index.d.ts +27 -0
  56. package/dist/library/index.d.ts.map +1 -0
  57. package/dist/library/index.js +75 -0
  58. package/dist/library/index.js.map +1 -0
  59. package/dist/model/index.d.ts +4 -0
  60. package/dist/model/index.d.ts.map +1 -0
  61. package/dist/model/index.js +4 -0
  62. package/dist/model/index.js.map +1 -0
  63. package/dist/model/parse.d.ts +12 -0
  64. package/dist/model/parse.d.ts.map +1 -0
  65. package/dist/model/parse.js +43 -0
  66. package/dist/model/parse.js.map +1 -0
  67. package/dist/model/pose.d.ts +11 -0
  68. package/dist/model/pose.d.ts.map +1 -0
  69. package/dist/model/pose.js +26 -0
  70. package/dist/model/pose.js.map +1 -0
  71. package/dist/model/schema.d.ts +1122 -0
  72. package/dist/model/schema.d.ts.map +1 -0
  73. package/dist/model/schema.js +178 -0
  74. package/dist/model/schema.js.map +1 -0
  75. package/dist/render/anatomy.d.ts +10 -0
  76. package/dist/render/anatomy.d.ts.map +1 -0
  77. package/dist/render/anatomy.js +77 -0
  78. package/dist/render/anatomy.js.map +1 -0
  79. package/dist/render/annotations.d.ts +9 -0
  80. package/dist/render/annotations.d.ts.map +1 -0
  81. package/dist/render/annotations.js +185 -0
  82. package/dist/render/annotations.js.map +1 -0
  83. package/dist/render/context.d.ts +16 -0
  84. package/dist/render/context.d.ts.map +1 -0
  85. package/dist/render/context.js +2 -0
  86. package/dist/render/context.js.map +1 -0
  87. package/dist/render/figure.d.ts +8 -0
  88. package/dist/render/figure.d.ts.map +1 -0
  89. package/dist/render/figure.js +138 -0
  90. package/dist/render/figure.js.map +1 -0
  91. package/dist/render/index.d.ts +7 -0
  92. package/dist/render/index.d.ts.map +1 -0
  93. package/dist/render/index.js +7 -0
  94. package/dist/render/index.js.map +1 -0
  95. package/dist/render/project.d.ts +18 -0
  96. package/dist/render/project.d.ts.map +1 -0
  97. package/dist/render/project.js +35 -0
  98. package/dist/render/project.js.map +1 -0
  99. package/dist/render/props.d.ts +9 -0
  100. package/dist/render/props.d.ts.map +1 -0
  101. package/dist/render/props.js +178 -0
  102. package/dist/render/props.js.map +1 -0
  103. package/dist/render/raster.d.ts +19 -0
  104. package/dist/render/raster.d.ts.map +1 -0
  105. package/dist/render/raster.js +39 -0
  106. package/dist/render/raster.js.map +1 -0
  107. package/dist/render/scene.d.ts +26 -0
  108. package/dist/render/scene.d.ts.map +1 -0
  109. package/dist/render/scene.js +144 -0
  110. package/dist/render/scene.js.map +1 -0
  111. package/dist/render/sheet.d.ts +20 -0
  112. package/dist/render/sheet.d.ts.map +1 -0
  113. package/dist/render/sheet.js +74 -0
  114. package/dist/render/sheet.js.map +1 -0
  115. package/dist/render/styles.d.ts +77 -0
  116. package/dist/render/styles.d.ts.map +1 -0
  117. package/dist/render/styles.js +122 -0
  118. package/dist/render/styles.js.map +1 -0
  119. package/dist/render/svg.d.ts +19 -0
  120. package/dist/render/svg.d.ts.map +1 -0
  121. package/dist/render/svg.js +40 -0
  122. package/dist/render/svg.js.map +1 -0
  123. package/dist/standards/keypoints.d.ts +31 -0
  124. package/dist/standards/keypoints.d.ts.map +1 -0
  125. package/dist/standards/keypoints.js +118 -0
  126. package/dist/standards/keypoints.js.map +1 -0
  127. package/docs/AUTHORING.md +144 -0
  128. package/package.json +94 -0
  129. package/poses/surf/bottom-turn.pose.yaml +47 -0
  130. package/poses/surf/cutback.pose.yaml +47 -0
  131. package/poses/surf/duck-dive.pose.yaml +47 -0
  132. package/poses/surf/noseride.pose.yaml +48 -0
  133. package/poses/surf/paddling.pose.yaml +48 -0
  134. package/poses/surf/pop-up.pose.yaml +47 -0
  135. package/poses/surf/takeoff.pose.yaml +47 -0
  136. package/poses/surf/tube-stance.pose.yaml +47 -0
  137. package/poses/yoga/ashtanga/adho-mukha-svanasana.pose.yaml +42 -0
  138. package/poses/yoga/ashtanga/ardha-uttanasana.pose.yaml +42 -0
  139. package/poses/yoga/ashtanga/baddha-konasana.pose.yaml +42 -0
  140. package/poses/yoga/ashtanga/balasana.pose.yaml +43 -0
  141. package/poses/yoga/ashtanga/chaturanga-dandasana.pose.yaml +41 -0
  142. package/poses/yoga/ashtanga/dandasana.pose.yaml +42 -0
  143. package/poses/yoga/ashtanga/halasana.pose.yaml +43 -0
  144. package/poses/yoga/ashtanga/janu-sirsasana-a.pose.yaml +42 -0
  145. package/poses/yoga/ashtanga/karnapidasana.pose.yaml +43 -0
  146. package/poses/yoga/ashtanga/marichyasana-a.pose.yaml +42 -0
  147. package/poses/yoga/ashtanga/marichyasana-c.pose.yaml +42 -0
  148. package/poses/yoga/ashtanga/matsyasana.pose.yaml +43 -0
  149. package/poses/yoga/ashtanga/navasana.pose.yaml +42 -0
  150. package/poses/yoga/ashtanga/padahastasana.pose.yaml +42 -0
  151. package/poses/yoga/ashtanga/padangusthasana.pose.yaml +42 -0
  152. package/poses/yoga/ashtanga/padmasana.pose.yaml +43 -0
  153. package/poses/yoga/ashtanga/parsvottanasana.pose.yaml +42 -0
  154. package/poses/yoga/ashtanga/paschimottanasana.pose.yaml +42 -0
  155. package/poses/yoga/ashtanga/prasarita-padottanasana-a.pose.yaml +46 -0
  156. package/poses/yoga/ashtanga/prasarita-padottanasana-c.pose.yaml +46 -0
  157. package/poses/yoga/ashtanga/primary.seq.yaml +74 -0
  158. package/poses/yoga/ashtanga/purvottanasana.pose.yaml +42 -0
  159. package/poses/yoga/ashtanga/salamba-sarvangasana.pose.yaml +43 -0
  160. package/poses/yoga/ashtanga/samasthiti.pose.yaml +29 -0
  161. package/poses/yoga/ashtanga/savasana.pose.yaml +43 -0
  162. package/poses/yoga/ashtanga/setu-bandhasana.pose.yaml +42 -0
  163. package/poses/yoga/ashtanga/sirsasana.pose.yaml +43 -0
  164. package/poses/yoga/ashtanga/supta-padangusthasana.pose.yaml +42 -0
  165. package/poses/yoga/ashtanga/upavistha-konasana.pose.yaml +42 -0
  166. package/poses/yoga/ashtanga/urdhva-dhanurasana.pose.yaml +43 -0
  167. package/poses/yoga/ashtanga/urdhva-hastasana.pose.yaml +42 -0
  168. package/poses/yoga/ashtanga/urdhva-mukha-svanasana.pose.yaml +42 -0
  169. package/poses/yoga/ashtanga/utkatasana.pose.yaml +42 -0
  170. package/poses/yoga/ashtanga/uttanasana.pose.yaml +42 -0
  171. package/poses/yoga/ashtanga/utthita-parsvakonasana.pose.yaml +44 -0
  172. package/poses/yoga/ashtanga/utthita-trikonasana.pose.yaml +44 -0
  173. package/poses/yoga/ashtanga/virabhadrasana-a.pose.yaml +42 -0
  174. package/poses/yoga/ashtanga/virabhadrasana-b.pose.yaml +42 -0
@@ -0,0 +1,118 @@
1
+ import { add, fromPolar, lerp, sub } from '../core/vec2.js';
2
+ export const MEDIAPIPE_33 = [
3
+ 'nose', 'left_eye_inner', 'left_eye', 'left_eye_outer', 'right_eye_inner', 'right_eye', 'right_eye_outer',
4
+ 'left_ear', 'right_ear', 'mouth_left', 'mouth_right',
5
+ 'left_shoulder', 'right_shoulder', 'left_elbow', 'right_elbow', 'left_wrist', 'right_wrist',
6
+ 'left_pinky', 'right_pinky', 'left_index', 'right_index', 'left_thumb', 'right_thumb',
7
+ 'left_hip', 'right_hip', 'left_knee', 'right_knee', 'left_ankle', 'right_ankle',
8
+ 'left_heel', 'right_heel', 'left_foot_index', 'right_foot_index',
9
+ ];
10
+ export const COCO_17 = [
11
+ 'nose', 'left_eye', 'right_eye', 'left_ear', 'right_ear',
12
+ 'left_shoulder', 'right_shoulder', 'left_elbow', 'right_elbow', 'left_wrist', 'right_wrist',
13
+ 'left_hip', 'right_hip', 'left_knee', 'right_knee', 'left_ankle', 'right_ankle',
14
+ ];
15
+ const COCO_EDGES = [
16
+ [0, 1], [0, 2], [1, 3], [2, 4], [5, 6], [5, 7], [7, 9], [6, 8], [8, 10],
17
+ [5, 11], [6, 12], [11, 12], [11, 13], [13, 15], [12, 14], [14, 16],
18
+ ];
19
+ const MEDIAPIPE_EDGES = [
20
+ [0, 2], [0, 5], [2, 7], [5, 8], [9, 10],
21
+ [11, 12], [11, 13], [13, 15], [15, 17], [15, 19], [15, 21],
22
+ [12, 14], [14, 16], [16, 18], [16, 20], [16, 22],
23
+ [11, 23], [12, 24], [23, 24], [23, 25], [25, 27], [27, 29], [27, 31],
24
+ [24, 26], [26, 28], [28, 30], [28, 32],
25
+ ];
26
+ /**
27
+ * The rig has no facial bones, so eyes, ears and mouth are derived from the head
28
+ * bone's axis. They are approximations by construction - honest ones, and enough
29
+ * for a consumer that only needs head orientation.
30
+ */
31
+ const facePoints = (skeleton) => {
32
+ const head = skeleton.bones.head;
33
+ const axis = sub(head.end, head.start);
34
+ const forward = fromPolar(head.worldAngle - 90, 1);
35
+ const centre = lerp(head.start, head.end, 0.55);
36
+ const size = Math.hypot(axis[0], axis[1]);
37
+ const at = (fwd, up, side) => add(add(centre, fromPolar(head.worldAngle, up * size)), fromPolar(head.worldAngle - 90, (fwd + side) * size));
38
+ return {
39
+ nose: add(centre, fromPolar(head.worldAngle - 90, 0.42 * size)),
40
+ left_eye: at(0.3, 0.12, 0.08),
41
+ left_eye_inner: at(0.32, 0.12, 0.03),
42
+ left_eye_outer: at(0.26, 0.12, 0.14),
43
+ right_eye: at(0.3, 0.12, -0.08),
44
+ right_eye_inner: at(0.32, 0.12, -0.03),
45
+ right_eye_outer: at(0.26, 0.12, -0.14),
46
+ left_ear: at(-0.1, 0.06, 0.22),
47
+ right_ear: at(-0.1, 0.06, -0.22),
48
+ mouth_left: at(0.3, -0.18, 0.09),
49
+ mouth_right: at(0.3, -0.18, -0.09),
50
+ _forward: forward,
51
+ };
52
+ };
53
+ const heel = (skeleton, side) => {
54
+ const foot = skeleton.bones[side === 'L' ? 'footL' : 'footR'];
55
+ return add(foot.start, fromPolar(foot.worldAngle + 180, foot.length * 0.35));
56
+ };
57
+ const hand = (skeleton, side, spread) => {
58
+ const h = skeleton.bones[side === 'L' ? 'handL' : 'handR'];
59
+ return add(h.end, fromPolar(h.worldAngle + spread, h.length * 0.3));
60
+ };
61
+ const pointFor = (name, skeleton, face) => {
62
+ const l = skeleton.landmarks;
63
+ const table = {
64
+ left_shoulder: l.shoulderL,
65
+ right_shoulder: l.shoulderR,
66
+ left_elbow: l.elbowL,
67
+ right_elbow: l.elbowR,
68
+ left_wrist: l.wristL,
69
+ right_wrist: l.wristR,
70
+ left_index: l.handTipL,
71
+ right_index: l.handTipR,
72
+ left_pinky: hand(skeleton, 'L', 55),
73
+ right_pinky: hand(skeleton, 'R', 55),
74
+ left_thumb: hand(skeleton, 'L', -55),
75
+ right_thumb: hand(skeleton, 'R', -55),
76
+ left_hip: l.hipJointL,
77
+ right_hip: l.hipJointR,
78
+ left_knee: l.kneeL,
79
+ right_knee: l.kneeR,
80
+ left_ankle: l.ankleL,
81
+ right_ankle: l.ankleR,
82
+ left_foot_index: l.toeL,
83
+ right_foot_index: l.toeR,
84
+ left_heel: heel(skeleton, 'L'),
85
+ right_heel: heel(skeleton, 'R'),
86
+ };
87
+ const point = table[name] ?? face[name];
88
+ if (point === undefined)
89
+ throw new Error(`No geometry for keypoint "${name}"`);
90
+ return point;
91
+ };
92
+ export const toKeypoints = (skeleton, format, options = {}) => {
93
+ const names = format === 'coco17' ? COCO_17 : MEDIAPIPE_33;
94
+ const face = facePoints(skeleton);
95
+ const raw = names.map((name) => pointFor(name, skeleton, face));
96
+ const normalize = options.normalize === true;
97
+ const xs = raw.map((p) => p[0]);
98
+ const ys = raw.map((p) => p[1]);
99
+ const minX = Math.min(...xs);
100
+ const minY = Math.min(...ys);
101
+ const span = Math.max(Math.max(...xs) - minX, Math.max(...ys) - minY, 1e-6);
102
+ return {
103
+ format,
104
+ space: normalize ? 'normalized' : 'stature',
105
+ edges: format === 'coco17' ? COCO_EDGES : MEDIAPIPE_EDGES,
106
+ keypoints: names.map((name, index) => {
107
+ const p = raw[index];
108
+ return {
109
+ index,
110
+ name,
111
+ // Image space is y-down, so normalising also flips the axis.
112
+ x: normalize ? (p[0] - minX) / span : p[0],
113
+ y: normalize ? 1 - (p[1] - minY) / span : p[1],
114
+ };
115
+ }),
116
+ };
117
+ };
118
+ //# sourceMappingURL=keypoints.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keypoints.js","sourceRoot":"","sources":["../../src/standards/keypoints.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,144 @@
1
+ # Authoring poses
2
+
3
+ A pose is a YAML file. Nothing is drawn imperatively: you describe a body, and asanakit
4
+ solves and renders it. This guide is written to be followed by a person or by a model.
5
+
6
+ ## The coordinate system
7
+
8
+ Angles are **degrees**, measured **counter-clockwise from the +x axis**:
9
+
10
+ ```
11
+ 90 (up)
12
+ |
13
+ 180 -------+------- 0 (right, and the way a side-view figure faces)
14
+ |
15
+ -90 (down)
16
+ ```
17
+
18
+ The figure is one unit tall (sole to crown). The ground is `y = 0`.
19
+
20
+ ## The two ways to angle a bone
21
+
22
+ | Block | Meaning | Use it for |
23
+ |---|---|---|
24
+ | `joints:` | rotation **relative to the parent bone**, from anatomical neutral (standing, arms down) | small deviations from standing |
25
+ | `world:` | the bone's **absolute direction** on the page | everything else |
26
+
27
+ `world` is what you want almost always. "The front thigh points down and back at -125°"
28
+ is something you can reason about and check by eye. Chaining five relative rotations is not.
29
+
30
+ A bone listed in `world` ignores its rest angle and its parent's rotation. Its **children
31
+ still hang off it**, so pinning the thigh and then flexing the knee with `joints: {shinL: 40}`
32
+ works exactly as you would expect.
33
+
34
+ > **The single most common mistake:** you tilt the pelvis with `root.rotation` and forget
35
+ > that every unpinned limb rotates with it. Tilt the pelvis to fold forward, and the legs
36
+ > swing up into the air. **If you set `root.rotation`, pin the legs in `world`.**
37
+
38
+ ## Bones you can angle
39
+
40
+ ```
41
+ pelvis spine neck head
42
+ clavicleL/R upperArmL/R forearmL/R handL/R
43
+ hipL/R thighL/R shinL/R footL/R
44
+ ```
45
+
46
+ `root.rotation` aims the pelvis (90 = upright). Rotating a bone rotates everything below it.
47
+
48
+ Positive `shinL` **flexes the knee** (heel toward the buttock). Positive `forearmL` flexes
49
+ the elbow. Neither joint bends the other way, and the validator will tell you so.
50
+
51
+ ## Landmarks you can point at
52
+
53
+ Used by `contact`, annotations and props:
54
+
55
+ ```
56
+ hipCenter waist chest neckBase headCenter headTop
57
+ shoulderL/R elbowL/R wristL/R handTipL/R
58
+ hipJointL/R kneeL/R ankleL/R toeL/R
59
+ ```
60
+
61
+ ## Views
62
+
63
+ | view | what it means |
64
+ |---|---|
65
+ | `front` | the figure faces you. Left and right limbs **mirror**: `upperArmL: 90` and `upperArmR: 90` raise both arms outward. |
66
+ | `side` | profile, facing **+x** (to the right). Limbs **do not mirror** - both arms swing the same way, because you see both from the same side. The left/right offset becomes depth and nearly vanishes. |
67
+ | `back` | like `front`. |
68
+ | `three-quarter` | between the two. |
69
+
70
+ Set `flip: true` to face the other way. Set `mirror: true` to swap which limb does what
71
+ (the other side of an asymmetric asana). Sequences apply both to render "second side".
72
+
73
+ ## Contact points: the thing that keeps you honest
74
+
75
+ ```yaml
76
+ contact: [toeL, toeR, handTipL, handTipR]
77
+ ```
78
+
79
+ This is the pose's claim about which parts of the body are on the floor. `asanakit lint`
80
+ checks it against the solved figure and fails if a hand that was supposed to reach the mat
81
+ is hovering 9 cm above it. **Every pose must declare its contact points.**
82
+
83
+ ## The loop
84
+
85
+ ```bash
86
+ npx tsx src/cli/index.ts lint my-pose # anatomy + contact check
87
+ npx tsx src/cli/index.ts render my-pose -o out/p.png -w 500 -h 500 --scale 500
88
+ ```
89
+
90
+ Then **look at the PNG**. Lint proves the pose is physically possible; only your eye proves
91
+ it is the right posture. Iterate until both agree.
92
+
93
+ ## A complete example
94
+
95
+ ```yaml
96
+ asanakit: 1
97
+ id: adho-mukha-svanasana
98
+ name: Downward-Facing Dog
99
+ sanskrit: Adho Mukha Śvānāsana
100
+ discipline: yoga
101
+ family: inversion
102
+ difficulty: 2
103
+ description: An inverted V. Hips lift back and up, heels press down.
104
+ tags: [ashtanga, surya-namaskara-a, inversion]
105
+ breath: exhale
106
+ drishti: nabi-chakra
107
+ cues:
108
+ - Lift the sit bones, lengthen the spine
109
+ contact: [toeL, toeR, handTipL, handTipR]
110
+ figure:
111
+ view: side
112
+ grounded: true
113
+ root:
114
+ rotation: -48 # pelvis aims down-and-forward: the torso ramps to the hands
115
+ world:
116
+ thighL: -125 # legs ramp down-and-back to the feet
117
+ thighR: -125
118
+ shinL: -125 # straight leg: shin collinear with thigh
119
+ shinR: -125
120
+ footL: -20
121
+ footR: -20
122
+ spine: -48
123
+ neck: -48
124
+ head: -48 # head hangs between the arms, in line with the spine
125
+ upperArmL: -50 # arms continue the line of the spine to the floor
126
+ upperArmR: -50
127
+ forearmL: -50
128
+ forearmR: -50
129
+ handL: -8 # palm flat
130
+ handR: -8
131
+ props:
132
+ - type: mat
133
+ muscles:
134
+ engaged: [deltoid, triceps, quadriceps, serratus]
135
+ stretched: [hamstrings, gastrocnemius, latissimus]
136
+ ```
137
+
138
+ ## Reference
139
+
140
+ - `asanakit vocab` prints every joint, landmark, muscle, style and view name.
141
+ - `asanakit schema` prints the JSON Schema for the format.
142
+ - Props: `mat`, `ground`, `block`, `strap`, `wall`, `surfboard`, `wave`.
143
+ - Annotations: `angle`, `line`, `plumb`, `arrow`, `label`, `point`.
144
+ - Muscles for `engaged`/`stretched`: run `asanakit vocab`.
package/package.json ADDED
@@ -0,0 +1,94 @@
1
+ {
2
+ "name": "@franzenzenhofer/asanakit",
3
+ "version": "0.1.0",
4
+ "description": "Programmatic stick-figure and anatomical infographic engine for yoga and surf postures. Declarative pose format, deterministic SVG/PNG output, CLI-first, AI-driveable.",
5
+ "keywords": [
6
+ "yoga",
7
+ "surf",
8
+ "asana",
9
+ "stick-figure",
10
+ "anatomy",
11
+ "infographic",
12
+ "svg",
13
+ "png",
14
+ "pose",
15
+ "skeleton",
16
+ "kinematics",
17
+ "cli",
18
+ "typescript"
19
+ ],
20
+ "license": "MIT",
21
+ "author": "Franz Enzenhofer",
22
+ "repository": {
23
+ "type": "git",
24
+ "url": "git+https://github.com/franzenzenhofer/asanakit.git"
25
+ },
26
+ "homepage": "https://github.com/franzenzenhofer/asanakit#readme",
27
+ "bugs": {
28
+ "url": "https://github.com/franzenzenhofer/asanakit/issues"
29
+ },
30
+ "type": "module",
31
+ "engines": {
32
+ "node": ">=20"
33
+ },
34
+ "bin": {
35
+ "asanakit": "dist/cli/index.js"
36
+ },
37
+ "main": "./dist/index.js",
38
+ "types": "./dist/index.d.ts",
39
+ "exports": {
40
+ ".": {
41
+ "types": "./dist/index.d.ts",
42
+ "default": "./dist/index.js"
43
+ }
44
+ },
45
+ "files": [
46
+ "dist",
47
+ "poses",
48
+ "docs/AUTHORING.md",
49
+ "README.md",
50
+ "LICENSE"
51
+ ],
52
+ "scripts": {
53
+ "build": "tsc -p tsconfig.build.json && chmod +x dist/cli/index.js",
54
+ "dev": "tsx src/cli/index.ts",
55
+ "typecheck": "tsc --noEmit",
56
+ "lint": "eslint .",
57
+ "lint:fix": "eslint . --fix",
58
+ "test": "vitest run",
59
+ "test:watch": "vitest",
60
+ "coverage": "vitest run --coverage",
61
+ "gallery": "tsx scripts/gallery.ts",
62
+ "verify": "npm run typecheck && npm run lint && npm run test && npm run build",
63
+ "prepublishOnly": "npm run verify"
64
+ },
65
+ "dependencies": {
66
+ "@resvg/resvg-js": "^2.6.2",
67
+ "commander": "^14.0.1",
68
+ "culori": "^4.0.2",
69
+ "d3-path": "^3.1.0",
70
+ "d3-shape": "^3.2.0",
71
+ "gl-matrix": "^3.4.4",
72
+ "svgo": "^4.0.2",
73
+ "xmlbuilder2": "^4.0.3",
74
+ "yaml": "^2.8.1",
75
+ "zod": "^4.1.12"
76
+ },
77
+ "devDependencies": {
78
+ "@eslint/js": "^9.38.0",
79
+ "@types/d3-path": "^3.1.1",
80
+ "@types/d3-shape": "^3.1.8",
81
+ "@types/node": "^24.9.2",
82
+ "@vitest/coverage-v8": "^3.2.4",
83
+ "eslint": "^9.38.0",
84
+ "tsx": "^4.20.6",
85
+ "typescript": "^5.9.3",
86
+ "typescript-eslint": "^8.46.2",
87
+ "vitest": "^3.2.4"
88
+ },
89
+ "allowScripts": {
90
+ "sharp@0.34.5": true,
91
+ "esbuild@0.28.1": true,
92
+ "@resvg/resvg-js@2.6.2": true
93
+ }
94
+ }
@@ -0,0 +1,47 @@
1
+ asanakit: 1
2
+ id: bottom-turn
3
+ name: Bottom Turn
4
+ english: Bottom Turn
5
+ discipline: surf
6
+ family: turning
7
+ difficulty: 4
8
+ description: The turn at the base of the wave that sets up everything after it. The surfer compresses deep, drives the weight through the heels and the rail, and reaches the inside arm toward the wave face while the eyes go back up to the lip.
9
+ tags: [surf, turning, rail, power]
10
+ cues:
11
+ - Compress low and drive from the heels
12
+ - Look where you want to go - back up at the lip
13
+ contact: [toeL, toeR]
14
+ figure:
15
+ view: side
16
+ grounded: true
17
+ root:
18
+ rotation: 55
19
+ world:
20
+ spine: 45
21
+ neck: 68
22
+ head: 82
23
+ thighL: -25
24
+ shinL: -100
25
+ footL: -15
26
+ thighR: -60
27
+ shinR: -145
28
+ footR: -10
29
+ upperArmL: -5
30
+ forearmL: 15
31
+ handL: 20
32
+ upperArmR: -150
33
+ forearmR: -140
34
+ handR: -135
35
+ props:
36
+ - type: wave
37
+ amplitude: 0.45
38
+ length: 3.4
39
+ y: -0.2
40
+ - type: surfboard
41
+ under: [ankleL, ankleR]
42
+ rotation: 10
43
+ length: 1.15
44
+ offset: [0, -0.1]
45
+ muscles:
46
+ engaged: [quadriceps, gluteus, obliques, erectorSpinae, adductors]
47
+ stretched: [hipFlexors, latissimus]
@@ -0,0 +1,47 @@
1
+ asanakit: 1
2
+ id: cutback
3
+ name: Cutback
4
+ english: Cutback
5
+ discipline: surf
6
+ family: turning
7
+ difficulty: 4
8
+ description: The turn that takes the surfer back to the power source. Out on the shoulder the board is swung around by the torso - the chest and both arms lead the rotation back toward the breaking part of the wave, the weight settles over the tail and the front leg extends.
9
+ tags: [surf, turning, rotation, flow]
10
+ cues:
11
+ - Turn your chest and arms first, the board follows
12
+ - Weight back over the tail to pivot, not the nose
13
+ contact: [toeL, toeR]
14
+ figure:
15
+ view: side
16
+ grounded: true
17
+ root:
18
+ rotation: 82
19
+ world:
20
+ spine: 100
21
+ neck: 118
22
+ head: 145
23
+ thighL: -45
24
+ shinL: -105
25
+ footL: -20
26
+ thighR: -85
27
+ shinR: -135
28
+ footR: -15
29
+ upperArmL: -178
30
+ forearmL: -172
31
+ handL: -170
32
+ upperArmR: 132
33
+ forearmR: 158
34
+ handR: 162
35
+ props:
36
+ - type: wave
37
+ amplitude: 0.42
38
+ length: 3.4
39
+ y: -0.22
40
+ - type: surfboard
41
+ under: [ankleL, ankleR]
42
+ rotation: 4
43
+ length: 1.15
44
+ offset: [0, -0.1]
45
+ muscles:
46
+ engaged: [obliques, erectorSpinae, gluteus, quadriceps, deltoid]
47
+ stretched: [pectoralis, hamstrings]
@@ -0,0 +1,47 @@
1
+ asanakit: 1
2
+ id: duck-dive
3
+ name: Duck Dive
4
+ english: Duck Dive
5
+ discipline: surf
6
+ family: prone
7
+ difficulty: 3
8
+ description: How a shortboarder gets under a broken wave. Both arms straighten and drive the nose deep under the water, the head follows it down, and one knee then punches into the tail to sink the whole board while the wave passes overhead.
9
+ tags: [surf, prone, paddling, defensive, shortboard]
10
+ cues:
11
+ - Straight arms - push the nose down, do not pull it toward you
12
+ - Knee into the tail only once the nose is already under
13
+ contact: [handTipL, handTipR]
14
+ figure:
15
+ view: side
16
+ grounded: true
17
+ root:
18
+ rotation: -30
19
+ world:
20
+ spine: -38
21
+ neck: -34
22
+ head: -30
23
+ upperArmL: -56
24
+ forearmL: -56
25
+ handL: -56
26
+ upperArmR: -50
27
+ forearmR: -50
28
+ handR: -50
29
+ thighL: 168
30
+ shinL: 142
31
+ footL: 150
32
+ thighR: -175
33
+ shinR: 95
34
+ footR: 70
35
+ props:
36
+ - type: wave
37
+ amplitude: 0.5
38
+ length: 3.2
39
+ y: 0.55
40
+ facing: left
41
+ - type: surfboard
42
+ at: [0.023, 0.108]
43
+ rotation: -32
44
+ length: 1.35
45
+ muscles:
46
+ engaged: [triceps, deltoid, latissimus, rectusAbdominis, hipFlexors]
47
+ stretched: [pectoralis, quadriceps]
@@ -0,0 +1,48 @@
1
+ asanakit: 1
2
+ id: noseride
3
+ name: Noseride
4
+ english: Noseride
5
+ discipline: surf
6
+ family: trim
7
+ difficulty: 4
8
+ description: The longboard reward. With the tail held in the wave the surfer walks to the front of the board and stands tall and still on the nose, legs long, arms loose, doing as little as possible while the board trims along the face.
9
+ tags: [surf, longboard, trim, nose, style]
10
+ cues:
11
+ - Stand tall and quiet - do nothing and let the board trim
12
+ - Stay behind the tail's hold, never lunge at the nose
13
+ contact: [toeL, toeR]
14
+ figure:
15
+ view: side
16
+ grounded: true
17
+ root:
18
+ rotation: 90
19
+ world:
20
+ spine: 95
21
+ neck: 90
22
+ head: 88
23
+ thighL: -80
24
+ shinL: -95
25
+ footL: -15
26
+ thighR: -100
27
+ shinR: -112
28
+ footR: -12
29
+ upperArmL: -60
30
+ forearmL: -50
31
+ handL: -45
32
+ upperArmR: -112
33
+ forearmR: -102
34
+ handR: -100
35
+ props:
36
+ - type: wave
37
+ amplitude: 0.3
38
+ length: 3.6
39
+ y: -0.18
40
+ breaking: false
41
+ - type: surfboard
42
+ under: [ankleL, ankleR]
43
+ rotation: -2
44
+ length: 1.7
45
+ offset: [-0.5, -0.1]
46
+ muscles:
47
+ engaged: [gastrocnemius, tibialisAnterior, quadriceps, erectorSpinae]
48
+ stretched: [hamstrings, pectoralis]
@@ -0,0 +1,48 @@
1
+ asanakit: 1
2
+ id: paddling
3
+ name: Paddling
4
+ english: Paddling
5
+ discipline: surf
6
+ family: prone
7
+ difficulty: 1
8
+ description: Where ninety percent of surfing actually happens. The surfer lies prone and centred on the deck, chest lifted off the board, legs together over the tail, and pulls through the water one long arm at a time while the other arm recovers.
9
+ tags: [surf, prone, paddling, fundamental, endurance]
10
+ cues:
11
+ - Chest up, back long - do not lie flat
12
+ - Reach past your head and pull the water all the way to the hip
13
+ contact: [hipCenter, kneeL, ankleL, ankleR]
14
+ figure:
15
+ view: side
16
+ grounded: true
17
+ root:
18
+ rotation: 0
19
+ world:
20
+ spine: 34
21
+ neck: 44
22
+ head: 28
23
+ upperArmL: 4
24
+ forearmL: -2
25
+ handL: -8
26
+ upperArmR: 145
27
+ forearmR: 196
28
+ handR: 200
29
+ thighL: 180
30
+ shinL: 180
31
+ footL: 180
32
+ thighR: 177
33
+ shinR: 176
34
+ footR: 176
35
+ props:
36
+ - type: wave
37
+ amplitude: 0.22
38
+ length: 3.6
39
+ y: -0.35
40
+ breaking: false
41
+ - type: surfboard
42
+ under: [hipCenter, chest]
43
+ rotation: 0
44
+ length: 1.5
45
+ offset: [-0.12, -0.13]
46
+ muscles:
47
+ engaged: [latissimus, deltoid, trapezius, erectorSpinae, triceps]
48
+ stretched: [pectoralis, rectusAbdominis]
@@ -0,0 +1,47 @@
1
+ asanakit: 1
2
+ id: pop-up
3
+ name: Pop-Up
4
+ english: Pop-Up
5
+ discipline: surf
6
+ family: transition
7
+ difficulty: 3
8
+ description: The one explosive move that turns a paddler into a surfer. The hands press down on the deck under the chest, the hips lift, the back foot loads the tail and the front foot swings through under the body to land in the stance. It happens in one beat, without a knee ever touching the deck.
9
+ tags: [surf, transition, dynamic, fundamental]
10
+ cues:
11
+ - Press the deck away and lift the hips first
12
+ - Swing the front foot under your chest - never through a knee
13
+ contact: [handTipL, handTipR, toeR]
14
+ figure:
15
+ view: side
16
+ grounded: true
17
+ root:
18
+ rotation: 30
19
+ world:
20
+ spine: 26
21
+ neck: 18
22
+ head: 10
23
+ upperArmL: -80
24
+ forearmL: -85
25
+ handL: -88
26
+ upperArmR: -94
27
+ forearmR: -91
28
+ handR: -88
29
+ thighL: -2
30
+ shinL: -114
31
+ footL: 5
32
+ thighR: -145
33
+ shinR: -152
34
+ footR: -178
35
+ props:
36
+ - type: wave
37
+ amplitude: 0.35
38
+ length: 3.4
39
+ y: -0.3
40
+ - type: surfboard
41
+ under: [handTipL, toeR]
42
+ rotation: 0
43
+ length: 1.3
44
+ offset: [0, -0.09]
45
+ muscles:
46
+ engaged: [triceps, pectoralis, deltoid, rectusAbdominis, hipFlexors, serratus]
47
+ stretched: [hamstrings, gluteus]