@longsightgroup/qti3-player 0.5.1 → 0.5.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (201) hide show
  1. package/dist/content/content-dom.d.ts +11 -0
  2. package/dist/content/content-dom.d.ts.map +1 -0
  3. package/dist/content/content-dom.js +262 -0
  4. package/dist/content/content-dom.js.map +1 -0
  5. package/dist/content/content-renderer.d.ts +17 -0
  6. package/dist/content/content-renderer.d.ts.map +1 -0
  7. package/dist/content/content-renderer.js +82 -0
  8. package/dist/content/content-renderer.js.map +1 -0
  9. package/dist/controls/remove-button.d.ts +3 -0
  10. package/dist/controls/remove-button.d.ts.map +1 -0
  11. package/dist/controls/remove-button.js +12 -0
  12. package/dist/controls/remove-button.js.map +1 -0
  13. package/dist/interactions/choice-interaction.d.ts +4 -0
  14. package/dist/interactions/choice-interaction.d.ts.map +1 -0
  15. package/dist/interactions/choice-interaction.js +81 -0
  16. package/dist/interactions/choice-interaction.js.map +1 -0
  17. package/dist/interactions/drawing-interaction.d.ts +6 -0
  18. package/dist/interactions/drawing-interaction.d.ts.map +1 -0
  19. package/dist/interactions/drawing-interaction.js +401 -0
  20. package/dist/interactions/drawing-interaction.js.map +1 -0
  21. package/dist/interactions/end-attempt-interaction.d.ts +4 -0
  22. package/dist/interactions/end-attempt-interaction.d.ts.map +1 -0
  23. package/dist/interactions/end-attempt-interaction.js +13 -0
  24. package/dist/interactions/end-attempt-interaction.js.map +1 -0
  25. package/dist/interactions/gap-match-interaction.d.ts +4 -0
  26. package/dist/interactions/gap-match-interaction.d.ts.map +1 -0
  27. package/dist/interactions/gap-match-interaction.js +277 -0
  28. package/dist/interactions/gap-match-interaction.js.map +1 -0
  29. package/dist/interactions/graphic-associate-interaction.d.ts +4 -0
  30. package/dist/interactions/graphic-associate-interaction.d.ts.map +1 -0
  31. package/dist/interactions/graphic-associate-interaction.js +297 -0
  32. package/dist/interactions/graphic-associate-interaction.js.map +1 -0
  33. package/dist/interactions/graphic-context.d.ts +3 -0
  34. package/dist/interactions/graphic-context.d.ts.map +1 -0
  35. package/dist/interactions/graphic-context.js +35 -0
  36. package/dist/interactions/graphic-context.js.map +1 -0
  37. package/dist/interactions/hotspot-interaction.d.ts +4 -0
  38. package/dist/interactions/hotspot-interaction.d.ts.map +1 -0
  39. package/dist/interactions/hotspot-interaction.js +68 -0
  40. package/dist/interactions/hotspot-interaction.js.map +1 -0
  41. package/dist/interactions/hottext-interaction.d.ts +3 -0
  42. package/dist/interactions/hottext-interaction.d.ts.map +1 -0
  43. package/dist/interactions/hottext-interaction.js +66 -0
  44. package/dist/interactions/hottext-interaction.js.map +1 -0
  45. package/dist/interactions/inline-choice-interaction.d.ts +4 -0
  46. package/dist/interactions/inline-choice-interaction.d.ts.map +1 -0
  47. package/dist/interactions/inline-choice-interaction.js +31 -0
  48. package/dist/interactions/inline-choice-interaction.js.map +1 -0
  49. package/dist/interactions/inline-controls.d.ts +6 -0
  50. package/dist/interactions/inline-controls.d.ts.map +1 -0
  51. package/dist/interactions/inline-controls.js +15 -0
  52. package/dist/interactions/inline-controls.js.map +1 -0
  53. package/dist/interactions/interaction-diagnostics.d.ts +7 -0
  54. package/dist/interactions/interaction-diagnostics.d.ts.map +1 -0
  55. package/dist/interactions/interaction-diagnostics.js +137 -0
  56. package/dist/interactions/interaction-diagnostics.js.map +1 -0
  57. package/dist/interactions/interaction-dispatch.d.ts +2 -0
  58. package/dist/interactions/interaction-dispatch.d.ts.map +1 -0
  59. package/dist/interactions/interaction-dispatch.js +2 -0
  60. package/dist/interactions/interaction-dispatch.js.map +1 -0
  61. package/dist/interactions/interaction-label.d.ts +4 -0
  62. package/dist/interactions/interaction-label.d.ts.map +1 -0
  63. package/dist/interactions/interaction-label.js +8 -0
  64. package/dist/interactions/interaction-label.js.map +1 -0
  65. package/dist/interactions/interaction-registry.d.ts +24 -0
  66. package/dist/interactions/interaction-registry.d.ts.map +1 -0
  67. package/dist/interactions/interaction-registry.js +138 -0
  68. package/dist/interactions/interaction-registry.js.map +1 -0
  69. package/dist/interactions/match-interaction.d.ts +4 -0
  70. package/dist/interactions/match-interaction.d.ts.map +1 -0
  71. package/dist/interactions/match-interaction.js +188 -0
  72. package/dist/interactions/match-interaction.js.map +1 -0
  73. package/dist/interactions/object-asset.d.ts +8 -0
  74. package/dist/interactions/object-asset.d.ts.map +1 -0
  75. package/dist/interactions/object-asset.js +182 -0
  76. package/dist/interactions/object-asset.js.map +1 -0
  77. package/dist/interactions/pair-interaction.d.ts +4 -0
  78. package/dist/interactions/pair-interaction.d.ts.map +1 -0
  79. package/dist/interactions/pair-interaction.js +125 -0
  80. package/dist/interactions/pair-interaction.js.map +1 -0
  81. package/dist/interactions/point-value.d.ts +16 -0
  82. package/dist/interactions/point-value.d.ts.map +1 -0
  83. package/dist/interactions/point-value.js +37 -0
  84. package/dist/interactions/point-value.js.map +1 -0
  85. package/dist/interactions/portable-custom-interaction.d.ts +16 -0
  86. package/dist/interactions/portable-custom-interaction.d.ts.map +1 -0
  87. package/dist/interactions/portable-custom-interaction.js +97 -0
  88. package/dist/interactions/portable-custom-interaction.js.map +1 -0
  89. package/dist/interactions/position-object-interaction.d.ts +4 -0
  90. package/dist/interactions/position-object-interaction.d.ts.map +1 -0
  91. package/dist/interactions/position-object-interaction.js +177 -0
  92. package/dist/interactions/position-object-interaction.js.map +1 -0
  93. package/dist/interactions/routing.d.ts +5 -0
  94. package/dist/interactions/routing.d.ts.map +1 -0
  95. package/dist/interactions/routing.js +24 -0
  96. package/dist/interactions/routing.js.map +1 -0
  97. package/dist/interactions/select-point-interaction.d.ts +4 -0
  98. package/dist/interactions/select-point-interaction.d.ts.map +1 -0
  99. package/dist/interactions/select-point-interaction.js +166 -0
  100. package/dist/interactions/select-point-interaction.js.map +1 -0
  101. package/dist/interactions/shared.d.ts +12 -0
  102. package/dist/interactions/shared.d.ts.map +1 -0
  103. package/dist/interactions/shared.js +65 -0
  104. package/dist/interactions/shared.js.map +1 -0
  105. package/dist/interactions/text-interaction.d.ts +6 -0
  106. package/dist/interactions/text-interaction.d.ts.map +1 -0
  107. package/dist/interactions/text-interaction.js +110 -0
  108. package/dist/interactions/text-interaction.js.map +1 -0
  109. package/dist/interactions/unsupported-interaction.d.ts +4 -0
  110. package/dist/interactions/unsupported-interaction.d.ts.map +1 -0
  111. package/dist/interactions/unsupported-interaction.js +23 -0
  112. package/dist/interactions/unsupported-interaction.js.map +1 -0
  113. package/dist/interactions/upload-interaction.d.ts +4 -0
  114. package/dist/interactions/upload-interaction.d.ts.map +1 -0
  115. package/dist/interactions/upload-interaction.js +10 -0
  116. package/dist/interactions/upload-interaction.js.map +1 -0
  117. package/dist/player/attempt-availability.d.ts +6 -0
  118. package/dist/player/attempt-availability.d.ts.map +1 -0
  119. package/dist/player/attempt-availability.js +27 -0
  120. package/dist/player/attempt-availability.js.map +1 -0
  121. package/dist/player/content-state.d.ts +19 -0
  122. package/dist/player/content-state.d.ts.map +1 -0
  123. package/dist/player/content-state.js +39 -0
  124. package/dist/player/content-state.js.map +1 -0
  125. package/dist/player/dynamic-body.d.ts +7 -0
  126. package/dist/player/dynamic-body.d.ts.map +1 -0
  127. package/dist/player/dynamic-body.js +28 -0
  128. package/dist/player/dynamic-body.js.map +1 -0
  129. package/dist/player/feedback-panel.d.ts +3 -0
  130. package/dist/player/feedback-panel.d.ts.map +1 -0
  131. package/dist/player/feedback-panel.js +14 -0
  132. package/dist/player/feedback-panel.js.map +1 -0
  133. package/dist/player/fetch-xml.d.ts +2 -0
  134. package/dist/player/fetch-xml.d.ts.map +1 -0
  135. package/dist/player/fetch-xml.js +10 -0
  136. package/dist/player/fetch-xml.js.map +1 -0
  137. package/dist/player/interaction-render.d.ts +14 -0
  138. package/dist/player/interaction-render.d.ts.map +1 -0
  139. package/dist/player/interaction-render.js +51 -0
  140. package/dist/player/interaction-render.js.map +1 -0
  141. package/dist/player/render-shell.d.ts +8 -0
  142. package/dist/player/render-shell.d.ts.map +1 -0
  143. package/dist/player/render-shell.js +37 -0
  144. package/dist/player/render-shell.js.map +1 -0
  145. package/dist/player/resolve-assets.d.ts +3 -0
  146. package/dist/player/resolve-assets.d.ts.map +1 -0
  147. package/dist/player/resolve-assets.js +12 -0
  148. package/dist/player/resolve-assets.js.map +1 -0
  149. package/dist/player/validation-messages.d.ts +17 -0
  150. package/dist/player/validation-messages.d.ts.map +1 -0
  151. package/dist/player/validation-messages.js +33 -0
  152. package/dist/player/validation-messages.js.map +1 -0
  153. package/dist/reorder/a11y.d.ts +7 -0
  154. package/dist/reorder/a11y.d.ts.map +1 -0
  155. package/dist/reorder/a11y.js +34 -0
  156. package/dist/reorder/a11y.js.map +1 -0
  157. package/dist/reorder/graphic-order-interaction.d.ts +4 -0
  158. package/dist/reorder/graphic-order-interaction.d.ts.map +1 -0
  159. package/dist/reorder/graphic-order-interaction.js +205 -0
  160. package/dist/reorder/graphic-order-interaction.js.map +1 -0
  161. package/dist/reorder/list-controls.d.ts +22 -0
  162. package/dist/reorder/list-controls.d.ts.map +1 -0
  163. package/dist/reorder/list-controls.js +75 -0
  164. package/dist/reorder/list-controls.js.map +1 -0
  165. package/dist/reorder/order-interaction.d.ts +4 -0
  166. package/dist/reorder/order-interaction.d.ts.map +1 -0
  167. package/dist/reorder/order-interaction.js +54 -0
  168. package/dist/reorder/order-interaction.js.map +1 -0
  169. package/dist/styles/base-styles.d.ts +2 -0
  170. package/dist/styles/base-styles.d.ts.map +1 -0
  171. package/dist/styles/base-styles.js +133 -0
  172. package/dist/styles/base-styles.js.map +1 -0
  173. package/dist/styles/choice-hottext-styles.d.ts +2 -0
  174. package/dist/styles/choice-hottext-styles.d.ts.map +1 -0
  175. package/dist/styles/choice-hottext-styles.js +76 -0
  176. package/dist/styles/choice-hottext-styles.js.map +1 -0
  177. package/dist/styles/control-styles.d.ts +2 -0
  178. package/dist/styles/control-styles.d.ts.map +1 -0
  179. package/dist/styles/control-styles.js +114 -0
  180. package/dist/styles/control-styles.js.map +1 -0
  181. package/dist/styles/drawing-styles.d.ts +2 -0
  182. package/dist/styles/drawing-styles.d.ts.map +1 -0
  183. package/dist/styles/drawing-styles.js +30 -0
  184. package/dist/styles/drawing-styles.js.map +1 -0
  185. package/dist/styles/gap-match-styles.d.ts +2 -0
  186. package/dist/styles/gap-match-styles.d.ts.map +1 -0
  187. package/dist/styles/gap-match-styles.js +33 -0
  188. package/dist/styles/gap-match-styles.js.map +1 -0
  189. package/dist/styles/graphic-styles.d.ts +2 -0
  190. package/dist/styles/graphic-styles.d.ts.map +1 -0
  191. package/dist/styles/graphic-styles.js +289 -0
  192. package/dist/styles/graphic-styles.js.map +1 -0
  193. package/dist/styles/match-pair-styles.d.ts +2 -0
  194. package/dist/styles/match-pair-styles.d.ts.map +1 -0
  195. package/dist/styles/match-pair-styles.js +62 -0
  196. package/dist/styles/match-pair-styles.js.map +1 -0
  197. package/dist/styles/text-slider-styles.d.ts +2 -0
  198. package/dist/styles/text-slider-styles.d.ts.map +1 -0
  199. package/dist/styles/text-slider-styles.js +35 -0
  200. package/dist/styles/text-slider-styles.js.map +1 -0
  201. package/package.json +8 -8
@@ -0,0 +1 @@
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,3 @@
1
+ import { type QtiAssessmentItem, type QtiValue } from "@longsightgroup/qti3-core";
2
+ export declare function syncFeedbackPanel(feedback: HTMLElement | null, item: QtiAssessmentItem, outcomes: Record<string, QtiValue>): void;
3
+ //# sourceMappingURL=feedback-panel.d.ts.map
@@ -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,2 @@
1
+ export declare function defaultFetchXml(url: string): Promise<string>;
2
+ //# sourceMappingURL=fetch-xml.d.ts.map
@@ -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,3 @@
1
+ import type { QtiPlayerResolveAsset } from "../player-types.js";
2
+ export declare function resolveRenderedAssets(root: ParentNode, resolveAsset: QtiPlayerResolveAsset): void;
3
+ //# sourceMappingURL=resolve-assets.d.ts.map
@@ -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"}