@franzenzenhofer/asanakit 0.2.0 → 0.4.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 (62) hide show
  1. package/README.md +16 -3
  2. package/dist/cli/commands/export.js +1 -1
  3. package/dist/cli/commands/export.js.map +1 -1
  4. package/dist/cli/commands/info.js +1 -1
  5. package/dist/cli/commands/info.js.map +1 -1
  6. package/dist/cli/commands/render.d.ts.map +1 -1
  7. package/dist/cli/commands/render.js +34 -11
  8. package/dist/cli/commands/render.js.map +1 -1
  9. package/dist/cli/commands/view.d.ts.map +1 -1
  10. package/dist/cli/commands/view.js +51 -2
  11. package/dist/cli/commands/view.js.map +1 -1
  12. package/dist/core/joints.d.ts +5 -1
  13. package/dist/core/joints.d.ts.map +1 -1
  14. package/dist/core/joints.js +14 -2
  15. package/dist/core/joints.js.map +1 -1
  16. package/dist/core/types.d.ts +17 -1
  17. package/dist/core/types.d.ts.map +1 -1
  18. package/dist/model/schema.d.ts +29 -11
  19. package/dist/model/schema.d.ts.map +1 -1
  20. package/dist/model/schema.js +33 -10
  21. package/dist/model/schema.js.map +1 -1
  22. package/dist/props/geometry.d.ts +44 -0
  23. package/dist/props/geometry.d.ts.map +1 -0
  24. package/dist/props/geometry.js +85 -0
  25. package/dist/props/geometry.js.map +1 -0
  26. package/dist/render/camera.d.ts +2 -0
  27. package/dist/render/camera.d.ts.map +1 -1
  28. package/dist/render/camera.js +1 -0
  29. package/dist/render/camera.js.map +1 -1
  30. package/dist/render/figure.d.ts.map +1 -1
  31. package/dist/render/figure.js +3 -2
  32. package/dist/render/figure.js.map +1 -1
  33. package/dist/render/props.d.ts +1 -1
  34. package/dist/render/props.d.ts.map +1 -1
  35. package/dist/render/props.js +25 -10
  36. package/dist/render/props.js.map +1 -1
  37. package/dist/render/styles.d.ts +2 -0
  38. package/dist/render/styles.d.ts.map +1 -1
  39. package/dist/render/styles.js +7 -5
  40. package/dist/render/styles.js.map +1 -1
  41. package/dist/three/props.d.ts +11 -0
  42. package/dist/three/props.d.ts.map +1 -0
  43. package/dist/three/props.js +56 -0
  44. package/dist/three/props.js.map +1 -0
  45. package/dist/three/scene.d.ts +6 -1
  46. package/dist/three/scene.d.ts.map +1 -1
  47. package/dist/three/scene.js +23 -11
  48. package/dist/three/scene.js.map +1 -1
  49. package/dist/viewer/html.d.ts +21 -4
  50. package/dist/viewer/html.d.ts.map +1 -1
  51. package/dist/viewer/html.js +119 -7
  52. package/dist/viewer/html.js.map +1 -1
  53. package/dist/viewer/viewer.bundle.js +177 -177
  54. package/docs/AUTHORING.md +35 -9
  55. package/package.json +1 -2
  56. package/poses/yoga/ashtanga/prasarita-padottanasana-a.pose.yaml +1 -0
  57. package/poses/yoga/ashtanga/prasarita-padottanasana-c.pose.yaml +1 -0
  58. package/poses/yoga/ashtanga/samasthiti.pose.yaml +1 -1
  59. package/poses/yoga/ashtanga/urdhva-hastasana.pose.yaml +1 -1
  60. package/poses/yoga/ashtanga/utthita-parsvakonasana.pose.yaml +1 -0
  61. package/poses/yoga/ashtanga/utthita-trikonasana.pose.yaml +1 -0
  62. package/poses/yoga/ashtanga/virabhadrasana-b.pose.yaml +1 -0
@@ -1 +1 @@
1
- {"version":3,"file":"styles.js","sourceRoot":"","sources":["../../src/render/styles.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"styles.js","sourceRoot":"","sources":["../../src/render/styles.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Prop meshes for the three.js scene (viewer and GLB export), built from the
3
+ * same world-space geometry the 2D renderer projects - one definition of a
4
+ * mat or a surfboard, every output agrees.
5
+ */
6
+ import { type Object3D } from 'three';
7
+ import type { Skeleton } from '../core/types.js';
8
+ import type { Prop } from '../model/schema.js';
9
+ /** The props that exist as honest 3D objects; the rest are 2D diagram furniture. */
10
+ export declare const buildPropMeshes: (props: readonly Prop[], skeleton: Skeleton) => Object3D[];
11
+ //# sourceMappingURL=props.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"props.d.ts","sourceRoot":"","sources":["../../src/three/props.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAQL,KAAK,QAAQ,EACd,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAoD/C,oFAAoF;AACpF,eAAO,MAAM,eAAe,GAAI,OAAO,SAAS,IAAI,EAAE,EAAE,UAAU,QAAQ,KAAG,QAAQ,EAKjF,CAAC"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Prop meshes for the three.js scene (viewer and GLB export), built from the
3
+ * same world-space geometry the 2D renderer projects - one definition of a
4
+ * mat or a surfboard, every output agrees.
5
+ */
6
+ import { BoxGeometry, ExtrudeGeometry, Mesh, MeshStandardMaterial, Quaternion, Shape, Vector3, } from 'three';
7
+ import { degToRad } from '../core/angles.js';
8
+ import { BOARD_PLAN, matModel, surfboardModel } from '../props/geometry.js';
9
+ const MAT_COLOR = '#9fb8c8';
10
+ const BOARD_COLOR = '#efe9da';
11
+ const X = new Vector3(1, 0, 0);
12
+ const Y = new Vector3(0, 1, 0);
13
+ const material = (color) => new MeshStandardMaterial({ color, roughness: 0.85, metalness: 0 });
14
+ const matMesh = (prop, skeleton) => {
15
+ const model = matModel(prop, skeleton);
16
+ const mesh = new Mesh(new BoxGeometry(model.width, model.thickness, model.length), material(MAT_COLOR));
17
+ mesh.name = 'prop:mat';
18
+ mesh.position.set(model.centre[0], model.centre[1], model.centre[2]);
19
+ mesh.rotation.y = degToRad(model.yaw);
20
+ return mesh;
21
+ };
22
+ const surfboardMesh = (prop, skeleton) => {
23
+ const model = surfboardModel(prop, skeleton);
24
+ // Shape space: x along the board, y across; extrusion adds z (thickness).
25
+ const plan = new Shape();
26
+ BOARD_PLAN.forEach(([u, v], i) => {
27
+ const x = u * model.length;
28
+ const y = v * model.width;
29
+ if (i === 0)
30
+ plan.moveTo(x, y);
31
+ else
32
+ plan.lineTo(x, y);
33
+ });
34
+ plan.closePath();
35
+ const mesh = new Mesh(new ExtrudeGeometry(plan, { depth: model.thickness, bevelEnabled: false }), material(BOARD_COLOR));
36
+ mesh.name = 'prop:surfboard';
37
+ // Lay the plan flat: shape-x (along) -> world +z, shape-y (across) -> world
38
+ // +x, extrusion -> up. Then pitch the nose up by `rotation`.
39
+ const flat = new Quaternion()
40
+ .setFromAxisAngle(Y, -Math.PI / 2)
41
+ .multiply(new Quaternion().setFromAxisAngle(X, -Math.PI / 2));
42
+ mesh.quaternion.copy(new Quaternion().setFromAxisAngle(X, -degToRad(model.pitch)).multiply(flat));
43
+ // The deck (top of the extrusion) sits at the model's centre height.
44
+ mesh.position.set(model.centre[0], model.centre[1], model.centre[2]);
45
+ mesh.translateZ(-model.thickness); // in shape space: pull the deck up to the centre
46
+ return mesh;
47
+ };
48
+ /** The props that exist as honest 3D objects; the rest are 2D diagram furniture. */
49
+ export const buildPropMeshes = (props, skeleton) => props.flatMap((prop) => {
50
+ if (prop.type === 'mat')
51
+ return [matMesh(prop, skeleton)];
52
+ if (prop.type === 'surfboard')
53
+ return [surfboardMesh(prop, skeleton)];
54
+ return [];
55
+ });
56
+ //# sourceMappingURL=props.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"props.js","sourceRoot":"","sources":["../../src/three/props.ts"],"names":[],"mappings":"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"}
@@ -7,11 +7,16 @@
7
7
  import { Group } from 'three';
8
8
  import { type MuscleId } from '../anatomy/muscles.js';
9
9
  import type { Skeleton } from '../core/types.js';
10
+ import type { Prop } from '../model/schema.js';
10
11
  export interface FigureSceneOptions {
11
- /** Bone capsule color; a light theme's ink. */
12
+ /** Bone capsule color for the right side and the centre; a light theme's ink. */
12
13
  readonly color?: string;
14
+ /** The left side renders its own color, so profiles tell left from right. */
15
+ readonly leftColor?: string;
13
16
  readonly engaged?: readonly MuscleId[];
14
17
  readonly stretched?: readonly MuscleId[];
18
+ /** Props with real 3D geometry (mat, surfboard) join the scene. */
19
+ readonly props?: readonly Prop[];
15
20
  }
16
21
  /**
17
22
  * Build the stick figure as a group of capsules and spheres, y-up, feet on
@@ -1 +1 @@
1
- {"version":3,"file":"scene.d.ts","sourceRoot":"","sources":["../../src/three/scene.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAEL,KAAK,EAMN,MAAM,OAAO,CAAC;AACf,OAAO,EAAW,KAAK,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,KAAK,EAAU,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAGzD,MAAM,WAAW,kBAAkB;IACjC,+CAA+C;IAC/C,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,QAAQ,EAAE,CAAC;IACvC,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,QAAQ,EAAE,CAAC;CAC1C;AA4ED;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAAI,UAAU,QAAQ,EAAE,UAAS,kBAAuB,KAAG,KA8BvF,CAAC"}
1
+ {"version":3,"file":"scene.d.ts","sourceRoot":"","sources":["../../src/three/scene.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAEL,KAAK,EAMN,MAAM,OAAO,CAAC;AACf,OAAO,EAAW,KAAK,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,KAAK,EAAU,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEzD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAG/C,MAAM,WAAW,kBAAkB;IACjC,iFAAiF;IACjF,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,6EAA6E;IAC7E,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,QAAQ,EAAE,CAAC;IACvC,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,QAAQ,EAAE,CAAC;IACzC,mEAAmE;IACnE,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,IAAI,EAAE,CAAC;CAClC;AA2FD;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAAI,UAAU,QAAQ,EAAE,UAAS,kBAAuB,KAAG,KA+BvF,CAAC"}
@@ -7,6 +7,7 @@
7
7
  import { CapsuleGeometry, Group, Mesh, MeshStandardMaterial, Quaternion, SphereGeometry, Vector3, } from 'three';
8
8
  import { MUSCLES } from '../anatomy/muscles.js';
9
9
  import { midpoint3, sub3, len3 } from '../core/vec3.js';
10
+ import { buildPropMeshes } from './props.js';
10
11
  const BONE_RADIUS = 0.016;
11
12
  const HEAD_RADIUS = 0.055;
12
13
  const JOINT_RADIUS = 0.02;
@@ -14,6 +15,7 @@ const JOINT_RADIUS = 0.02;
14
15
  const CAPSULE_SEGMENTS = { cap: 6, radial: 12 };
15
16
  const SPHERE_SEGMENTS = { width: 24, height: 16 };
16
17
  const DEFAULT_COLOR = '#1a1a1a';
18
+ const LEFT_COLOR = '#6b6b6b';
17
19
  const ENGAGED_COLOR = '#c0392b';
18
20
  const STRETCHED_COLOR = '#2471a3';
19
21
  const REST_AXIS = new Vector3(0, 1, 0);
@@ -56,6 +58,16 @@ const headMesh = (skeleton, mat) => {
56
58
  head.scale.set(0.82, 1.18, 0.9); // An ellipsoid skull, not a ball.
57
59
  return head;
58
60
  };
61
+ const addJointSpheres = (group, skeleton, mats) => {
62
+ for (const [id, p] of Object.entries(skeleton.landmarks)) {
63
+ if (id === 'headCenter' || id === 'headTop')
64
+ continue;
65
+ const joint = new Mesh(new SphereGeometry(JOINT_RADIUS * skeleton.scale, 12, 8), id.endsWith('L') ? mats.left : mats.base);
66
+ joint.name = `joint:${id}`;
67
+ joint.position.set(p[0], p[1], p[2]);
68
+ group.add(joint);
69
+ }
70
+ };
59
71
  /**
60
72
  * Build the stick figure as a group of capsules and spheres, y-up, feet on
61
73
  * y = 0, about one unit tall - exactly the solver's world space, so the GLB
@@ -65,26 +77,26 @@ export const buildFigureScene = (skeleton, options = {}) => {
65
77
  const group = new Group();
66
78
  group.name = 'asanakit-figure';
67
79
  const base = material(options.color ?? DEFAULT_COLOR);
80
+ const left = material(options.leftColor ?? LEFT_COLOR);
68
81
  const engagedMat = material(ENGAGED_COLOR);
69
82
  const stretchedMat = material(STRETCHED_COLOR);
70
83
  const engaged = muscleBones(options.engaged ?? []);
71
84
  const stretched = muscleBones(options.stretched ?? []);
72
85
  const scale = skeleton.scale;
73
- const materialFor = (id) => engaged.has(id) ? engagedMat : stretched.has(id) ? stretchedMat : base;
86
+ const materialFor = (id, side) => engaged.has(id) ? engagedMat : stretched.has(id) ? stretchedMat : side === 'left' ? left : base;
74
87
  for (const bone of Object.values(skeleton.bones)) {
75
88
  if (bone.id === 'head')
76
89
  continue; // The head is a sphere, not a stick.
77
- group.add(boneMesh(bone.start, bone.end, { radius: BONE_RADIUS * scale, mat: materialFor(bone.id), name: `bone:${bone.id}` }));
78
- }
79
- group.add(headMesh(skeleton, materialFor('head')));
80
- for (const [id, p] of Object.entries(skeleton.landmarks)) {
81
- if (id === 'headCenter' || id === 'headTop')
82
- continue;
83
- const joint = new Mesh(new SphereGeometry(JOINT_RADIUS * scale, 12, 8), base);
84
- joint.name = `joint:${id}`;
85
- joint.position.set(p[0], p[1], p[2]);
86
- group.add(joint);
90
+ group.add(boneMesh(bone.start, bone.end, {
91
+ radius: BONE_RADIUS * scale,
92
+ mat: materialFor(bone.id, bone.side),
93
+ name: `bone:${bone.id}`,
94
+ }));
87
95
  }
96
+ group.add(headMesh(skeleton, materialFor('head', 'center')));
97
+ addJointSpheres(group, skeleton, { left, base });
98
+ for (const mesh of buildPropMeshes(options.props ?? [], skeleton))
99
+ group.add(mesh);
88
100
  return group;
89
101
  };
90
102
  //# sourceMappingURL=scene.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"scene.js","sourceRoot":"","sources":["../../src/three/scene.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scene.js","sourceRoot":"","sources":["../../src/three/scene.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EACL,eAAe,EACf,KAAK,EACL,IAAI,EACJ,oBAAoB,EACpB,UAAU,EACV,cAAc,EACd,OAAO,GACR,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,OAAO,EAAiB,MAAM,uBAAuB,CAAC;AAE/D,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAa,MAAM,iBAAiB,CAAC;AAEnE,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAa7C,MAAM,WAAW,GAAG,KAAK,CAAC;AAC1B,MAAM,WAAW,GAAG,KAAK,CAAC;AAC1B,MAAM,YAAY,GAAG,IAAI,CAAC;AAE1B,+EAA+E;AAC/E,MAAM,gBAAgB,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAW,CAAC;AACzD,MAAM,eAAe,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAW,CAAC;AAE3D,MAAM,aAAa,GAAG,SAAS,CAAC;AAChC,MAAM,UAAU,GAAG,SAAS,CAAC;AAC7B,MAAM,aAAa,GAAG,SAAS,CAAC;AAChC,MAAM,eAAe,GAAG,SAAS,CAAC;AAElC,MAAM,SAAS,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAEvC,mDAAmD;AACnD,MAAM,WAAW,GAAG,CAAC,GAAwB,EAAe,EAAE;IAC5D,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;QACrB,MAAM,IAAI,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC;QAC9B,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YAChF,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,GAAa,CAAC,CAAC;YAChC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,GAAa,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,QAAQ,GAAG,CAAC,KAAa,EAAwB,EAAE,CACvD,IAAI,oBAAoB,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;AAQrE,MAAM,WAAW,GAAG,CAAC,IAAU,EAAE,IAAU,EAAQ,EAAE;IACnD,IAAI,CAAC,UAAU,CAAC,IAAI,CAClB,IAAI,UAAU,EAAE,CAAC,kBAAkB,CAAC,SAAS,EAAE,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CACnG,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,QAAQ,GAAG,CAAC,KAAW,EAAE,GAAS,EAAE,IAAkB,EAAQ,EAAE;IACpE,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,MAAM,QAAQ,GAAG,IAAI,eAAe,CAClC,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,EACtB,gBAAgB,CAAC,GAAG,EACpB,gBAAgB,CAAC,MAAM,CACxB,CAAC;IACF,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACtB,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAClC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1C,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACxB,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,QAAQ,GAAG,CAAC,QAAkB,EAAE,GAAyB,EAAQ,EAAE;IACvE,MAAM,IAAI,GAAG,IAAI,IAAI,CACnB,IAAI,cAAc,CAAC,WAAW,GAAG,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAC,KAAK,EAAE,eAAe,CAAC,MAAM,CAAC,EAC/F,GAAG,CACJ,CAAC;IACF,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;IACxB,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,CAAC,UAAU,CAAC;IAC7C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAC5E,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,kCAAkC;IACnE,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CACtB,KAAY,EACZ,QAAkB,EAClB,IAAgE,EAC1D,EAAE;IACR,KAAK,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACzD,IAAI,EAAE,KAAK,YAAY,IAAI,EAAE,KAAK,SAAS;YAAE,SAAS;QACtD,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,IAAI,cAAc,CAAC,YAAY,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3H,KAAK,CAAC,IAAI,GAAG,SAAS,EAAE,EAAE,CAAC;QAC3B,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACrC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACnB,CAAC;AACH,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,QAAkB,EAAE,UAA8B,EAAE,EAAS,EAAE;IAC9F,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC;IAC1B,KAAK,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAE/B,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,IAAI,aAAa,CAAC,CAAC;IACtD,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,IAAI,UAAU,CAAC,CAAC;IACvD,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC;IAC3C,MAAM,YAAY,GAAG,QAAQ,CAAC,eAAe,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;IACnD,MAAM,SAAS,GAAG,WAAW,CAAC,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;IACvD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;IAE7B,MAAM,WAAW,GAAG,CAAC,EAAU,EAAE,IAAiC,EAAwB,EAAE,CAC1F,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IAElG,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,IAAI,IAAI,CAAC,EAAE,KAAK,MAAM;YAAE,SAAS,CAAC,qCAAqC;QACvE,KAAK,CAAC,GAAG,CACP,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE;YAC7B,MAAM,EAAE,WAAW,GAAG,KAAK;YAC3B,GAAG,EAAE,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC;YACpC,IAAI,EAAE,QAAQ,IAAI,CAAC,EAAE,EAAE;SACxB,CAAC,CACH,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC7D,eAAe,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACjD,KAAK,MAAM,IAAI,IAAI,eAAe,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,EAAE,QAAQ,CAAC;QAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAEnF,OAAO,KAAK,CAAC;AACf,CAAC,CAAC"}
@@ -1,16 +1,33 @@
1
- import type { CameraAngles } from '../core/camera.js';
2
- import type { Skeleton } from '../core/types.js';
3
1
  import type { MuscleId } from '../anatomy/muscles.js';
2
+ import { type CameraAngles } from '../core/camera.js';
3
+ import type { Skeleton } from '../core/types.js';
4
+ import type { PoseSpec, Prop } from '../model/schema.js';
4
5
  export interface ViewerOptions {
5
6
  readonly title: string;
6
7
  readonly subtitle?: string | undefined;
7
8
  readonly camera: CameraAngles;
8
9
  readonly engaged?: readonly MuscleId[];
9
10
  readonly stretched?: readonly MuscleId[];
11
+ readonly props?: readonly Prop[];
12
+ }
13
+ /** A pose together with its solved (possibly physics-settled) skeleton. */
14
+ export interface ShowcaseEntry {
15
+ readonly pose: PoseSpec;
16
+ readonly skeleton: Skeleton;
17
+ }
18
+ export interface ShowcaseOptions {
19
+ readonly title?: string;
20
+ /** Starting viewpoint for the interactive viewer. */
21
+ readonly camera?: CameraAngles;
10
22
  }
11
23
  /**
12
- * A single self-contained offline HTML file: the solved skeleton as JSON plus
13
- * the prebuilt three.js viewer bundle. No CDN, no network, works from file://.
24
+ * ONE self-contained offline HTML file with everything asanakit can say about
25
+ * the given poses: an interactive 3D viewer (orbit, zoom, pan; pose picker
26
+ * when there is more than one) above a gallery of deterministic inline SVG
27
+ * renders - the orbit strip for a single pose, one card per pose otherwise.
28
+ * No CDN, no network, works from file://.
14
29
  */
30
+ export declare const buildShowcaseHtml: (entries: readonly ShowcaseEntry[], options?: ShowcaseOptions) => Promise<string>;
31
+ /** A fullscreen interactive viewer for one solved skeleton (the `asanakit view` page). */
15
32
  export declare const buildViewerHtml: (skeleton: Skeleton, options: ViewerOptions) => Promise<string>;
16
33
  //# sourceMappingURL=html.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../../src/viewer/html.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEtD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,QAAQ,EAAE,CAAC;IACvC,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,QAAQ,EAAE,CAAC;CAC1C;AAuBD;;;GAGG;AACH,eAAO,MAAM,eAAe,GAAU,UAAU,QAAQ,EAAE,SAAS,aAAa,KAAG,OAAO,CAAC,MAAM,CAqChG,CAAC"}
1
+ {"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../../src/viewer/html.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAiB,KAAK,YAAY,EAAuB,MAAM,mBAAmB,CAAC;AAC1F,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAGzD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,QAAQ,EAAE,CAAC;IACvC,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,QAAQ,EAAE,CAAC;IACzC,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,IAAI,EAAE,CAAC;CAClC;AAED,2EAA2E;AAC3E,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;CAC7B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,qDAAqD;IACrD,QAAQ,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC;CAChC;AAoGD;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,GAC5B,SAAS,SAAS,aAAa,EAAE,EACjC,UAAS,eAAoB,KAC5B,OAAO,CAAC,MAAM,CAiChB,CAAC;AAEF,0FAA0F;AAC1F,eAAO,MAAM,eAAe,GAAU,UAAU,QAAQ,EAAE,SAAS,aAAa,KAAG,OAAO,CAAC,MAAM,CA+ChG,CAAC"}
@@ -1,4 +1,6 @@
1
1
  import { readFile } from 'node:fs/promises';
2
+ import { resolveCamera } from '../core/camera.js';
3
+ import { renderSvg } from '../render/scene.js';
2
4
  /**
3
5
  * Both the compiled module (dist/viewer/html.js) and the tsx-run source
4
6
  * (src/viewer/html.ts) sit two levels below the package root, so one relative
@@ -15,18 +17,126 @@ const loadBundle = async () => {
15
17
  };
16
18
  /** `</script>` inside inlined JSON or JS would end the tag; escape every `</`. */
17
19
  const inline = (text) => text.replaceAll('</', '<\\/');
18
- const escapeHtml = (text) => text.replaceAll('&', '&amp;').replaceAll('<', '&lt;').replaceAll('>', '&gt;');
20
+ const escapeHtml = (text) => text
21
+ .replaceAll('&', '&amp;')
22
+ .replaceAll('<', '&lt;')
23
+ .replaceAll('>', '&gt;')
24
+ .replaceAll('"', '&quot;')
25
+ .replaceAll("'", '&#39;');
26
+ const payloadFor = (entries, camera) => JSON.stringify({
27
+ poses: entries.map(({ pose, skeleton }) => ({
28
+ id: pose.id,
29
+ name: pose.name,
30
+ ...(pose.sanskrit === undefined ? {} : { sanskrit: pose.sanskrit }),
31
+ skeleton,
32
+ engaged: pose.muscles.engaged,
33
+ stretched: pose.muscles.stretched,
34
+ props: pose.props,
35
+ })),
36
+ camera,
37
+ });
38
+ const PAGE_STYLE = `
39
+ :root { color-scheme: light; }
40
+ html, body { margin: 0; background: #ffffff; color: #1a1a1a;
41
+ font-family: -apple-system, "Segoe UI", Helvetica, Arial, sans-serif; }
42
+ header { padding: 26px 32px 10px; }
43
+ header h1 { margin: 0; font-size: 24px; }
44
+ header p { margin: 4px 0 0; color: #777; font-size: 14px; }
45
+ .stage { display: flex; gap: 0; border-top: 1px solid #eee; border-bottom: 1px solid #eee; }
46
+ nav { width: 230px; max-height: 560px; overflow-y: auto; border-right: 1px solid #eee; padding: 10px 0; }
47
+ nav button { display: block; width: 100%; text-align: left; border: 0; background: none;
48
+ padding: 7px 18px; font-size: 13px; color: #444; cursor: pointer; }
49
+ nav button:hover { background: #f5f5f5; }
50
+ nav button.active { background: #eef4fb; color: #1a5b9e; font-weight: 600; }
51
+ #asanakit-3d { flex: 1; height: 560px; position: relative; }
52
+ #asanakit-3d canvas { display: block; }
53
+ .hint { position: absolute; right: 16px; bottom: 10px; font-size: 11px; color: #aaa; pointer-events: none; }
54
+ .gallery { display: grid; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
55
+ gap: 18px; padding: 26px 32px 44px; }
56
+ figure { margin: 0; border: 1px solid #eee; border-radius: 10px; padding: 10px; cursor: pointer; }
57
+ figure:hover { border-color: #bcd2e8; }
58
+ figure svg { width: 100%; height: auto; display: block; }
59
+ figcaption { text-align: center; font-size: 13px; margin-top: 6px; color: #444; }
60
+ figcaption em { display: block; color: #999; font-size: 11px; font-style: italic; }
61
+ `;
62
+ const card = (entry, svg, label) => {
63
+ const { pose } = entry;
64
+ const caption = label ?? `${escapeHtml(pose.name)}${pose.sanskrit === undefined ? '' : `<em>${escapeHtml(pose.sanskrit)}</em>`}`;
65
+ // No inline handlers: the bundle binds clicks to [data-pose-card] itself.
66
+ return `<figure data-pose-card="${escapeHtml(pose.id)}">${svg}<figcaption>${caption}</figcaption></figure>`;
67
+ };
68
+ /** For a single pose the gallery is the orbit: the same body through five cameras. */
69
+ const STRIP_CAMERAS = ['front', 'three-quarter', 'side', 'back', 'top'];
70
+ const galleryFor = (entries) => {
71
+ if (entries.length === 1) {
72
+ const entry = entries[0];
73
+ return STRIP_CAMERAS.map((preset) => card(entry, renderSvg(entry.pose, { skeleton: entry.skeleton, camera: preset, width: 300, height: 360 }), preset)).join('\n');
74
+ }
75
+ return entries
76
+ .map((entry) => card(entry, renderSvg(entry.pose, { skeleton: entry.skeleton, width: 300, height: 360 })))
77
+ .join('\n');
78
+ };
79
+ const navFor = (entries) => entries.length < 2
80
+ ? ''
81
+ : `<nav>${entries
82
+ .map(({ pose }) => `<button data-asanakit-pose="${escapeHtml(pose.id)}">${escapeHtml(pose.name)}</button>`)
83
+ .join('')}</nav>`;
19
84
  /**
20
- * A single self-contained offline HTML file: the solved skeleton as JSON plus
21
- * the prebuilt three.js viewer bundle. No CDN, no network, works from file://.
85
+ * ONE self-contained offline HTML file with everything asanakit can say about
86
+ * the given poses: an interactive 3D viewer (orbit, zoom, pan; pose picker
87
+ * when there is more than one) above a gallery of deterministic inline SVG
88
+ * renders - the orbit strip for a single pose, one card per pose otherwise.
89
+ * No CDN, no network, works from file://.
22
90
  */
91
+ export const buildShowcaseHtml = async (entries, options = {}) => {
92
+ if (entries.length === 0)
93
+ throw new Error('Nothing to show: no poses given');
94
+ const bundle = await loadBundle();
95
+ const first = entries[0];
96
+ const camera = options.camera ?? resolveCamera(entries.length === 1 ? first.pose.camera : 'three-quarter');
97
+ const title = options.title ?? (entries.length === 1 ? first.pose.name : 'asanakit');
98
+ const subtitle = entries.length === 1
99
+ ? (first.pose.sanskrit ?? '')
100
+ : `${entries.length} postures - drag to orbit, click a pose to load it`;
101
+ return `<!DOCTYPE html>
102
+ <html lang="en">
103
+ <head>
104
+ <meta charset="utf-8">
105
+ <meta name="viewport" content="width=device-width, initial-scale=1">
106
+ <title>${escapeHtml(title)} - asanakit</title>
107
+ <style>${PAGE_STYLE}</style>
108
+ </head>
109
+ <body>
110
+ <header><h1>${escapeHtml(title)}</h1><p>${escapeHtml(subtitle)}</p></header>
111
+ <div class="stage">
112
+ ${navFor(entries)}
113
+ <div id="asanakit-3d"><span class="hint">drag to orbit &middot; scroll to zoom &middot; right-drag to pan</span></div>
114
+ </div>
115
+ <div class="gallery">
116
+ ${galleryFor(entries)}
117
+ </div>
118
+ <script>window.ASANAKIT_VIEWER = ${inline(payloadFor(entries, camera))};</script>
119
+ <script>${inline(bundle)}</script>
120
+ </body>
121
+ </html>
122
+ `;
123
+ };
124
+ /** A fullscreen interactive viewer for one solved skeleton (the `asanakit view` page). */
23
125
  export const buildViewerHtml = async (skeleton, options) => {
24
126
  const bundle = await loadBundle();
25
127
  const payload = JSON.stringify({
26
- skeleton,
128
+ poses: [
129
+ {
130
+ id: 'pose',
131
+ name: options.title,
132
+ ...(options.subtitle === undefined ? {} : { sanskrit: options.subtitle }),
133
+ skeleton,
134
+ engaged: options.engaged ?? [],
135
+ stretched: options.stretched ?? [],
136
+ props: options.props ?? [],
137
+ },
138
+ ],
27
139
  camera: options.camera,
28
- engaged: options.engaged ?? [],
29
- stretched: options.stretched ?? [],
30
140
  });
31
141
  const subtitle = options.subtitle === undefined ? '' : `<em>${escapeHtml(options.subtitle)}</em>`;
32
142
  return `<!DOCTYPE html>
@@ -37,7 +147,8 @@ export const buildViewerHtml = async (skeleton, options) => {
37
147
  <title>${escapeHtml(options.title)} - asanakit</title>
38
148
  <style>
39
149
  html, body { margin: 0; height: 100%; overflow: hidden; background: #ffffff; }
40
- canvas { display: block; }
150
+ #asanakit-3d { position: fixed; inset: 0; }
151
+ #asanakit-3d canvas { display: block; }
41
152
  #hud {
42
153
  position: fixed; top: 14px; left: 18px; z-index: 1;
43
154
  font-family: -apple-system, "Segoe UI", Helvetica, Arial, sans-serif; color: #1a1a1a;
@@ -50,6 +161,7 @@ export const buildViewerHtml = async (skeleton, options) => {
50
161
  </head>
51
162
  <body>
52
163
  <div id="hud"><strong>${escapeHtml(options.title)}</strong>${subtitle}<span>drag to orbit &middot; scroll to zoom &middot; right-drag to pan</span></div>
164
+ <div id="asanakit-3d"></div>
53
165
  <script>window.ASANAKIT_VIEWER = ${inline(payload)};</script>
54
166
  <script>${inline(bundle)}</script>
55
167
  </body>
@@ -1 +1 @@
1
- {"version":3,"file":"html.js","sourceRoot":"","sources":["../../src/viewer/html.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAa5C;;;;GAIG;AACH,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,oCAAoC,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAElF,MAAM,UAAU,GAAG,KAAK,IAAqB,EAAE;IAC7C,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,qFAAqF,CAAC,CAAC;IACzG,CAAC;AACH,CAAC,CAAC;AAEF,kFAAkF;AAClF,MAAM,MAAM,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAEvE,MAAM,UAAU,GAAG,CAAC,IAAY,EAAU,EAAE,CAC1C,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AAEhF;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,EAAE,QAAkB,EAAE,OAAsB,EAAmB,EAAE;IACnG,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC;QAC7B,QAAQ;QACR,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE;QAC9B,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,EAAE;KACnC,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IAElG,OAAO;;;;;SAKA,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC;;;;;;;;;;;;;;;wBAeV,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,QAAQ;mCAClC,MAAM,CAAC,OAAO,CAAC;UACxC,MAAM,CAAC,MAAM,CAAC;;;CAGvB,CAAC;AACF,CAAC,CAAC"}
1
+ {"version":3,"file":"html.js","sourceRoot":"","sources":["../../src/viewer/html.ts"],"names":[],"mappings":"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"}