@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 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/model/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,iFAAiF;AACjF,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAMrC,wFAAwF;AACxF,QAAA,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;kDAAyC,CAAC;AAEtD,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;kCAEuE,CAAC;AAEjG,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAoBvB,CAAC;AAIH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BA0C3B,CAAC;AAEH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BAmCrB,CAAC;AAEH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA+BrB,CAAC;AAEH,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,UAAU,CAAC,CAAC;AACnD,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AACvD,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,YAAY,CAAC,CAAC;AACvD,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC3D,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,UAAU,CAAC,CAAC;AAC/C,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,MAAM,CAAC,CAAC;AAE7C,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAuBzB,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,cAAc,CAAC,CAAC;AAE3D,eAAO,MAAM,cAAc,QAAO,MAAM,CAAC,MAAM,EAAE,OAAO,CAKtD,CAAC;AAEH,eAAO,MAAM,kBAAkB,QAAO,MAAM,CAAC,MAAM,EAAE,OAAO,CAK1D,CAAC"}
@@ -0,0 +1,178 @@
1
+ import { z } from 'zod';
2
+ import { MUSCLE_IDS } from '../anatomy/muscles.js';
3
+ import { BONE_IDS, LANDMARK_IDS } from '../core/types.js';
4
+ /** Current version of the .pose file format. Bumped only on breaking changes. */
5
+ export const POSE_FORMAT_VERSION = 1;
6
+ const MAX_JOINT_DEG = 360;
7
+ const point = z.tuple([z.number(), z.number()]);
8
+ /** Anything an annotation or prop can be pinned to: a named landmark or a raw point. */
9
+ const anchor = z.union([z.enum(LANDMARK_IDS), point]);
10
+ export const jointsSchema = z
11
+ .partialRecord(z.enum(BONE_IDS), z.number().min(-MAX_JOINT_DEG).max(MAX_JOINT_DEG))
12
+ .describe('Joint rotations in degrees, relative to anatomical neutral (standing, arms down).');
13
+ export const figureSchema = z.object({
14
+ view: z.enum(['front', 'back', 'side', 'three-quarter']).default('front'),
15
+ /** Mirror the figure left-to-right, so a side-view figure faces the other way. */
16
+ flip: z.boolean().default(false),
17
+ /** Swap all left and right joint angles: the "other side" of an asymmetric asana. */
18
+ mirror: z.boolean().default(false),
19
+ /** Drop the figure so its lowest point rests on the ground line. */
20
+ grounded: z.boolean().default(true),
21
+ root: z
22
+ .object({
23
+ position: point.default([0, 0]),
24
+ rotation: z.number().default(90).describe('Pelvis angle in degrees; 90 = upright, 0 = lying head-first.'),
25
+ scale: z.number().positive().default(1),
26
+ })
27
+ .prefault({}),
28
+ joints: jointsSchema.default({}),
29
+ world: z
30
+ .partialRecord(z.enum(BONE_IDS), z.number().min(-MAX_JOINT_DEG).max(MAX_JOINT_DEG))
31
+ .default({})
32
+ .describe('Absolute bone directions in degrees (0 = +x, 90 = up). Overrides `joints` for that bone.'),
33
+ });
34
+ const annotationBase = { label: z.string().optional(), color: z.string().optional() };
35
+ export const annotationSchema = z.discriminatedUnion('type', [
36
+ z.object({
37
+ type: z.literal('angle'),
38
+ at: z.enum(LANDMARK_IDS),
39
+ from: z.enum(LANDMARK_IDS),
40
+ to: z.enum(LANDMARK_IDS),
41
+ radius: z.number().positive().default(0.06),
42
+ ...annotationBase,
43
+ }),
44
+ z.object({
45
+ type: z.literal('line'),
46
+ from: anchor,
47
+ to: anchor,
48
+ dashed: z.boolean().default(true),
49
+ extend: z.number().min(0).default(0).describe('Extend the line past both ends, in stature units.'),
50
+ ...annotationBase,
51
+ }),
52
+ z.object({
53
+ type: z.literal('plumb'),
54
+ at: anchor,
55
+ dashed: z.boolean().default(true),
56
+ ...annotationBase,
57
+ }),
58
+ z.object({
59
+ type: z.literal('arrow'),
60
+ from: anchor,
61
+ to: anchor,
62
+ curve: z.number().default(0).describe('Bow the arrow sideways; negative curves the other way.'),
63
+ ...annotationBase,
64
+ }),
65
+ z.object({
66
+ type: z.literal('label'),
67
+ at: anchor,
68
+ text: z.string(),
69
+ offset: point.default([0.08, 0.04]),
70
+ ...annotationBase,
71
+ }),
72
+ z.object({
73
+ type: z.literal('point'),
74
+ at: anchor,
75
+ ...annotationBase,
76
+ }),
77
+ ]);
78
+ export const propSchema = z.discriminatedUnion('type', [
79
+ z.object({ type: z.literal('ground'), y: z.number().default(0), width: z.number().positive().default(1.6) }),
80
+ z.object({
81
+ type: z.literal('mat'),
82
+ y: z.number().default(0),
83
+ width: z.number().positive().default(1.35),
84
+ thickness: z.number().positive().default(0.022),
85
+ rolled: z.boolean().default(false),
86
+ }),
87
+ z.object({
88
+ type: z.literal('block'),
89
+ at: anchor,
90
+ rotation: z.number().default(0),
91
+ width: z.number().positive().default(0.22),
92
+ height: z.number().positive().default(0.12),
93
+ }),
94
+ z.object({ type: z.literal('strap'), from: anchor, to: anchor, sag: z.number().default(0.02) }),
95
+ z.object({ type: z.literal('wall'), x: z.number().default(-0.9), facing: z.enum(['left', 'right']).default('left') }),
96
+ z.object({
97
+ type: z.literal('surfboard'),
98
+ /** Position the board under these landmarks (usually both feet), or pin it explicitly. */
99
+ under: z.array(z.enum(LANDMARK_IDS)).default([]),
100
+ at: point.optional(),
101
+ rotation: z.number().default(0),
102
+ length: z.number().positive().default(1.15),
103
+ offset: point.default([0, -0.03]),
104
+ }),
105
+ z.object({
106
+ type: z.literal('wave'),
107
+ amplitude: z.number().positive().default(0.35),
108
+ length: z.number().positive().default(3),
109
+ y: z.number().default(-0.15),
110
+ breaking: z.boolean().default(true),
111
+ facing: z.enum(['left', 'right']).default('right'),
112
+ }),
113
+ ]);
114
+ export const poseSchema = z.object({
115
+ asanakit: z.literal(POSE_FORMAT_VERSION, `Unsupported "asanakit" format version (expected ${POSE_FORMAT_VERSION}).`),
116
+ id: z
117
+ .string()
118
+ .regex(/^[a-z0-9]+(-[a-z0-9]+)*$/, 'id must be a lowercase kebab-case slug')
119
+ .describe('Stable slug, unique within a library.'),
120
+ name: z.string().min(1),
121
+ sanskrit: z.string().optional(),
122
+ english: z.string().optional(),
123
+ discipline: z.enum(['yoga', 'surf', 'other']),
124
+ family: z.string().optional().describe('Grouping inside a discipline, e.g. "standing" or "seated".'),
125
+ difficulty: z.number().int().min(1).max(5).optional(),
126
+ description: z.string().optional(),
127
+ tags: z.array(z.string()).default([]),
128
+ cues: z.array(z.string()).default([]).describe('Teaching cues, rendered as a caption block.'),
129
+ drishti: z.string().optional().describe('Gaze point (Ashtanga).'),
130
+ breath: z.enum(['inhale', 'exhale', 'hold', 'free']).optional(),
131
+ figure: figureSchema.prefault({}),
132
+ contact: z
133
+ .array(z.enum(LANDMARK_IDS))
134
+ .default([])
135
+ .describe('Landmarks that touch the floor in this posture. Validated against the solved figure.'),
136
+ props: z.array(propSchema).default([]),
137
+ annotations: z.array(annotationSchema).default([]),
138
+ muscles: z
139
+ .object({
140
+ engaged: z.array(z.enum(MUSCLE_IDS)).default([]),
141
+ stretched: z.array(z.enum(MUSCLE_IDS)).default([]),
142
+ })
143
+ .prefault({}),
144
+ source: z.string().optional().describe('Where the posture data came from, for attribution.'),
145
+ });
146
+ export const sequenceSchema = z.object({
147
+ asanakit: z.literal(POSE_FORMAT_VERSION),
148
+ id: z.string().regex(/^[a-z0-9]+(-[a-z0-9]+)*$/),
149
+ name: z.string().min(1),
150
+ tradition: z.string().optional(),
151
+ description: z.string().optional(),
152
+ sections: z
153
+ .array(z.object({
154
+ name: z.string(),
155
+ steps: z.array(z.object({
156
+ pose: z.string().describe('Pose id, resolved against the loaded pose library.'),
157
+ label: z.string().optional(),
158
+ breath: z.enum(['inhale', 'exhale', 'hold', 'free']).optional(),
159
+ count: z.number().int().positive().default(1).describe('Breaths held.'),
160
+ side: z.enum(['left', 'right', 'both', 'none']).default('none'),
161
+ note: z.string().optional(),
162
+ })),
163
+ }))
164
+ .default([]),
165
+ });
166
+ export const poseJsonSchema = () => ({
167
+ $schema: 'https://json-schema.org/draft/2020-12/schema',
168
+ $id: 'https://asanakit.dev/schema/pose-v1.json',
169
+ title: 'asanakit pose',
170
+ ...z.toJSONSchema(poseSchema, { io: 'input' }),
171
+ });
172
+ export const sequenceJsonSchema = () => ({
173
+ $schema: 'https://json-schema.org/draft/2020-12/schema',
174
+ $id: 'https://asanakit.dev/schema/sequence-v1.json',
175
+ title: 'asanakit sequence',
176
+ ...z.toJSONSchema(sequenceSchema, { io: 'input' }),
177
+ });
178
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/model/schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { type MuscleId } from '../anatomy/muscles.js';
2
+ import type { RenderContext } from './context.js';
3
+ import { type SvgNode } from './svg.js';
4
+ export type MuscleState = 'engaged' | 'stretched' | 'resting';
5
+ /**
6
+ * Muscle layer for the anatomy styles. Rendered under the bone lines, so the
7
+ * skeleton still reads on top of the shading.
8
+ */
9
+ export declare const renderMuscles: (ctx: RenderContext, engaged: readonly MuscleId[], stretched: readonly MuscleId[]) => SvgNode | null;
10
+ //# sourceMappingURL=anatomy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anatomy.d.ts","sourceRoot":"","sources":["../../src/render/anatomy.ts"],"names":[],"mappings":"AACA,OAAO,EAAwD,KAAK,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAG5G,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,OAAO,EAAkB,KAAK,OAAO,EAAE,MAAM,UAAU,CAAC;AAExD,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,CAAC;AA8C9D;;;GAGG;AACH,eAAO,MAAM,aAAa,GACxB,KAAK,aAAa,EAClB,SAAS,SAAS,QAAQ,EAAE,EAC5B,WAAW,SAAS,QAAQ,EAAE,KAC7B,OAAO,GAAG,IA2BZ,CAAC"}
@@ -0,0 +1,77 @@
1
+ import { path } from 'd3-path';
2
+ import { MUSCLES, MUSCLE_IDS, muscleInstances } from '../anatomy/muscles.js';
3
+ import { along, sub } from '../core/vec2.js';
4
+ import { el, group, num } from './svg.js';
5
+ const BULGE = 0.35;
6
+ const stateOf = (id, engaged, stretched) => {
7
+ if (engaged.includes(id))
8
+ return 'engaged';
9
+ if (stretched.includes(id))
10
+ return 'stretched';
11
+ return 'resting';
12
+ };
13
+ const fillFor = (state, style) => {
14
+ if (state === 'engaged')
15
+ return style.muscles.engaged;
16
+ if (state === 'stretched')
17
+ return style.muscles.stretched;
18
+ return style.muscles.base;
19
+ };
20
+ /**
21
+ * A muscle belly is an arc that bows away from the bone: two endpoints on the
22
+ * bone's offset line plus a quadratic control point pushed out sideways. Drawn
23
+ * as a thick round-capped stroke, that reads as a muscle without needing traced
24
+ * anatomical artwork.
25
+ */
26
+ const bellyPath = (bone, muscle, rawOffset, ctx) => {
27
+ const { proj } = ctx;
28
+ const scale = ctx.skeleton.scale;
29
+ const offset = rawOffset * scale;
30
+ // Bow the belly away from the bone, on whichever side of it the muscle sits.
31
+ const bulge = offset === 0 ? 0 : Math.sign(offset) * muscle.width * BULGE * scale;
32
+ const a = along(bone.start, bone.end, muscle.t0, offset);
33
+ const b = along(bone.start, bone.end, muscle.t1, offset);
34
+ const mid = along(bone.start, bone.end, (muscle.t0 + muscle.t1) / 2, offset + bulge);
35
+ const [ax, ay] = proj.p(a);
36
+ const [bx, by] = proj.p(b);
37
+ const [mx, my] = proj.p(mid);
38
+ const p = path();
39
+ p.moveTo(num(ax), num(ay));
40
+ p.quadraticCurveTo(num(mx), num(my), num(bx), num(by));
41
+ return p.toString();
42
+ };
43
+ const isDegenerate = (bone) => {
44
+ const d = sub(bone.end, bone.start);
45
+ return Math.hypot(d[0], d[1]) < 1e-6;
46
+ };
47
+ /**
48
+ * Muscle layer for the anatomy styles. Rendered under the bone lines, so the
49
+ * skeleton still reads on top of the shading.
50
+ */
51
+ export const renderMuscles = (ctx, engaged, stretched) => {
52
+ const { skeleton, proj, style } = ctx;
53
+ if (!style.muscles.show)
54
+ return null;
55
+ const shapes = [];
56
+ for (const id of MUSCLE_IDS) {
57
+ const muscle = MUSCLES[id];
58
+ const state = stateOf(id, engaged, stretched);
59
+ for (const { bone: boneId, offset } of muscleInstances(muscle, skeleton.view)) {
60
+ const bone = skeleton.bones[boneId];
61
+ if (isDegenerate(bone))
62
+ continue;
63
+ shapes.push(el('path', {
64
+ 'data-muscle': id,
65
+ 'data-muscle-state': state,
66
+ d: bellyPath(bone, muscle, offset, ctx),
67
+ fill: 'none',
68
+ stroke: fillFor(state, style),
69
+ 'stroke-width': muscle.width * proj.s * skeleton.scale,
70
+ 'stroke-linecap': 'round',
71
+ opacity: style.muscles.opacity,
72
+ }));
73
+ }
74
+ }
75
+ return group({ 'data-layer': 'muscles' }, shapes);
76
+ };
77
+ //# sourceMappingURL=anatomy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anatomy.js","sourceRoot":"","sources":["../../src/render/anatomy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { Bounds, Skeleton } from '../core/types.js';
2
+ import type { Annotation } from '../model/schema.js';
3
+ import type { RenderContext } from './context.js';
4
+ import { type SvgNode } from './svg.js';
5
+ export declare const ARROW_MARKER_ID = "asanakit-arrow";
6
+ export declare const arrowMarker: (color: string) => SvgNode;
7
+ export declare const annotationsBounds: (annotations: readonly Annotation[], skeleton: Skeleton) => Bounds | null;
8
+ export declare const renderAnnotations: (ctx: RenderContext, annotations: readonly Annotation[]) => SvgNode | null;
9
+ //# sourceMappingURL=annotations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"annotations.d.ts","sourceRoot":"","sources":["../../src/render/annotations.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAGlD,OAAO,EAA0B,KAAK,OAAO,EAAE,MAAM,UAAU,CAAC;AAEhE,eAAO,MAAM,eAAe,mBAAmB,CAAC;AAEhD,eAAO,MAAM,WAAW,GAAI,OAAO,MAAM,KAAG,OAgBxC,CAAC;AAuKL,eAAO,MAAM,iBAAiB,GAAI,aAAa,SAAS,UAAU,EAAE,EAAE,UAAU,QAAQ,KAAG,MAAM,GAAG,IAGnG,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,KAAK,aAAa,EAAE,aAAa,SAAS,UAAU,EAAE,KAAG,OAAO,GAAG,IAqBpG,CAAC"}
@@ -0,0 +1,185 @@
1
+ import { path } from 'd3-path';
2
+ import { interiorAngle } from '../core/angles.js';
3
+ import { add, angleOf, dist, fromPolar, lerp, normalLeft, scale as scaleVec, sub } from '../core/vec2.js';
4
+ import { boundsOfPoints } from './project.js';
5
+ import { resolveAnchor } from './props.js';
6
+ import { el, group, num, textEl } from './svg.js';
7
+ export const ARROW_MARKER_ID = 'asanakit-arrow';
8
+ export const arrowMarker = (color) => el('defs', {}, [
9
+ el('marker', {
10
+ id: ARROW_MARKER_ID,
11
+ viewBox: '0 0 10 10',
12
+ refX: 8,
13
+ refY: 5,
14
+ markerWidth: 5,
15
+ markerHeight: 5,
16
+ orient: 'auto-start-reverse',
17
+ markerUnits: 'strokeWidth',
18
+ }, [el('path', { d: 'M 0 0 L 10 5 L 0 10 z', fill: color })]),
19
+ ]);
20
+ const label = (text, at, ctx, color) => {
21
+ const { proj, style } = ctx;
22
+ const [x, y] = proj.p(at);
23
+ return textEl('text', {
24
+ x,
25
+ y,
26
+ fill: color ?? style.annotation.color,
27
+ 'font-family': style.annotation.fontFamily,
28
+ 'font-size': style.annotation.fontSize * proj.s,
29
+ 'dominant-baseline': 'middle',
30
+ }, text);
31
+ };
32
+ const strokeAttrs = ({ proj, style }, dashed, color) => ({
33
+ stroke: color ?? style.annotation.stroke,
34
+ 'stroke-width': style.annotation.strokeWidth * proj.s,
35
+ 'stroke-dasharray': dashed
36
+ ? style.annotation.dash
37
+ .split(' ')
38
+ .map((v) => num(Number(v) * proj.s))
39
+ .join(' ')
40
+ : undefined,
41
+ fill: 'none',
42
+ });
43
+ const angleArc = (a, ctx) => {
44
+ const { skeleton, proj } = ctx;
45
+ const centre = skeleton.landmarks[a.at];
46
+ const from = skeleton.landmarks[a.from];
47
+ const to = skeleton.landmarks[a.to];
48
+ const measured = interiorAngle(from, centre, to);
49
+ const a0 = angleOf(sub(from, centre));
50
+ const a1 = angleOf(sub(to, centre));
51
+ const r = a.radius * skeleton.scale;
52
+ const p = path();
53
+ const steps = 24;
54
+ for (let i = 0; i <= steps; i++) {
55
+ // Sweep the short way round, which is the way a joint angle is read.
56
+ const sweep = ((((a1 - a0) % 360) + 540) % 360) - 180;
57
+ const [px, py] = proj.p(add(centre, fromPolar(a0 + (sweep * i) / steps, r)));
58
+ if (i === 0)
59
+ p.moveTo(num(px), num(py));
60
+ else
61
+ p.lineTo(num(px), num(py));
62
+ }
63
+ const bisector = lerp(add(centre, fromPolar(a0, r)), add(centre, fromPolar(a1, r)), 0.5);
64
+ const labelAt = add(centre, scaleVec(sub(bisector, centre), 1.9));
65
+ const text = a.label ?? `${Math.round(measured)}°`;
66
+ return group({ 'data-annotation': 'angle', 'data-joint': a.at }, [
67
+ el('path', { d: p.toString(), ...strokeAttrs(ctx, false, a.color) }),
68
+ label(text, labelAt, ctx, a.color),
69
+ ]);
70
+ };
71
+ const alignmentLine = (a, ctx) => {
72
+ const { skeleton, proj } = ctx;
73
+ const from = resolveAnchor(a.from, skeleton);
74
+ const to = resolveAnchor(a.to, skeleton);
75
+ const d = sub(to, from);
76
+ const l = Math.max(dist(from, to), 1e-6);
77
+ const ext = scaleVec(d, a.extend / l);
78
+ const [x1, y1] = proj.p(sub(from, ext));
79
+ const [x2, y2] = proj.p(add(to, ext));
80
+ return group({ 'data-annotation': 'line' }, [
81
+ el('line', { x1, y1, x2, y2, ...strokeAttrs(ctx, a.dashed, a.color) }),
82
+ ...(a.label === undefined ? [] : [label(a.label, add(lerp(from, to, 0.5), scaleVec(normalLeft(from, to), 0.05)), ctx, a.color)]),
83
+ ]);
84
+ };
85
+ const plumbLine = (a, ctx) => {
86
+ const { skeleton, proj, content } = ctx;
87
+ const at = resolveAnchor(a.at, skeleton);
88
+ const [x1, y1] = proj.p([at[0], content.minY]);
89
+ const [x2, y2] = proj.p([at[0], content.maxY]);
90
+ return group({ 'data-annotation': 'plumb' }, [
91
+ el('line', { x1, y1, x2, y2, ...strokeAttrs(ctx, a.dashed, a.color) }),
92
+ ...(a.label === undefined ? [] : [label(a.label, [at[0] + 0.03, content.maxY], ctx, a.color)]),
93
+ ]);
94
+ };
95
+ const arrow = (a, ctx) => {
96
+ const { skeleton, proj } = ctx;
97
+ const from = resolveAnchor(a.from, skeleton);
98
+ const to = resolveAnchor(a.to, skeleton);
99
+ const mid = add(lerp(from, to, 0.5), scaleVec(normalLeft(from, to), a.curve));
100
+ const [x1, y1] = proj.p(from);
101
+ const [mx, my] = proj.p(mid);
102
+ const [x2, y2] = proj.p(to);
103
+ const p = path();
104
+ p.moveTo(num(x1), num(y1));
105
+ p.quadraticCurveTo(num(mx), num(my), num(x2), num(y2));
106
+ return group({ 'data-annotation': 'arrow' }, [
107
+ el('path', {
108
+ d: p.toString(),
109
+ ...strokeAttrs(ctx, false, a.color),
110
+ 'marker-end': `url(#${ARROW_MARKER_ID})`,
111
+ }),
112
+ ...(a.label === undefined ? [] : [label(a.label, mid, ctx, a.color)]),
113
+ ]);
114
+ };
115
+ const leaderLabel = (a, ctx) => {
116
+ const { skeleton, proj, style } = ctx;
117
+ const at = resolveAnchor(a.at, skeleton);
118
+ const target = add(at, a.offset);
119
+ const [x1, y1] = proj.p(at);
120
+ const [x2, y2] = proj.p(target);
121
+ const textAnchor = a.offset[0] < 0 ? 'end' : 'start';
122
+ const [tx, ty] = proj.p(add(target, [a.offset[0] < 0 ? -0.012 : 0.012, 0]));
123
+ return group({ 'data-annotation': 'label' }, [
124
+ el('line', { x1, y1, x2, y2, ...strokeAttrs(ctx, false, a.color) }),
125
+ el('circle', { cx: x1, cy: y1, r: 0.008 * proj.s, fill: a.color ?? style.annotation.accent }),
126
+ textEl('text', {
127
+ x: tx,
128
+ y: ty,
129
+ fill: a.color ?? style.annotation.color,
130
+ 'font-family': style.annotation.fontFamily,
131
+ 'font-size': style.annotation.fontSize * proj.s,
132
+ 'dominant-baseline': 'middle',
133
+ 'text-anchor': textAnchor,
134
+ }, a.text),
135
+ ]);
136
+ };
137
+ const dot = (a, ctx) => {
138
+ const { skeleton, proj, style } = ctx;
139
+ const at = resolveAnchor(a.at, skeleton);
140
+ const [cx, cy] = proj.p(at);
141
+ return group({ 'data-annotation': 'point' }, [
142
+ el('circle', { cx, cy, r: 0.012 * proj.s, fill: a.color ?? style.annotation.accent }),
143
+ ...(a.label === undefined ? [] : [label(a.label, add(at, [0.03, 0.02]), ctx, a.color)]),
144
+ ]);
145
+ };
146
+ const annotationPoints = (a, skeleton) => {
147
+ switch (a.type) {
148
+ case 'angle':
149
+ return [skeleton.landmarks[a.at]];
150
+ case 'line':
151
+ case 'arrow':
152
+ return [resolveAnchor(a.from, skeleton), resolveAnchor(a.to, skeleton)];
153
+ case 'plumb':
154
+ case 'point':
155
+ return [resolveAnchor(a.at, skeleton)];
156
+ case 'label':
157
+ return [resolveAnchor(a.at, skeleton), add(resolveAnchor(a.at, skeleton), a.offset)];
158
+ }
159
+ };
160
+ export const annotationsBounds = (annotations, skeleton) => {
161
+ const pts = annotations.flatMap((a) => annotationPoints(a, skeleton));
162
+ return pts.length === 0 ? null : boundsOfPoints(pts);
163
+ };
164
+ export const renderAnnotations = (ctx, annotations) => {
165
+ if (annotations.length === 0)
166
+ return null;
167
+ const nodes = annotations.map((a) => {
168
+ switch (a.type) {
169
+ case 'angle':
170
+ return angleArc(a, ctx);
171
+ case 'line':
172
+ return alignmentLine(a, ctx);
173
+ case 'plumb':
174
+ return plumbLine(a, ctx);
175
+ case 'arrow':
176
+ return arrow(a, ctx);
177
+ case 'label':
178
+ return leaderLabel(a, ctx);
179
+ case 'point':
180
+ return dot(a, ctx);
181
+ }
182
+ });
183
+ return group({ 'data-layer': 'annotations' }, nodes);
184
+ };
185
+ //# sourceMappingURL=annotations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"annotations.js","sourceRoot":"","sources":["../../src/render/annotations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { Bounds, Skeleton } from '../core/types.js';
2
+ import type { Projection } from './project.js';
3
+ import type { Style } from './styles.js';
4
+ /**
5
+ * Everything a draw function needs to put a shape on the canvas. Passing one
6
+ * context beats threading four arguments through every layer, and it keeps the
7
+ * layers honest: they read the scene, they never reach back into the pose.
8
+ */
9
+ export interface RenderContext {
10
+ readonly skeleton: Skeleton;
11
+ readonly proj: Projection;
12
+ readonly style: Style;
13
+ /** The full visible extent, used by annotations that span the whole frame. */
14
+ readonly content: Bounds;
15
+ }
16
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/render/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,8EAA8E;IAC9E,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/render/context.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
1
+ import type { RenderContext } from './context.js';
2
+ import { type SvgNode } from './svg.js';
3
+ /**
4
+ * Draw the figure back-to-front: far limbs, trunk, head, near limbs. That single
5
+ * ordering is what makes a profile pose read as a body rather than a tangle.
6
+ */
7
+ export declare const renderFigure: (ctx: RenderContext) => SvgNode;
8
+ //# sourceMappingURL=figure.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"figure.d.ts","sourceRoot":"","sources":["../../src/render/figure.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAa,KAAK,OAAO,EAAE,MAAM,UAAU,CAAC;AAmInD;;;GAGG;AACH,eAAO,MAAM,YAAY,GAAI,KAAK,aAAa,KAAG,OAejD,CAAC"}