@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 @@
|
|
|
1
|
+
{"version":3,"file":"dynamic-body.js","sourceRoot":"","sources":["../../src/player/dynamic-body.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAiB,MAAM,2BAA2B,CAAC;AAC5E,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAO9D,MAAM,UAAU,oBAAoB,CAAC,IAAgB,EAAE,OAA2B;IAChF,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,gBAAgB,CAAoB,wBAAwB,CAAC,EAAE,CAAC;QACxF,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC;QAC7C,IAAI,CAAC,UAAU;YAAE,SAAS;QAC1B,MAAM,CAAC,KAAK,GAAG,kBAAkB,CAAC,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC5F,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC;IACpC,CAAC;IAED,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,gBAAgB,CACzC,6CAA6C,CAC9C,EAAE,CAAC;QACF,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC;QACtD,MAAM,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC;QAC5D,IAAI,CAAC,UAAU,IAAI,CAAC,iBAAiB;YAAE,SAAS;QAChD,MAAM,KAAK,GAAG,OAAO,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC;QACvD,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YACxC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC;YACxC,CAAC,CAAC,gBAAgB,CAAC,KAAK,CAAC,KAAK,UAAU,CAAC;QAC3C,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;IACxF,CAAC;IAED,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,gBAAgB,CACzC,6CAA6C,CAC9C,EAAE,CAAC;QACF,MAAM,kBAAkB,GAAG,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC;QAC9D,OAAO,CAAC,MAAM,GAAG,CAAC,wBAAwB,CACxC,OAAO,EACP,kBAAkB,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,IAAI,CACtE,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feedback-panel.d.ts","sourceRoot":"","sources":["../../src/player/feedback-panel.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,QAAQ,EACd,MAAM,2BAA2B,CAAC;AAEnC,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,WAAW,GAAG,IAAI,EAC5B,IAAI,EAAE,iBAAiB,EACvB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GACjC,IAAI,CAYN"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { visibleModalFeedback, } from "@longsightgroup/qti3-core";
|
|
2
|
+
export function syncFeedbackPanel(feedback, item, outcomes) {
|
|
3
|
+
if (!feedback)
|
|
4
|
+
return;
|
|
5
|
+
const visibleFeedback = visibleModalFeedback(item, outcomes);
|
|
6
|
+
feedback.replaceChildren(...visibleFeedback.map((entry) => {
|
|
7
|
+
const element = document.createElement("p");
|
|
8
|
+
element.dataset.feedbackIdentifier = entry.identifier;
|
|
9
|
+
element.textContent = entry.text;
|
|
10
|
+
return element;
|
|
11
|
+
}));
|
|
12
|
+
feedback.hidden = visibleFeedback.length === 0;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=feedback-panel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feedback-panel.js","sourceRoot":"","sources":["../../src/player/feedback-panel.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,GAGrB,MAAM,2BAA2B,CAAC;AAEnC,MAAM,UAAU,iBAAiB,CAC/B,QAA4B,EAC5B,IAAuB,EACvB,QAAkC;IAElC,IAAI,CAAC,QAAQ;QAAE,OAAO;IACtB,MAAM,eAAe,GAAG,oBAAoB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC7D,QAAQ,CAAC,eAAe,CACtB,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAC/B,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QAC5C,OAAO,CAAC,OAAO,CAAC,kBAAkB,GAAG,KAAK,CAAC,UAAU,CAAC;QACtD,OAAO,CAAC,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC;QACjC,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC,CACH,CAAC;IACF,QAAQ,CAAC,MAAM,GAAG,eAAe,CAAC,MAAM,KAAK,CAAC,CAAC;AACjD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch-xml.d.ts","sourceRoot":"","sources":["../../src/player/fetch-xml.ts"],"names":[],"mappings":"AAAA,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAOlE"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export async function defaultFetchXml(url) {
|
|
2
|
+
if (!globalThis.fetch) {
|
|
3
|
+
throw new Error("No fetch implementation is available. Provide loadUrl(url, { fetchXml }).");
|
|
4
|
+
}
|
|
5
|
+
const response = await globalThis.fetch(url);
|
|
6
|
+
if (!response.ok)
|
|
7
|
+
throw new Error(`Failed to load QTI XML from ${url}: ${response.status}.`);
|
|
8
|
+
return response.text();
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=fetch-xml.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch-xml.js","sourceRoot":"","sources":["../../src/player/fetch-xml.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAW;IAC/C,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,2EAA2E,CAAC,CAAC;IAC/F,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7C,IAAI,CAAC,QAAQ,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,GAAG,KAAK,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IAC7F,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;AACzB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { QtiInteraction, QtiValue } from "@longsightgroup/qti3-core";
|
|
2
|
+
import type { PlayerMessageResolver } from "../player-message-resolver.js";
|
|
3
|
+
export interface BlockInteractionRenderOptions {
|
|
4
|
+
interaction: QtiInteraction;
|
|
5
|
+
messages: PlayerMessageResolver;
|
|
6
|
+
update: (value: QtiValue) => void;
|
|
7
|
+
currentValue: QtiValue;
|
|
8
|
+
isCompleted: () => boolean;
|
|
9
|
+
endAttempt: () => void;
|
|
10
|
+
renderPortableCustom: (interaction: QtiInteraction, update: (value: QtiValue) => void, currentValue: QtiValue) => HTMLElement;
|
|
11
|
+
}
|
|
12
|
+
export declare function renderBlockInteractionSection(options: BlockInteractionRenderOptions): HTMLElement;
|
|
13
|
+
export declare function renderEmbeddedInteractionSection(interaction: QtiInteraction, update: (value: QtiValue) => void, currentValue: QtiValue, messages: PlayerMessageResolver): HTMLElement;
|
|
14
|
+
//# sourceMappingURL=interaction-render.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interaction-render.d.ts","sourceRoot":"","sources":["../../src/player/interaction-render.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAO1E,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAG3E,MAAM,WAAW,6BAA6B;IAC5C,WAAW,EAAE,cAAc,CAAC;IAC5B,QAAQ,EAAE,qBAAqB,CAAC;IAChC,MAAM,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;IAClC,YAAY,EAAE,QAAQ,CAAC;IACvB,WAAW,EAAE,MAAM,OAAO,CAAC;IAC3B,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,oBAAoB,EAAE,CACpB,WAAW,EAAE,cAAc,EAC3B,MAAM,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,EACjC,YAAY,EAAE,QAAQ,KACnB,WAAW,CAAC;CAClB;AAED,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,6BAA6B,GAAG,WAAW,CAqCjG;AAED,wBAAgB,gCAAgC,CAC9C,WAAW,EAAE,cAAc,EAC3B,MAAM,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,EACjC,YAAY,EAAE,QAAQ,EACtB,QAAQ,EAAE,qBAAqB,GAC9B,WAAW,CAoBb"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { copySafeAttributes } from "../content/content-dom.js";
|
|
2
|
+
import { renderInteractionResponse } from "../interactions/interaction-dispatch.js";
|
|
3
|
+
import { interactionLabel, qtiSharedClassNames } from "../interactions/interaction-label.js";
|
|
4
|
+
import { renderSelect } from "../interactions/inline-choice-interaction.js";
|
|
5
|
+
import { renderInlineTextEntry } from "../interactions/text-interaction.js";
|
|
6
|
+
import { renderUnsupportedEmbeddedInteraction } from "../interactions/unsupported-interaction.js";
|
|
7
|
+
import { inlineValidationMessageElement, validationMessageElement } from "../player-validation.js";
|
|
8
|
+
export function renderBlockInteractionSection(options) {
|
|
9
|
+
const { interaction, messages, update, currentValue, isCompleted, endAttempt, renderPortableCustom, } = options;
|
|
10
|
+
const field = document.createElement("section");
|
|
11
|
+
field.className = `qti3-interaction qti3-${interaction.type}`;
|
|
12
|
+
field.classList.add(...qtiSharedClassNames(interaction.attributes.class));
|
|
13
|
+
field.dataset.interactionType = interaction.type;
|
|
14
|
+
if (interaction.responseIdentifier)
|
|
15
|
+
field.dataset.responseIdentifier = interaction.responseIdentifier;
|
|
16
|
+
const heading = document.createElement("h3");
|
|
17
|
+
copySafeAttributes(heading, interaction.promptAttributes ?? {});
|
|
18
|
+
heading.textContent = interactionLabel(interaction);
|
|
19
|
+
field.append(heading);
|
|
20
|
+
if (interaction.responseIdentifier) {
|
|
21
|
+
field.append(validationMessageElement(interaction.responseIdentifier));
|
|
22
|
+
}
|
|
23
|
+
field.append(renderInteractionResponse({
|
|
24
|
+
interaction,
|
|
25
|
+
update,
|
|
26
|
+
currentValue,
|
|
27
|
+
messages,
|
|
28
|
+
isCompleted,
|
|
29
|
+
endAttempt,
|
|
30
|
+
renderPortableCustom,
|
|
31
|
+
}));
|
|
32
|
+
return field;
|
|
33
|
+
}
|
|
34
|
+
export function renderEmbeddedInteractionSection(interaction, update, currentValue, messages) {
|
|
35
|
+
if (interaction.type !== "inlineChoice" && interaction.type !== "textEntry") {
|
|
36
|
+
return renderUnsupportedEmbeddedInteraction(interaction);
|
|
37
|
+
}
|
|
38
|
+
const wrapper = document.createElement("span");
|
|
39
|
+
wrapper.className = `qti3-interaction qti3-${interaction.type} qti3-embedded-interaction`;
|
|
40
|
+
wrapper.dataset.interactionType = interaction.type;
|
|
41
|
+
if (interaction.responseIdentifier)
|
|
42
|
+
wrapper.dataset.responseIdentifier = interaction.responseIdentifier;
|
|
43
|
+
if (interaction.responseIdentifier) {
|
|
44
|
+
wrapper.append(inlineValidationMessageElement(interaction.responseIdentifier));
|
|
45
|
+
}
|
|
46
|
+
wrapper.append(interaction.type === "inlineChoice"
|
|
47
|
+
? renderSelect(interaction, update, currentValue, messages)
|
|
48
|
+
: renderInlineTextEntry(interaction, update, currentValue, messages));
|
|
49
|
+
return wrapper;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=interaction-render.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interaction-render.js","sourceRoot":"","sources":["../../src/player/interaction-render.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { QtiDocument, QtiInteraction } from "@longsightgroup/qti3-core";
|
|
2
|
+
import { type PlayerContentContext } from "../content/content-renderer.js";
|
|
3
|
+
export declare function renderPlayerShell(options: {
|
|
4
|
+
documentModel: QtiDocument;
|
|
5
|
+
contentContext: PlayerContentContext;
|
|
6
|
+
renderStandaloneInteraction: (interaction: QtiInteraction) => HTMLElement;
|
|
7
|
+
}): HTMLElement;
|
|
8
|
+
//# sourceMappingURL=render-shell.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-shell.d.ts","sourceRoot":"","sources":["../../src/player/render-shell.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC7E,OAAO,EAAsB,KAAK,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAG/F,wBAAgB,iBAAiB,CAAC,OAAO,EAAE;IACzC,aAAa,EAAE,WAAW,CAAC;IAC3B,cAAc,EAAE,oBAAoB,CAAC;IACrC,2BAA2B,EAAE,CAAC,WAAW,EAAE,cAAc,KAAK,WAAW,CAAC;CAC3E,GAAG,WAAW,CAmCd"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { renderContentNodes } from "../content/content-renderer.js";
|
|
2
|
+
import { playerStyleElement } from "../player-styles.js";
|
|
3
|
+
export function renderPlayerShell(options) {
|
|
4
|
+
const { documentModel, contentContext, renderStandaloneInteraction } = options;
|
|
5
|
+
const root = document.createElement("article");
|
|
6
|
+
root.className = "qti3-player";
|
|
7
|
+
if (documentModel.item.language) {
|
|
8
|
+
root.lang = documentModel.item.language;
|
|
9
|
+
root.setAttribute("xml:lang", documentModel.item.language);
|
|
10
|
+
}
|
|
11
|
+
root.append(playerStyleElement());
|
|
12
|
+
if (documentModel.item.prompt && documentModel.item.body.length === 0) {
|
|
13
|
+
const prompt = document.createElement("p");
|
|
14
|
+
prompt.className = "qti3-item-prompt";
|
|
15
|
+
prompt.textContent = documentModel.item.prompt;
|
|
16
|
+
root.append(prompt);
|
|
17
|
+
}
|
|
18
|
+
if (documentModel.item.body.length > 0) {
|
|
19
|
+
const body = document.createElement("div");
|
|
20
|
+
body.className = "qti3-item-body";
|
|
21
|
+
body.append(...renderContentNodes(documentModel.item.body, contentContext));
|
|
22
|
+
root.append(body);
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
for (const interaction of documentModel.item.interactions) {
|
|
26
|
+
root.append(renderStandaloneInteraction(interaction));
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
const feedback = document.createElement("section");
|
|
30
|
+
feedback.className = "qti3-feedback";
|
|
31
|
+
feedback.role = "status";
|
|
32
|
+
feedback.setAttribute("aria-live", "polite");
|
|
33
|
+
feedback.hidden = true;
|
|
34
|
+
root.append(feedback);
|
|
35
|
+
return root;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=render-shell.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-shell.js","sourceRoot":"","sources":["../../src/player/render-shell.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAA6B,MAAM,gCAAgC,CAAC;AAC/F,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD,MAAM,UAAU,iBAAiB,CAAC,OAIjC;IACC,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,2BAA2B,EAAE,GAAG,OAAO,CAAC;IAC/E,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;IAC/C,IAAI,CAAC,SAAS,GAAG,aAAa,CAAC;IAC/B,IAAI,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QAChC,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC;QACxC,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC7D,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC,CAAC;IAElC,IAAI,aAAa,CAAC,IAAI,CAAC,MAAM,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtE,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QAC3C,MAAM,CAAC,SAAS,GAAG,kBAAkB,CAAC;QACtC,MAAM,CAAC,WAAW,GAAG,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC;QAC/C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC;IAED,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC3C,IAAI,CAAC,SAAS,GAAG,gBAAgB,CAAC;QAClC,IAAI,CAAC,MAAM,CAAC,GAAG,kBAAkB,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC;QAC5E,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;SAAM,CAAC;QACN,KAAK,MAAM,WAAW,IAAI,aAAa,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YAC1D,IAAI,CAAC,MAAM,CAAC,2BAA2B,CAAC,WAAW,CAAC,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;IACnD,QAAQ,CAAC,SAAS,GAAG,eAAe,CAAC;IACrC,QAAQ,CAAC,IAAI,GAAG,QAAQ,CAAC;IACzB,QAAQ,CAAC,YAAY,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAC7C,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC;IACvB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACtB,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-assets.d.ts","sourceRoot":"","sources":["../../src/player/resolve-assets.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAEhE,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,UAAU,EAAE,YAAY,EAAE,qBAAqB,GAAG,IAAI,CAQjG"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { isResolvableAssetUrl } from "../content/content-dom.js";
|
|
2
|
+
export function resolveRenderedAssets(root, resolveAsset) {
|
|
3
|
+
for (const element of root.querySelectorAll("[src], [href], [data]")) {
|
|
4
|
+
for (const attribute of ["src", "href", "data"]) {
|
|
5
|
+
const value = element.getAttribute(attribute);
|
|
6
|
+
if (!value || !isResolvableAssetUrl(value))
|
|
7
|
+
continue;
|
|
8
|
+
element.setAttribute(attribute, resolveAsset(value));
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=resolve-assets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-assets.js","sourceRoot":"","sources":["../../src/player/resolve-assets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAGjE,MAAM,UAAU,qBAAqB,CAAC,IAAgB,EAAE,YAAmC;IACzF,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,gBAAgB,CAAC,uBAAuB,CAAC,EAAE,CAAC;QACrE,KAAK,MAAM,SAAS,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;YAChD,MAAM,KAAK,GAAG,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YAC9C,IAAI,CAAC,KAAK,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC;gBAAE,SAAS;YACrD,OAAO,CAAC,YAAY,CAAC,SAAS,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { QtiDiagnostic } from "@longsightgroup/qti3-core";
|
|
2
|
+
/** Load-time item structure problems emitted during `loadXml` and mirrored into validation UI. */
|
|
3
|
+
export declare const AUTHORING_DIAGNOSTIC_CODES: Set<string>;
|
|
4
|
+
export declare function isAuthoringDiagnostic(diagnostic: QtiDiagnostic): boolean;
|
|
5
|
+
/** Response-scoring and attempt validation messages persisted separately from authoring diagnostics. */
|
|
6
|
+
export declare function responseValidationMessages(messages: QtiDiagnostic[]): QtiDiagnostic[];
|
|
7
|
+
export declare function mergeVisibleValidationMessages(authoringDiagnostics: QtiDiagnostic[], validationMessages: QtiDiagnostic[]): QtiDiagnostic[];
|
|
8
|
+
/**
|
|
9
|
+
* Serialized attempt state stores both authoring and response validation messages together.
|
|
10
|
+
* After restore, split response messages back out so they are not duplicated against
|
|
11
|
+
* load-time `authoringDiagnostics`.
|
|
12
|
+
*/
|
|
13
|
+
export declare function splitSerializedValidationMessages(messages: QtiDiagnostic[]): {
|
|
14
|
+
authoringDiagnostics: QtiDiagnostic[];
|
|
15
|
+
validationMessages: QtiDiagnostic[];
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=validation-messages.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation-messages.d.ts","sourceRoot":"","sources":["../../src/player/validation-messages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE/D,kGAAkG;AAClG,eAAO,MAAM,0BAA0B,aAIrC,CAAC;AAEH,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,aAAa,GAAG,OAAO,CAExE;AAED,wGAAwG;AACxG,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,aAAa,EAAE,CAErF;AAED,wBAAgB,8BAA8B,CAC5C,oBAAoB,EAAE,aAAa,EAAE,EACrC,kBAAkB,EAAE,aAAa,EAAE,GAClC,aAAa,EAAE,CAEjB;AAED;;;;GAIG;AACH,wBAAgB,iCAAiC,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG;IAC5E,oBAAoB,EAAE,aAAa,EAAE,CAAC;IACtC,kBAAkB,EAAE,aAAa,EAAE,CAAC;CACrC,CAQA"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/** Load-time item structure problems emitted during `loadXml` and mirrored into validation UI. */
|
|
2
|
+
export const AUTHORING_DIAGNOSTIC_CODES = new Set([
|
|
3
|
+
"interaction.unsupported",
|
|
4
|
+
"interaction.choices.missing",
|
|
5
|
+
"interaction.embed.unsupported",
|
|
6
|
+
]);
|
|
7
|
+
export function isAuthoringDiagnostic(diagnostic) {
|
|
8
|
+
return AUTHORING_DIAGNOSTIC_CODES.has(diagnostic.code);
|
|
9
|
+
}
|
|
10
|
+
/** Response-scoring and attempt validation messages persisted separately from authoring diagnostics. */
|
|
11
|
+
export function responseValidationMessages(messages) {
|
|
12
|
+
return messages.filter((message) => !isAuthoringDiagnostic(message));
|
|
13
|
+
}
|
|
14
|
+
export function mergeVisibleValidationMessages(authoringDiagnostics, validationMessages) {
|
|
15
|
+
return [...authoringDiagnostics, ...validationMessages];
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Serialized attempt state stores both authoring and response validation messages together.
|
|
19
|
+
* After restore, split response messages back out so they are not duplicated against
|
|
20
|
+
* load-time `authoringDiagnostics`.
|
|
21
|
+
*/
|
|
22
|
+
export function splitSerializedValidationMessages(messages) {
|
|
23
|
+
const authoringDiagnostics = [];
|
|
24
|
+
const validationMessages = [];
|
|
25
|
+
for (const message of messages) {
|
|
26
|
+
if (isAuthoringDiagnostic(message))
|
|
27
|
+
authoringDiagnostics.push(message);
|
|
28
|
+
else
|
|
29
|
+
validationMessages.push(message);
|
|
30
|
+
}
|
|
31
|
+
return { authoringDiagnostics, validationMessages };
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=validation-messages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation-messages.js","sourceRoot":"","sources":["../../src/player/validation-messages.ts"],"names":[],"mappings":"AAEA,kGAAkG;AAClG,MAAM,CAAC,MAAM,0BAA0B,GAAG,IAAI,GAAG,CAAS;IACxD,yBAAyB;IACzB,6BAA6B;IAC7B,+BAA+B;CAChC,CAAC,CAAC;AAEH,MAAM,UAAU,qBAAqB,CAAC,UAAyB;IAC7D,OAAO,0BAA0B,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AACzD,CAAC;AAED,wGAAwG;AACxG,MAAM,UAAU,0BAA0B,CAAC,QAAyB;IAClE,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,8BAA8B,CAC5C,oBAAqC,EACrC,kBAAmC;IAEnC,OAAO,CAAC,GAAG,oBAAoB,EAAE,GAAG,kBAAkB,CAAC,CAAC;AAC1D,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iCAAiC,CAAC,QAAyB;IAIzE,MAAM,oBAAoB,GAAoB,EAAE,CAAC;IACjD,MAAM,kBAAkB,GAAoB,EAAE,CAAC;IAC/C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,qBAAqB,CAAC,OAAO,CAAC;YAAE,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;;YAClE,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,CAAC;AACtD,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { PlayerMessageResolver } from "../player-message-resolver.js";
|
|
2
|
+
export declare function createSelectionSummary(): HTMLParagraphElement;
|
|
3
|
+
export declare function orderedItemAccessibleName(messages: PlayerMessageResolver, label: string, index: number, total: number): string;
|
|
4
|
+
export declare function announceOrderedItemMove(summary: HTMLElement, messages: PlayerMessageResolver, label: string, to: number, total: number, from?: number): void;
|
|
5
|
+
export declare function announceOrderedSelectionCount(summary: HTMLElement, messages: PlayerMessageResolver, count: number): void;
|
|
6
|
+
export declare function focusReorderControl(container: ParentNode, identifier: string): void;
|
|
7
|
+
//# sourceMappingURL=a11y.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"a11y.d.ts","sourceRoot":"","sources":["../../src/reorder/a11y.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAE3E,wBAAgB,sBAAsB,IAAI,oBAAoB,CAK7D;AAED,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,qBAAqB,EAC/B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GACZ,MAAM,CAER;AAED,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,WAAW,EACpB,QAAQ,EAAE,qBAAqB,EAC/B,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,MAAM,GACZ,IAAI,CAaN;AAED,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,WAAW,EACpB,QAAQ,EAAE,qBAAqB,EAC/B,KAAK,EAAE,MAAM,GACZ,IAAI,CAKN;AAED,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAEnF"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { choiceSelector } from "../interaction-support.js";
|
|
2
|
+
export function createSelectionSummary() {
|
|
3
|
+
const summary = document.createElement("p");
|
|
4
|
+
summary.className = "qti3-selection-summary";
|
|
5
|
+
summary.setAttribute("aria-live", "polite");
|
|
6
|
+
return summary;
|
|
7
|
+
}
|
|
8
|
+
export function orderedItemAccessibleName(messages, label, index, total) {
|
|
9
|
+
return messages.message("orderedItemAtPosition", { label, position: index + 1, total });
|
|
10
|
+
}
|
|
11
|
+
export function announceOrderedItemMove(summary, messages, label, to, total, from) {
|
|
12
|
+
if (from !== undefined && Math.abs(to - from) === 1) {
|
|
13
|
+
summary.textContent = messages.message("orderedItemMovedOneStep", {
|
|
14
|
+
label,
|
|
15
|
+
direction: to < from ? "up" : "down",
|
|
16
|
+
});
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
summary.textContent = messages.message("orderedItemMovedToPosition", {
|
|
20
|
+
label,
|
|
21
|
+
position: to + 1,
|
|
22
|
+
total,
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
export function announceOrderedSelectionCount(summary, messages, count) {
|
|
26
|
+
summary.textContent =
|
|
27
|
+
count > 0
|
|
28
|
+
? messages.message("graphicOrderRegionsSelected", { count })
|
|
29
|
+
: messages.message("graphicOrderNoRegionsSelected");
|
|
30
|
+
}
|
|
31
|
+
export function focusReorderControl(container, identifier) {
|
|
32
|
+
container.querySelector(`button${choiceSelector(identifier)}`)?.focus();
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=a11y.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"a11y.js","sourceRoot":"","sources":["../../src/reorder/a11y.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAG3D,MAAM,UAAU,sBAAsB;IACpC,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IAC5C,OAAO,CAAC,SAAS,GAAG,wBAAwB,CAAC;IAC7C,OAAO,CAAC,YAAY,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAC5C,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,QAA+B,EAC/B,KAAa,EACb,KAAa,EACb,KAAa;IAEb,OAAO,QAAQ,CAAC,OAAO,CAAC,uBAAuB,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AAC1F,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,OAAoB,EACpB,QAA+B,EAC/B,KAAa,EACb,EAAU,EACV,KAAa,EACb,IAAa;IAEb,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACpD,OAAO,CAAC,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,yBAAyB,EAAE;YAChE,KAAK;YACL,SAAS,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM;SACrC,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IACD,OAAO,CAAC,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,4BAA4B,EAAE;QACnE,KAAK;QACL,QAAQ,EAAE,EAAE,GAAG,CAAC;QAChB,KAAK;KACN,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,6BAA6B,CAC3C,OAAoB,EACpB,QAA+B,EAC/B,KAAa;IAEb,OAAO,CAAC,WAAW;QACjB,KAAK,GAAG,CAAC;YACP,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,6BAA6B,EAAE,EAAE,KAAK,EAAE,CAAC;YAC5D,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,SAAqB,EAAE,UAAkB;IAC3E,SAAS,CAAC,aAAa,CAAoB,SAAS,cAAc,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;AAC7F,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 renderGraphicOrderResponse(interaction: QtiInteraction, update: (value: QtiValue) => void, currentValue: QtiValue, messages: PlayerMessageResolver): HTMLElement;
|
|
4
|
+
//# sourceMappingURL=graphic-order-interaction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graphic-order-interaction.d.ts","sourceRoot":"","sources":["../../src/reorder/graphic-order-interaction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAa,cAAc,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAkBrF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAS3E,wBAAgB,0BAA0B,CACxC,WAAW,EAAE,cAAc,EAC3B,MAAM,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,EACjC,YAAY,EAAE,QAAQ,EACtB,QAAQ,EAAE,qBAAqB,GAC9B,WAAW,CA0Ob"}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import { removeButton } from "../controls/remove-button.js";
|
|
2
|
+
import { applyGraphicSurfaceLayout, appendGraphicObjectImage, choiceSelector, hotspotAccessibleLabel, hotspotCenter, hotspotDisplayLabel, interactionChoices, missingChoicesMessage, objectHeight, objectWidth, placeHotspotButton, responseGroup, valueToStrings, } from "../interaction-support.js";
|
|
3
|
+
import { movementButton } from "../movement.js";
|
|
4
|
+
import { announceOrderedItemMove, announceOrderedSelectionCount, createSelectionSummary, focusReorderControl, orderedItemAccessibleName, } from "./a11y.js";
|
|
5
|
+
export function renderGraphicOrderResponse(interaction, update, currentValue, messages) {
|
|
6
|
+
const group = responseGroup();
|
|
7
|
+
const width = objectWidth(interaction);
|
|
8
|
+
const height = objectHeight(interaction);
|
|
9
|
+
const choices = interactionChoices(interaction).filter((choice) => choice.role === "hotspot");
|
|
10
|
+
if (choices.length === 0) {
|
|
11
|
+
group.append(missingChoicesMessage(interaction));
|
|
12
|
+
return group;
|
|
13
|
+
}
|
|
14
|
+
const orderedIdentifiers = valueToStrings(currentValue).filter((identifier) => choices.some((choice) => choice.identifier === identifier));
|
|
15
|
+
const surface = document.createElement("div");
|
|
16
|
+
applyGraphicSurfaceLayout(surface, width, height, "qti3-graphic-order-surface");
|
|
17
|
+
surface.role = "group";
|
|
18
|
+
surface.setAttribute("aria-label", messages.message("interactionHotspots", { type: interaction.type }));
|
|
19
|
+
const object = interaction.object;
|
|
20
|
+
if (object) {
|
|
21
|
+
appendGraphicObjectImage(surface, object, object.text || messages.message("interactionImageAlt", { type: interaction.type }));
|
|
22
|
+
}
|
|
23
|
+
const sequenceLines = document.createElementNS("http://www.w3.org/2000/svg", "svg");
|
|
24
|
+
sequenceLines.classList.add("qti3-graphic-sequence-lines");
|
|
25
|
+
sequenceLines.setAttribute("viewBox", `0 0 ${width} ${height}`);
|
|
26
|
+
sequenceLines.setAttribute("aria-hidden", "true");
|
|
27
|
+
const markerId = `qti3-graphic-order-marker-${(interaction.responseIdentifier ?? interaction.type).replace(/[^a-zA-Z0-9_-]/g, "-")}`;
|
|
28
|
+
const defs = document.createElementNS("http://www.w3.org/2000/svg", "defs");
|
|
29
|
+
const marker = document.createElementNS("http://www.w3.org/2000/svg", "marker");
|
|
30
|
+
marker.setAttribute("id", markerId);
|
|
31
|
+
marker.setAttribute("viewBox", "0 0 10 10");
|
|
32
|
+
marker.setAttribute("refX", "8");
|
|
33
|
+
marker.setAttribute("refY", "5");
|
|
34
|
+
marker.setAttribute("markerWidth", "5");
|
|
35
|
+
marker.setAttribute("markerHeight", "5");
|
|
36
|
+
marker.setAttribute("orient", "auto-start-reverse");
|
|
37
|
+
const arrow = document.createElementNS("http://www.w3.org/2000/svg", "path");
|
|
38
|
+
arrow.setAttribute("d", "M 0 0 L 10 5 L 0 10 z");
|
|
39
|
+
marker.append(arrow);
|
|
40
|
+
defs.append(marker);
|
|
41
|
+
sequenceLines.append(defs);
|
|
42
|
+
surface.append(sequenceLines);
|
|
43
|
+
const summary = createSelectionSummary();
|
|
44
|
+
const list = document.createElement("ol");
|
|
45
|
+
list.className = "qti3-graphic-order-list";
|
|
46
|
+
list.setAttribute("aria-label", messages.message("interactionSelectedOrderList", { type: interaction.type }));
|
|
47
|
+
const orderedChoices = () => orderedIdentifiers
|
|
48
|
+
.map((identifier) => choices.find((choice) => choice.identifier === identifier))
|
|
49
|
+
.filter((choice) => Boolean(choice));
|
|
50
|
+
const commit = () => update([...orderedIdentifiers]);
|
|
51
|
+
const updateSelectionCountSummary = () => {
|
|
52
|
+
announceOrderedSelectionCount(summary, messages, orderedIdentifiers.length);
|
|
53
|
+
};
|
|
54
|
+
const focusHotspot = (identifier) => {
|
|
55
|
+
surface
|
|
56
|
+
.querySelector(`.qti3-hotspot-button${choiceSelector(identifier)}`)
|
|
57
|
+
?.focus();
|
|
58
|
+
};
|
|
59
|
+
const focusRelativeHotspot = (choice, delta) => {
|
|
60
|
+
const index = choices.findIndex((entry) => entry.identifier === choice.identifier);
|
|
61
|
+
const next = choices[(index + delta + choices.length) % choices.length];
|
|
62
|
+
if (next)
|
|
63
|
+
focusHotspot(next.identifier);
|
|
64
|
+
};
|
|
65
|
+
const chooseHotspot = (choice) => {
|
|
66
|
+
const existingIndex = orderedIdentifiers.indexOf(choice.identifier);
|
|
67
|
+
if (existingIndex >= 0)
|
|
68
|
+
orderedIdentifiers.splice(existingIndex, 1);
|
|
69
|
+
orderedIdentifiers.push(choice.identifier);
|
|
70
|
+
renderState();
|
|
71
|
+
updateSelectionCountSummary();
|
|
72
|
+
commit();
|
|
73
|
+
focusHotspot(choice.identifier);
|
|
74
|
+
};
|
|
75
|
+
const removeHotspot = (identifier) => {
|
|
76
|
+
const index = orderedIdentifiers.indexOf(identifier);
|
|
77
|
+
if (index < 0)
|
|
78
|
+
return;
|
|
79
|
+
orderedIdentifiers.splice(index, 1);
|
|
80
|
+
renderState();
|
|
81
|
+
updateSelectionCountSummary();
|
|
82
|
+
commit();
|
|
83
|
+
focusHotspot(identifier);
|
|
84
|
+
};
|
|
85
|
+
const moveHotspot = (identifier, delta) => {
|
|
86
|
+
const index = orderedIdentifiers.indexOf(identifier);
|
|
87
|
+
const targetIndex = index + delta;
|
|
88
|
+
if (index < 0 || targetIndex < 0 || targetIndex >= orderedIdentifiers.length)
|
|
89
|
+
return;
|
|
90
|
+
const choice = choices.find((entry) => entry.identifier === identifier);
|
|
91
|
+
const choiceLabel = choice ? hotspotDisplayLabel(choice, choices) : identifier;
|
|
92
|
+
const [entry] = orderedIdentifiers.splice(index, 1);
|
|
93
|
+
if (!entry)
|
|
94
|
+
return;
|
|
95
|
+
orderedIdentifiers.splice(targetIndex, 0, entry);
|
|
96
|
+
renderState();
|
|
97
|
+
announceOrderedItemMove(summary, messages, choiceLabel, targetIndex, orderedIdentifiers.length, index);
|
|
98
|
+
commit();
|
|
99
|
+
focusReorderControl(list, identifier);
|
|
100
|
+
};
|
|
101
|
+
const renderState = () => {
|
|
102
|
+
for (const line of sequenceLines.querySelectorAll("line"))
|
|
103
|
+
line.remove();
|
|
104
|
+
const currentChoices = orderedChoices();
|
|
105
|
+
for (let index = 0; index < currentChoices.length - 1; index += 1) {
|
|
106
|
+
const current = currentChoices[index];
|
|
107
|
+
const next = currentChoices[index + 1];
|
|
108
|
+
if (!current || !next)
|
|
109
|
+
continue;
|
|
110
|
+
const start = hotspotCenter(current, width, height);
|
|
111
|
+
const end = hotspotCenter(next, width, height);
|
|
112
|
+
const line = document.createElementNS("http://www.w3.org/2000/svg", "line");
|
|
113
|
+
line.setAttribute("x1", String(start.x));
|
|
114
|
+
line.setAttribute("y1", String(start.y));
|
|
115
|
+
line.setAttribute("x2", String(end.x));
|
|
116
|
+
line.setAttribute("y2", String(end.y));
|
|
117
|
+
line.setAttribute("marker-end", `url(#${markerId})`);
|
|
118
|
+
sequenceLines.append(line);
|
|
119
|
+
}
|
|
120
|
+
for (const button of surface.querySelectorAll(".qti3-hotspot-button")) {
|
|
121
|
+
const identifier = button.dataset.choiceIdentifier ?? "";
|
|
122
|
+
const index = orderedIdentifiers.indexOf(identifier);
|
|
123
|
+
const isSelected = index >= 0;
|
|
124
|
+
button.dataset.selected = isSelected ? "true" : "false";
|
|
125
|
+
button.setAttribute("aria-pressed", isSelected ? "true" : "false");
|
|
126
|
+
button.dataset.order = isSelected ? String(index + 1) : "";
|
|
127
|
+
const badge = button.querySelector(".qti3-graphic-order-number");
|
|
128
|
+
if (badge)
|
|
129
|
+
badge.textContent = isSelected ? String(index + 1) : "";
|
|
130
|
+
}
|
|
131
|
+
list.replaceChildren(...currentChoices.map((choice, index) => {
|
|
132
|
+
const item = document.createElement("li");
|
|
133
|
+
item.className = "qti3-graphic-order-item";
|
|
134
|
+
item.dataset.choiceIdentifier = choice.identifier;
|
|
135
|
+
const choiceLabel = hotspotDisplayLabel(choice, choices);
|
|
136
|
+
const label = document.createElement("button");
|
|
137
|
+
label.type = "button";
|
|
138
|
+
label.className = "qti3-token";
|
|
139
|
+
label.dataset.choiceIdentifier = choice.identifier;
|
|
140
|
+
label.textContent = `${index + 1}. ${choiceLabel}`;
|
|
141
|
+
label.setAttribute("aria-label", orderedItemAccessibleName(messages, choiceLabel, index, currentChoices.length));
|
|
142
|
+
label.addEventListener("click", () => focusHotspot(choice.identifier));
|
|
143
|
+
label.addEventListener("keydown", (event) => {
|
|
144
|
+
if (event.key === "ArrowUp" || event.key === "ArrowLeft") {
|
|
145
|
+
event.preventDefault();
|
|
146
|
+
moveHotspot(choice.identifier, -1);
|
|
147
|
+
}
|
|
148
|
+
else if (event.key === "ArrowDown" || event.key === "ArrowRight") {
|
|
149
|
+
event.preventDefault();
|
|
150
|
+
moveHotspot(choice.identifier, 1);
|
|
151
|
+
}
|
|
152
|
+
else if (event.key === "Delete" || event.key === "Backspace") {
|
|
153
|
+
event.preventDefault();
|
|
154
|
+
removeHotspot(choice.identifier);
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
const up = movementButton("up", messages.message("moveChoice", { label: choiceLabel, direction: "up" }), () => moveHotspot(choice.identifier, -1));
|
|
158
|
+
up.disabled = index === 0;
|
|
159
|
+
const down = movementButton("down", messages.message("moveChoice", { label: choiceLabel, direction: "down" }), () => moveHotspot(choice.identifier, 1));
|
|
160
|
+
down.disabled = index === currentChoices.length - 1;
|
|
161
|
+
const remove = removeButton(choiceLabel, messages);
|
|
162
|
+
remove.addEventListener("click", () => removeHotspot(choice.identifier));
|
|
163
|
+
item.append(label, up, down, remove);
|
|
164
|
+
return item;
|
|
165
|
+
}));
|
|
166
|
+
};
|
|
167
|
+
for (const [index, choice] of choices.entries()) {
|
|
168
|
+
const button = document.createElement("button");
|
|
169
|
+
button.type = "button";
|
|
170
|
+
button.className = "qti3-hotspot-button qti3-graphic-order-hotspot";
|
|
171
|
+
button.dataset.choiceIdentifier = choice.identifier;
|
|
172
|
+
button.title = hotspotAccessibleLabel(choice, index);
|
|
173
|
+
button.setAttribute("aria-label", hotspotAccessibleLabel(choice, index));
|
|
174
|
+
button.setAttribute("aria-pressed", "false");
|
|
175
|
+
placeHotspotButton(button, choice, width, height);
|
|
176
|
+
const text = document.createElement("span");
|
|
177
|
+
text.className = "qti3-hotspot-label";
|
|
178
|
+
text.textContent = hotspotDisplayLabel(choice, choices);
|
|
179
|
+
const order = document.createElement("span");
|
|
180
|
+
order.className = "qti3-graphic-order-number";
|
|
181
|
+
order.setAttribute("aria-hidden", "true");
|
|
182
|
+
button.append(text, order);
|
|
183
|
+
button.addEventListener("click", () => chooseHotspot(choice));
|
|
184
|
+
button.addEventListener("keydown", (event) => {
|
|
185
|
+
if (event.key === "ArrowRight" || event.key === "ArrowDown") {
|
|
186
|
+
event.preventDefault();
|
|
187
|
+
focusRelativeHotspot(choice, 1);
|
|
188
|
+
}
|
|
189
|
+
else if (event.key === "ArrowLeft" || event.key === "ArrowUp") {
|
|
190
|
+
event.preventDefault();
|
|
191
|
+
focusRelativeHotspot(choice, -1);
|
|
192
|
+
}
|
|
193
|
+
else if (event.key === "Delete" || event.key === "Backspace") {
|
|
194
|
+
event.preventDefault();
|
|
195
|
+
removeHotspot(choice.identifier);
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
surface.append(button);
|
|
199
|
+
}
|
|
200
|
+
renderState();
|
|
201
|
+
updateSelectionCountSummary();
|
|
202
|
+
group.append(surface, list, summary);
|
|
203
|
+
return group;
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=graphic-order-interaction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graphic-order-interaction.js","sourceRoot":"","sources":["../../src/reorder/graphic-order-interaction.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { PlayerMessageResolver } from "../player-message-resolver.js";
|
|
2
|
+
export interface ReorderHandleOptions {
|
|
3
|
+
identifier: string;
|
|
4
|
+
label: string;
|
|
5
|
+
index: number;
|
|
6
|
+
total: number;
|
|
7
|
+
handleClassName: string;
|
|
8
|
+
visibleText: string;
|
|
9
|
+
messages: PlayerMessageResolver;
|
|
10
|
+
onMoveBy: (delta: number) => void;
|
|
11
|
+
}
|
|
12
|
+
export declare function createReorderHandleControls(options: ReorderHandleOptions): {
|
|
13
|
+
handle: HTMLButtonElement;
|
|
14
|
+
up: HTMLButtonElement;
|
|
15
|
+
down: HTMLButtonElement;
|
|
16
|
+
};
|
|
17
|
+
export interface OrderDragState {
|
|
18
|
+
draggedIdentifier?: string;
|
|
19
|
+
pointerDraggedIdentifier?: string;
|
|
20
|
+
}
|
|
21
|
+
export declare function bindOrderListItemDrag(item: HTMLLIElement, choiceIdentifier: string, index: number, dragState: OrderDragState, moveChoice: (from: number, to: number) => void, findIndex: (identifier: string) => number): void;
|
|
22
|
+
//# sourceMappingURL=list-controls.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-controls.d.ts","sourceRoot":"","sources":["../../src/reorder/list-controls.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAG3E,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,qBAAqB,CAAC;IAChC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAED,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,oBAAoB,GAAG;IAC1E,MAAM,EAAE,iBAAiB,CAAC;IAC1B,EAAE,EAAE,iBAAiB,CAAC;IACtB,IAAI,EAAE,iBAAiB,CAAC;CACzB,CAiCA;AAED,MAAM,WAAW,cAAc;IAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,wBAAwB,CAAC,EAAE,MAAM,CAAC;CACnC;AAED,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,aAAa,EACnB,gBAAgB,EAAE,MAAM,EACxB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,cAAc,EACzB,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,IAAI,EAC9C,SAAS,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,MAAM,GACxC,IAAI,CAiDN"}
|