@mathscan/geometry-engine 0.1.0 → 0.1.1

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 (238) hide show
  1. package/README.md +24 -7
  2. package/dist/core.cjs +1 -1
  3. package/dist/core.mjs +4 -4
  4. package/dist/entries/core.d.cts +1 -1
  5. package/dist/entries/core.d.ts +1 -1
  6. package/dist/entries/core.d.ts.map +1 -1
  7. package/dist/exercise.schema-Bma3qN9P.js +251 -0
  8. package/dist/exercise.schema-Bma3qN9P.js.map +1 -0
  9. package/dist/exercise.schema-Oj5ZH-yO.cjs +2 -0
  10. package/dist/exercise.schema-Oj5ZH-yO.cjs.map +1 -0
  11. package/dist/exerciseLoad-Db9Cigxi.cjs +2 -0
  12. package/dist/exerciseLoad-Db9Cigxi.cjs.map +1 -0
  13. package/dist/{geometryAttemptStatus-5L_q6-9l.js → exerciseLoad-DgeDXYbf.js} +84 -71
  14. package/dist/exerciseLoad-DgeDXYbf.js.map +1 -0
  15. package/dist/geometry/entities/angle.d.cts +56 -0
  16. package/dist/geometry/entities/angle.d.ts +57 -0
  17. package/dist/geometry/entities/angle.d.ts.map +1 -0
  18. package/dist/geometry/entities/circle.d.ts.map +1 -1
  19. package/dist/geometry/entities/index.d.cts +8 -4
  20. package/dist/geometry/entities/index.d.ts +8 -4
  21. package/dist/geometry/entities/index.d.ts.map +1 -1
  22. package/dist/geometry/entities/line.d.ts.map +1 -1
  23. package/dist/geometry/entities/point.d.ts.map +1 -1
  24. package/dist/geometry/entities/relations.d.cts +8 -1
  25. package/dist/geometry/entities/relations.d.ts +8 -1
  26. package/dist/geometry/entities/relations.d.ts.map +1 -1
  27. package/dist/geometry/entities/segment.d.ts.map +1 -1
  28. package/dist/geometry/entityModel.d.cts +21 -3
  29. package/dist/geometry/entityModel.d.ts +21 -3
  30. package/dist/geometry/entityModel.d.ts.map +1 -1
  31. package/dist/geometryState.schema-B5ccMKDa.cjs +2 -0
  32. package/dist/geometryState.schema-B5ccMKDa.cjs.map +1 -0
  33. package/dist/geometryState.schema-CKFPlX8j.js +1177 -0
  34. package/dist/geometryState.schema-CKFPlX8j.js.map +1 -0
  35. package/dist/goals-BlSeniyt.js +563 -0
  36. package/dist/goals-BlSeniyt.js.map +1 -0
  37. package/dist/goals-DLbmBZD8.cjs +2 -0
  38. package/dist/goals-DLbmBZD8.cjs.map +1 -0
  39. package/dist/index.cjs +1 -1
  40. package/dist/index.mjs +8 -8
  41. package/dist/measure/angleType.d.cts +2 -0
  42. package/dist/measure/angleType.d.ts +3 -0
  43. package/dist/measure/angleType.d.ts.map +1 -0
  44. package/dist/measure/geometryAdapter.d.cts +3 -0
  45. package/dist/measure/geometryAdapter.d.ts +3 -0
  46. package/dist/measure/geometryAdapter.d.ts.map +1 -1
  47. package/dist/react-B26_e52I.cjs +2 -0
  48. package/dist/react-B26_e52I.cjs.map +1 -0
  49. package/dist/{react-BEcdx1f6.js → react-B5cGaxH8.js} +738 -513
  50. package/dist/react-B5cGaxH8.js.map +1 -0
  51. package/dist/react.cjs +1 -1
  52. package/dist/react.mjs +1 -1
  53. package/dist/renderer/GeometryCanvas.d.ts.map +1 -1
  54. package/dist/renderer/StudentGeometryCanvas.d.ts.map +1 -1
  55. package/dist/renderer/Toolbar.d.ts.map +1 -1
  56. package/dist/renderer/angleMeasure.d.cts +14 -0
  57. package/dist/renderer/angleMeasure.d.ts +15 -0
  58. package/dist/renderer/angleMeasure.d.ts.map +1 -0
  59. package/dist/renderer/deriveRenderableGeometry.d.cts +1 -0
  60. package/dist/renderer/deriveRenderableGeometry.d.ts +1 -0
  61. package/dist/renderer/deriveRenderableGeometry.d.ts.map +1 -1
  62. package/dist/renderer/deriveSemanticScene.d.ts.map +1 -1
  63. package/dist/renderer/dragSnap.d.cts +14 -0
  64. package/dist/renderer/dragSnap.d.ts +15 -0
  65. package/dist/renderer/dragSnap.d.ts.map +1 -0
  66. package/dist/renderer/shapes/AngleShape.d.cts +19 -0
  67. package/dist/renderer/shapes/AngleShape.d.ts +20 -0
  68. package/dist/renderer/shapes/AngleShape.d.ts.map +1 -0
  69. package/dist/renderer/shapes/EntityLabel.d.cts +9 -1
  70. package/dist/renderer/shapes/EntityLabel.d.ts +9 -1
  71. package/dist/renderer/shapes/EntityLabel.d.ts.map +1 -1
  72. package/dist/renderer/shapes/EntityShape.d.cts +2 -1
  73. package/dist/renderer/shapes/EntityShape.d.ts +2 -1
  74. package/dist/renderer/shapes/EntityShape.d.ts.map +1 -1
  75. package/dist/renderer/useConnectionPreview.d.cts +12 -1
  76. package/dist/renderer/useConnectionPreview.d.ts +12 -1
  77. package/dist/renderer/useConnectionPreview.d.ts.map +1 -1
  78. package/dist/renderer/usePointerGestures.d.cts +1 -1
  79. package/dist/renderer/usePointerGestures.d.ts +1 -1
  80. package/dist/renderer/usePointerGestures.d.ts.map +1 -1
  81. package/dist/schemas/entityDefinition.schema.d.cts +7 -0
  82. package/dist/schemas/entityDefinition.schema.d.ts +7 -0
  83. package/dist/schemas/entityDefinition.schema.d.ts.map +1 -1
  84. package/dist/schemas/entityDocument.d.cts +34 -13
  85. package/dist/schemas/entityDocument.d.ts +34 -13
  86. package/dist/schemas/entityDocument.d.ts.map +1 -1
  87. package/dist/schemas/entityPresentation.schema.d.cts +3 -0
  88. package/dist/schemas/entityPresentation.schema.d.ts +3 -0
  89. package/dist/schemas/entityPresentation.schema.d.ts.map +1 -1
  90. package/dist/schemas/exercise.schema.d.cts +80 -2
  91. package/dist/schemas/exercise.schema.d.ts +80 -2
  92. package/dist/schemas/exercise.schema.d.ts.map +1 -1
  93. package/dist/schemas/exerciseV2.schema.d.cts +57 -0
  94. package/dist/schemas/exerciseV2.schema.d.ts +57 -0
  95. package/dist/schemas/exerciseV2.schema.d.ts.map +1 -1
  96. package/dist/schemas/exerciseV4.schema.d.cts +168 -0
  97. package/dist/schemas/exerciseV4.schema.d.ts +169 -0
  98. package/dist/schemas/exerciseV4.schema.d.ts.map +1 -0
  99. package/dist/schemas/geometryState.schema.d.cts +8 -0
  100. package/dist/schemas/geometryState.schema.d.ts +8 -0
  101. package/dist/schemas/geometryState.schema.d.ts.map +1 -1
  102. package/dist/schemas/goals/angleBisectorGoal.schema.d.cts +15 -0
  103. package/dist/schemas/goals/angleBisectorGoal.schema.d.ts +16 -0
  104. package/dist/schemas/goals/angleBisectorGoal.schema.d.ts.map +1 -0
  105. package/dist/schemas/goals/angleCriterion.schema.d.cts +28 -0
  106. package/dist/schemas/goals/angleCriterion.schema.d.ts +29 -0
  107. package/dist/schemas/goals/angleCriterion.schema.d.ts.map +1 -0
  108. package/dist/schemas/goals/angleMeasureGoal.schema.d.cts +26 -0
  109. package/dist/schemas/goals/angleMeasureGoal.schema.d.ts +27 -0
  110. package/dist/schemas/goals/angleMeasureGoal.schema.d.ts.map +1 -0
  111. package/dist/schemas/goals/createGoal.schema.d.cts +1 -0
  112. package/dist/schemas/goals/createGoal.schema.d.ts +1 -0
  113. package/dist/schemas/goals/createGoal.schema.d.ts.map +1 -1
  114. package/dist/schemas/goals/geometryGoal.schema.d.cts +61 -0
  115. package/dist/schemas/goals/geometryGoal.schema.d.ts +61 -0
  116. package/dist/schemas/goals/geometryGoal.schema.d.ts.map +1 -1
  117. package/dist/schemas/goals/givenAngleGoal.schema.d.cts +35 -0
  118. package/dist/schemas/goals/givenAngleGoal.schema.d.ts +36 -0
  119. package/dist/schemas/goals/givenAngleGoal.schema.d.ts.map +1 -0
  120. package/dist/schemas/goals/goalKindDeclaration.d.cts +7 -0
  121. package/dist/schemas/goals/goalKindDeclaration.d.ts +7 -0
  122. package/dist/schemas/goals/goalKindDeclaration.d.ts.map +1 -1
  123. package/dist/schemas/goals/parallelGoal.schema.d.cts +1 -0
  124. package/dist/schemas/goals/parallelGoal.schema.d.ts +1 -0
  125. package/dist/schemas/goals/parallelGoal.schema.d.ts.map +1 -1
  126. package/dist/schemas/goals/perpendicularGoal.schema.d.cts +1 -0
  127. package/dist/schemas/goals/perpendicularGoal.schema.d.ts +1 -0
  128. package/dist/schemas/goals/perpendicularGoal.schema.d.ts.map +1 -1
  129. package/dist/schemas/goals/throughPointsGoal.schema.d.cts +1 -0
  130. package/dist/schemas/goals/throughPointsGoal.schema.d.ts +1 -0
  131. package/dist/schemas/goals/throughPointsGoal.schema.d.ts.map +1 -1
  132. package/dist/schemas/objectTypeName.schema.d.cts +1 -0
  133. package/dist/schemas/objectTypeName.schema.d.ts +1 -0
  134. package/dist/schemas/objectTypeName.schema.d.ts.map +1 -1
  135. package/dist/schemas/v2ToV3.d.cts +15 -1
  136. package/dist/schemas/v2ToV3.d.ts +15 -1
  137. package/dist/schemas/v2ToV3.d.ts.map +1 -1
  138. package/dist/schemas/v3ToV4.d.cts +2 -1
  139. package/dist/schemas/v3ToV4.d.ts +2 -1
  140. package/dist/schemas/v3ToV4.d.ts.map +1 -1
  141. package/dist/schemas/v4ToV5.d.cts +7 -0
  142. package/dist/schemas/v4ToV5.d.ts +8 -0
  143. package/dist/schemas/v4ToV5.d.ts.map +1 -0
  144. package/dist/schemas.cjs +1 -1
  145. package/dist/schemas.mjs +3 -3
  146. package/dist/snapping/computeDragSnap.d.cts +30 -0
  147. package/dist/snapping/computeDragSnap.d.ts +31 -0
  148. package/dist/snapping/computeDragSnap.d.ts.map +1 -0
  149. package/dist/state/geometryContext.d.ts.map +1 -1
  150. package/dist/store/attemptChange.d.cts +1 -1
  151. package/dist/store/attemptChange.d.ts +1 -1
  152. package/dist/store/attemptChange.d.ts.map +1 -1
  153. package/dist/store/constructionCommand.d.cts +14 -2
  154. package/dist/store/constructionCommand.d.ts +14 -2
  155. package/dist/store/constructionCommand.d.ts.map +1 -1
  156. package/dist/store/constructionIdentity.d.cts +9 -0
  157. package/dist/store/constructionIdentity.d.ts +9 -0
  158. package/dist/store/constructionIdentity.d.ts.map +1 -1
  159. package/dist/store/studentStore.d.cts +7 -0
  160. package/dist/store/studentStore.d.ts +7 -0
  161. package/dist/store/studentStore.d.ts.map +1 -1
  162. package/dist/store/teacherStore.d.cts +16 -0
  163. package/dist/store/teacherStore.d.ts +16 -0
  164. package/dist/store/teacherStore.d.ts.map +1 -1
  165. package/dist/{studentStore-CEKTtMCh.js → studentStore-CyYa0N93.js} +502 -370
  166. package/dist/studentStore-CyYa0N93.js.map +1 -0
  167. package/dist/studentStore-ubldy4PJ.cjs +2 -0
  168. package/dist/studentStore-ubldy4PJ.cjs.map +1 -0
  169. package/dist/validation/getGeometryExerciseWarnings.d.cts +3 -2
  170. package/dist/validation/getGeometryExerciseWarnings.d.ts +3 -2
  171. package/dist/validation/getGeometryExerciseWarnings.d.ts.map +1 -1
  172. package/dist/validation/goals/angleBisector.d.cts +3 -0
  173. package/dist/validation/goals/angleBisector.d.ts +4 -0
  174. package/dist/validation/goals/angleBisector.d.ts.map +1 -0
  175. package/dist/validation/goals/angleCriterion.d.cts +12 -0
  176. package/dist/validation/goals/angleCriterion.d.ts +13 -0
  177. package/dist/validation/goals/angleCriterion.d.ts.map +1 -0
  178. package/dist/validation/goals/angleMeasure.d.cts +9 -0
  179. package/dist/validation/goals/angleMeasure.d.ts +10 -0
  180. package/dist/validation/goals/angleMeasure.d.ts.map +1 -0
  181. package/dist/validation/goals/create.d.cts +2 -2
  182. package/dist/validation/goals/create.d.ts +2 -2
  183. package/dist/validation/goals/create.d.ts.map +1 -1
  184. package/dist/validation/goals/givenAngle.d.cts +11 -0
  185. package/dist/validation/goals/givenAngle.d.ts +12 -0
  186. package/dist/validation/goals/givenAngle.d.ts.map +1 -0
  187. package/dist/validation/goals/goalKindHandler.d.cts +38 -1
  188. package/dist/validation/goals/goalKindHandler.d.ts +38 -1
  189. package/dist/validation/goals/goalKindHandler.d.ts.map +1 -1
  190. package/dist/validation/goals/index.d.cts +9 -2
  191. package/dist/validation/goals/index.d.ts +9 -2
  192. package/dist/validation/goals/index.d.ts.map +1 -1
  193. package/dist/validation/goals/midpoint.d.cts +2 -2
  194. package/dist/validation/goals/midpoint.d.ts +2 -2
  195. package/dist/validation/goals/midpoint.d.ts.map +1 -1
  196. package/dist/validation/goals/parallel.d.cts +2 -2
  197. package/dist/validation/goals/parallel.d.ts +2 -2
  198. package/dist/validation/goals/parallel.d.ts.map +1 -1
  199. package/dist/validation/goals/perpendicular.d.cts +2 -2
  200. package/dist/validation/goals/perpendicular.d.ts +2 -2
  201. package/dist/validation/goals/perpendicular.d.ts.map +1 -1
  202. package/dist/validation/goals/segmentLength.d.cts +2 -2
  203. package/dist/validation/goals/segmentLength.d.ts +2 -2
  204. package/dist/validation/goals/segmentLength.d.ts.map +1 -1
  205. package/dist/validation/goals/throughPoints.d.cts +2 -2
  206. package/dist/validation/goals/throughPoints.d.ts +2 -2
  207. package/dist/validation/goals/throughPoints.d.ts.map +1 -1
  208. package/dist/validation/types.d.cts +5 -1
  209. package/dist/validation/types.d.ts +5 -1
  210. package/dist/validation/types.d.ts.map +1 -1
  211. package/dist/validation/validateGeometryState.d.ts.map +1 -1
  212. package/dist/validation/validateGeometryStateInput.d.ts.map +1 -1
  213. package/dist/validation.cjs +1 -1
  214. package/dist/validation.cjs.map +1 -1
  215. package/dist/validation.mjs +106 -85
  216. package/dist/validation.mjs.map +1 -1
  217. package/package.json +1 -1
  218. package/dist/exercise.schema-BV2b7rtN.cjs +0 -2
  219. package/dist/exercise.schema-BV2b7rtN.cjs.map +0 -1
  220. package/dist/exercise.schema-ckVBW9XA.js +0 -212
  221. package/dist/exercise.schema-ckVBW9XA.js.map +0 -1
  222. package/dist/geometryAttemptStatus-5L_q6-9l.js.map +0 -1
  223. package/dist/geometryAttemptStatus-N_XHIkiS.cjs +0 -2
  224. package/dist/geometryAttemptStatus-N_XHIkiS.cjs.map +0 -1
  225. package/dist/geometryState.schema-D0ixyGYE.js +0 -955
  226. package/dist/geometryState.schema-D0ixyGYE.js.map +0 -1
  227. package/dist/geometryState.schema-DKQ-durx.cjs +0 -2
  228. package/dist/geometryState.schema-DKQ-durx.cjs.map +0 -1
  229. package/dist/goals-C3ZwbEh_.js +0 -451
  230. package/dist/goals-C3ZwbEh_.js.map +0 -1
  231. package/dist/goals-CxR5qPDC.cjs +0 -2
  232. package/dist/goals-CxR5qPDC.cjs.map +0 -1
  233. package/dist/react-BEcdx1f6.js.map +0 -1
  234. package/dist/react-Pp_VSk--.cjs +0 -2
  235. package/dist/react-Pp_VSk--.cjs.map +0 -1
  236. package/dist/studentStore-CEKTtMCh.js.map +0 -1
  237. package/dist/studentStore-DLftfFAl.cjs +0 -2
  238. package/dist/studentStore-DLftfFAl.cjs.map +0 -1
@@ -0,0 +1,563 @@
1
+ import { $ as e, A as t, Ct as n, H as r, J as i, K as a, L as o, M as s, Q as c, St as l, Tt as u, V as d, X as f, Y as p, Z as m, f as h, p as g, q as _, w as ee, wt as v, z as y } from "./geometryState.schema-CKFPlX8j.js";
2
+ //#region src/geometry/goalCandidate.ts
3
+ function b(e) {
4
+ return e.definition.kind === "point";
5
+ }
6
+ //#endregion
7
+ //#region src/geometry/evaluateGraph.ts
8
+ var x = Object.freeze([]);
9
+ function te(e) {
10
+ let t = e[0] && o(e[0]), n = e[1] && o(e[1]);
11
+ return !t || !n ? "degenerate" : i(c(t), c(n)).length > 0 ? "out-of-domain" : "degenerate";
12
+ }
13
+ function S(e) {
14
+ let t = /* @__PURE__ */ new Map(), n = /* @__PURE__ */ new Set(), r = [], i = [];
15
+ function a(t) {
16
+ let n = e.pathOf?.(t);
17
+ return n === void 0 ? {} : { path: n };
18
+ }
19
+ function o(s) {
20
+ let c = t.get(s);
21
+ if (c) return c;
22
+ if (n.has(s)) return null;
23
+ let l = e.definitionOf(s);
24
+ if (!l) return null;
25
+ let u = i.indexOf(s);
26
+ if (u !== -1) return r.push({
27
+ entityId: s,
28
+ reason: "cycle",
29
+ cycle: i.slice(u),
30
+ ...a(s)
31
+ }), n.add(s), null;
32
+ let f = y(l), p = x, m = !0;
33
+ if (f.length > 0) {
34
+ i.push(s);
35
+ let e = [];
36
+ for (let t of f) {
37
+ let n = o(t);
38
+ n ? e.push(n) : m = !1;
39
+ }
40
+ i.pop(), p = e;
41
+ }
42
+ if (!m) {
43
+ for (let t of f) e.definitionOf(t) === void 0 && r.push({
44
+ entityId: s,
45
+ reason: "missing-parent",
46
+ parentId: t,
47
+ ...a(s)
48
+ });
49
+ return n.add(s), null;
50
+ }
51
+ let h = d(l, p);
52
+ return h ? (t.set(s, h), h) : (r.push({
53
+ entityId: s,
54
+ reason: te(p),
55
+ ...a(s)
56
+ }), n.add(s), null);
57
+ }
58
+ return {
59
+ resolve: o,
60
+ resolved: t,
61
+ issues: r
62
+ };
63
+ }
64
+ //#endregion
65
+ //#region src/state/geometryContext.ts
66
+ var C = { role: "implicit" }, w = { role: "explicit" }, T = Object.freeze([]), E = class {
67
+ constructor(e, t, n, r, i, a, o, s, c, l, u) {
68
+ this.exercise = e, this.geometry = t, this.pinned = n, this.draggable = r, this.attemptPoints = i, this.objects = a, this.points = o, this.declaresPoint = s, this.definitionSource = c, this.resolveEntity = l, this.issues = u, this.dependents = null, this.pointIdList = null, this.entityIdList = null;
69
+ }
70
+ get entityIds() {
71
+ return this.entityIdList ?? (this.entityIdList = Object.freeze([...this.pointIds(), ...this.objects.keys()])), this.entityIdList;
72
+ }
73
+ definitionOf(e) {
74
+ return this.definitionSource(e);
75
+ }
76
+ resolvedOf(e) {
77
+ return this.resolveEntity(e) ?? void 0;
78
+ }
79
+ shapeOf(e) {
80
+ let t = this.resolvedOf(e);
81
+ return t ? r(t) : void 0;
82
+ }
83
+ measuredOf(e) {
84
+ if (!this.objects.has(e)) return null;
85
+ let t = this.resolveEntity(e);
86
+ return t ? o(t) : null;
87
+ }
88
+ kindOf(e) {
89
+ return this.declaresPoint(e) ? "point" : this.objects.get(e)?.kind;
90
+ }
91
+ presentationOf(e) {
92
+ return Object.prototype.hasOwnProperty.call(this.exercise.entities, e) ? s(this.exercise.presentation, e) ?? w : s(this.geometry.presentation, e) ?? C;
93
+ }
94
+ isGiven(e) {
95
+ return Object.prototype.hasOwnProperty.call(this.exercise.entities, e);
96
+ }
97
+ parentsOf(e) {
98
+ let t = this.definitionOf(e);
99
+ if (!t) return T;
100
+ let n = y(t);
101
+ return n.length === 0 ? T : [...n];
102
+ }
103
+ dependentsOf(e) {
104
+ return this.dependentsIndex().get(e) ?? T;
105
+ }
106
+ removalClosureOf(e) {
107
+ if (!this.declaresPoint(e) && !this.objects.has(e)) return T;
108
+ let t = this.dependentsIndex(), n = [e], r = /* @__PURE__ */ new Set([e]);
109
+ for (let e = 0; e < n.length; e += 1) for (let i of t.get(n[e]) ?? T) r.has(i) || (r.add(i), n.push(i));
110
+ return n;
111
+ }
112
+ allowsObjectType(e) {
113
+ return this.exercise.allowedObjects.includes(e);
114
+ }
115
+ allowsTool(e) {
116
+ return this.exercise.tools.includes(e);
117
+ }
118
+ isBuiltFrom(e, t) {
119
+ return e === this.exercise && t === this.geometry;
120
+ }
121
+ pointIds() {
122
+ if (this.pointIdList) return this.pointIdList;
123
+ let e = [...this.pinned.keys(), ...this.draggable.keys()], t = new Set(e);
124
+ for (let n of this.attemptPoints.keys()) t.has(n) || e.push(n);
125
+ return this.pointIdList = e, e;
126
+ }
127
+ dependentsIndex() {
128
+ if (this.dependents) return this.dependents;
129
+ let e = /* @__PURE__ */ new Map(), t = (t, n) => {
130
+ let r = e.get(t);
131
+ r ? r.push(n) : e.set(t, [n]);
132
+ };
133
+ for (let e of this.entityIds) for (let n of this.parentsOf(e)) t(n, e);
134
+ return this.dependents = e, e;
135
+ }
136
+ };
137
+ function D(e, n) {
138
+ let r = /* @__PURE__ */ new Map(), i = /* @__PURE__ */ new Map(), a = /* @__PURE__ */ new Map(), o = /* @__PURE__ */ new Map(), c = [];
139
+ for (let n in e.entities) {
140
+ let a = s(e.entities, n);
141
+ a && (a.kind === "point" ? t(e, n) ? i.set(n, a) : r.set(n, a) : o.set(n, a));
142
+ }
143
+ for (let t in n.entities) {
144
+ let r = s(n.entities, t);
145
+ if (!r) continue;
146
+ let i = s(e.entities, t);
147
+ if (i) {
148
+ let n = ee(e, t, i, r);
149
+ if (n === "ignored") continue;
150
+ if (n === "collision") {
151
+ c.push({
152
+ entityId: t,
153
+ reason: "duplicate-id",
154
+ path: `geometry.entities.${t}`
155
+ });
156
+ continue;
157
+ }
158
+ }
159
+ r.kind === "point" ? a.set(t, r) : o.set(t, r);
160
+ }
161
+ function l(e) {
162
+ return r.get(e) || (a.get(e) ?? i.get(e));
163
+ }
164
+ function u(e) {
165
+ return r.has(e) || a.has(e) || i.has(e);
166
+ }
167
+ function d(e) {
168
+ return l(e) ?? o.get(e);
169
+ }
170
+ function f(t) {
171
+ let n = Object.prototype.hasOwnProperty.call(e.entities, t);
172
+ return (a.has(t) ? !r.has(t) : o.has(t) && !n) ? `geometry.entities.${t}` : n ? `exercise.entities.${t}` : void 0;
173
+ }
174
+ let p = S({
175
+ definitionOf: d,
176
+ pathOf: f
177
+ });
178
+ function m(e) {
179
+ return u(e) || o.has(e);
180
+ }
181
+ for (let [e, t] of o) {
182
+ let n = f(e);
183
+ if (n !== void 0) for (let r of y(t)) m(r) || c.push({
184
+ entityId: e,
185
+ reason: "missing-parent",
186
+ parentId: r,
187
+ path: n
188
+ });
189
+ }
190
+ for (let e of r.keys()) p.resolve(e);
191
+ for (let e of i.keys()) p.resolve(e);
192
+ for (let e of a.keys()) p.resolve(e);
193
+ let h = /* @__PURE__ */ new Map();
194
+ for (let [e, t] of p.resolved) t.kind === "point" && h.set(e, t.at);
195
+ return c.push(...p.issues), new E(e, n, r, i, a, o, h, u, d, p.resolve, Object.freeze(c));
196
+ }
197
+ //#endregion
198
+ //#region src/state/resolvePoints.ts
199
+ function O(e, t) {
200
+ let n = /* @__PURE__ */ new Map();
201
+ for (let [t, r] of Object.entries(e.entities)) r.kind !== "point" && n.set(t, {
202
+ id: t,
203
+ definition: r
204
+ });
205
+ for (let [e, r] of Object.entries(t.entities)) r.kind !== "point" && !n.has(e) && n.set(e, {
206
+ id: e,
207
+ definition: r
208
+ });
209
+ return n;
210
+ }
211
+ function k(e, t) {
212
+ return D(e, t).points;
213
+ }
214
+ function A(e) {
215
+ return j(e).points;
216
+ }
217
+ function j(e) {
218
+ return D(e, ne);
219
+ }
220
+ var ne = {
221
+ schemaVersion: 2,
222
+ entities: {},
223
+ presentation: {},
224
+ answerEntityIds: []
225
+ };
226
+ //#endregion
227
+ //#region src/validation/goals/goalContext.ts
228
+ function M(e, t) {
229
+ let n = e.get(t);
230
+ if (!n) throw Error(`Unknown point "${t}" during validation.`);
231
+ return n;
232
+ }
233
+ function N(e, t) {
234
+ return [M(e, t[0]), M(e, t[1])];
235
+ }
236
+ function P(e, t) {
237
+ let n = s(e.exercise.entities, t);
238
+ if (!n || !g(n.kind)) throw Error(`Unknown reference object "${t}" during validation.`);
239
+ let [r, i] = y(n);
240
+ if (r === void 0 || i === void 0) throw Error(`Reference object "${t}" has no endpoint pair.`);
241
+ return N(e.points, [r, i]);
242
+ }
243
+ function F(e, t) {
244
+ return !b(e) && e.definition.kind === t;
245
+ }
246
+ function I(e, t) {
247
+ return g(t) && F(e, t);
248
+ }
249
+ function L(e) {
250
+ let t = y(e.definition), [n, r] = t;
251
+ if (t.length !== 2 || n === void 0 || r === void 0) throw Error(`candidateEndpoints: ${e.definition.kind} is not defined by two points.`);
252
+ return [n, r];
253
+ }
254
+ //#endregion
255
+ //#region src/validation/goals/angleCriterion.ts
256
+ function re(e, t) {
257
+ let n = e * 360;
258
+ return t === "undirected" ? Math.min(n, 360 - n) : n;
259
+ }
260
+ function R(t, n, r) {
261
+ let i = re(t, n);
262
+ return r.kind === "degrees" ? l(a(i, r.targetDegrees), r.toleranceDegrees) : e(i) === r.angleType;
263
+ }
264
+ function z(e, [t, n, r]) {
265
+ let i = M(e, n), a = _(i, M(e, t)), o = _(i, M(e, r));
266
+ return a === null || o === null ? null : {
267
+ vertex: i,
268
+ startTurn: a,
269
+ sweepTurn: m(a, o)
270
+ };
271
+ }
272
+ //#endregion
273
+ //#region src/validation/goals/previewGeometry.ts
274
+ function B(e, t, n) {
275
+ return {
276
+ x: e.x + Math.cos(t) * n,
277
+ y: e.y + Math.sin(t) * n
278
+ };
279
+ }
280
+ function V(e, t) {
281
+ let [n, r, i, a] = t;
282
+ if (e.x >= n && e.x <= i && e.y >= r && e.y <= a) return Math.min(e.x - n, i - e.x, e.y - r, a - e.y);
283
+ let o = Math.max(n, Math.min(i, e.x)), s = Math.max(r, Math.min(a, e.y));
284
+ return -Math.hypot(e.x - o, e.y - s);
285
+ }
286
+ function H(e, t) {
287
+ let n = e[0];
288
+ if (!n) throw Error("mostVisibleInViewport requires at least one candidate.");
289
+ let r = V(n, t);
290
+ for (let i of e.slice(1)) {
291
+ let e = V(i, t);
292
+ e > r && (n = i, r = e);
293
+ }
294
+ return n;
295
+ }
296
+ function U(e, t) {
297
+ let [n, r, i, a] = e, o = Math.max(.5, Math.min(i - n, a - r) * .28);
298
+ return Math.min(t || 1, o);
299
+ }
300
+ function W(e, t, n) {
301
+ return e === "line" ? {
302
+ type: "line",
303
+ through: [t, n]
304
+ } : {
305
+ type: "segment",
306
+ from: t,
307
+ to: n
308
+ };
309
+ }
310
+ //#endregion
311
+ //#region src/validation/goals/angleBisector.ts
312
+ function G(e, t) {
313
+ let n = s(e.exercise.entities, t);
314
+ if (n?.kind !== "angle") throw Error(`Unknown reference angle "${t}" during validation.`);
315
+ return n.parents;
316
+ }
317
+ function K(e, t, n) {
318
+ let r = z(e.points, G(e, t.referenceAngleId));
319
+ if (!r) return null;
320
+ let i = r.startTurn + r.sweepTurn / 2;
321
+ return [r.vertex, B(r.vertex, 2 * Math.PI * i, n)];
322
+ }
323
+ var q = {
324
+ ...h.angleBisector,
325
+ subject: "candidates",
326
+ accepts(e, t) {
327
+ return I(e, t.objectType);
328
+ },
329
+ satisfies(e, t, n) {
330
+ let r = G(n, t.referenceAngleId)[1], i = L(e);
331
+ if (!i.includes(r)) return !1;
332
+ let a = K(n, t, 1);
333
+ if (!a) return !1;
334
+ let [o, s] = N(n.points, i);
335
+ return l(p(a[0], a[1], o, s), t.toleranceDegrees);
336
+ },
337
+ isRelevantAttempt(e, t, n) {
338
+ let r = G(n, t.referenceAngleId)[1];
339
+ return y(e.definition).includes(r);
340
+ },
341
+ buildRevealedAnswer(e, t) {
342
+ let [n, r] = G(t, e.referenceAngleId), i = v(M(t.points, r), M(t.points, n)), a = K(t, e, U(t.exercise.viewport, i));
343
+ return a && W(e.objectType, a[0], a[1]);
344
+ }
345
+ }, J = {
346
+ acute: 45,
347
+ right: 90,
348
+ obtuse: 135,
349
+ straight: 180,
350
+ reflex: 270
351
+ }, Y = {
352
+ ...h.angleMeasure,
353
+ subject: "candidates",
354
+ accepts(e) {
355
+ return e.definition.kind === "angle";
356
+ },
357
+ satisfies(e, t, n) {
358
+ if (e.definition.parents[1] !== t.vertexPointId) return !1;
359
+ let r = z(n.points, e.definition.parents);
360
+ return r !== null && R(r.sweepTurn, t.interpretation, t.criterion);
361
+ },
362
+ isRelevantAttempt(e, t) {
363
+ return e.definition.parents[1] === t.vertexPointId;
364
+ },
365
+ buildRevealedAnswer(e, t) {
366
+ let n = M(t.points, e.vertexPointId), { criterion: r } = e, i = (r.kind === "degrees" ? r.targetDegrees : J[r.angleType]) * Math.PI / 180, { viewport: a } = t.exercise, o = U(a, Infinity), s = i === 0 ? o / 2 : o, c = (e) => [B(n, e, o), B(n, e + i, s)], l = (e) => Math.min(...e.map((e) => V(e, a))), u = c(0);
367
+ for (let e = 1; e < 8; e++) {
368
+ let t = c(e * Math.PI / 4);
369
+ l(t) > l(u) && (u = t);
370
+ }
371
+ return {
372
+ type: "angle",
373
+ vertex: n,
374
+ arms: u
375
+ };
376
+ }
377
+ }, ie = {
378
+ ...h.create,
379
+ subject: "candidates",
380
+ accepts(e, t) {
381
+ return e.definition.kind === t.objectType;
382
+ },
383
+ satisfies() {
384
+ return !0;
385
+ },
386
+ isRelevantAttempt() {
387
+ return !0;
388
+ },
389
+ buildRevealedAnswer() {
390
+ return null;
391
+ }
392
+ }, ae = {
393
+ ...h.givenAngle,
394
+ subject: "figure",
395
+ satisfiedByFigure(e, t) {
396
+ let n = t.scene.resolvedOf(e.angleId);
397
+ if (n?.kind === "angle") return R(n.sweepTurn, e.interpretation, e.criterion);
398
+ },
399
+ judgedEntityIds: (e) => [e.angleId]
400
+ };
401
+ //#endregion
402
+ //#region src/validation/goals/midpoint.ts
403
+ function X(e, t) {
404
+ let [n, r] = P(t, e.referenceObjectId);
405
+ return u(n, r);
406
+ }
407
+ var oe = {
408
+ ...h.midpoint,
409
+ subject: "candidates",
410
+ accepts(e) {
411
+ return b(e);
412
+ },
413
+ satisfies(e, t, n) {
414
+ let r = M(n.points, e.id), i = v(r, X(t, n));
415
+ return l(i, t.toleranceUnits);
416
+ },
417
+ isRelevantAttempt() {
418
+ return !0;
419
+ },
420
+ buildRevealedAnswer(e, t) {
421
+ return {
422
+ type: "point",
423
+ at: X(e, t)
424
+ };
425
+ }
426
+ }, se = {
427
+ ...h.parallel,
428
+ subject: "candidates",
429
+ accepts(e, t) {
430
+ return I(e, t.objectType);
431
+ },
432
+ satisfies(e, t, n) {
433
+ let r = L(e);
434
+ if (!r.includes(t.throughPointId)) return !1;
435
+ let [i, a] = P(n, t.referenceObjectId), [o, s] = N(n.points, r), c = p(i, a, o, s);
436
+ return l(c, t.toleranceDegrees);
437
+ },
438
+ isRelevantAttempt(e, t) {
439
+ return y(e.definition).includes(t.throughPointId);
440
+ },
441
+ buildRevealedAnswer(e, t) {
442
+ let [n, r] = P(t, e.referenceObjectId), i = M(t.points, e.throughPointId), a = Math.atan2(r.y - n.y, r.x - n.x), o = U(t.exercise.viewport, v(n, r)), s = H([B(i, a, o), B(i, a + Math.PI, o)], t.exercise.viewport);
443
+ return W(e.objectType, i, s);
444
+ }
445
+ }, ce = {
446
+ ...h.perpendicular,
447
+ subject: "candidates",
448
+ accepts(e, t) {
449
+ return I(e, t.objectType);
450
+ },
451
+ satisfies(e, t, r) {
452
+ let i = L(e);
453
+ if (!i.includes(t.throughPointId)) return !1;
454
+ let [a, o] = P(r, t.referenceObjectId), [s, c] = N(r.points, i), l = p(a, o, s, c);
455
+ return n(l, 90, t.toleranceDegrees);
456
+ },
457
+ isRelevantAttempt(e, t) {
458
+ return y(e.definition).includes(t.throughPointId);
459
+ },
460
+ buildRevealedAnswer(e, t) {
461
+ let [n, r] = P(t, e.referenceObjectId), i = M(t.points, e.throughPointId), a = Math.atan2(r.y - n.y, r.x - n.x), o = U(t.exercise.viewport, v(n, r)), s = H([B(i, a + Math.PI / 2, o), B(i, a - Math.PI / 2, o)], t.exercise.viewport);
462
+ return W(e.objectType, i, s);
463
+ }
464
+ }, le = {
465
+ ...h.segmentLength,
466
+ subject: "candidates",
467
+ accepts(e, t) {
468
+ return F(e, t.objectType);
469
+ },
470
+ satisfies(e, t, r) {
471
+ let [i, a] = N(r.points, L(e));
472
+ return n(v(i, a), t.targetLength, t.toleranceUnits);
473
+ },
474
+ isRelevantAttempt() {
475
+ return !0;
476
+ },
477
+ buildRevealedAnswer(e, t) {
478
+ let [n, r, i, a] = t.exercise.viewport, o = (n + i) / 2, s = (r + a) / 2;
479
+ return {
480
+ type: "segment",
481
+ from: {
482
+ x: o - e.targetLength / 2,
483
+ y: s
484
+ },
485
+ to: {
486
+ x: o + e.targetLength / 2,
487
+ y: s
488
+ }
489
+ };
490
+ }
491
+ };
492
+ //#endregion
493
+ //#region src/validation/goals/throughPoints.ts
494
+ function ue(e, t) {
495
+ if (e.length !== t.length) return !1;
496
+ if (e.length === 2) {
497
+ let [n, r] = e, [i, a] = t;
498
+ return f(n, i) && f(r, a) || f(n, a) && f(r, i);
499
+ }
500
+ throw Error(`satisfiesThroughPoints: unsupported point count ${e.length}`);
501
+ }
502
+ var Z = {
503
+ ...h.throughPoints,
504
+ subject: "candidates",
505
+ accepts(e, t) {
506
+ return I(e, t.objectType);
507
+ },
508
+ satisfies(e, t, n) {
509
+ return ue(y(e.definition).map((e) => M(n.points, e)), t.pointIds.map((e) => M(n.points, e)));
510
+ },
511
+ isRelevantAttempt(e, t, n) {
512
+ let r = y(e.definition).map((e) => M(n.points, e)), i = t.pointIds.map((e) => M(n.points, e));
513
+ return r.some((e) => i.some((t) => f(e, t)));
514
+ },
515
+ buildRevealedAnswer(e, t) {
516
+ let [n, r] = e.pointIds.map((e) => M(t.points, e));
517
+ return W(e.objectType, n, r);
518
+ }
519
+ }, de = Object.freeze({
520
+ create: ie,
521
+ throughPoints: Z,
522
+ perpendicular: ce,
523
+ parallel: se,
524
+ segmentLength: le,
525
+ midpoint: oe,
526
+ angleMeasure: Y,
527
+ angleBisector: q,
528
+ givenAngle: ae
529
+ });
530
+ function Q(e) {
531
+ let t = de[e];
532
+ if (!t) throw Error(`No goal kind handler registered for "${e}"`);
533
+ return t;
534
+ }
535
+ function fe(e) {
536
+ let t = Q(e.type);
537
+ return t.subject === "figure" ? t : null;
538
+ }
539
+ function $(e) {
540
+ let t = Q(e.type);
541
+ return t.subject === "candidates" ? t : null;
542
+ }
543
+ function pe(e) {
544
+ return Q(e.type).referencedGivenIds(e);
545
+ }
546
+ function me(e, t) {
547
+ return $(t)?.accepts(e, t) ?? !1;
548
+ }
549
+ function he(e, t, n) {
550
+ let r = $(t);
551
+ return r !== null && r.accepts(e, t) && r.satisfies(e, t, n);
552
+ }
553
+ function ge(e, t, n) {
554
+ let r = $(t);
555
+ return r !== null && r.accepts(e, t) && r.isRelevantAttempt(e, t, n);
556
+ }
557
+ function _e(e, t) {
558
+ return $(e)?.buildRevealedAnswer(e, t) ?? null;
559
+ }
560
+ //#endregion
561
+ export { ge as a, j as c, k as d, D as f, he as i, O as l, Q as n, pe as o, b as p, me as r, _e as s, fe as t, A as u };
562
+
563
+ //# sourceMappingURL=goals-BlSeniyt.js.map