@longsightgroup/qti3-player 0.5.1 → 0.5.4

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 (201) hide show
  1. package/dist/content/content-dom.d.ts +11 -0
  2. package/dist/content/content-dom.d.ts.map +1 -0
  3. package/dist/content/content-dom.js +262 -0
  4. package/dist/content/content-dom.js.map +1 -0
  5. package/dist/content/content-renderer.d.ts +17 -0
  6. package/dist/content/content-renderer.d.ts.map +1 -0
  7. package/dist/content/content-renderer.js +82 -0
  8. package/dist/content/content-renderer.js.map +1 -0
  9. package/dist/controls/remove-button.d.ts +3 -0
  10. package/dist/controls/remove-button.d.ts.map +1 -0
  11. package/dist/controls/remove-button.js +12 -0
  12. package/dist/controls/remove-button.js.map +1 -0
  13. package/dist/interactions/choice-interaction.d.ts +4 -0
  14. package/dist/interactions/choice-interaction.d.ts.map +1 -0
  15. package/dist/interactions/choice-interaction.js +81 -0
  16. package/dist/interactions/choice-interaction.js.map +1 -0
  17. package/dist/interactions/drawing-interaction.d.ts +6 -0
  18. package/dist/interactions/drawing-interaction.d.ts.map +1 -0
  19. package/dist/interactions/drawing-interaction.js +401 -0
  20. package/dist/interactions/drawing-interaction.js.map +1 -0
  21. package/dist/interactions/end-attempt-interaction.d.ts +4 -0
  22. package/dist/interactions/end-attempt-interaction.d.ts.map +1 -0
  23. package/dist/interactions/end-attempt-interaction.js +13 -0
  24. package/dist/interactions/end-attempt-interaction.js.map +1 -0
  25. package/dist/interactions/gap-match-interaction.d.ts +4 -0
  26. package/dist/interactions/gap-match-interaction.d.ts.map +1 -0
  27. package/dist/interactions/gap-match-interaction.js +277 -0
  28. package/dist/interactions/gap-match-interaction.js.map +1 -0
  29. package/dist/interactions/graphic-associate-interaction.d.ts +4 -0
  30. package/dist/interactions/graphic-associate-interaction.d.ts.map +1 -0
  31. package/dist/interactions/graphic-associate-interaction.js +297 -0
  32. package/dist/interactions/graphic-associate-interaction.js.map +1 -0
  33. package/dist/interactions/graphic-context.d.ts +3 -0
  34. package/dist/interactions/graphic-context.d.ts.map +1 -0
  35. package/dist/interactions/graphic-context.js +35 -0
  36. package/dist/interactions/graphic-context.js.map +1 -0
  37. package/dist/interactions/hotspot-interaction.d.ts +4 -0
  38. package/dist/interactions/hotspot-interaction.d.ts.map +1 -0
  39. package/dist/interactions/hotspot-interaction.js +68 -0
  40. package/dist/interactions/hotspot-interaction.js.map +1 -0
  41. package/dist/interactions/hottext-interaction.d.ts +3 -0
  42. package/dist/interactions/hottext-interaction.d.ts.map +1 -0
  43. package/dist/interactions/hottext-interaction.js +66 -0
  44. package/dist/interactions/hottext-interaction.js.map +1 -0
  45. package/dist/interactions/inline-choice-interaction.d.ts +4 -0
  46. package/dist/interactions/inline-choice-interaction.d.ts.map +1 -0
  47. package/dist/interactions/inline-choice-interaction.js +31 -0
  48. package/dist/interactions/inline-choice-interaction.js.map +1 -0
  49. package/dist/interactions/inline-controls.d.ts +6 -0
  50. package/dist/interactions/inline-controls.d.ts.map +1 -0
  51. package/dist/interactions/inline-controls.js +15 -0
  52. package/dist/interactions/inline-controls.js.map +1 -0
  53. package/dist/interactions/interaction-diagnostics.d.ts +7 -0
  54. package/dist/interactions/interaction-diagnostics.d.ts.map +1 -0
  55. package/dist/interactions/interaction-diagnostics.js +137 -0
  56. package/dist/interactions/interaction-diagnostics.js.map +1 -0
  57. package/dist/interactions/interaction-dispatch.d.ts +2 -0
  58. package/dist/interactions/interaction-dispatch.d.ts.map +1 -0
  59. package/dist/interactions/interaction-dispatch.js +2 -0
  60. package/dist/interactions/interaction-dispatch.js.map +1 -0
  61. package/dist/interactions/interaction-label.d.ts +4 -0
  62. package/dist/interactions/interaction-label.d.ts.map +1 -0
  63. package/dist/interactions/interaction-label.js +8 -0
  64. package/dist/interactions/interaction-label.js.map +1 -0
  65. package/dist/interactions/interaction-registry.d.ts +24 -0
  66. package/dist/interactions/interaction-registry.d.ts.map +1 -0
  67. package/dist/interactions/interaction-registry.js +138 -0
  68. package/dist/interactions/interaction-registry.js.map +1 -0
  69. package/dist/interactions/match-interaction.d.ts +4 -0
  70. package/dist/interactions/match-interaction.d.ts.map +1 -0
  71. package/dist/interactions/match-interaction.js +188 -0
  72. package/dist/interactions/match-interaction.js.map +1 -0
  73. package/dist/interactions/object-asset.d.ts +8 -0
  74. package/dist/interactions/object-asset.d.ts.map +1 -0
  75. package/dist/interactions/object-asset.js +182 -0
  76. package/dist/interactions/object-asset.js.map +1 -0
  77. package/dist/interactions/pair-interaction.d.ts +4 -0
  78. package/dist/interactions/pair-interaction.d.ts.map +1 -0
  79. package/dist/interactions/pair-interaction.js +125 -0
  80. package/dist/interactions/pair-interaction.js.map +1 -0
  81. package/dist/interactions/point-value.d.ts +16 -0
  82. package/dist/interactions/point-value.d.ts.map +1 -0
  83. package/dist/interactions/point-value.js +37 -0
  84. package/dist/interactions/point-value.js.map +1 -0
  85. package/dist/interactions/portable-custom-interaction.d.ts +16 -0
  86. package/dist/interactions/portable-custom-interaction.d.ts.map +1 -0
  87. package/dist/interactions/portable-custom-interaction.js +97 -0
  88. package/dist/interactions/portable-custom-interaction.js.map +1 -0
  89. package/dist/interactions/position-object-interaction.d.ts +4 -0
  90. package/dist/interactions/position-object-interaction.d.ts.map +1 -0
  91. package/dist/interactions/position-object-interaction.js +177 -0
  92. package/dist/interactions/position-object-interaction.js.map +1 -0
  93. package/dist/interactions/routing.d.ts +5 -0
  94. package/dist/interactions/routing.d.ts.map +1 -0
  95. package/dist/interactions/routing.js +24 -0
  96. package/dist/interactions/routing.js.map +1 -0
  97. package/dist/interactions/select-point-interaction.d.ts +4 -0
  98. package/dist/interactions/select-point-interaction.d.ts.map +1 -0
  99. package/dist/interactions/select-point-interaction.js +166 -0
  100. package/dist/interactions/select-point-interaction.js.map +1 -0
  101. package/dist/interactions/shared.d.ts +12 -0
  102. package/dist/interactions/shared.d.ts.map +1 -0
  103. package/dist/interactions/shared.js +65 -0
  104. package/dist/interactions/shared.js.map +1 -0
  105. package/dist/interactions/text-interaction.d.ts +6 -0
  106. package/dist/interactions/text-interaction.d.ts.map +1 -0
  107. package/dist/interactions/text-interaction.js +110 -0
  108. package/dist/interactions/text-interaction.js.map +1 -0
  109. package/dist/interactions/unsupported-interaction.d.ts +4 -0
  110. package/dist/interactions/unsupported-interaction.d.ts.map +1 -0
  111. package/dist/interactions/unsupported-interaction.js +23 -0
  112. package/dist/interactions/unsupported-interaction.js.map +1 -0
  113. package/dist/interactions/upload-interaction.d.ts +4 -0
  114. package/dist/interactions/upload-interaction.d.ts.map +1 -0
  115. package/dist/interactions/upload-interaction.js +10 -0
  116. package/dist/interactions/upload-interaction.js.map +1 -0
  117. package/dist/player/attempt-availability.d.ts +6 -0
  118. package/dist/player/attempt-availability.d.ts.map +1 -0
  119. package/dist/player/attempt-availability.js +27 -0
  120. package/dist/player/attempt-availability.js.map +1 -0
  121. package/dist/player/content-state.d.ts +19 -0
  122. package/dist/player/content-state.d.ts.map +1 -0
  123. package/dist/player/content-state.js +39 -0
  124. package/dist/player/content-state.js.map +1 -0
  125. package/dist/player/dynamic-body.d.ts +7 -0
  126. package/dist/player/dynamic-body.d.ts.map +1 -0
  127. package/dist/player/dynamic-body.js +28 -0
  128. package/dist/player/dynamic-body.js.map +1 -0
  129. package/dist/player/feedback-panel.d.ts +3 -0
  130. package/dist/player/feedback-panel.d.ts.map +1 -0
  131. package/dist/player/feedback-panel.js +14 -0
  132. package/dist/player/feedback-panel.js.map +1 -0
  133. package/dist/player/fetch-xml.d.ts +2 -0
  134. package/dist/player/fetch-xml.d.ts.map +1 -0
  135. package/dist/player/fetch-xml.js +10 -0
  136. package/dist/player/fetch-xml.js.map +1 -0
  137. package/dist/player/interaction-render.d.ts +14 -0
  138. package/dist/player/interaction-render.d.ts.map +1 -0
  139. package/dist/player/interaction-render.js +51 -0
  140. package/dist/player/interaction-render.js.map +1 -0
  141. package/dist/player/render-shell.d.ts +8 -0
  142. package/dist/player/render-shell.d.ts.map +1 -0
  143. package/dist/player/render-shell.js +37 -0
  144. package/dist/player/render-shell.js.map +1 -0
  145. package/dist/player/resolve-assets.d.ts +3 -0
  146. package/dist/player/resolve-assets.d.ts.map +1 -0
  147. package/dist/player/resolve-assets.js +12 -0
  148. package/dist/player/resolve-assets.js.map +1 -0
  149. package/dist/player/validation-messages.d.ts +17 -0
  150. package/dist/player/validation-messages.d.ts.map +1 -0
  151. package/dist/player/validation-messages.js +33 -0
  152. package/dist/player/validation-messages.js.map +1 -0
  153. package/dist/reorder/a11y.d.ts +7 -0
  154. package/dist/reorder/a11y.d.ts.map +1 -0
  155. package/dist/reorder/a11y.js +34 -0
  156. package/dist/reorder/a11y.js.map +1 -0
  157. package/dist/reorder/graphic-order-interaction.d.ts +4 -0
  158. package/dist/reorder/graphic-order-interaction.d.ts.map +1 -0
  159. package/dist/reorder/graphic-order-interaction.js +205 -0
  160. package/dist/reorder/graphic-order-interaction.js.map +1 -0
  161. package/dist/reorder/list-controls.d.ts +22 -0
  162. package/dist/reorder/list-controls.d.ts.map +1 -0
  163. package/dist/reorder/list-controls.js +75 -0
  164. package/dist/reorder/list-controls.js.map +1 -0
  165. package/dist/reorder/order-interaction.d.ts +4 -0
  166. package/dist/reorder/order-interaction.d.ts.map +1 -0
  167. package/dist/reorder/order-interaction.js +54 -0
  168. package/dist/reorder/order-interaction.js.map +1 -0
  169. package/dist/styles/base-styles.d.ts +2 -0
  170. package/dist/styles/base-styles.d.ts.map +1 -0
  171. package/dist/styles/base-styles.js +133 -0
  172. package/dist/styles/base-styles.js.map +1 -0
  173. package/dist/styles/choice-hottext-styles.d.ts +2 -0
  174. package/dist/styles/choice-hottext-styles.d.ts.map +1 -0
  175. package/dist/styles/choice-hottext-styles.js +76 -0
  176. package/dist/styles/choice-hottext-styles.js.map +1 -0
  177. package/dist/styles/control-styles.d.ts +2 -0
  178. package/dist/styles/control-styles.d.ts.map +1 -0
  179. package/dist/styles/control-styles.js +114 -0
  180. package/dist/styles/control-styles.js.map +1 -0
  181. package/dist/styles/drawing-styles.d.ts +2 -0
  182. package/dist/styles/drawing-styles.d.ts.map +1 -0
  183. package/dist/styles/drawing-styles.js +30 -0
  184. package/dist/styles/drawing-styles.js.map +1 -0
  185. package/dist/styles/gap-match-styles.d.ts +2 -0
  186. package/dist/styles/gap-match-styles.d.ts.map +1 -0
  187. package/dist/styles/gap-match-styles.js +33 -0
  188. package/dist/styles/gap-match-styles.js.map +1 -0
  189. package/dist/styles/graphic-styles.d.ts +2 -0
  190. package/dist/styles/graphic-styles.d.ts.map +1 -0
  191. package/dist/styles/graphic-styles.js +289 -0
  192. package/dist/styles/graphic-styles.js.map +1 -0
  193. package/dist/styles/match-pair-styles.d.ts +2 -0
  194. package/dist/styles/match-pair-styles.d.ts.map +1 -0
  195. package/dist/styles/match-pair-styles.js +62 -0
  196. package/dist/styles/match-pair-styles.js.map +1 -0
  197. package/dist/styles/text-slider-styles.d.ts +2 -0
  198. package/dist/styles/text-slider-styles.d.ts.map +1 -0
  199. package/dist/styles/text-slider-styles.js +35 -0
  200. package/dist/styles/text-slider-styles.js.map +1 -0
  201. package/package.json +8 -8
@@ -0,0 +1,401 @@
1
+ import { applyResponsiveGraphicSize, objectIsImage } from "../interaction-support.js";
2
+ export const DRAWING_STROKE_COLOR = "#000";
3
+ export const DRAWING_STROKE_WIDTH = 3;
4
+ export function renderDrawingResponse(interaction, update, currentValue, messages) {
5
+ const group = document.createElement("div");
6
+ group.role = "group";
7
+ group.setAttribute("aria-label", messages.message("interactionDrawingResponse", { type: interaction.type }));
8
+ const surface = document.createElementNS("http://www.w3.org/2000/svg", "svg");
9
+ surface.classList.add("qti3-drawing-surface");
10
+ surface.setAttribute("role", "img");
11
+ surface.setAttribute("aria-label", messages.message("drawingSurface"));
12
+ surface.setAttribute("tabindex", "0");
13
+ const width = drawingWidth(interaction);
14
+ const height = drawingHeight(interaction);
15
+ surface.setAttribute("viewBox", `0 0 ${width} ${height}`);
16
+ applyResponsiveGraphicSize(surface, width, height);
17
+ surface.style.touchAction = "none";
18
+ const restoredStrokes = parseDrawingValue(currentValue);
19
+ const authoredBackgroundHref = drawingBackgroundHref(interaction);
20
+ let resolvedAuthoredBackgroundHref = authoredBackgroundHref;
21
+ let activeBackgroundIsAuthored = restoredStrokes.length > 0 || !drawingResponseImage(currentValue);
22
+ let activeBackgroundHref = restoredStrokes.length === 0
23
+ ? (drawingResponseImage(currentValue) ?? authoredBackgroundHref)
24
+ : authoredBackgroundHref;
25
+ const resetSurface = () => {
26
+ const background = activeBackgroundHref
27
+ ? drawingImageElement(activeBackgroundHref, width, height)
28
+ : undefined;
29
+ surface.replaceChildren(...(background ? [background] : []));
30
+ };
31
+ resetSurface();
32
+ const summary = document.createElement("output");
33
+ summary.className = "qti3-coordinate-output qti-visually-hidden";
34
+ summary.setAttribute("aria-live", "polite");
35
+ const strokes = [];
36
+ let activeStroke;
37
+ let commitVersion = 0;
38
+ const commit = (emitResponse = true) => {
39
+ const version = ++commitVersion;
40
+ if (emitResponse) {
41
+ if (strokes.length === 0) {
42
+ update(null);
43
+ }
44
+ else {
45
+ void exportDrawingResponse(interaction, width, height, strokes, () => {
46
+ const currentHref = currentDrawingBackgroundHref(surface);
47
+ if (activeBackgroundIsAuthored && currentHref) {
48
+ resolvedAuthoredBackgroundHref = currentHref;
49
+ }
50
+ return currentHref ?? activeBackgroundHref;
51
+ }).then((value) => {
52
+ if (version === commitVersion)
53
+ update(value);
54
+ });
55
+ }
56
+ }
57
+ const count = strokes.length;
58
+ summary.value = serializeDrawingStrokes(strokes);
59
+ summary.textContent =
60
+ count === 0
61
+ ? messages.message("drawingStatusEmpty")
62
+ : messages.message("drawingStatusStrokeCount", { count });
63
+ surface.setAttribute("aria-label", count === 0
64
+ ? messages.message("drawingSurfaceEmpty")
65
+ : messages.message("drawingSurfaceStrokeCount", { count }));
66
+ };
67
+ for (const points of restoredStrokes) {
68
+ const element = polylineElement(points);
69
+ strokes.push({ points, element });
70
+ surface.append(element);
71
+ }
72
+ const addPoint = (event) => {
73
+ if (!activeStroke)
74
+ return;
75
+ const point = svgPoint(surface, event);
76
+ const previous = activeStroke.points.at(-1);
77
+ if (previous && previous.x === point.x && previous.y === point.y)
78
+ return;
79
+ activeStroke.points.push(point);
80
+ activeStroke.element.setAttribute("points", serializeSvgPoints(activeStroke.points));
81
+ };
82
+ const finishStroke = (event) => {
83
+ if (!activeStroke)
84
+ return;
85
+ addPoint(event);
86
+ const firstPoint = activeStroke.points[0];
87
+ if (activeStroke.points.length === 1 && firstPoint)
88
+ activeStroke.points.push(firstPoint);
89
+ activeStroke.element.setAttribute("points", serializeSvgPoints(activeStroke.points));
90
+ activeStroke = undefined;
91
+ commit();
92
+ };
93
+ surface.addEventListener("pointerdown", (event) => {
94
+ const point = svgPoint(surface, event);
95
+ const element = polylineElement([point]);
96
+ activeStroke = { points: [point], element };
97
+ strokes.push(activeStroke);
98
+ surface.append(element);
99
+ surface.setPointerCapture(event.pointerId);
100
+ });
101
+ surface.addEventListener("pointermove", addPoint);
102
+ surface.addEventListener("pointerup", finishStroke);
103
+ surface.addEventListener("pointercancel", () => {
104
+ activeStroke = undefined;
105
+ });
106
+ surface.addEventListener("keydown", (event) => {
107
+ if (event.key !== "Enter" && event.key !== " ")
108
+ return;
109
+ event.preventDefault();
110
+ const points = [
111
+ { x: 10, y: 10 },
112
+ { x: 90, y: 90 },
113
+ ];
114
+ const element = polylineElement(points);
115
+ strokes.push({ points, element });
116
+ surface.append(element);
117
+ commit();
118
+ });
119
+ const clear = document.createElement("button");
120
+ clear.type = "button";
121
+ clear.textContent = messages.message("clearDrawing");
122
+ clear.addEventListener("click", () => {
123
+ strokes.splice(0, strokes.length);
124
+ activeStroke = undefined;
125
+ if (activeBackgroundIsAuthored) {
126
+ resolvedAuthoredBackgroundHref =
127
+ currentDrawingBackgroundHref(surface) ?? resolvedAuthoredBackgroundHref;
128
+ }
129
+ activeBackgroundHref = resolvedAuthoredBackgroundHref;
130
+ activeBackgroundIsAuthored = true;
131
+ resetSurface();
132
+ commit();
133
+ });
134
+ const tools = document.createElement("div");
135
+ tools.className = "qti3-drawing-tools";
136
+ tools.append(clear);
137
+ commit(false);
138
+ group.append(surface, summary, tools);
139
+ return group;
140
+ }
141
+ function dimension(value, fallback) {
142
+ const parsed = Number(value);
143
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback;
144
+ }
145
+ function scalarString(value) {
146
+ if (value === null || Array.isArray(value) || typeof value === "object")
147
+ return "";
148
+ return String(value);
149
+ }
150
+ function parseDrawingValue(value) {
151
+ const raw = scalarString(value);
152
+ if (!raw)
153
+ return [];
154
+ const metadata = drawingMetadataFromSvgDataUrl(raw);
155
+ if (metadata)
156
+ return parseDrawingStrokePayload(metadata);
157
+ return parseDrawingStrokePayload(raw);
158
+ }
159
+ function drawingMetadataFromSvgDataUrl(raw) {
160
+ if (!raw.startsWith("data:image/svg+xml"))
161
+ return undefined;
162
+ const commaIndex = raw.indexOf(",");
163
+ if (commaIndex === -1)
164
+ return undefined;
165
+ const encoded = raw.slice(commaIndex + 1);
166
+ let svg = "";
167
+ try {
168
+ svg = raw.slice(0, commaIndex).includes(";base64")
169
+ ? atob(encoded)
170
+ : decodeURIComponent(encoded);
171
+ }
172
+ catch {
173
+ return undefined;
174
+ }
175
+ const match = svg.match(/\sdata-qti3-strokes="([^"]*)"/);
176
+ if (!match?.[1])
177
+ return undefined;
178
+ try {
179
+ return decodeURIComponent(match[1]);
180
+ }
181
+ catch {
182
+ return undefined;
183
+ }
184
+ }
185
+ function drawingResponseImage(value) {
186
+ const raw = scalarString(value);
187
+ return raw?.startsWith("data:image/") ? raw : undefined;
188
+ }
189
+ function parseDrawingStrokePayload(raw) {
190
+ return raw
191
+ .split("|")
192
+ .map((stroke) => {
193
+ const numbers = stroke
194
+ .trim()
195
+ .split(/\s+/)
196
+ .map(Number)
197
+ .filter((item) => Number.isFinite(item));
198
+ const points = [];
199
+ for (let index = 0; index + 1 < numbers.length; index += 2) {
200
+ points.push({ x: numbers[index], y: numbers[index + 1] });
201
+ }
202
+ return points;
203
+ })
204
+ .filter((points) => points.length > 0);
205
+ }
206
+ function drawingWidth(interaction) {
207
+ return dimension(interaction.object?.width, 640);
208
+ }
209
+ function drawingHeight(interaction) {
210
+ return dimension(interaction.object?.height, 360);
211
+ }
212
+ function svgPoint(surface, event) {
213
+ const rect = surface.getBoundingClientRect();
214
+ const viewBox = surface.viewBox.baseVal;
215
+ const width = viewBox.width || 160;
216
+ const height = viewBox.height || 120;
217
+ const x = Math.round(((event.clientX - rect.left) / rect.width) * width);
218
+ const y = Math.round(((event.clientY - rect.top) / rect.height) * height);
219
+ return {
220
+ x: Math.max(0, Math.min(width, x)),
221
+ y: Math.max(0, Math.min(height, y)),
222
+ };
223
+ }
224
+ async function exportDrawingResponse(interaction, width, height, strokes, backgroundHref) {
225
+ const href = backgroundHref();
226
+ const mime = drawingResponseMime(interaction.object);
227
+ if (mime === "image/svg+xml") {
228
+ return svgDrawingDataUrl(interaction, width, height, strokes, await portableImageHref(href));
229
+ }
230
+ return rasterDrawingDataUrl(interaction, width, height, strokes, href, mime);
231
+ }
232
+ function drawingResponseMime(object) {
233
+ const candidates = [
234
+ object?.type,
235
+ object?.data,
236
+ ...(object?.sources.map((source) => source.type ?? source.src) ?? []),
237
+ ];
238
+ for (const candidate of candidates) {
239
+ const mime = imageMime(candidate);
240
+ if (mime)
241
+ return mime;
242
+ }
243
+ return "image/svg+xml";
244
+ }
245
+ function imageMime(value) {
246
+ if (!value)
247
+ return undefined;
248
+ const normalized = value.toLowerCase().split(";")[0] ?? "";
249
+ if (normalized === "image/svg+xml")
250
+ return "image/svg+xml";
251
+ if (normalized === "image/png")
252
+ return "image/png";
253
+ if (normalized === "image/jpeg" || normalized === "image/jpg")
254
+ return "image/jpeg";
255
+ if (normalized === "image/webp")
256
+ return "image/webp";
257
+ const dataMime = value.match(/^data:([^;,]+)/i)?.[1]?.toLowerCase();
258
+ if (dataMime)
259
+ return imageMime(dataMime);
260
+ if (/\.svg(?:[?#].*)?$/i.test(value))
261
+ return "image/svg+xml";
262
+ if (/\.png(?:[?#].*)?$/i.test(value))
263
+ return "image/png";
264
+ if (/\.jpe?g(?:[?#].*)?$/i.test(value))
265
+ return "image/jpeg";
266
+ if (/\.webp(?:[?#].*)?$/i.test(value))
267
+ return "image/webp";
268
+ return undefined;
269
+ }
270
+ function svgDrawingDataUrl(interaction, width, height, strokes, backgroundHref) {
271
+ const markup = svgDrawingMarkup(interaction, width, height, strokes, backgroundHref);
272
+ return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(markup)}`;
273
+ }
274
+ function svgDrawingMarkup(interaction, width, height, strokes, backgroundHref) {
275
+ const strokePayload = serializeDrawingStrokes(strokes);
276
+ const background = backgroundHref && interaction.object && objectIsImage(interaction.object)
277
+ ? `<image href="${xmlAttribute(backgroundHref)}" width="${width}" height="${height}" preserveAspectRatio="xMidYMid meet"/>`
278
+ : "";
279
+ const lines = strokes
280
+ .map((stroke) => {
281
+ return `<polyline points="${xmlAttribute(serializeSvgPoints(stroke.points))}" fill="none" stroke="${DRAWING_STROKE_COLOR}" stroke-width="${DRAWING_STROKE_WIDTH}" stroke-linecap="round" stroke-linejoin="round"/>`;
282
+ })
283
+ .join("");
284
+ return `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${width} ${height}" width="${width}" height="${height}"><metadata id="qti3-drawing-response" data-qti3-strokes="${xmlAttribute(encodeURIComponent(strokePayload))}"></metadata>${background}${lines}</svg>`;
285
+ }
286
+ async function rasterDrawingDataUrl(interaction, width, height, strokes, backgroundHref, mime) {
287
+ const canvas = document.createElement("canvas");
288
+ canvas.width = width;
289
+ canvas.height = height;
290
+ const context = canvas.getContext("2d");
291
+ if (!context)
292
+ return svgDrawingDataUrl(interaction, width, height, strokes, backgroundHref);
293
+ if (mime === "image/jpeg") {
294
+ context.fillStyle = "#fff";
295
+ context.fillRect(0, 0, width, height);
296
+ }
297
+ if (backgroundHref && interaction.object && objectIsImage(interaction.object)) {
298
+ try {
299
+ const image = await loadCanvasImage(backgroundHref);
300
+ context.drawImage(image, 0, 0, width, height);
301
+ }
302
+ catch {
303
+ // Export the candidate marks even when the authored background cannot be rasterized.
304
+ }
305
+ }
306
+ context.strokeStyle = DRAWING_STROKE_COLOR;
307
+ context.lineWidth = DRAWING_STROKE_WIDTH;
308
+ context.lineCap = "round";
309
+ context.lineJoin = "round";
310
+ for (const stroke of strokes) {
311
+ const [first, ...rest] = stroke.points;
312
+ if (!first)
313
+ continue;
314
+ context.beginPath();
315
+ context.moveTo(first.x, first.y);
316
+ for (const point of rest)
317
+ context.lineTo(point.x, point.y);
318
+ context.stroke();
319
+ }
320
+ try {
321
+ return canvas.toDataURL(mime);
322
+ }
323
+ catch {
324
+ return svgDrawingDataUrl(interaction, width, height, strokes, backgroundHref);
325
+ }
326
+ }
327
+ function loadCanvasImage(src) {
328
+ return new Promise((resolve, reject) => {
329
+ const image = new Image();
330
+ image.addEventListener("load", () => resolve(image), { once: true });
331
+ image.addEventListener("error", () => reject(new Error(`Unable to load ${src}`)), {
332
+ once: true,
333
+ });
334
+ image.src = src;
335
+ });
336
+ }
337
+ async function portableImageHref(href) {
338
+ if (!href || href.startsWith("data:"))
339
+ return href;
340
+ try {
341
+ const response = await fetch(href);
342
+ if (!response.ok)
343
+ return href;
344
+ return await blobToDataUrl(await response.blob());
345
+ }
346
+ catch {
347
+ return href;
348
+ }
349
+ }
350
+ function blobToDataUrl(blob) {
351
+ return new Promise((resolve, reject) => {
352
+ const reader = new FileReader();
353
+ reader.addEventListener("load", () => {
354
+ resolve(typeof reader.result === "string" ? reader.result : "");
355
+ });
356
+ reader.addEventListener("error", () => {
357
+ reject(reader.error ?? new Error("Unable to read drawing background."));
358
+ });
359
+ reader.readAsDataURL(blob);
360
+ });
361
+ }
362
+ function drawingBackgroundHref(interaction) {
363
+ if (!interaction.object?.data || !objectIsImage(interaction.object))
364
+ return undefined;
365
+ return interaction.object.data;
366
+ }
367
+ function drawingImageElement(href, width, height) {
368
+ const image = document.createElementNS("http://www.w3.org/2000/svg", "image");
369
+ image.setAttribute("href", href);
370
+ image.setAttribute("width", String(width));
371
+ image.setAttribute("height", String(height));
372
+ image.setAttribute("preserveAspectRatio", "xMidYMid meet");
373
+ image.setAttribute("aria-hidden", "true");
374
+ return image;
375
+ }
376
+ function currentDrawingBackgroundHref(surface) {
377
+ return surface.querySelector("image")?.getAttribute("href") ?? undefined;
378
+ }
379
+ function serializeSvgPoints(points) {
380
+ return points.map((point) => `${point.x},${point.y}`).join(" ");
381
+ }
382
+ function serializeDrawingStrokes(strokes) {
383
+ return strokes.map((stroke) => serializeDrawingStroke(stroke.points)).join(" | ");
384
+ }
385
+ function serializeDrawingStroke(points) {
386
+ return points.map((point) => `${point.x} ${point.y}`).join(" ");
387
+ }
388
+ function xmlAttribute(value) {
389
+ return value
390
+ .replaceAll("&", "&amp;")
391
+ .replaceAll('"', "&quot;")
392
+ .replaceAll("<", "&lt;")
393
+ .replaceAll(">", "&gt;");
394
+ }
395
+ function polylineElement(points) {
396
+ const line = document.createElementNS("http://www.w3.org/2000/svg", "polyline");
397
+ line.classList.add("qti3-drawing-stroke");
398
+ line.setAttribute("points", serializeSvgPoints(points));
399
+ return line;
400
+ }
401
+ //# sourceMappingURL=drawing-interaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drawing-interaction.js","sourceRoot":"","sources":["../../src/interactions/drawing-interaction.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { QtiInteraction, QtiValue } from "@longsightgroup/qti3-core";
2
+ import type { PlayerMessageResolver } from "../player-message-resolver.js";
3
+ export declare function renderEndAttemptResponse(interaction: QtiInteraction, update: (value: QtiValue) => void, endAttempt: () => void, messages: PlayerMessageResolver): HTMLElement;
4
+ //# sourceMappingURL=end-attempt-interaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"end-attempt-interaction.d.ts","sourceRoot":"","sources":["../../src/interactions/end-attempt-interaction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAC1E,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAE3E,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,cAAc,EAC3B,MAAM,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,EACjC,UAAU,EAAE,MAAM,IAAI,EACtB,QAAQ,EAAE,qBAAqB,GAC9B,WAAW,CAUb"}
@@ -0,0 +1,13 @@
1
+ export function renderEndAttemptResponse(interaction, update, endAttempt, messages) {
2
+ const button = document.createElement("button");
3
+ button.type = "button";
4
+ button.className = "qti3-end-attempt-button";
5
+ button.textContent = interaction.attributes.title ?? messages.message("endAttempt");
6
+ button.addEventListener("click", () => {
7
+ if (interaction.responseIdentifier)
8
+ update(true);
9
+ endAttempt();
10
+ });
11
+ return button;
12
+ }
13
+ //# sourceMappingURL=end-attempt-interaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"end-attempt-interaction.js","sourceRoot":"","sources":["../../src/interactions/end-attempt-interaction.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,wBAAwB,CACtC,WAA2B,EAC3B,MAAiC,EACjC,UAAsB,EACtB,QAA+B;IAE/B,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAChD,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC;IACvB,MAAM,CAAC,SAAS,GAAG,yBAAyB,CAAC;IAC7C,MAAM,CAAC,WAAW,GAAG,WAAW,CAAC,UAAU,CAAC,KAAK,IAAI,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IACpF,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;QACpC,IAAI,WAAW,CAAC,kBAAkB;YAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QACjD,UAAU,EAAE,CAAC;IACf,CAAC,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { QtiInteraction, QtiValue } from "@longsightgroup/qti3-core";
2
+ import type { PlayerMessageResolver } from "../player-message-resolver.js";
3
+ export declare function renderGapMatchResponse(interaction: QtiInteraction, update: (value: QtiValue) => void, currentValue: QtiValue, messages: PlayerMessageResolver): HTMLElement;
4
+ //# sourceMappingURL=gap-match-interaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gap-match-interaction.d.ts","sourceRoot":"","sources":["../../src/interactions/gap-match-interaction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAa,cAAc,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAWrF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAoB3E,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,cAAc,EAC3B,MAAM,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,EACjC,YAAY,EAAE,QAAQ,EACtB,QAAQ,EAAE,qBAAqB,GAC9B,WAAW,CA6Ib"}