@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.
- package/dist/content/content-dom.d.ts +11 -0
- package/dist/content/content-dom.d.ts.map +1 -0
- package/dist/content/content-dom.js +262 -0
- package/dist/content/content-dom.js.map +1 -0
- package/dist/content/content-renderer.d.ts +17 -0
- package/dist/content/content-renderer.d.ts.map +1 -0
- package/dist/content/content-renderer.js +82 -0
- package/dist/content/content-renderer.js.map +1 -0
- package/dist/controls/remove-button.d.ts +3 -0
- package/dist/controls/remove-button.d.ts.map +1 -0
- package/dist/controls/remove-button.js +12 -0
- package/dist/controls/remove-button.js.map +1 -0
- package/dist/interactions/choice-interaction.d.ts +4 -0
- package/dist/interactions/choice-interaction.d.ts.map +1 -0
- package/dist/interactions/choice-interaction.js +81 -0
- package/dist/interactions/choice-interaction.js.map +1 -0
- package/dist/interactions/drawing-interaction.d.ts +6 -0
- package/dist/interactions/drawing-interaction.d.ts.map +1 -0
- package/dist/interactions/drawing-interaction.js +401 -0
- package/dist/interactions/drawing-interaction.js.map +1 -0
- package/dist/interactions/end-attempt-interaction.d.ts +4 -0
- package/dist/interactions/end-attempt-interaction.d.ts.map +1 -0
- package/dist/interactions/end-attempt-interaction.js +13 -0
- package/dist/interactions/end-attempt-interaction.js.map +1 -0
- package/dist/interactions/gap-match-interaction.d.ts +4 -0
- package/dist/interactions/gap-match-interaction.d.ts.map +1 -0
- package/dist/interactions/gap-match-interaction.js +277 -0
- package/dist/interactions/gap-match-interaction.js.map +1 -0
- package/dist/interactions/graphic-associate-interaction.d.ts +4 -0
- package/dist/interactions/graphic-associate-interaction.d.ts.map +1 -0
- package/dist/interactions/graphic-associate-interaction.js +297 -0
- package/dist/interactions/graphic-associate-interaction.js.map +1 -0
- package/dist/interactions/graphic-context.d.ts +3 -0
- package/dist/interactions/graphic-context.d.ts.map +1 -0
- package/dist/interactions/graphic-context.js +35 -0
- package/dist/interactions/graphic-context.js.map +1 -0
- package/dist/interactions/hotspot-interaction.d.ts +4 -0
- package/dist/interactions/hotspot-interaction.d.ts.map +1 -0
- package/dist/interactions/hotspot-interaction.js +68 -0
- package/dist/interactions/hotspot-interaction.js.map +1 -0
- package/dist/interactions/hottext-interaction.d.ts +3 -0
- package/dist/interactions/hottext-interaction.d.ts.map +1 -0
- package/dist/interactions/hottext-interaction.js +66 -0
- package/dist/interactions/hottext-interaction.js.map +1 -0
- package/dist/interactions/inline-choice-interaction.d.ts +4 -0
- package/dist/interactions/inline-choice-interaction.d.ts.map +1 -0
- package/dist/interactions/inline-choice-interaction.js +31 -0
- package/dist/interactions/inline-choice-interaction.js.map +1 -0
- package/dist/interactions/inline-controls.d.ts +6 -0
- package/dist/interactions/inline-controls.d.ts.map +1 -0
- package/dist/interactions/inline-controls.js +15 -0
- package/dist/interactions/inline-controls.js.map +1 -0
- package/dist/interactions/interaction-diagnostics.d.ts +7 -0
- package/dist/interactions/interaction-diagnostics.d.ts.map +1 -0
- package/dist/interactions/interaction-diagnostics.js +137 -0
- package/dist/interactions/interaction-diagnostics.js.map +1 -0
- package/dist/interactions/interaction-dispatch.d.ts +2 -0
- package/dist/interactions/interaction-dispatch.d.ts.map +1 -0
- package/dist/interactions/interaction-dispatch.js +2 -0
- package/dist/interactions/interaction-dispatch.js.map +1 -0
- package/dist/interactions/interaction-label.d.ts +4 -0
- package/dist/interactions/interaction-label.d.ts.map +1 -0
- package/dist/interactions/interaction-label.js +8 -0
- package/dist/interactions/interaction-label.js.map +1 -0
- package/dist/interactions/interaction-registry.d.ts +24 -0
- package/dist/interactions/interaction-registry.d.ts.map +1 -0
- package/dist/interactions/interaction-registry.js +138 -0
- package/dist/interactions/interaction-registry.js.map +1 -0
- package/dist/interactions/match-interaction.d.ts +4 -0
- package/dist/interactions/match-interaction.d.ts.map +1 -0
- package/dist/interactions/match-interaction.js +188 -0
- package/dist/interactions/match-interaction.js.map +1 -0
- package/dist/interactions/object-asset.d.ts +8 -0
- package/dist/interactions/object-asset.d.ts.map +1 -0
- package/dist/interactions/object-asset.js +182 -0
- package/dist/interactions/object-asset.js.map +1 -0
- package/dist/interactions/pair-interaction.d.ts +4 -0
- package/dist/interactions/pair-interaction.d.ts.map +1 -0
- package/dist/interactions/pair-interaction.js +125 -0
- package/dist/interactions/pair-interaction.js.map +1 -0
- package/dist/interactions/point-value.d.ts +16 -0
- package/dist/interactions/point-value.d.ts.map +1 -0
- package/dist/interactions/point-value.js +37 -0
- package/dist/interactions/point-value.js.map +1 -0
- package/dist/interactions/portable-custom-interaction.d.ts +16 -0
- package/dist/interactions/portable-custom-interaction.d.ts.map +1 -0
- package/dist/interactions/portable-custom-interaction.js +97 -0
- package/dist/interactions/portable-custom-interaction.js.map +1 -0
- package/dist/interactions/position-object-interaction.d.ts +4 -0
- package/dist/interactions/position-object-interaction.d.ts.map +1 -0
- package/dist/interactions/position-object-interaction.js +177 -0
- package/dist/interactions/position-object-interaction.js.map +1 -0
- package/dist/interactions/routing.d.ts +5 -0
- package/dist/interactions/routing.d.ts.map +1 -0
- package/dist/interactions/routing.js +24 -0
- package/dist/interactions/routing.js.map +1 -0
- package/dist/interactions/select-point-interaction.d.ts +4 -0
- package/dist/interactions/select-point-interaction.d.ts.map +1 -0
- package/dist/interactions/select-point-interaction.js +166 -0
- package/dist/interactions/select-point-interaction.js.map +1 -0
- package/dist/interactions/shared.d.ts +12 -0
- package/dist/interactions/shared.d.ts.map +1 -0
- package/dist/interactions/shared.js +65 -0
- package/dist/interactions/shared.js.map +1 -0
- package/dist/interactions/text-interaction.d.ts +6 -0
- package/dist/interactions/text-interaction.d.ts.map +1 -0
- package/dist/interactions/text-interaction.js +110 -0
- package/dist/interactions/text-interaction.js.map +1 -0
- package/dist/interactions/unsupported-interaction.d.ts +4 -0
- package/dist/interactions/unsupported-interaction.d.ts.map +1 -0
- package/dist/interactions/unsupported-interaction.js +23 -0
- package/dist/interactions/unsupported-interaction.js.map +1 -0
- package/dist/interactions/upload-interaction.d.ts +4 -0
- package/dist/interactions/upload-interaction.d.ts.map +1 -0
- package/dist/interactions/upload-interaction.js +10 -0
- package/dist/interactions/upload-interaction.js.map +1 -0
- package/dist/player/attempt-availability.d.ts +6 -0
- package/dist/player/attempt-availability.d.ts.map +1 -0
- package/dist/player/attempt-availability.js +27 -0
- package/dist/player/attempt-availability.js.map +1 -0
- package/dist/player/content-state.d.ts +19 -0
- package/dist/player/content-state.d.ts.map +1 -0
- package/dist/player/content-state.js +39 -0
- package/dist/player/content-state.js.map +1 -0
- package/dist/player/dynamic-body.d.ts +7 -0
- package/dist/player/dynamic-body.d.ts.map +1 -0
- package/dist/player/dynamic-body.js +28 -0
- package/dist/player/dynamic-body.js.map +1 -0
- package/dist/player/feedback-panel.d.ts +3 -0
- package/dist/player/feedback-panel.d.ts.map +1 -0
- package/dist/player/feedback-panel.js +14 -0
- package/dist/player/feedback-panel.js.map +1 -0
- package/dist/player/fetch-xml.d.ts +2 -0
- package/dist/player/fetch-xml.d.ts.map +1 -0
- package/dist/player/fetch-xml.js +10 -0
- package/dist/player/fetch-xml.js.map +1 -0
- package/dist/player/interaction-render.d.ts +14 -0
- package/dist/player/interaction-render.d.ts.map +1 -0
- package/dist/player/interaction-render.js +51 -0
- package/dist/player/interaction-render.js.map +1 -0
- package/dist/player/render-shell.d.ts +8 -0
- package/dist/player/render-shell.d.ts.map +1 -0
- package/dist/player/render-shell.js +37 -0
- package/dist/player/render-shell.js.map +1 -0
- package/dist/player/resolve-assets.d.ts +3 -0
- package/dist/player/resolve-assets.d.ts.map +1 -0
- package/dist/player/resolve-assets.js +12 -0
- package/dist/player/resolve-assets.js.map +1 -0
- package/dist/player/validation-messages.d.ts +17 -0
- package/dist/player/validation-messages.d.ts.map +1 -0
- package/dist/player/validation-messages.js +33 -0
- package/dist/player/validation-messages.js.map +1 -0
- package/dist/reorder/a11y.d.ts +7 -0
- package/dist/reorder/a11y.d.ts.map +1 -0
- package/dist/reorder/a11y.js +34 -0
- package/dist/reorder/a11y.js.map +1 -0
- package/dist/reorder/graphic-order-interaction.d.ts +4 -0
- package/dist/reorder/graphic-order-interaction.d.ts.map +1 -0
- package/dist/reorder/graphic-order-interaction.js +205 -0
- package/dist/reorder/graphic-order-interaction.js.map +1 -0
- package/dist/reorder/list-controls.d.ts +22 -0
- package/dist/reorder/list-controls.d.ts.map +1 -0
- package/dist/reorder/list-controls.js +75 -0
- package/dist/reorder/list-controls.js.map +1 -0
- package/dist/reorder/order-interaction.d.ts +4 -0
- package/dist/reorder/order-interaction.d.ts.map +1 -0
- package/dist/reorder/order-interaction.js +54 -0
- package/dist/reorder/order-interaction.js.map +1 -0
- package/dist/styles/base-styles.d.ts +2 -0
- package/dist/styles/base-styles.d.ts.map +1 -0
- package/dist/styles/base-styles.js +133 -0
- package/dist/styles/base-styles.js.map +1 -0
- package/dist/styles/choice-hottext-styles.d.ts +2 -0
- package/dist/styles/choice-hottext-styles.d.ts.map +1 -0
- package/dist/styles/choice-hottext-styles.js +76 -0
- package/dist/styles/choice-hottext-styles.js.map +1 -0
- package/dist/styles/control-styles.d.ts +2 -0
- package/dist/styles/control-styles.d.ts.map +1 -0
- package/dist/styles/control-styles.js +114 -0
- package/dist/styles/control-styles.js.map +1 -0
- package/dist/styles/drawing-styles.d.ts +2 -0
- package/dist/styles/drawing-styles.d.ts.map +1 -0
- package/dist/styles/drawing-styles.js +30 -0
- package/dist/styles/drawing-styles.js.map +1 -0
- package/dist/styles/gap-match-styles.d.ts +2 -0
- package/dist/styles/gap-match-styles.d.ts.map +1 -0
- package/dist/styles/gap-match-styles.js +33 -0
- package/dist/styles/gap-match-styles.js.map +1 -0
- package/dist/styles/graphic-styles.d.ts +2 -0
- package/dist/styles/graphic-styles.d.ts.map +1 -0
- package/dist/styles/graphic-styles.js +289 -0
- package/dist/styles/graphic-styles.js.map +1 -0
- package/dist/styles/match-pair-styles.d.ts +2 -0
- package/dist/styles/match-pair-styles.d.ts.map +1 -0
- package/dist/styles/match-pair-styles.js +62 -0
- package/dist/styles/match-pair-styles.js.map +1 -0
- package/dist/styles/text-slider-styles.d.ts +2 -0
- package/dist/styles/text-slider-styles.d.ts.map +1 -0
- package/dist/styles/text-slider-styles.js +35 -0
- package/dist/styles/text-slider-styles.js.map +1 -0
- package/package.json +8 -8
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { applyGraphicSurfaceLayout, applyPointMarkerPlacement, appendGraphicObjectImage, objectHeight, objectWidth, responseGroup, } from "../interaction-support.js";
|
|
2
|
+
import { movementButton } from "../movement.js";
|
|
3
|
+
import { maximumAllowedResponses } from "../response-limits.js";
|
|
4
|
+
import { parsePointValues, pointToString } from "./point-value.js";
|
|
5
|
+
export function renderSelectPointResponse(interaction, update, currentValue, messages) {
|
|
6
|
+
const group = responseGroup();
|
|
7
|
+
group.role = "group";
|
|
8
|
+
group.setAttribute("aria-label", messages.message("interactionCoordinateResponse", { type: interaction.type }));
|
|
9
|
+
const isMultiple = interaction.responseCardinality === "multiple";
|
|
10
|
+
const maxPoints = isMultiple ? maximumAllowedResponses(interaction) : 1;
|
|
11
|
+
const surface = document.createElement("button");
|
|
12
|
+
surface.type = "button";
|
|
13
|
+
applyGraphicSurfaceLayout(surface, objectWidth(interaction), objectHeight(interaction), "qti3-point-surface");
|
|
14
|
+
surface.setAttribute("aria-label", messages.message("interactionCoordinateArea", { type: interaction.type }));
|
|
15
|
+
const object = interaction.object;
|
|
16
|
+
if (object) {
|
|
17
|
+
appendGraphicObjectImage(surface, object, "");
|
|
18
|
+
}
|
|
19
|
+
const width = objectWidth(interaction);
|
|
20
|
+
const height = objectHeight(interaction);
|
|
21
|
+
let points = parsePointValues(currentValue);
|
|
22
|
+
let activeIndex = points.length > 0 ? points.length - 1 : -1;
|
|
23
|
+
const coordinate = document.createElement("output");
|
|
24
|
+
coordinate.className = "qti3-coordinate-output qti-visually-hidden";
|
|
25
|
+
coordinate.setAttribute("aria-live", "polite");
|
|
26
|
+
const initialPoint = () => ({
|
|
27
|
+
x: Math.round(width / 2),
|
|
28
|
+
y: Math.round(height / 2),
|
|
29
|
+
});
|
|
30
|
+
const emitValue = () => {
|
|
31
|
+
const values = points.map(pointToString);
|
|
32
|
+
if (isMultiple)
|
|
33
|
+
return values;
|
|
34
|
+
return values[0] ?? "";
|
|
35
|
+
};
|
|
36
|
+
const commit = () => {
|
|
37
|
+
update(emitValue());
|
|
38
|
+
};
|
|
39
|
+
const syncMarker = () => {
|
|
40
|
+
surface.querySelectorAll(".qti3-point-marker").forEach((marker) => marker.remove());
|
|
41
|
+
if (points.length === 0) {
|
|
42
|
+
coordinate.value = "";
|
|
43
|
+
coordinate.textContent = messages.message("noPointSelected");
|
|
44
|
+
surface.setAttribute("aria-label", messages.message("interactionCoordinateArea", { type: interaction.type }));
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
points.forEach((point, index) => {
|
|
48
|
+
const marker = document.createElement("span");
|
|
49
|
+
marker.className = "qti3-point-marker";
|
|
50
|
+
marker.setAttribute("aria-hidden", "true");
|
|
51
|
+
applyPointMarkerPlacement(marker, `${(point.x / width) * 100}%`, `${(point.y / height) * 100}%`);
|
|
52
|
+
if (index === activeIndex)
|
|
53
|
+
marker.dataset.active = "true";
|
|
54
|
+
surface.append(marker);
|
|
55
|
+
});
|
|
56
|
+
const text = points.map(pointToString).join("; ");
|
|
57
|
+
coordinate.value = isMultiple
|
|
58
|
+
? points.map(pointToString).join(" | ")
|
|
59
|
+
: pointToString(points[0]);
|
|
60
|
+
coordinate.textContent = isMultiple
|
|
61
|
+
? messages.message("selectedPointsSummary", { count: points.length, coordinates: text })
|
|
62
|
+
: messages.message("selectedPointAt", { coordinates: pointToString(points[0]) });
|
|
63
|
+
surface.setAttribute("aria-label", messages.message("interactionCoordinateAreaSelected", {
|
|
64
|
+
type: interaction.type,
|
|
65
|
+
coordinates: text,
|
|
66
|
+
}));
|
|
67
|
+
};
|
|
68
|
+
const clampPoint = (point) => {
|
|
69
|
+
point.x = Math.max(0, Math.min(width, point.x));
|
|
70
|
+
point.y = Math.max(0, Math.min(height, point.y));
|
|
71
|
+
};
|
|
72
|
+
const setActivePoint = (point) => {
|
|
73
|
+
clampPoint(point);
|
|
74
|
+
if (!isMultiple) {
|
|
75
|
+
points = [point];
|
|
76
|
+
activeIndex = 0;
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
if (maxPoints !== undefined && points.length >= maxPoints) {
|
|
80
|
+
points[points.length - 1] = point;
|
|
81
|
+
activeIndex = points.length - 1;
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
points.push(point);
|
|
85
|
+
activeIndex = points.length - 1;
|
|
86
|
+
};
|
|
87
|
+
const mutableActivePoint = () => {
|
|
88
|
+
if (points.length === 0)
|
|
89
|
+
setActivePoint(initialPoint());
|
|
90
|
+
if (activeIndex < 0 || activeIndex >= points.length)
|
|
91
|
+
activeIndex = points.length - 1;
|
|
92
|
+
const point = points[activeIndex];
|
|
93
|
+
if (point)
|
|
94
|
+
return point;
|
|
95
|
+
const fallback = initialPoint();
|
|
96
|
+
points = [fallback];
|
|
97
|
+
activeIndex = 0;
|
|
98
|
+
return fallback;
|
|
99
|
+
};
|
|
100
|
+
surface.addEventListener("click", (event) => {
|
|
101
|
+
if (event.detail === 0)
|
|
102
|
+
return;
|
|
103
|
+
const rect = surface.getBoundingClientRect();
|
|
104
|
+
setActivePoint({
|
|
105
|
+
x: Math.round(((event.clientX - rect.left) / rect.width) * width),
|
|
106
|
+
y: Math.round(((event.clientY - rect.top) / rect.height) * height),
|
|
107
|
+
});
|
|
108
|
+
syncMarker();
|
|
109
|
+
commit();
|
|
110
|
+
});
|
|
111
|
+
surface.addEventListener("keydown", (event) => {
|
|
112
|
+
const point = mutableActivePoint();
|
|
113
|
+
const step = event.shiftKey ? 10 : 1;
|
|
114
|
+
if (event.key === "ArrowLeft")
|
|
115
|
+
point.x -= step;
|
|
116
|
+
else if (event.key === "ArrowRight")
|
|
117
|
+
point.x += step;
|
|
118
|
+
else if (event.key === "ArrowUp")
|
|
119
|
+
point.y -= step;
|
|
120
|
+
else if (event.key === "ArrowDown")
|
|
121
|
+
point.y += step;
|
|
122
|
+
else if (event.key === "Enter" || event.key === " ") {
|
|
123
|
+
event.preventDefault();
|
|
124
|
+
commit();
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
else
|
|
128
|
+
return;
|
|
129
|
+
event.preventDefault();
|
|
130
|
+
clampPoint(point);
|
|
131
|
+
syncMarker();
|
|
132
|
+
});
|
|
133
|
+
syncMarker();
|
|
134
|
+
const controls = document.createElement("div");
|
|
135
|
+
controls.className = "qti3-point-controls";
|
|
136
|
+
for (const [direction, dx, dy] of [
|
|
137
|
+
["up", 0, -1],
|
|
138
|
+
["left", -1, 0],
|
|
139
|
+
["right", 1, 0],
|
|
140
|
+
["down", 0, 1],
|
|
141
|
+
]) {
|
|
142
|
+
controls.append(movementButton(direction, messages.message("movePoint", { direction }), () => {
|
|
143
|
+
const point = mutableActivePoint();
|
|
144
|
+
point.x += dx;
|
|
145
|
+
point.y += dy;
|
|
146
|
+
clampPoint(point);
|
|
147
|
+
syncMarker();
|
|
148
|
+
commit();
|
|
149
|
+
}));
|
|
150
|
+
}
|
|
151
|
+
if (isMultiple) {
|
|
152
|
+
const clear = document.createElement("button");
|
|
153
|
+
clear.type = "button";
|
|
154
|
+
clear.textContent = messages.message("clearPoints");
|
|
155
|
+
clear.addEventListener("click", () => {
|
|
156
|
+
points = [];
|
|
157
|
+
activeIndex = -1;
|
|
158
|
+
syncMarker();
|
|
159
|
+
commit();
|
|
160
|
+
});
|
|
161
|
+
controls.append(clear);
|
|
162
|
+
}
|
|
163
|
+
group.append(surface, coordinate, controls);
|
|
164
|
+
return group;
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=select-point-interaction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"select-point-interaction.js","sourceRoot":"","sources":["../../src/interactions/select-point-interaction.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { QtiChoice, QtiInteraction } from "@longsightgroup/qti3-core";
|
|
2
|
+
import type { PlayerMessageResolver } from "../player-message-resolver.js";
|
|
3
|
+
export declare function tokenRegion(label: string, visibleLabel?: string): HTMLElement;
|
|
4
|
+
export declare function tokenButton(choice: QtiChoice): HTMLButtonElement;
|
|
5
|
+
export declare function choiceText(choices: QtiChoice[], identifier: string | undefined): string;
|
|
6
|
+
export declare function sourceChoices(interaction: QtiInteraction): QtiChoice[];
|
|
7
|
+
export declare function targetChoices(interaction: QtiInteraction): QtiChoice[];
|
|
8
|
+
export declare function pairRegionLabels(interaction: QtiInteraction, messages: PlayerMessageResolver): {
|
|
9
|
+
source: string;
|
|
10
|
+
target: string;
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/interactions/shared.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAG3E,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,WAAW,CAY7E;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,SAAS,GAAG,iBAAiB,CAQhE;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAGvF;AAED,wBAAgB,aAAa,CAAC,WAAW,EAAE,cAAc,GAAG,SAAS,EAAE,CAStE;AAED,wBAAgB,aAAa,CAAC,WAAW,EAAE,cAAc,GAAG,SAAS,EAAE,CAMtE;AAED,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,cAAc,EAC3B,QAAQ,EAAE,qBAAqB,GAC9B;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAiBpC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { interactionChoices } from "../interaction-support.js";
|
|
2
|
+
export function tokenRegion(label, visibleLabel) {
|
|
3
|
+
const region = document.createElement("div");
|
|
4
|
+
region.className = "qti3-token-region";
|
|
5
|
+
region.role = "group";
|
|
6
|
+
region.setAttribute("aria-label", label);
|
|
7
|
+
if (visibleLabel) {
|
|
8
|
+
const heading = document.createElement("strong");
|
|
9
|
+
heading.className = "qti3-region-label";
|
|
10
|
+
heading.textContent = visibleLabel;
|
|
11
|
+
region.append(heading);
|
|
12
|
+
}
|
|
13
|
+
return region;
|
|
14
|
+
}
|
|
15
|
+
export function tokenButton(choice) {
|
|
16
|
+
const button = document.createElement("button");
|
|
17
|
+
button.type = "button";
|
|
18
|
+
button.className = "qti3-token";
|
|
19
|
+
button.dataset.choiceIdentifier = choice.identifier;
|
|
20
|
+
button.setAttribute("aria-pressed", "false");
|
|
21
|
+
button.textContent = choice.text;
|
|
22
|
+
return button;
|
|
23
|
+
}
|
|
24
|
+
export function choiceText(choices, identifier) {
|
|
25
|
+
if (!identifier)
|
|
26
|
+
return "";
|
|
27
|
+
return choices.find((choice) => choice.identifier === identifier)?.text ?? identifier;
|
|
28
|
+
}
|
|
29
|
+
export function sourceChoices(interaction) {
|
|
30
|
+
const choices = interactionChoices(interaction);
|
|
31
|
+
if (interaction.type === "gapMatch" || interaction.type === "graphicGapMatch") {
|
|
32
|
+
const gapChoices = choices.filter((choice) => choice.role === "gapChoice");
|
|
33
|
+
return gapChoices.length > 0 ? gapChoices : choices;
|
|
34
|
+
}
|
|
35
|
+
const sourceRoles = new Set(["associableChoice", "matchSource", "gapChoice", "hotspot"]);
|
|
36
|
+
const sources = choices.filter((choice) => sourceRoles.has(choice.role));
|
|
37
|
+
return sources.length > 0 ? sources : choices;
|
|
38
|
+
}
|
|
39
|
+
export function targetChoices(interaction) {
|
|
40
|
+
const choices = interactionChoices(interaction);
|
|
41
|
+
if (interaction.type === "associate" || interaction.type === "graphicAssociate")
|
|
42
|
+
return choices;
|
|
43
|
+
const targetRoles = new Set(["matchTarget", "gap", "hotspot"]);
|
|
44
|
+
const targets = choices.filter((choice) => targetRoles.has(choice.role));
|
|
45
|
+
return targets.length > 0 ? targets : choices;
|
|
46
|
+
}
|
|
47
|
+
export function pairRegionLabels(interaction, messages) {
|
|
48
|
+
if (interaction.type === "associate") {
|
|
49
|
+
return {
|
|
50
|
+
source: messages.message("associateFirstConceptRegion"),
|
|
51
|
+
target: messages.message("associatePairWithRegion"),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
if (interaction.type === "match") {
|
|
55
|
+
return {
|
|
56
|
+
source: messages.message("matchPromptRegion"),
|
|
57
|
+
target: messages.message("matchMatchRegion"),
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
return {
|
|
61
|
+
source: messages.message("genericSourceRegion"),
|
|
62
|
+
target: messages.message("genericTargetRegion"),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/interactions/shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { QtiInteraction, QtiValue } from "@longsightgroup/qti3-core";
|
|
2
|
+
import type { PlayerMessageResolver } from "../player-message-resolver.js";
|
|
3
|
+
export declare function renderTextResponse(interaction: QtiInteraction, update: (value: QtiValue) => void, mode: "entry" | "extended", currentValue: QtiValue, messages: PlayerMessageResolver): HTMLElement;
|
|
4
|
+
export declare function renderInlineTextEntry(interaction: QtiInteraction, update: (value: QtiValue) => void, currentValue: QtiValue, messages: PlayerMessageResolver): HTMLElement;
|
|
5
|
+
export declare function renderSliderResponse(interaction: QtiInteraction, update: (value: QtiValue) => void, currentValue: QtiValue, messages: PlayerMessageResolver): HTMLElement;
|
|
6
|
+
//# sourceMappingURL=text-interaction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text-interaction.d.ts","sourceRoot":"","sources":["../../src/interactions/text-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;AA6B3E,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,cAAc,EAC3B,MAAM,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,EACjC,IAAI,EAAE,OAAO,GAAG,UAAU,EAC1B,YAAY,EAAE,QAAQ,EACtB,QAAQ,EAAE,qBAAqB,GAC9B,WAAW,CA4Cb;AAED,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,cAAc,EAC3B,MAAM,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,EACjC,YAAY,EAAE,QAAQ,EACtB,QAAQ,EAAE,qBAAqB,GAC9B,WAAW,CAoBb;AAED,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,cAAc,EAC3B,MAAM,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,EACjC,YAAY,EAAE,QAAQ,EACtB,QAAQ,EAAE,qBAAqB,GAC9B,WAAW,CAsBb"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
function scalarString(value) {
|
|
2
|
+
if (value === null || Array.isArray(value) || typeof value === "object")
|
|
3
|
+
return "";
|
|
4
|
+
return String(value);
|
|
5
|
+
}
|
|
6
|
+
function coerceResponseInputValue(value, baseType) {
|
|
7
|
+
if (baseType === "integer")
|
|
8
|
+
return Number.parseInt(value, 10);
|
|
9
|
+
if (baseType === "float")
|
|
10
|
+
return Number.parseFloat(value);
|
|
11
|
+
if (baseType === "boolean") {
|
|
12
|
+
if (value === "true")
|
|
13
|
+
return true;
|
|
14
|
+
if (value === "false")
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
return value;
|
|
18
|
+
}
|
|
19
|
+
function applyExpectedTextEntryWidth(control, expectedLength) {
|
|
20
|
+
if (!(control instanceof HTMLInputElement) || expectedLength <= 0)
|
|
21
|
+
return;
|
|
22
|
+
const width = Math.max(8, Math.min(expectedLength + 2, 72));
|
|
23
|
+
control.style.inlineSize = `${width}ch`;
|
|
24
|
+
}
|
|
25
|
+
export function renderTextResponse(interaction, update, mode, currentValue, messages) {
|
|
26
|
+
const group = document.createElement("div");
|
|
27
|
+
group.className = "qti3-text-response";
|
|
28
|
+
const expectedLength = Number(interaction.attributes["expected-length"] ?? 0);
|
|
29
|
+
const expectedLines = Number(interaction.attributes["expected-lines"] ?? 0);
|
|
30
|
+
const control = mode === "extended" ? document.createElement("textarea") : document.createElement("input");
|
|
31
|
+
control.className = mode === "extended" ? "qti3-textarea" : "qti3-text-input";
|
|
32
|
+
control.value = scalarString(currentValue);
|
|
33
|
+
control.setAttribute("aria-label", interaction.prompt ??
|
|
34
|
+
(mode === "extended"
|
|
35
|
+
? messages.message("extendedTextResponseLabel")
|
|
36
|
+
: messages.message("textResponseLabel")));
|
|
37
|
+
if (mode === "extended" && expectedLines > 0) {
|
|
38
|
+
control.rows = expectedLines;
|
|
39
|
+
}
|
|
40
|
+
if (mode === "entry") {
|
|
41
|
+
applyExpectedTextEntryWidth(control, expectedLength);
|
|
42
|
+
}
|
|
43
|
+
const counter = mode === "extended" ? document.createElement("p") : undefined;
|
|
44
|
+
if (counter) {
|
|
45
|
+
counter.className = "qti3-counter";
|
|
46
|
+
counter.setAttribute("aria-live", "polite");
|
|
47
|
+
}
|
|
48
|
+
const sync = (emitResponse = true) => {
|
|
49
|
+
const value = control.value;
|
|
50
|
+
if (counter) {
|
|
51
|
+
const words = value.trim().length > 0 ? value.trim().split(/\s+/).length : 0;
|
|
52
|
+
counter.textContent = messages.message("extendedTextCounter", {
|
|
53
|
+
characters: value.length,
|
|
54
|
+
words,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
if (emitResponse)
|
|
58
|
+
update(value);
|
|
59
|
+
};
|
|
60
|
+
control.addEventListener("input", () => sync());
|
|
61
|
+
control.addEventListener("change", () => sync());
|
|
62
|
+
sync(false);
|
|
63
|
+
group.append(control);
|
|
64
|
+
if (counter)
|
|
65
|
+
group.append(counter);
|
|
66
|
+
return group;
|
|
67
|
+
}
|
|
68
|
+
export function renderInlineTextEntry(interaction, update, currentValue, messages) {
|
|
69
|
+
const group = document.createElement("span");
|
|
70
|
+
group.className = "qti3-inline-text-response";
|
|
71
|
+
const input = document.createElement("input");
|
|
72
|
+
input.className = "qti3-text-input qti3-inline-text-input";
|
|
73
|
+
input.value = scalarString(currentValue);
|
|
74
|
+
input.setAttribute("aria-label", interaction.prompt ?? interaction.contextText ?? messages.message("textResponseLabel"));
|
|
75
|
+
const expectedLength = Number(interaction.attributes["expected-length"] ?? 0);
|
|
76
|
+
applyExpectedTextEntryWidth(input, expectedLength);
|
|
77
|
+
const sync = (emitResponse = true) => {
|
|
78
|
+
if (emitResponse)
|
|
79
|
+
update(input.value);
|
|
80
|
+
};
|
|
81
|
+
input.addEventListener("input", () => sync());
|
|
82
|
+
input.addEventListener("change", () => sync());
|
|
83
|
+
sync(false);
|
|
84
|
+
group.append(input);
|
|
85
|
+
return group;
|
|
86
|
+
}
|
|
87
|
+
export function renderSliderResponse(interaction, update, currentValue, messages) {
|
|
88
|
+
const group = document.createElement("div");
|
|
89
|
+
group.className = "qti3-slider-response";
|
|
90
|
+
const input = document.createElement("input");
|
|
91
|
+
input.type = "range";
|
|
92
|
+
input.min = interaction.attributes["lower-bound"] ?? "0";
|
|
93
|
+
input.max = interaction.attributes["upper-bound"] ?? "100";
|
|
94
|
+
input.step = interaction.attributes.step ?? "1";
|
|
95
|
+
input.value = scalarString(currentValue) || interaction.attributes["lower-bound"] || "0";
|
|
96
|
+
input.setAttribute("aria-label", interaction.prompt ?? messages.message("sliderResponseLabel"));
|
|
97
|
+
const output = document.createElement("output");
|
|
98
|
+
output.className = "qti3-slider-output";
|
|
99
|
+
output.value = input.value;
|
|
100
|
+
output.textContent = input.value;
|
|
101
|
+
const sync = () => {
|
|
102
|
+
output.value = input.value;
|
|
103
|
+
output.textContent = input.value;
|
|
104
|
+
update(coerceResponseInputValue(input.value, interaction.responseBaseType));
|
|
105
|
+
};
|
|
106
|
+
input.addEventListener("input", sync);
|
|
107
|
+
group.append(input, output);
|
|
108
|
+
return group;
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=text-interaction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text-interaction.js","sourceRoot":"","sources":["../../src/interactions/text-interaction.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { QtiInteraction } from "@longsightgroup/qti3-core";
|
|
2
|
+
export declare function renderUnsupportedInteraction(interaction: QtiInteraction): HTMLElement;
|
|
3
|
+
export declare function renderUnsupportedEmbeddedInteraction(interaction: QtiInteraction): HTMLElement;
|
|
4
|
+
//# sourceMappingURL=unsupported-interaction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unsupported-interaction.d.ts","sourceRoot":"","sources":["../../src/interactions/unsupported-interaction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAGhE,wBAAgB,4BAA4B,CAAC,WAAW,EAAE,cAAc,GAAG,WAAW,CAOrF;AAED,wBAAgB,oCAAoC,CAAC,WAAW,EAAE,cAAc,GAAG,WAAW,CAY7F"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { errorView } from "../player-validation.js";
|
|
2
|
+
export function renderUnsupportedInteraction(interaction) {
|
|
3
|
+
const message = interaction.responseIdentifier
|
|
4
|
+
? `Interaction type "${interaction.type}" (${interaction.responseIdentifier}) is not supported.`
|
|
5
|
+
: `Interaction type "${interaction.type}" is not supported.`;
|
|
6
|
+
const alert = errorView(message);
|
|
7
|
+
alert.className = "qti3-unsupported-interaction";
|
|
8
|
+
return alert;
|
|
9
|
+
}
|
|
10
|
+
export function renderUnsupportedEmbeddedInteraction(interaction) {
|
|
11
|
+
const message = interaction.responseIdentifier
|
|
12
|
+
? `Interaction type "${interaction.type}" (${interaction.responseIdentifier}) cannot be embedded inline in item body.`
|
|
13
|
+
: `Interaction type "${interaction.type}" cannot be embedded inline in item body.`;
|
|
14
|
+
const alert = document.createElement("span");
|
|
15
|
+
alert.className = "qti3-embedded-interaction qti3-embedded-interaction-unsupported";
|
|
16
|
+
alert.role = "alert";
|
|
17
|
+
alert.textContent = message;
|
|
18
|
+
if (interaction.responseIdentifier) {
|
|
19
|
+
alert.dataset.responseIdentifier = interaction.responseIdentifier;
|
|
20
|
+
}
|
|
21
|
+
return alert;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=unsupported-interaction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unsupported-interaction.js","sourceRoot":"","sources":["../../src/interactions/unsupported-interaction.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEpD,MAAM,UAAU,4BAA4B,CAAC,WAA2B;IACtE,MAAM,OAAO,GAAG,WAAW,CAAC,kBAAkB;QAC5C,CAAC,CAAC,qBAAqB,WAAW,CAAC,IAAI,MAAM,WAAW,CAAC,kBAAkB,qBAAqB;QAChG,CAAC,CAAC,qBAAqB,WAAW,CAAC,IAAI,qBAAqB,CAAC;IAC/D,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IACjC,KAAK,CAAC,SAAS,GAAG,8BAA8B,CAAC;IACjD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,oCAAoC,CAAC,WAA2B;IAC9E,MAAM,OAAO,GAAG,WAAW,CAAC,kBAAkB;QAC5C,CAAC,CAAC,qBAAqB,WAAW,CAAC,IAAI,MAAM,WAAW,CAAC,kBAAkB,2CAA2C;QACtH,CAAC,CAAC,qBAAqB,WAAW,CAAC,IAAI,2CAA2C,CAAC;IACrF,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAC7C,KAAK,CAAC,SAAS,GAAG,iEAAiE,CAAC;IACpF,KAAK,CAAC,IAAI,GAAG,OAAO,CAAC;IACrB,KAAK,CAAC,WAAW,GAAG,OAAO,CAAC;IAC5B,IAAI,WAAW,CAAC,kBAAkB,EAAE,CAAC;QACnC,KAAK,CAAC,OAAO,CAAC,kBAAkB,GAAG,WAAW,CAAC,kBAAkB,CAAC;IACpE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,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 renderUploadResponse(interaction: QtiInteraction, update: (value: QtiValue) => void, messages: PlayerMessageResolver): HTMLElement;
|
|
4
|
+
//# sourceMappingURL=upload-interaction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload-interaction.d.ts","sourceRoot":"","sources":["../../src/interactions/upload-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;AAG3E,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,cAAc,EAC3B,MAAM,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,EACjC,QAAQ,EAAE,qBAAqB,GAC9B,WAAW,CAUb"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { interactionLabel } from "./interaction-label.js";
|
|
2
|
+
export function renderUploadResponse(interaction, update, messages) {
|
|
3
|
+
const input = document.createElement("input");
|
|
4
|
+
input.type = "file";
|
|
5
|
+
input.className = "qti3-upload-input";
|
|
6
|
+
input.setAttribute("aria-label", interactionLabel(interaction) || messages.message("uploadResponse"));
|
|
7
|
+
input.addEventListener("change", () => update(input.files?.[0]?.name ?? ""));
|
|
8
|
+
return input;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=upload-interaction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload-interaction.js","sourceRoot":"","sources":["../../src/interactions/upload-interaction.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,MAAM,UAAU,oBAAoB,CAClC,WAA2B,EAC3B,MAAiC,EACjC,QAA+B;IAE/B,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC9C,KAAK,CAAC,IAAI,GAAG,MAAM,CAAC;IACpB,KAAK,CAAC,SAAS,GAAG,mBAAmB,CAAC;IACtC,KAAK,CAAC,YAAY,CAChB,YAAY,EACZ,gBAAgB,CAAC,WAAW,CAAC,IAAI,QAAQ,CAAC,OAAO,CAAC,gBAAgB,CAAC,CACpE,CAAC;IACF,KAAK,CAAC,gBAAgB,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;IAC7E,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attempt-availability.d.ts","sourceRoot":"","sources":["../../src/player/attempt-availability.ts"],"names":[],"mappings":"AAAA,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,UAAU,EAChB,OAAO,EAAE;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,WAAW,CAAA;CAAE,GAClE,IAAI,CAgCN"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export function syncAttemptAvailability(root, options) {
|
|
2
|
+
if (options.host) {
|
|
3
|
+
options.host.dataset.status = options.status;
|
|
4
|
+
}
|
|
5
|
+
const article = root.querySelector(".qti3-player");
|
|
6
|
+
if (article)
|
|
7
|
+
article.dataset.status = options.status;
|
|
8
|
+
for (const control of root.querySelectorAll(".qti3-interaction button, .qti3-interaction input, .qti3-interaction select, .qti3-interaction textarea")) {
|
|
9
|
+
control.disabled = options.completed;
|
|
10
|
+
}
|
|
11
|
+
for (const element of root.querySelectorAll(".qti3-interaction [tabindex]:not(button):not(input):not(select):not(textarea)")) {
|
|
12
|
+
if (options.completed) {
|
|
13
|
+
element.dataset.previousTabIndex = element.getAttribute("tabindex") ?? "0";
|
|
14
|
+
element.tabIndex = -1;
|
|
15
|
+
element.setAttribute("aria-disabled", "true");
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
const previous = element.dataset.previousTabIndex;
|
|
19
|
+
if (previous !== undefined) {
|
|
20
|
+
element.tabIndex = Number(previous);
|
|
21
|
+
delete element.dataset.previousTabIndex;
|
|
22
|
+
}
|
|
23
|
+
element.removeAttribute("aria-disabled");
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=attempt-availability.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attempt-availability.js","sourceRoot":"","sources":["../../src/player/attempt-availability.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,uBAAuB,CACrC,IAAgB,EAChB,OAAmE;IAEnE,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC/C,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAc,cAAc,CAAC,CAAC;IAChE,IAAI,OAAO;QAAE,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAErD,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,gBAAgB,CAGzC,yGAAyG,CAC1G,EAAE,CAAC;QACF,OAAO,CAAC,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC;IACvC,CAAC;IAED,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,gBAAgB,CACzC,+EAA+E,CAChF,EAAE,CAAC;QACF,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YACtB,OAAO,CAAC,OAAO,CAAC,gBAAgB,GAAG,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC;YAC3E,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;YACtB,OAAO,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;QAChD,CAAC;aAAM,CAAC;YACN,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC;YAClD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,OAAO,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACpC,OAAO,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC;YAC1C,CAAC;YACD,OAAO,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type QtiAttemptStateV1, type QtiContentNode, type QtiDocument, type QtiValue } from "@longsightgroup/qti3-core";
|
|
2
|
+
export declare function currentVariableValue(state: QtiAttemptStateV1 | undefined, identifier: string): QtiValue;
|
|
3
|
+
export declare function currentTemplateValue(state: QtiAttemptStateV1 | undefined, identifier: string): QtiValue;
|
|
4
|
+
export declare function isFeedbackVisible(node: Extract<QtiContentNode, {
|
|
5
|
+
kind: "feedback";
|
|
6
|
+
}>, value: QtiValue): boolean;
|
|
7
|
+
interface TemplateContentVisibilityElement {
|
|
8
|
+
dataset: {
|
|
9
|
+
templateIdentifier?: string;
|
|
10
|
+
templateValueIdentifier?: string;
|
|
11
|
+
showHide?: string;
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
export declare function isTemplateContentVisible(element: TemplateContentVisibilityElement, value: QtiValue): boolean;
|
|
15
|
+
export declare function mathTemplateValue(node: Extract<QtiContentNode, {
|
|
16
|
+
kind: "element";
|
|
17
|
+
}>, documentModel: QtiDocument | undefined, templateValue: QtiValue): string | undefined;
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=content-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content-state.d.ts","sourceRoot":"","sources":["../../src/player/content-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,QAAQ,EACd,MAAM,2BAA2B,CAAC;AAGnC,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,iBAAiB,GAAG,SAAS,EACpC,UAAU,EAAE,MAAM,GACjB,QAAQ,CAOV;AAED,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,iBAAiB,GAAG,SAAS,EACpC,UAAU,EAAE,MAAM,GACjB,QAAQ,CAEV;AAED,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,OAAO,CAAC,cAAc,EAAE;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC,EACnD,KAAK,EAAE,QAAQ,GACd,OAAO,CAKT;AAED,UAAU,gCAAgC;IACxC,OAAO,EAAE;QACP,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,uBAAuB,CAAC,EAAE,MAAM,CAAC;QACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,gCAAgC,EACzC,KAAK,EAAE,QAAQ,GACd,OAAO,CAQT;AAED,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,OAAO,CAAC,cAAc,EAAE;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC,EAClD,aAAa,EAAE,WAAW,GAAG,SAAS,EACtC,aAAa,EAAE,QAAQ,GACtB,MAAM,GAAG,SAAS,CAUpB"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { qtiValueToString, } from "@longsightgroup/qti3-core";
|
|
2
|
+
import { contentNodeText } from "../content/content-dom.js";
|
|
3
|
+
export function currentVariableValue(state, identifier) {
|
|
4
|
+
return (state?.outcomes[identifier] ??
|
|
5
|
+
state?.templateValues?.[identifier] ??
|
|
6
|
+
state?.responses[identifier] ??
|
|
7
|
+
null);
|
|
8
|
+
}
|
|
9
|
+
export function currentTemplateValue(state, identifier) {
|
|
10
|
+
return state?.templateValues?.[identifier] ?? null;
|
|
11
|
+
}
|
|
12
|
+
export function isFeedbackVisible(node, value) {
|
|
13
|
+
const hasIdentifier = Array.isArray(value)
|
|
14
|
+
? value.map(String).includes(node.identifier)
|
|
15
|
+
: qtiValueToString(value) === node.identifier;
|
|
16
|
+
return node.showHide === "show" ? hasIdentifier : !hasIdentifier;
|
|
17
|
+
}
|
|
18
|
+
export function isTemplateContentVisible(element, value) {
|
|
19
|
+
const templateIdentifier = element.dataset.templateIdentifier;
|
|
20
|
+
const identifier = element.dataset.templateValueIdentifier;
|
|
21
|
+
if (!templateIdentifier || !identifier)
|
|
22
|
+
return true;
|
|
23
|
+
const hasIdentifier = Array.isArray(value)
|
|
24
|
+
? value.map(String).includes(identifier)
|
|
25
|
+
: qtiValueToString(value) === identifier;
|
|
26
|
+
return element.dataset.showHide === "hide" ? !hasIdentifier : hasIdentifier;
|
|
27
|
+
}
|
|
28
|
+
export function mathTemplateValue(node, documentModel, templateValue) {
|
|
29
|
+
if (node.qtiName !== "mi" && node.qtiName !== "mo")
|
|
30
|
+
return undefined;
|
|
31
|
+
const identifier = contentNodeText(node).trim();
|
|
32
|
+
if (!identifier)
|
|
33
|
+
return undefined;
|
|
34
|
+
const declaration = documentModel?.item.templateDeclarations.find((template) => template.identifier === identifier && template.attributes["math-variable"] === "true");
|
|
35
|
+
if (!declaration)
|
|
36
|
+
return undefined;
|
|
37
|
+
return qtiValueToString(templateValue);
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=content-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content-state.js","sourceRoot":"","sources":["../../src/player/content-state.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,GAKjB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE5D,MAAM,UAAU,oBAAoB,CAClC,KAAoC,EACpC,UAAkB;IAElB,OAAO,CACL,KAAK,EAAE,QAAQ,CAAC,UAAU,CAAC;QAC3B,KAAK,EAAE,cAAc,EAAE,CAAC,UAAU,CAAC;QACnC,KAAK,EAAE,SAAS,CAAC,UAAU,CAAC;QAC5B,IAAI,CACL,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,KAAoC,EACpC,UAAkB;IAElB,OAAO,KAAK,EAAE,cAAc,EAAE,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,IAAmD,EACnD,KAAe;IAEf,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACxC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC;QAC7C,CAAC,CAAC,gBAAgB,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,UAAU,CAAC;IAChD,OAAO,IAAI,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;AACnE,CAAC;AAUD,MAAM,UAAU,wBAAwB,CACtC,OAAyC,EACzC,KAAe;IAEf,MAAM,kBAAkB,GAAG,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC;IAC9D,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,uBAAuB,CAAC;IAC3D,IAAI,CAAC,kBAAkB,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC;IACpD,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACxC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC;QACxC,CAAC,CAAC,gBAAgB,CAAC,KAAK,CAAC,KAAK,UAAU,CAAC;IAC3C,OAAO,OAAO,CAAC,OAAO,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,IAAkD,EAClD,aAAsC,EACtC,aAAuB;IAEvB,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IACrE,MAAM,UAAU,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;IAChD,IAAI,CAAC,UAAU;QAAE,OAAO,SAAS,CAAC;IAClC,MAAM,WAAW,GAAG,aAAa,EAAE,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAC/D,CAAC,QAAQ,EAAE,EAAE,CACX,QAAQ,CAAC,UAAU,KAAK,UAAU,IAAI,QAAQ,CAAC,UAAU,CAAC,eAAe,CAAC,KAAK,MAAM,CACxF,CAAC;IACF,IAAI,CAAC,WAAW;QAAE,OAAO,SAAS,CAAC;IACnC,OAAO,gBAAgB,CAAC,aAAa,CAAC,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type QtiValue } from "@longsightgroup/qti3-core";
|
|
2
|
+
export interface DynamicBodyContext {
|
|
3
|
+
variableValue(identifier: string): QtiValue;
|
|
4
|
+
templateValue(identifier: string): QtiValue;
|
|
5
|
+
}
|
|
6
|
+
export declare function syncDynamicBodyState(root: ParentNode, context: DynamicBodyContext): void;
|
|
7
|
+
//# sourceMappingURL=dynamic-body.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dynamic-body.d.ts","sourceRoot":"","sources":["../../src/player/dynamic-body.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAI5E,MAAM,WAAW,kBAAkB;IACjC,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC5C,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,QAAQ,CAAC;CAC7C;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,kBAAkB,GAAG,IAAI,CA8BxF"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { qtiValueToString } from "@longsightgroup/qti3-core";
|
|
2
|
+
import { formatPrintedValue } from "../content/content-dom.js";
|
|
3
|
+
import { isTemplateContentVisible } from "./content-state.js";
|
|
4
|
+
export function syncDynamicBodyState(root, context) {
|
|
5
|
+
for (const output of root.querySelectorAll(".qti3-printed-variable")) {
|
|
6
|
+
const identifier = output.dataset.identifier;
|
|
7
|
+
if (!identifier)
|
|
8
|
+
continue;
|
|
9
|
+
output.value = formatPrintedValue(context.variableValue(identifier), output.dataset.format);
|
|
10
|
+
output.textContent = output.value;
|
|
11
|
+
}
|
|
12
|
+
for (const element of root.querySelectorAll(".qti3-feedback-block, .qti3-feedback-inline")) {
|
|
13
|
+
const identifier = element.dataset.feedbackIdentifier;
|
|
14
|
+
const outcomeIdentifier = element.dataset.outcomeIdentifier;
|
|
15
|
+
if (!identifier || !outcomeIdentifier)
|
|
16
|
+
continue;
|
|
17
|
+
const value = context.variableValue(outcomeIdentifier);
|
|
18
|
+
const hasIdentifier = Array.isArray(value)
|
|
19
|
+
? value.map(String).includes(identifier)
|
|
20
|
+
: qtiValueToString(value) === identifier;
|
|
21
|
+
element.hidden = element.dataset.showHide === "hide" ? hasIdentifier : !hasIdentifier;
|
|
22
|
+
}
|
|
23
|
+
for (const element of root.querySelectorAll(".qti3-template-block, .qti3-template-inline")) {
|
|
24
|
+
const templateIdentifier = element.dataset.templateIdentifier;
|
|
25
|
+
element.hidden = !isTemplateContentVisible(element, templateIdentifier ? context.templateValue(templateIdentifier) : null);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=dynamic-body.js.map
|