@franzenzenhofer/asanakit 0.3.0 → 0.5.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.
- package/README.md +10 -3
- package/dist/anatomy/muscles.js +1 -1
- package/dist/anatomy/muscles.js.map +1 -1
- package/dist/cli/commands/export.js +1 -1
- package/dist/cli/commands/export.js.map +1 -1
- package/dist/cli/commands/info.js +1 -1
- package/dist/cli/commands/info.js.map +1 -1
- package/dist/cli/commands/render.d.ts.map +1 -1
- package/dist/cli/commands/render.js +24 -10
- package/dist/cli/commands/render.js.map +1 -1
- package/dist/cli/commands/view.d.ts.map +1 -1
- package/dist/cli/commands/view.js +1 -0
- package/dist/cli/commands/view.js.map +1 -1
- package/dist/core/camera.d.ts +6 -2
- package/dist/core/camera.d.ts.map +1 -1
- package/dist/core/camera.js +6 -2
- package/dist/core/camera.js.map +1 -1
- package/dist/core/joints.d.ts +5 -1
- package/dist/core/joints.d.ts.map +1 -1
- package/dist/core/joints.js +14 -2
- package/dist/core/joints.js.map +1 -1
- package/dist/core/types.d.ts +17 -1
- package/dist/core/types.d.ts.map +1 -1
- package/dist/model/schema.d.ts +29 -11
- package/dist/model/schema.d.ts.map +1 -1
- package/dist/model/schema.js +32 -9
- package/dist/model/schema.js.map +1 -1
- package/dist/props/geometry.d.ts +46 -0
- package/dist/props/geometry.d.ts.map +1 -0
- package/dist/props/geometry.js +87 -0
- package/dist/props/geometry.js.map +1 -0
- package/dist/render/camera.d.ts +2 -0
- package/dist/render/camera.d.ts.map +1 -1
- package/dist/render/camera.js +1 -0
- package/dist/render/camera.js.map +1 -1
- package/dist/render/figure.d.ts.map +1 -1
- package/dist/render/figure.js +3 -2
- package/dist/render/figure.js.map +1 -1
- package/dist/render/props.d.ts +1 -1
- package/dist/render/props.d.ts.map +1 -1
- package/dist/render/props.js +25 -10
- package/dist/render/props.js.map +1 -1
- package/dist/render/styles.d.ts +2 -0
- package/dist/render/styles.d.ts.map +1 -1
- package/dist/render/styles.js +7 -5
- package/dist/render/styles.js.map +1 -1
- package/dist/three/props.d.ts +11 -0
- package/dist/three/props.d.ts.map +1 -0
- package/dist/three/props.js +56 -0
- package/dist/three/props.js.map +1 -0
- package/dist/three/scene.d.ts +6 -1
- package/dist/three/scene.d.ts.map +1 -1
- package/dist/three/scene.js +23 -11
- package/dist/three/scene.js.map +1 -1
- package/dist/viewer/html.d.ts +2 -1
- package/dist/viewer/html.d.ts.map +1 -1
- package/dist/viewer/html.js +11 -3
- package/dist/viewer/html.js.map +1 -1
- package/dist/viewer/viewer.bundle.js +177 -177
- package/docs/AUTHORING.md +35 -9
- package/package.json +1 -1
- package/poses/yoga/ashtanga/prasarita-padottanasana-a.pose.yaml +1 -0
- package/poses/yoga/ashtanga/prasarita-padottanasana-c.pose.yaml +1 -0
- package/poses/yoga/ashtanga/utthita-parsvakonasana.pose.yaml +1 -0
- package/poses/yoga/ashtanga/utthita-trikonasana.pose.yaml +1 -0
- package/poses/yoga/ashtanga/virabhadrasana-b.pose.yaml +1 -0
|
@@ -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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"}
|
package/dist/three/scene.d.ts
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/three/scene.js
CHANGED
|
@@ -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, {
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
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
|
package/dist/three/scene.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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;
|
|
1
|
+
{"version":3,"file":"scene.js","sourceRoot":"","sources":["../../src/three/scene.ts"],"names":[],"mappings":"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"}
|
package/dist/viewer/html.d.ts
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import type { MuscleId } from '../anatomy/muscles.js';
|
|
2
2
|
import { type CameraAngles } from '../core/camera.js';
|
|
3
3
|
import type { Skeleton } from '../core/types.js';
|
|
4
|
-
import type { PoseSpec } from '../model/schema.js';
|
|
4
|
+
import type { PoseSpec, Prop } from '../model/schema.js';
|
|
5
5
|
export interface ViewerOptions {
|
|
6
6
|
readonly title: string;
|
|
7
7
|
readonly subtitle?: string | undefined;
|
|
8
8
|
readonly camera: CameraAngles;
|
|
9
9
|
readonly engaged?: readonly MuscleId[];
|
|
10
10
|
readonly stretched?: readonly MuscleId[];
|
|
11
|
+
readonly props?: readonly Prop[];
|
|
11
12
|
}
|
|
12
13
|
/** A pose together with its solved (possibly physics-settled) skeleton. */
|
|
13
14
|
export interface ShowcaseEntry {
|
|
@@ -1 +1 @@
|
|
|
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,MAAM,oBAAoB,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"}
|
package/dist/viewer/html.js
CHANGED
|
@@ -17,7 +17,12 @@ const loadBundle = async () => {
|
|
|
17
17
|
};
|
|
18
18
|
/** `</script>` inside inlined JSON or JS would end the tag; escape every `</`. */
|
|
19
19
|
const inline = (text) => text.replaceAll('</', '<\\/');
|
|
20
|
-
const escapeHtml = (text) => text
|
|
20
|
+
const escapeHtml = (text) => text
|
|
21
|
+
.replaceAll('&', '&')
|
|
22
|
+
.replaceAll('<', '<')
|
|
23
|
+
.replaceAll('>', '>')
|
|
24
|
+
.replaceAll('"', '"')
|
|
25
|
+
.replaceAll("'", ''');
|
|
21
26
|
const payloadFor = (entries, camera) => JSON.stringify({
|
|
22
27
|
poses: entries.map(({ pose, skeleton }) => ({
|
|
23
28
|
id: pose.id,
|
|
@@ -26,6 +31,7 @@ const payloadFor = (entries, camera) => JSON.stringify({
|
|
|
26
31
|
skeleton,
|
|
27
32
|
engaged: pose.muscles.engaged,
|
|
28
33
|
stretched: pose.muscles.stretched,
|
|
34
|
+
props: pose.props,
|
|
29
35
|
})),
|
|
30
36
|
camera,
|
|
31
37
|
});
|
|
@@ -56,7 +62,8 @@ const PAGE_STYLE = `
|
|
|
56
62
|
const card = (entry, svg, label) => {
|
|
57
63
|
const { pose } = entry;
|
|
58
64
|
const caption = label ?? `${escapeHtml(pose.name)}${pose.sanskrit === undefined ? '' : `<em>${escapeHtml(pose.sanskrit)}</em>`}`;
|
|
59
|
-
|
|
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>`;
|
|
60
67
|
};
|
|
61
68
|
/** For a single pose the gallery is the orbit: the same body through five cameras. */
|
|
62
69
|
const STRIP_CAMERAS = ['front', 'three-quarter', 'side', 'back', 'top'];
|
|
@@ -72,7 +79,7 @@ const galleryFor = (entries) => {
|
|
|
72
79
|
const navFor = (entries) => entries.length < 2
|
|
73
80
|
? ''
|
|
74
81
|
: `<nav>${entries
|
|
75
|
-
.map(({ pose }) => `<button data-asanakit-pose="${escapeHtml(pose.id)}"
|
|
82
|
+
.map(({ pose }) => `<button data-asanakit-pose="${escapeHtml(pose.id)}">${escapeHtml(pose.name)}</button>`)
|
|
76
83
|
.join('')}</nav>`;
|
|
77
84
|
/**
|
|
78
85
|
* ONE self-contained offline HTML file with everything asanakit can say about
|
|
@@ -126,6 +133,7 @@ export const buildViewerHtml = async (skeleton, options) => {
|
|
|
126
133
|
skeleton,
|
|
127
134
|
engaged: options.engaged ?? [],
|
|
128
135
|
stretched: options.stretched ?? [],
|
|
136
|
+
props: options.props ?? [],
|
|
129
137
|
},
|
|
130
138
|
],
|
|
131
139
|
camera: options.camera,
|
package/dist/viewer/html.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html.js","sourceRoot":"","sources":["../../src/viewer/html.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,EAAE,aAAa,EAA0C,MAAM,mBAAmB,CAAC;AAG1F,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"html.js","sourceRoot":"","sources":["../../src/viewer/html.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,EAAE,aAAa,EAA0C,MAAM,mBAAmB,CAAC;AAG1F,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAuB/C;;;;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;KACD,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC;KACxB,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC;KACvB,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC;KACvB,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC;KACzB,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;AAE9B,MAAM,UAAU,GAAG,CAAC,OAAiC,EAAE,MAAoB,EAAU,EAAE,CACrF,IAAI,CAAC,SAAS,CAAC;IACb,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;QAC1C,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,GAAG,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACnE,QAAQ;QACR,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO;QAC7B,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS;QACjC,KAAK,EAAE,IAAI,CAAC,KAAK;KAClB,CAAC,CAAC;IACH,MAAM;CACP,CAAC,CAAC;AAEL,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;;CAuBlB,CAAC;AAEF,MAAM,IAAI,GAAG,CAAC,KAAoB,EAAE,GAAW,EAAE,KAAc,EAAU,EAAE;IACzE,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;IACvB,MAAM,OAAO,GACX,KAAK,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;IACnH,0EAA0E;IAC1E,OAAO,2BAA2B,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,GAAG,eAAe,OAAO,wBAAwB,CAAC;AAC9G,CAAC,CAAC;AAEF,sFAAsF;AACtF,MAAM,aAAa,GAA8B,CAAC,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;AAEnG,MAAM,UAAU,GAAG,CAAC,OAAiC,EAAU,EAAE;IAC/D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAkB,CAAC;QAC1C,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAClC,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,CAAC,CAClH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;IACD,OAAO,OAAO;SACX,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;SACzG,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,MAAM,GAAG,CAAC,OAAiC,EAAU,EAAE,CAC3D,OAAO,CAAC,MAAM,GAAG,CAAC;IAChB,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,QAAQ,OAAO;SACZ,GAAG,CACF,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CACX,+BAA+B,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAC1F;SACA,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC;AAE1B;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EACpC,OAAiC,EACjC,UAA2B,EAAE,EACZ,EAAE;IACnB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IAC7E,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAkB,CAAC;IAC1C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,aAAa,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;IAC3G,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IACrF,MAAM,QAAQ,GACZ,OAAO,CAAC,MAAM,KAAK,CAAC;QAClB,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;QAC7B,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,oDAAoD,CAAC;IAE5E,OAAO;;;;;SAKA,UAAU,CAAC,KAAK,CAAC;SACjB,UAAU;;;cAGL,UAAU,CAAC,KAAK,CAAC,WAAW,UAAU,CAAC,QAAQ,CAAC;;EAE5D,MAAM,CAAC,OAAO,CAAC;;;;EAIf,UAAU,CAAC,OAAO,CAAC;;mCAEc,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;UAC5D,MAAM,CAAC,MAAM,CAAC;;;CAGvB,CAAC;AACF,CAAC,CAAC;AAEF,0FAA0F;AAC1F,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,KAAK,EAAE;YACL;gBACE,EAAE,EAAE,MAAM;gBACV,IAAI,EAAE,OAAO,CAAC,KAAK;gBACnB,GAAG,CAAC,OAAO,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC;gBACzE,QAAQ;gBACR,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE;gBAC9B,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,EAAE;gBAClC,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,EAAE;aAC3B;SACF;QACD,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,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;;;;;;;;;;;;;;;;wBAgBV,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,QAAQ;;mCAElC,MAAM,CAAC,OAAO,CAAC;UACxC,MAAM,CAAC,MAAM,CAAC;;;CAGvB,CAAC;AACF,CAAC,CAAC"}
|