@longsightgroup/qti3-player 0.4.0 → 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/README.md +146 -13
- 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/index.d.ts +13 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- 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/player-adapter.d.ts +62 -0
- package/dist/player-adapter.d.ts.map +1 -0
- package/dist/player-adapter.js +119 -0
- package/dist/player-adapter.js.map +1 -0
- package/dist/player-dev.d.ts +4 -0
- package/dist/player-dev.d.ts.map +1 -0
- package/dist/player-dev.js +14 -0
- package/dist/player-dev.js.map +1 -0
- package/dist/player-element.d.ts +14 -1
- package/dist/player-element.d.ts.map +1 -1
- package/dist/player-element.js +57 -5
- package/dist/player-element.js.map +1 -1
- package/dist/player-locale.d.ts +8 -3
- package/dist/player-locale.d.ts.map +1 -1
- package/dist/player-locale.js +16 -175
- package/dist/player-locale.js.map +1 -1
- package/dist/player-message-catalog-default.d.ts +4 -0
- package/dist/player-message-catalog-default.d.ts.map +1 -0
- package/dist/player-message-catalog-default.js +118 -0
- package/dist/player-message-catalog-default.js.map +1 -0
- package/dist/player-message-catalog-validate.d.ts +31 -0
- package/dist/player-message-catalog-validate.d.ts.map +1 -0
- package/dist/player-message-catalog-validate.js +327 -0
- package/dist/player-message-catalog-validate.js.map +1 -0
- package/dist/player-message-catalog.d.ts +18 -0
- package/dist/player-message-catalog.d.ts.map +1 -0
- package/dist/player-message-catalog.js +40 -0
- package/dist/player-message-catalog.js.map +1 -0
- package/dist/player-message-keys.d.ts +6 -0
- package/dist/player-message-keys.d.ts.map +1 -0
- package/dist/player-message-keys.js +7 -0
- package/dist/player-message-keys.js.map +1 -0
- package/dist/player-message-manifest.d.ts +272 -0
- package/dist/player-message-manifest.d.ts.map +1 -0
- package/dist/player-message-manifest.js +83 -0
- package/dist/player-message-manifest.js.map +1 -0
- package/dist/player-message-overrides.d.ts +3 -0
- package/dist/player-message-overrides.d.ts.map +1 -0
- package/dist/player-message-overrides.js +28 -0
- package/dist/player-message-overrides.js.map +1 -0
- package/dist/player-message-resolver.d.ts +31 -0
- package/dist/player-message-resolver.d.ts.map +1 -0
- package/dist/player-message-resolver.js +110 -0
- package/dist/player-message-resolver.js.map +1 -0
- package/dist/player-messages.d.ts +0 -38
- package/dist/player-messages.d.ts.map +1 -1
- package/dist/player-types.d.ts +12 -2
- package/dist/player-types.d.ts.map +1 -1
- 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
- package/src/controls/remove-button.ts +8 -5
- package/src/index.ts +61 -5
- package/src/interactions/choice-interaction.ts +6 -2
- package/src/interactions/drawing-interaction.ts +14 -9
- package/src/interactions/end-attempt-interaction.ts +3 -3
- package/src/interactions/gap-match-interaction.ts +32 -13
- package/src/interactions/graphic-associate-interaction.ts +15 -10
- package/src/interactions/hotspot-interaction.ts +10 -6
- package/src/interactions/inline-choice-interaction.ts +4 -4
- package/src/interactions/interaction-registry.ts +12 -12
- package/src/interactions/match-interaction.ts +9 -6
- package/src/interactions/pair-interaction.ts +22 -14
- package/src/interactions/position-object-interaction.ts +22 -13
- package/src/interactions/select-point-interaction.ts +25 -13
- package/src/interactions/shared.ts +21 -4
- package/src/interactions/text-interaction.ts +14 -4
- package/src/interactions/upload-interaction.ts +6 -3
- package/src/player/interaction-render.ts +4 -4
- package/src/player-adapter.ts +253 -0
- package/src/player-dev.ts +14 -0
- package/src/player-element.ts +78 -8
- package/src/player-locale.ts +28 -199
- package/src/player-message-catalog-default.ts +119 -0
- package/src/player-message-catalog-validate.ts +425 -0
- package/src/player-message-catalog.ts +72 -0
- package/src/player-message-keys.ts +12 -0
- package/src/player-message-manifest.ts +103 -0
- package/src/player-message-overrides.ts +38 -0
- package/src/player-message-resolver.ts +205 -0
- package/src/player-messages.ts +0 -30
- package/src/player-types.ts +15 -4
- package/src/reorder/a11y.ts +22 -7
- package/src/reorder/graphic-order-interaction.ts +23 -16
- package/src/reorder/list-controls.ts +8 -6
- package/src/reorder/order-interaction.ts +7 -5
- package/src/styles/base-styles.ts +20 -5
- package/src/styles/graphic-styles.ts +0 -6
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { removeButton } from "../controls/remove-button.js";
|
|
2
|
+
import { missingChoicesMessage, responseGroup, valueToStrings } from "../interaction-support.js";
|
|
3
|
+
import { choiceText, pairRegionLabels, sourceChoices, targetChoices, tokenButton, tokenRegion, } from "./shared.js";
|
|
4
|
+
export function renderPairResponse(interaction, update, currentValue, messages) {
|
|
5
|
+
const group = responseGroup();
|
|
6
|
+
const sources = sourceChoices(interaction);
|
|
7
|
+
const targets = targetChoices(interaction);
|
|
8
|
+
if (sources.length === 0 || targets.length === 0) {
|
|
9
|
+
group.append(missingChoicesMessage(interaction));
|
|
10
|
+
return group;
|
|
11
|
+
}
|
|
12
|
+
const selectedPairs = valueToStrings(currentValue);
|
|
13
|
+
let selectedSource;
|
|
14
|
+
let selectedTarget;
|
|
15
|
+
const labels = pairRegionLabels(interaction, messages);
|
|
16
|
+
const sourceRegion = tokenRegion(messages.message("interactionSourcesBank", { type: interaction.type }), labels.source);
|
|
17
|
+
const targetRegion = tokenRegion(messages.message("interactionTargetsBank", { type: interaction.type }), labels.target);
|
|
18
|
+
const selector = document.createElement("div");
|
|
19
|
+
selector.className = "qti3-pair-selector";
|
|
20
|
+
const pairList = document.createElement("ul");
|
|
21
|
+
pairList.className = "qti3-pair-list";
|
|
22
|
+
pairList.setAttribute("aria-label", messages.message("interactionSelectedPairsList", { type: interaction.type }));
|
|
23
|
+
let draggedSource;
|
|
24
|
+
const commit = () => {
|
|
25
|
+
if (interaction.responseCardinality === "single")
|
|
26
|
+
update(selectedPairs[0] ?? null);
|
|
27
|
+
else
|
|
28
|
+
update([...selectedPairs]);
|
|
29
|
+
};
|
|
30
|
+
const syncPressed = () => {
|
|
31
|
+
for (const button of sourceRegion.querySelectorAll("button")) {
|
|
32
|
+
button.setAttribute("aria-pressed", button.dataset.choiceIdentifier === selectedSource?.identifier ? "true" : "false");
|
|
33
|
+
}
|
|
34
|
+
for (const button of targetRegion.querySelectorAll("button")) {
|
|
35
|
+
button.setAttribute("aria-pressed", button.dataset.choiceIdentifier === selectedTarget?.identifier ? "true" : "false");
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
const addSelectedPair = () => {
|
|
39
|
+
if (!selectedSource || !selectedTarget)
|
|
40
|
+
return;
|
|
41
|
+
const pair = `${selectedSource.identifier} ${selectedTarget.identifier}`;
|
|
42
|
+
if (!selectedPairs.includes(pair))
|
|
43
|
+
selectedPairs.push(pair);
|
|
44
|
+
selectedSource = undefined;
|
|
45
|
+
selectedTarget = undefined;
|
|
46
|
+
syncPressed();
|
|
47
|
+
renderPairs();
|
|
48
|
+
commit();
|
|
49
|
+
};
|
|
50
|
+
const addPair = (sourceIdentifier, targetIdentifier) => {
|
|
51
|
+
const source = sources.find((choice) => choice.identifier === sourceIdentifier);
|
|
52
|
+
const target = targets.find((choice) => choice.identifier === targetIdentifier);
|
|
53
|
+
if (!source || !target)
|
|
54
|
+
return;
|
|
55
|
+
selectedSource = source;
|
|
56
|
+
selectedTarget = target;
|
|
57
|
+
addSelectedPair();
|
|
58
|
+
};
|
|
59
|
+
const renderPairs = () => {
|
|
60
|
+
pairList.replaceChildren(...selectedPairs.map((pair) => {
|
|
61
|
+
const [source, target] = pair.split(" ");
|
|
62
|
+
const label = messages.message("associationPairLabel", {
|
|
63
|
+
source: choiceText(sources, source),
|
|
64
|
+
target: choiceText(targets, target),
|
|
65
|
+
});
|
|
66
|
+
const item = document.createElement("li");
|
|
67
|
+
item.className = "qti3-pair-chip";
|
|
68
|
+
const text = document.createElement("span");
|
|
69
|
+
text.textContent = label;
|
|
70
|
+
const remove = removeButton(label, messages);
|
|
71
|
+
remove.addEventListener("click", () => {
|
|
72
|
+
const index = selectedPairs.indexOf(pair);
|
|
73
|
+
if (index >= 0)
|
|
74
|
+
selectedPairs.splice(index, 1);
|
|
75
|
+
renderPairs();
|
|
76
|
+
commit();
|
|
77
|
+
});
|
|
78
|
+
item.append(text, remove);
|
|
79
|
+
return item;
|
|
80
|
+
}));
|
|
81
|
+
};
|
|
82
|
+
for (const choice of sources) {
|
|
83
|
+
const button = tokenButton(choice);
|
|
84
|
+
button.draggable = true;
|
|
85
|
+
button.addEventListener("dragstart", (event) => {
|
|
86
|
+
draggedSource = choice.identifier;
|
|
87
|
+
event.dataTransfer?.setData("text/plain", choice.identifier);
|
|
88
|
+
event.dataTransfer?.setDragImage(button, 8, 8);
|
|
89
|
+
});
|
|
90
|
+
button.addEventListener("dragend", () => {
|
|
91
|
+
draggedSource = undefined;
|
|
92
|
+
syncPressed();
|
|
93
|
+
});
|
|
94
|
+
button.addEventListener("click", () => {
|
|
95
|
+
selectedSource = choice;
|
|
96
|
+
syncPressed();
|
|
97
|
+
addSelectedPair();
|
|
98
|
+
});
|
|
99
|
+
sourceRegion.append(button);
|
|
100
|
+
}
|
|
101
|
+
for (const choice of targets) {
|
|
102
|
+
const button = tokenButton(choice);
|
|
103
|
+
button.addEventListener("dragover", (event) => {
|
|
104
|
+
event.preventDefault();
|
|
105
|
+
button.classList.add("qti3-drop-target");
|
|
106
|
+
});
|
|
107
|
+
button.addEventListener("dragleave", () => button.classList.remove("qti3-drop-target"));
|
|
108
|
+
button.addEventListener("drop", (event) => {
|
|
109
|
+
event.preventDefault();
|
|
110
|
+
button.classList.remove("qti3-drop-target");
|
|
111
|
+
addPair(event.dataTransfer?.getData("text/plain") || draggedSource, choice.identifier);
|
|
112
|
+
});
|
|
113
|
+
button.addEventListener("click", () => {
|
|
114
|
+
selectedTarget = choice;
|
|
115
|
+
syncPressed();
|
|
116
|
+
addSelectedPair();
|
|
117
|
+
});
|
|
118
|
+
targetRegion.append(button);
|
|
119
|
+
}
|
|
120
|
+
selector.append(sourceRegion, targetRegion);
|
|
121
|
+
renderPairs();
|
|
122
|
+
group.append(selector, pairList);
|
|
123
|
+
return group;
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=pair-interaction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pair-interaction.js","sourceRoot":"","sources":["../../src/interactions/pair-interaction.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { QtiObjectAsset, QtiValue } from "@longsightgroup/qti3-core";
|
|
2
|
+
export declare function parsePointValue(value: QtiValue): {
|
|
3
|
+
x: number;
|
|
4
|
+
y: number;
|
|
5
|
+
} | undefined;
|
|
6
|
+
export declare function parsePointValues(value: QtiValue): Array<{
|
|
7
|
+
x: number;
|
|
8
|
+
y: number;
|
|
9
|
+
}>;
|
|
10
|
+
export declare function pointToString(point: {
|
|
11
|
+
x: number;
|
|
12
|
+
y: number;
|
|
13
|
+
} | undefined): string;
|
|
14
|
+
export declare function objectAssetWidth(object: QtiObjectAsset | undefined, fallback: number): number;
|
|
15
|
+
export declare function objectAssetHeight(object: QtiObjectAsset | undefined, fallback: number): number;
|
|
16
|
+
//# sourceMappingURL=point-value.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"point-value.d.ts","sourceRoot":"","sources":["../../src/interactions/point-value.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAG1E,wBAAgB,eAAe,CAAC,KAAK,EAAE,QAAQ,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAGrF;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,QAAQ,GAAG,KAAK,CAAC;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAKjF;AAYD,wBAAgB,aAAa,CAAC,KAAK,EAAE;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,GAAG,MAAM,CAEjF;AAOD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,cAAc,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE7F;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,cAAc,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE9F"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { valueToStrings } from "../interaction-support.js";
|
|
2
|
+
export function parsePointValue(value) {
|
|
3
|
+
const [raw] = valueToStrings(value);
|
|
4
|
+
return parsePointString(raw);
|
|
5
|
+
}
|
|
6
|
+
export function parsePointValues(value) {
|
|
7
|
+
return valueToStrings(value).flatMap((raw) => {
|
|
8
|
+
const point = parsePointString(raw);
|
|
9
|
+
return point ? [point] : [];
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
function parsePointString(raw) {
|
|
13
|
+
if (!raw)
|
|
14
|
+
return undefined;
|
|
15
|
+
const values = raw.split(/\s+/).map(Number);
|
|
16
|
+
const x = values[0];
|
|
17
|
+
const y = values[1];
|
|
18
|
+
if (typeof x !== "number" || typeof y !== "number")
|
|
19
|
+
return undefined;
|
|
20
|
+
if (!Number.isFinite(x) || !Number.isFinite(y))
|
|
21
|
+
return undefined;
|
|
22
|
+
return { x, y };
|
|
23
|
+
}
|
|
24
|
+
export function pointToString(point) {
|
|
25
|
+
return point ? `${point.x} ${point.y}` : "";
|
|
26
|
+
}
|
|
27
|
+
function dimension(value, fallback) {
|
|
28
|
+
const parsed = Number(value);
|
|
29
|
+
return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback;
|
|
30
|
+
}
|
|
31
|
+
export function objectAssetWidth(object, fallback) {
|
|
32
|
+
return dimension(object?.width, fallback);
|
|
33
|
+
}
|
|
34
|
+
export function objectAssetHeight(object, fallback) {
|
|
35
|
+
return dimension(object?.height, fallback);
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=point-value.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"point-value.js","sourceRoot":"","sources":["../../src/interactions/point-value.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE3D,MAAM,UAAU,eAAe,CAAC,KAAe;IAC7C,MAAM,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACpC,OAAO,gBAAgB,CAAC,GAAG,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAe;IAC9C,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QAC3C,MAAM,KAAK,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;QACpC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAuB;IAC/C,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAC3B,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACpB,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACpB,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IACrE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IACjE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAA2C;IACvE,OAAO,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AAC9C,CAAC;AAED,SAAS,SAAS,CAAC,KAAyB,EAAE,QAAgB;IAC5D,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7B,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAkC,EAAE,QAAgB;IACnF,OAAO,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAkC,EAAE,QAAgB;IACpF,OAAO,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;AAC7C,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { QtiContentNode, QtiDiagnostic, QtiInteraction, QtiPortableCustomStateValue, QtiValue } from "@longsightgroup/qti3-core";
|
|
2
|
+
import type { QtiPortableCustomMountEventDetail } from "../player-types.js";
|
|
3
|
+
export interface PortableCustomResponseContext {
|
|
4
|
+
interaction: QtiInteraction;
|
|
5
|
+
update: (value: QtiValue) => void;
|
|
6
|
+
currentValue: QtiValue;
|
|
7
|
+
currentState?: QtiPortableCustomStateValue | undefined;
|
|
8
|
+
renderMarkup: (nodes: QtiContentNode[]) => Node[];
|
|
9
|
+
setInteractionState: (responseIdentifier: string, state: QtiPortableCustomStateValue) => void;
|
|
10
|
+
setValidity: (responseIdentifier: string, valid: boolean, message?: string) => void;
|
|
11
|
+
emitStateChange: () => void;
|
|
12
|
+
onMount: (detail: QtiPortableCustomMountEventDetail) => void;
|
|
13
|
+
}
|
|
14
|
+
export declare function portableCustomValidityDiagnostic(responseIdentifier: string, valid: boolean, message: string | undefined): QtiDiagnostic | undefined;
|
|
15
|
+
export declare function renderPortableCustomResponse(context: PortableCustomResponseContext): HTMLElement;
|
|
16
|
+
//# sourceMappingURL=portable-custom-interaction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portable-custom-interaction.d.ts","sourceRoot":"","sources":["../../src/interactions/portable-custom-interaction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EACb,cAAc,EAEd,2BAA2B,EAC3B,QAAQ,EACT,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,iCAAiC,EAAE,MAAM,oBAAoB,CAAC;AAS5E,MAAM,WAAW,6BAA6B;IAC5C,WAAW,EAAE,cAAc,CAAC;IAC5B,MAAM,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;IAClC,YAAY,EAAE,QAAQ,CAAC;IACvB,YAAY,CAAC,EAAE,2BAA2B,GAAG,SAAS,CAAC;IACvD,YAAY,EAAE,CAAC,KAAK,EAAE,cAAc,EAAE,KAAK,IAAI,EAAE,CAAC;IAClD,mBAAmB,EAAE,CAAC,kBAAkB,EAAE,MAAM,EAAE,KAAK,EAAE,2BAA2B,KAAK,IAAI,CAAC;IAC9F,WAAW,EAAE,CAAC,kBAAkB,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACpF,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,OAAO,EAAE,CAAC,MAAM,EAAE,iCAAiC,KAAK,IAAI,CAAC;CAC9D;AAED,wBAAgB,gCAAgC,CAC9C,kBAAkB,EAAE,MAAM,EAC1B,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,MAAM,GAAG,SAAS,GAC1B,aAAa,GAAG,SAAS,CAQ3B;AAED,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,6BAA6B,GAAG,WAAW,CAsEhG"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { portableCustomDefinitionFromAttributes, portableCustomEventState, portableCustomEventValidity, portableCustomEventValue, scalarString, } from "../portable-custom-support.js";
|
|
2
|
+
export function portableCustomValidityDiagnostic(responseIdentifier, valid, message) {
|
|
3
|
+
if (valid)
|
|
4
|
+
return undefined;
|
|
5
|
+
return {
|
|
6
|
+
code: "response.portableCustom.validity",
|
|
7
|
+
severity: "error",
|
|
8
|
+
message: message?.trim() || `${responseIdentifier} is not valid.`,
|
|
9
|
+
path: responseIdentifier,
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
export function renderPortableCustomResponse(context) {
|
|
13
|
+
const { interaction, update, currentValue } = context;
|
|
14
|
+
const definition = interaction.portableCustom ?? portableCustomDefinitionFromAttributes(interaction);
|
|
15
|
+
const responseIdentifier = interaction.responseIdentifier ?? definition.responseIdentifier ?? "";
|
|
16
|
+
const currentState = context.currentState;
|
|
17
|
+
const group = document.createElement("div");
|
|
18
|
+
group.role = "group";
|
|
19
|
+
group.setAttribute("aria-label", interaction.prompt ?? "Portable custom interaction");
|
|
20
|
+
const host = createPortableCustomHost(interaction, definition, responseIdentifier, currentState);
|
|
21
|
+
if (definition.interactionMarkup.length > 0) {
|
|
22
|
+
const markup = document.createElement("div");
|
|
23
|
+
markup.className = "qti3-portable-custom-markup";
|
|
24
|
+
markup.append(...context.renderMarkup(definition.interactionMarkup));
|
|
25
|
+
host.append(markup);
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
host.textContent = "Portable custom interaction host";
|
|
29
|
+
}
|
|
30
|
+
const fallback = document.createElement("input");
|
|
31
|
+
fallback.type = "hidden";
|
|
32
|
+
fallback.className = "qti3-portable-custom-response";
|
|
33
|
+
fallback.hidden = true;
|
|
34
|
+
fallback.tabIndex = -1;
|
|
35
|
+
fallback.setAttribute("aria-hidden", "true");
|
|
36
|
+
fallback.value = scalarString(currentValue);
|
|
37
|
+
const handlePortableCustomEvent = (event) => {
|
|
38
|
+
const state = portableCustomEventState(event);
|
|
39
|
+
const value = portableCustomEventValue(event);
|
|
40
|
+
const validity = portableCustomEventValidity(event);
|
|
41
|
+
if (state !== undefined && responseIdentifier) {
|
|
42
|
+
context.setInteractionState(responseIdentifier, state);
|
|
43
|
+
host.dataset.state = JSON.stringify(state);
|
|
44
|
+
}
|
|
45
|
+
if (value !== undefined) {
|
|
46
|
+
fallback.value = scalarString(value ?? null);
|
|
47
|
+
update(value);
|
|
48
|
+
}
|
|
49
|
+
if (validity && responseIdentifier) {
|
|
50
|
+
context.setValidity(responseIdentifier, validity.valid, validity.message);
|
|
51
|
+
context.emitStateChange();
|
|
52
|
+
}
|
|
53
|
+
if (value === undefined && state !== undefined && !validity)
|
|
54
|
+
context.emitStateChange();
|
|
55
|
+
};
|
|
56
|
+
for (const eventName of [
|
|
57
|
+
"qti3-portable-custom-response",
|
|
58
|
+
"qti3-pci-response",
|
|
59
|
+
"qti3-portable-custom-state",
|
|
60
|
+
"qti3-portable-custom-validity",
|
|
61
|
+
]) {
|
|
62
|
+
host.addEventListener(eventName, handlePortableCustomEvent);
|
|
63
|
+
}
|
|
64
|
+
queueMicrotask(() => {
|
|
65
|
+
context.onMount({
|
|
66
|
+
responseIdentifier,
|
|
67
|
+
interaction,
|
|
68
|
+
definition,
|
|
69
|
+
host,
|
|
70
|
+
value: currentValue,
|
|
71
|
+
state: currentState,
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
group.append(host, fallback);
|
|
75
|
+
return group;
|
|
76
|
+
}
|
|
77
|
+
function createPortableCustomHost(interaction, definition, responseIdentifier, currentState) {
|
|
78
|
+
const host = document.createElement("div");
|
|
79
|
+
host.className = "qti3-portable-custom-host";
|
|
80
|
+
host.tabIndex = 0;
|
|
81
|
+
host.dataset.responseIdentifier = responseIdentifier;
|
|
82
|
+
host.dataset.typeIdentifier = definition.customInteractionTypeIdentifier ?? "";
|
|
83
|
+
host.dataset.module = definition.module ?? "";
|
|
84
|
+
host.dataset.qtiName = interaction.qtiName;
|
|
85
|
+
if (definition.interactionModules?.primaryConfiguration) {
|
|
86
|
+
host.dataset.primaryConfiguration = definition.interactionModules.primaryConfiguration;
|
|
87
|
+
}
|
|
88
|
+
if (definition.interactionModules?.secondaryConfiguration) {
|
|
89
|
+
host.dataset.secondaryConfiguration = definition.interactionModules.secondaryConfiguration;
|
|
90
|
+
}
|
|
91
|
+
if (currentState !== undefined)
|
|
92
|
+
host.dataset.state = JSON.stringify(currentState);
|
|
93
|
+
host.setAttribute("role", "application");
|
|
94
|
+
host.setAttribute("aria-label", interaction.prompt ?? "Portable custom interaction host");
|
|
95
|
+
return host;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=portable-custom-interaction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portable-custom-interaction.js","sourceRoot":"","sources":["../../src/interactions/portable-custom-interaction.ts"],"names":[],"mappings":"AASA,OAAO,EACL,sCAAsC,EACtC,wBAAwB,EACxB,2BAA2B,EAC3B,wBAAwB,EACxB,YAAY,GACb,MAAM,+BAA+B,CAAC;AAcvC,MAAM,UAAU,gCAAgC,CAC9C,kBAA0B,EAC1B,KAAc,EACd,OAA2B;IAE3B,IAAI,KAAK;QAAE,OAAO,SAAS,CAAC;IAC5B,OAAO;QACL,IAAI,EAAE,kCAAkC;QACxC,QAAQ,EAAE,OAAO;QACjB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,kBAAkB,gBAAgB;QACjE,IAAI,EAAE,kBAAkB;KACzB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,OAAsC;IACjF,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC;IACtD,MAAM,UAAU,GACd,WAAW,CAAC,cAAc,IAAI,sCAAsC,CAAC,WAAW,CAAC,CAAC;IACpF,MAAM,kBAAkB,GAAG,WAAW,CAAC,kBAAkB,IAAI,UAAU,CAAC,kBAAkB,IAAI,EAAE,CAAC;IACjG,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IAE1C,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC5C,KAAK,CAAC,IAAI,GAAG,OAAO,CAAC;IACrB,KAAK,CAAC,YAAY,CAAC,YAAY,EAAE,WAAW,CAAC,MAAM,IAAI,6BAA6B,CAAC,CAAC;IAEtF,MAAM,IAAI,GAAG,wBAAwB,CAAC,WAAW,EAAE,UAAU,EAAE,kBAAkB,EAAE,YAAY,CAAC,CAAC;IACjG,IAAI,UAAU,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5C,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC7C,MAAM,CAAC,SAAS,GAAG,6BAA6B,CAAC;QACjD,MAAM,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC;QACrE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,WAAW,GAAG,kCAAkC,CAAC;IACxD,CAAC;IAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IACjD,QAAQ,CAAC,IAAI,GAAG,QAAQ,CAAC;IACzB,QAAQ,CAAC,SAAS,GAAG,+BAA+B,CAAC;IACrD,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;IACvB,QAAQ,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IAC7C,QAAQ,CAAC,KAAK,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;IAE5C,MAAM,yBAAyB,GAAG,CAAC,KAAY,EAAE,EAAE;QACjD,MAAM,KAAK,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAC;QAC9C,MAAM,KAAK,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAC;QAC9C,MAAM,QAAQ,GAAG,2BAA2B,CAAC,KAAK,CAAC,CAAC;QACpD,IAAI,KAAK,KAAK,SAAS,IAAI,kBAAkB,EAAE,CAAC;YAC9C,OAAO,CAAC,mBAAmB,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;YACvD,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC7C,CAAC;QACD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,QAAQ,CAAC,KAAK,GAAG,YAAY,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC;YAC7C,MAAM,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC;QACD,IAAI,QAAQ,IAAI,kBAAkB,EAAE,CAAC;YACnC,OAAO,CAAC,WAAW,CAAC,kBAAkB,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC1E,OAAO,CAAC,eAAe,EAAE,CAAC;QAC5B,CAAC;QACD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,QAAQ;YAAE,OAAO,CAAC,eAAe,EAAE,CAAC;IACzF,CAAC,CAAC;IAEF,KAAK,MAAM,SAAS,IAAI;QACtB,+BAA+B;QAC/B,mBAAmB;QACnB,4BAA4B;QAC5B,+BAA+B;KACvB,EAAE,CAAC;QACX,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,yBAAyB,CAAC,CAAC;IAC9D,CAAC;IAED,cAAc,CAAC,GAAG,EAAE;QAClB,OAAO,CAAC,OAAO,CAAC;YACd,kBAAkB;YAClB,WAAW;YACX,UAAU;YACV,IAAI;YACJ,KAAK,EAAE,YAAY;YACnB,KAAK,EAAE,YAAY;SACpB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC7B,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,wBAAwB,CAC/B,WAA2B,EAC3B,UAAuC,EACvC,kBAA0B,EAC1B,YAAqD;IAErD,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC3C,IAAI,CAAC,SAAS,GAAG,2BAA2B,CAAC;IAC7C,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;IAClB,IAAI,CAAC,OAAO,CAAC,kBAAkB,GAAG,kBAAkB,CAAC;IACrD,IAAI,CAAC,OAAO,CAAC,cAAc,GAAG,UAAU,CAAC,+BAA+B,IAAI,EAAE,CAAC;IAC/E,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,IAAI,EAAE,CAAC;IAC9C,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC;IAC3C,IAAI,UAAU,CAAC,kBAAkB,EAAE,oBAAoB,EAAE,CAAC;QACxD,IAAI,CAAC,OAAO,CAAC,oBAAoB,GAAG,UAAU,CAAC,kBAAkB,CAAC,oBAAoB,CAAC;IACzF,CAAC;IACD,IAAI,UAAU,CAAC,kBAAkB,EAAE,sBAAsB,EAAE,CAAC;QAC1D,IAAI,CAAC,OAAO,CAAC,sBAAsB,GAAG,UAAU,CAAC,kBAAkB,CAAC,sBAAsB,CAAC;IAC7F,CAAC;IACD,IAAI,YAAY,KAAK,SAAS;QAAE,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IAClF,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACzC,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,WAAW,CAAC,MAAM,IAAI,kCAAkC,CAAC,CAAC;IAC1F,OAAO,IAAI,CAAC;AACd,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 renderPositionObjectResponse(interaction: QtiInteraction, update: (value: QtiValue) => void, currentValue: QtiValue, messages: PlayerMessageResolver): HTMLElement;
|
|
4
|
+
//# sourceMappingURL=position-object-interaction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"position-object-interaction.d.ts","sourceRoot":"","sources":["../../src/interactions/position-object-interaction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAW1E,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAQ3E,wBAAgB,4BAA4B,CAC1C,WAAW,EAAE,cAAc,EAC3B,MAAM,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,EACjC,YAAY,EAAE,QAAQ,EACtB,QAAQ,EAAE,qBAAqB,GAC9B,WAAW,CAkMb"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { applyGraphicSurfaceLayout, applyPositionObjectMarkerPlacement, applyPositionObjectMarkerSize, appendGraphicObjectImage, objectIsImage, percent, responseGroup, } from "../interaction-support.js";
|
|
2
|
+
import { movementButton } from "../movement.js";
|
|
3
|
+
import { objectAssetHeight, objectAssetWidth, parsePointValue, pointToString, } from "./point-value.js";
|
|
4
|
+
export function renderPositionObjectResponse(interaction, update, currentValue, messages) {
|
|
5
|
+
const group = responseGroup();
|
|
6
|
+
group.role = "group";
|
|
7
|
+
group.setAttribute("aria-label", messages.message("interactionPlacementResponse", { type: interaction.type }));
|
|
8
|
+
const stageObject = interaction.positionObjectStage ?? interaction.object;
|
|
9
|
+
const movableObject = interaction.positionObjectStage ? interaction.object : undefined;
|
|
10
|
+
const width = objectAssetWidth(stageObject, 480);
|
|
11
|
+
const height = objectAssetHeight(stageObject, 300);
|
|
12
|
+
const movableWidth = objectAssetWidth(movableObject, Math.max(32, Math.round(width * 0.12)));
|
|
13
|
+
const movableHeight = objectAssetHeight(movableObject, Math.max(32, Math.round(height * 0.12)));
|
|
14
|
+
const parsedPoint = parsePointValue(currentValue);
|
|
15
|
+
let point = parsedPoint ?? { x: 0, y: 0 };
|
|
16
|
+
let isPlaced = Boolean(parsedPoint);
|
|
17
|
+
const stage = document.createElement("div");
|
|
18
|
+
applyGraphicSurfaceLayout(stage, width, height, "qti3-position-object-stage");
|
|
19
|
+
stage.style.setProperty("--qti3-position-object-marker-block-size", `${movableHeight}px`);
|
|
20
|
+
stage.tabIndex = 0;
|
|
21
|
+
stage.role = "group";
|
|
22
|
+
stage.setAttribute("aria-label", messages.message("interactionPlacementStage", { type: interaction.type }));
|
|
23
|
+
if (stageObject?.data && objectIsImage(stageObject)) {
|
|
24
|
+
appendGraphicObjectImage(stage, stageObject, stageObject.text || "");
|
|
25
|
+
}
|
|
26
|
+
const marker = document.createElement("button");
|
|
27
|
+
marker.type = "button";
|
|
28
|
+
marker.className = "qti3-position-object-marker";
|
|
29
|
+
marker.setAttribute("aria-label", messages.message("movableObject"));
|
|
30
|
+
applyPositionObjectMarkerSize(marker, movableWidth, movableHeight);
|
|
31
|
+
marker.draggable = false;
|
|
32
|
+
if (movableObject?.data && objectIsImage(movableObject)) {
|
|
33
|
+
const image = document.createElement("img");
|
|
34
|
+
image.src = movableObject.data;
|
|
35
|
+
image.alt = "";
|
|
36
|
+
marker.append(image);
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
marker.textContent = messages.message("placeObject");
|
|
40
|
+
}
|
|
41
|
+
stage.append(marker);
|
|
42
|
+
const coordinate = document.createElement("output");
|
|
43
|
+
coordinate.className = "qti3-coordinate-output qti-visually-hidden";
|
|
44
|
+
coordinate.setAttribute("aria-live", "polite");
|
|
45
|
+
const clamp = () => {
|
|
46
|
+
point.x = Math.max(0, Math.min(width, point.x));
|
|
47
|
+
point.y = Math.max(0, Math.min(height, point.y));
|
|
48
|
+
};
|
|
49
|
+
const commit = () => {
|
|
50
|
+
if (!isPlaced)
|
|
51
|
+
return;
|
|
52
|
+
update(pointToString(point));
|
|
53
|
+
};
|
|
54
|
+
const syncMarker = () => {
|
|
55
|
+
if (!isPlaced) {
|
|
56
|
+
marker.dataset.placed = "false";
|
|
57
|
+
marker.style.removeProperty("insetInlineStart");
|
|
58
|
+
marker.style.removeProperty("insetBlockStart");
|
|
59
|
+
marker.style.setProperty("--qti3-position-object-unplaced-inline-start", `${Math.round(movableWidth / 2)}px`);
|
|
60
|
+
marker.style.setProperty("--qti3-position-object-unplaced-block-start", `calc(100% + ${Math.round(movableHeight / 2 + 8)}px)`);
|
|
61
|
+
coordinate.value = "";
|
|
62
|
+
coordinate.textContent = messages.message("objectNotPlaced");
|
|
63
|
+
stage.setAttribute("aria-label", messages.message("interactionPlacementStageEmpty", { type: interaction.type }));
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
clamp();
|
|
67
|
+
marker.dataset.placed = "true";
|
|
68
|
+
marker.style.removeProperty("--qti3-position-object-unplaced-inline-start");
|
|
69
|
+
marker.style.removeProperty("--qti3-position-object-unplaced-block-start");
|
|
70
|
+
applyPositionObjectMarkerPlacement(marker, `${percent(point.x, width)}%`, `${percent(point.y, height)}%`);
|
|
71
|
+
coordinate.value = pointToString(point);
|
|
72
|
+
const coordinates = pointToString(point);
|
|
73
|
+
coordinate.textContent = messages.message("objectPositionedAt", { coordinates });
|
|
74
|
+
stage.setAttribute("aria-label", messages.message("interactionPlacementStageAt", { type: interaction.type, coordinates }));
|
|
75
|
+
};
|
|
76
|
+
const pointFromPointer = (event) => {
|
|
77
|
+
const rect = stage.getBoundingClientRect();
|
|
78
|
+
point = {
|
|
79
|
+
x: Math.round(((event.clientX - rect.left) / rect.width) * width),
|
|
80
|
+
y: Math.round(((event.clientY - rect.top) / rect.height) * height),
|
|
81
|
+
};
|
|
82
|
+
isPlaced = true;
|
|
83
|
+
clamp();
|
|
84
|
+
};
|
|
85
|
+
const ensureKeyboardPoint = () => {
|
|
86
|
+
if (isPlaced)
|
|
87
|
+
return;
|
|
88
|
+
point = { x: 0, y: 0 };
|
|
89
|
+
isPlaced = true;
|
|
90
|
+
};
|
|
91
|
+
const moveBy = (dx, dy, emit = true) => {
|
|
92
|
+
ensureKeyboardPoint();
|
|
93
|
+
point.x += dx;
|
|
94
|
+
point.y += dy;
|
|
95
|
+
syncMarker();
|
|
96
|
+
if (emit)
|
|
97
|
+
commit();
|
|
98
|
+
};
|
|
99
|
+
const handleKey = (event) => {
|
|
100
|
+
const step = event.shiftKey ? 10 : 1;
|
|
101
|
+
if (event.key === "ArrowLeft")
|
|
102
|
+
moveBy(-step, 0, false);
|
|
103
|
+
else if (event.key === "ArrowRight")
|
|
104
|
+
moveBy(step, 0, false);
|
|
105
|
+
else if (event.key === "ArrowUp")
|
|
106
|
+
moveBy(0, -step, false);
|
|
107
|
+
else if (event.key === "ArrowDown")
|
|
108
|
+
moveBy(0, step, false);
|
|
109
|
+
else if (event.key === "Enter" || event.key === " ") {
|
|
110
|
+
ensureKeyboardPoint();
|
|
111
|
+
syncMarker();
|
|
112
|
+
commit();
|
|
113
|
+
}
|
|
114
|
+
else
|
|
115
|
+
return;
|
|
116
|
+
event.preventDefault();
|
|
117
|
+
};
|
|
118
|
+
let dragging = false;
|
|
119
|
+
let dragMoved = false;
|
|
120
|
+
marker.addEventListener("pointerdown", (event) => {
|
|
121
|
+
dragging = true;
|
|
122
|
+
dragMoved = false;
|
|
123
|
+
marker.dataset.dragging = "true";
|
|
124
|
+
marker.setPointerCapture(event.pointerId);
|
|
125
|
+
if (isPlaced) {
|
|
126
|
+
pointFromPointer(event);
|
|
127
|
+
syncMarker();
|
|
128
|
+
}
|
|
129
|
+
event.preventDefault();
|
|
130
|
+
});
|
|
131
|
+
marker.addEventListener("pointermove", (event) => {
|
|
132
|
+
if (!dragging)
|
|
133
|
+
return;
|
|
134
|
+
dragMoved = true;
|
|
135
|
+
pointFromPointer(event);
|
|
136
|
+
syncMarker();
|
|
137
|
+
});
|
|
138
|
+
marker.addEventListener("pointerup", (event) => {
|
|
139
|
+
if (!dragging)
|
|
140
|
+
return;
|
|
141
|
+
dragging = false;
|
|
142
|
+
delete marker.dataset.dragging;
|
|
143
|
+
marker.releasePointerCapture(event.pointerId);
|
|
144
|
+
if (dragMoved || isPlaced) {
|
|
145
|
+
pointFromPointer(event);
|
|
146
|
+
syncMarker();
|
|
147
|
+
commit();
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
marker.addEventListener("pointercancel", () => {
|
|
151
|
+
dragging = false;
|
|
152
|
+
delete marker.dataset.dragging;
|
|
153
|
+
});
|
|
154
|
+
stage.addEventListener("click", (event) => {
|
|
155
|
+
if (event.target === marker)
|
|
156
|
+
return;
|
|
157
|
+
pointFromPointer(event);
|
|
158
|
+
syncMarker();
|
|
159
|
+
commit();
|
|
160
|
+
});
|
|
161
|
+
stage.addEventListener("keydown", handleKey);
|
|
162
|
+
marker.addEventListener("keydown", handleKey);
|
|
163
|
+
const controls = document.createElement("div");
|
|
164
|
+
controls.className = "qti3-point-controls";
|
|
165
|
+
for (const [direction, dx, dy] of [
|
|
166
|
+
["up", 0, -1],
|
|
167
|
+
["left", -1, 0],
|
|
168
|
+
["right", 1, 0],
|
|
169
|
+
["down", 0, 1],
|
|
170
|
+
]) {
|
|
171
|
+
controls.append(movementButton(direction, messages.message("moveObject", { direction }), () => moveBy(dx, dy)));
|
|
172
|
+
}
|
|
173
|
+
syncMarker();
|
|
174
|
+
group.append(stage, coordinate, controls);
|
|
175
|
+
return group;
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=position-object-interaction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"position-object-interaction.js","sourceRoot":"","sources":["../../src/interactions/position-object-interaction.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { QtiInteraction } from "@longsightgroup/qti3-core";
|
|
2
|
+
export declare function usesChoiceSet(interaction: QtiInteraction): boolean;
|
|
3
|
+
export declare function usesOrderedResponse(interaction: QtiInteraction): boolean;
|
|
4
|
+
export declare function usesPairResponse(interaction: QtiInteraction): boolean;
|
|
5
|
+
//# sourceMappingURL=routing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routing.d.ts","sourceRoot":"","sources":["../../src/interactions/routing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAEhE,wBAAgB,aAAa,CAAC,WAAW,EAAE,cAAc,GAAG,OAAO,CAKlE;AAED,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,cAAc,GAAG,OAAO,CAExE;AAWD,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,cAAc,GAAG,OAAO,CAIrE"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export function usesChoiceSet(interaction) {
|
|
2
|
+
if (interaction.type === "choice")
|
|
3
|
+
return true;
|
|
4
|
+
return (interaction.responseCardinality === "multiple" && interaction.responseBaseType === "identifier");
|
|
5
|
+
}
|
|
6
|
+
export function usesOrderedResponse(interaction) {
|
|
7
|
+
return interaction.responseCardinality === "ordered" || interaction.type === "order";
|
|
8
|
+
}
|
|
9
|
+
const explicitNonPairInteractionTypes = new Set([
|
|
10
|
+
"match",
|
|
11
|
+
"gapMatch",
|
|
12
|
+
"graphicGapMatch",
|
|
13
|
+
"graphicAssociate",
|
|
14
|
+
"graphicOrder",
|
|
15
|
+
"order",
|
|
16
|
+
]);
|
|
17
|
+
export function usesPairResponse(interaction) {
|
|
18
|
+
if (interaction.type === "associate")
|
|
19
|
+
return true;
|
|
20
|
+
if (explicitNonPairInteractionTypes.has(interaction.type))
|
|
21
|
+
return false;
|
|
22
|
+
return interaction.responseBaseType === "pair" || interaction.responseBaseType === "directedPair";
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=routing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routing.js","sourceRoot":"","sources":["../../src/interactions/routing.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,aAAa,CAAC,WAA2B;IACvD,IAAI,WAAW,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC/C,OAAO,CACL,WAAW,CAAC,mBAAmB,KAAK,UAAU,IAAI,WAAW,CAAC,gBAAgB,KAAK,YAAY,CAChG,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,WAA2B;IAC7D,OAAO,WAAW,CAAC,mBAAmB,KAAK,SAAS,IAAI,WAAW,CAAC,IAAI,KAAK,OAAO,CAAC;AACvF,CAAC;AAED,MAAM,+BAA+B,GAAG,IAAI,GAAG,CAAyB;IACtE,OAAO;IACP,UAAU;IACV,iBAAiB;IACjB,kBAAkB;IAClB,cAAc;IACd,OAAO;CACR,CAAC,CAAC;AAEH,MAAM,UAAU,gBAAgB,CAAC,WAA2B;IAC1D,IAAI,WAAW,CAAC,IAAI,KAAK,WAAW;QAAE,OAAO,IAAI,CAAC;IAClD,IAAI,+BAA+B,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACxE,OAAO,WAAW,CAAC,gBAAgB,KAAK,MAAM,IAAI,WAAW,CAAC,gBAAgB,KAAK,cAAc,CAAC;AACpG,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 renderSelectPointResponse(interaction: QtiInteraction, update: (value: QtiValue) => void, currentValue: QtiValue, messages: PlayerMessageResolver): HTMLElement;
|
|
4
|
+
//# sourceMappingURL=select-point-interaction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"select-point-interaction.d.ts","sourceRoot":"","sources":["../../src/interactions/select-point-interaction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAU1E,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAI3E,wBAAgB,yBAAyB,CACvC,WAAW,EAAE,cAAc,EAC3B,MAAM,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,EACjC,YAAY,EAAE,QAAQ,EACtB,QAAQ,EAAE,qBAAqB,GAC9B,WAAW,CAiLb"}
|