@longsightgroup/qti3-player 0.4.0 → 0.5.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (291) hide show
  1. package/README.md +146 -13
  2. package/dist/content/content-dom.d.ts +11 -0
  3. package/dist/content/content-dom.d.ts.map +1 -0
  4. package/dist/content/content-dom.js +262 -0
  5. package/dist/content/content-dom.js.map +1 -0
  6. package/dist/content/content-renderer.d.ts +17 -0
  7. package/dist/content/content-renderer.d.ts.map +1 -0
  8. package/dist/content/content-renderer.js +82 -0
  9. package/dist/content/content-renderer.js.map +1 -0
  10. package/dist/controls/remove-button.d.ts +3 -0
  11. package/dist/controls/remove-button.d.ts.map +1 -0
  12. package/dist/controls/remove-button.js +12 -0
  13. package/dist/controls/remove-button.js.map +1 -0
  14. package/dist/index.d.ts +13 -2
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +6 -0
  17. package/dist/index.js.map +1 -1
  18. package/dist/interactions/choice-interaction.d.ts +4 -0
  19. package/dist/interactions/choice-interaction.d.ts.map +1 -0
  20. package/dist/interactions/choice-interaction.js +81 -0
  21. package/dist/interactions/choice-interaction.js.map +1 -0
  22. package/dist/interactions/drawing-interaction.d.ts +6 -0
  23. package/dist/interactions/drawing-interaction.d.ts.map +1 -0
  24. package/dist/interactions/drawing-interaction.js +401 -0
  25. package/dist/interactions/drawing-interaction.js.map +1 -0
  26. package/dist/interactions/end-attempt-interaction.d.ts +4 -0
  27. package/dist/interactions/end-attempt-interaction.d.ts.map +1 -0
  28. package/dist/interactions/end-attempt-interaction.js +13 -0
  29. package/dist/interactions/end-attempt-interaction.js.map +1 -0
  30. package/dist/interactions/gap-match-interaction.d.ts +4 -0
  31. package/dist/interactions/gap-match-interaction.d.ts.map +1 -0
  32. package/dist/interactions/gap-match-interaction.js +277 -0
  33. package/dist/interactions/gap-match-interaction.js.map +1 -0
  34. package/dist/interactions/graphic-associate-interaction.d.ts +4 -0
  35. package/dist/interactions/graphic-associate-interaction.d.ts.map +1 -0
  36. package/dist/interactions/graphic-associate-interaction.js +297 -0
  37. package/dist/interactions/graphic-associate-interaction.js.map +1 -0
  38. package/dist/interactions/graphic-context.d.ts +3 -0
  39. package/dist/interactions/graphic-context.d.ts.map +1 -0
  40. package/dist/interactions/graphic-context.js +35 -0
  41. package/dist/interactions/graphic-context.js.map +1 -0
  42. package/dist/interactions/hotspot-interaction.d.ts +4 -0
  43. package/dist/interactions/hotspot-interaction.d.ts.map +1 -0
  44. package/dist/interactions/hotspot-interaction.js +68 -0
  45. package/dist/interactions/hotspot-interaction.js.map +1 -0
  46. package/dist/interactions/hottext-interaction.d.ts +3 -0
  47. package/dist/interactions/hottext-interaction.d.ts.map +1 -0
  48. package/dist/interactions/hottext-interaction.js +66 -0
  49. package/dist/interactions/hottext-interaction.js.map +1 -0
  50. package/dist/interactions/inline-choice-interaction.d.ts +4 -0
  51. package/dist/interactions/inline-choice-interaction.d.ts.map +1 -0
  52. package/dist/interactions/inline-choice-interaction.js +31 -0
  53. package/dist/interactions/inline-choice-interaction.js.map +1 -0
  54. package/dist/interactions/inline-controls.d.ts +6 -0
  55. package/dist/interactions/inline-controls.d.ts.map +1 -0
  56. package/dist/interactions/inline-controls.js +15 -0
  57. package/dist/interactions/inline-controls.js.map +1 -0
  58. package/dist/interactions/interaction-diagnostics.d.ts +7 -0
  59. package/dist/interactions/interaction-diagnostics.d.ts.map +1 -0
  60. package/dist/interactions/interaction-diagnostics.js +137 -0
  61. package/dist/interactions/interaction-diagnostics.js.map +1 -0
  62. package/dist/interactions/interaction-dispatch.d.ts +2 -0
  63. package/dist/interactions/interaction-dispatch.d.ts.map +1 -0
  64. package/dist/interactions/interaction-dispatch.js +2 -0
  65. package/dist/interactions/interaction-dispatch.js.map +1 -0
  66. package/dist/interactions/interaction-label.d.ts +4 -0
  67. package/dist/interactions/interaction-label.d.ts.map +1 -0
  68. package/dist/interactions/interaction-label.js +8 -0
  69. package/dist/interactions/interaction-label.js.map +1 -0
  70. package/dist/interactions/interaction-registry.d.ts +24 -0
  71. package/dist/interactions/interaction-registry.d.ts.map +1 -0
  72. package/dist/interactions/interaction-registry.js +138 -0
  73. package/dist/interactions/interaction-registry.js.map +1 -0
  74. package/dist/interactions/match-interaction.d.ts +4 -0
  75. package/dist/interactions/match-interaction.d.ts.map +1 -0
  76. package/dist/interactions/match-interaction.js +188 -0
  77. package/dist/interactions/match-interaction.js.map +1 -0
  78. package/dist/interactions/object-asset.d.ts +8 -0
  79. package/dist/interactions/object-asset.d.ts.map +1 -0
  80. package/dist/interactions/object-asset.js +182 -0
  81. package/dist/interactions/object-asset.js.map +1 -0
  82. package/dist/interactions/pair-interaction.d.ts +4 -0
  83. package/dist/interactions/pair-interaction.d.ts.map +1 -0
  84. package/dist/interactions/pair-interaction.js +125 -0
  85. package/dist/interactions/pair-interaction.js.map +1 -0
  86. package/dist/interactions/point-value.d.ts +16 -0
  87. package/dist/interactions/point-value.d.ts.map +1 -0
  88. package/dist/interactions/point-value.js +37 -0
  89. package/dist/interactions/point-value.js.map +1 -0
  90. package/dist/interactions/portable-custom-interaction.d.ts +16 -0
  91. package/dist/interactions/portable-custom-interaction.d.ts.map +1 -0
  92. package/dist/interactions/portable-custom-interaction.js +97 -0
  93. package/dist/interactions/portable-custom-interaction.js.map +1 -0
  94. package/dist/interactions/position-object-interaction.d.ts +4 -0
  95. package/dist/interactions/position-object-interaction.d.ts.map +1 -0
  96. package/dist/interactions/position-object-interaction.js +177 -0
  97. package/dist/interactions/position-object-interaction.js.map +1 -0
  98. package/dist/interactions/routing.d.ts +5 -0
  99. package/dist/interactions/routing.d.ts.map +1 -0
  100. package/dist/interactions/routing.js +24 -0
  101. package/dist/interactions/routing.js.map +1 -0
  102. package/dist/interactions/select-point-interaction.d.ts +4 -0
  103. package/dist/interactions/select-point-interaction.d.ts.map +1 -0
  104. package/dist/interactions/select-point-interaction.js +166 -0
  105. package/dist/interactions/select-point-interaction.js.map +1 -0
  106. package/dist/interactions/shared.d.ts +12 -0
  107. package/dist/interactions/shared.d.ts.map +1 -0
  108. package/dist/interactions/shared.js +65 -0
  109. package/dist/interactions/shared.js.map +1 -0
  110. package/dist/interactions/text-interaction.d.ts +6 -0
  111. package/dist/interactions/text-interaction.d.ts.map +1 -0
  112. package/dist/interactions/text-interaction.js +110 -0
  113. package/dist/interactions/text-interaction.js.map +1 -0
  114. package/dist/interactions/unsupported-interaction.d.ts +4 -0
  115. package/dist/interactions/unsupported-interaction.d.ts.map +1 -0
  116. package/dist/interactions/unsupported-interaction.js +23 -0
  117. package/dist/interactions/unsupported-interaction.js.map +1 -0
  118. package/dist/interactions/upload-interaction.d.ts +4 -0
  119. package/dist/interactions/upload-interaction.d.ts.map +1 -0
  120. package/dist/interactions/upload-interaction.js +10 -0
  121. package/dist/interactions/upload-interaction.js.map +1 -0
  122. package/dist/player/attempt-availability.d.ts +6 -0
  123. package/dist/player/attempt-availability.d.ts.map +1 -0
  124. package/dist/player/attempt-availability.js +27 -0
  125. package/dist/player/attempt-availability.js.map +1 -0
  126. package/dist/player/content-state.d.ts +19 -0
  127. package/dist/player/content-state.d.ts.map +1 -0
  128. package/dist/player/content-state.js +39 -0
  129. package/dist/player/content-state.js.map +1 -0
  130. package/dist/player/dynamic-body.d.ts +7 -0
  131. package/dist/player/dynamic-body.d.ts.map +1 -0
  132. package/dist/player/dynamic-body.js +28 -0
  133. package/dist/player/dynamic-body.js.map +1 -0
  134. package/dist/player/feedback-panel.d.ts +3 -0
  135. package/dist/player/feedback-panel.d.ts.map +1 -0
  136. package/dist/player/feedback-panel.js +14 -0
  137. package/dist/player/feedback-panel.js.map +1 -0
  138. package/dist/player/fetch-xml.d.ts +2 -0
  139. package/dist/player/fetch-xml.d.ts.map +1 -0
  140. package/dist/player/fetch-xml.js +10 -0
  141. package/dist/player/fetch-xml.js.map +1 -0
  142. package/dist/player/interaction-render.d.ts +14 -0
  143. package/dist/player/interaction-render.d.ts.map +1 -0
  144. package/dist/player/interaction-render.js +51 -0
  145. package/dist/player/interaction-render.js.map +1 -0
  146. package/dist/player/render-shell.d.ts +8 -0
  147. package/dist/player/render-shell.d.ts.map +1 -0
  148. package/dist/player/render-shell.js +37 -0
  149. package/dist/player/render-shell.js.map +1 -0
  150. package/dist/player/resolve-assets.d.ts +3 -0
  151. package/dist/player/resolve-assets.d.ts.map +1 -0
  152. package/dist/player/resolve-assets.js +12 -0
  153. package/dist/player/resolve-assets.js.map +1 -0
  154. package/dist/player/validation-messages.d.ts +17 -0
  155. package/dist/player/validation-messages.d.ts.map +1 -0
  156. package/dist/player/validation-messages.js +33 -0
  157. package/dist/player/validation-messages.js.map +1 -0
  158. package/dist/player-adapter.d.ts +62 -0
  159. package/dist/player-adapter.d.ts.map +1 -0
  160. package/dist/player-adapter.js +119 -0
  161. package/dist/player-adapter.js.map +1 -0
  162. package/dist/player-dev.d.ts +4 -0
  163. package/dist/player-dev.d.ts.map +1 -0
  164. package/dist/player-dev.js +14 -0
  165. package/dist/player-dev.js.map +1 -0
  166. package/dist/player-element.d.ts +14 -1
  167. package/dist/player-element.d.ts.map +1 -1
  168. package/dist/player-element.js +57 -5
  169. package/dist/player-element.js.map +1 -1
  170. package/dist/player-locale.d.ts +8 -3
  171. package/dist/player-locale.d.ts.map +1 -1
  172. package/dist/player-locale.js +16 -175
  173. package/dist/player-locale.js.map +1 -1
  174. package/dist/player-message-catalog-default.d.ts +4 -0
  175. package/dist/player-message-catalog-default.d.ts.map +1 -0
  176. package/dist/player-message-catalog-default.js +118 -0
  177. package/dist/player-message-catalog-default.js.map +1 -0
  178. package/dist/player-message-catalog-validate.d.ts +31 -0
  179. package/dist/player-message-catalog-validate.d.ts.map +1 -0
  180. package/dist/player-message-catalog-validate.js +327 -0
  181. package/dist/player-message-catalog-validate.js.map +1 -0
  182. package/dist/player-message-catalog.d.ts +18 -0
  183. package/dist/player-message-catalog.d.ts.map +1 -0
  184. package/dist/player-message-catalog.js +40 -0
  185. package/dist/player-message-catalog.js.map +1 -0
  186. package/dist/player-message-keys.d.ts +6 -0
  187. package/dist/player-message-keys.d.ts.map +1 -0
  188. package/dist/player-message-keys.js +7 -0
  189. package/dist/player-message-keys.js.map +1 -0
  190. package/dist/player-message-manifest.d.ts +272 -0
  191. package/dist/player-message-manifest.d.ts.map +1 -0
  192. package/dist/player-message-manifest.js +83 -0
  193. package/dist/player-message-manifest.js.map +1 -0
  194. package/dist/player-message-overrides.d.ts +3 -0
  195. package/dist/player-message-overrides.d.ts.map +1 -0
  196. package/dist/player-message-overrides.js +28 -0
  197. package/dist/player-message-overrides.js.map +1 -0
  198. package/dist/player-message-resolver.d.ts +31 -0
  199. package/dist/player-message-resolver.d.ts.map +1 -0
  200. package/dist/player-message-resolver.js +110 -0
  201. package/dist/player-message-resolver.js.map +1 -0
  202. package/dist/player-messages.d.ts +0 -38
  203. package/dist/player-messages.d.ts.map +1 -1
  204. package/dist/player-types.d.ts +12 -2
  205. package/dist/player-types.d.ts.map +1 -1
  206. package/dist/reorder/a11y.d.ts +7 -0
  207. package/dist/reorder/a11y.d.ts.map +1 -0
  208. package/dist/reorder/a11y.js +34 -0
  209. package/dist/reorder/a11y.js.map +1 -0
  210. package/dist/reorder/graphic-order-interaction.d.ts +4 -0
  211. package/dist/reorder/graphic-order-interaction.d.ts.map +1 -0
  212. package/dist/reorder/graphic-order-interaction.js +205 -0
  213. package/dist/reorder/graphic-order-interaction.js.map +1 -0
  214. package/dist/reorder/list-controls.d.ts +22 -0
  215. package/dist/reorder/list-controls.d.ts.map +1 -0
  216. package/dist/reorder/list-controls.js +75 -0
  217. package/dist/reorder/list-controls.js.map +1 -0
  218. package/dist/reorder/order-interaction.d.ts +4 -0
  219. package/dist/reorder/order-interaction.d.ts.map +1 -0
  220. package/dist/reorder/order-interaction.js +54 -0
  221. package/dist/reorder/order-interaction.js.map +1 -0
  222. package/dist/styles/base-styles.d.ts +2 -0
  223. package/dist/styles/base-styles.d.ts.map +1 -0
  224. package/dist/styles/base-styles.js +133 -0
  225. package/dist/styles/base-styles.js.map +1 -0
  226. package/dist/styles/choice-hottext-styles.d.ts +2 -0
  227. package/dist/styles/choice-hottext-styles.d.ts.map +1 -0
  228. package/dist/styles/choice-hottext-styles.js +76 -0
  229. package/dist/styles/choice-hottext-styles.js.map +1 -0
  230. package/dist/styles/control-styles.d.ts +2 -0
  231. package/dist/styles/control-styles.d.ts.map +1 -0
  232. package/dist/styles/control-styles.js +114 -0
  233. package/dist/styles/control-styles.js.map +1 -0
  234. package/dist/styles/drawing-styles.d.ts +2 -0
  235. package/dist/styles/drawing-styles.d.ts.map +1 -0
  236. package/dist/styles/drawing-styles.js +30 -0
  237. package/dist/styles/drawing-styles.js.map +1 -0
  238. package/dist/styles/gap-match-styles.d.ts +2 -0
  239. package/dist/styles/gap-match-styles.d.ts.map +1 -0
  240. package/dist/styles/gap-match-styles.js +33 -0
  241. package/dist/styles/gap-match-styles.js.map +1 -0
  242. package/dist/styles/graphic-styles.d.ts +2 -0
  243. package/dist/styles/graphic-styles.d.ts.map +1 -0
  244. package/dist/styles/graphic-styles.js +289 -0
  245. package/dist/styles/graphic-styles.js.map +1 -0
  246. package/dist/styles/match-pair-styles.d.ts +2 -0
  247. package/dist/styles/match-pair-styles.d.ts.map +1 -0
  248. package/dist/styles/match-pair-styles.js +62 -0
  249. package/dist/styles/match-pair-styles.js.map +1 -0
  250. package/dist/styles/text-slider-styles.d.ts +2 -0
  251. package/dist/styles/text-slider-styles.d.ts.map +1 -0
  252. package/dist/styles/text-slider-styles.js +35 -0
  253. package/dist/styles/text-slider-styles.js.map +1 -0
  254. package/package.json +8 -8
  255. package/src/controls/remove-button.ts +8 -5
  256. package/src/index.ts +61 -5
  257. package/src/interactions/choice-interaction.ts +6 -2
  258. package/src/interactions/drawing-interaction.ts +14 -9
  259. package/src/interactions/end-attempt-interaction.ts +3 -3
  260. package/src/interactions/gap-match-interaction.ts +32 -13
  261. package/src/interactions/graphic-associate-interaction.ts +15 -10
  262. package/src/interactions/hotspot-interaction.ts +10 -6
  263. package/src/interactions/inline-choice-interaction.ts +4 -4
  264. package/src/interactions/interaction-registry.ts +12 -12
  265. package/src/interactions/match-interaction.ts +9 -6
  266. package/src/interactions/pair-interaction.ts +22 -14
  267. package/src/interactions/position-object-interaction.ts +22 -13
  268. package/src/interactions/select-point-interaction.ts +25 -13
  269. package/src/interactions/shared.ts +21 -4
  270. package/src/interactions/text-interaction.ts +14 -4
  271. package/src/interactions/upload-interaction.ts +6 -3
  272. package/src/player/interaction-render.ts +4 -4
  273. package/src/player-adapter.ts +253 -0
  274. package/src/player-dev.ts +14 -0
  275. package/src/player-element.ts +78 -8
  276. package/src/player-locale.ts +28 -199
  277. package/src/player-message-catalog-default.ts +119 -0
  278. package/src/player-message-catalog-validate.ts +425 -0
  279. package/src/player-message-catalog.ts +72 -0
  280. package/src/player-message-keys.ts +12 -0
  281. package/src/player-message-manifest.ts +103 -0
  282. package/src/player-message-overrides.ts +38 -0
  283. package/src/player-message-resolver.ts +205 -0
  284. package/src/player-messages.ts +0 -30
  285. package/src/player-types.ts +15 -4
  286. package/src/reorder/a11y.ts +22 -7
  287. package/src/reorder/graphic-order-interaction.ts +23 -16
  288. package/src/reorder/list-controls.ts +8 -6
  289. package/src/reorder/order-interaction.ts +7 -5
  290. package/src/styles/base-styles.ts +20 -5
  291. package/src/styles/graphic-styles.ts +0 -6
@@ -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,62 @@
1
+ import type { QtiAttemptStateV1, QtiCatalogSupportResolution, QtiCatalogSupportResolutionOptions, QtiScoreResult, QtiTextToSpeechTraversal } from "@longsightgroup/qti3-core";
2
+ import type { PlayerMessageCatalog } from "./player-message-catalog.js";
3
+ import type { QtiAssessmentItemPlayer } from "./player-element.js";
4
+ import type { QtiPlayerMessageOverrides } from "./player-message-resolver.js";
5
+ import type { QtiAssessmentItemPlayerEventDetailMap, QtiAssessmentItemPlayerEventName, QtiPlayerFetchXml, QtiPlayerLoadOptions, QtiPlayerResolveAsset, QtiScoreAttemptOptions } from "./player-types.js";
6
+ export type QtiAssessmentItemPlayerAdapterEventPropName = "onReady" | "onResponseChange" | "onStateChange" | "onScore" | "onValidation" | "onSuspend" | "onEndAttempt" | "onPortableCustomMount" | "onDiagnostics" | "onReset" | "onRestore";
7
+ export type QtiAssessmentItemPlayerAdapterPropName = "xml" | "loadOptions" | "languageOfInterface" | "messageCatalog" | "messages" | "onLoadError" | QtiAssessmentItemPlayerAdapterEventPropName;
8
+ export type QtiAssessmentItemPlayerAdapterEventCallback<T extends QtiAssessmentItemPlayerEventName> = (detail: QtiAssessmentItemPlayerEventDetailMap[T]) => void;
9
+ export type QtiAssessmentItemPlayerAdapterEventHandlerProps = {
10
+ [K in (typeof qtiAssessmentItemPlayerAdapterEventEntries)[number] as K[1]]?: QtiAssessmentItemPlayerAdapterEventCallback<K[0]>;
11
+ };
12
+ export interface QtiAssessmentItemPlayerAdapterProps extends QtiAssessmentItemPlayerAdapterEventHandlerProps {
13
+ /** Already-prepared candidate-safe XML for delivery, or authoring/preview XML in preview tools. */
14
+ xml?: string | undefined;
15
+ loadOptions?: QtiPlayerLoadOptions | undefined;
16
+ languageOfInterface?: string | undefined;
17
+ messageCatalog?: PlayerMessageCatalog | undefined;
18
+ messages?: QtiPlayerMessageOverrides | undefined;
19
+ onLoadError?: ((error: Error) => void) | undefined;
20
+ }
21
+ export interface QtiAssessmentItemPlayerHandle {
22
+ readonly element: QtiAssessmentItemPlayer;
23
+ loadXml(xml: string, options?: QtiPlayerLoadOptions): Promise<void>;
24
+ loadUrl(url: string, options?: QtiPlayerLoadOptions): Promise<void>;
25
+ scoreAttempt(options?: QtiScoreAttemptOptions): QtiScoreResult | undefined;
26
+ restore(state: QtiAttemptStateV1): void;
27
+ suspend(): void;
28
+ endAttempt(options?: QtiScoreAttemptOptions): void;
29
+ reset(): void;
30
+ clearItem(): void;
31
+ serialize(): QtiAttemptStateV1 | undefined;
32
+ getTextToSpeechTraversal(): QtiTextToSpeechTraversal | undefined;
33
+ getCatalogSupportResolution(options?: QtiCatalogSupportResolutionOptions): QtiCatalogSupportResolution | undefined;
34
+ }
35
+ export declare const qtiAssessmentItemPlayerAdapterEventEntries: readonly [readonly ["qti-ready", "onReady"], readonly ["qti-responsechange", "onResponseChange"], readonly ["qti-statechange", "onStateChange"], readonly ["qti-score", "onScore"], readonly ["qti-validation", "onValidation"], readonly ["qti-suspend", "onSuspend"], readonly ["qti-endattempt", "onEndAttempt"], readonly ["qti-portable-custom-mount", "onPortableCustomMount"], readonly ["qti-diagnostics", "onDiagnostics"], readonly ["qti-reset", "onReset"], readonly ["qti-restore", "onRestore"]];
36
+ export declare const qtiAssessmentItemPlayerAdapterPropNames: readonly ["xml", "loadOptions", "languageOfInterface", "messageCatalog", "messages", "onLoadError", ...("onReady" | "onResponseChange" | "onStateChange" | "onScore" | "onValidation" | "onSuspend" | "onEndAttempt" | "onPortableCustomMount" | "onDiagnostics" | "onReset" | "onRestore")[]];
37
+ export declare function isQtiAssessmentItemPlayerAdapterPropName(name: string): boolean;
38
+ export type QtiAssessmentItemPlayerLoadDependencies = readonly [
39
+ string | undefined,
40
+ QtiPlayerLoadOptions["status"] | undefined,
41
+ boolean | undefined,
42
+ boolean | undefined,
43
+ QtiPlayerFetchXml | undefined,
44
+ QtiPlayerResolveAsset | undefined
45
+ ];
46
+ export declare function qtiAssessmentItemPlayerLoadStateKey(state: QtiAttemptStateV1 | undefined): string | undefined;
47
+ export declare function qtiAssessmentItemPlayerLoadDependencies(loadOptions: QtiPlayerLoadOptions | undefined): QtiAssessmentItemPlayerLoadDependencies;
48
+ export declare function bindQtiAssessmentItemPlayerAdapterEvents(element: QtiAssessmentItemPlayer, getProps: () => QtiAssessmentItemPlayerAdapterProps): () => void;
49
+ export declare function syncQtiAssessmentItemPlayerAdapterChrome(element: QtiAssessmentItemPlayer, props: Pick<QtiAssessmentItemPlayerAdapterProps, "languageOfInterface" | "messageCatalog" | "messages">): void;
50
+ /** @deprecated Use {@link syncQtiAssessmentItemPlayerAdapterChrome}. */
51
+ export declare const syncQtiAssessmentItemPlayerAdapterMessages: typeof syncQtiAssessmentItemPlayerAdapterChrome;
52
+ export interface QtiAssessmentItemPlayerAdapterLoadSyncInput {
53
+ xml?: string | undefined;
54
+ loadOptions?: QtiPlayerLoadOptions | undefined;
55
+ onLoadError?: ((error: Error) => void) | undefined;
56
+ }
57
+ export declare function createQtiAssessmentItemPlayerAdapterLoadSync(): {
58
+ run(element: QtiAssessmentItemPlayer, input: QtiAssessmentItemPlayerAdapterLoadSyncInput): () => void;
59
+ };
60
+ export declare function createQtiAssessmentItemPlayerHandle(getElement: () => QtiAssessmentItemPlayer | null): QtiAssessmentItemPlayerHandle;
61
+ export declare function normalizeQtiAssessmentItemPlayerLoadError(error: unknown): Error;
62
+ //# sourceMappingURL=player-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"player-adapter.d.ts","sourceRoot":"","sources":["../src/player-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,119 @@
1
+ export const qtiAssessmentItemPlayerAdapterEventEntries = [
2
+ ["qti-ready", "onReady"],
3
+ ["qti-responsechange", "onResponseChange"],
4
+ ["qti-statechange", "onStateChange"],
5
+ ["qti-score", "onScore"],
6
+ ["qti-validation", "onValidation"],
7
+ ["qti-suspend", "onSuspend"],
8
+ ["qti-endattempt", "onEndAttempt"],
9
+ ["qti-portable-custom-mount", "onPortableCustomMount"],
10
+ ["qti-diagnostics", "onDiagnostics"],
11
+ ["qti-reset", "onReset"],
12
+ ["qti-restore", "onRestore"],
13
+ ];
14
+ export const qtiAssessmentItemPlayerAdapterPropNames = [
15
+ "xml",
16
+ "loadOptions",
17
+ "languageOfInterface",
18
+ "messageCatalog",
19
+ "messages",
20
+ "onLoadError",
21
+ ...qtiAssessmentItemPlayerAdapterEventEntries.map((entry) => entry[1]),
22
+ ];
23
+ const qtiAssessmentItemPlayerAdapterPropNameSet = new Set(qtiAssessmentItemPlayerAdapterPropNames);
24
+ export function isQtiAssessmentItemPlayerAdapterPropName(name) {
25
+ return qtiAssessmentItemPlayerAdapterPropNameSet.has(name);
26
+ }
27
+ export function qtiAssessmentItemPlayerLoadStateKey(state) {
28
+ if (!state)
29
+ return undefined;
30
+ // JSON key order follows insertion order; in-place mutation without reload is not detected.
31
+ return JSON.stringify(state);
32
+ }
33
+ export function qtiAssessmentItemPlayerLoadDependencies(loadOptions) {
34
+ return [
35
+ qtiAssessmentItemPlayerLoadStateKey(loadOptions?.state),
36
+ loadOptions?.status,
37
+ loadOptions?.sessionControl?.validateResponses,
38
+ loadOptions?.sessionControl?.showFeedback,
39
+ loadOptions?.fetchXml,
40
+ loadOptions?.resolveAsset,
41
+ ];
42
+ }
43
+ export function bindQtiAssessmentItemPlayerAdapterEvents(element, getProps) {
44
+ const removers = qtiAssessmentItemPlayerAdapterEventEntries.map(([eventName, propName]) => {
45
+ const listener = (event) => {
46
+ const callback = getProps()[propName];
47
+ callback?.(event.detail);
48
+ };
49
+ element.addEventListener(eventName, listener);
50
+ return () => element.removeEventListener(eventName, listener);
51
+ });
52
+ return () => {
53
+ for (const remove of removers)
54
+ remove();
55
+ };
56
+ }
57
+ export function syncQtiAssessmentItemPlayerAdapterChrome(element, props) {
58
+ element.languageOfInterface = props.languageOfInterface;
59
+ element.messageCatalog = props.messageCatalog;
60
+ element.messages = props.messages;
61
+ }
62
+ /** @deprecated Use {@link syncQtiAssessmentItemPlayerAdapterChrome}. */
63
+ export const syncQtiAssessmentItemPlayerAdapterMessages = syncQtiAssessmentItemPlayerAdapterChrome;
64
+ export function createQtiAssessmentItemPlayerAdapterLoadSync() {
65
+ let loadSequence = 0;
66
+ return {
67
+ run(element, input) {
68
+ if (input.xml === undefined) {
69
+ loadSequence += 1;
70
+ element.clearItem();
71
+ return () => { };
72
+ }
73
+ let active = true;
74
+ const sequence = (loadSequence += 1);
75
+ void element
76
+ .loadXml(input.xml, input.loadOptions)
77
+ .then(() => {
78
+ if (!active || sequence !== loadSequence)
79
+ return;
80
+ })
81
+ .catch((error) => {
82
+ if (!active || sequence !== loadSequence)
83
+ return;
84
+ input.onLoadError?.(normalizeQtiAssessmentItemPlayerLoadError(error));
85
+ });
86
+ return () => {
87
+ active = false;
88
+ };
89
+ },
90
+ };
91
+ }
92
+ export function createQtiAssessmentItemPlayerHandle(getElement) {
93
+ return {
94
+ get element() {
95
+ return requiredElement(getElement);
96
+ },
97
+ loadXml: (xml, options) => requiredElement(getElement).loadXml(xml, options),
98
+ loadUrl: (url, options) => requiredElement(getElement).loadUrl(url, options),
99
+ scoreAttempt: (options) => requiredElement(getElement).scoreAttempt(options),
100
+ restore: (state) => requiredElement(getElement).restore(state),
101
+ suspend: () => requiredElement(getElement).suspend(),
102
+ endAttempt: (options) => requiredElement(getElement).endAttempt(options),
103
+ reset: () => requiredElement(getElement).reset(),
104
+ clearItem: () => requiredElement(getElement).clearItem(),
105
+ serialize: () => requiredElement(getElement).serialize(),
106
+ getTextToSpeechTraversal: () => requiredElement(getElement).getTextToSpeechTraversal(),
107
+ getCatalogSupportResolution: (options) => requiredElement(getElement).getCatalogSupportResolution(options),
108
+ };
109
+ }
110
+ export function normalizeQtiAssessmentItemPlayerLoadError(error) {
111
+ return error instanceof Error ? error : new Error(String(error));
112
+ }
113
+ function requiredElement(getElement) {
114
+ const element = getElement();
115
+ if (!element)
116
+ throw new Error("QTI assessment item player element is not mounted.");
117
+ return element;
118
+ }
119
+ //# sourceMappingURL=player-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"player-adapter.js","sourceRoot":"","sources":["../src/player-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ /** True when dev warnings are enabled (non-production Node, or browser without NODE_ENV). */
2
+ export declare function playerDevWarningsEnabled(): boolean;
3
+ export declare function warnPlayerMessageOnce(code: string, message: string): void;
4
+ //# sourceMappingURL=player-dev.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"player-dev.d.ts","sourceRoot":"","sources":["../src/player-dev.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAC7F,wBAAgB,wBAAwB,IAAI,OAAO,CAIlD;AAID,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAIzE"}
@@ -0,0 +1,14 @@
1
+ /** True when dev warnings are enabled (non-production Node, or browser without NODE_ENV). */
2
+ export function playerDevWarningsEnabled() {
3
+ const nodeEnv = globalThis.process?.env
4
+ ?.NODE_ENV;
5
+ return nodeEnv !== "production";
6
+ }
7
+ const warnedKeys = new Set();
8
+ export function warnPlayerMessageOnce(code, message) {
9
+ if (!playerDevWarningsEnabled() || warnedKeys.has(code))
10
+ return;
11
+ warnedKeys.add(code);
12
+ console.warn(`[qti3-player] ${message}`);
13
+ }
14
+ //# sourceMappingURL=player-dev.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"player-dev.js","sourceRoot":"","sources":["../src/player-dev.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAC7F,MAAM,UAAU,wBAAwB;IACtC,MAAM,OAAO,GAAI,UAA4D,CAAC,OAAO,EAAE,GAAG;QACxF,EAAE,QAAQ,CAAC;IACb,OAAO,OAAO,KAAK,YAAY,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;AAErC,MAAM,UAAU,qBAAqB,CAAC,IAAY,EAAE,OAAe;IACjE,IAAI,CAAC,wBAAwB,EAAE,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO;IAChE,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACrB,OAAO,CAAC,IAAI,CAAC,iBAAiB,OAAO,EAAE,CAAC,CAAC;AAC3C,CAAC"}
@@ -1,5 +1,7 @@
1
1
  import { type QtiAttemptStateV1, type QtiScoreResult, type QtiCatalogSupportResolution, type QtiCatalogSupportResolutionOptions, type QtiTextToSpeechTraversal } from "@longsightgroup/qti3-core";
2
- import type { QtiPlayerLoadOptions, QtiPlayerMessageOverrides, QtiScoreAttemptOptions } from "./player-types.js";
2
+ import type { PlayerMessageCatalog } from "./player-message-catalog.js";
3
+ import type { QtiPlayerMessageOverrides } from "./player-message-resolver.js";
4
+ import type { QtiPlayerLoadOptions, QtiScoreAttemptOptions } from "./player-types.js";
3
5
  declare const HTMLElementBase: typeof HTMLElement;
4
6
  export declare class QtiAssessmentItemPlayer extends HTMLElementBase {
5
7
  static get observedAttributes(): string[];
@@ -9,17 +11,28 @@ export declare class QtiAssessmentItemPlayer extends HTMLElementBase {
9
11
  private validationMessages;
10
12
  private authoringDiagnostics;
11
13
  private languageOfInterfaceOverride;
14
+ private messageCatalogOverride;
12
15
  private messageOverrides;
16
+ private resolvedMessagesCache;
13
17
  private sessionControl;
18
+ private loadGeneration;
14
19
  get languageOfInterface(): string;
15
20
  set languageOfInterface(value: string | undefined);
16
21
  get locale(): string;
17
22
  set locale(value: string | undefined);
18
23
  get messages(): QtiPlayerMessageOverrides;
19
24
  set messages(value: QtiPlayerMessageOverrides | undefined);
25
+ get messageCatalog(): PlayerMessageCatalog | undefined;
26
+ set messageCatalog(value: PlayerMessageCatalog | undefined);
20
27
  attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void;
28
+ private invalidatePlayerMessages;
29
+ /** Clears the loaded item. Does not emit player events; declarative hosts control this via `xml`. */
30
+ clearItem(): void;
21
31
  loadXml(xml: string, options?: QtiPlayerLoadOptions): Promise<void>;
22
32
  loadUrl(url: string, options?: QtiPlayerLoadOptions): Promise<void>;
33
+ private beginLoad;
34
+ private isCurrentLoad;
35
+ private applyLoadedXml;
23
36
  scoreAttempt(options?: QtiScoreAttemptOptions): QtiScoreResult | undefined;
24
37
  reset(): void;
25
38
  restore(state: QtiAttemptStateV1): void;
@@ -1 +1 @@
1
- {"version":3,"file":"player-element.d.ts","sourceRoot":"","sources":["../src/player-element.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,iBAAiB,EAMtB,KAAK,cAAc,EACnB,KAAK,2BAA2B,EAChC,KAAK,kCAAkC,EACvC,KAAK,wBAAwB,EAE9B,MAAM,2BAA2B,CAAC;AA6BnC,OAAO,KAAK,EAGV,oBAAoB,EACpB,yBAAyB,EAGzB,sBAAsB,EACvB,MAAM,mBAAmB,CAAC;AAQ3B,QAAA,MAAM,eAAe,EAAE,OAAO,WAOO,CAAC;AAEtC,qBAAa,uBAAwB,SAAQ,eAAe;IAC1D,MAAM,KAAK,kBAAkB,IAAI,MAAM,EAAE,CAExC;IAED,OAAO,CAAC,aAAa,CAAC,CAAc;IACpC,OAAO,CAAC,OAAO,CAAC,CAAiB;IACjC,OAAO,CAAC,YAAY,CAAoC;IACxD,OAAO,CAAC,kBAAkB,CAAuB;IACjD,OAAO,CAAC,oBAAoB,CAAuB;IACnD,OAAO,CAAC,2BAA2B,CAAqB;IACxD,OAAO,CAAC,gBAAgB,CAAiC;IACzD,OAAO,CAAC,cAAc,CAGpB;IAEF,IAAI,mBAAmB,IAAI,MAAM,CAOhC;IAED,IAAI,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAGhD;IAED,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,IAAI,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAEnC;IAED,IAAI,QAAQ,IAAI,yBAAyB,CAExC;IAED,IAAI,QAAQ,CAAC,KAAK,EAAE,yBAAyB,GAAG,SAAS,EAGxD;IAED,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAOxF,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC;IAuCvE,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC;IAK7E,YAAY,CAAC,OAAO,GAAE,sBAA2B,GAAG,cAAc,GAAG,SAAS;IA8B9E,KAAK,IAAI,IAAI;IAUb,OAAO,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI;IAqBvC,OAAO,IAAI,IAAI;IASf,UAAU,CAAC,OAAO,GAAE,sBAA2B,GAAG,IAAI;IAgBtD,SAAS,IAAI,iBAAiB,GAAG,SAAS;IAU1C,wBAAwB,IAAI,wBAAwB,GAAG,SAAS;IAKhE,2BAA2B,CACzB,OAAO,GAAE,kCAAuC,GAC/C,2BAA2B,GAAG,SAAS;IAK1C,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,mBAAmB;IAO3B,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,gBAAgB;IAOxB,OAAO,CAAC,MAAM;IAcd,OAAO,CAAC,iBAAiB;IAczB,OAAO,CAAC,kBAAkB;IAW1B,OAAO,CAAC,cAAc;IAmCtB,OAAO,CAAC,4BAA4B;IAuBpC,OAAO,CAAC,sBAAsB;IAQ9B,OAAO,CAAC,yBAAyB;IAQjC,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,oBAAoB;IAI5B,OAAO,CAAC,uBAAuB;IAI/B,OAAO,CAAC,yBAAyB;IAiBjC,OAAO,CAAC,kBAAkB;IAM1B,OAAO,CAAC,iBAAiB;IAMzB,OAAO,CAAC,yBAAyB;IAIjC,OAAO,CAAC,wBAAwB;IAIhC,OAAO,CAAC,sBAAsB;IAQ9B,OAAO,CAAC,cAAc;CASvB;AAED,wBAAgB,6BAA6B,IAAI,IAAI,CAIpD;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,4BAA4B,EAAE,uBAAuB,CAAC;KACvD;CACF"}
1
+ {"version":3,"file":"player-element.d.ts","sourceRoot":"","sources":["../src/player-element.ts"],"names":[],"mappings":"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"}