@flighthq/node 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 (75) hide show
  1. package/dist/boundsRectangle.d.ts +26 -0
  2. package/dist/boundsRectangle.d.ts.map +1 -0
  3. package/dist/boundsRectangle.js +160 -0
  4. package/dist/boundsRectangle.js.map +1 -0
  5. package/dist/hasAppearance.d.ts +3 -0
  6. package/dist/hasAppearance.d.ts.map +1 -0
  7. package/dist/hasAppearance.js +6 -0
  8. package/dist/hasAppearance.js.map +1 -0
  9. package/dist/hasBoundsRectangle.d.ts +5 -0
  10. package/dist/hasBoundsRectangle.d.ts.map +1 -0
  11. package/dist/hasBoundsRectangle.js +9 -0
  12. package/dist/hasBoundsRectangle.js.map +1 -0
  13. package/dist/hasClip.d.ts +3 -0
  14. package/dist/hasClip.d.ts.map +1 -0
  15. package/dist/hasClip.js +4 -0
  16. package/dist/hasClip.js.map +1 -0
  17. package/dist/hasMaterial.d.ts +3 -0
  18. package/dist/hasMaterial.d.ts.map +1 -0
  19. package/dist/hasMaterial.js +5 -0
  20. package/dist/hasMaterial.js.map +1 -0
  21. package/dist/hasTransform2d.d.ts +4 -0
  22. package/dist/hasTransform2d.d.ts.map +1 -0
  23. package/dist/hasTransform2d.js +19 -0
  24. package/dist/hasTransform2d.js.map +1 -0
  25. package/dist/hasTransform3d.d.ts +5 -0
  26. package/dist/hasTransform3d.d.ts.map +1 -0
  27. package/dist/hasTransform3d.js +8 -0
  28. package/dist/hasTransform3d.js.map +1 -0
  29. package/dist/hierarchy.d.ts +127 -0
  30. package/dist/hierarchy.d.ts.map +1 -0
  31. package/dist/hierarchy.js +396 -0
  32. package/dist/hierarchy.js.map +1 -0
  33. package/dist/index.d.ts +15 -0
  34. package/dist/index.d.ts.map +1 -0
  35. package/dist/index.js +15 -0
  36. package/dist/index.js.map +1 -0
  37. package/dist/node.d.ts +21 -0
  38. package/dist/node.d.ts.map +1 -0
  39. package/dist/node.js +109 -0
  40. package/dist/node.js.map +1 -0
  41. package/dist/revision.d.ts +40 -0
  42. package/dist/revision.d.ts.map +1 -0
  43. package/dist/revision.js +85 -0
  44. package/dist/revision.js.map +1 -0
  45. package/dist/transform2d.d.ts +16 -0
  46. package/dist/transform2d.d.ts.map +1 -0
  47. package/dist/transform2d.js +99 -0
  48. package/dist/transform2d.js.map +1 -0
  49. package/dist/transform3d.d.ts +6 -0
  50. package/dist/transform3d.d.ts.map +1 -0
  51. package/dist/transform3d.js +45 -0
  52. package/dist/transform3d.js.map +1 -0
  53. package/dist/traversal.d.ts +51 -0
  54. package/dist/traversal.d.ts.map +1 -0
  55. package/dist/traversal.js +130 -0
  56. package/dist/traversal.js.map +1 -0
  57. package/dist/viewport.d.ts +8 -0
  58. package/dist/viewport.d.ts.map +1 -0
  59. package/dist/viewport.js +78 -0
  60. package/dist/viewport.js.map +1 -0
  61. package/package.json +40 -0
  62. package/src/boundsRectangle.test.ts +497 -0
  63. package/src/hasAppearance.test.ts +47 -0
  64. package/src/hasBoundsRectangle.test.ts +57 -0
  65. package/src/hasClip.test.ts +27 -0
  66. package/src/hasMaterial.test.ts +30 -0
  67. package/src/hasTransform2d.test.ts +67 -0
  68. package/src/hasTransform3d.test.ts +37 -0
  69. package/src/hierarchy.test.ts +973 -0
  70. package/src/node.test.ts +265 -0
  71. package/src/revision.test.ts +211 -0
  72. package/src/transform2d.test.ts +391 -0
  73. package/src/transform3d.test.ts +202 -0
  74. package/src/traversal.test.ts +233 -0
  75. package/src/viewport.test.ts +228 -0
@@ -0,0 +1,85 @@
1
+ import { getNodeRuntime } from './node';
2
+ export function computeNodeWorldTransformRevision(runtime, parentRuntime) {
3
+ const localTransformId = runtime.localTransformId;
4
+ const parentWorldTransformId = parentRuntime ? parentRuntime.worldTransformId : 0;
5
+ runtime.worldTransformUsingLocalTransformId = localTransformId;
6
+ runtime.worldTransformUsingParentTransformId = parentWorldTransformId;
7
+ runtime.worldTransformId = (localTransformId << 16) | (parentWorldTransformId & 0xffff);
8
+ }
9
+ export function getNodeAppearanceRevision(source) {
10
+ return getNodeRuntime(source).appearanceId;
11
+ }
12
+ export function getNodeLocalBoundsRevision(source) {
13
+ return getNodeRuntime(source).localBoundsId;
14
+ }
15
+ export function getNodeLocalContentRevision(source) {
16
+ return getNodeRuntime(source).localContentId;
17
+ }
18
+ export function getNodeLocalTransformRevision(source) {
19
+ return getNodeRuntime(source).localTransformId;
20
+ }
21
+ export function getNodeWorldTransformRevision(source) {
22
+ return getNodeRuntime(source).worldTransformId;
23
+ }
24
+ export function invalidateNode(target) {
25
+ invalidateNodeAppearance(target);
26
+ invalidateNodeLocalBounds(target);
27
+ invalidateNodeLocalContent(target);
28
+ invalidateNodeLocalTransform(target);
29
+ invalidateNodeParentReference(target);
30
+ invalidateNodeWorldBounds(target);
31
+ }
32
+ /**
33
+ * Target object's appearance changed (excluding transforms).
34
+ */
35
+ export function invalidateNodeAppearance(target) {
36
+ const runtime = getNodeRuntime(target);
37
+ runtime.appearanceId = (runtime.appearanceId + 1) >>> 0;
38
+ }
39
+ /**
40
+ * Target object's own dimensions (not including children) changed.
41
+ */
42
+ export function invalidateNodeLocalBounds(target) {
43
+ const runtime = getNodeRuntime(target);
44
+ runtime.localBoundsId = (runtime.localBoundsId + 1) >>> 0;
45
+ }
46
+ /**
47
+ * Target object's own drawable surface changed (the rasterizable payload — shape commands, text,
48
+ * pixels — not its children and not how it is composited). Renderers re-rasterize on this; the walk
49
+ * and render caches re-examine the node. Distinct from appearance (compositing) and bounds (extent).
50
+ */
51
+ export function invalidateNodeLocalContent(target) {
52
+ const runtime = getNodeRuntime(target);
53
+ runtime.localContentId = (runtime.localContentId + 1) >>> 0;
54
+ }
55
+ /**
56
+ * Target object's own transform (x, y, rotation, scaleX, scaleY) changed.
57
+ */
58
+ export function invalidateNodeLocalTransform(target) {
59
+ const runtime = getNodeRuntime(target);
60
+ runtime.localTransformId = (runtime.localTransformId + 1) >>> 0;
61
+ }
62
+ /**
63
+ * Target object's parent changed.
64
+ */
65
+ export function invalidateNodeParentReference(target) {
66
+ const runtime = getNodeRuntime(target);
67
+ runtime.worldTransformUsingParentTransformId = -1;
68
+ }
69
+ /**
70
+ * Target object's visual output changed (appearance or local transform).
71
+ * Use this when animating properties like alpha, x, y, scaleX, scaleY, rotation.
72
+ */
73
+ export function invalidateNodeRender(target) {
74
+ invalidateNodeAppearance(target);
75
+ invalidateNodeLocalTransform(target);
76
+ }
77
+ /**
78
+ * Target object's child bounds have changed.
79
+ */
80
+ export function invalidateNodeWorldBounds(target) {
81
+ const runtime = getNodeRuntime(target);
82
+ runtime.worldBoundsUsingWorldTransformId = -1;
83
+ runtime.worldBoundsUsingLocalBoundsId = -1;
84
+ }
85
+ //# sourceMappingURL=revision.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"revision.js","sourceRoot":"","sources":["../src/revision.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { Matrix, Transform2DNode, Vector2Like } from '@flighthq/types';
2
+ /**
3
+ * Converts the `vector` object from the Stage (global) coordinates
4
+ * to the display object's (local) coordinates.
5
+ **/
6
+ export declare function convertNodeVector2GlobalToLocal<Traits extends object>(out: Vector2Like, source: Transform2DNode<Traits>, vector: Readonly<Vector2Like>): void;
7
+ /**
8
+ * Converts the `vector` object from the display object's (local)
9
+ * coordinates to world coordinates.
10
+ **/
11
+ export declare function convertNodeVector2LocalToGlobal<Traits extends object>(out: Vector2Like, source: Transform2DNode<Traits>, vector: Readonly<Vector2Like>): void;
12
+ export declare function ensureNodeLocalTransformMatrix<Traits extends object>(target: Transform2DNode<Traits>): void;
13
+ export declare function ensureNodeWorldTransformMatrix<Traits extends object>(target: Transform2DNode<Traits>): void;
14
+ export declare function getNodeLocalTransformMatrix<Traits extends object>(target: Transform2DNode<Traits>): Readonly<Matrix>;
15
+ export declare function getNodeWorldTransformMatrix<Traits extends object>(target: Transform2DNode<Traits>): Readonly<Matrix>;
16
+ //# sourceMappingURL=transform2d.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform2d.d.ts","sourceRoot":"","sources":["../src/transform2d.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAyB,MAAM,EAAe,eAAe,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEhH;;;IAGI;AACJ,wBAAgB,+BAA+B,CAAC,MAAM,SAAS,MAAM,EACnE,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC,EAC/B,MAAM,EAAE,QAAQ,CAAC,WAAW,CAAC,GAC5B,IAAI,CAEN;AAED;;;IAGI;AACJ,wBAAgB,+BAA+B,CAAC,MAAM,SAAS,MAAM,EACnE,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC,EAC/B,MAAM,EAAE,QAAQ,CAAC,WAAW,CAAC,GAC5B,IAAI,CAEN;AAED,wBAAgB,8BAA8B,CAAC,MAAM,SAAS,MAAM,EAAE,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC,GAAG,IAAI,CAK3G;AAED,wBAAgB,8BAA8B,CAAC,MAAM,SAAS,MAAM,EAAE,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC,GAAG,IAAI,CAmB3G;AAED,wBAAgB,2BAA2B,CAAC,MAAM,SAAS,MAAM,EAAE,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAGpH;AAED,wBAAgB,2BAA2B,CAAC,MAAM,SAAS,MAAM,EAAE,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAGpH"}
@@ -0,0 +1,99 @@
1
+ import { getEntityRuntime } from '@flighthq/entity';
2
+ import { copyMatrix, createMatrix, inverseMatrixTransformPointXY, matrixTransformPointXY, multiplyMatrix, } from '@flighthq/geometry';
3
+ import { computeNodeWorldTransformRevision } from '@flighthq/node';
4
+ /**
5
+ * Converts the `vector` object from the Stage (global) coordinates
6
+ * to the display object's (local) coordinates.
7
+ **/
8
+ export function convertNodeVector2GlobalToLocal(out, source, vector) {
9
+ inverseMatrixTransformPointXY(out, getNodeWorldTransformMatrix(source), vector.x, vector.y);
10
+ }
11
+ /**
12
+ * Converts the `vector` object from the display object's (local)
13
+ * coordinates to world coordinates.
14
+ **/
15
+ export function convertNodeVector2LocalToGlobal(out, source, vector) {
16
+ matrixTransformPointXY(out, getNodeWorldTransformMatrix(source), vector.x, vector.y);
17
+ }
18
+ export function ensureNodeLocalTransformMatrix(target) {
19
+ const runtime = getEntityRuntime(target);
20
+ if (runtime.localTransformUsingLocalTransformId !== runtime.localTransformId) {
21
+ recomputeLocalTransform2D(target, runtime);
22
+ }
23
+ }
24
+ export function ensureNodeWorldTransformMatrix(target) {
25
+ const runtime = getEntityRuntime(target);
26
+ const parent = runtime.parent;
27
+ let parentRuntime;
28
+ let parentWorldTransformId = 0;
29
+ if (parent !== null) {
30
+ ensureNodeWorldTransformMatrix(parent);
31
+ parentRuntime = getEntityRuntime(parent);
32
+ parentWorldTransformId = parentRuntime.worldTransformId;
33
+ }
34
+ if (runtime.worldTransformUsingLocalTransformId !== runtime.localTransformId ||
35
+ runtime.worldTransformUsingParentTransformId !== parentWorldTransformId) {
36
+ recomputeWorldTransform2D(target, runtime, parentRuntime);
37
+ }
38
+ }
39
+ export function getNodeLocalTransformMatrix(target) {
40
+ ensureNodeLocalTransformMatrix(target);
41
+ return getEntityRuntime(target).localTransform2D;
42
+ }
43
+ export function getNodeWorldTransformMatrix(target) {
44
+ ensureNodeWorldTransformMatrix(target);
45
+ return getEntityRuntime(target).worldTransform2D;
46
+ }
47
+ function recomputeLocalTransform2D(target, runtime) {
48
+ if (target.rotation !== runtime.rotationAngle) {
49
+ // Normalize from -180 to 180
50
+ let angle = target.rotation % 360.0;
51
+ if (angle > 180.0) {
52
+ angle -= 360.0;
53
+ }
54
+ else if (angle < -180.0) {
55
+ angle += 360.0;
56
+ }
57
+ const rad = angle * DEG_TO_RAD;
58
+ const sin = Math.sin(rad);
59
+ const cos = Math.cos(rad);
60
+ runtime.rotationAngle = angle;
61
+ runtime.rotationSine = sin;
62
+ runtime.rotationCosine = cos;
63
+ }
64
+ if (runtime.localTransform2D === null)
65
+ runtime.localTransform2D = createMatrix();
66
+ const matrix = runtime.localTransform2D;
67
+ if (target.skewX === 0 && target.skewY === 0) {
68
+ matrix.a = runtime.rotationCosine * target.scaleX;
69
+ matrix.b = runtime.rotationSine * target.scaleX;
70
+ matrix.c = -runtime.rotationSine * target.scaleY;
71
+ matrix.d = runtime.rotationCosine * target.scaleY;
72
+ }
73
+ else {
74
+ const radY = (runtime.rotationAngle + target.skewY) * DEG_TO_RAD;
75
+ const radX = (runtime.rotationAngle + target.skewX) * DEG_TO_RAD;
76
+ matrix.a = Math.cos(radY) * target.scaleX;
77
+ matrix.b = Math.sin(radY) * target.scaleX;
78
+ matrix.c = -Math.sin(radX) * target.scaleY;
79
+ matrix.d = Math.cos(radX) * target.scaleY;
80
+ }
81
+ // Pivot: the local point (pivotX, pivotY) maps to (x, y). With pivot 0,0 this reduces to tx=x, ty=y.
82
+ matrix.tx = target.x - (matrix.a * target.pivotX + matrix.c * target.pivotY);
83
+ matrix.ty = target.y - (matrix.b * target.pivotX + matrix.d * target.pivotY);
84
+ runtime.localTransformUsingLocalTransformId = runtime.localTransformId;
85
+ }
86
+ function recomputeWorldTransform2D(target, runtime, parentRuntime) {
87
+ if (runtime.worldTransform2D === null)
88
+ runtime.worldTransform2D = createMatrix();
89
+ ensureNodeLocalTransformMatrix(target);
90
+ if (parentRuntime !== undefined) {
91
+ multiplyMatrix(runtime.worldTransform2D, parentRuntime.worldTransform2D, runtime.localTransform2D);
92
+ }
93
+ else {
94
+ copyMatrix(runtime.worldTransform2D, runtime.localTransform2D);
95
+ }
96
+ computeNodeWorldTransformRevision(runtime, parentRuntime);
97
+ }
98
+ const DEG_TO_RAD = Math.PI / 180;
99
+ //# sourceMappingURL=transform2d.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform2d.js","sourceRoot":"","sources":["../src/transform2d.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { Matrix4Like, Transform3DNode, Vector3Like } from '@flighthq/types';
2
+ export declare function convertNodeVector3GlobalToLocal<Traits extends object>(out: Vector3Like, source: Transform3DNode<Traits>, point: Readonly<Vector3Like>): void;
3
+ export declare function convertNodeVector3LocalToGlobal<Traits extends object>(out: Vector3Like, source: Transform3DNode<Traits>, point: Readonly<Vector3Like>): void;
4
+ export declare function ensureNodeWorldTransformMatrix4<Traits extends object>(target: Transform3DNode<Traits>): void;
5
+ export declare function getNodeWorldTransformMatrix4<Traits extends object>(target: Transform3DNode<Traits>): Readonly<Matrix4Like>;
6
+ //# sourceMappingURL=transform3d.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform3d.d.ts","sourceRoot":"","sources":["../src/transform3d.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAyB,WAAW,EAAe,eAAe,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAIrH,wBAAgB,+BAA+B,CAAC,MAAM,SAAS,MAAM,EACnE,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC,EAC/B,KAAK,EAAE,QAAQ,CAAC,WAAW,CAAC,GAC3B,IAAI,CAMN;AAED,wBAAgB,+BAA+B,CAAC,MAAM,SAAS,MAAM,EACnE,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC,EAC/B,KAAK,EAAE,QAAQ,CAAC,WAAW,CAAC,GAC3B,IAAI,CAEN;AAED,wBAAgB,+BAA+B,CAAC,MAAM,SAAS,MAAM,EAAE,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC,GAAG,IAAI,CAmB5G;AAED,wBAAgB,4BAA4B,CAAC,MAAM,SAAS,MAAM,EAChE,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC,GAC9B,QAAQ,CAAC,WAAW,CAAC,CAGvB"}
@@ -0,0 +1,45 @@
1
+ import { getEntityRuntime } from '@flighthq/entity';
2
+ import { acquireMatrix4, copyMatrix4, createMatrix4, inverseMatrix4, matrix4TransformPoint, multiplyMatrix4, releaseMatrix4, } from '@flighthq/geometry';
3
+ import { computeNodeWorldTransformRevision } from './revision';
4
+ export function convertNodeVector3GlobalToLocal(out, source, point) {
5
+ // Acquire from pool instead of allocating to avoid hot-path GC pressure.
6
+ const inv = acquireMatrix4();
7
+ inverseMatrix4(inv, getNodeWorldTransformMatrix4(source));
8
+ matrix4TransformPoint(out, inv, point);
9
+ releaseMatrix4(inv);
10
+ }
11
+ export function convertNodeVector3LocalToGlobal(out, source, point) {
12
+ matrix4TransformPoint(out, getNodeWorldTransformMatrix4(source), point);
13
+ }
14
+ export function ensureNodeWorldTransformMatrix4(target) {
15
+ const runtime = getEntityRuntime(target);
16
+ const parent = runtime.parent;
17
+ let parentRuntime;
18
+ let parentWorldTransformId = 0;
19
+ if (parent !== null) {
20
+ ensureNodeWorldTransformMatrix4(parent);
21
+ parentRuntime = getEntityRuntime(parent);
22
+ parentWorldTransformId = parentRuntime.worldTransformId;
23
+ }
24
+ if (runtime.worldTransformUsingLocalTransformId !== runtime.localTransformId ||
25
+ runtime.worldTransformUsingParentTransformId !== parentWorldTransformId) {
26
+ recomputeWorldTransform3D(target, runtime, parentRuntime);
27
+ }
28
+ }
29
+ export function getNodeWorldTransformMatrix4(target) {
30
+ ensureNodeWorldTransformMatrix4(target);
31
+ return getEntityRuntime(target).worldMatrix;
32
+ }
33
+ function recomputeWorldTransform3D(target, runtime, parentRuntime) {
34
+ if (runtime.worldMatrix === null) {
35
+ runtime.worldMatrix = createMatrix4();
36
+ }
37
+ if (parentRuntime !== undefined) {
38
+ multiplyMatrix4(runtime.worldMatrix, parentRuntime.worldMatrix, target.localMatrix);
39
+ }
40
+ else {
41
+ copyMatrix4(runtime.worldMatrix, target.localMatrix);
42
+ }
43
+ computeNodeWorldTransformRevision(runtime, parentRuntime);
44
+ }
45
+ //# sourceMappingURL=transform3d.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform3d.js","sourceRoot":"","sources":["../src/transform3d.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EACL,cAAc,EACd,WAAW,EACX,aAAa,EACb,cAAc,EACd,qBAAqB,EACrB,eAAe,EACf,cAAc,GACf,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,iCAAiC,EAAE,MAAM,YAAY,CAAC;AAE/D,MAAM,UAAU,+BAA+B,CAC7C,GAAgB,EAChB,MAA+B,EAC/B,KAA4B;IAE5B,yEAAyE;IACzE,MAAM,GAAG,GAAG,cAAc,EAAE,CAAC;IAC7B,cAAc,CAAC,GAAG,EAAE,4BAA4B,CAAC,MAAM,CAAC,CAAC,CAAC;IAC1D,qBAAqB,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IACvC,cAAc,CAAC,GAAG,CAAC,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,+BAA+B,CAC7C,GAAgB,EAChB,MAA+B,EAC/B,KAA4B;IAE5B,qBAAqB,CAAC,GAAG,EAAE,4BAA4B,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,+BAA+B,CAAwB,MAA+B;IACpG,MAAM,OAAO,GAAG,gBAAgB,CAAC,MAAM,CAAgD,CAAC;IACxF,MAAM,MAAM,GAAG,OAAO,CAAC,MAAwC,CAAC;IAEhE,IAAI,aAAwE,CAAC;IAC7E,IAAI,sBAAsB,GAAG,CAAC,CAAC;IAE/B,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,+BAA+B,CAAC,MAAM,CAAC,CAAC;QACxC,aAAa,GAAG,gBAAgB,CAAC,MAAM,CAAgD,CAAC;QACxF,sBAAsB,GAAG,aAAa,CAAC,gBAAgB,CAAC;IAC1D,CAAC;IAED,IACE,OAAO,CAAC,mCAAmC,KAAK,OAAO,CAAC,gBAAgB;QACxE,OAAO,CAAC,oCAAoC,KAAK,sBAAsB,EACvE,CAAC;QACD,yBAAyB,CAAC,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC;AAED,MAAM,UAAU,4BAA4B,CAC1C,MAA+B;IAE/B,+BAA+B,CAAC,MAAM,CAAC,CAAC;IACxC,OAAQ,gBAAgB,CAAC,MAAM,CAAiD,CAAC,WAAY,CAAC;AAChG,CAAC;AAED,SAAS,yBAAyB,CAChC,MAA+B,EAC/B,OAAoD,EACpD,aAAqE;IAErE,IAAI,OAAO,CAAC,WAAW,KAAK,IAAI,EAAE,CAAC;QACjC,OAAO,CAAC,WAAW,GAAG,aAAa,EAAE,CAAC;IACxC,CAAC;IAED,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QAChC,eAAe,CAAC,OAAO,CAAC,WAAW,EAAE,aAAa,CAAC,WAAY,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;IACvF,CAAC;SAAM,CAAC;QACN,WAAW,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;IACvD,CAAC;IAED,iCAAiC,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;AAC5D,CAAC"}
@@ -0,0 +1,51 @@
1
+ import type { Node, NodeDescendantVisitor, NodeOf, NodeTraits } from '@flighthq/types';
2
+ /**
3
+ * Finds the first descendant of `source` (depth-first pre-order) that satisfies `predicate`.
4
+ * Returns `null` if no descendant matches.
5
+ */
6
+ export declare function findNode<Traits extends object = NodeTraits>(source: Readonly<Node<Traits>>, predicate: (node: Node<Traits>) => boolean): NodeOf<Traits> | null;
7
+ /**
8
+ * Finds the first descendant of `source` (depth-first pre-order) with the given `name`. Searches
9
+ * the full subtree recursively, unlike `getNodeChildByName` which only checks direct children.
10
+ * Returns `null` if no descendant matches.
11
+ */
12
+ export declare function findNodeByName<Traits extends object = NodeTraits>(source: Readonly<Node<Traits>>, name: string): NodeOf<Traits> | null;
13
+ /**
14
+ * Walks upward from `source` toward the root, calling `callback` for each ancestor. If `callback`
15
+ * returns `false`, the walk stops early. The source node itself is not visited.
16
+ */
17
+ export declare function forEachNodeAncestor<Traits extends object = NodeTraits>(source: Readonly<Node<Traits>>, callback: (node: Node<Traits>) => boolean): void;
18
+ /**
19
+ * Calls `callback` for every descendant of `source` in depth-first pre-order. Unlike
20
+ * `walkNodeDescendants`, this variant never stops early — every descendant is visited regardless
21
+ * of the callback's return value.
22
+ */
23
+ export declare function forEachNodeDescendant<Traits extends object = NodeTraits>(source: Readonly<Node<Traits>>, callback: (node: Node<Traits>) => void): void;
24
+ /**
25
+ * Returns a read-only snapshot of the direct children of `source`. Returns an empty array if the
26
+ * node has no children. The returned array is a copy and safe to iterate while the graph mutates.
27
+ */
28
+ export declare function getNodeChildren<Traits extends object = NodeTraits>(source: Readonly<Node<Traits>>): readonly NodeOf<Traits>[];
29
+ /**
30
+ * Returns the depth of `source` in the tree: 0 for a root node (no parent), 1 for a direct child
31
+ * of the root, and so on.
32
+ */
33
+ export declare function getNodeDepth<Traits extends object = NodeTraits>(source: Readonly<Node<Traits>>): number;
34
+ /**
35
+ * Returns the next sibling of `source` (the child immediately after it in its parent's children
36
+ * array), or `null` if `source` is the last child or has no parent.
37
+ */
38
+ export declare function getNodeNextSibling<Traits extends object = NodeTraits>(source: Readonly<Node<Traits>>): NodeOf<Traits> | null;
39
+ /**
40
+ * Returns the previous sibling of `source` (the child immediately before it in its parent's
41
+ * children array), or `null` if `source` is the first child or has no parent.
42
+ */
43
+ export declare function getNodePreviousSibling<Traits extends object = NodeTraits>(source: Readonly<Node<Traits>>): NodeOf<Traits> | null;
44
+ /**
45
+ * Walks the descendants of `source` in depth-first pre-order, calling `visit` for each node.
46
+ * If `visit` returns `false`, the walk stops early (neither the current node's subtree nor any
47
+ * remaining siblings are visited). Returns `true` if the walk completed without early termination,
48
+ * `false` if it was cut short.
49
+ */
50
+ export declare function walkNodeDescendants<Traits extends object = NodeTraits>(source: Readonly<Node<Traits>>, visit: NodeDescendantVisitor<Traits>): boolean;
51
+ //# sourceMappingURL=traversal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traversal.d.ts","sourceRoot":"","sources":["../src/traversal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,qBAAqB,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAKvF;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,MAAM,SAAS,MAAM,GAAG,UAAU,EACzD,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAC9B,SAAS,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,OAAO,GACzC,MAAM,CAAC,MAAM,CAAC,GAAG,IAAI,CAUvB;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,MAAM,SAAS,MAAM,GAAG,UAAU,EAC/D,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAC9B,IAAI,EAAE,MAAM,GACX,MAAM,CAAC,MAAM,CAAC,GAAG,IAAI,CAEvB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,SAAS,MAAM,GAAG,UAAU,EACpE,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAC9B,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,OAAO,GACxC,IAAI,CAMN;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,SAAS,MAAM,GAAG,UAAU,EACtE,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAC9B,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,GACrC,IAAI,CAON;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,SAAS,MAAM,GAAG,UAAU,EAChE,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAC7B,SAAS,MAAM,CAAC,MAAM,CAAC,EAAE,CAI3B;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,SAAS,MAAM,GAAG,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAQvG;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,SAAS,MAAM,GAAG,UAAU,EACnE,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAC7B,MAAM,CAAC,MAAM,CAAC,GAAG,IAAI,CAQvB;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,SAAS,MAAM,GAAG,UAAU,EACvE,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAC7B,MAAM,CAAC,MAAM,CAAC,GAAG,IAAI,CAQvB;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,SAAS,MAAM,GAAG,UAAU,EACpE,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAC9B,KAAK,EAAE,qBAAqB,CAAC,MAAM,CAAC,GACnC,OAAO,CAST"}
@@ -0,0 +1,130 @@
1
+ import { getNodeParent } from './hierarchy';
2
+ import { getNodeRuntime } from './node';
3
+ /**
4
+ * Finds the first descendant of `source` (depth-first pre-order) that satisfies `predicate`.
5
+ * Returns `null` if no descendant matches.
6
+ */
7
+ export function findNode(source, predicate) {
8
+ const children = getNodeRuntime(source).children;
9
+ if (children === null)
10
+ return null;
11
+ for (let i = 0; i < children.length; i++) {
12
+ const child = children[i];
13
+ if (predicate(child))
14
+ return child;
15
+ const found = findNode(child, predicate);
16
+ if (found !== null)
17
+ return found;
18
+ }
19
+ return null;
20
+ }
21
+ /**
22
+ * Finds the first descendant of `source` (depth-first pre-order) with the given `name`. Searches
23
+ * the full subtree recursively, unlike `getNodeChildByName` which only checks direct children.
24
+ * Returns `null` if no descendant matches.
25
+ */
26
+ export function findNodeByName(source, name) {
27
+ return findNode(source, (node) => node.name === name);
28
+ }
29
+ /**
30
+ * Walks upward from `source` toward the root, calling `callback` for each ancestor. If `callback`
31
+ * returns `false`, the walk stops early. The source node itself is not visited.
32
+ */
33
+ export function forEachNodeAncestor(source, callback) {
34
+ let current = getNodeParent(source);
35
+ while (current !== null) {
36
+ if (!callback(current))
37
+ return;
38
+ current = getNodeParent(current);
39
+ }
40
+ }
41
+ /**
42
+ * Calls `callback` for every descendant of `source` in depth-first pre-order. Unlike
43
+ * `walkNodeDescendants`, this variant never stops early — every descendant is visited regardless
44
+ * of the callback's return value.
45
+ */
46
+ export function forEachNodeDescendant(source, callback) {
47
+ const children = getNodeRuntime(source).children;
48
+ if (children === null)
49
+ return;
50
+ for (let i = 0; i < children.length; i++) {
51
+ callback(children[i]);
52
+ forEachNodeDescendant(children[i], callback);
53
+ }
54
+ }
55
+ /**
56
+ * Returns a read-only snapshot of the direct children of `source`. Returns an empty array if the
57
+ * node has no children. The returned array is a copy and safe to iterate while the graph mutates.
58
+ */
59
+ export function getNodeChildren(source) {
60
+ const children = getNodeRuntime(source).children;
61
+ if (children === null)
62
+ return _emptyChildren;
63
+ return children.slice();
64
+ }
65
+ /**
66
+ * Returns the depth of `source` in the tree: 0 for a root node (no parent), 1 for a direct child
67
+ * of the root, and so on.
68
+ */
69
+ export function getNodeDepth(source) {
70
+ let depth = 0;
71
+ let current = getNodeParent(source);
72
+ while (current !== null) {
73
+ depth++;
74
+ current = getNodeParent(current);
75
+ }
76
+ return depth;
77
+ }
78
+ /**
79
+ * Returns the next sibling of `source` (the child immediately after it in its parent's children
80
+ * array), or `null` if `source` is the last child or has no parent.
81
+ */
82
+ export function getNodeNextSibling(source) {
83
+ const parent = getNodeParent(source);
84
+ if (parent === null)
85
+ return null;
86
+ const siblings = getNodeRuntime(parent).children;
87
+ if (siblings === null)
88
+ return null;
89
+ const idx = siblings.indexOf(source);
90
+ if (idx === -1 || idx === siblings.length - 1)
91
+ return null;
92
+ return siblings[idx + 1];
93
+ }
94
+ /**
95
+ * Returns the previous sibling of `source` (the child immediately before it in its parent's
96
+ * children array), or `null` if `source` is the first child or has no parent.
97
+ */
98
+ export function getNodePreviousSibling(source) {
99
+ const parent = getNodeParent(source);
100
+ if (parent === null)
101
+ return null;
102
+ const siblings = getNodeRuntime(parent).children;
103
+ if (siblings === null)
104
+ return null;
105
+ const idx = siblings.indexOf(source);
106
+ if (idx <= 0)
107
+ return null;
108
+ return siblings[idx - 1];
109
+ }
110
+ /**
111
+ * Walks the descendants of `source` in depth-first pre-order, calling `visit` for each node.
112
+ * If `visit` returns `false`, the walk stops early (neither the current node's subtree nor any
113
+ * remaining siblings are visited). Returns `true` if the walk completed without early termination,
114
+ * `false` if it was cut short.
115
+ */
116
+ export function walkNodeDescendants(source, visit) {
117
+ const children = getNodeRuntime(source).children;
118
+ if (children === null)
119
+ return true;
120
+ for (let i = 0; i < children.length; i++) {
121
+ const child = children[i];
122
+ if (!visit(child))
123
+ return false;
124
+ if (!walkNodeDescendants(child, visit))
125
+ return false;
126
+ }
127
+ return true;
128
+ }
129
+ const _emptyChildren = [];
130
+ //# sourceMappingURL=traversal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traversal.js","sourceRoot":"","sources":["../src/traversal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { MatrixLike, NodeTraits, Viewport, ViewportAlign } from '@flighthq/types';
2
+ export declare function computeViewportAlignX(scaledContentWidth: number, viewWidth: number, align: ViewportAlign): number;
3
+ export declare function computeViewportAlignY(scaledContentHeight: number, viewHeight: number, align: ViewportAlign): number;
4
+ export declare function computeViewportFillScale(contentWidth: number, contentHeight: number, viewWidth: number, viewHeight: number): number;
5
+ export declare function computeViewportFitScale(contentWidth: number, contentHeight: number, viewWidth: number, viewHeight: number): number;
6
+ export declare function computeViewportRenderTransform<Traits extends object = NodeTraits>(out: MatrixLike, scene: Viewport<Traits>, viewWidth: number, viewHeight: number): void;
7
+ export declare function createViewport<Traits extends object = NodeTraits>(obj?: Readonly<Partial<Viewport<Traits>>>): Viewport<Traits>;
8
+ //# sourceMappingURL=viewport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"viewport.d.ts","sourceRoot":"","sources":["../src/viewport.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,UAAU,EACV,UAAU,EAEV,QAAQ,EACR,aAAa,EACd,MAAM,iBAAiB,CAAC;AAIzB,wBAAgB,qBAAqB,CAAC,kBAAkB,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,MAAM,CAIjH;AAED,wBAAgB,qBAAqB,CAAC,mBAAmB,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,MAAM,CAInH;AAED,wBAAgB,wBAAwB,CACtC,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,MAAM,CAER;AAED,wBAAgB,uBAAuB,CACrC,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,MAAM,CAER;AAED,wBAAgB,8BAA8B,CAAC,MAAM,SAAS,MAAM,GAAG,UAAU,EAC/E,GAAG,EAAE,UAAU,EACf,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,EACvB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,IAAI,CA+CN;AAED,wBAAgB,cAAc,CAAC,MAAM,SAAS,MAAM,GAAG,UAAU,EAC/D,GAAG,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,GACxC,QAAQ,CAAC,MAAM,CAAC,CAMlB"}
@@ -0,0 +1,78 @@
1
+ import { createRectangle } from '@flighthq/geometry';
2
+ import { getNodeRuntime } from './node';
3
+ export function computeViewportAlignX(scaledContentWidth, viewWidth, align) {
4
+ if (align.includes('left'))
5
+ return 0;
6
+ if (align.includes('right'))
7
+ return viewWidth - scaledContentWidth;
8
+ return (viewWidth - scaledContentWidth) / 2;
9
+ }
10
+ export function computeViewportAlignY(scaledContentHeight, viewHeight, align) {
11
+ if (align.includes('top'))
12
+ return 0;
13
+ if (align.includes('bottom'))
14
+ return viewHeight - scaledContentHeight;
15
+ return (viewHeight - scaledContentHeight) / 2;
16
+ }
17
+ export function computeViewportFillScale(contentWidth, contentHeight, viewWidth, viewHeight) {
18
+ return Math.max(viewWidth / contentWidth, viewHeight / contentHeight);
19
+ }
20
+ export function computeViewportFitScale(contentWidth, contentHeight, viewWidth, viewHeight) {
21
+ return Math.min(viewWidth / contentWidth, viewHeight / contentHeight);
22
+ }
23
+ export function computeViewportRenderTransform(out, scene, viewWidth, viewHeight) {
24
+ let contentWidth = 0;
25
+ let contentHeight = 0;
26
+ if (scene.root !== null) {
27
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
28
+ const runtime = getNodeRuntime(scene.root);
29
+ if (runtime?.computeLocalBoundsRectangle !== undefined) {
30
+ _tempRectangle.width = 0;
31
+ _tempRectangle.height = 0;
32
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
33
+ runtime.computeLocalBoundsRectangle(_tempRectangle, scene.root);
34
+ contentWidth = _tempRectangle.width;
35
+ contentHeight = _tempRectangle.height;
36
+ }
37
+ }
38
+ if (contentWidth === 0 || contentHeight === 0) {
39
+ out.a = 1;
40
+ out.b = 0;
41
+ out.c = 0;
42
+ out.d = 1;
43
+ out.tx = 0;
44
+ out.ty = 0;
45
+ return;
46
+ }
47
+ let sx;
48
+ let sy;
49
+ if (scene.scaleMode === 'noscale') {
50
+ sx = 1;
51
+ sy = 1;
52
+ }
53
+ else if (scene.scaleMode === 'exactfit') {
54
+ sx = viewWidth / contentWidth;
55
+ sy = viewHeight / contentHeight;
56
+ }
57
+ else if (scene.scaleMode === 'showall') {
58
+ sx = sy = computeViewportFitScale(contentWidth, contentHeight, viewWidth, viewHeight);
59
+ }
60
+ else {
61
+ sx = sy = computeViewportFillScale(contentWidth, contentHeight, viewWidth, viewHeight);
62
+ }
63
+ out.a = sx;
64
+ out.b = 0;
65
+ out.c = 0;
66
+ out.d = sy;
67
+ out.tx = computeViewportAlignX(contentWidth * sx, viewWidth, scene.align);
68
+ out.ty = computeViewportAlignY(contentHeight * sy, viewHeight, scene.align);
69
+ }
70
+ export function createViewport(obj) {
71
+ return {
72
+ align: obj?.align ?? 'topleft',
73
+ root: obj?.root ?? null,
74
+ scaleMode: obj?.scaleMode ?? 'noscale',
75
+ };
76
+ }
77
+ const _tempRectangle = createRectangle();
78
+ //# sourceMappingURL=viewport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"viewport.js","sourceRoot":"","sources":["../src/viewport.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "@flighthq/node",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./dist/index.d.ts",
10
+ "default": "./dist/index.js"
11
+ }
12
+ },
13
+ "files": [
14
+ "dist",
15
+ "src/**/*.test.ts",
16
+ "!dist/**/*.test.js",
17
+ "!dist/**/*.test.d.ts",
18
+ "!dist/**/*.test.js.map",
19
+ "!dist/**/*.test.d.ts.map"
20
+ ],
21
+ "scripts": {
22
+ "build": "tsc -b",
23
+ "clean": "tsc -b --clean",
24
+ "test": "vitest run --config vitest.config.ts",
25
+ "test:watch": "vitest --watch --config vitest.config.ts",
26
+ "prepack": "npm run clean && npm run clean:dist && npm run build",
27
+ "clean:dist": "tsx ../../scripts/clean-package-dist.ts"
28
+ },
29
+ "dependencies": {
30
+ "@flighthq/entity": "0.1.0",
31
+ "@flighthq/geometry": "0.1.0",
32
+ "@flighthq/signals": "0.1.0",
33
+ "@flighthq/types": "0.1.0"
34
+ },
35
+ "devDependencies": {
36
+ "typescript": "^5.3.0"
37
+ },
38
+ "description": "Base scene graph: transform hierarchy, bounds, appearance traits, child management",
39
+ "sideEffects": false
40
+ }