@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,138 @@
1
+ import { renderGraphicOrderResponse } from "../reorder/graphic-order-interaction.js";
2
+ import { renderOrderedResponse } from "../reorder/order-interaction.js";
3
+ import { renderChoice } from "./choice-interaction.js";
4
+ import { renderDrawingResponse } from "./drawing-interaction.js";
5
+ import { renderEndAttemptResponse } from "./end-attempt-interaction.js";
6
+ import { renderGapMatchResponse } from "./gap-match-interaction.js";
7
+ import { renderGraphicAssociateResponse } from "./graphic-associate-interaction.js";
8
+ import { renderHotspotResponse } from "./hotspot-interaction.js";
9
+ import { renderHottextResponse } from "./hottext-interaction.js";
10
+ import { renderSelect } from "./inline-choice-interaction.js";
11
+ import { renderMatchResponse } from "./match-interaction.js";
12
+ import { renderObjectAsset } from "./object-asset.js";
13
+ import { renderPairResponse } from "./pair-interaction.js";
14
+ import { renderPositionObjectResponse } from "./position-object-interaction.js";
15
+ import { usesChoiceSet, usesOrderedResponse, usesPairResponse } from "./routing.js";
16
+ import { renderSelectPointResponse } from "./select-point-interaction.js";
17
+ import { renderSliderResponse, renderTextResponse } from "./text-interaction.js";
18
+ import { renderUnsupportedInteraction } from "./unsupported-interaction.js";
19
+ import { renderUploadResponse } from "./upload-interaction.js";
20
+ export const interactionRegistry = [
21
+ {
22
+ id: "graphicOrder",
23
+ matches: (interaction) => interaction.type === "graphicOrder",
24
+ render: ({ interaction, update, currentValue, messages }) => renderGraphicOrderResponse(interaction, update, currentValue, messages),
25
+ },
26
+ {
27
+ id: "ordered",
28
+ matches: usesOrderedResponse,
29
+ render: ({ interaction, update, currentValue, messages }) => renderOrderedResponse(interaction, update, currentValue, messages),
30
+ },
31
+ {
32
+ id: "gapMatch",
33
+ matches: (interaction) => interaction.type === "gapMatch" || interaction.type === "graphicGapMatch",
34
+ render: ({ interaction, update, currentValue, messages }) => renderGapMatchResponse(interaction, update, currentValue, messages),
35
+ },
36
+ {
37
+ id: "graphicAssociate",
38
+ matches: (interaction) => interaction.type === "graphicAssociate",
39
+ render: ({ interaction, update, currentValue, messages }) => renderGraphicAssociateResponse(interaction, update, currentValue, messages),
40
+ },
41
+ {
42
+ id: "match",
43
+ matches: (interaction) => interaction.type === "match",
44
+ render: ({ interaction, update, currentValue, messages }) => renderMatchResponse(interaction, update, currentValue, messages),
45
+ },
46
+ {
47
+ id: "pair",
48
+ matches: usesPairResponse,
49
+ render: ({ interaction, update, currentValue, messages }) => renderPairResponse(interaction, update, currentValue, messages),
50
+ },
51
+ {
52
+ id: "hotspot",
53
+ matches: (interaction) => interaction.type === "hotspot" && Boolean(interaction.object),
54
+ render: ({ interaction, update, currentValue, messages }) => renderHotspotResponse(interaction, update, currentValue, messages),
55
+ },
56
+ {
57
+ id: "hottext",
58
+ matches: (interaction) => interaction.type === "hottext",
59
+ render: ({ interaction, update, currentValue }) => renderHottextResponse(interaction, update, currentValue),
60
+ },
61
+ {
62
+ id: "choice",
63
+ matches: usesChoiceSet,
64
+ render: ({ interaction, update, currentValue, messages }) => renderChoice(interaction, update, currentValue, messages),
65
+ },
66
+ {
67
+ id: "inlineChoice",
68
+ matches: (interaction) => interaction.type === "inlineChoice",
69
+ render: ({ interaction, update, currentValue, messages }) => renderSelect(interaction, update, currentValue, messages),
70
+ },
71
+ {
72
+ id: "extendedText",
73
+ matches: (interaction) => interaction.type === "extendedText",
74
+ render: ({ interaction, update, currentValue, messages }) => renderTextResponse(interaction, update, "extended", currentValue, messages),
75
+ },
76
+ {
77
+ id: "selectPoint",
78
+ matches: (interaction) => interaction.type === "selectPoint",
79
+ render: ({ interaction, update, currentValue, messages }) => renderSelectPointResponse(interaction, update, currentValue, messages),
80
+ },
81
+ {
82
+ id: "positionObject",
83
+ matches: (interaction) => interaction.type === "positionObject",
84
+ render: ({ interaction, update, currentValue, messages }) => renderPositionObjectResponse(interaction, update, currentValue, messages),
85
+ },
86
+ {
87
+ id: "drawing",
88
+ matches: (interaction) => interaction.type === "drawing",
89
+ render: ({ interaction, update, currentValue, messages }) => renderDrawingResponse(interaction, update, currentValue, messages),
90
+ },
91
+ {
92
+ id: "portableCustom",
93
+ matches: (interaction) => interaction.type === "portableCustom",
94
+ render: ({ interaction, update, currentValue, renderPortableCustom }) => renderPortableCustom(interaction, update, currentValue),
95
+ },
96
+ {
97
+ id: "textEntry",
98
+ matches: (interaction) => interaction.type === "textEntry",
99
+ render: ({ interaction, update, currentValue, messages }) => renderTextResponse(interaction, update, "entry", currentValue, messages),
100
+ },
101
+ {
102
+ id: "slider",
103
+ matches: (interaction) => interaction.type === "slider",
104
+ render: ({ interaction, update, currentValue, messages }) => renderSliderResponse(interaction, update, currentValue, messages),
105
+ },
106
+ {
107
+ id: "upload",
108
+ matches: (interaction) => interaction.type === "upload",
109
+ render: ({ interaction, update, messages }) => renderUploadResponse(interaction, update, messages),
110
+ },
111
+ {
112
+ id: "endAttempt",
113
+ matches: (interaction) => interaction.type === "endAttempt",
114
+ render: ({ interaction, update, endAttempt, messages }) => renderEndAttemptResponse(interaction, update, endAttempt, messages),
115
+ },
116
+ {
117
+ id: "media",
118
+ matches: (interaction) => interaction.type === "media",
119
+ render: ({ interaction, update, currentValue, isCompleted }) => renderObjectAsset(interaction, {
120
+ currentValue,
121
+ update,
122
+ isCompleted,
123
+ }),
124
+ },
125
+ ];
126
+ export function matchInteractionRegistryEntry(interaction) {
127
+ return interactionRegistry.find((entry) => entry.matches(interaction));
128
+ }
129
+ export function isInteractionSupported(interaction) {
130
+ return matchInteractionRegistryEntry(interaction) !== undefined;
131
+ }
132
+ export function renderInteractionResponse(context) {
133
+ const entry = matchInteractionRegistryEntry(context.interaction);
134
+ if (entry)
135
+ return entry.render(context);
136
+ return renderUnsupportedInteraction(context.interaction);
137
+ }
138
+ //# sourceMappingURL=interaction-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interaction-registry.js","sourceRoot":"","sources":["../../src/interactions/interaction-registry.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,0BAA0B,EAAE,MAAM,yCAAyC,CAAC;AACrF,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,8BAA8B,EAAE,MAAM,oCAAoC,CAAC;AACpF,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,4BAA4B,EAAE,MAAM,kCAAkC,CAAC;AAChF,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACpF,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AACjF,OAAO,EAAE,4BAA4B,EAAE,MAAM,8BAA8B,CAAC;AAC5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AA8C/D,MAAM,CAAC,MAAM,mBAAmB,GAA+B;IAC7D;QACE,EAAE,EAAE,cAAc;QAClB,OAAO,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,KAAK,cAAc;QAC7D,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,EAAE,EAAE,CAC1D,0BAA0B,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,CAAC;KAC1E;IACD;QACE,EAAE,EAAE,SAAS;QACb,OAAO,EAAE,mBAAmB;QAC5B,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,EAAE,EAAE,CAC1D,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,CAAC;KACrE;IACD;QACE,EAAE,EAAE,UAAU;QACd,OAAO,EAAE,CAAC,WAAW,EAAE,EAAE,CACvB,WAAW,CAAC,IAAI,KAAK,UAAU,IAAI,WAAW,CAAC,IAAI,KAAK,iBAAiB;QAC3E,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,EAAE,EAAE,CAC1D,sBAAsB,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,CAAC;KACtE;IACD;QACE,EAAE,EAAE,kBAAkB;QACtB,OAAO,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,KAAK,kBAAkB;QACjE,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,EAAE,EAAE,CAC1D,8BAA8B,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,CAAC;KAC9E;IACD;QACE,EAAE,EAAE,OAAO;QACX,OAAO,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,KAAK,OAAO;QACtD,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,EAAE,EAAE,CAC1D,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,CAAC;KACnE;IACD;QACE,EAAE,EAAE,MAAM;QACV,OAAO,EAAE,gBAAgB;QACzB,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,EAAE,EAAE,CAC1D,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,CAAC;KAClE;IACD;QACE,EAAE,EAAE,SAAS;QACb,OAAO,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC;QACvF,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,EAAE,EAAE,CAC1D,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,CAAC;KACrE;IACD;QACE,EAAE,EAAE,SAAS;QACb,OAAO,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,KAAK,SAAS;QACxD,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,EAAE,EAAE,CAChD,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,CAAC;KAC3D;IACD;QACE,EAAE,EAAE,QAAQ;QACZ,OAAO,EAAE,aAAa;QACtB,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,EAAE,EAAE,CAC1D,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,CAAC;KAC5D;IACD;QACE,EAAE,EAAE,cAAc;QAClB,OAAO,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,KAAK,cAAc;QAC7D,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,EAAE,EAAE,CAC1D,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,CAAC;KAC5D;IACD;QACE,EAAE,EAAE,cAAc;QAClB,OAAO,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,KAAK,cAAc;QAC7D,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,EAAE,EAAE,CAC1D,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,CAAC;KAC9E;IACD;QACE,EAAE,EAAE,aAAa;QACjB,OAAO,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,KAAK,aAAa;QAC5D,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,EAAE,EAAE,CAC1D,yBAAyB,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,CAAC;KACzE;IACD;QACE,EAAE,EAAE,gBAAgB;QACpB,OAAO,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,KAAK,gBAAgB;QAC/D,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,EAAE,EAAE,CAC1D,4BAA4B,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,CAAC;KAC5E;IACD;QACE,EAAE,EAAE,SAAS;QACb,OAAO,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,KAAK,SAAS;QACxD,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,EAAE,EAAE,CAC1D,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,CAAC;KACrE;IACD;QACE,EAAE,EAAE,gBAAgB;QACpB,OAAO,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,KAAK,gBAAgB;QAC/D,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,oBAAoB,EAAE,EAAE,EAAE,CACtE,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,CAAC;KAC1D;IACD;QACE,EAAE,EAAE,WAAW;QACf,OAAO,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,KAAK,WAAW;QAC1D,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,EAAE,EAAE,CAC1D,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,CAAC;KAC3E;IACD;QACE,EAAE,EAAE,QAAQ;QACZ,OAAO,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,KAAK,QAAQ;QACvD,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,EAAE,EAAE,CAC1D,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,CAAC;KACpE;IACD;QACE,EAAE,EAAE,QAAQ;QACZ,OAAO,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,KAAK,QAAQ;QACvD,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,CAC5C,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC;KACtD;IACD;QACE,EAAE,EAAE,YAAY;QAChB,OAAO,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,KAAK,YAAY;QAC3D,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,EAAE,CACxD,wBAAwB,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC;KACtE;IACD;QACE,EAAE,EAAE,OAAO;QACX,OAAO,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,KAAK,OAAO;QACtD,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,EAAE,EAAE,CAC7D,iBAAiB,CAAC,WAAW,EAAE;YAC7B,YAAY;YACZ,MAAM;YACN,WAAW;SACZ,CAAC;KACL;CACF,CAAC;AAEF,MAAM,UAAU,6BAA6B,CAC3C,WAA2B;IAE3B,OAAO,mBAAmB,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;AACzE,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,WAA2B;IAChE,OAAO,6BAA6B,CAAC,WAAW,CAAC,KAAK,SAAS,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,OAAmC;IAC3E,MAAM,KAAK,GAAG,6BAA6B,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACjE,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACxC,OAAO,4BAA4B,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;AAC3D,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 renderMatchResponse(interaction: QtiInteraction, update: (value: QtiValue) => void, currentValue: QtiValue, messages: PlayerMessageResolver): HTMLElement;
4
+ //# sourceMappingURL=match-interaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"match-interaction.d.ts","sourceRoot":"","sources":["../../src/interactions/match-interaction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAa,cAAc,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAGrF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAI3E,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,cAAc,EAC3B,MAAM,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,EACjC,YAAY,EAAE,QAAQ,EACtB,QAAQ,EAAE,qBAAqB,GAC9B,WAAW,CA6Lb"}
@@ -0,0 +1,188 @@
1
+ import { removeButton } from "../controls/remove-button.js";
2
+ import { missingChoicesMessage, responseGroup, valueToStrings } from "../interaction-support.js";
3
+ import { parseUnlimitedMaximum } from "../response-limits.js";
4
+ import { choiceText, sourceChoices, targetChoices, tokenButton, tokenRegion } from "./shared.js";
5
+ export function renderMatchResponse(interaction, update, currentValue, messages) {
6
+ const group = responseGroup();
7
+ const sources = sourceChoices(interaction);
8
+ const targets = targetChoices(interaction);
9
+ if (sources.length === 0 || targets.length === 0) {
10
+ group.append(missingChoicesMessage(interaction));
11
+ return group;
12
+ }
13
+ const selectedPairs = valueToStrings(currentValue);
14
+ let selectedSource;
15
+ let selectedTarget;
16
+ let draggedSource;
17
+ const selector = document.createElement("div");
18
+ selector.className = "qti3-match-selector";
19
+ const sourceRegion = tokenRegion(messages.message("matchSourcesBank"));
20
+ sourceRegion.classList.add("qti3-match-source-bank");
21
+ const targetRegion = tokenRegion(messages.message("matchTargetsBank"));
22
+ targetRegion.classList.add("qti3-match-target-bank");
23
+ const pairList = document.createElement("ul");
24
+ pairList.className = "qti3-pair-list";
25
+ pairList.setAttribute("aria-label", messages.message("matchSelectedPairsList"));
26
+ const commit = () => {
27
+ if (interaction.responseCardinality === "single")
28
+ update(selectedPairs[0] ?? null);
29
+ else
30
+ update([...selectedPairs]);
31
+ };
32
+ const removePair = (pair) => {
33
+ const index = selectedPairs.indexOf(pair);
34
+ if (index >= 0)
35
+ selectedPairs.splice(index, 1);
36
+ };
37
+ const syncPressed = () => {
38
+ for (const button of sourceRegion.querySelectorAll("button")) {
39
+ const identifier = button.dataset.choiceIdentifier ?? "";
40
+ button.setAttribute("aria-pressed", identifier === selectedSource?.identifier ||
41
+ selectedPairs.some((pair) => pair.startsWith(`${identifier} `))
42
+ ? "true"
43
+ : "false");
44
+ }
45
+ for (const button of targetRegion.querySelectorAll("button")) {
46
+ const identifier = button.dataset.choiceIdentifier ?? "";
47
+ button.setAttribute("aria-pressed", identifier === selectedTarget?.identifier ||
48
+ selectedPairs.some((pair) => pair.endsWith(` ${identifier}`))
49
+ ? "true"
50
+ : "false");
51
+ }
52
+ };
53
+ const renderPairs = () => {
54
+ pairList.replaceChildren(...selectedPairs.map((pair) => {
55
+ const [source, target] = pair.split(" ");
56
+ const label = messages.message("associationPairLabel", {
57
+ source: choiceText(sources, source),
58
+ target: choiceText(targets, target),
59
+ });
60
+ const item = document.createElement("li");
61
+ item.className = "qti3-pair-chip";
62
+ const text = document.createElement("span");
63
+ text.textContent = label;
64
+ const remove = removeButton(label, messages);
65
+ remove.addEventListener("click", () => {
66
+ removePair(pair);
67
+ syncPressed();
68
+ renderPairs();
69
+ commit();
70
+ });
71
+ item.append(text, remove);
72
+ return item;
73
+ }));
74
+ };
75
+ const clearSelection = () => {
76
+ selectedSource = undefined;
77
+ selectedTarget = undefined;
78
+ };
79
+ const removePairsForSource = (source) => {
80
+ for (const existing of selectedPairs.filter((pair) => pair.startsWith(`${source.identifier} `))) {
81
+ removePair(existing);
82
+ }
83
+ };
84
+ const removePairsForTarget = (target) => {
85
+ for (const existing of selectedPairs.filter((pair) => pair.endsWith(` ${target.identifier}`))) {
86
+ removePair(existing);
87
+ }
88
+ };
89
+ const togglePair = (source, target) => {
90
+ const pair = `${source.identifier} ${target.identifier}`;
91
+ if (selectedPairs.includes(pair)) {
92
+ removePair(pair);
93
+ }
94
+ else {
95
+ if (interaction.responseCardinality === "single")
96
+ selectedPairs.splice(0);
97
+ if (parseUnlimitedMaximum(source.attributes["match-max"]) === 1) {
98
+ removePairsForSource(source);
99
+ }
100
+ if (parseUnlimitedMaximum(target.attributes["match-max"]) === 1) {
101
+ removePairsForTarget(target);
102
+ }
103
+ selectedPairs.push(pair);
104
+ }
105
+ clearSelection();
106
+ syncPressed();
107
+ renderPairs();
108
+ commit();
109
+ };
110
+ const addSelectedPair = () => {
111
+ if (!selectedSource || !selectedTarget)
112
+ return;
113
+ togglePair(selectedSource, selectedTarget);
114
+ };
115
+ const addPair = (sourceIdentifier, targetIdentifier) => {
116
+ const source = sources.find((choice) => choice.identifier === sourceIdentifier);
117
+ const target = targets.find((choice) => choice.identifier === targetIdentifier);
118
+ if (!source || !target)
119
+ return;
120
+ togglePair(source, target);
121
+ };
122
+ for (const source of sources) {
123
+ const button = tokenButton(source);
124
+ button.classList.add("qti3-match-source");
125
+ button.draggable = true;
126
+ button.addEventListener("dragstart", (event) => {
127
+ draggedSource = source.identifier;
128
+ event.dataTransfer?.setData("text/plain", source.identifier);
129
+ event.dataTransfer?.setDragImage(button, 8, 8);
130
+ });
131
+ button.addEventListener("dragend", () => {
132
+ draggedSource = undefined;
133
+ syncPressed();
134
+ });
135
+ button.addEventListener("click", () => {
136
+ selectedSource = source;
137
+ syncPressed();
138
+ addSelectedPair();
139
+ });
140
+ button.addEventListener("keydown", (event) => {
141
+ if (event.key !== "Delete" && event.key !== "Backspace")
142
+ return;
143
+ event.preventDefault();
144
+ removePairsForSource(source);
145
+ clearSelection();
146
+ syncPressed();
147
+ renderPairs();
148
+ commit();
149
+ });
150
+ sourceRegion.append(button);
151
+ }
152
+ for (const target of targets) {
153
+ const button = tokenButton(target);
154
+ button.classList.add("qti3-match-target");
155
+ button.addEventListener("dragover", (event) => {
156
+ event.preventDefault();
157
+ button.classList.add("qti3-drop-target");
158
+ });
159
+ button.addEventListener("dragleave", () => button.classList.remove("qti3-drop-target"));
160
+ button.addEventListener("drop", (event) => {
161
+ event.preventDefault();
162
+ button.classList.remove("qti3-drop-target");
163
+ addPair(event.dataTransfer?.getData("text/plain") || draggedSource, target.identifier);
164
+ });
165
+ button.addEventListener("click", () => {
166
+ selectedTarget = target;
167
+ syncPressed();
168
+ addSelectedPair();
169
+ });
170
+ button.addEventListener("keydown", (event) => {
171
+ if (event.key !== "Delete" && event.key !== "Backspace")
172
+ return;
173
+ event.preventDefault();
174
+ removePairsForTarget(target);
175
+ clearSelection();
176
+ syncPressed();
177
+ renderPairs();
178
+ commit();
179
+ });
180
+ targetRegion.append(button);
181
+ }
182
+ selector.append(sourceRegion, targetRegion);
183
+ syncPressed();
184
+ renderPairs();
185
+ group.append(selector, pairList);
186
+ return group;
187
+ }
188
+ //# sourceMappingURL=match-interaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"match-interaction.js","sourceRoot":"","sources":["../../src/interactions/match-interaction.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { QtiInteraction, QtiValue } from "@longsightgroup/qti3-core";
2
+ export interface MediaResponseBinding {
3
+ currentValue?: QtiValue | undefined;
4
+ update?: ((value: QtiValue) => void) | undefined;
5
+ isCompleted?: (() => boolean) | undefined;
6
+ }
7
+ export declare function renderObjectAsset(interaction: QtiInteraction, mediaResponse?: MediaResponseBinding): HTMLElement;
8
+ //# sourceMappingURL=object-asset.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"object-asset.d.ts","sourceRoot":"","sources":["../../src/interactions/object-asset.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAkB,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAU1F,MAAM,WAAW,oBAAoB;IACnC,YAAY,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IACpC,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IACjD,WAAW,CAAC,EAAE,CAAC,MAAM,OAAO,CAAC,GAAG,SAAS,CAAC;CAC3C;AAED,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,cAAc,EAC3B,aAAa,GAAE,oBAAyB,GACvC,WAAW,CA4Cb"}
@@ -0,0 +1,182 @@
1
+ import { objectIsImage } from "../interaction-support.js";
2
+ import { maximumMediaPlays, mediaPlayCount } from "../response-limits.js";
3
+ function parseBooleanAttribute(value) {
4
+ if (value === "true" || value === "1")
5
+ return true;
6
+ if (value === "false" || value === "0")
7
+ return false;
8
+ return undefined;
9
+ }
10
+ export function renderObjectAsset(interaction, mediaResponse = {}) {
11
+ const object = interaction.object;
12
+ const label = interaction.prompt ?? object?.text ?? "Media interaction";
13
+ const mediaType = object ? mediaElementType(object) : undefined;
14
+ if (object && mediaType === "audio") {
15
+ const audio = document.createElement("audio");
16
+ configureMediaElement(audio, interaction, object, label, mediaResponse);
17
+ audio.style.inlineSize = "100%";
18
+ return audio;
19
+ }
20
+ if (object && mediaType === "video") {
21
+ const video = document.createElement("video");
22
+ configureMediaElement(video, interaction, object, label, mediaResponse);
23
+ if (object.width)
24
+ video.width = Number(object.width);
25
+ if (object.height)
26
+ video.height = Number(object.height);
27
+ return video;
28
+ }
29
+ if (object?.data && objectIsImage(object)) {
30
+ const image = document.createElement("img");
31
+ image.src = object.data;
32
+ image.alt = label;
33
+ image.style.maxInlineSize = "100%";
34
+ image.style.blockSize = "auto";
35
+ if (object.width)
36
+ image.width = Number(object.width);
37
+ if (object.height)
38
+ image.height = Number(object.height);
39
+ return image;
40
+ }
41
+ const group = document.createElement("div");
42
+ group.role = "group";
43
+ group.setAttribute("aria-label", label);
44
+ const fallbackHref = object?.data ?? object?.sources.find((source) => source.src)?.src;
45
+ if (fallbackHref) {
46
+ const link = document.createElement("a");
47
+ link.href = fallbackHref;
48
+ link.textContent = object?.text || fallbackHref;
49
+ group.append(link);
50
+ }
51
+ else {
52
+ group.textContent = label;
53
+ }
54
+ return group;
55
+ }
56
+ function configureMediaElement(media, interaction, object, label, mediaResponse) {
57
+ media.controls = mediaControlsMode(interaction, object) !== "none";
58
+ media.preload = "none";
59
+ media.autoplay = parseBooleanAttribute(interaction.attributes.autostart) ?? false;
60
+ media.loop = parseBooleanAttribute(interaction.attributes.loop) ?? false;
61
+ media.setAttribute("aria-label", label);
62
+ media.style.maxInlineSize = "100%";
63
+ copyMediaDataAttributes(media, interaction.attributes);
64
+ copyMediaDataAttributes(media, object.attributes);
65
+ if (object.data)
66
+ media.src = object.data;
67
+ for (const source of object.sources) {
68
+ if (!source.src)
69
+ continue;
70
+ const sourceElement = document.createElement("source");
71
+ sourceElement.src = source.src;
72
+ if (source.type)
73
+ sourceElement.type = source.type;
74
+ copySafeMediaChildAttributes(sourceElement, source.attributes, sourceAttributeNames);
75
+ media.append(sourceElement);
76
+ }
77
+ for (const track of object.tracks) {
78
+ if (!track.src)
79
+ continue;
80
+ const trackElement = document.createElement("track");
81
+ trackElement.src = track.src;
82
+ if (track.kind)
83
+ trackElement.kind = track.kind;
84
+ if (track.srclang)
85
+ trackElement.srclang = track.srclang;
86
+ if (track.label)
87
+ trackElement.label = track.label;
88
+ if (track.default)
89
+ trackElement.default = true;
90
+ copySafeMediaChildAttributes(trackElement, track.attributes, trackAttributeNames);
91
+ media.append(trackElement);
92
+ }
93
+ bindMediaPlayCount(media, interaction, mediaResponse);
94
+ }
95
+ function copyMediaDataAttributes(element, attributes) {
96
+ for (const [name, value] of Object.entries(attributes)) {
97
+ if (!name.startsWith("data-"))
98
+ continue;
99
+ element.setAttribute(name, value);
100
+ }
101
+ }
102
+ const sourceAttributeNames = new Set(["src", "srcset", "type"]);
103
+ const trackAttributeNames = new Set(["default", "kind", "label", "src", "srclang"]);
104
+ function copySafeMediaChildAttributes(element, attributes, controlledNames) {
105
+ for (const [name, value] of Object.entries(attributes)) {
106
+ const normalizedName = name.toLowerCase();
107
+ if (controlledNames.has(normalizedName))
108
+ continue;
109
+ if (normalizedName === "class" ||
110
+ normalizedName === "id" ||
111
+ normalizedName === "title" ||
112
+ normalizedName === "media" ||
113
+ normalizedName === "sizes" ||
114
+ normalizedName.startsWith("data-")) {
115
+ element.setAttribute(name, value);
116
+ }
117
+ }
118
+ }
119
+ function mediaElementType(object) {
120
+ const types = [object.type, ...object.sources.map((source) => source.type)].filter((value) => Boolean(value));
121
+ if (types.some((value) => value.startsWith("audio/")))
122
+ return "audio";
123
+ if (types.some((value) => value.startsWith("video/")))
124
+ return "video";
125
+ return undefined;
126
+ }
127
+ function mediaControlsMode(interaction, object) {
128
+ return (interaction.attributes["data-qti-media-player-controls"] ??
129
+ object.attributes["data-qti-media-player-controls"]);
130
+ }
131
+ function bindMediaPlayCount(media, interaction, mediaResponse) {
132
+ if (!mediaResponse.update)
133
+ return;
134
+ let playCount = mediaPlayCount(mediaResponse.currentValue ?? null);
135
+ let activePlaySession = false;
136
+ let readyAfterEnded = false;
137
+ const maximum = maximumMediaPlays(interaction);
138
+ const syncState = () => {
139
+ media.dataset.playCount = String(playCount);
140
+ if (maximum !== undefined && playCount >= maximum && !activePlaySession) {
141
+ media.dataset.maxPlaysReached = "true";
142
+ }
143
+ else {
144
+ delete media.dataset.maxPlaysReached;
145
+ }
146
+ };
147
+ media.addEventListener("play", () => {
148
+ if (mediaResponse.isCompleted?.()) {
149
+ return;
150
+ }
151
+ if (!activePlaySession && maximum !== undefined && playCount >= maximum) {
152
+ media.pause();
153
+ syncState();
154
+ return;
155
+ }
156
+ if (!activePlaySession && (readyAfterEnded || media.currentTime <= 0.25)) {
157
+ playCount += 1;
158
+ mediaResponse.update?.(playCount);
159
+ activePlaySession = true;
160
+ readyAfterEnded = false;
161
+ syncState();
162
+ return;
163
+ }
164
+ activePlaySession = true;
165
+ readyAfterEnded = false;
166
+ syncState();
167
+ });
168
+ media.addEventListener("ended", () => {
169
+ activePlaySession = false;
170
+ readyAfterEnded = true;
171
+ syncState();
172
+ });
173
+ media.addEventListener("seeked", () => {
174
+ if (!media.paused || media.currentTime > 0.25)
175
+ return;
176
+ activePlaySession = false;
177
+ readyAfterEnded = false;
178
+ syncState();
179
+ });
180
+ syncState();
181
+ }
182
+ //# sourceMappingURL=object-asset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"object-asset.js","sourceRoot":"","sources":["../../src/interactions/object-asset.ts"],"names":[],"mappings":"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"}
@@ -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 renderPairResponse(interaction: QtiInteraction, update: (value: QtiValue) => void, currentValue: QtiValue, messages: PlayerMessageResolver): HTMLElement;
4
+ //# sourceMappingURL=pair-interaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pair-interaction.d.ts","sourceRoot":"","sources":["../../src/interactions/pair-interaction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAa,cAAc,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAGrF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAU3E,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,cAAc,EAC3B,MAAM,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,EACjC,YAAY,EAAE,QAAQ,EACtB,QAAQ,EAAE,qBAAqB,GAC9B,WAAW,CAwIb"}