@pie-element/number-line 13.1.2-next.2 → 13.1.2

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 (191) hide show
  1. package/CHANGELOG.json +1247 -0
  2. package/CHANGELOG.md +2441 -0
  3. package/LICENSE.md +5 -0
  4. package/README.md +28 -0
  5. package/configure/CHANGELOG.json +827 -0
  6. package/configure/CHANGELOG.md +2088 -0
  7. package/configure/lib/arrows.js +89 -0
  8. package/configure/lib/arrows.js.map +1 -0
  9. package/configure/lib/card-bar.js +57 -0
  10. package/configure/lib/card-bar.js.map +1 -0
  11. package/configure/lib/defaults.js +177 -0
  12. package/configure/lib/defaults.js.map +1 -0
  13. package/configure/lib/domain.js +87 -0
  14. package/configure/lib/domain.js.map +1 -0
  15. package/configure/lib/index.js +176 -0
  16. package/configure/lib/index.js.map +1 -0
  17. package/configure/lib/main.js +815 -0
  18. package/configure/lib/main.js.map +1 -0
  19. package/configure/lib/number-text-field.js +26 -0
  20. package/configure/lib/number-text-field.js.map +1 -0
  21. package/configure/lib/point-config.js +84 -0
  22. package/configure/lib/point-config.js.map +1 -0
  23. package/configure/lib/size.js +66 -0
  24. package/configure/lib/size.js.map +1 -0
  25. package/configure/lib/ticks.js +234 -0
  26. package/configure/lib/ticks.js.map +1 -0
  27. package/configure/lib/utils.js +12 -0
  28. package/configure/lib/utils.js.map +1 -0
  29. package/configure/package.json +20 -0
  30. package/controller/CHANGELOG.json +332 -0
  31. package/controller/CHANGELOG.md +1360 -0
  32. package/controller/lib/defaults.js +56 -0
  33. package/controller/lib/defaults.js.map +1 -0
  34. package/controller/lib/index.js +430 -0
  35. package/controller/lib/index.js.map +1 -0
  36. package/controller/lib/tickUtils.js +294 -0
  37. package/controller/lib/tickUtils.js.map +1 -0
  38. package/controller/lib/utils.js +168 -0
  39. package/controller/lib/utils.js.map +1 -0
  40. package/controller/package.json +20 -0
  41. package/demo.gif +0 -0
  42. package/docs/config-schema.json +2532 -0
  43. package/docs/config-schema.json.md +1844 -0
  44. package/docs/demo/config.js +8 -0
  45. package/docs/demo/generate.js +39 -0
  46. package/docs/demo/index.html +1 -0
  47. package/docs/pie-schema.json +2461 -0
  48. package/docs/pie-schema.json.md +1228 -0
  49. package/docs/schemas/config.json +256 -0
  50. package/lib/data-converter.js +96 -0
  51. package/lib/data-converter.js.map +1 -0
  52. package/lib/draggable/index.js +114 -0
  53. package/lib/draggable/index.js.map +1 -0
  54. package/lib/index.js +196 -0
  55. package/lib/index.js.map +1 -0
  56. package/lib/number-line/colors.js +11 -0
  57. package/lib/number-line/colors.js.map +1 -0
  58. package/lib/number-line/feedback.js +92 -0
  59. package/lib/number-line/feedback.js.map +1 -0
  60. package/lib/number-line/graph/arrow.js +44 -0
  61. package/lib/number-line/graph/arrow.js.map +1 -0
  62. package/lib/number-line/graph/elements/base.js +20 -0
  63. package/lib/number-line/graph/elements/base.js.map +1 -0
  64. package/lib/number-line/graph/elements/builder.js +37 -0
  65. package/lib/number-line/graph/elements/builder.js.map +1 -0
  66. package/lib/number-line/graph/elements/line.js +259 -0
  67. package/lib/number-line/graph/elements/line.js.map +1 -0
  68. package/lib/number-line/graph/elements/point.js +204 -0
  69. package/lib/number-line/graph/elements/point.js.map +1 -0
  70. package/lib/number-line/graph/elements/ray.js +190 -0
  71. package/lib/number-line/graph/elements/ray.js.map +1 -0
  72. package/lib/number-line/graph/index.js +262 -0
  73. package/lib/number-line/graph/index.js.map +1 -0
  74. package/lib/number-line/graph/line.js +38 -0
  75. package/lib/number-line/graph/line.js.map +1 -0
  76. package/lib/number-line/graph/stacks.js +78 -0
  77. package/lib/number-line/graph/stacks.js.map +1 -0
  78. package/lib/number-line/graph/tick-utils.js +347 -0
  79. package/lib/number-line/graph/tick-utils.js.map +1 -0
  80. package/lib/number-line/graph/ticks.js +188 -0
  81. package/lib/number-line/graph/ticks.js.map +1 -0
  82. package/lib/number-line/index.js +384 -0
  83. package/lib/number-line/index.js.map +1 -0
  84. package/lib/number-line/point-chooser/button.js +49 -0
  85. package/lib/number-line/point-chooser/button.js.map +1 -0
  86. package/lib/number-line/point-chooser/img.js +8 -0
  87. package/lib/number-line/point-chooser/img.js.map +1 -0
  88. package/lib/number-line/point-chooser/index.js +197 -0
  89. package/lib/number-line/point-chooser/index.js.map +1 -0
  90. package/lib/number-line/point-chooser/styles.js +77 -0
  91. package/lib/number-line/point-chooser/styles.js.map +1 -0
  92. package/lib/number-line/transitions/fade.js +88 -0
  93. package/lib/number-line/transitions/fade.js.map +1 -0
  94. package/lib/number-line/transitions/index.js +14 -0
  95. package/lib/number-line/transitions/index.js.map +1 -0
  96. package/package.json +21 -86
  97. package/configure.js +0 -2
  98. package/controller.js +0 -1
  99. package/dist/_virtual/_rolldown/runtime.js +0 -11
  100. package/dist/author/arrows.d.ts +0 -28
  101. package/dist/author/arrows.js +0 -69
  102. package/dist/author/card-bar.d.ts +0 -20
  103. package/dist/author/card-bar.js +0 -41
  104. package/dist/author/defaults.d.ts +0 -178
  105. package/dist/author/defaults.js +0 -144
  106. package/dist/author/domain.d.ts +0 -15
  107. package/dist/author/domain.js +0 -54
  108. package/dist/author/index.d.ts +0 -23
  109. package/dist/author/index.js +0 -89
  110. package/dist/author/main.d.ts +0 -44
  111. package/dist/author/main.js +0 -485
  112. package/dist/author/number-text-field.d.ts +0 -13
  113. package/dist/author/number-text-field.js +0 -13
  114. package/dist/author/point-config.d.ts +0 -25
  115. package/dist/author/point-config.js +0 -69
  116. package/dist/author/size.d.ts +0 -24
  117. package/dist/author/size.js +0 -48
  118. package/dist/author/ticks.d.ts +0 -22
  119. package/dist/author/ticks.js +0 -115
  120. package/dist/author/utils.d.ts +0 -9
  121. package/dist/author/utils.js +0 -4
  122. package/dist/browser/author/index.js +0 -40259
  123. package/dist/browser/author/index.js.map +0 -1
  124. package/dist/browser/controller/index.js +0 -569
  125. package/dist/browser/controller/index.js.map +0 -1
  126. package/dist/browser/delivery/index.js +0 -2
  127. package/dist/browser/delivery-DWjDT9Sz.js +0 -17910
  128. package/dist/browser/delivery-DWjDT9Sz.js.map +0 -1
  129. package/dist/browser/dist-D5T-OaLo.js +0 -19038
  130. package/dist/browser/dist-D5T-OaLo.js.map +0 -1
  131. package/dist/browser/impureFunctionsAny.generated-Bqfato71.js +0 -10162
  132. package/dist/browser/impureFunctionsAny.generated-Bqfato71.js.map +0 -1
  133. package/dist/browser/number-line.css +0 -2
  134. package/dist/controller/defaults.d.ts +0 -58
  135. package/dist/controller/defaults.js +0 -50
  136. package/dist/controller/index.d.ts +0 -47
  137. package/dist/controller/index.js +0 -165
  138. package/dist/controller/tickUtils.d.ts +0 -21
  139. package/dist/controller/tickUtils.js +0 -252
  140. package/dist/controller/utils.d.ts +0 -9
  141. package/dist/controller/utils.js +0 -68
  142. package/dist/delivery/data-converter.d.ts +0 -64
  143. package/dist/delivery/data-converter.js +0 -70
  144. package/dist/delivery/draggable/index.d.ts +0 -33
  145. package/dist/delivery/draggable/index.js +0 -39
  146. package/dist/delivery/index.d.ts +0 -35
  147. package/dist/delivery/index.js +0 -109
  148. package/dist/delivery/number-line/colors.d.ts +0 -11
  149. package/dist/delivery/number-line/colors.js +0 -5
  150. package/dist/delivery/number-line/feedback.d.ts +0 -19
  151. package/dist/delivery/number-line/feedback.js +0 -57
  152. package/dist/delivery/number-line/graph/arrow.d.ts +0 -30
  153. package/dist/delivery/number-line/graph/arrow.js +0 -27
  154. package/dist/delivery/number-line/graph/elements/base.d.ts +0 -16
  155. package/dist/delivery/number-line/graph/elements/base.js +0 -11
  156. package/dist/delivery/number-line/graph/elements/builder.d.ts +0 -33
  157. package/dist/delivery/number-line/graph/elements/builder.js +0 -30
  158. package/dist/delivery/number-line/graph/elements/line.d.ts +0 -51
  159. package/dist/delivery/number-line/graph/elements/line.js +0 -188
  160. package/dist/delivery/number-line/graph/elements/point.d.ts +0 -43
  161. package/dist/delivery/number-line/graph/elements/point.js +0 -127
  162. package/dist/delivery/number-line/graph/elements/ray.d.ts +0 -43
  163. package/dist/delivery/number-line/graph/elements/ray.js +0 -130
  164. package/dist/delivery/number-line/graph/index.d.ts +0 -59
  165. package/dist/delivery/number-line/graph/index.js +0 -196
  166. package/dist/delivery/number-line/graph/line.d.ts +0 -46
  167. package/dist/delivery/number-line/graph/line.js +0 -27
  168. package/dist/delivery/number-line/graph/stacks.d.ts +0 -10
  169. package/dist/delivery/number-line/graph/stacks.js +0 -40
  170. package/dist/delivery/number-line/graph/tick-utils.d.ts +0 -80
  171. package/dist/delivery/number-line/graph/tick-utils.js +0 -295
  172. package/dist/delivery/number-line/graph/ticks.d.ts +0 -46
  173. package/dist/delivery/number-line/graph/ticks.js +0 -115
  174. package/dist/delivery/number-line/index.d.ts +0 -35
  175. package/dist/delivery/number-line/index.js +0 -215
  176. package/dist/delivery/number-line/point-chooser/button.d.ts +0 -31
  177. package/dist/delivery/number-line/point-chooser/button.js +0 -36
  178. package/dist/delivery/number-line/point-chooser/img.d.ts +0 -10
  179. package/dist/delivery/number-line/point-chooser/img.js +0 -4
  180. package/dist/delivery/number-line/point-chooser/index.d.ts +0 -37
  181. package/dist/delivery/number-line/point-chooser/index.js +0 -154
  182. package/dist/delivery/number-line/point-chooser/styles.d.ts +0 -192
  183. package/dist/delivery/number-line/transitions/fade.d.ts +0 -34
  184. package/dist/delivery/number-line/transitions/fade.js +0 -75
  185. package/dist/delivery/number-line/transitions/index.d.ts +0 -10
  186. package/dist/index.d.ts +0 -1
  187. package/dist/index.iife.d.ts +0 -8
  188. package/dist/index.iife.js +0 -197
  189. package/dist/index.js +0 -2
  190. package/dist/runtime-support.d.ts +0 -12
  191. package/dist/runtime-support.js +0 -12
@@ -1,569 +0,0 @@
1
- import { $r as e, Et as t, G as n, In as r, Kr as i, Q as a, a as o, bn as s, c, cn as l, d as u, f as d, ga as f, h as p, ha as m, i as h, ja as g, l as _, li as v, m as y, n as b, vr as x, yr as S, zn as C } from "../dist-D5T-OaLo.js";
2
- import { t as w } from "../impureFunctionsAny.generated-Bqfato71.js";
3
- //#region ../../shared/feedback/dist/index.js
4
- var T = {
5
- correct: {
6
- type: "default",
7
- default: "Correct",
8
- custom: "Correct"
9
- },
10
- incorrect: {
11
- type: "default",
12
- default: "Incorrect",
13
- custom: "Incorrect"
14
- },
15
- partial: {
16
- type: "default",
17
- default: "Nearly",
18
- custom: "Nearly"
19
- },
20
- unanswered: {
21
- type: "default",
22
- default: "You have not entered a response",
23
- custom: "You have not entered a response"
24
- }
25
- };
26
- function E(e) {
27
- return e === "partially-correct" ? "partial" : e;
28
- }
29
- function ee(e, t = {}) {
30
- return new Promise((n) => {
31
- let r = {
32
- ...T,
33
- ...t
34
- }, i = E(e), a = r[i], o = T[i];
35
- te(a, o[a.type]).then(n);
36
- });
37
- }
38
- function te(e, t) {
39
- return new Promise((n) => {
40
- if (!e || e.type === "none") {
41
- n(void 0);
42
- return;
43
- }
44
- n(e[e.type] || t);
45
- });
46
- }
47
- //#endregion
48
- //#region ../../shared/controller-utils/dist/index.js
49
- var D = Object.defineProperty, O = /* @__PURE__ */ ((e, t) => {
50
- let n = {};
51
- for (var r in e) D(n, r, {
52
- get: e[r],
53
- enumerable: !0
54
- });
55
- return t || D(n, Symbol.toStringTag, { value: "Module" }), n;
56
- })({ enabled: () => k });
57
- function k(e, t, n) {
58
- return e?.partialScoring === !1 || t?.partialScoring === !1 ? !1 : typeof n == "boolean" ? n : !0;
59
- }
60
- //#endregion
61
- //#region src/controller/defaults.ts
62
- var A = {
63
- correctResponse: [],
64
- feedback: {
65
- correct: {
66
- default: "Correct",
67
- type: "none"
68
- },
69
- incorrect: {
70
- default: "Incorrect",
71
- type: "none"
72
- },
73
- partial: {
74
- default: "Nearly",
75
- type: "none"
76
- }
77
- },
78
- graph: {
79
- arrows: {
80
- left: !0,
81
- right: !0
82
- },
83
- availableTypes: { PF: !0 },
84
- domain: {
85
- min: -1,
86
- max: 1
87
- },
88
- exhibitOnly: !1,
89
- initialElements: [],
90
- initialType: "PF",
91
- maxNumberOfPoints: 1,
92
- ticks: {
93
- minor: .125,
94
- major: .5,
95
- tickIntervalType: "Decimal"
96
- },
97
- title: "",
98
- width: 500
99
- },
100
- prompt: "",
101
- promptEnabled: !0,
102
- rationale: "",
103
- rationaleEnabled: !0,
104
- teacherInstructions: "",
105
- teacherInstructionsEnabled: !0,
106
- toolbarEditorPosition: "bottom",
107
- widthEnabled: !0
108
- }, j = [
109
- .001,
110
- .01,
111
- .02,
112
- .04,
113
- .05,
114
- .1,
115
- .125,
116
- .2,
117
- .25,
118
- .5
119
- ], ne = [
120
- "1/1000",
121
- "1/100",
122
- "1/64",
123
- "1/50",
124
- "1/32",
125
- "1/25",
126
- "1/20",
127
- "1/16",
128
- "1/15",
129
- "1/12",
130
- "1/10",
131
- "1/9",
132
- "1/8",
133
- "1/7",
134
- "1/6",
135
- "1/5",
136
- "1/4",
137
- "1/3",
138
- "1/2"
139
- ], M = {
140
- 1: [
141
- 1,
142
- 2,
143
- 3,
144
- 4,
145
- 5,
146
- 6,
147
- 7,
148
- 8,
149
- 9,
150
- 10
151
- ],
152
- 2: [
153
- 1,
154
- 2,
155
- 4,
156
- 6,
157
- 8,
158
- 10
159
- ],
160
- 3: [
161
- 1,
162
- 3,
163
- 6,
164
- 9
165
- ],
166
- 4: [
167
- 1,
168
- 2,
169
- 4,
170
- 8
171
- ],
172
- 5: [
173
- 1,
174
- 5,
175
- 10
176
- ],
177
- 6: [
178
- 1,
179
- 2,
180
- 3,
181
- 6
182
- ],
183
- 7: [1, 7],
184
- 8: [
185
- 1,
186
- 2,
187
- 4,
188
- 8
189
- ],
190
- 9: [
191
- 1,
192
- 3,
193
- 9
194
- ],
195
- 10: [
196
- 1,
197
- 2,
198
- 5,
199
- 10
200
- ],
201
- 12: [
202
- 1,
203
- 2,
204
- 3,
205
- 4,
206
- 6
207
- ],
208
- 15: [
209
- 1,
210
- 3,
211
- 5
212
- ],
213
- 16: [
214
- 1,
215
- 2,
216
- 4,
217
- 8
218
- ],
219
- 20: [
220
- 1,
221
- 2,
222
- 4,
223
- 5,
224
- 10
225
- ],
226
- 25: [1, 5],
227
- 32: [
228
- 1,
229
- 2,
230
- 4,
231
- 8
232
- ],
233
- 50: [
234
- 1,
235
- 2,
236
- 5,
237
- 10
238
- ],
239
- 64: [
240
- 1,
241
- 2,
242
- 4,
243
- 8
244
- ],
245
- 100: [
246
- 1,
247
- 2,
248
- 4,
249
- 5,
250
- 10
251
- ],
252
- 1e3: [
253
- 1,
254
- 2,
255
- 4,
256
- 5,
257
- 8,
258
- 10
259
- ]
260
- }, re = (e, t, r) => {
261
- if (!s(i(n(e), n(r)), 0)) throw Error("start point must be divisible by interval");
262
- if (s(e, t)) return [];
263
- let o = g(t, i(t, n(r))), c = x(r, 0) ? "positive" : "negative";
264
- if (c === "negative" && S(t, e)) throw Error("start must be > than end when doing a negative decrement");
265
- if (c === "positive" && f(t, e)) throw Error("start must be < end when doing increments");
266
- let l = c === "positive" ? f : s(o, t) ? S : x, u = [], d = e;
267
- for (; l(d, o);) u.push(d), d = a(d, r);
268
- return u;
269
- }, ie = (e, t) => `Can only do a positive or negative range, but got: start: ${e} and end:${t}`, N = (t, r, o) => {
270
- if (t = C(t), r = C(r), o = C(o), x(n(g(r, t)), n(r))) throw Error(ie(t, r));
271
- let s = {
272
- start: n(t),
273
- end: n(r),
274
- interval: n(o),
275
- multiplier: m(o, 0) ? -1 : 1
276
- }, c = i(s.start, s.interval), l = re(x(c, 0) ? a(g(s.start, c), s.interval) : s.start, s.end, s.interval), u = s.multiplier === -1 ? l.map((t) => e(t, -1)) : l;
277
- return m(o, 0) && u.reverse(), u;
278
- }, ae = (e, t) => (e = C(e), t = C(t), m(e, t) ? e : t), oe = (e, t) => (e = C(e), t = C(t), x(e, t) ? e : t), se = (t, n, r) => {
279
- t = C(t), n = C(n), r = C(r);
280
- let i = x(n, 0) ? N(oe(0, t), n, r) : [];
281
- return d((m(t, 0) ? N(ae(0, n), t, e(r, -1)) : []).concat(i), s);
282
- }, P = (e, t, n) => {
283
- n ||= 2;
284
- let r = 10 ** -n / 2;
285
- return Math.abs(e - t) < r;
286
- }, F = (e, t, n) => m(R(e), R(t)) ? t : x(R(e), R(n)) ? n : e, I = (t, n) => {
287
- let r = v(e(10, l(C(t.max - t.min), n)));
288
- return {
289
- min: r,
290
- max: v(e(20, r))
291
- };
292
- }, L = (e, t) => s(i(e, t), 0), R = (e) => {
293
- if (h(e)) return C(e.n * e.s, e.d);
294
- if (_(e)) return C(e);
295
- }, z = (t, n, r, i) => {
296
- let a = i ? i.limit !== !1 : !0, o = I(t, n), s = a ? F(R(r.minor), o.min, o.max) : R(r.minor), c = a ? F(R(r.major), s, e(s, 20)) : R(r.major);
297
- if (!L(c, s)) {
298
- let t = l(c, s);
299
- return {
300
- minor: s,
301
- major: e(s, t <= 2 ? 2 : Math.round(t))
302
- };
303
- }
304
- return {
305
- major: c,
306
- minor: s
307
- };
308
- }, B = (e, t, n, r) => (n = z(e, t, n, r), se(e.min, e.max, n.minor).filter((t) => f(t, C(e.max))).map((e) => {
309
- let t = "minor";
310
- return P(v(i(e, n.major)), 0) && (t = "major"), {
311
- x: e,
312
- type: t
313
- };
314
- })), V = (e) => {
315
- let t = {
316
- fraction: [],
317
- decimal: []
318
- };
319
- return j.forEach((n) => {
320
- n >= e.min && n <= e.max && t.decimal.push(n);
321
- }), ne.forEach((n) => {
322
- let r = v(C(n));
323
- r >= e.min && r <= e.max && t.fraction.push(n);
324
- }), t;
325
- }, H = (t, n, r) => {
326
- let i = {
327
- decimal: [],
328
- fraction: []
329
- }, a = C(v(v(t))), o = a.n, s = a.d;
330
- if (o >= 1 && s === 1) for (let a = 1; a <= 10; a++) {
331
- let s = v(e(o, a));
332
- U(n, r, {
333
- minor: t,
334
- major: s
335
- }, { fraction: void 0 }).filter((e) => e.type === "major").length > 1 && (i.fraction.push(s.toString()), i.decimal.push(s));
336
- }
337
- else for (let a in M[s]) {
338
- let c = e(C(o, s), M[s][a]);
339
- U(n, r, {
340
- minor: t,
341
- major: v(c)
342
- }, { fraction: void 0 }).filter((e) => e.type === "major").length > 1 && (c.d === 1 ? i.fraction.push(c.n.toString()) : i.fraction.push(c.n + "/" + c.d), i.decimal.push(v(c)));
343
- }
344
- return i;
345
- }, U = (e, t, n, r) => B(e, t, n, r).map((e) => r.fraction ? e : {
346
- ...e,
347
- x: v(e.x) || 0
348
- }), W = (e) => {
349
- let { domain: t, ticks: n, width: r } = e, i = H(n.minor, t, r);
350
- if (i.decimal.indexOf(n.major) === -1) {
351
- let e = 0;
352
- e = n.tickIntervalType === "Integer" && i.decimal.length > 4 ? 4 : i.decimal.length - 1, n.major = i.decimal[e];
353
- }
354
- return e.fraction = n.tickIntervalType === "Fraction" && n.major < 1, {
355
- ...e,
356
- ticks: n
357
- };
358
- }, G = (e) => {
359
- let { domain: n, ticks: i = {}, width: a } = e;
360
- i.tickIntervalType || (i.minor > .5 ? i.tickIntervalType = "Integer" : i.tickIntervalType = "Decimal");
361
- let o = I(n, a);
362
- if (o.min >= 1) i.tickIntervalType = "Integer", i.minor = i.minor < 1 ? v(t(o.min)) : i.minor >= v(t(o.min)) && i.minor <= v(r(o.max)) ? i.minor : v(t(o.min)), i.integerTick = i.minor, i.fractionTick = "0", i.decimalTick = 0;
363
- else if (o.min >= 0 && o.max < 1) {
364
- i.tickIntervalType === "Integer" && (i.tickIntervalType = "Fraction");
365
- let e = V(o), t = v(C(e.fraction[0])), n = v(C(e.fraction[e.fraction.length - 1]));
366
- if (i.minor < t || i.minor > n) switch (i.tickIntervalType) {
367
- case "Fraction":
368
- i.minor = v(C(e.fraction[e.fraction.length - 1])), i.fractionTick = e.fraction[e.fraction.length - 1], i.decimalTick = e.decimal[0];
369
- break;
370
- case "Decimal":
371
- case "Integer": i.minor = e.decimal[e.decimal.length - 1], i.decimalTick = e.decimal[e.decimal.length - 1], i.fractionTick = e.fraction[0];
372
- }
373
- else switch (i.tickIntervalType) {
374
- case "Fraction":
375
- let t = C(v(i.minor));
376
- i.fractionTick = t.n + "/" + t.d, i.decimalTick = i.decimalTick ? i.decimalTick : e.decimal[0];
377
- break;
378
- case "Decimal":
379
- case "Integer": i.decimalTick = i.minor, i.fractionTick = i.fractionTick ? i.fractionTick : e.fraction[0];
380
- }
381
- i.integerTick = 1;
382
- } else if (o.min < 1 && o.max >= 1) {
383
- let e = V(o);
384
- if (i.minor >= o.min && i.minor <= o.max) switch (i.tickIntervalType) {
385
- case "Integer":
386
- i.integerTick = i.minor, i.decimalTick = o.min > .5 ? 0 : e.decimal[0], i.fractionTick = o.min > .5 ? "0" : e.fraction[0];
387
- break;
388
- case "Decimal":
389
- i.integerTick = 1, i.decimalTick = i.minor, i.fractionTick = e.fraction[0];
390
- break;
391
- case "Fraction":
392
- i.integerTick = 1, i.decimalTick = e.decimal[0];
393
- let t = C(v(i.minor));
394
- i.fractionTick = t.n + "/" + t.d;
395
- }
396
- else switch (o.min > .5 && (i.tickIntervalType = "Integer"), i.tickIntervalType) {
397
- case "Integer":
398
- i.minor = v(t(o.min)), i.integerTick = i.minor, i.decimalTick = o.min > .5 ? 0 : e.decimal[0], i.fractionTick = o.min > .5 ? "0" : e.fraction[0];
399
- break;
400
- case "Decimal":
401
- i.minor = e.decimal[0], i.integerTick = 1, i.decimalTick = i.minor, i.fractionTick = e.fraction[0];
402
- break;
403
- case "Fraction": i.minor = v(C(e.fraction[0])), i.integerTick = 1, i.decimalTick = e.decimal[0], i.fractionTick = e.fraction[0];
404
- }
405
- }
406
- return W({
407
- ...e,
408
- ticks: i
409
- });
410
- }, K = (e) => ({ score: { scaled: e } }), ce = (e, t) => {
411
- let { correct: n } = e, r = t.find((e) => e.numberOfCorrect === n.length);
412
- return r ? 1 * (r.scorePercentage / 100) : 0;
413
- }, le = (e) => (t, n) => t + +!!e.some((e) => Y(e)(n)), q = (e, t, n) => {
414
- let r = [], i = t?.answer || [], a = e?.correctResponse || [];
415
- if (!i.length) return ["Student did not interact with the number line."];
416
- let { correct: o, incorrect: s, notInAnswer: c, noCorrectResponse: l } = X(i, p(a));
417
- if (l) return ["No correct response is defined for this item."];
418
- let u = o.length, d = s.length, f = c.length;
419
- u > 0 && r.push(`${u} object(s) correctly placed.`), d > 0 && r.push(`${d} incorrect object(s) placed.`), f > 0 && r.push(`${f} expected object(s) were not placed.`);
420
- let m = [...i];
421
- [...a], o.forEach((e) => {
422
- let t = m[e], n = t?.type || "object";
423
- r.push(`${n.charAt(0).toUpperCase() + n.slice(1)} at position ${t.domainPosition} is correct.`);
424
- }), s.forEach((e) => {
425
- let t = m[e], n = t?.type || "object";
426
- r.push(`${n.charAt(0).toUpperCase() + n.slice(1)} at position ${t.domainPosition} does not match the expected response.`);
427
- }), c.forEach((e) => {
428
- let t = e?.type || "object";
429
- r.push(`Expected ${t} at position ${e.domainPosition} was not placed by the student.`);
430
- });
431
- let h = O.enabled(e, n);
432
- h ? (r.push("Score calculated using partial scoring."), r.push("Partial scoring is based on the number of correct objects, with deductions for extras.")) : r.push("Score calculated using all-or-nothing scoring.");
433
- let g = a.length || 1, _ = i.length > g ? i.length - g : 0;
434
- _ > 0 && r.push(`${_} extra object(s) beyond the required amount were placed and deducted.`);
435
- let v = Math.max(0, (u - _) / g), y = h ? v : +(v === 1);
436
- return r.push(`Final score: ${y}.`), r;
437
- };
438
- function ue(e, t, n) {
439
- return new Promise((r) => {
440
- if (!t || c(t)) r({
441
- score: 0,
442
- empty: !0,
443
- logTrace: ["Student did not interact with the number line."]
444
- });
445
- else {
446
- let i = O.enabled(e, n), a = (t.answer || []).reduce(le(e.correctResponse), 0), o = e.correctResponse.length, s = 0;
447
- (t.answer || []).length > o && (s = (t.answer || []).length - o), o === 0 && (o = 1);
448
- let c = a < 0 ? 0 : (a - s) / o;
449
- c < 0 && (c = 0), r({
450
- score: i ? c : +(c === 1),
451
- logTrace: q(e, t, n)
452
- });
453
- }
454
- });
455
- }
456
- function de(e, t) {
457
- return new Promise((n) => {
458
- if (!t || c(t)) n({ score: { scaled: 0 } });
459
- else {
460
- t.answer = t.answer || [];
461
- let r = X(t.answer, p(e.correctResponse)), i = Z(r);
462
- if (i === "correct") n(K(1));
463
- else if (i === "incorrect") n(K(0));
464
- else if (i === "partial") {
465
- let { allowPartialScoring: t, partialScoring: i } = e, a = (i || []).filter((e) => !c(e));
466
- t && a.length > 0 ? n(K(ce(r, a))) : n(K(0));
467
- } else n({ score: { scaled: -1 } });
468
- }
469
- });
470
- }
471
- var fe = 3, J = (e, t, n) => {
472
- n ||= 5;
473
- let r = 10 ** -n / 2;
474
- return Math.abs(e - t) <= r;
475
- }, Y = (e) => (t) => y(e, t, (e, t) => {
476
- if (typeof e == "number" && typeof t == "number") return J(e, t, 3);
477
- }), X = (e, t) => c(t) && e.length > 0 ? {
478
- correct: [],
479
- incorrect: [],
480
- notInAnswer: [],
481
- noCorrectResponse: !0
482
- } : e.reduce((e, t, n) => {
483
- let { correct: r, incorrect: i, notInAnswer: a } = e, o = u(a, Y(t));
484
- return o ? (r.push(n), a.splice(a.indexOf(o), 1)) : i.push(n), {
485
- correct: r,
486
- incorrect: i,
487
- notInAnswer: a
488
- };
489
- }, {
490
- correct: [],
491
- incorrect: [],
492
- notInAnswer: t
493
- }), Z = (e) => {
494
- let { incorrect: t, correct: n, notInAnswer: r, noCorrectResponse: i } = e;
495
- return i ? "unknown" : t.length === 0 && n.length === 0 ? "unanswered" : t.length === 0 && r.length === 0 ? "correct" : t.length > 0 || r.length > 0 ? n.length > 0 ? "partial" : "incorrect" : "unknown";
496
- };
497
- function Q(e) {
498
- let t = b(A.feedback, e.feedback);
499
- return {
500
- ...A,
501
- ...e,
502
- feedback: t
503
- };
504
- }
505
- function pe(e = {}) {
506
- return new Promise((t) => {
507
- t(o({
508
- ...e,
509
- graph: {
510
- ...A.graph,
511
- ...e.graph
512
- },
513
- colorContrast: "black_on_white"
514
- }, (e) => !e));
515
- });
516
- }
517
- var me = (e) => {
518
- let { graph: { domain: t, labelStep: n, ticks: r = {} } = {} } = e, { minor: i, major: a } = r;
519
- if (t && (t.min = Number((t.min || 0).toFixed(2)), t.max = Number((t.max || 0).toFixed(2))), n && typeof n == "string" && n.match(/^[1-9][0-9]*\/[1-9][0-9]*$/g)) {
520
- e.graph.fraction = !0, r.tickIntervalType = "Fraction";
521
- let t = w(n);
522
- t !== a && (r.major = t, r.minor = t / (a / i));
523
- }
524
- return e;
525
- };
526
- async function he(e, t, n) {
527
- if (!e) throw Error("question is null");
528
- let r = await Q(e), i = G(me(r).graph);
529
- if (i) {
530
- let e = n.mode === "evaluate", a = p(r.correctResponse), s = e && X(t && t.answer || [], a), c = e && Z(s), { exhibitOnly: l } = i, u = n.mode !== "gather" || l === !0, d = null;
531
- n.role === "instructor" && (n.mode === "view" || e) && (d = r.teacherInstructions);
532
- let f = e ? await ee(c, r.feedback) : void 0;
533
- return o({
534
- prompt: r.prompt,
535
- teacherInstructions: d,
536
- graph: i,
537
- disabled: u,
538
- corrected: s,
539
- correctResponse: e && ["unanswered", "correct"].indexOf(c) === -1 && r.correctResponse,
540
- feedback: f && {
541
- type: c,
542
- message: f
543
- },
544
- colorContrast: n.accessibility && n.accessibility.colorContrast || "black_on_white",
545
- language: r.language,
546
- extraCSSRules: r.extraCSSRules
547
- }, (e) => !e);
548
- } else throw Error("graph is undefined");
549
- }
550
- var ge = (e, t) => new Promise((n) => {
551
- if (t.mode !== "evaluate" && t.role === "instructor") {
552
- let { correctResponse: t } = e;
553
- n({
554
- answer: t,
555
- id: "1"
556
- });
557
- } else n(null);
558
- }), $ = (e) => (e || "").replace(/(<(?!img|iframe|source)([^>]+)>)/gi, ""), _e = (e = {}, t = {}) => {
559
- let { graph: n, correctResponse: r } = e || {}, { maxMaxElements: i = 20, numberLineDimensions: { min: a = 200, max: o = 800 } = {} } = t || {}, { width: s, domain: c, maxNumberOfPoints: l } = n || {}, { min: u, max: d } = c || {}, f = {};
560
- ["teacherInstructions", "prompt"].forEach((n) => {
561
- t[n]?.required && !$(e[n]) && (f[n] = "This field is required.");
562
- }), (s < a || s > o) && (f.widthError = `Width should be a value between ${a} and ${o}.`);
563
- let p = -1e5, m = 1e5;
564
- return (u < p || u > m || d < p || d > m) && (f.domainError = `Min and max values must both be in the range [${p}, ${m}].`), u >= d && (f.maxError = "Max value must be greater than min value."), (l < 1 || l > i) && (f.pointsError = `Max number of elements should be between 1 and ${i}.`), r && r.length === 0 && (f.correctResponseError = "The correct answer should include at least one number line object."), f;
565
- };
566
- //#endregion
567
- export { fe as CLOSE_TO_PRECISION, J as closeTo, ge as createCorrectResponseSession, pe as createDefaultModel, X as getCorrected, Z as getCorrectness, q as getLogTrace, de as getScore, he as model, Q as normalize, ue as outcome, _e as validate };
568
-
569
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../../shared/feedback/dist/index.js","../../../../../shared/controller-utils/dist/index.js","../../../src/controller/defaults.ts","../../../src/controller/tickUtils.ts","../../../src/controller/utils.ts","../../../src/controller/index.ts"],"sourcesContent":["//#region src/defaults.ts\nvar e = {\n\tcorrect: {\n\t\ttype: \"default\",\n\t\tdefault: \"Correct\",\n\t\tcustom: \"Correct\"\n\t},\n\tincorrect: {\n\t\ttype: \"default\",\n\t\tdefault: \"Incorrect\",\n\t\tcustom: \"Incorrect\"\n\t},\n\tpartial: {\n\t\ttype: \"default\",\n\t\tdefault: \"Nearly\",\n\t\tcustom: \"Nearly\"\n\t},\n\tunanswered: {\n\t\ttype: \"default\",\n\t\tdefault: \"You have not entered a response\",\n\t\tcustom: \"You have not entered a response\"\n\t}\n};\n//#endregion\n//#region src/utils.ts\nfunction t(e) {\n\treturn e === \"partially-correct\" ? \"partial\" : e;\n}\n//#endregion\n//#region src/index.ts\nfunction n(n, i = {}) {\n\treturn new Promise((a) => {\n\t\tlet o = {\n\t\t\t...e,\n\t\t\t...i\n\t\t}, s = t(n), c = o[s], l = e[s];\n\t\tr(c, l[c.type]).then(a);\n\t});\n}\nfunction r(e, t) {\n\treturn new Promise((n) => {\n\t\tif (!e || e.type === \"none\") {\n\t\t\tn(void 0);\n\t\t\treturn;\n\t\t}\n\t\tn(e[e.type] || t);\n\t});\n}\nfunction i(n, r = {}) {\n\tlet i = {\n\t\t...e,\n\t\t...r\n\t}, o = t(n), s = i[o], c = e[o];\n\treturn a(s, c[s.type]);\n}\nfunction a(e, t) {\n\tif (!(!e || e.type === \"none\")) return e[e.type] || t;\n}\n//#endregion\nexport { e as defaultFeedback, a as getActualFeedback, i as getActualFeedbackForCorrectness, r as getFeedback, n as getFeedbackForCorrectness, t as normalizeCorrectness };\n","//#region \\0rolldown/runtime.js\nvar e = Object.defineProperty, t = (t, n) => {\n\tlet r = {};\n\tfor (var i in t) e(r, i, {\n\t\tget: t[i],\n\t\tenumerable: !0\n\t});\n\treturn n || e(r, Symbol.toStringTag, { value: \"Module\" }), r;\n};\n//#endregion\n//#region src/persistence.ts\nfunction n(e) {\n\treturn Array.isArray(e) ? e.filter((e) => e != null) : [];\n}\nfunction r(e) {\n\tlet t = [...e];\n\tfor (let e = t.length - 1; e > 0; e--) {\n\t\tlet n = Math.floor(Math.random() * (e + 1));\n\t\t[t[e], t[n]] = [t[n], t[e]];\n\t}\n\treturn t;\n}\nfunction i(e) {\n\treturn e == null ? !0 : Array.isArray(e) ? e.length === 0 : typeof e == \"object\" ? Object.keys(e).length === 0 : !1;\n}\nasync function a(e, t, a, o = \"value\") {\n\tlet s = n(t?.data?.shuffledValues ?? t?.shuffledValues ?? []);\n\tif (!t) {\n\t\tconsole.warn(\"Unable to save shuffled choices because there's no session.\");\n\t\treturn;\n\t}\n\tif (!i(s)) return n(s.map((t) => e.find((e) => e[o] === t)));\n\tlet c = r(e);\n\tif (a && typeof a == \"function\") try {\n\t\tlet e = n(c.map((e) => e[o]));\n\t\ti(e) ? console.error(`shuffledValues is an empty array - refusing to call updateSession. shuffledChoices: ${JSON.stringify(c)}, key: ${o}`) : t.id && t.element && await a(t.id, t.element, { shuffledValues: e });\n\t} catch (e) {\n\t\tconsole.warn(\"Unable to save shuffled order for choices\"), console.error(e);\n\t}\n\telse console.warn(\"Unable to save shuffled choices, shuffle will happen every time.\");\n\treturn c;\n}\nfunction o(e, t, n) {\n\treturn !!(e.lockChoiceOrder || n[\"@pie-element\"]?.lockChoiceOrder || (n.role ?? \"student\") === \"instructor\");\n}\n//#endregion\n//#region src/partial-scoring.ts\nvar s = /* @__PURE__ */ t({ enabled: () => c });\nfunction c(e, t, n) {\n\treturn e?.partialScoring === !1 || t?.partialScoring === !1 ? !1 : typeof n == \"boolean\" ? n : !0;\n}\n//#endregion\nexport { a as getShuffledChoices, o as lockChoices, s as partialScoring };\n","// @ts-nocheck\n/**\n * @synced-from pie-elements/packages/number-line/controller/src/defaults.js\n * @auto-generated\n *\n * This file is automatically synced from pie-elements and converted to TypeScript.\n * Manual edits will be overwritten on next sync.\n * To make changes, edit the upstream JavaScript file and run sync again.\n */\n\nexport default {\n correctResponse: [],\n feedback: {\n correct: { default: 'Correct', type: 'none' },\n incorrect: { default: 'Incorrect', type: 'none' },\n partial: { default: 'Nearly', type: 'none' },\n },\n graph: {\n arrows: { left: true, right: true },\n availableTypes: {\n PF: true,\n },\n domain: { min: -1, max: 1 },\n exhibitOnly: false,\n initialElements: [],\n initialType: 'PF',\n maxNumberOfPoints: 1,\n ticks: { minor: 0.125, major: 0.5, tickIntervalType: 'Decimal' },\n title: '',\n width: 500,\n },\n prompt: '',\n promptEnabled: true,\n rationale: '',\n rationaleEnabled: true,\n teacherInstructions: '',\n teacherInstructionsEnabled: true,\n toolbarEditorPosition: 'bottom',\n widthEnabled: true,\n};\n","// @ts-nocheck\n/**\n * @synced-from pie-elements/packages/number-line/controller/src/tickUtils.js\n * @auto-generated\n *\n * This file is automatically synced from pie-elements and converted to TypeScript.\n * Manual edits will be overwritten on next sync.\n * To make changes, edit the upstream JavaScript file and run sync again.\n */\n\nimport * as math from 'mathjs';\nimport { isNumber, isObject, uniqWith } from '@pie-element/shared-lodash';\n\n// All these functions are duplicated in src/number-line/graph/tick-utils\n\n/*This will store the possible decimal tick values*/\nconst decimalTickValues = [0.001, 0.01, 0.02, 0.04, 0.05, 0.1, 0.125, 0.2, 0.25, 0.5];\n\n/*This will store the possible fraction tick values*/\nconst fractionTickValues = [\n '1/1000',\n '1/100',\n '1/64',\n '1/50',\n '1/32',\n '1/25',\n '1/20',\n '1/16',\n '1/15',\n '1/12',\n '1/10',\n '1/9',\n '1/8',\n '1/7',\n '1/6',\n '1/5',\n '1/4',\n '1/3',\n '1/2',\n];\n\n/*This const will store possible multiplier for label interval that needs to be multiplied\nwith tick interval with denominator represented with object key.*/\nconst labelMultiplier = {\n 1: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],\n 2: [1, 2, 4, 6, 8, 10],\n 3: [1, 3, 6, 9],\n 4: [1, 2, 4, 8],\n 5: [1, 5, 10],\n 6: [1, 2, 3, 6],\n 7: [1, 7],\n 8: [1, 2, 4, 8],\n 9: [1, 3, 9],\n 10: [1, 2, 5, 10],\n 12: [1, 2, 3, 4, 6],\n 15: [1, 3, 5],\n 16: [1, 2, 4, 8],\n 20: [1, 2, 4, 5, 10],\n 25: [1, 5],\n 32: [1, 2, 4, 8],\n 50: [1, 2, 5, 10],\n 64: [1, 2, 4, 8],\n 100: [1, 2, 4, 5, 10],\n 1000: [1, 2, 4, 5, 8, 10],\n};\n\nconst fractionRange = (start, end, interval) => {\n const m = math.mod(math.abs(start), math.abs(interval));\n if (!math.equal(m, 0)) {\n throw new Error('start point must be divisible by interval');\n }\n\n if (math.equal(start, end)) {\n return [];\n }\n\n const e = math.subtract(end, math.mod(end, math.abs(interval)));\n\n const direction = math.larger(interval, 0) ? 'positive' : 'negative';\n\n if (direction === 'negative' && math.largerEq(end, start)) {\n throw new Error('start must be > than end when doing a negative decrement');\n }\n if (direction === 'positive' && math.smallerEq(end, start)) {\n throw new Error('start must be < end when doing increments');\n }\n const compareFn = direction === 'positive' ? math.smallerEq : math.equal(e, end) ? math.largerEq : math.larger;\n const out = [];\n\n let next = start;\n while (compareFn(next, e)) {\n out.push(next);\n next = math.add(next, interval);\n }\n return out;\n};\n\nconst zbrErrorMessage = (start, end) =>\n `Can only do a positive or negative range, but got: start: ${start} and end:${end}`;\n\nconst zeroBasedRange = (start, end, interval) => {\n start = math.fraction(start);\n end = math.fraction(end);\n interval = math.fraction(interval);\n\n const length = math.abs(math.subtract(end, start));\n\n if (math.larger(length, math.abs(end))) {\n throw new Error(zbrErrorMessage(start, end));\n }\n const a = {\n start: math.abs(start),\n end: math.abs(end),\n interval: math.abs(interval),\n multiplier: math.smaller(interval, 0) ? -1 : 1,\n };\n\n const m = math.mod(a.start, a.interval);\n const s = math.larger(m, 0) ? math.add(math.subtract(a.start, m), a.interval) : a.start;\n\n const r = fractionRange(s, a.end, a.interval);\n const out = a.multiplier === -1 ? r.map((v) => math.multiply(v, -1)) : r;\n\n if (math.smaller(interval, 0)) {\n out.reverse();\n }\n return out;\n};\n\nconst fmin = (a, b) => {\n a = math.fraction(a);\n b = math.fraction(b);\n return math.smaller(a, b) ? a : b;\n};\n\nconst fmax = (a, b) => {\n a = math.fraction(a);\n b = math.fraction(b);\n return math.larger(a, b) ? a : b;\n};\n/**\n * the lodash range was causing too much variance in the rounding errors\n * such that it was hard to round the numbers.\n * This is a more simplistic version but makes rounding work.\n */\nconst simpleRange = (start, end, interval) => {\n start = math.fraction(start);\n end = math.fraction(end);\n interval = math.fraction(interval);\n\n const positiveRange = math.larger(end, 0) ? zeroBasedRange(fmax(0, start), end, interval) : [];\n\n const negativeRange = math.smaller(start, 0) ? zeroBasedRange(fmin(0, end), start, math.multiply(interval, -1)) : [];\n let together = negativeRange.concat(positiveRange);\n\n const out = uniqWith(together, math.equal);\n return out;\n};\n\nconst closeTo = (a, b, precision) => {\n precision = precision || 2;\n const expectedDiff = Math.pow(10, -precision) / 2;\n const receivedDiff = Math.abs(a - b);\n return receivedDiff < expectedDiff;\n};\n\nconst limit = (v, min, max) => {\n if (math.smaller(fraction(v), fraction(min))) {\n return min;\n }\n\n if (math.larger(fraction(v), fraction(max))) {\n return max;\n }\n\n return v;\n};\n\n/*\n * Function to get tick interval limits based on min, max and width entered by the user.\n * @param domain object containing max and min value.\n * @param width number represents width of number line.\n * */\nexport const getMinorLimits = (domain, width) => {\n const end = domain.max - domain.min;\n const min = math.number(math.multiply(10, math.divide(math.fraction(end), width)));\n const max = math.number(math.multiply(20, min));\n return {\n min: min,\n max: max,\n };\n};\n\nconst isMultiple = (multiple, src) => {\n const mod = math.mod(multiple, src);\n return math.equal(mod, 0);\n};\n\n/**\n * Accepts a fraction object {n,d,s} or number.\n * @param {*} v\n * @return mathjs.fraction\n */\nconst fraction = (v) => {\n if (isObject(v)) {\n return math.fraction(v.n * v.s, v.d);\n } else if (isNumber(v)) {\n return math.fraction(v);\n }\n};\n\nconst normalizeTicks = (domain, width, ticks, opts) => {\n const useLimit = opts ? opts.limit !== false : true;\n const minorLimits = getMinorLimits(domain, width);\n\n const minor = useLimit ? limit(fraction(ticks.minor), minorLimits.min, minorLimits.max) : fraction(ticks.minor);\n const major = useLimit ? limit(fraction(ticks.major), minor, math.multiply(minor, 20)) : fraction(ticks.major);\n\n const isMajorMultiple = isMultiple(major, minor);\n\n if (!isMajorMultiple) {\n const multiplier = math.divide(major, minor);\n const multiplyBy = multiplier <= 2 ? 2 : Math.round(multiplier);\n\n // major must be a multiple of minor\n return { minor, major: math.multiply(minor, multiplyBy) };\n }\n\n return { major, minor };\n};\n\n/**\n * Build ticks as an array of mathjs Fractions\n */\nconst buildTickDataAsFractions = (domain, width, ticks, opts) => {\n ticks = normalizeTicks(domain, width, ticks, opts);\n const rng = simpleRange(domain.min, domain.max, ticks.minor);\n\n const o = rng\n .filter((x) => math.smallerEq(x, math.fraction(domain.max)))\n .map((x) => {\n let type = 'minor';\n const modulo = math.mod(x, ticks.major);\n\n if (closeTo(math.number(modulo), 0)) {\n type = 'major';\n }\n\n return { x, type };\n });\n\n return o;\n};\n\n/*\n * This function will generate tick interval values based on min and max limits of ticks.\n * @param minorLimits object containing min and max values\n * @return out object containing three arrays 1. fraction values, 2. decimal values,\n * */\nexport const generateMinorValues = (minorLimits) => {\n let out = { fraction: [], decimal: [] };\n decimalTickValues.forEach((value) => {\n if (value >= minorLimits.min && value <= minorLimits.max) {\n out.decimal.push(value);\n }\n });\n fractionTickValues.forEach((value) => {\n let decimalValue = math.number(math.fraction(value));\n if (decimalValue >= minorLimits.min && decimalValue <= minorLimits.max) {\n out.fraction.push(value);\n }\n });\n return out;\n};\n\n/*\n * This function will generate label interval values for provided tick interval value.\n * @param minor number representing tick interval value.\n * @param domain object containing min and max values.\n * @param width number representing width of number line.\n * @return out object containing three arrays 1. fraction values, 2. decimal values,\n * */\nexport const generateMajorValuesForMinor = (minor, domain, width) => {\n let out = { decimal: [], fraction: [] };\n let fraction = math.fraction(math.number(math.number(minor)));\n let n = fraction.n;\n let d = fraction.d;\n if (n >= 1 && d === 1) {\n for (let i = 1; i <= 10; i++) {\n let num = math.number(math.multiply(n, i));\n //Here we check if this major value can plot at least 2 points on number line.\n let ticksData = { minor: minor, major: num };\n let output = buildTickData(domain, width, ticksData, { fraction: undefined });\n if (output.filter((x) => x.type === 'major').length > 1) {\n out.fraction.push(num.toString());\n out.decimal.push(num);\n }\n }\n } else {\n for (const multiplierKey in labelMultiplier[d]) {\n let num = math.multiply(math.fraction(n, d), labelMultiplier[d][multiplierKey]);\n //Here we check if this major value can plot at least 2 points on number line.\n let ticksData = { minor: minor, major: math.number(num) };\n let output = buildTickData(domain, width, ticksData, { fraction: undefined });\n if (output.filter((x) => x.type === 'major').length > 1) {\n if (num.d !== 1) {\n out.fraction.push(num.n + '/' + num.d);\n } else {\n out.fraction.push(num.n.toString());\n }\n out.decimal.push(math.number(num));\n }\n }\n }\n return out;\n};\n\nconst buildTickData = (domain, width, ticks, opts) => {\n const result = buildTickDataAsFractions(domain, width, ticks, opts);\n\n const out = result.map((o) => (opts.fraction ? o : { ...o, x: math.number(o.x) || 0 }));\n\n return out;\n};\n","// @ts-nocheck\n/**\n * @synced-from pie-elements/packages/number-line/controller/src/utils.js\n * @auto-generated\n *\n * This file is automatically synced from pie-elements and converted to TypeScript.\n * Manual edits will be overwritten on next sync.\n * To make changes, edit the upstream JavaScript file and run sync again.\n */\n\nimport * as math from 'mathjs';\nimport { generateMajorValuesForMinor, generateMinorValues, getMinorLimits } from './tickUtils.js';\n\n/*\n * This function is duplicated in configure/main.js\n * This function will update major value whenever minor value is changed or tick type is changed\n * @param graph object containing domain, ticks and width value\n * @return graph object with updated ticks values\n * */\nconst updateMajorValue = (graph) => {\n const { domain, ticks, width } = graph;\n const majorValues = generateMajorValuesForMinor(ticks.minor, domain, width);\n if (majorValues.decimal.indexOf(ticks.major) === -1) {\n let currIndex = 0;\n if (ticks.tickIntervalType === 'Integer') {\n currIndex = majorValues.decimal.length > 4 ? 4 : majorValues.decimal.length - 1;\n } else {\n currIndex = majorValues.decimal.length - 1;\n }\n ticks.major = majorValues.decimal[currIndex];\n }\n graph.fraction = ticks.tickIntervalType === 'Fraction' && ticks.major < 1;\n return { ...graph, ticks };\n};\n\n/*\n * This function is duplicated in configure/main.js\n * This function will reload ticks data whenever graph object is changed and also sets required tick object\n * for rendering Ticks Components.\n * @param graph object containing domain, ticks and width value\n * @return graph object with updated ticks values\n * */\n\nexport const reloadTicksData = (graph) => {\n const { domain, ticks = {}, width } = graph;\n //Set tick interval type if not present for legacy number line models depending upon minor value\n if (!ticks.tickIntervalType) {\n if (ticks.minor > 0.5) {\n ticks.tickIntervalType = 'Integer';\n } else {\n ticks.tickIntervalType = 'Decimal';\n }\n }\n // This section will calculate minor and major values array and assign respective value\n // to different tick types object\n const minorLimits = getMinorLimits(domain, width);\n if (minorLimits.min >= 1) {\n /*\n * In this scenario only integer tick will be enabled\n * */\n ticks.tickIntervalType = 'Integer';\n ticks.minor =\n ticks.minor < 1\n ? math.number(math.ceil(minorLimits.min))\n : ticks.minor >= math.number(math.ceil(minorLimits.min)) &&\n ticks.minor <= math.number(math.floor(minorLimits.max))\n ? ticks.minor\n : math.number(math.ceil(minorLimits.min));\n ticks.integerTick = ticks.minor;\n const minorValues = { decimal: [], fraction: [] };\n ticks.fractionTick = '0';\n ticks.decimalTick = 0;\n } else if (minorLimits.min >= 0 && minorLimits.max < 1) {\n /*\n * In this scenario only decimal or fraction tick will be enabled\n * */\n if (ticks.tickIntervalType === 'Integer') {\n ticks.tickIntervalType = 'Fraction';\n }\n const minorValues = generateMinorValues(minorLimits);\n let minValue = math.number(math.fraction(minorValues.fraction[0]));\n let maxValue = math.number(math.fraction(minorValues.fraction[minorValues.fraction.length - 1]));\n if (ticks.minor < minValue || ticks.minor > maxValue) {\n switch (ticks.tickIntervalType) {\n case 'Fraction':\n ticks.minor = math.number(math.fraction(minorValues.fraction[minorValues.fraction.length - 1]));\n ticks.fractionTick = minorValues.fraction[minorValues.fraction.length - 1];\n ticks.decimalTick = minorValues.decimal[0];\n break;\n case 'Decimal':\n case 'Integer':\n ticks.minor = minorValues.decimal[minorValues.decimal.length - 1];\n ticks.decimalTick = minorValues.decimal[minorValues.decimal.length - 1];\n ticks.fractionTick = minorValues.fraction[0];\n }\n } else {\n switch (ticks.tickIntervalType) {\n case 'Fraction':\n let fraction = math.fraction(math.number(ticks.minor));\n ticks.fractionTick = fraction.n + '/' + fraction.d;\n ticks.decimalTick = ticks.decimalTick ? ticks.decimalTick : minorValues.decimal[0];\n break;\n case 'Decimal':\n case 'Integer':\n ticks.decimalTick = ticks.minor;\n ticks.fractionTick = ticks.fractionTick ? ticks.fractionTick : minorValues.fraction[0];\n }\n }\n ticks.integerTick = 1;\n } else if (minorLimits.min < 1 && minorLimits.max >= 1) {\n /*\n * In this scenario all integer, decimal or fraction tick will be enabled\n * */\n const minorValues = generateMinorValues(minorLimits);\n if (!(ticks.minor >= minorLimits.min && ticks.minor <= minorLimits.max)) {\n if (minorLimits.min > 0.5) {\n ticks.tickIntervalType = 'Integer';\n }\n switch (ticks.tickIntervalType) {\n case 'Integer':\n ticks.minor = math.number(math.ceil(minorLimits.min));\n ticks.integerTick = ticks.minor;\n ticks.decimalTick = minorLimits.min > 0.5 ? 0 : minorValues.decimal[0];\n ticks.fractionTick = minorLimits.min > 0.5 ? '0' : minorValues.fraction[0];\n break;\n case 'Decimal':\n ticks.minor = minorValues.decimal[0];\n ticks.integerTick = 1;\n ticks.decimalTick = ticks.minor;\n ticks.fractionTick = minorValues.fraction[0];\n break;\n case 'Fraction':\n ticks.minor = math.number(math.fraction(minorValues.fraction[0]));\n ticks.integerTick = 1;\n ticks.decimalTick = minorValues.decimal[0];\n ticks.fractionTick = minorValues.fraction[0];\n }\n } else {\n switch (ticks.tickIntervalType) {\n case 'Integer':\n ticks.integerTick = ticks.minor;\n ticks.decimalTick = minorLimits.min > 0.5 ? 0 : minorValues.decimal[0];\n ticks.fractionTick = minorLimits.min > 0.5 ? '0' : minorValues.fraction[0];\n break;\n case 'Decimal':\n ticks.integerTick = 1;\n ticks.decimalTick = ticks.minor;\n ticks.fractionTick = minorValues.fraction[0];\n break;\n case 'Fraction':\n ticks.integerTick = 1;\n ticks.decimalTick = minorValues.decimal[0];\n let fraction = math.fraction(math.number(ticks.minor));\n ticks.fractionTick = fraction.n + '/' + fraction.d;\n }\n }\n }\n return updateMajorValue({ ...graph, ticks });\n};\n","// @ts-nocheck\n/**\n * @synced-from pie-elements/packages/number-line/controller/src/index.js\n * @auto-generated\n *\n * This file is automatically synced from pie-elements and converted to TypeScript.\n * Manual edits will be overwritten on next sync.\n * To make changes, edit the upstream JavaScript file and run sync again.\n */\n\nimport { cloneDeep, find, isEmpty, isEqualWith, merge, omitBy } from '@pie-element/shared-lodash';\nimport { getFeedbackForCorrectness } from '@pie-element/shared-feedback';\nimport { partialScoring } from '@pie-element/shared-controller-utils';\nimport * as math from 'mathjs';\n\nimport defaults from './defaults.js';\nimport { reloadTicksData } from './utils.js';\n\nconst score = (number) => {\n return {\n score: {\n scaled: number,\n },\n };\n};\n\nconst getPartialScore = (corrected, ps) => {\n const { correct } = corrected;\n const rule = ps.find((r) => r.numberOfCorrect === correct.length);\n\n if (rule) {\n return 1.0 * (rule.scorePercentage / 100);\n } else {\n return 0;\n }\n};\n\nconst accumulateAnswer = (correctResponse) => (total, answer) => {\n const isCorrectResponse = correctResponse.some((cr) => matches(cr)(answer));\n return total + (isCorrectResponse ? 1 : 0);\n};\n\n/**\n * Generates detailed trace log for scoring evaluation\n * @param {Object} model - the question model\n * @param {Object} session - the student session\n * @param {Object} env - the environment\n * @returns {Array} traceLog - array of trace messages\n */\nexport const getLogTrace = (model, session, env) => {\n const traceLog = [];\n\n const studentAnswers = session?.answer || [];\n const correctResponse = model?.correctResponse || [];\n\n if (!studentAnswers.length) {\n return ['Student did not interact with the number line.'];\n }\n\n const corrected = getCorrected(studentAnswers, cloneDeep(correctResponse));\n const { correct, incorrect, notInAnswer, noCorrectResponse } = corrected;\n\n if (noCorrectResponse) {\n return ['No correct response is defined for this item.'];\n }\n\n const correctCount = correct.length;\n const incorrectCount = incorrect.length;\n const missingCount = notInAnswer.length;\n\n if (correctCount > 0) {\n traceLog.push(`${correctCount} object(s) correctly placed.`);\n }\n\n if (incorrectCount > 0) {\n traceLog.push(`${incorrectCount} incorrect object(s) placed.`);\n }\n\n if (missingCount > 0) {\n traceLog.push(`${missingCount} expected object(s) were not placed.`);\n }\n\n const studentAnswersCopy = [...studentAnswers];\n const correctResponseCopy = [...correctResponse];\n\n correct.forEach((index) => {\n const answer = studentAnswersCopy[index];\n const objectType = answer?.type || 'object';\n traceLog.push(`${objectType.charAt(0).toUpperCase() + objectType.slice(1)} at position ${answer.domainPosition} is correct.`);\n });\n\n incorrect.forEach((index) => {\n const answer = studentAnswersCopy[index];\n const objectType = answer?.type || 'object';\n traceLog.push(`${objectType.charAt(0).toUpperCase() + objectType.slice(1)} at position ${answer.domainPosition} does not match the expected response.`);\n });\n\n notInAnswer.forEach((expectedObject) => {\n const objectType = expectedObject?.type || 'object';\n traceLog.push(`Expected ${objectType} at position ${expectedObject.domainPosition} was not placed by the student.`);\n });\n\n const partialScoringEnabled = partialScoring.enabled(model, env);\n\n if (partialScoringEnabled) {\n traceLog.push('Score calculated using partial scoring.');\n traceLog.push(`Partial scoring is based on the number of correct objects, with deductions for extras.`);\n } else {\n traceLog.push('Score calculated using all-or-nothing scoring.');\n }\n\n const total = correctResponse.length || 1;\n const extraPlacements =\n studentAnswers.length > total ? studentAnswers.length - total : 0;\n\n if (extraPlacements > 0) {\n traceLog.push(\n `${extraPlacements} extra object(s) beyond the required amount were placed and deducted.`,\n );\n }\n\n const rawScore = Math.max(0, (correctCount - extraPlacements) / total);\n const finalScore = partialScoringEnabled ? rawScore : rawScore === 1 ? 1 : 0;\n\n traceLog.push(`Final score: ${finalScore}.`);\n\n return traceLog;\n};\n\n\n/**\n */\nexport function outcome(model, session, env) {\n return new Promise((resolve) => {\n if (!session || isEmpty(session)) {\n resolve({ score: 0, empty: true, logTrace: ['Student did not interact with the number line.'] });\n } else {\n const partialScoringEnabled = partialScoring.enabled(model, env);\n const numCorrect = (session.answer || []).reduce(accumulateAnswer(model.correctResponse), 0);\n\n let total = model.correctResponse.length;\n let numIncorrect = 0;\n\n if ((session.answer || []).length > total) {\n numIncorrect = (session.answer || []).length - total;\n }\n\n if (total === 0) {\n total = 1;\n }\n\n let score = numCorrect < 0 ? 0 : (numCorrect - numIncorrect) / total;\n\n if (score < 0) {\n score = 0;\n }\n\n resolve({ \n score: partialScoringEnabled ? score : score === 1 ? 1 : 0,\n logTrace: getLogTrace(model, session, env)\n });\n }\n });\n}\n\nexport function getScore(question, session) {\n return new Promise((resolve) => {\n if (!session || isEmpty(session)) {\n resolve({ score: { scaled: 0 } });\n } else {\n session.answer = session.answer || [];\n\n const corrected = getCorrected(session.answer, cloneDeep(question.correctResponse));\n\n const correctness = getCorrectness(corrected);\n\n if (correctness === 'correct') {\n resolve(score(1.0));\n } else if (correctness === 'incorrect') {\n resolve(score(0.0));\n } else if (correctness === 'partial') {\n const { allowPartialScoring, partialScoring } = question;\n const ps = (partialScoring || []).filter((o) => !isEmpty(o));\n const canDoPartialScoring = allowPartialScoring && ps.length > 0;\n if (canDoPartialScoring) {\n resolve(score(getPartialScore(corrected, ps)));\n } else {\n resolve(score(0.0));\n }\n } else {\n resolve({ score: { scaled: -1 } });\n }\n }\n });\n}\n\nexport const CLOSE_TO_PRECISION = 3;\n\nexport const closeTo = (a, b, precision) => {\n precision = precision || 5;\n const expectedDiff = Math.pow(10, -precision) / 2;\n const receivedDiff = Math.abs(a - b);\n const close = receivedDiff <= expectedDiff;\n return close;\n};\n\nconst matches = (a) => (v) => {\n return isEqualWith(a, v, (v, ov) => {\n if (typeof v === 'number' && typeof ov === 'number') {\n return closeTo(v, ov, CLOSE_TO_PRECISION);\n }\n });\n};\n\nexport const getCorrected = (answer, correctResponse) => {\n if (isEmpty(correctResponse) && answer.length > 0) {\n return {\n correct: [],\n incorrect: [],\n notInAnswer: [],\n noCorrectResponse: true,\n };\n }\n\n return answer.reduce(\n (acc, a, index) => {\n const { correct, incorrect, notInAnswer } = acc;\n\n const match = find(notInAnswer, matches(a));\n if (match) {\n correct.push(index);\n notInAnswer.splice(notInAnswer.indexOf(match), 1);\n } else {\n incorrect.push(index);\n }\n\n return {\n correct: correct,\n incorrect: incorrect,\n notInAnswer: notInAnswer,\n };\n },\n {\n correct: [],\n incorrect: [],\n notInAnswer: correctResponse,\n },\n );\n};\n\nexport const getCorrectness = (corrected) => {\n const { incorrect, correct, notInAnswer, noCorrectResponse } = corrected;\n\n if (noCorrectResponse) {\n return 'unknown';\n }\n\n if (incorrect.length === 0 && correct.length === 0) {\n return 'unanswered';\n }\n\n if (incorrect.length === 0 && notInAnswer.length === 0) {\n return 'correct';\n }\n\n if (incorrect.length > 0 || notInAnswer.length > 0) {\n if (correct.length > 0) {\n return 'partial';\n } else {\n return 'incorrect';\n }\n }\n\n return 'unknown';\n};\n\n/**\n * A sample of a normalize function see:\n * https://github.com/pie-framework/pie-elements/issues/21\n */\nexport function normalize(question) {\n const feedback = merge(defaults.feedback, question.feedback);\n\n return { ...defaults, ...question, feedback };\n}\n\nexport function createDefaultModel(model = {}) {\n return new Promise((resolve) => {\n const out = {\n ...model,\n graph: {\n ...defaults.graph,\n ...model.graph,\n },\n colorContrast: 'black_on_white',\n };\n\n resolve(omitBy(out, (v) => !v));\n });\n}\n\n// this function is duplicated in configure; at some point, use the same shared function\nconst updateTicks = (model) => {\n const { graph: { domain, labelStep, ticks = {} } = {} } = model;\n const { minor, major } = ticks;\n\n if (domain) {\n domain.min = Number((domain.min || 0).toFixed(2));\n domain.max = Number((domain.max || 0).toFixed(2));\n }\n\n if (labelStep && typeof labelStep === 'string' && labelStep.match(/^[1-9][0-9]*\\/[1-9][0-9]*$/g)) {\n model.graph.fraction = true;\n ticks.tickIntervalType = 'Fraction';\n\n // update the ticks frequency and label value to match the label step if needed\n const step = math.evaluate(labelStep);\n\n if (step !== major) {\n ticks.major = step;\n ticks.minor = step / (major / minor);\n }\n }\n\n return model;\n};\n\nexport async function model(question, session, env) {\n if (!question) {\n throw new Error('question is null');\n }\n\n const normalizedQuestion = await normalize(question);\n const normalizedModel = updateTicks(normalizedQuestion);\n // this function is also called in configure, it is a duplicate to maintain consistency and correctness\n const graph = reloadTicksData(normalizedModel.graph);\n\n if (graph) {\n const evaluateMode = env.mode === 'evaluate';\n\n const correctResponse = cloneDeep(normalizedQuestion.correctResponse);\n const corrected = evaluateMode && getCorrected(session ? session.answer || [] : [], correctResponse);\n const correctness = evaluateMode && getCorrectness(corrected);\n\n const { exhibitOnly } = graph;\n const disabled = env.mode !== 'gather' || exhibitOnly === true;\n let teacherInstructions = null;\n\n if (env.role === 'instructor' && (env.mode === 'view' || evaluateMode)) {\n teacherInstructions = normalizedQuestion.teacherInstructions;\n }\n\n const feedbackMessage = evaluateMode\n ? await getFeedbackForCorrectness(correctness, normalizedQuestion.feedback)\n : undefined;\n\n const out = {\n prompt: normalizedQuestion.prompt,\n teacherInstructions,\n graph,\n disabled,\n corrected,\n correctResponse:\n evaluateMode && ['unanswered', 'correct'].indexOf(correctness) === -1 && normalizedQuestion.correctResponse,\n feedback: feedbackMessage && {\n type: correctness,\n message: feedbackMessage,\n },\n colorContrast: (env.accessibility && env.accessibility.colorContrast) || 'black_on_white',\n language: normalizedQuestion.language,\n extraCSSRules: normalizedQuestion.extraCSSRules,\n };\n return omitBy(out, (v) => !v);\n } else {\n throw new Error('graph is undefined');\n }\n}\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise((resolve) => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n const { correctResponse: answer } = question;\n\n resolve({\n answer,\n id: '1',\n });\n } else {\n resolve(null);\n }\n });\n};\n\n// remove all html tags\nconst getInnerText = (html) => (html || '').replaceAll(/<[^>]*>/g, '');\n\n// remove all html tags except img, iframe and source tag for audio\nconst getContent = (html) => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');\n\nexport const validate = (model = {}, config = {}) => {\n const { graph, correctResponse } = model || {};\n const { maxMaxElements = 20, numberLineDimensions: { min: minWidth = 200, max: maxWidth = 800 } = {} } = config || {};\n const { width, domain, maxNumberOfPoints } = graph || {};\n const { min, max } = domain || {};\n const errors = {};\n\n ['teacherInstructions', 'prompt'].forEach((field) => {\n if (config[field]?.required && !getContent(model[field])) {\n errors[field] = 'This field is required.';\n }\n });\n\n if (width < minWidth || width > maxWidth) {\n errors.widthError = `Width should be a value between ${minWidth} and ${maxWidth}.`;\n }\n\n const MIN_DOMAIN = -100000;\n const MAX_DOMAIN = 100000;\n\n if (min < MIN_DOMAIN || min > MAX_DOMAIN || max < MIN_DOMAIN || max > MAX_DOMAIN) {\n errors.domainError = `Min and max values must both be in the range [${MIN_DOMAIN}, ${MAX_DOMAIN}].`;\n }\n\n if (min >= max) {\n errors.maxError = 'Max value must be greater than min value.';\n }\n\n if (maxNumberOfPoints < 1 || maxNumberOfPoints > maxMaxElements) {\n errors.pointsError = `Max number of elements should be between 1 and ${maxMaxElements}.`;\n }\n\n if (correctResponse && correctResponse.length === 0) {\n errors.correctResponseError = 'The correct answer should include at least one number line object.';\n }\n\n return errors;\n};\n"],"mappings":"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"}