@citolab/qti-components 7.3.8 → 7.3.10

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 (406) hide show
  1. package/cdn/chunks/chunk-2AQB5QOU.js +1465 -0
  2. package/cdn/chunks/chunk-2D2T677T.js +5 -0
  3. package/cdn/chunks/chunk-2DBFRSMX.js +1 -0
  4. package/cdn/chunks/chunk-2KM4IIVZ.js +1 -0
  5. package/cdn/chunks/chunk-2MP4QXCW.js +5 -0
  6. package/cdn/chunks/chunk-2WMJ3FRH.js +5 -0
  7. package/cdn/chunks/chunk-3EL6MWIP.js +5 -0
  8. package/cdn/chunks/chunk-3FL7LAD7.js +3609 -0
  9. package/cdn/chunks/chunk-3OFR7NBQ.js +5 -0
  10. package/cdn/chunks/chunk-44FEGMMP.js +5 -0
  11. package/cdn/chunks/chunk-4AGPIRXC.js +3623 -0
  12. package/cdn/chunks/chunk-4BD24CBG.js +5 -0
  13. package/cdn/chunks/chunk-4JCAGCJ7.js +5 -0
  14. package/cdn/chunks/chunk-4KA72ZXP.js +5 -0
  15. package/cdn/chunks/chunk-4RGI2NPT.js +5 -0
  16. package/cdn/chunks/chunk-4V4EH3XE.js +5 -0
  17. package/cdn/chunks/chunk-5A6EZOWQ.js +1465 -0
  18. package/cdn/chunks/chunk-5MA2ACUN.js +5 -0
  19. package/cdn/chunks/chunk-5NPTQSKH.js +5 -0
  20. package/cdn/chunks/chunk-5OT7GAD6.js +1465 -0
  21. package/cdn/chunks/chunk-5X3DXTZR.js +5 -0
  22. package/cdn/chunks/chunk-5ZJGXWHS.js +5 -0
  23. package/cdn/chunks/chunk-65IPR5FK.js +5 -0
  24. package/cdn/chunks/chunk-67XELO2Z.js +5 -0
  25. package/cdn/chunks/chunk-6CVU566T.js +3604 -0
  26. package/cdn/chunks/chunk-6DAXA4WF.js +1465 -0
  27. package/cdn/chunks/chunk-6HMBATJ5.js +5 -0
  28. package/cdn/chunks/chunk-6I6VSJRU.js +5 -0
  29. package/cdn/chunks/chunk-6NH7EB4Y.js +5 -0
  30. package/cdn/chunks/chunk-6OGNTNZS.js +5 -0
  31. package/cdn/chunks/chunk-6U7KZ7RT.js +5 -0
  32. package/cdn/chunks/chunk-75AAESDA.js +5 -0
  33. package/cdn/chunks/chunk-7HRE6EJN.js +1465 -0
  34. package/cdn/chunks/chunk-A2IAVB65.js +5 -0
  35. package/cdn/chunks/chunk-AK7BBQIN.js +1465 -0
  36. package/cdn/chunks/chunk-AL7MMWN4.js +5 -0
  37. package/cdn/chunks/chunk-AU5IFIAE.js +5 -0
  38. package/cdn/chunks/chunk-B34CVRZY.js +3611 -0
  39. package/cdn/chunks/chunk-B5KBEV6C.js +5 -0
  40. package/cdn/chunks/chunk-BDVDUFDX.js +3604 -0
  41. package/cdn/chunks/chunk-BEKC2KXP.js +1465 -0
  42. package/cdn/chunks/chunk-BIPSM53R.js +3604 -0
  43. package/cdn/chunks/chunk-BUSPJKBW.js +5 -0
  44. package/cdn/chunks/chunk-BVGQYBYI.js +5 -0
  45. package/cdn/chunks/chunk-C2TYLPUF.js +5 -0
  46. package/cdn/chunks/chunk-C4S3TBY7.js +5 -0
  47. package/cdn/chunks/chunk-CA2BB5TT.js +1465 -0
  48. package/cdn/chunks/chunk-CAPYSR2Y.js +3605 -0
  49. package/cdn/chunks/chunk-CB2PW7DM.js +3604 -0
  50. package/cdn/chunks/chunk-CBEIZQ7O.js +5 -0
  51. package/cdn/chunks/chunk-DIM5R2XZ.js +3609 -0
  52. package/cdn/chunks/chunk-DM55ZVIS.js +3608 -0
  53. package/cdn/chunks/chunk-DNGQ3HHD.js +8 -0
  54. package/cdn/chunks/chunk-DTSNON3E.js +5 -0
  55. package/cdn/chunks/chunk-DUCVF666.js +5 -0
  56. package/cdn/chunks/chunk-DWKO2XVJ.js +3626 -0
  57. package/cdn/chunks/chunk-E5QYUREF.js +1465 -0
  58. package/cdn/chunks/chunk-EGMZWVEN.js +5 -0
  59. package/cdn/chunks/chunk-ETDUKPJ5.js +1465 -0
  60. package/cdn/chunks/chunk-FBCUILM4.js +5 -0
  61. package/cdn/chunks/chunk-FHKI336W.js +5 -0
  62. package/cdn/chunks/chunk-G6JBUK7M.js +8 -0
  63. package/cdn/chunks/chunk-GI643I6D.js +5 -0
  64. package/cdn/chunks/chunk-H5N66JWX.js +1 -0
  65. package/cdn/chunks/chunk-H6DTW4CH.js +1465 -0
  66. package/cdn/chunks/chunk-HVRUXHOA.js +5 -0
  67. package/cdn/chunks/chunk-HY6LZ42L.js +5 -0
  68. package/cdn/chunks/chunk-I4QFJPZG.js +1465 -0
  69. package/cdn/chunks/chunk-IAGXHLJ5.js +5 -0
  70. package/cdn/chunks/chunk-IAWUN2QB.js +5 -0
  71. package/cdn/chunks/chunk-ICRWHWJ3.js +5 -0
  72. package/cdn/chunks/chunk-IWOEDFXH.js +1465 -0
  73. package/cdn/chunks/chunk-IXOHXGV7.js +1464 -0
  74. package/cdn/chunks/chunk-J5BD6EO5.js +5 -0
  75. package/cdn/chunks/chunk-J6V7VRWX.js +3605 -0
  76. package/cdn/chunks/chunk-JESKBIHK.js +1465 -0
  77. package/cdn/chunks/chunk-JGH5ZZNA.js +1465 -0
  78. package/cdn/chunks/chunk-JIUUHGM7.js +1465 -0
  79. package/cdn/chunks/chunk-JX2BBAUD.js +3609 -0
  80. package/cdn/chunks/chunk-JZNXP6Z6.js +1465 -0
  81. package/cdn/chunks/chunk-K6RDKEPY.js +5 -0
  82. package/cdn/chunks/chunk-KVODKRRX.js +5 -0
  83. package/cdn/chunks/chunk-LDAQNEWI.js +5 -0
  84. package/cdn/chunks/chunk-M2CUHPCU.js +5 -0
  85. package/cdn/chunks/chunk-M2L4SJPE.js +5 -0
  86. package/cdn/chunks/chunk-M6UCMG2T.js +1465 -0
  87. package/cdn/chunks/chunk-MUO2LFIC.js +3604 -0
  88. package/cdn/chunks/chunk-MX6YXRD5.js +5 -0
  89. package/cdn/chunks/chunk-MX7JGUEV.js +5 -0
  90. package/cdn/chunks/chunk-MZEVJMUS.js +5 -0
  91. package/cdn/chunks/chunk-NHUCLA7C.js +5 -0
  92. package/cdn/chunks/chunk-NJMK5GFV.js +3604 -0
  93. package/cdn/chunks/chunk-NPUY7KWX.js +5 -0
  94. package/cdn/chunks/chunk-NQ3BSLED.js +1465 -0
  95. package/cdn/chunks/chunk-NSDTAG5H.js +1465 -0
  96. package/cdn/chunks/chunk-NW5BDXND.js +5 -0
  97. package/cdn/chunks/chunk-OITWX2VZ.js +1464 -0
  98. package/cdn/chunks/chunk-OUASGGRF.js +5 -0
  99. package/cdn/chunks/chunk-P32DF2PX.js +5 -0
  100. package/cdn/chunks/chunk-P67MLABM.js +5 -0
  101. package/cdn/chunks/chunk-PDGJCLPL.js +5 -0
  102. package/cdn/chunks/chunk-PEIVTIUB.js +5 -0
  103. package/cdn/chunks/chunk-PIVDVXEN.js +1465 -0
  104. package/cdn/chunks/chunk-QLAUWZGN.js +1465 -0
  105. package/cdn/chunks/chunk-QXXWBEQF.js +3609 -0
  106. package/cdn/chunks/chunk-QZPQCRI5.js +1465 -0
  107. package/cdn/chunks/chunk-S4473XKU.js +5 -0
  108. package/cdn/chunks/chunk-SAF2F2BZ.js +1 -0
  109. package/cdn/chunks/chunk-SG6DVQL7.js +5 -0
  110. package/cdn/chunks/chunk-SHTWKDDX.js +1465 -0
  111. package/cdn/chunks/chunk-SLPPK4MX.js +1465 -0
  112. package/cdn/chunks/chunk-SNOJ7YK5.js +5 -0
  113. package/cdn/chunks/chunk-SRIMN6LS.js +5 -0
  114. package/cdn/chunks/chunk-STP2XHRQ.js +5 -0
  115. package/cdn/chunks/chunk-SX5UYWRC.js +5 -0
  116. package/cdn/chunks/chunk-SXBW34TA.js +5 -0
  117. package/cdn/chunks/chunk-SZIHBKW7.js +5 -0
  118. package/cdn/chunks/chunk-TBOYZAKT.js +10 -0
  119. package/cdn/chunks/chunk-TJQOQP3Y.js +5 -0
  120. package/cdn/chunks/chunk-TNTVGKFL.js +5 -0
  121. package/cdn/chunks/chunk-TUP6KJ75.js +5 -0
  122. package/cdn/chunks/chunk-TZ3JSM57.js +1465 -0
  123. package/cdn/chunks/chunk-TZR6VRWS.js +5 -0
  124. package/cdn/chunks/chunk-U2ZZRG5F.js +5 -0
  125. package/cdn/chunks/chunk-U44QDOCL.js +3623 -0
  126. package/cdn/chunks/chunk-U7TJTJQN.js +5 -0
  127. package/cdn/chunks/chunk-UFYKSOJU.js +5 -0
  128. package/cdn/chunks/chunk-UQBB2LW3.js +5 -0
  129. package/cdn/chunks/chunk-UYN4HJOQ.js +5 -0
  130. package/cdn/chunks/chunk-V4TTNYV7.js +5 -0
  131. package/cdn/chunks/chunk-VDZLUVD6.js +3626 -0
  132. package/cdn/chunks/chunk-VPCDMES4.js +1465 -0
  133. package/cdn/chunks/chunk-VU7RTCTH.js +5 -0
  134. package/cdn/chunks/chunk-X4D22CNL.js +1465 -0
  135. package/cdn/chunks/chunk-XWDDTFCA.js +1 -0
  136. package/cdn/chunks/chunk-YTHXVBE7.js +5 -0
  137. package/cdn/chunks/chunk-YXJMYFQN.js +3609 -0
  138. package/cdn/chunks/chunk-ZJOPT4QJ.js +1465 -0
  139. package/cdn/chunks/chunk-ZQX3RHXX.js +1465 -0
  140. package/cdn/chunks/chunk-ZXFMPBFU.js +5 -0
  141. package/cdn/exports/qti-condition-expression.js +1 -1
  142. package/cdn/exports/qti-expression.js +1 -1
  143. package/cdn/index.global.js +1 -1
  144. package/cdn/index.js +1 -1
  145. package/cdn/qti-components/index.js +1 -1
  146. package/cdn/qti-item/components/item-container.js +1 -1
  147. package/cdn/qti-item/components/item-show-correct-response.js +1 -1
  148. package/cdn/qti-item/components/print-item-variables.js +1 -1
  149. package/cdn/qti-item/core/index.js +1 -1
  150. package/cdn/qti-test/components/index.js +1 -1
  151. package/cdn/qti-test/components/test-container.js +1 -1
  152. package/cdn/qti-test/components/test-navigation.js +1 -1
  153. package/cdn/qti-test/components/test-next.js +1 -1
  154. package/cdn/qti-test/components/test-paging-buttons-stamp.js +1 -1
  155. package/cdn/qti-test/components/test-prev.js +1 -1
  156. package/cdn/qti-test/components/test-print-context.js +1 -1
  157. package/cdn/qti-test/components/test-print-item-variables.js +1 -1
  158. package/cdn/qti-test/components/test-scoring-buttons.js +1 -1
  159. package/cdn/qti-test/components/test-scoring-feedback.js +1 -1
  160. package/cdn/qti-test/components/test-section-buttons-stamp.js +1 -1
  161. package/cdn/qti-test/components/test-show-correct-response.js +1 -1
  162. package/cdn/qti-test/components/test-stamp.js +1 -1
  163. package/cdn/qti-test/components/test-view-toggle.js +1 -1
  164. package/cdn/qti-test/components/test-view.js +1 -1
  165. package/cdn/qti-test/core/index.js +1 -1
  166. package/dist/chunks/chunk-22ADH5XX.js +94 -0
  167. package/dist/chunks/chunk-22ADH5XX.js.map +1 -0
  168. package/dist/chunks/chunk-24YH3T77.js +3594 -0
  169. package/dist/chunks/chunk-24YH3T77.js.map +1 -0
  170. package/dist/chunks/chunk-2KLMYWXY.js +94 -0
  171. package/dist/chunks/chunk-2KLMYWXY.js.map +1 -0
  172. package/dist/chunks/chunk-2M36WE6U.js +887 -0
  173. package/dist/chunks/chunk-2M36WE6U.js.map +1 -0
  174. package/dist/chunks/chunk-33UVTXDH.js +7970 -0
  175. package/dist/chunks/chunk-33UVTXDH.js.map +1 -0
  176. package/dist/chunks/chunk-3E2HPYC2.js +7970 -0
  177. package/dist/chunks/chunk-3E2HPYC2.js.map +1 -0
  178. package/dist/chunks/chunk-3IDGBR6L.js +94 -0
  179. package/dist/chunks/chunk-3IDGBR6L.js.map +1 -0
  180. package/dist/chunks/chunk-3KHLBN4E.js +7969 -0
  181. package/dist/chunks/chunk-3KHLBN4E.js.map +1 -0
  182. package/dist/chunks/chunk-3OFGPZKB.js +887 -0
  183. package/dist/chunks/chunk-3OFGPZKB.js.map +1 -0
  184. package/dist/chunks/chunk-3Q3GJFP2.js +94 -0
  185. package/dist/chunks/chunk-3Q3GJFP2.js.map +1 -0
  186. package/dist/chunks/chunk-4HSJSPKC.js +3594 -0
  187. package/dist/chunks/chunk-4HSJSPKC.js.map +1 -0
  188. package/dist/chunks/chunk-4IY7EZRG.js +94 -0
  189. package/dist/chunks/chunk-4IY7EZRG.js.map +1 -0
  190. package/dist/chunks/chunk-52LKP43M.js +7970 -0
  191. package/dist/chunks/chunk-52LKP43M.js.map +1 -0
  192. package/dist/chunks/chunk-5SMBVUWD.js +94 -0
  193. package/dist/chunks/chunk-5SMBVUWD.js.map +1 -0
  194. package/dist/chunks/chunk-5UK3GDC4.js +270 -0
  195. package/dist/chunks/chunk-5UK3GDC4.js.map +1 -0
  196. package/dist/chunks/chunk-6RGVMISK.js +91 -0
  197. package/dist/chunks/chunk-6RGVMISK.js.map +1 -0
  198. package/dist/chunks/chunk-76V23CCX.js +887 -0
  199. package/dist/chunks/chunk-76V23CCX.js.map +1 -0
  200. package/dist/chunks/chunk-7OYG6HQK.js +887 -0
  201. package/dist/chunks/chunk-7OYG6HQK.js.map +1 -0
  202. package/dist/chunks/chunk-7PXD4SKY.js +94 -0
  203. package/dist/chunks/chunk-7PXD4SKY.js.map +1 -0
  204. package/dist/chunks/chunk-7S77KG7E.js +3598 -0
  205. package/dist/chunks/chunk-7S77KG7E.js.map +1 -0
  206. package/dist/chunks/chunk-7UNBWVTX.js +94 -0
  207. package/dist/chunks/chunk-7UNBWVTX.js.map +1 -0
  208. package/dist/chunks/chunk-A7GWMVMW.js +94 -0
  209. package/dist/chunks/chunk-A7GWMVMW.js.map +1 -0
  210. package/dist/chunks/chunk-AATFMNQ7.js +887 -0
  211. package/dist/chunks/chunk-AATFMNQ7.js.map +1 -0
  212. package/dist/chunks/chunk-AE5G2IBM.js +7969 -0
  213. package/dist/chunks/chunk-AE5G2IBM.js.map +1 -0
  214. package/dist/chunks/chunk-B4T3VSOK.js +7969 -0
  215. package/dist/chunks/chunk-B4T3VSOK.js.map +1 -0
  216. package/dist/chunks/chunk-B6J55LEH.js +887 -0
  217. package/dist/chunks/chunk-B6J55LEH.js.map +1 -0
  218. package/dist/chunks/chunk-BD3UXA45.js +94 -0
  219. package/dist/chunks/chunk-BD3UXA45.js.map +1 -0
  220. package/dist/chunks/chunk-BJ34MOX3.js +3594 -0
  221. package/dist/chunks/chunk-BJ34MOX3.js.map +1 -0
  222. package/dist/chunks/chunk-BSMH5QAT.js +7970 -0
  223. package/dist/chunks/chunk-BSMH5QAT.js.map +1 -0
  224. package/dist/chunks/chunk-BXUZQSIJ.js +7972 -0
  225. package/dist/chunks/chunk-BXUZQSIJ.js.map +1 -0
  226. package/dist/chunks/chunk-CIJVRB7X.js +887 -0
  227. package/dist/chunks/chunk-CIJVRB7X.js.map +1 -0
  228. package/dist/chunks/chunk-COMEKBI4.js +887 -0
  229. package/dist/chunks/chunk-COMEKBI4.js.map +1 -0
  230. package/dist/chunks/chunk-CZTJMCR5.js +887 -0
  231. package/dist/chunks/chunk-CZTJMCR5.js.map +1 -0
  232. package/dist/chunks/chunk-D3QPTBGD.js +94 -0
  233. package/dist/chunks/chunk-D3QPTBGD.js.map +1 -0
  234. package/dist/chunks/chunk-D4LXKUTU.js +3595 -0
  235. package/dist/chunks/chunk-D4LXKUTU.js.map +1 -0
  236. package/dist/chunks/chunk-D5F2SQNW.js +7969 -0
  237. package/dist/chunks/chunk-D5F2SQNW.js.map +1 -0
  238. package/dist/chunks/chunk-DB7E3FQS.js +94 -0
  239. package/dist/chunks/chunk-DB7E3FQS.js.map +1 -0
  240. package/dist/chunks/chunk-DHPEGVWN.js +84 -0
  241. package/dist/chunks/chunk-DHPEGVWN.js.map +1 -0
  242. package/dist/chunks/chunk-DO2QLC5X.js +7970 -0
  243. package/dist/chunks/chunk-DO2QLC5X.js.map +1 -0
  244. package/dist/chunks/chunk-DS4BD2ZQ.js +887 -0
  245. package/dist/chunks/chunk-DS4BD2ZQ.js.map +1 -0
  246. package/dist/chunks/chunk-DSLV5YA6.js +3594 -0
  247. package/dist/chunks/chunk-DSLV5YA6.js.map +1 -0
  248. package/dist/chunks/chunk-DU577TCY.js +3599 -0
  249. package/dist/chunks/chunk-DU577TCY.js.map +1 -0
  250. package/dist/chunks/chunk-DX7I752N.js +3601 -0
  251. package/dist/chunks/chunk-DX7I752N.js.map +1 -0
  252. package/dist/chunks/chunk-EAYSUJ5L.js +887 -0
  253. package/dist/chunks/chunk-EAYSUJ5L.js.map +1 -0
  254. package/dist/chunks/chunk-EFXOXSPI.js +7969 -0
  255. package/dist/chunks/chunk-EFXOXSPI.js.map +1 -0
  256. package/dist/chunks/chunk-ER2AETF4.js +94 -0
  257. package/dist/chunks/chunk-ER2AETF4.js.map +1 -0
  258. package/dist/chunks/chunk-FMBMEJA6.js +887 -0
  259. package/dist/chunks/chunk-FMBMEJA6.js.map +1 -0
  260. package/dist/chunks/chunk-FQ42YLGN.js +94 -0
  261. package/dist/chunks/chunk-FQ42YLGN.js.map +1 -0
  262. package/dist/chunks/chunk-G52LAMAB.js +94 -0
  263. package/dist/chunks/chunk-G52LAMAB.js.map +1 -0
  264. package/dist/chunks/chunk-G5FFQER7.js +7969 -0
  265. package/dist/chunks/chunk-G5FFQER7.js.map +1 -0
  266. package/dist/chunks/chunk-GCOODLFL.js +94 -0
  267. package/dist/chunks/chunk-GCOODLFL.js.map +1 -0
  268. package/dist/chunks/chunk-GH26RKOD.js +887 -0
  269. package/dist/chunks/chunk-GH26RKOD.js.map +1 -0
  270. package/dist/chunks/chunk-GKY4X7OQ.js +94 -0
  271. package/dist/chunks/chunk-GKY4X7OQ.js.map +1 -0
  272. package/dist/chunks/chunk-GZRKK3QW.js +7970 -0
  273. package/dist/chunks/chunk-GZRKK3QW.js.map +1 -0
  274. package/dist/chunks/chunk-H4HFOONR.js +94 -0
  275. package/dist/chunks/chunk-H4HFOONR.js.map +1 -0
  276. package/dist/chunks/chunk-H7E4LC4K.js +7969 -0
  277. package/dist/chunks/chunk-H7E4LC4K.js.map +1 -0
  278. package/dist/chunks/chunk-HFLNMWQY.js +887 -0
  279. package/dist/chunks/chunk-HFLNMWQY.js.map +1 -0
  280. package/dist/chunks/chunk-HIPJ4SLP.js +94 -0
  281. package/dist/chunks/chunk-HIPJ4SLP.js.map +1 -0
  282. package/dist/chunks/chunk-HWBOMIKQ.js +94 -0
  283. package/dist/chunks/chunk-HWBOMIKQ.js.map +1 -0
  284. package/dist/chunks/chunk-I5QWPTNS.js +7970 -0
  285. package/dist/chunks/chunk-I5QWPTNS.js.map +1 -0
  286. package/dist/chunks/chunk-IDQVCLFW.js +3594 -0
  287. package/dist/chunks/chunk-IDQVCLFW.js.map +1 -0
  288. package/dist/chunks/chunk-IHM5AGLK.js +94 -0
  289. package/dist/chunks/chunk-IHM5AGLK.js.map +1 -0
  290. package/dist/chunks/chunk-IHVWYU6H.js +887 -0
  291. package/dist/chunks/chunk-IHVWYU6H.js.map +1 -0
  292. package/dist/chunks/chunk-IM3XJ5J3.js +94 -0
  293. package/dist/chunks/chunk-IM3XJ5J3.js.map +1 -0
  294. package/dist/chunks/chunk-J6QL36DE.js +887 -0
  295. package/dist/chunks/chunk-J6QL36DE.js.map +1 -0
  296. package/dist/chunks/chunk-JCSGX6KS.js +887 -0
  297. package/dist/chunks/chunk-JCSGX6KS.js.map +1 -0
  298. package/dist/chunks/chunk-JKVAOL23.js +94 -0
  299. package/dist/chunks/chunk-JKVAOL23.js.map +1 -0
  300. package/dist/chunks/chunk-JSFSSO4N.js +7968 -0
  301. package/dist/chunks/chunk-JSFSSO4N.js.map +1 -0
  302. package/dist/chunks/chunk-KGLPF52L.js +887 -0
  303. package/dist/chunks/chunk-KGLPF52L.js.map +1 -0
  304. package/dist/chunks/chunk-KGUUVU4R.js +94 -0
  305. package/dist/chunks/chunk-KGUUVU4R.js.map +1 -0
  306. package/dist/chunks/chunk-KUR3WYNE.js +94 -0
  307. package/dist/chunks/chunk-KUR3WYNE.js.map +1 -0
  308. package/dist/chunks/chunk-LP5XIBBR.js +3616 -0
  309. package/dist/chunks/chunk-LP5XIBBR.js.map +1 -0
  310. package/dist/chunks/chunk-MHN7KBCQ.js +94 -0
  311. package/dist/chunks/chunk-MHN7KBCQ.js.map +1 -0
  312. package/dist/chunks/chunk-MVUREGEC.js +3594 -0
  313. package/dist/chunks/chunk-MVUREGEC.js.map +1 -0
  314. package/dist/chunks/chunk-ND4URIPN.js +3595 -0
  315. package/dist/chunks/chunk-ND4URIPN.js.map +1 -0
  316. package/dist/chunks/chunk-NHJSQ6EC.js +887 -0
  317. package/dist/chunks/chunk-NHJSQ6EC.js.map +1 -0
  318. package/dist/chunks/chunk-NS4XSJTY.js +94 -0
  319. package/dist/chunks/chunk-NS4XSJTY.js.map +1 -0
  320. package/dist/chunks/chunk-NYM2PFSX.js +887 -0
  321. package/dist/chunks/chunk-NYM2PFSX.js.map +1 -0
  322. package/dist/chunks/chunk-O4YARITG.js +94 -0
  323. package/dist/chunks/chunk-O4YARITG.js.map +1 -0
  324. package/dist/chunks/chunk-OEU7UL5H.js +7970 -0
  325. package/dist/chunks/chunk-OEU7UL5H.js.map +1 -0
  326. package/dist/chunks/chunk-PZUCEOGK.js +887 -0
  327. package/dist/chunks/chunk-PZUCEOGK.js.map +1 -0
  328. package/dist/chunks/chunk-QANFQNGJ.js +94 -0
  329. package/dist/chunks/chunk-QANFQNGJ.js.map +1 -0
  330. package/dist/chunks/chunk-QJCCWOJA.js +7969 -0
  331. package/dist/chunks/chunk-QJCCWOJA.js.map +1 -0
  332. package/dist/chunks/chunk-QRVZKLRL.js +94 -0
  333. package/dist/chunks/chunk-QRVZKLRL.js.map +1 -0
  334. package/dist/chunks/chunk-QZQGK6RL.js +3616 -0
  335. package/dist/chunks/chunk-QZQGK6RL.js.map +1 -0
  336. package/dist/chunks/chunk-R4NPDD3O.js +7970 -0
  337. package/dist/chunks/chunk-R4NPDD3O.js.map +1 -0
  338. package/dist/chunks/chunk-R5EF3ZV3.js +887 -0
  339. package/dist/chunks/chunk-R5EF3ZV3.js.map +1 -0
  340. package/dist/chunks/chunk-RBZA3P3W.js +94 -0
  341. package/dist/chunks/chunk-RBZA3P3W.js.map +1 -0
  342. package/dist/chunks/chunk-RGFVMAPK.js +887 -0
  343. package/dist/chunks/chunk-RGFVMAPK.js.map +1 -0
  344. package/dist/chunks/chunk-RQF4P6PJ.js +94 -0
  345. package/dist/chunks/chunk-RQF4P6PJ.js.map +1 -0
  346. package/dist/chunks/chunk-SUD3U36A.js +7971 -0
  347. package/dist/chunks/chunk-SUD3U36A.js.map +1 -0
  348. package/dist/chunks/chunk-T7AYE2YI.js +887 -0
  349. package/dist/chunks/chunk-T7AYE2YI.js.map +1 -0
  350. package/dist/chunks/chunk-TL4SWC5W.js +94 -0
  351. package/dist/chunks/chunk-TL4SWC5W.js.map +1 -0
  352. package/dist/chunks/chunk-TNBMHBCA.js +94 -0
  353. package/dist/chunks/chunk-TNBMHBCA.js.map +1 -0
  354. package/dist/chunks/chunk-TNSZ52TC.js +269 -0
  355. package/dist/chunks/chunk-TNSZ52TC.js.map +1 -0
  356. package/dist/chunks/chunk-UL5627MO.js +94 -0
  357. package/dist/chunks/chunk-UL5627MO.js.map +1 -0
  358. package/dist/chunks/chunk-V7JDFAR4.js +887 -0
  359. package/dist/chunks/chunk-V7JDFAR4.js.map +1 -0
  360. package/dist/chunks/chunk-VAMHDDOF.js +3599 -0
  361. package/dist/chunks/chunk-VAMHDDOF.js.map +1 -0
  362. package/dist/chunks/chunk-VWKPIAXJ.js +887 -0
  363. package/dist/chunks/chunk-VWKPIAXJ.js.map +1 -0
  364. package/dist/chunks/chunk-W7DTVLFL.js +3599 -0
  365. package/dist/chunks/chunk-W7DTVLFL.js.map +1 -0
  366. package/dist/chunks/chunk-WGRV4XGF.js +94 -0
  367. package/dist/chunks/chunk-WGRV4XGF.js.map +1 -0
  368. package/dist/chunks/chunk-WGYRA3PV.js +3599 -0
  369. package/dist/chunks/chunk-WGYRA3PV.js.map +1 -0
  370. package/dist/chunks/chunk-WPILGOKJ.js +7970 -0
  371. package/dist/chunks/chunk-WPILGOKJ.js.map +1 -0
  372. package/dist/chunks/chunk-WTHWEPDU.js +887 -0
  373. package/dist/chunks/chunk-WTHWEPDU.js.map +1 -0
  374. package/dist/chunks/chunk-WUME5EGP.js +3599 -0
  375. package/dist/chunks/chunk-WUME5EGP.js.map +1 -0
  376. package/dist/chunks/chunk-XKCAACM6.js +7970 -0
  377. package/dist/chunks/chunk-XKCAACM6.js.map +1 -0
  378. package/dist/chunks/chunk-XNIBWYHL.js +887 -0
  379. package/dist/chunks/chunk-XNIBWYHL.js.map +1 -0
  380. package/dist/chunks/chunk-Y5W2PVX7.js +3613 -0
  381. package/dist/chunks/chunk-Y5W2PVX7.js.map +1 -0
  382. package/dist/chunks/chunk-YHIY6E3N.js +94 -0
  383. package/dist/chunks/chunk-YHIY6E3N.js.map +1 -0
  384. package/dist/chunks/chunk-YHTY7DUW.js +3613 -0
  385. package/dist/chunks/chunk-YHTY7DUW.js.map +1 -0
  386. package/dist/chunks/chunk-YKBQIZ42.js +7971 -0
  387. package/dist/chunks/chunk-YKBQIZ42.js.map +1 -0
  388. package/dist/chunks/chunk-YZNWGPQB.js +7970 -0
  389. package/dist/chunks/chunk-YZNWGPQB.js.map +1 -0
  390. package/dist/chunks/chunk-ZEIFNXEY.js +887 -0
  391. package/dist/chunks/chunk-ZEIFNXEY.js.map +1 -0
  392. package/dist/chunks/chunk-ZL6XU46A.js +94 -0
  393. package/dist/chunks/chunk-ZL6XU46A.js.map +1 -0
  394. package/dist/chunks/chunk-ZXLMZGX3.js +7970 -0
  395. package/dist/chunks/chunk-ZXLMZGX3.js.map +1 -0
  396. package/dist/index.js +5 -5
  397. package/dist/item.css +41 -4
  398. package/dist/qti-components/index.js +1 -1
  399. package/dist/qti-components-jsx.d.ts +7 -7
  400. package/dist/qti-item/components/item-container.js +2 -2
  401. package/dist/qti-item/core/index.js +2 -2
  402. package/dist/qti-test/components/index.js +2 -2
  403. package/dist/qti-test/components/test-container.js +2 -2
  404. package/dist/qti-test/core/index.js +2 -2
  405. package/dist/vscode.html-custom-data.json +6 -6
  406. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/qti-components/qti-assessment-item/qti-assessment-item.ts","../../src/lib/qti-components/qti-assessment-stimulus-ref/qti-assessment-stimulus-ref.ts","../../src/lib/qti-components/qti-companion-materials-info/qti-companion-materials-info.ts","../../src/lib/qti-components/qti-custom-operator/qti-custom-operator.ts","../../src/lib/qti-components/qti-feedback/qti-feedback-block/qti-feedback-block.ts","../../src/lib/qti-components/qti-feedback/qti-feedback.ts","../../src/lib/qti-components/internal/utils.ts","../../src/lib/qti-components/qti-feedback/qti-feedback-inline/qti-feedback-inline.ts","../../src/lib/qti-components/qti-feedback/qti-modal-feedback/qti-modal-feedback.ts","../../src/lib/qti-components/qti-interaction/qti-associable-hotspot.ts","../../src/lib/qti-components/qti-interaction/qti-associate-interaction/qti-associate-interaction.ts","../../src/lib/qti-components/qti-interaction/internal/drag-drop/drag-drop-interaction-mixin.ts","../../src/lib/qti-components/qti-interaction/internal/drag-drop/flippables-mixin.ts","../../src/lib/qti-components/qti-interaction/qti-associate-interaction/qti-associate-interaction.styles.ts","../../src/lib/qti-components/qti-interaction/qti-choice-interaction/qti-choice-interaction.ts","../../src/lib/qti-components/qti-interaction/internal/choices/choices.mixin.ts","../../src/lib/qti-components/qti-interaction/internal/vocabulary/vocabulary-mixin.ts","../../src/lib/qti-components/qti-interaction/qti-choice-interaction/qti-choice-interaction.styles.ts","../../src/lib/qti-components/qti-interaction/qti-custom-interaction/qti-custom-interaction.ts","../../src/lib/qti-components/qti-interaction/qti-end-attempt-interaction/qti-end-attempt-interaction.ts","../../src/lib/qti-components/qti-interaction/qti-extended-text-interaction/qti-extended-text-interaction.ts","../../src/lib/qti-components/qti-interaction/qti-extended-text-interaction/qti-extended-text-interaction.styles.ts","../../src/lib/qti-components/qti-interaction/qti-gap-img.ts","../../src/lib/qti-components/qti-interaction/qti-gap-match-interaction/qti-gap-match-interaction.ts","../../src/lib/qti-components/qti-interaction/qti-gap-match-interaction/qti-gap-match-interaction.styles.ts","../../src/lib/qti-components/qti-interaction/qti-gap-text.ts","../../src/lib/qti-components/qti-interaction/internal/active-element/active-element.mixin.ts","../../src/lib/qti-components/qti-interaction/qti-gap.ts","../../src/lib/qti-components/qti-interaction/qti-graphic-associate-interaction/qti-graphic-associate-interaction.ts","../../src/lib/qti-components/qti-interaction/internal/hotspots/hotspot.ts","../../src/lib/qti-components/qti-interaction/qti-graphic-associate-interaction/qti-graphic-associate-interaction.styles.ts","../../src/lib/qti-components/qti-interaction/qti-graphic-gap-match-interaction/qti-graphic-gap-match-interaction.ts","../../src/lib/qti-components/qti-interaction/qti-graphic-gap-match-interaction/qti-graphic-gap-match-interaction.styles.ts","../../src/lib/qti-components/qti-interaction/qti-graphic-order-interaction/qti-graphic-order-interaction.ts","../../src/lib/qti-components/qti-interaction/qti-graphic-order-interaction/qti-graphic-order-interaction.styles.ts","../../src/lib/qti-components/qti-interaction/qti-hotspot-choice.ts","../../src/lib/qti-components/qti-interaction/qti-hotspot-interaction/qti-hotspot-interaction.ts","../../src/lib/qti-components/qti-interaction/qti-hotspot-interaction/qti-hotspot-interaction.styles.ts","../../src/lib/qti-components/qti-interaction/qti-hottext-interaction/qti-hottext-interaction.ts","../../src/lib/qti-components/qti-interaction/qti-hottext.ts","../../src/lib/qti-components/qti-interaction/qti-inline-choice-interaction/qti-inline-choice-interaction.ts","../../src/lib/qti-components/qti-interaction/qti-inline-choice.ts","../../src/lib/qti-components/qti-interaction/qti-simple-associable-choice.ts","../../src/lib/qti-components/qti-interaction/qti-match-interaction/qti-match-interaction.ts","../../src/lib/qti-components/qti-interaction/qti-match-interaction/qti-match-interaction.styles.ts","../../src/lib/qti-components/qti-interaction/qti-media-interaction/qti-media-interaction.ts","../../src/lib/qti-components/qti-interaction/qti-order-interaction/qti-order-interaction.ts","../../src/lib/qti-components/qti-interaction/qti-order-interaction/qti-order-interaction.styles.ts","../../src/lib/qti-components/qti-interaction/qti-portable-custom-interaction/qti-portable-custom-interaction.ts","../../src/lib/qti-components/qti-interaction/qti-portable-custom-interaction/qti-portable-custom-interaction.styles.ts","../../src/lib/qti-components/qti-interaction/qti-position-object-interaction/qti-position-object-interaction.ts","../../src/lib/qti-components/qti-interaction/qti-position-object-interaction/qti-position-object-stage.ts","../../src/lib/qti-components/qti-interaction/qti-select-point-interaction/qti-select-point-interaction.ts","../../src/lib/qti-components/qti-interaction/qti-simple-choice.ts","../../src/lib/qti-components/qti-interaction/qti-slider-interaction/qti-slider-interaction.ts","../../src/lib/qti-components/qti-interaction/qti-slider-interaction/qti-slider-interaction.styles.ts","../../src/lib/qti-components/qti-interaction/qti-text-entry-interaction/qti-text-entry-interaction.ts","../../src/lib/qti-components/qti-interaction/qti-text-entry-interaction/qti-text-entry-interaction.styles.ts","../../src/lib/qti-components/qti-interaction/qti-upload-interaction/qti-upload-interaction.ts","../../src/lib/qti-components/qti-item-body/qti-item-body.ts","../../src/lib/qti-components/qti-item-body/qti-item-body.styles.ts","../../src/lib/qti-components/qti-outcome-processing/qti-outcome-processing.ts","../../src/lib/qti-components/qti-prompt/qti-prompt.ts","../../src/lib/qti-components/qti-response-processing/qti-response-processing/qti-response-processing.ts","../../src/lib/qti-components/internal/template-strings.ts","../../src/lib/qti-components/qti-response-processing/qti-rule/qti-lookup-outcome-value/qti-lookup-outcome-value.ts","../../src/lib/qti-components/qti-response-processing/qti-rule/qti-rule.ts","../../src/lib/qti-components/qti-response-processing/qti-rule/qti-response-condition/qti-response-condition.ts","../../src/lib/qti-components/qti-response-processing/qti-rule/qti-set-outcome-value/qti-set-outcome-value.ts","../../src/lib/qti-components/qti-response-processing/qti-response-else/qti-response-else.ts","../../src/lib/qti-components/qti-response-processing/qti-response-else/qti-response-if/qti-response-else-if/qti-response-else-if.ts","../../src/lib/qti-components/qti-response-processing/qti-response-else/qti-response-if/qti-response-if.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-and/qti-and.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-basevalue/qti-basevalue.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-contains/qti-contains.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-correct/qti-correct.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-equal-rounded/qti-equal-rounded.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-equal/qti-equal.ts","../../src/lib/qti-components/qti-response-processing/utilities/scoring-helper.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-gt/qti-gt.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-gte/qti-gte.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-is-null/qti-is-null.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-lt/qti-lt.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-lte/qti-lte.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-map-response/qti-map-response.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-map-response-point/qti-map-response-point.ts","../../src/lib/qti-components/internal/qti-expression.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-match/qti-match.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-member/qti-member.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-multiple/qti-multiple.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-not/qti-not.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-or/qti-or.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-ordered/qti-ordered.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-printed-variable/qti-printed-variable.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-product/qti-product.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-subtract/qti-subtract.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-subtract/index.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-string-match/qti-string-match.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-sum/qti-sum.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-variable/qti-variable.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-random/qti-random.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-delete/qti-delete.ts","../../src/lib/qti-components/qti-rubric-block/qti-content-body.ts","../../src/lib/qti-components/qti-rubric-block/qti-rubric-block.ts","../../src/lib/qti-components/qti-stylesheet/qti-stylesheet.ts","../../src/lib/qti-components/qti-variable-declaration/qti-outcome-declaration/qti-outcome-declaration.ts","../../src/lib/qti-components/qti-variable-declaration/qti-variable-declaration.ts","../../src/lib/qti-components/qti-variable-declaration/qti-response-declaration/qti-response-declaration.ts"],"sourcesContent":["import { provide } from '@lit/context';\nimport { LitElement, html } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport { watch } from '../../decorators/watch';\nimport { itemContext } from '../../exports/qti-assessment-item.context';\nimport { itemContextVariables } from '../../exports/item.context';\n\nimport type { InteractionChangedDetails, OutcomeChangedDetails } from '../internal/event-types';\nimport type { ResponseInteraction } from '../../exports/expression-result';\nimport type { VariableDeclaration, VariableValue } from '../../exports/variables';\nimport type { OutcomeVariable, ResponseVariable } from '../../exports/variables';\nimport type { QtiFeedback } from '../qti-feedback/qti-feedback';\nimport type { QtiResponseProcessing } from '../qti-response-processing';\nimport type QtiRegisterVariable from '../internal/events/qti-register-variable';\nimport type { ItemContext } from '../../exports/item.context';\nimport type { Interaction } from '../../exports/interaction';\n/**\n * @summary The qti-assessment-item element contains all the other QTI 3 item structures.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/impl#h.dltnnj87l0yj\n *\n * @dependency qti-feedback\n * @dependency qti-responseprocessing\n *\n * @event qti-item-context-updated - Emitted when through a user action the itemContext is updated,\n * typically on interaction with the interactions, or calling response processing.\n */\n@customElement('qti-assessment-item')\nexport class QtiAssessmentItem extends LitElement {\n private _itemTitle: string;\n\n @property({ type: String }) identifier: string = '';\n @property({ type: String }) adaptive: 'true' | 'false' = 'false';\n @property({ type: String }) timeDependent: 'true' | 'false' | null = null;\n\n @property({ type: String })\n get title(): string {\n return this._itemTitle;\n }\n set title(value: string) {\n this._itemTitle = value;\n this.removeAttribute('title');\n this.setAttribute('data-title', value);\n }\n\n @property({ type: Boolean }) disabled: boolean;\n @watch('disabled', { waitUntilFirstUpdate: true })\n protected _handleDisabledChange = (_: boolean, disabled: boolean) => {\n this._interactionElements.forEach(ch => (ch.disabled = disabled));\n };\n\n @property({ type: Boolean }) readonly: boolean;\n @watch('readonly', { waitUntilFirstUpdate: true })\n protected _handleReadonlyChange = (_: boolean, readonly: boolean) =>\n this._interactionElements.forEach(ch => (ch.readonly = readonly));\n\n @provide({ context: itemContext })\n private _context: ItemContext = {\n variables: itemContextVariables\n };\n\n /**\n * Sets the identifier for the assessment item reference if this item is in a test.\n *\n * @param identifier - The identifier for the assessment item reference.\n */\n public set assessmentItemRefId(identifier: string) {\n this._context = { ...this._context, identifier };\n }\n\n public get assessmentItemRefId(): string {\n return this._context.identifier;\n }\n\n public get variables(): VariableValue<string | string[] | null>[] {\n return this._context.variables.map(v => ({\n identifier: v.identifier,\n value: v.value,\n type: v.type,\n // add externalscored, a fixed prop to the test, so the testcontext can read and decide how to score this item\n ...(v.type === 'outcome' && v.identifier === 'SCORE'\n ? { externalScored: (v as OutcomeVariable).externalScored }\n : {})\n }));\n }\n\n public set variables(value: VariableValue<string | string[] | null>[]) {\n if (!Array.isArray(value) || value.some(v => !('identifier' in v))) {\n console.warn('variables property should be an array of VariableDeclaration');\n return;\n }\n this._context = {\n ...this._context,\n variables: this._context.variables.map(variable => {\n const matchingValue = value.find(v => v.identifier === variable.identifier);\n if (matchingValue) {\n return {\n ...variable,\n ...matchingValue,\n interpolationTable: (variable as OutcomeVariable).interpolationTable\n };\n }\n return variable;\n })\n };\n\n this._context.variables.forEach(variable => {\n if (variable.type === 'response') {\n const interactionElement = this._interactionElements.find(\n (el: Interaction) => el.responseIdentifier === variable.identifier\n );\n if (interactionElement) {\n interactionElement.response = variable.value as string | string[];\n }\n }\n });\n\n this.variables.forEach(variable => {\n if (variable.type === 'outcome') {\n this._feedbackElements.forEach(fe => fe.checkShowFeedback(variable.identifier));\n }\n });\n }\n\n private _initialContext: Readonly<ItemContext> = { ...this._context, variables: this._context.variables };\n private _feedbackElements: QtiFeedback[] = [];\n private _interactionElements: Interaction[] = [];\n\n /** @deprecated use variables property instead */\n set responses(myResponses: ResponseInteraction[]) {\n if (myResponses) {\n for (const response of myResponses) {\n const responseVariable = this.getResponse(response.responseIdentifier);\n if (responseVariable) {\n this.updateResponseVariable(response.responseIdentifier, response.response);\n }\n\n const interaction: Interaction | undefined = this._interactionElements.find(\n i => i.getAttribute('response-identifier') === response.responseIdentifier\n );\n if (interaction) {\n interaction.response = response.response;\n }\n }\n }\n }\n\n override render() {\n return html`<slot></slot>`;\n }\n\n connectedCallback(): void {\n this._attachEventListeners();\n super.connectedCallback();\n this.updateComplete.then(() => {\n this.dispatchEvent(\n new CustomEvent<QtiAssessmentItem>('qti-assessment-item-connected', {\n bubbles: true,\n composed: true,\n detail: this\n })\n );\n });\n }\n\n disconnectedCallback(): void {\n this._removeEventListeners();\n super.disconnectedCallback();\n }\n\n private _attachEventListeners() {\n this.addEventListener('qti-register-variable', this._handleRegisterVariable);\n this.addEventListener('qti-register-feedback', this._handleRegisterFeedback);\n this.addEventListener('qti-register-interaction', this._handleRegisterInteraction);\n this.addEventListener('end-attempt', this._handleEndAttempt);\n this.addEventListener('qti-set-outcome-value', this._handleSetOutcomeValue);\n this.addEventListener('qti-interaction-response', this._handleUpdateResponseVariable);\n }\n\n private _removeEventListeners() {\n this.removeEventListener('qti-register-variable', this._handleRegisterVariable);\n this.removeEventListener('qti-register-feedback', this._handleRegisterFeedback);\n this.removeEventListener('qti-register-interaction', this._handleRegisterInteraction);\n this.removeEventListener('end-attempt', this._handleEndAttempt);\n this.removeEventListener('qti-set-outcome-value', this._handleSetOutcomeValue);\n this.removeEventListener('qti-interaction-response', this._handleUpdateResponseVariable);\n }\n\n private _handleRegisterVariable = (e: QtiRegisterVariable) => {\n e.stopImmediatePropagation();\n this._context = { ...this._context, variables: [...this._context.variables, e.detail.variable] };\n this._initialContext = this._context;\n e.stopPropagation();\n };\n\n private _handleRegisterFeedback = (e: CustomEvent<QtiFeedback>) => {\n e.stopImmediatePropagation();\n const feedbackElement = e.detail;\n this._feedbackElements.push(feedbackElement);\n const numAttempts = Number(this._context.variables.find(v => v.identifier === 'numAttempts')?.value) || 0;\n if (numAttempts > 0) {\n feedbackElement.checkShowFeedback(feedbackElement.outcomeIdentifier);\n }\n };\n\n private _handleRegisterInteraction = (e: CustomEvent<{ interaction: string; interactionElement: Interaction }>) => {\n e.stopImmediatePropagation();\n this._interactionElements.push(e.detail.interactionElement);\n };\n\n private _handleEndAttempt = (e: CustomEvent<{ responseIdentifier: string; countAttempt: boolean }>) => {\n e.stopImmediatePropagation();\n const { responseIdentifier, countAttempt } = e.detail;\n this.validate();\n this.updateResponseVariable(responseIdentifier, 'true');\n this.processResponse(countAttempt);\n };\n\n private _handleSetOutcomeValue = (e: CustomEvent<{ outcomeIdentifier: string; value: string | string[] }>) => {\n e.stopImmediatePropagation();\n const { outcomeIdentifier, value } = e.detail;\n this.updateOutcomeVariable(outcomeIdentifier, value);\n e.stopPropagation();\n };\n\n private _handleUpdateResponseVariable = (e: CustomEvent<ResponseInteraction>) => {\n e.stopImmediatePropagation();\n\n const { responseIdentifier, response } = e.detail;\n this.updateResponseVariable(responseIdentifier, response);\n\n this.dispatchEvent(\n new CustomEvent<{ itemContext: ItemContext }>('qti-item-context-updated', {\n bubbles: true,\n composed: true,\n detail: { itemContext: this._context }\n })\n );\n };\n\n /**\n * Toggles the display of correct responses for all interactions.\n * @param show - A boolean indicating whether to show or hide correct responses.\n */\n public showCorrectResponse(show: boolean): void {\n // Get all response variables\n const responseVariables = this._context.variables.filter(v => v.type === 'response') as ResponseVariable[];\n\n // Iterate through all interaction elements\n for (const interaction of this._interactionElements) {\n // Get the response identifier for this interaction\n const responseIdentifier = interaction.getAttribute('response-identifier');\n\n // Find the matching response variable for this interaction\n const responseVariable = responseVariables.find(v => v.identifier === responseIdentifier);\n\n // If we found a matching response variable, toggle the correct response\n if (responseVariable) {\n interaction.toggleCorrectResponse(responseVariable, show);\n }\n }\n }\n\n public processResponse(countNumAttempts = true, reportValidityAfterScoring = true): boolean {\n this.validate(reportValidityAfterScoring);\n\n if (countNumAttempts) {\n this.updateOutcomeVariable(\n 'numAttempts',\n (+this._context.variables.find(v => v.identifier === 'numAttempts')?.value + 1).toString()\n );\n }\n\n const responseProcessor = this.querySelector<QtiResponseProcessing>('qti-response-processing');\n if (!responseProcessor) {\n // console.info('Client side response processing template not available');\n return false;\n }\n\n if (!responseProcessor.process) {\n // console.info('Client side response webcomponents not available');\n return false;\n }\n\n responseProcessor.process();\n\n if (this.adaptive === 'false') {\n // if adaptive, completionStatus is set by the processing template\n this.updateOutcomeVariable('completionStatus', this._getCompletionStatus());\n }\n\n this.dispatchEvent(\n new CustomEvent<{ itemContext: ItemContext }>('qti-item-context-updated', {\n bubbles: true,\n composed: true,\n detail: { itemContext: this._context }\n })\n );\n\n return true;\n }\n\n public resetResponses() {\n this._context = this._initialContext;\n }\n\n protected getResponse(identifier: string): Readonly<ResponseVariable> {\n return this.getVariable(identifier) as ResponseVariable;\n }\n\n protected getOutcome(identifier: string): Readonly<OutcomeVariable> {\n return this.getVariable(identifier) as OutcomeVariable;\n }\n\n protected getVariable(identifier: string): Readonly<VariableDeclaration<string | string[] | null>> {\n return this._context.variables.find(v => v.identifier === identifier) || null;\n }\n\n // saving privates here: ------------------------------------------------------------------------------\n\n /**\n * Updates the response variable with the specified identifier to the given value.\n *\n * @protected\n *\n * This method is intended for internal use within the class and subclasses.\n * It should not be called externally by third parties.\n *\n * @param identifier - The identifier of the response variable to update.\n * @param value - The new value for the response variable.\n */\n public updateResponseVariable(identifier: string, value: string | string[] | undefined) {\n this._context = {\n ...this._context,\n variables: this._context.variables.map(v => (v.identifier !== identifier ? v : { ...v, value: value }))\n };\n\n this.dispatchEvent(\n new CustomEvent<InteractionChangedDetails>('qti-interaction-changed', {\n bubbles: true,\n composed: true,\n detail: {\n item: this.identifier,\n responseIdentifier: identifier,\n response: Array.isArray(value) ? [...value] : value\n }\n })\n );\n\n if (this.adaptive === 'false') {\n // if adapative, completionStatus is set by the processing template\n this.updateOutcomeVariable('completionStatus', this._getCompletionStatus());\n }\n }\n\n public setOutcomeVariable(identifier: string, value: string | string[] | undefined) {\n this.updateOutcomeVariable(identifier, value);\n this.dispatchEvent(\n new CustomEvent<{ itemContext: ItemContext }>('qti-item-context-updated', {\n bubbles: true,\n composed: true,\n detail: { itemContext: this._context }\n })\n );\n }\n\n /**\n * Updates the outcome variable with the specified identifier to the given value.\n *\n * @protected\n *\n * This method is intended for internal use within the class and subclasses.\n * It should not be called externally by third parties.\n *\n * @param identifier - The identifier of the response variable to update.\n * @param value - The new value for the response variable.\n */\n public updateOutcomeVariable(identifier: string, value: string | string[] | undefined) {\n const outcomeVariable = this.getOutcome(identifier);\n\n if (!outcomeVariable) {\n console.warn(`Can not set qti-outcome-identifier: ${identifier}, it is not available`);\n return;\n }\n\n this._context = {\n ...this._context,\n variables: this._context.variables.map(v => {\n if (v.identifier !== identifier) {\n return v;\n }\n return {\n ...v,\n value: outcomeVariable.cardinality === 'single' ? value : [...v.value, value as string]\n };\n })\n };\n this._feedbackElements.forEach(fe => fe.checkShowFeedback(identifier));\n\n this.dispatchEvent(\n new CustomEvent<OutcomeChangedDetails>('qti-outcome-changed', {\n bubbles: true,\n composed: true,\n detail: {\n item: this.identifier,\n outcomeIdentifier: identifier,\n value: this._context.variables.find(v => v.identifier === identifier)?.value\n }\n })\n );\n }\n\n public validate(reportValidity = true): boolean | null {\n if (this._interactionElements.every(interactionElement => interactionElement.validate())) return true;\n if (this._interactionElements.some(interactionElement => interactionElement.validate())) return false;\n if (reportValidity) this.reportValidity();\n return null;\n }\n\n public reportValidity() {\n for (const interactionElement of this._interactionElements) {\n interactionElement.reportValidity();\n }\n }\n\n private _getCompletionStatus(): 'completed' | 'incomplete' | 'not_attempted' | 'unknown' {\n const valid = this.validate(false);\n if (valid === true) return 'completed';\n if (valid === false) return 'incomplete';\n return 'not_attempted';\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-assessment-item': QtiAssessmentItem;\n }\n}\n","import { LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport { qtiTransformItem } from '../../qti-transformers';\n\n/**\n * Represents a custom element for referencing an assessment stimulus.\n */\n@customElement('qti-assessment-stimulus-ref')\nexport class QtiAssessmentStimulusRef extends LitElement {\n /**\n * The identifier of the stimulus.\n */\n @property({ type: String }) identifier = '';\n\n /**\n * The href of the stimulus.\n */\n @property({ type: String }) href = '';\n\n /**\n * Lifecycle method called when the element is connected to the DOM.\n * Loads and appends the stimulus if the 'qti-assessment-stimulus-ref-connected' event is not prevented.\n */\n public async connectedCallback(): Promise<void> {\n super.connectedCallback();\n\n const event = new Event('qti-assessment-stimulus-ref-connected', {\n cancelable: true,\n bubbles: true,\n composed: true\n });\n const isNotPrevented = this.dispatchEvent(event);\n\n if (isNotPrevented) {\n const item = this.closest('qti-assessment-item');\n\n const stimulusRef = item.querySelector(`[data-stimulus-idref=${this.identifier}]`);\n if (stimulusRef) {\n await this.updateStimulusRef(stimulusRef);\n } else {\n console.warn(`Stimulus with data-stimulus-idref ${this.identifier} not found`);\n }\n }\n }\n\n /**\n * Loads and appends the stimulus to the specified element.\n * @param stimulusRef - The element to which the stimulus will be appended.\n */\n public async updateStimulusRef(stimulusRef: Element) {\n const stimulus = await qtiTransformItem()\n .load(this.href)\n .promise.then(api => api.htmlDoc());\n if (stimulus) {\n const elements = stimulus.querySelectorAll('qti-stimulus-body, qti-stylesheet');\n stimulusRef.innerHTML = '';\n stimulusRef.append(...elements);\n }\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-assessment-stimulus-ref': QtiAssessmentStimulusRef;\n }\n}\n","import { LitElement } from 'lit';\nimport { customElement } from 'lit/decorators.js';\n\n@customElement('qti-companion-materials-info')\nexport class QtiCompanionMaterialsInfo extends LitElement {\n // static override styles = css`\n // slot {\n // display: hidden;\n // }\n // `;\n // override render() {\n // return html` <slot></slot> `;\n // }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-companion-materials-info': QtiCompanionMaterialsInfo;\n }\n}\n","import { consume } from '@lit/context';\nimport { LitElement, html } from 'lit';\nimport { customElement, state } from 'lit/decorators.js';\n\nimport { itemContext } from '../../exports/qti-assessment-item.context';\n\nimport type { Calculate } from '../../exports/expression-result';\nimport type { ResponseVariable } from '../../exports/variables';\nimport type { ItemContext } from '../../exports/item.context';\n\n/**\n * https://www.imsglobal.org/spec/qti/v3p0/impl#h.fi29q8dubjgw\n * <qti-custom-operator class=\"js.org\">\n <qti-base-value base-type=\"string\"><![CDATA[\n console.log(context.variables);\n return 'B'\n document.querySelector('qti-end-attempt-interaction').disabled = true;\n ]]></qti-base-value>\n </qti-custom-operator>\n </qti-set-outcome-value>\n */\n@customElement('qti-custom-operator')\nexport class QtiCustomOperator extends LitElement implements Calculate {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n private operatorFunction: Function;\n\n @consume({ context: itemContext, subscribe: true })\n @state()\n private _context?: ItemContext;\n\n render() {\n return html`<slot @slotchange=${this.handleSlotChange}></slot>`;\n }\n\n handleSlotChange() {\n // expecting <[!CDATA[ ... ]]> is converted into <!-- ... --> with qti-transform: cDataToComment\n const commentNode = Array.from(this.firstElementChild?.childNodes ?? []).find(\n node => node.nodeType === Node.COMMENT_NODE\n );\n try {\n this.operatorFunction = new Function('context', 'fn', 'item', commentNode?.textContent ?? '');\n } catch (e) {\n console.error('custom-operator contains invalid javascript code', e);\n }\n }\n\n public calculate() {\n const fn = {\n variable: (responseIdentifier: string) =>\n this._context?.variables.find(v => v.identifier === responseIdentifier)?.value ?? '',\n correct: (responseIdentifier: string) =>\n (this._context?.variables.find(v => v.identifier === responseIdentifier) as ResponseVariable)\n ?.correctResponse ?? ''\n };\n const item = {\n getVariable: (variableIdentifier: string) =>\n this._context?.variables.find(v => v.identifier === variableIdentifier),\n updateOutcomeVariable: (outcomeIdentifier: string, value: string | string[]) => {\n this.dispatchEvent(\n new CustomEvent<{ outcomeIdentifier: string; value: string | string[] }>('qti-set-outcome-value', {\n bubbles: true,\n composed: true,\n detail: {\n outcomeIdentifier,\n value\n }\n })\n );\n },\n updateResponseVariable: (responseIdentifier: string, response: string | string[]) => {\n this.dispatchEvent(\n new CustomEvent<{ responseIdentifier: string; response: string | string[] }>('qti-interaction-response', {\n bubbles: true,\n composed: true,\n detail: {\n responseIdentifier,\n response\n }\n })\n );\n }\n };\n\n return this.operatorFunction(this._context, fn, item);\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-custom-operator': QtiCustomOperator;\n }\n}\n","import { css, html } from 'lit';\nimport { customElement } from 'lit/decorators.js';\n\nimport { QtiFeedback } from '../qti-feedback';\n\n@customElement('qti-feedback-block')\nexport class QtiFeedbackBlock extends QtiFeedback {\n static override styles = css`\n :host {\n display: block;\n }\n .on {\n display: block;\n }\n .off {\n display: none;\n }\n `;\n\n override render() {\n return html` <slot part=\"feedback\" class=\"feedback ${this.showStatus}\"></slot> `;\n }\n\n public connectedCallback(): void {\n super.connectedCallback();\n this.checkShowFeedback(this.outcomeIdentifier);\n }\n}\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-feedback-block': QtiFeedbackBlock;\n }\n}\n","import { consume } from '@lit/context';\nimport { LitElement } from 'lit';\nimport { property, state } from 'lit/decorators.js';\n\nimport { IsNullOrUndefined } from '../internal/utils';\nimport { itemContext } from '../../exports/qti-assessment-item.context';\n\nimport type { ItemContext } from '../../exports/item.context';\n\nexport abstract class QtiFeedback extends LitElement {\n @property({ type: String, attribute: 'show-hide' })\n protected showHide: string;\n\n @property({ type: String, attribute: 'outcome-identifier' })\n public outcomeIdentifier: string;\n\n @property({ type: String })\n protected identifier: string;\n\n @property({ type: String, attribute: false })\n public showStatus: string;\n\n @consume({ context: itemContext, subscribe: true })\n @state()\n private _context?: ItemContext;\n\n public override connectedCallback() {\n super.connectedCallback();\n this.dispatchEvent(\n new CustomEvent<QtiFeedback>('qti-register-feedback', {\n bubbles: true,\n composed: true,\n detail: this\n })\n );\n }\n\n public checkShowFeedback(outcomeIdentifier: string) {\n const outcomeVariable = this._context.variables.find(v => v.identifier === outcomeIdentifier) || null;\n if (this.outcomeIdentifier !== outcomeIdentifier || !outcomeVariable) return;\n let isFound = false;\n if (Array.isArray(outcomeVariable.value)) {\n isFound = outcomeVariable.value.includes(this.identifier);\n } else {\n isFound =\n (!IsNullOrUndefined(this.identifier) &&\n !IsNullOrUndefined(outcomeVariable?.value) &&\n this.identifier === outcomeVariable.value) ||\n false;\n }\n\n this.showFeedback(isFound);\n }\n\n private showFeedback(value: boolean) {\n this.showStatus = (value && this.showHide === 'show') || (!value && this.showHide === 'hide') ? 'on' : 'off';\n }\n}\n","export const decimalSeparator = () => {\n return new Intl.NumberFormat().format(0.1).replace(/\\d/g, '');\n};\n\nexport const convertNumberToUniversalFormat = (number: number | string) => {\n // check if type is string\n if (typeof number === 'string') {\n return number;\n }\n const dSep = decimalSeparator();\n if (dSep === '.') {\n return number.toLocaleString();\n } else {\n return number.toString().replace('.', '').replace(dSep, '.');\n }\n};\n\nexport function IsNullOrUndefined(value: unknown) {\n return value === null || value === undefined;\n}\n\nexport function removeDoubleSlashes(str: string) {\n const singleForwardSlashes = str\n .replace(/([^:]\\/)\\/+/g, '$1')\n .replace(/\\/\\//g, '/')\n .replace('http:/', 'http://')\n .replace('https:/', 'https://');\n return singleForwardSlashes;\n}\n","import { css, html } from 'lit';\nimport { customElement } from 'lit/decorators.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\n\nimport { QtiFeedback } from '../qti-feedback';\n\n@customElement('qti-feedback-inline')\nexport class QtiFeedbackInline extends QtiFeedback {\n static override styles = css`\n .on {\n display: inline-block;\n }\n .off {\n display: none;\n }\n `;\n\n override render = () => html` <slot part=\"feedback\" class=\"${ifDefined(this.showStatus)}\"></slot> `;\n\n public connectedCallback(): void {\n super.connectedCallback();\n this.checkShowFeedback(this.outcomeIdentifier);\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-feedback-inline': QtiFeedbackInline;\n }\n}\n","import { css, html } from 'lit';\nimport { customElement } from 'lit/decorators.js';\n\nimport { QtiFeedback } from '../qti-feedback';\n\n@customElement('qti-modal-feedback')\nexport class QtiModalFeedback extends QtiFeedback {\n static override styles = css`\n .qti-dialog {\n background: var(--qti-bg);\n border: var(--qti-border-thickness) var(--qti-border-style) var(--qti-border-color);\n border-radius: var(--qti-border-radius);\n padding: var(--qti-padding-vertical) var(--qti-padding-horizontal);\n box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n z-index: 1000;\n width: auto;\n max-width: 90%;\n }\n\n .button {\n border-radius: var(--qti-border-radius);\n padding: var(--qti-padding-vertical) var(--qti-padding-horizontal);\n background-color: var(--qti-bg-active);\n border: var(--qti-border-active);\n cursor: pointer;\n position: relative;\n display: inline-block;\n }\n\n .button:hover {\n background-color: var(--qti-hover-bg);\n }\n\n .button:disabled {\n background-color: var(--qti-disabled-bg);\n color: var(--qti-disabled-color);\n cursor: not-allowed;\n }\n\n .button:focus {\n outline: var(--qti-focus-border-width) solid var(--qti-focus-color);\n }\n `;\n\n override render() {\n return html`\n <dialog class=\"qti-dialog\" part=\"feedback\" ?open=\"${this.showStatus === 'on'}\">\n <slot></slot>\n <div style=\"margin-top: var(--qti-gap-size); text-align: center;\">\n <button class=\"button close-button\" @click=\"${this.closeFeedback}\">Close</button>\n </div>\n </dialog>\n `;\n }\n\n openFeedback() {\n const dialog = this.shadowRoot?.querySelector('dialog') as HTMLDialogElement | null;\n if (dialog && !dialog.open) {\n dialog.showModal();\n }\n }\n\n closeFeedback() {\n const dialog = this.shadowRoot?.querySelector('dialog') as HTMLDialogElement | null;\n if (dialog && dialog.open) {\n dialog.close();\n this.showStatus = 'off';\n }\n }\n\n public connectedCallback(): void {\n super.connectedCallback();\n if (this.showStatus === 'on') {\n this.openFeedback();\n }\n }\n\n protected updated(changedProperties: Map<string | number | symbol, unknown>): void {\n if (changedProperties.has('showStatus')) {\n if (this.showStatus === 'on') {\n this.openFeedback();\n } else {\n this.closeFeedback();\n }\n }\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-modal-feedback': QtiModalFeedback;\n }\n}\n","import { LitElement, css, html } from 'lit';\nimport { customElement } from 'lit/decorators.js';\n\n@customElement('qti-associable-hotspot')\nexport class QtiAssociableHotspot extends LitElement {\n static styles = css`\n :host {\n display: flex;\n user-select: none;\n position: absolute;\n }\n `;\n\n override connectedCallback() {\n super.connectedCallback();\n this.dispatchEvent(\n new CustomEvent('qti-register-hotspot', {\n bubbles: true,\n composed: true,\n cancelable: false\n })\n );\n }\n\n override render() {\n return html` <slot name=\"drags\"></slot> `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-associable-hotspot': QtiAssociableHotspot;\n }\n}\n","import { html } from 'lit';\nimport { customElement, state } from 'lit/decorators.js';\n\nimport { DragDropInteractionMixin } from '../internal/drag-drop';\nimport styles from './qti-associate-interaction.styles';\nimport { Interaction } from '../../../exports/interaction';\n\nimport type { QtiSimpleAssociableChoice } from '../qti-simple-associable-choice';\nimport type { CSSResultGroup } from 'lit';\n\n@customElement('qti-associate-interaction')\nexport class QtiAssociateInteraction extends DragDropInteractionMixin(\n Interaction,\n 'qti-simple-associable-choice',\n '.dl',\n `slot[name='qti-simple-associable-choice']`\n) {\n static styles: CSSResultGroup = styles;\n @state() protected _childrenMap: Element[] = [];\n\n protected _registerChoiceHandler: (event: CustomEvent) => void;\n\n constructor() {\n super();\n this._registerChoiceHandler = this._registerChoice.bind(this);\n this.addEventListener('register-qti-simple-associable-choice', this._registerChoiceHandler);\n }\n\n protected _registerChoice(event: CustomEvent) {\n const choice = event.target as QtiSimpleAssociableChoice;\n this._childrenMap.push(choice);\n }\n\n override render() {\n return html` <slot name=\"prompt\"></slot>\n <slot name=\"qti-simple-associable-choice\"></slot>\n <div part=\"drop-container\">\n ${this._childrenMap.length > 0 &&\n Array.from(Array(Math.ceil(this._childrenMap.length / 2)).keys()).map(\n (_, index) =>\n html`<div part=\"associables-container\">\n <div name=\"left${index}\" part=\"drop-list\" class=\"dl\" identifier=\"droplist${index}_left\"></div>\n <div name=\"right${index}\" part=\"drop-list\" class=\"dl\" identifier=\"droplist${index}_right\"></div>\n </div>`\n )}\n\n <div role=\"alert\" id=\"validationMessage\"></div>\n </div>`;\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.removeEventListener('register-qti-simple-associable-choice', this._registerChoiceHandler);\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-associate-interaction': QtiAssociateInteraction;\n }\n}\n","import { property } from 'lit/decorators.js';\n\nimport { FlippablesMixin } from './flippables-mixin';\nimport { liveQuery } from '../../../../decorators/live-query';\n\nimport type { Interaction } from '../../../../exports/interaction';\nimport type { IInteraction } from '../../../../exports/interaction.interface';\n\ntype Constructor<T = {}> = abstract new (...args: any[]) => T;\n\ninterface InteractionConfiguration {\n copyStylesDragClone: boolean;\n dragCanBePlacedBack: boolean;\n dragOnClick: boolean;\n}\n\nexport const DragDropInteractionMixin = <T extends Constructor<Interaction>>(\n superClass: T,\n draggablesSelector: string,\n droppablesSelector: string,\n dragContainersSelector: string\n) => {\n abstract class DragDropInteractionElement extends FlippablesMixin(\n superClass,\n droppablesSelector,\n draggablesSelector\n ) {\n // protected draggables = new Map<HTMLElement, { parent: HTMLElement; index: number }>();\n private observer: MutationObserver | null = null;\n private droppableObsever: MutationObserver | null = null;\n private resizeObserver: ResizeObserver | null = null;\n private draggables: HTMLElement[] = [];\n private droppables: HTMLElement[] = [];\n private dragContainers: HTMLElement[] = [];\n private dragClone: HTMLElement = null; // Clone of drag source for visual feedback\n private dragSource: HTMLElement = null; // The source element being dragged\n\n private touchStartPoint = null; // Point of the first touch\n private isDraggable = false; // Whether a draggable element is active\n private cloneOffset = { x: 0, y: 0 }; // Offset for positioning the drag clone\n private isDragging = false; // Whether a drag operation is ongoing\n private allDropzones: HTMLElement[] = []; // All dropzones for keyboard navigation\n private lastTarget = null; // Last touch target\n private currentDropTarget = null; // Current droppable element\n\n private readonly MIN_DRAG_DISTANCE = 5; // Minimum pixel movement to start dragging\n private readonly DRAG_CLONE_OPACITY = 1; // Opacity of the drag clone element\n\n private dataTransfer = {\n data: {},\n setData(type, val) {\n this.data[type] = val;\n },\n getData(type) {\n return this.data[type];\n },\n effectAllowed: 'move'\n };\n\n @property({ attribute: false, type: Object }) protected configuration: InteractionConfiguration = {\n copyStylesDragClone: true,\n dragCanBePlacedBack: true,\n dragOnClick: false\n };\n @property({ type: Number, reflect: true, attribute: 'min-associations' }) minAssociations = 1;\n @property({ type: Number, reflect: true, attribute: 'max-associations' }) maxAssociations = 0;\n\n @liveQuery(dragContainersSelector)\n handleDraggableContainerChange(dragContainersAdded: HTMLElement[], dragContainersRemoved: HTMLElement[]) {\n if (this.isMatchTabular()) return;\n\n if (dragContainersAdded.length > 0 || dragContainersRemoved.length > 0) {\n this.dragContainersModified(dragContainersAdded || [], dragContainersRemoved || []);\n }\n }\n\n dragContainersModified(addedDragContainers: HTMLElement[], removedDragContainers: HTMLElement[]) {\n for (const removedContainer of removedDragContainers) {\n if (this.dragContainers.includes(removedContainer)) {\n this.dragContainers = this.dragContainers.filter(container => container !== removedContainer);\n this.allDropzones = this.allDropzones.filter(dropzone => dropzone !== removedContainer);\n }\n }\n for (const dragContainer of addedDragContainers) {\n if (!this.dragContainers.includes(dragContainer)) {\n this.dragContainers.push(dragContainer);\n this.allDropzones.push(dragContainer);\n }\n }\n }\n\n @liveQuery(draggablesSelector)\n handleDraggablesChange(dragsAdded: HTMLElement[], dragsRemoved: HTMLElement[]) {\n if (this.isMatchTabular()) return;\n if (dragsAdded.length > 0 || dragsRemoved.length > 0) {\n this.draggablesModified(dragsAdded || [], dragsRemoved || []);\n }\n }\n\n @liveQuery(droppablesSelector)\n handleDroppablesChange(dropsAdded: HTMLElement[], dropsRemoved: HTMLElement[]) {\n if (this.isMatchTabular()) return;\n if (dropsAdded.length > 0 || dropsRemoved.length > 0) {\n this.droppablesModified(dropsAdded || [], dropsRemoved || []);\n }\n }\n\n override firstUpdated(changedProps): void {\n super.firstUpdated(changedProps);\n const disabled = this.hasAttribute('disabled');\n if (!disabled) {\n document.addEventListener('touchmove', this.handleTouchMove.bind(this), { passive: false });\n document.addEventListener('mousemove', this.handleTouchMove.bind(this), { passive: false });\n document.addEventListener('touchend', this.handleTouchEnd.bind(this), { passive: false });\n document.addEventListener('mouseup', this.handleTouchEnd.bind(this), { passive: false });\n document.addEventListener('touchcancel', this.handleTouchCancel.bind(this), { passive: false });\n }\n const draggables = Array.from(this.querySelectorAll(draggablesSelector) || []).concat(\n Array.from(this.shadowRoot?.querySelectorAll(draggablesSelector) || [])\n ) as HTMLElement[];\n const droppables = Array.from(this.querySelectorAll(droppablesSelector) || []).concat(\n Array.from(this.shadowRoot?.querySelectorAll(droppablesSelector) || [])\n ) as HTMLElement[];\n const dragContainers = Array.from(this.querySelectorAll(dragContainersSelector) || []).concat(\n Array.from(this.shadowRoot?.querySelectorAll(dragContainersSelector) || [])\n ) as HTMLElement[];\n this.dragContainersModified(dragContainers, []);\n this.droppablesModified(droppables, []);\n this.draggablesModified(draggables, []);\n\n this.updateMinDimensionsForDropZones();\n\n // MutationObserver to observe changes in childrd elements\n this.observer = new MutationObserver(() => this.updateMinDimensionsForDropZones());\n this.observer.observe(this, { childList: true, subtree: true });\n\n // ResizeObserver to monitor size changes of `gapTexts`\n this.resizeObserver = new ResizeObserver(() => this.updateMinDimensionsForDropZones());\n const gapTexts = this.querySelectorAll('qti-gap-text');\n gapTexts.forEach(gapText => this.resizeObserver?.observe(gapText));\n }\n\n private draggablesModified = (addedDraggables: HTMLElement[], removedDraggables: HTMLElement[]) => {\n for (const removedDraggable of removedDraggables) {\n if (this.draggables.includes(removedDraggable)) {\n this.draggables = this.draggables.filter(draggable => draggable !== removedDraggable);\n removedDraggable.removeAttribute('tabindex');\n removedDraggable.removeEventListener('touchstart', this.handleTouchStart.bind(this));\n removedDraggable.removeEventListener('mousedown', this.handleTouchStart.bind(this));\n }\n }\n for (const draggable of addedDraggables) {\n if (!this.draggables.includes(draggable)) {\n this.draggables.push(draggable);\n // draggables.forEach(el => {\n draggable.setAttribute('tabindex', '0'); // Make draggable elements focusable\n if (!(draggable as any).hasTouchStartListener) {\n // Prevent adding multiple listeners\n draggable.addEventListener('touchstart', this.handleTouchStart.bind(this), { passive: false });\n draggable.addEventListener('mousedown', this.handleTouchStart.bind(this), { passive: false });\n (draggable as any).hasTouchStartListener = true;\n }\n // });\n }\n }\n let index = 0;\n this.draggables.forEach(draggable => {\n draggable.style.viewTransitionName = `drag-${index}-${this.getAttribute('identifier') || crypto.randomUUID()}`;\n draggable.setAttribute('qti-draggable', 'true');\n index++;\n });\n };\n\n private droppablesModified = (addedDroppables: HTMLElement[], removedDroppables: HTMLElement[]) => {\n for (const removedDroppable of removedDroppables) {\n if (this.droppables.includes(removedDroppable)) {\n this.droppables = this.droppables.filter(droppable => droppable !== removedDroppable);\n this.allDropzones = this.allDropzones.filter(dropzone => dropzone !== removedDroppable);\n }\n }\n for (const droppable of addedDroppables) {\n if (!this.droppables.includes(droppable)) {\n this.droppables.push(droppable);\n this.allDropzones.push(droppable);\n }\n }\n for (const droppable of this.droppables) {\n if (this.dataset.choicesContainerWidth) {\n droppable.style.width = `${this.dataset.choicesContainerWidth}px`;\n droppable.style.boxSizing = `border-box`;\n }\n }\n };\n\n private async moveDraggableToDroppable(draggable: HTMLElement, droppable: HTMLElement): Promise<void> {\n // console.log(`moveDraggableToDroppable, draggable: ${draggable.tagName}, droppable: ${droppable.tagName}`);\n const moveElement = (): void => {\n draggable.style.transform = 'translate(0, 0)';\n if (droppable.tagName === 'SLOT') {\n draggable.setAttribute('slot', droppable.getAttribute('name'));\n } else {\n droppable.appendChild(draggable);\n }\n this.checkAllMaxAssociations();\n this.saveResponse(); //\n };\n // if (!document.startViewTransition) {\n moveElement();\n return;\n // }\n\n // const transition = document.startViewTransition(moveElement);\n // await transition.finished;\n }\n\n private activateDroppable(droppable: HTMLElement): void {\n if (this.dragContainers.includes(droppable)) {\n this._internals.states.add('--dragzone-active');\n droppable.setAttribute('active', '');\n } else {\n this._internals.states.delete('--dragzone-active');\n droppable.setAttribute('active', '');\n }\n }\n\n private deactivateDroppable(droppable: HTMLElement, makeDragzoneActive = true): void {\n if (makeDragzoneActive) {\n this._internals.states.add('--dragzone-active');\n }\n droppable.removeAttribute('active');\n }\n\n override connectedCallback() {\n super.connectedCallback();\n }\n\n private isMatchTabular(): boolean {\n return this.classList.contains('qti-match-tabular');\n }\n\n private updateMinDimensionsForDropZones() {\n const gapTexts = this.querySelectorAll(draggablesSelector);\n const gaps = Array.from(this.querySelectorAll(droppablesSelector)).map(d => d as HTMLElement);\n let maxHeight = 0;\n let maxWidth = 0;\n gapTexts.forEach(gapText => {\n const rect = gapText.getBoundingClientRect();\n maxHeight = Math.max(maxHeight, rect.height);\n maxWidth = Math.max(maxWidth, rect.width);\n });\n\n const dragContainer =\n (this.querySelector(dragContainersSelector) as HTMLElement) ||\n (this.shadowRoot?.querySelector(dragContainersSelector) as HTMLElement);\n\n if (dragContainer) {\n dragContainer.style.minHeight = `${maxHeight}px`;\n dragContainer.style.minWidth = `${maxWidth}px`;\n }\n for (const gap of gaps) {\n gap.style.minHeight = `${maxHeight}px`;\n gap.style.minWidth = `${maxWidth}px`;\n }\n }\n\n private activateDroppables(target: HTMLElement): void {\n const dragContainers = this.dragContainers;\n dragContainers.forEach(d => {\n d.setAttribute('enabled', '');\n if (d.hasAttribute('disabled')) {\n if (d.contains(target) || (d.shadowRoot && d.shadowRoot.contains(target))) {\n d.removeAttribute('disabled');\n }\n }\n });\n this.droppables.forEach(d => {\n d.setAttribute('enabled', '');\n if (d.hasAttribute('disabled')) {\n if (d.contains(target) || (d.shadowRoot && d.shadowRoot.contains(target))) {\n d.removeAttribute('disabled');\n }\n }\n });\n }\n\n private activateDragLocation(): void {\n this._internals.states.add('--dragzone-enabled');\n }\n\n private deactivateDragLocation(): void {\n this._internals.states.delete('--dragzone-enabled');\n }\n\n private deactivateDroppables(): void {\n const dragContainers = this.dragContainers;\n dragContainers.forEach(d => {\n d.removeAttribute('enabled');\n d.removeAttribute('active');\n });\n this.droppables.forEach(d => {\n d.removeAttribute('enabled');\n d.removeAttribute('active');\n });\n }\n override disconnectedCallback() {\n super.disconnectedCallback();\n\n // Cleanup MutationObserver\n if (this.observer) {\n this.observer.disconnect();\n this.observer = null;\n }\n\n if (this.droppableObsever) {\n this.droppableObsever.disconnect();\n this.droppableObsever = null;\n }\n\n // Cleanup ResizeObserver\n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n this.resizeObserver = null;\n }\n\n // Remove global event listeners\n document.removeEventListener('touchmove', this.handleTouchMove);\n document.removeEventListener('mousemove', this.handleTouchMove);\n document.removeEventListener('touchend', this.handleTouchEnd);\n document.removeEventListener('mouseup', this.handleTouchEnd);\n document.removeEventListener('touchcancel', this.handleTouchCancel);\n }\n\n private handleTouchMove(e) {\n if (this.isDraggable && this.dragClone) {\n const { x, y } = this.getEventCoordinates(e);\n const currentTouch = { clientX: x, clientY: y };\n\n // Check if the minimum drag distance has been reached\n if (this.calculateDragDistance(currentTouch) >= this.MIN_DRAG_DISTANCE) {\n this.isDragging = true;\n this.updateDragClonePosition(currentTouch);\n }\n\n // Find the closest dropzone to the current drag clone position\n const closestDropzone = this.findClosestDropzone();\n this.currentDropTarget = closestDropzone;\n\n // Handle dragenter and dragleave\n if (closestDropzone !== this.lastTarget) {\n if (this.lastTarget) {\n // Simulate dragleave for the previous target\n this.deactivateDroppable(this.lastTarget);\n this.dispatchCustomEvent(this.lastTarget, 'dragleave');\n }\n if (closestDropzone) {\n // Simulate dragenter for the new target\n this.activateDroppable(closestDropzone);\n this.dispatchCustomEvent(closestDropzone, 'dragenter');\n }\n this.lastTarget = closestDropzone;\n }\n\n // Simulate dragover for the current dropzone\n if (this.currentDropTarget) {\n this.dispatchCustomEvent(this.currentDropTarget, 'dragover');\n }\n\n e.preventDefault();\n }\n }\n\n private handleTouchEnd(e) {\n if (this.isDragging) {\n this.resetDragState();\n }\n this._internals.states.delete('--dragzone-active');\n this.checkAllMaxAssociations();\n\n this._internals.states.delete('--dragzone-enabled');\n this._internals.states.delete('--dragzone-active');\n this.deactivateDragLocation();\n this.deactivateDroppables();\n this.draggables.forEach(d => {\n d.removeAttribute('dragging');\n });\n e.preventDefault();\n }\n\n private handleTouchCancel(_e) {\n this.resetDragState();\n }\n\n validate(): boolean {\n if (!this.shadowRoot) return false;\n const validAssociations = this.getValidAssociations();\n let isValid = true;\n let validityMessage = '';\n\n if (this.maxAssociations > 0 && validAssociations > this.maxAssociations) {\n isValid = false;\n validityMessage =\n this.dataset.maxSelectionsMessage ||\n `You've selected too many associations. Maximum allowed is ${this.maxAssociations}.`;\n } else if (this.minAssociations > 0 && validAssociations < this.minAssociations) {\n isValid = false;\n validityMessage =\n this.dataset.minSelectionsMessage ||\n `You haven't selected enough associations. Minimum required is ${this.minAssociations}.`;\n }\n const lastElementChild = this.lastElementChild as HTMLElement;\n // Use null for the third argument if no specific anchor is needed\n this._internals.setValidity(isValid ? {} : { customError: true }, validityMessage, lastElementChild);\n return isValid;\n }\n\n override reportValidity(): boolean {\n const validationMessageElement = this.shadowRoot.querySelector('#validationMessage') as HTMLElement;\n if (validationMessageElement) {\n if (!this._internals.validity.valid) {\n validationMessageElement.textContent = this._internals.validationMessage;\n validationMessageElement.style.display = 'block';\n } else {\n validationMessageElement.textContent = '';\n validationMessageElement.style.display = 'none';\n }\n }\n return this._internals.validity.valid;\n }\n\n private checkMaxAssociations(droppable: HTMLElement): boolean {\n const maxMatch = this.getMatchMaxValue(droppable);\n const currentAssociations = droppable.querySelectorAll('[qti-draggable=\"true\"]').length;\n const unlimitedAssociations = maxMatch === 0;\n return !unlimitedAssociations && currentAssociations >= maxMatch;\n }\n\n private dropDraggableInDroppable(draggable: HTMLElement, droppable: HTMLElement): void {\n // Create a clean clone of the original draggable without computed styles\n const cleanClone = draggable.cloneNode(true) as HTMLElement;\n cleanClone.removeAttribute('style'); // Remove inline styles from the clone\n // Place the clean clone into the drop target\n this.moveDraggableToDroppable(cleanClone, droppable);\n // this.currentDropTarget.appendChild(cleanClone);\n this.draggablesModified([cleanClone], []);\n\n // check if max associations are reached\n const matchMax = this.getMatchMaxValue(draggable);\n const currentDraggables = this.draggables.filter(\n d => d.getAttribute('identifier') === draggable.getAttribute('identifier')\n );\n if (matchMax !== 0 && currentDraggables.length >= matchMax) {\n draggable.style.opacity = '0.0';\n draggable.style.pointerEvents = 'none';\n } else {\n draggable.style.opacity = '1.0';\n }\n }\n\n private resetDragState() {\n if (this.dragClone) {\n const isDropped = this.currentDropTarget !== null;\n const droppedInDragContainer = !isDropped || this.dragContainers.includes(this.currentDropTarget);\n if (isDropped && this.currentDropTarget && !droppedInDragContainer) {\n this.dropDraggableInDroppable(this.dragSource, this.currentDropTarget);\n }\n if (droppedInDragContainer) {\n this.dragSource.style.opacity = '1.0';\n this.dragSource.style.display = 'block';\n this.dragSource.style.position = 'static';\n this.dragSource.style.pointerEvents = 'auto';\n this.saveResponse();\n }\n this.dragClone.remove();\n this.draggablesModified([], [this.dragClone]);\n }\n\n this.isDragging = false;\n this.isDraggable = false;\n this.dragSource = null;\n this.dragClone = null;\n this.touchStartPoint = null;\n this.currentDropTarget = null;\n this.lastTarget = null;\n\n this.deactivateDroppables();\n }\n\n protected checkAllMaxAssociations(): void {\n const currentAssociations = this.getValidAssociations();\n const maxAssociationsInterationReached =\n this.maxAssociations !== 0 && currentAssociations >= this.maxAssociations;\n this.droppables.forEach(d => {\n if (maxAssociationsInterationReached) {\n this.disableDroppable(d);\n } else {\n const maxAssociationsReached = this.checkMaxAssociations(d);\n if (maxAssociationsReached) {\n this.disableDroppable(d);\n } else {\n this.enableDroppable(d);\n }\n }\n });\n }\n\n private getMatchMaxValue(el: HTMLElement): number {\n const matchMaxRawValue = el.getAttribute('match-max');\n return matchMaxRawValue ? parseInt(matchMaxRawValue, 10) : 1;\n }\n\n private disableDroppable(droppable: Element): void {\n droppable.setAttribute('disabled', '');\n }\n\n private enableDroppable(droppable: Element): void {\n droppable.removeAttribute('disabled');\n }\n\n get response(): string {\n let response: string[];\n if (typeof (this as any).getResponse === 'function') {\n // only for the qti-order-interaction, abstracted this away in a method\n response = (this as any).getResponse(); // Call the method from the implementing class\n } else {\n response = this.collectResponseData();\n }\n return response.join(',');\n }\n\n set response(value: string | null) {\n if (this.isMatchTabular()) return;\n // Assuming this.value is an array of strings\n\n if (typeof (this as any).getValue === 'function') {\n // only for the qti-order-interaction, abstracted this away in a method\n value = (this as any).getValue(value); // Call the method from the implementing class\n }\n\n if (Array.isArray(value)) {\n this.reset(false);\n\n value?.forEach(entry => this.placeResponse(entry));\n const formData = new FormData();\n value.forEach(response => {\n formData.append(this.responseIdentifier, response);\n });\n this._internals.setFormValue(formData);\n } else {\n // Handle the case where this.value is not an array\n this._internals.setFormValue(value || '');\n }\n }\n\n private placeResponse(response: string): void {\n const [dropId, ...dragIds] = response.split(' ').reverse();\n\n const draggableArray = Array.from(this.draggables);\n const droppableArray = Array.from(this.droppables);\n\n dragIds.forEach(dragId => {\n if (dragId === '') return; // in the case of a qti-order-interaction this is necessary, ['drag0','drag1','','drag2'] there can be empty placeholders\n const draggable = draggableArray.find(d => d.getAttribute('identifier') === dragId);\n const droppable = droppableArray.find(d => d.getAttribute('identifier') === dropId);\n this.dropDraggableInDroppable(draggable, droppable);\n });\n }\n\n private getValidAssociations(): number {\n let count = 0;\n for (const droppable of this.droppables) {\n count = count + this.getDraggablesFromDroppable(droppable).length;\n }\n return count;\n }\n\n public saveResponse(): void {\n let response: string | string[];\n if (typeof (this as any).getResponse === 'function') {\n // only for the qti-order-interaction, abstracted this away in a method\n response = (this as any).getResponse(); // Call the method from the implementing class\n } else {\n response = this.collectResponseData();\n }\n this.dispatchEvent(\n new CustomEvent('qti-interaction-response', {\n bubbles: true,\n composed: true,\n detail: {\n responseIdentifier: this.responseIdentifier,\n response\n }\n })\n );\n }\n\n private collectResponseData(): string[] {\n const response = this.droppables\n .map(droppable => {\n const draggablesInDroppable = this.getDraggablesFromDroppable(droppable);\n const identifiers = draggablesInDroppable.map(d => d.getAttribute('identifier'));\n const droppableIdentifier = droppable.getAttribute('identifier');\n return identifiers.map(id => `${id} ${droppableIdentifier}`);\n })\n .flat();\n return response;\n }\n\n private getDraggablesFromDroppable(droppable: HTMLElement): HTMLElement[] {\n const uniqueDraggableIds = this.draggables\n .map(d => d.getAttribute('identifier'))\n .filter((v, i, a) => a.indexOf(v) === i);\n\n const draggables = uniqueDraggableIds\n .flatMap(d => Array.from(droppable.querySelectorAll(`[identifier='${d}']`)))\n .filter(d => !!d)\n .map(d => d as HTMLElement);\n return draggables;\n }\n\n reset(save = true): void {\n // Remove all draggables from droppables\n this.droppables.forEach(droppable => {\n const draggables = this.getDraggablesFromDroppable(droppable);\n draggables.forEach((draggable: HTMLElement) => {\n draggable.remove();\n this.draggablesModified([], [draggable]);\n });\n });\n this.dragContainers.forEach(dragContainer => {\n const draggables = Array.from(dragContainer.querySelectorAll('[qti-draggable=\"true\"]')) as HTMLElement[];\n draggables.forEach(draggable => {\n draggable.style.opacity = '1.0';\n });\n });\n\n // Reset dragClone, dragSource, and related states\n this.dragClone = null;\n this.dragSource = null;\n this.isDragging = false;\n this.isDraggable = false;\n this.currentDropTarget = null;\n this.lastTarget = null;\n\n // Optionally save the reset state\n if (save) {\n this.saveResponse();\n }\n }\n\n private updateDragClonePosition(touch) {\n if (!this.isDragging || !this.dragClone) return;\n\n const newLeft = touch.clientX - this.cloneOffset.x;\n const newTop = touch.clientY - this.cloneOffset.y;\n\n // Apply boundaries specific to the interaction element\n const { newLeft: boundedLeft, newTop: boundedTop } = this.applyInteractionBoundaries(\n newLeft,\n newTop,\n this.dragClone\n );\n\n this.dragClone.style.left = `${boundedLeft}px`;\n this.dragClone.style.top = `${boundedTop}px`;\n }\n\n private applyInteractionBoundaries(newLeft: number, newTop: number, element: HTMLElement) {\n // Get the interaction element's boundaries\n const interactionRect = this.getBoundingClientRect();\n const elementRect = element.getBoundingClientRect();\n const elementWidth = elementRect.width;\n const elementHeight = elementRect.height;\n\n // Constrain the position to the interaction's boundaries\n const boundedLeft = Math.max(interactionRect.left, Math.min(newLeft, interactionRect.right - elementWidth));\n const boundedTop = Math.max(interactionRect.top, Math.min(newTop, interactionRect.bottom - elementHeight));\n\n return { newLeft: boundedLeft, newTop: boundedTop };\n }\n\n private getEventCoordinates(event, page = false) {\n const touch = event.touches ? event.touches[0] : event;\n return {\n x: page ? touch.pageX : touch.clientX,\n y: page ? touch.pageY : touch.clientY\n };\n }\n\n private calculateDragDistance(touch): number {\n const xDist = Math.abs(touch.clientX - this.touchStartPoint.x);\n const yDist = Math.abs(touch.clientY - this.touchStartPoint.y);\n return xDist + yDist;\n }\n\n private findClosestDropzone(): HTMLElement | null {\n const allActiveDropzones = this.allDropzones.filter(d => !d.hasAttribute('disabled'));\n if (!this.dragClone || allActiveDropzones.length === 0) return null;\n\n const dragRect = this.dragClone.getBoundingClientRect();\n let closestDropzone: HTMLElement | null = null;\n let maxOverlapArea = 0;\n\n for (const dropzone of allActiveDropzones) {\n const dropRect = dropzone.getBoundingClientRect();\n const overlapArea = this.calculateOverlapArea(dragRect, dropRect);\n\n if (overlapArea > maxOverlapArea) {\n maxOverlapArea = overlapArea;\n closestDropzone = dropzone;\n }\n }\n // if none was find using this method, try to find the closest dropzone by distance\n if (!closestDropzone) {\n let minDistance = 200; // arbitrary large number could be max too: number.MAX_VALUE;\n for (const dropzone of allActiveDropzones) {\n const dropRect = dropzone.getBoundingClientRect();\n const distance = Math.sqrt(\n Math.pow(dragRect.left - dropRect.left, 2) + Math.pow(dragRect.top - dropRect.top, 2)\n );\n if (distance < minDistance) {\n minDistance = distance;\n closestDropzone = dropzone;\n }\n }\n }\n\n return closestDropzone;\n }\n\n private calculateOverlapArea(rect1: DOMRect, rect2: DOMRect): number {\n const xOverlap = Math.max(0, Math.min(rect1.right, rect2.right) - Math.max(rect1.left, rect2.left));\n const yOverlap = Math.max(0, Math.min(rect1.bottom, rect2.bottom) - Math.max(rect1.top, rect2.top));\n return xOverlap * yOverlap;\n }\n\n private dispatchCustomEvent(element, eventType, bubble = true) {\n if (!element) return;\n const event = new CustomEvent(eventType, { bubbles: bubble, cancelable: true });\n event['dataTransfer'] = this.dataTransfer;\n element.dispatchEvent(event);\n }\n\n private appendClone() {\n document.body.appendChild(this.dragClone);\n }\n\n private handleTouchStart(e) {\n if (this.isDragging) {\n return;\n }\n const { x, y } = this.getEventCoordinates(e);\n this.touchStartPoint = { x, y };\n this.dragSource = e.currentTarget;\n this.isDraggable = true;\n\n this._internals.states.add('--dragzone-enabled');\n this._internals.states.add('--dragzone-active');\n\n this.activateDragLocation();\n this.activateDroppables(this.dragSource);\n\n // Create and position the drag clone\n const draggableInDragContainer = this.findDraggableInDraggableContainer(\n this.dragSource.getAttribute('identifier')\n );\n\n // clone the element if it is not in a dropzone\n const draggedFromDropzone = this.droppables.some(d =>\n Array.from(d.children).some(child => child === this.dragSource)\n );\n const rect = this.dragSource.getBoundingClientRect();\n if (draggedFromDropzone) {\n this.dragSource.remove();\n this.draggablesModified([], [this.dragSource]);\n this.dragSource = draggableInDragContainer;\n }\n\n this.cloneOffset.x = x - rect.left;\n this.cloneOffset.y = y - rect.top;\n this.dragClone = draggableInDragContainer.cloneNode(true) as HTMLElement;\n\n // Copy computed styles to the clone\n const computedStyles = window.getComputedStyle(draggableInDragContainer);\n for (let i = 0; i < computedStyles.length; i++) {\n const key = computedStyles[i];\n this.dragClone.style.setProperty(key, computedStyles.getPropertyValue(key));\n }\n const rectOrg = draggableInDragContainer.getBoundingClientRect();\n this.dragClone.style.width = `${rectOrg.width}px`;\n this.dragClone.style.height = `${rectOrg.height}px`;\n if (rect) {\n this.setDragCloneStyles(rect);\n }\n this.dragClone.style.display = 'block';\n this.dragClone.style.opacity = '1';\n this.appendClone();\n\n // check if max associations are reached\n const matchMax = this.getMatchMaxValue(this.dragSource);\n const currentDraggables = this.draggables.filter(\n d => d.getAttribute('identifier') === this.dragSource.getAttribute('identifier')\n );\n if (matchMax !== 0 && currentDraggables.length >= matchMax) {\n draggableInDragContainer.style.opacity = '0.0';\n draggableInDragContainer.style.pointerEvents = 'none';\n } else {\n draggableInDragContainer.style.opacity = '1.0';\n }\n e.preventDefault();\n this.dragClone.setAttribute('dragging', '');\n }\n\n private findDraggableInDraggableContainer(identifier: string): HTMLElement | undefined {\n // Flatten all drag containers\n const allDragContainers = this.dragContainers.flat();\n // Iterate through each drag container\n for (const container of allDragContainers) {\n // Check if the container itself has the identifier\n if (container.getAttribute('identifier') === identifier) {\n // Return the container itself if it matches\n return container;\n }\n // If the container is a slot element, get assigned elements\n let elements: HTMLElement[];\n // Check if the container is a slot element\n if (container instanceof HTMLSlotElement) {\n // If it's a slot, get the assigned elements\n elements = Array.from(container?.assignedElements() || []) as HTMLElement[];\n } else {\n // Otherwise, query the container using draggablesSelector\n elements = Array.from(container.querySelectorAll(draggablesSelector)) as HTMLElement[];\n }\n // Search for a matching child element inside the container\n const foundElement = elements.find(e => e.getAttribute('identifier') === identifier);\n\n // If a matching element is found, return it\n if (foundElement) {\n return foundElement;\n }\n }\n // Return undefined if no matching element is found\n return undefined;\n }\n\n private setDragCloneStyles(rect: DOMRect) {\n this.dragClone.style.position = 'fixed';\n this.dragClone.style.top = `${rect.top}px`;\n this.dragClone.style.left = `${rect.left}px`;\n this.dragClone.style.setProperty('box-sizing', 'border-box', 'important');\n this.dragClone.style.zIndex = '9999';\n this.dragClone.style.pointerEvents = 'none';\n this.dragClone.style.opacity = this.DRAG_CLONE_OPACITY.toString();\n this.dragClone.style.display = 'block';\n }\n }\n\n return DragDropInteractionElement as Constructor<IInteraction> & T;\n};\n","// THIS IS A MIXIN, THIS IS A MIXIN\n// USE LIKE THIS\n// ```class DropList extends Flippables(LitElement) {```\n// mixin which animates children with FLIP\n// a combination between this directive:\n// https://ng-run.com/edit/9MGr5dYWA20AiJtpy5az?open=app%2Fapp.component.html\n// and a tutorial how to make a mixin\n// https://lit.dev/docs/composition/mixins/\n\nimport type { Interaction } from '../../../../exports/interaction';\n\ntype Constructor<T = {}> = abstract new (...args: any[]) => T;\n\nexport declare class FlippablesInterface {\n connectedCallback(): void;\n disconnectedCallback(): void;\n}\n\n// just a conversion of a angular FLIP directive, made as a Mixin\n// https://ng-run.com/edit/9MGr5dYWA20AiJtpy5az?open=app%2Fapp.component.html\nexport const FlippablesMixin = <T extends Constructor<Interaction>>(\n superClass: T,\n _droppablesSel: string,\n _draggablesSel: string\n) => {\n abstract class FlippablesElement extends superClass {\n // private state = new Map<Element, any>();\n // private observer: MutationObserver;\n // flippablesSelector: string;\n // override async firstUpdated(changedProps) {\n // await this.updateComplete; // pk: this is the key to calculate correct proportions\n // const draggables = Array.from(this.querySelectorAll(draggablesSel));\n // draggables.forEach((elem) => {\n // const { left, top, width, height } = elem.getBoundingClientRect();\n // this.state.set(elem, { left, top, width, height });\n // });\n // this.observer = new MutationObserver(this.animateMe);\n // const droppables = Array.from(this.querySelectorAll(droppablesSel));\n // droppables.forEach((draggable) => {\n // this.observer.observe(draggable, { childList: true });\n // });\n // this.observer.observe(this, { childList: true });\n // super.firstUpdated(changedProps);\n // }\n // private animateMe = () => {\n // this.state.forEach((value, elem) => {\n // const { left, top, width, height } = elem.getBoundingClientRect();\n // if (this.state.get(elem) == null) {\n // this.state.set(elem, { left, top, width, height });\n // }\n // const cache = this.state.get(elem);\n // const deltaX = cache.left - left;\n // const deltaY = cache.top - top;\n // const deltaW = cache.width / width;\n // const deltaH = cache.height / height;\n // this.state.set(elem, { left, top, width, height });\n // const { duration, easing } = { duration: 350, easing: 'cubic-bezier(0.26, 0.86, 0.44, 0.985)' };\n // elem.animate(\n // [\n // {\n // transformOrigin: 'top left',\n // transform: `\n // translate(${deltaX}px, ${deltaY}px)\n // scale(${deltaW}, ${deltaH})\n // `,\n // // width: cache.width,\n // // height: cache.height+ 'px',\n // // opacity: cache.opacity,\n // },\n // {\n // transformOrigin: 'top left',\n // transform: 'none',\n // },\n // ],\n // {\n // duration,\n // easing,\n // }\n // );\n // });\n // };\n // override disconnectedCallback(): void {\n // super.disconnectedCallback();\n // this.observer.disconnect();\n // }\n }\n return FlippablesElement as Constructor<FlippablesInterface> & T;\n};\n","import { css } from 'lit';\n\nexport default css`\n :host {\n display: block; /* necessary to calculate scaling position */\n }\n slot[name='qti-simple-associable-choice'] {\n display: flex;\n align-items: flex-start;\n flex: 1;\n border: 2px solid transparent;\n padding: 0.3rem;\n border-radius: 0.3rem;\n gap: 0.5rem;\n }\n\n :host::part(associables-container) {\n display: flex;\n padding: 0.5rem;\n justify-content: space-between;\n background: linear-gradient(\n 180deg,\n rgb(0 0 0 / 0%) calc(50% - 1px),\n var(--qti-border-color-gray) calc(50%),\n rgb(0 0 0 / 0%) calc(50% + 1px)\n );\n }\n`;\n","import { html } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport { ChoicesMixin } from '../internal/choices/choices.mixin';\nimport { VocabularyMixin } from '../internal/vocabulary/vocabulary-mixin';\nimport styles from './qti-choice-interaction.styles';\nimport { Interaction } from '../../../exports/interaction';\n\nimport type { ChoicesInterface } from '../internal/choices/choices.mixin';\nimport type { CSSResultGroup } from 'lit';\n\nexport type Orientation = 'horizontal' | 'vertical' | undefined;\n\n@customElement('qti-choice-interaction')\nexport class QtiChoiceInteraction\n extends VocabularyMixin(ChoicesMixin(Interaction, 'qti-simple-choice'), 'qti-simple-choice')\n implements ChoicesInterface\n{\n static styles: CSSResultGroup = styles;\n\n /** @deprecated, use 'qti-orientation-horizontal' or 'qti-orientation-vertical' instead */\n @property({ type: String })\n public orientation: Orientation = 'vertical';\n\n private _handleSlotChange() {\n // count the number of choices, set a css variable for the number of choices\n const choices = this.querySelectorAll('qti-simple-choice');\n this.style.setProperty('--item-count', choices.length.toString());\n }\n\n render() {\n return html`\n <slot part=\"prompt\" name=\"prompt\"></slot><slot part=\"slot\" @slotchange=${this._handleSlotChange}></slot>\n <div part=\"message\" role=\"alert\" id=\"validationMessage\"></div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-choice-interaction': QtiChoiceInteraction;\n }\n}\n","import { property, query, state } from 'lit/decorators.js';\n\nimport { watch } from '../../../../decorators/watch';\n\nimport type { ResponseVariable } from '../../../../exports/variables';\nimport type { ChoiceInterface } from '../active-element/active-element.mixin';\nimport type { Interaction } from '../../../../exports/interaction';\nimport type { IInteraction } from '../../../../exports/interaction.interface';\n\ntype Constructor<T = {}> = abstract new (...args: any[]) => T;\n\nexport type Choice = HTMLElement & ChoiceInterface & { internals: ElementInternals };\n\nexport interface ChoicesInterface extends IInteraction {\n minChoices: number;\n maxChoices: number;\n value: string | null;\n response: string | string[] | null;\n toggleCorrectResponse(responseVariable: ResponseVariable, show: boolean): void;\n validate(): boolean;\n reportValidity(): boolean;\n}\n\nexport const ChoicesMixin = <T extends Constructor<Interaction>>(superClass: T, selector: string) => {\n abstract class ChoicesMixinElement extends superClass implements ChoicesInterface {\n protected _choiceElements: Choice[] = [];\n\n @query('#validationMessage')\n protected _validationMessageElement!: HTMLElement;\n\n @property({ type: Number, attribute: 'min-choices' })\n public minChoices = 0;\n\n @property({ type: Number, attribute: 'max-choices' })\n public maxChoices = 1;\n\n @watch('maxChoices', { waitUntilFirstUpdate: true })\n protected _handleMaxChoicesChange(_oldValue: number, _newValue: number) {\n this._determineInputType();\n }\n\n @watch('disabled', { waitUntilFirstUpdate: true })\n protected _handleDisabledChange = (_: boolean, disabled: boolean) => {\n this._choiceElements.forEach(ch => (ch.disabled = disabled));\n };\n\n @watch('readonly', { waitUntilFirstUpdate: true })\n protected _handleReadonlyChange = (_: boolean, readonly: boolean) => {\n this._choiceElements.forEach(choice => (choice.readonly = readonly));\n };\n\n @state() response: string | string[] | null = '';\n\n @watch('response', { waitUntilFirstUpdate: true })\n protected _handleValueChange = () => {\n this._internals.setFormValue(this.value);\n this._updateChoiceSelection();\n };\n\n get value(): string | null {\n if (Array.isArray(this.response) && this.response.length === 0) {\n return null;\n } else if (this.response === '') {\n return null;\n }\n return Array.isArray(this.response) ? this.response.join(',') : this.response;\n }\n\n set value(val: string | null) {\n if (this.maxChoices > 1 && (typeof val === 'string' || val === null)) {\n this.response = !val ? [] : val.toString().split(',');\n } else {\n this.response = val || '';\n }\n }\n\n public toggleCorrectResponse(responseVariable: ResponseVariable, show: boolean) {\n if (responseVariable.correctResponse) {\n const responseArray = Array.isArray(responseVariable.correctResponse)\n ? responseVariable.correctResponse\n : [responseVariable.correctResponse];\n this._choiceElements.forEach(choice => {\n choice.internals.states.delete('correct-response');\n choice.internals.states.delete('incorrect-response');\n if (show && responseArray.length > 0) {\n if (responseArray.includes(choice.identifier)) {\n choice.internals.states.add('correct-response');\n } else {\n choice.internals.states.add('incorrect-response');\n }\n }\n });\n }\n }\n\n override connectedCallback() {\n super.connectedCallback();\n this.addEventListener(`register-${selector}`, this._registerChoiceElement);\n this.addEventListener(`unregister-${selector}`, this._unregisterChoiceElement);\n this.addEventListener(`activate-${selector}`, this._choiceElementSelectedHandler);\n }\n\n override disconnectedCallback() {\n super.disconnectedCallback();\n this.removeEventListener(`register-${selector}`, this._registerChoiceElement);\n this.removeEventListener(`unregister-${selector}`, this._unregisterChoiceElement);\n this.removeEventListener(`activate-${selector}`, this._choiceElementSelectedHandler);\n }\n\n public validate(): boolean {\n const selectedChoices = this._choiceElements.filter(choice => this._getChoiceChecked(choice));\n const selectedCount = selectedChoices.length;\n let isValid = true;\n let validityMessage = '';\n if (this.maxChoices !== 0 && selectedCount > this.maxChoices) {\n isValid = false;\n validityMessage =\n this.dataset.maxSelectionsMessage ||\n `Please select no more than ${this.maxChoices} ${this.maxChoices === 1 ? 'option' : 'options'}.`;\n } else if (selectedCount < this.minChoices) {\n isValid = false;\n validityMessage =\n this.dataset.minSelectionsMessage ||\n `Please select at least ${this.minChoices} ${this.minChoices === 1 ? 'option' : 'options'}.`;\n }\n\n if (selectedChoices.length > 0) {\n this._internals.setValidity(\n isValid ? {} : { customError: true },\n validityMessage,\n selectedChoices[selectedCount - 1] || this._choiceElements[0] || this\n );\n }\n return isValid;\n }\n\n override reportValidity() {\n if (this._validationMessageElement) {\n if (!this._internals.validity.valid) {\n this._validationMessageElement.textContent = this._internals.validationMessage;\n this._validationMessageElement.style.display = 'block';\n } else {\n this._validationMessageElement.textContent = '';\n this._validationMessageElement.style.display = 'none';\n }\n }\n return this._internals.validity.valid;\n }\n\n protected _registerChoiceElement(event: CustomEvent) {\n event.stopPropagation();\n const choiceElement = event.target as Choice;\n choiceElement.disabled = this.disabled;\n\n this._choiceElements.push(choiceElement);\n this._setInputType(choiceElement);\n }\n\n protected _unregisterChoiceElement(event: CustomEvent) {\n event.stopPropagation();\n const choiceElement = event.target as Choice;\n this._choiceElements = this._choiceElements.filter(choice => choice !== choiceElement);\n }\n\n protected _determineInputType() {\n this._choiceElements.forEach(choice => {\n this._setInputType(choice);\n });\n }\n\n protected _setInputType(choiceElement: Choice) {\n this._internals.role = this.maxChoices === 1 ? 'radiogroup' : null;\n\n const role = this.maxChoices === 1 ? 'radio' : 'checkbox';\n choiceElement.internals.role = role;\n choiceElement.internals.states.delete(role === 'radio' ? 'checkbox' : 'radio');\n choiceElement.internals.states.add(role);\n }\n\n protected _choiceElementSelectedHandler(event: CustomEvent<{ identifier: string }>) {\n this._toggleChoiceChecked(event.target as Choice);\n if (this.maxChoices === 1) {\n this._choiceElements.forEach(choice => {\n if (choice.identifier !== event.detail.identifier) {\n this._setChoiceChecked(choice, false);\n }\n });\n }\n this._handleChoiceSelection();\n }\n\n protected _setChoiceChecked(choice: Choice, checked: boolean) {\n if (choice.internals?.states) {\n if (checked) {\n choice.internals.states.add('--checked');\n choice.internals.ariaChecked = 'true';\n } else {\n choice.internals.states.delete('--checked');\n choice.internals.ariaChecked = 'false';\n }\n }\n }\n\n protected _getChoiceChecked(choice: Choice): boolean {\n return choice.internals.states.has('--checked');\n }\n\n protected _toggleChoiceChecked(choice: Choice) {\n const checked = this._getChoiceChecked(choice);\n this._setChoiceChecked(choice, !checked);\n }\n\n protected _handleChoiceSelection() {\n const selectedChoices = this._choiceElements.filter(choice => this._getChoiceChecked(choice));\n const selectedIdentifiers = selectedChoices.map(choice => choice.identifier);\n\n this.response = this.maxChoices === 1 ? selectedIdentifiers[0] || '' : selectedIdentifiers;\n\n this.validate();\n this.saveResponse(this.response);\n }\n\n /**\n * Updates the selection state of each choice element based on the current response.\n */\n protected _updateChoiceSelection() {\n const responseArray = Array.isArray(this.response) ? this.response : [this.response];\n this._choiceElements.forEach(choice => {\n const isSelected = responseArray.includes(choice.identifier);\n this._setChoiceChecked(choice, isSelected);\n });\n }\n }\n return ChoicesMixinElement as Constructor<ChoicesInterface> & T;\n};\n","import { property } from 'lit/decorators.js';\n\nimport type { Interaction } from '../../../../exports/interaction';\nimport type { PropertyValues } from 'lit';\nimport type { QtiSimpleChoice } from '../../qti-simple-choice';\n\ntype Constructor<T = {}> = abstract new (...args: any[]) => T;\n\ntype LabelType = 'qti-labels-decimal' | 'qti-labels-lower-alpha' | 'qti-labels-upper-alpha';\ntype LabelSuffixType = 'qti-labels-suffix-period' | 'qti-labels-suffix-parenthesis';\n\ndeclare class VocabularyInterface {}\n\nexport const VocabularyMixin = <T extends Constructor<Interaction>>(superClass: T, _selector: string) => {\n abstract class VocabularyElement extends superClass {\n private _classes: string[] = [];\n private _allLabels = ['qti-labels-decimal', 'qti-labels-lower-alpha', 'qti-labels-upper-alpha'];\n private _allLabelSuffixes = ['qti-labels-suffix-period', 'qti-labels-suffix-parenthesis'] as LabelSuffixType[];\n // Define the property with the custom converter\n @property({\n type: String,\n reflect: true\n })\n set class(value: string) {\n if (!value) {\n return;\n }\n // const oldValue = this._classes.join(' ');\n this._classes = value.split(' ');\n\n this._addLabels();\n // this.requestUpdate('class', oldValue);\n }\n get class(): string {\n return this._classes?.join(' ') || '';\n }\n\n protected override updated(_changedProperties: PropertyValues): void {\n super.updated(_changedProperties);\n // if (_changedProperties.has('shuffle')) {\n this._addLabels();\n // }\n }\n\n private _addLabels() {\n const classContainsLabel = this._classes.some(\n cls => this._allLabels.includes(cls) || this._allLabelSuffixes.includes(cls as LabelSuffixType)\n );\n const isNumber = value => {\n return !isNaN(+value);\n };\n if (classContainsLabel) {\n const choiceElements = Array.from(this.querySelectorAll('qti-simple-choice')).map(c => c as QtiSimpleChoice);\n const choices = choiceElements\n .map((choice: HTMLElement, index) => {\n return { el: choice, order: isNumber(choice.style.order) ? +choice.style.order : index + 1 };\n })\n .sort((a, b) => a.order - b.order)\n .map(choice => choice.el);\n for (let i = 0; i < choices.length; i++) {\n (choices[i] as QtiSimpleChoice).marker = this._getLabel(i + 1);\n }\n }\n }\n private _getLabel(index: number) {\n let lastLabel = this._classes.filter(c => this._allLabels.includes(c)).pop() as LabelType;\n const lastLabelSuffix = this._classes.filter(c => this._allLabelSuffixes.includes(c as LabelSuffixType)).pop();\n\n if (!lastLabel && lastLabelSuffix) {\n // a suffix without a label is strange so add qti-labels-upper-alpha\n lastLabel = 'qti-labels-upper-alpha';\n }\n let label = '';\n switch (lastLabel) {\n case 'qti-labels-decimal':\n label = `${index}`;\n break;\n case 'qti-labels-lower-alpha':\n label = `${String.fromCharCode(97 + index - 1)}`;\n break;\n case 'qti-labels-upper-alpha':\n label = `${String.fromCharCode(65 + index - 1)}`;\n break;\n }\n if (lastLabelSuffix === 'qti-labels-suffix-period') {\n label += '.';\n } else if (lastLabelSuffix === 'qti-labels-suffix-parenthesis') {\n label += `)`;\n }\n return label;\n }\n }\n return VocabularyElement as Constructor<VocabularyInterface> & T;\n};\n","import { css } from 'lit';\n\nexport default css`\n :host {\n display: block;\n }\n\n [part='slot'] {\n display: grid;\n gap: 10px;\n }\n\n /* Define the number of columns dynamically */\n :host([class*='qti-choices-stacking-']) [part='slot'] {\n grid-template-columns: repeat(var(--stacking-count, 1), 1fr);\n }\n\n /* Apply dynamic stacking count based on class */\n :host(.qti-choices-stacking-1) {\n --stacking-count: 1;\n }\n :host(.qti-choices-stacking-2) {\n --stacking-count: 2;\n }\n :host(.qti-choices-stacking-3) {\n --stacking-count: 3;\n }\n :host(.qti-choices-stacking-4) {\n --stacking-count: 4;\n }\n :host(.qti-choices-stacking-5) {\n --stacking-count: 5;\n }\n :host(.qti-choices-stacking-6) {\n --stacking-count: 6;\n }\n\n /* Default slot item layout */\n ::slotted(qti-simple-choice) {\n display: flex;\n align-items: center;\n white-space: normal;\n }\n\n /* Orientation styles */\n :host(.qti-orientation-horizontal) [part='slot'] {\n grid-auto-flow: dense column;\n grid-auto-columns: 1fr;\n }\n\n :host(.qti-orientation-vertical) [part='slot'] {\n grid-auto-flow: row;\n }\n\n /* Vertical and horizontal stacking logic */\n :host(.qti-orientation-vertical[class*='qti-choices-stacking-']) [part='slot'] {\n grid-auto-flow: dense column;\n grid-auto-columns: 1fr;\n grid-template-columns: repeat(var(--stacking-count), 1fr);\n grid-template-rows: repeat(calc(var(--item-count) / var(--stacking-count)), 1fr);\n }\n\n :host(.qti-orientation-horizontal[class*='qti-choices-stacking-']) [part='slot'] {\n grid-auto-flow: row;\n grid-template-columns: repeat(var(--stacking-count), 1fr);\n grid-template-rows: unset;\n }\n\n /* Ensure even distribution in vertical mode */\n :host(.qti-orientation-vertical) ::slotted(qti-simple-choice:nth-child(even)) {\n grid-row: auto;\n }\n`;\n\n// export default css`\n// [part='slot'] {\n// display: flex;\n// flex-direction: column;\n// gap: var(--qti-gap-size);\n// flex-wrap: wrap;\n// }\n\n// ::slotted(qti-simple-choice) {\n// flex: 0 0\n// calc((100% - (var(--qti-gap-size) * var(--choice-interactions-stacking))) / var(--choice-interactions-stacking)) !important;\n// box-sizing: border-box !important;\n// }\n\n// :host(.qti-choices-stacking-1) [part='slot'] {\n// flex-direction: row;\n// --choice-interactions-stacking: 1;\n// }\n\n// :host(.qti-choices-stacking-2) [part='slot'] {\n// flex-direction: row;\n// --choice-interactions-stacking: 2;\n// }\n// :host(.qti-choices-stacking-3) [part='slot'] {\n// flex-direction: row;\n// --choice-interactions-stacking: 3;\n// }\n// :host(.qti-choices-stacking-4) [part='slot'] {\n// flex-direction: row;\n// --choice-interactions-stacking: 4;\n// }\n// :host(.qti-choices-stacking-5) [part='slot'] {\n// flex-direction: row;\n// --choice-interactions-stacking: 5;\n// }\n// :host([orientation='horizontal']) [part='slot'] {\n// flex-direction: row;\n// }\n\n// :host(.qti-orientation-horizontal) [part='slot'] {\n// flex-direction: row;\n// flex-wrap: nowrap;\n// }\n\n// :host(.qti-orientation-horizontal) ::slotted(qti-simple-choice) {\n// flex: 1 1 auto !important;\n// }\n// `;\n","import { html } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport { Interaction } from '../../../exports/interaction';\nimport { removeDoubleSlashes } from '../../internal/utils';\n\n@customElement('qti-custom-interaction')\nexport class QtiCustomInteraction extends Interaction {\n // This custom-interaction support the CES API which is use in FACET\n //\n // It works like this:\n // 1. The CI manifest is fetched\n // 2. An iframe is created and the first style and first script from the manifest are loaded\n // 3. The first script is bootstrap.js which also creates an iframe and loads the first media from the manifest\n // 4. Communication is done via the CES API but because the iframe is not allowed to access the global CES object we need to use window.postMessage\n\n // To achieve this we change the package by replacing the bootstrap.js with our own and inject a proxy CES API that communicates via postMessage\n // Because we also want to run this in storybook, we cannot use window.top because to send messages there, because in case of storybook that is not the top window.\n // So we send messages to all parent windows\n private rawResponse: string;\n\n constructor() {\n super();\n this.handlePostMessage = this.handlePostMessage.bind(this);\n }\n\n @property({ type: String, attribute: 'data' })\n data: string;\n\n @property({ type: String, attribute: 'data-base-item' })\n baseItemUrl: string;\n\n @property({ type: String, attribute: 'data-base-ref' })\n baseRefUrl: string;\n\n @property({ type: String, attribute: 'id' })\n id: string;\n\n @state()\n private _errorMessage: string = null;\n manifest: {\n script: string[];\n style: string[];\n media: string[];\n };\n\n override connectedCallback(): void {\n super.connectedCallback();\n const uriToManifest =\n this.data.startsWith('http') || this.data.startsWith('blob')\n ? this.data\n : removeDoubleSlashes(this.baseItemUrl + '/' + this.data);\n // fetch the json file located at the data attribute\n fetch(uriToManifest)\n .then(response => {\n return response.json();\n })\n .then(data => {\n this.manifest = data;\n this.setupCES();\n })\n .catch(err => {\n this._errorMessage = err;\n });\n }\n\n // MH: Changed the default bootstrap.js to use the new CES API\n // Because the old one uses the global CES object that is not allowed to be accessed when the CI\n // is embedded in an iframe and coming from another domain\n // Therefor we need to use the new CES API to communicates via the broadcast API\n setupCES() {\n const iframe = this.shadowRoot.querySelector('#pciContainer') as HTMLIFrameElement,\n iframeDoc = iframe.contentDocument;\n\n if (!this.manifest.script || this.manifest.script.length === 0) {\n this._errorMessage = 'No script found in manifest';\n return;\n }\n if (!this.manifest.style || this.manifest.style.length === 0) {\n this._errorMessage = 'No style found in manifest';\n return;\n }\n const cssRef = this.manifest.style[0];\n const cssUrl =\n cssRef.startsWith('http') || cssRef.startsWith('blob')\n ? cssRef\n : removeDoubleSlashes(`${this.baseRefUrl}/${cssRef}`);\n const scriptRef = this.manifest.script[0];\n const scriptUrl =\n scriptRef.startsWith('http') || scriptRef.startsWith('blob')\n ? scriptRef\n : removeDoubleSlashes(`${this.baseRefUrl}/${scriptRef}`);\n // const channel = new BroadcastChannel('ces_channel');\n window.addEventListener('message', this.handlePostMessage);\n iframeDoc.open();\n iframeDoc.write(`\n <html>\n <head>\n <link href='${cssUrl}' rel=\"stylesheet\" />\n <script src='${scriptUrl}'></script>\n </head>\n <body></body>\n </html>\n `);\n\n iframeDoc.close();\n }\n\n private getIFrames() {\n const iframesInShadowRoot = this.shadowRoot.querySelectorAll('iframe');\n const iframe = this.querySelectorAll('iframe');\n\n const outerIFrames = [...iframesInShadowRoot, ...iframe];\n for (const iframe of outerIFrames) {\n const iframeSrc = iframe.src;\n const isSameOrigin = new URL(iframeSrc, window.location.href).origin === window.location.origin;\n if (isSameOrigin) {\n try {\n const outerDoc = iframe.contentDocument || iframe.contentWindow.document;\n if (outerDoc) {\n this.getInnerIFrames(outerDoc, outerIFrames);\n }\n } catch (e) {\n console.error('Error accessing nested iframe:', e);\n }\n }\n }\n // get only unique iframes\n outerIFrames.forEach((iframe, index) => {\n if (outerIFrames.indexOf(iframe) !== index) {\n outerIFrames.splice(index, 1);\n }\n });\n return outerIFrames;\n }\n\n private getInnerIFrames(iframeDocument: Document, iframes = []) {\n // Get all iframes in the current document\n const currentIframes = iframeDocument.querySelectorAll('iframe');\n\n currentIframes.forEach(iframe => {\n // Add the current iframe to the list\n iframes.push(iframe);\n\n // Recursively get iframes within the current iframe\n // Check if the iframe src is from the same origin\n const iframeSrc = iframe.src;\n const isSameOrigin = new URL(iframeSrc, window.location.href).origin === window.location.origin;\n\n if (isSameOrigin) {\n try {\n const nestedDoc = iframe.contentDocument || iframe.contentWindow.document;\n this.getInnerIFrames(nestedDoc, iframes);\n } catch (e) {\n console.error('Error accessing nested iframe:', e);\n }\n } else {\n console.warn('Skipped cross-origin iframe:', iframeSrc);\n }\n });\n\n return iframes;\n }\n\n private postToWindowAndIframes(type: string, data: any) {\n window.postMessage({ type, data }, '*');\n const iframes = this.getIFrames();\n for (const iframe of iframes) {\n if (iframe.contentWindow) {\n iframe.contentWindow.postMessage({ type, data }, '*');\n }\n }\n }\n\n handlePostMessage(event: MessageEvent) {\n const { type, data } = event.data;\n switch (type) {\n case 'setResponse':\n this.rawResponse = data;\n this.saveResponse(data);\n break;\n case 'getResponse': {\n this.postToWindowAndIframes('responseData', this.rawResponse);\n break;\n }\n case 'getMedia': {\n const mediaData = this.manifest.media.map(media => {\n const url =\n media.startsWith('http') || media.startsWith('blob')\n ? media\n : removeDoubleSlashes(this.baseRefUrl + '/' + media);\n return url;\n });\n this.postToWindowAndIframes('mediaData', mediaData);\n break;\n }\n case 'setStageHeight':\n console.log('setStageHeight not implemented');\n break;\n }\n }\n\n validate(): boolean {\n return this.rawResponse !== '';\n }\n\n get response(): string | null {\n return this.rawResponse;\n }\n\n set response(val: string | null) {\n if (typeof val === 'string') {\n this.rawResponse = val;\n this.saveResponse(val);\n } else {\n throw new Error('Value must be a string');\n }\n }\n\n override disconnectedCallback(): void {\n window.removeEventListener('message', this.handlePostMessage);\n super.disconnectedCallback();\n }\n\n override render() {\n return html`<iframe\n width=${this.getAttribute('width')}\n height=${this.getAttribute('height')}\n frameborder=\"0\"\n title=\"pciContainer\"\n id=\"pciContainer\"\n >\n </iframe>\n ${this._errorMessage &&\n html`<div style=\"color:red\">\n <h1>Error</h1>\n ${this._errorMessage}\n </div>`}`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-custom-interaction': QtiCustomInteraction;\n }\n}\n","import { html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n@customElement('qti-end-attempt-interaction')\nexport class QtiEndAttemptInteraction extends LitElement {\n @property({ type: String, attribute: 'response-identifier' }) responseIdentifier;\n\n @property({ reflect: true, type: Boolean }) disabled = false;\n\n /** Defines the number of attempts that a user can make using the 'endAttemptInteraction' mechanism (this can be used to limit the number of hints, etc.). [More information](https://www.imsglobal.org/sites/default/files/spec/qti/v3/info/index.html#DataCharacteristic_EndAttemptInteraction.Attr_count-attempt) */\n @property({ type: String, attribute: 'count-attempt' })\n public countAttempt: 'true' | 'false' | null = null;\n\n @property({ type: String })\n public title: string = 'end attempt';\n\n override render() {\n return html`<button ?disabled=${this.disabled} part=\"button\" @click=${this.endAttempt}>${this.title}</button>`;\n }\n public endAttempt(_: Event) {\n this.dispatchEvent(\n new CustomEvent('end-attempt', {\n bubbles: true,\n composed: true,\n detail: { responseIdentifier: this.responseIdentifier, countAttempt: this.countAttempt === 'true' }\n })\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-end-attempt-interaction': QtiEndAttemptInteraction;\n }\n}\n","import { html } from 'lit';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport { Interaction } from '../../../exports/interaction';\nimport { watch } from '../../../decorators/watch';\nimport styles from './qti-extended-text-interaction.styles';\n\nimport type { CSSResultGroup } from 'lit';\n\n@customElement('qti-extended-text-interaction')\nexport class QtiExtendedTextInteraction extends Interaction {\n static styles: CSSResultGroup = styles;\n\n @state()\n protected _rows = 5;\n\n /** expected length is mapped to the property maxlength on the textarea */\n @property({ type: Number, attribute: 'expected-length' }) expectedLength: number;\n\n @property({ type: String, attribute: 'pattern-mask' }) patternMask: string;\n\n /** text appearing in the extended-text-nteraction if it is empty */\n @property({ type: String, attribute: 'placeholder-text' }) placeholderText: string;\n\n @property({ type: String, attribute: 'data-patternmask-message' }) dataPatternmaskMessage: string;\n\n @property({ type: String, attribute: 'class' }) classNames;\n @watch('classNames')\n handleclassNamesChange(_: any, classes: string) {\n const classNames = classes.split(' ');\n let rowsSet = false;\n classNames.forEach((className: string) => {\n if (className.startsWith('qti-height-lines-')) {\n const nrRows = className.replace('qti-height-lines-', '');\n this._rows = parseInt(nrRows);\n rowsSet = true;\n }\n });\n // If no qti-height-lines class is set, calculate rows based on expectedLength\n if (!rowsSet && this.expectedLength) {\n const estimatedRows = Math.ceil(this.expectedLength / 50); // '50' based on an estimate for characters per row\n this._rows = estimatedRows;\n }\n }\n\n @state()\n response: string | null = null;\n\n @watch('response', { waitUntilFirstUpdate: true })\n protected _handleResponseChange = () => {\n this._internals.setFormValue(this.value);\n this.validate();\n };\n\n get value(): string | null {\n return this.response || null;\n }\n set value(val: string | null) {\n this.response = val || null;\n }\n\n public override validate() {\n const textarea = this.shadowRoot.querySelector('textarea');\n if (!textarea) return false;\n\n if (this.patternMask && this.dataPatternmaskMessage) {\n // Clear any custom error initially\n this._internals.setValidity({});\n textarea.setCustomValidity('');\n const patternSource =\n this.patternMask.startsWith('^') && this.patternMask.endsWith('$') ? this.patternMask : `^${this.patternMask}$`;\n\n const pattern = new RegExp(patternSource);\n const isValid = textarea.checkValidity() && pattern.test(textarea.value);\n\n if (!isValid) {\n // Set custom error if invalid\n this._internals.setValidity({ customError: true }, this.dataPatternmaskMessage);\n textarea.setCustomValidity(this.dataPatternmaskMessage);\n }\n } else {\n const isValid = textarea.checkValidity();\n this._internals.setValidity(isValid ? {} : { customError: false });\n }\n\n return !!this.response && textarea.checkValidity();\n }\n\n override reportValidity() {\n const textarea = this.shadowRoot.querySelector('textarea');\n if (!textarea) return false;\n\n // Run the validate function to ensure the custom validity state is up to date\n const isValid = this.validate();\n if (!isValid) {\n textarea.reportValidity();\n }\n return isValid;\n }\n\n override render() {\n return html`<slot name=\"prompt\"></slot\n ><textarea\n part=\"textarea\"\n name=\"${this.responseIdentifier}\"\n spellcheck=\"false\"\n autocomplete=\"off\"\n maxlength=\"${5000}\"\n @keydown=\"${event => event.stopImmediatePropagation()}\"\n @keyup=\"${this.textChanged}\"\n @change=\"${this.textChanged}\"\n @blur=\"${(_: FocusEvent) => {\n this.reportValidity();\n }}\"\n placeholder=\"${ifDefined(this.placeholderText ? this.placeholderText : undefined)}\"\n rows=\"${this._rows}\"\n ?disabled=\"${this.disabled}\"\n ?readonly=\"${this.readonly}\"\n .value=${this.response}\n ></textarea>`;\n }\n\n protected textChanged(event: Event) {\n if (this.disabled || this.readonly) return;\n const input = event.target as HTMLInputElement;\n this.setEmptyAttribute(input.value);\n if (this.response !== input.value) {\n this.value = input.value;\n this.saveResponse(input.value);\n }\n }\n\n protected setEmptyAttribute(text: string) {\n this.setAttribute('empty', text === '' ? 'true' : 'false');\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-extended-text-interaction': QtiExtendedTextInteraction;\n }\n}\n","import { css } from 'lit';\n\nexport default css`\n /* PK: display host as block, else design will be collapsed */\n :host {\n display: block;\n }\n textarea {\n box-sizing: border-box;\n width: 100%;\n height: 100%;\n border: 0;\n }\n`;\n","import { css, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\n@customElement('qti-gap-img')\nexport class QtiGapImg extends LitElement {\n static styles = css`\n :host {\n display: flex;\n user-select: none;\n }\n `;\n\n @property({ type: Number, reflect: true }) tabindex: number | undefined = 0;\n\n connectedCallback() {\n this.setAttribute('slot', 'drags');\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-gap-img': QtiGapImg;\n }\n}\n","import { html } from 'lit';\nimport { customElement } from 'lit/decorators.js';\n\nimport { DragDropInteractionMixin } from '../internal/drag-drop/drag-drop-interaction-mixin';\nimport { Interaction } from '../../../exports/interaction';\nimport styles from './qti-gap-match-interaction.styles';\n\nimport type { ResponseVariable } from '../../../exports/variables';\nimport type { CSSResultGroup } from 'lit';\n@customElement('qti-gap-match-interaction')\nexport class QtiGapMatchInteraction extends DragDropInteractionMixin(\n Interaction,\n 'qti-gap-text',\n 'qti-gap',\n `slot[part='drags']`\n) {\n static styles: CSSResultGroup = styles;\n\n override render() {\n return html`<slot name=\"prompt\"> </slot>\n <slot part=\"drags\" name=\"drags\"></slot>\n <slot part=\"drops\"></slot>\n <div role=\"alert\" id=\"validationMessage\"></div>`;\n }\n\n public toggleCorrectResponse(responseVariable: ResponseVariable, show: boolean): void {\n if (show && responseVariable.correctResponse) {\n let matches: { text: string; gap: string }[] = [];\n const response = Array.isArray(responseVariable.correctResponse)\n ? responseVariable.correctResponse\n : [responseVariable.correctResponse];\n\n if (response) {\n matches = response.map(x => {\n const split = x.split(' ');\n return { text: split[0], gap: split[1] };\n });\n }\n\n const gaps = this.querySelectorAll('qti-gap');\n gaps.forEach(gap => {\n const identifier = gap.getAttribute('identifier');\n const textIdentifier = matches.find(x => x.gap === identifier)?.text;\n const text = this.querySelector(`qti-gap-text[identifier=\"${textIdentifier}\"]`)?.textContent.trim();\n if (textIdentifier && text) {\n if (!gap.nextElementSibling?.classList.contains('correct-option')) {\n const textSpan = document.createElement('span');\n textSpan.classList.add('correct-option');\n textSpan.textContent = text;\n\n // Apply styles\n textSpan.style.border = '1px solid var(--qti-correct)';\n textSpan.style.borderRadius = '4px';\n textSpan.style.padding = '2px 4px';\n textSpan.style.display = 'inline-block';\n\n gap.insertAdjacentElement('afterend', textSpan);\n }\n } else if (gap.nextElementSibling?.classList.contains('correct-option')) {\n gap.nextElementSibling.remove();\n }\n });\n } else {\n const correctOptions = this.querySelectorAll('.correct-option');\n correctOptions.forEach(option => {\n option.remove();\n });\n }\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-gap-match-interaction': QtiGapMatchInteraction;\n }\n}\n","import { css } from 'lit';\n// import componentStyles from '../../utilities/styles/component.styles';\n// :host {\n// display: inline-block;\n// position: relative;\n// }\n/* ${componentStyles} */\nexport default css`\n :host {\n display: flex;\n align-items: flex-start;\n flex-direction: column;\n flex-wrap: wrap;\n gap: 0.5rem;\n }\n\n :host(.qti-choices-top) {\n flex-direction: column;\n }\n :host(.qti-choices-bottom) {\n flex-direction: column-reverse;\n }\n :host(.qti-choices-left) {\n flex-direction: row;\n }\n :host(.qti-choices-right) {\n flex-direction: row-reverse;\n }\n /* [part='drops'] , */\n [name='prompt'] {\n width: 100%;\n }\n [name='drags'] {\n display: flex;\n align-items: flex-start;\n flex: 1;\n border: 2px solid transparent;\n padding: 0.3rem;\n border-radius: 0.3rem;\n gap: 0.5rem;\n }\n`;\n","import { css, html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport { ActiveElementMixin } from './internal/active-element/active-element.mixin';\n\n@customElement('qti-gap-text')\nexport class QtiGapText extends ActiveElementMixin(LitElement, 'qti-gap-text') {\n static styles = css`\n :host {\n display: inline-flex;\n user-select: none;\n }\n `;\n\n @property({ type: Number, reflect: true }) tabindex: number | undefined = 0;\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.setAttribute('slot', 'drags');\n }\n\n override render() {\n return html`<slot></slot>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-gap-text': QtiGapText;\n }\n}\n","import { html } from 'lit';\nimport { property } from 'lit/decorators.js';\n\nimport { watch } from '../../../../decorators/watch';\n\nimport type { ComplexAttributeConverter, LitElement} from 'lit';\n\ntype Constructor<T = {}> = abstract new (...args: any[]) => T;\n\nexport interface ChoiceInterface {\n identifier: string;\n disabled: boolean;\n readonly: boolean;\n}\n\n/**\n * Converter to handle boolean attributes for ARIA properties,\n * ensuring they are set as 'true' or 'false' strings.\n */\nconst ariaBooleanConverter: ComplexAttributeConverter<boolean, boolean> = {\n toAttribute: (value: boolean) => (value ? 'true' : 'false'),\n fromAttribute: (value: string | null) => value === 'true'\n};\n\n/**\n * A mixin that adds choice functionality to a LitElement-based class.\n * It dispatches events with a custom `type` and handles selection logic.\n *\n * @param Base - The base class to extend.\n * @param type - The type of the choice, used in event names.\n * @returns A new class extending the base class with choice functionality.\n */\nexport interface ActiveElementMixinInterface {\n identifier: string;\n tabIndex: number;\n disabled: boolean;\n readonly: boolean;\n internals: ElementInternals;\n}\n\n\nexport function ActiveElementMixin<T extends Constructor<LitElement>>(Base: T, type: string) {\n abstract class QtiChoice extends Base {\n @property({ type: String })\n public identifier = '';\n\n @property({ type: Number, reflect: true, attribute: 'tabindex' })\n public tabIndex = 0;\n\n @property({\n type: Boolean,\n reflect: true,\n attribute: 'aria-disabled',\n converter: ariaBooleanConverter\n })\n public disabled = false;\n\n @property({\n type: Boolean,\n reflect: true,\n attribute: 'aria-readonly',\n converter: ariaBooleanConverter\n })\n public readonly = false;\n\n public internals: ElementInternals;\n\n @watch('disabled', { waitUntilFirstUpdate: true })\n handleDisabledChange(_oldValue: boolean, disabled: boolean) {\n this.tabIndex = disabled ? -1 : 0;\n if (disabled) {\n this.blur();\n }\n }\n\n constructor(...args: any[]) {\n super(...args);\n this.internals = this.attachInternals();\n }\n\n override connectedCallback() {\n super.connectedCallback();\n\n this.addEventListener('keyup', this._onKeyUp);\n this.addEventListener('click', this._onClick);\n\n this.dispatchEvent(\n new CustomEvent(`register-${type}`, {\n bubbles: true,\n composed: true\n })\n );\n }\n\n override disconnectedCallback() {\n super.disconnectedCallback();\n this.removeEventListener('keyup', this._onKeyUp);\n this.removeEventListener('click', this._onClick);\n this.dispatchEvent(\n new CustomEvent(`unregister-${type}`, {\n bubbles: true,\n composed: true\n })\n );\n }\n\n private _onKeyUp(event: KeyboardEvent) {\n if (event.altKey) return;\n\n if (event.code === 'Space') {\n event.preventDefault();\n this._activate();\n }\n }\n\n private _onClick() {\n if (this.disabled || this.readonly) return;\n this.focus();\n this._activate();\n }\n\n private _activate() {\n if (this.disabled || this.readonly) return;\n\n this.dispatchEvent(\n new CustomEvent<{ identifier: string }>(`activate-${type}`, {\n bubbles: true,\n composed: true,\n detail: { identifier: this.identifier }\n })\n );\n }\n\n override render() {\n return html`<slot></slot>`;\n }\n }\n return QtiChoice as Constructor<ActiveElementMixinInterface> & T;\n}\n","import { css, html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\n@customElement('qti-gap')\nexport class QtiGap extends LitElement {\n static styles = css`\n :host {\n display: flex;\n user-select: none;\n }\n `;\n\n @property({ type: Number, reflect: true }) tabindex: number | undefined = 0;\n\n override render() {\n return html` <slot name=\"drags\"></slot>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-gap': QtiGap;\n }\n}\n","import { html, svg } from 'lit';\nimport { customElement, queryAssignedElements, state } from 'lit/decorators.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { repeat } from 'lit/directives/repeat.js';\n\nimport { positionShapes } from '../internal/hotspots/hotspot';\nimport { Interaction } from '../../../exports/interaction';\nimport styles from './qti-graphic-associate-interaction.styles';\n\nimport type { QtiHotspotChoice } from '../qti-hotspot-choice';\nimport type { CSSResultGroup } from 'lit';\nimport type { ResponseVariable } from '../../../exports/variables';\n\n@customElement('qti-graphic-associate-interaction')\nexport class QtiGraphicAssociateInteraction extends Interaction {\n static styles: CSSResultGroup = styles;\n\n private hotspots;\n private startPoint = null;\n private endPoint = null;\n\n @state() private _correctLines = [];\n @state() private startCoord: { x: number; y: number };\n @state() private mouseCoord: { x: number; y: number };\n @queryAssignedElements({ selector: 'img' }) private grImage;\n\n @state()\n private _response: string[] | null = [];\n\n constructor() {\n super();\n this.addEventListener('qti-register-hotspot', this.positionHotspotOnRegister);\n }\n\n reset(): void {\n this._response = [];\n this._correctLines = [];\n }\n\n validate(): boolean {\n return this.response.length > 0;\n }\n\n set response(val) {\n this._response = val;\n }\n\n get response() {\n return this._response;\n }\n\n public toggleCorrectResponse(responseVariable: ResponseVariable, show: boolean) {\n if (!show) {\n this._correctLines = [];\n return;\n }\n if (!responseVariable.correctResponse) {\n console.error('No correct response found for this interaction.');\n return;\n }\n const correctResponses = Array.isArray(responseVariable.correctResponse)\n ? responseVariable.correctResponse\n : [responseVariable.correctResponse];\n this._correctLines = correctResponses;\n }\n\n override render() {\n return html`<slot name=\"prompt\"></slot>\n <line-container>\n <svg\n width=${ifDefined(this.grImage[0]?.width)}\n height=${ifDefined(this.grImage[0]?.height)}\n viewbox=\"0 0 ${this.grImage[0]?.width} ${this.grImage[0]?.height}\"\n >\n ${repeat(\n this.response || [],\n line => line,\n (line, index) => svg`\n <line\n part=\"line\"\n x1=${parseInt(this.querySelector<SVGLineElement>(`[identifier=${line.split(' ')[0]}]`).style.left)}\n y1=${parseInt(this.querySelector<SVGLineElement>(`[identifier=${line.split(' ')[0]}]`).style.top)}\n x2=${parseInt(this.querySelector<SVGLineElement>(`[identifier=${line.split(' ')[1]}]`).style.left)}\n y2=${parseInt(this.querySelector<SVGLineElement>(`[identifier=${line.split(' ')[1]}]`).style.top)}\n stroke=\"red\"\n stroke-width=\"3\"\n @click=${(e: Event) => {\n e.stopPropagation();\n this._response = this._response.filter((_, i) => i !== index);\n this.saveResponse(this.response);\n }}\n />\n `\n )}\n ${repeat(\n this._correctLines || [],\n line => line,\n (line, _index) => svg`\n <line\n part=\"correct-line\"\n x1=${parseInt(this.querySelector<SVGLineElement>(`[identifier=${line.split(' ')[0]}]`).style.left)}\n y1=${parseInt(this.querySelector<SVGLineElement>(`[identifier=${line.split(' ')[0]}]`).style.top)}\n x2=${parseInt(this.querySelector<SVGLineElement>(`[identifier=${line.split(' ')[1]}]`).style.left)}\n y2=${parseInt(this.querySelector<SVGLineElement>(`[identifier=${line.split(' ')[1]}]`).style.top)}\n stroke=\"var(--qti-correct)\"\n stroke-width=\"3\"\n stroke-dasharray=\"5,5\"\n />\n `\n )}\n ${this.startPoint &&\n svg`<line\n part=\"point\"\n x1=${this.startCoord.x}\n y1=${this.startCoord.y}\n x2=${this.mouseCoord.x}\n y2=${this.mouseCoord.y}\n stroke=\"var(--qti-border-active)\"\n stroke-width=\"3\"\n />`}\n </svg>\n <slot></slot>\n </line-container>\n <div role=\"alert\" id=\"validationMessage\"></div>`;\n }\n\n private positionHotspotOnRegister(e: CustomEvent<QtiHotspotChoice>): void {\n const img = this.querySelector('img') as HTMLImageElement;\n const hotspot = e.target as QtiHotspotChoice;\n const coords = hotspot.getAttribute('coords');\n const shape = hotspot.getAttribute('shape');\n const coordsNumber = coords.split(',').map(s => parseInt(s));\n positionShapes(shape, coordsNumber, img, hotspot);\n }\n\n override firstUpdated(): void {\n this.hotspots = this.querySelectorAll('qti-associable-hotspot');\n\n this.addEventListener('mousemove', event => {\n const img = this.grImage[0];\n if (!img) return;\n\n const rect = img.getBoundingClientRect();\n // const scaleX = img.naturalWidth / img.clientWidth;\n // const scaleY = img.naturalHeight / img.clientHeight;\n\n // console.log(`scaleX: ${scaleX}, scaleY: ${scaleY}`);\n\n this.mouseCoord = {\n x: event.clientX - rect.left, // * scaleX,\n y: event.clientY - rect.top // * scaleY\n };\n });\n\n this.hotspots.forEach(hotspot => {\n // const img = this.grImage[0];\n // const scaleX = img.naturalWidth / img.clientWidth;\n // const scaleY = img.naturalHeight / img.clientHeight;\n\n hotspot.style.left = hotspot.getAttribute('coords').split(',')[0] + 'px';\n hotspot.style.top = hotspot.getAttribute('coords').split(',')[1] + 'px';\n\n hotspot.addEventListener('click', event => {\n if (!this.startPoint) {\n this.startPoint = event.target;\n\n this.startCoord = {\n x: parseInt(this.startPoint.getAttribute('coords').split(',')[0]),\n y: parseInt(this.startPoint.getAttribute('coords').split(',')[1])\n };\n } else if (!this.endPoint) {\n this.endPoint = event.target;\n\n this._response = [\n ...this.response,\n `${this.startPoint.getAttribute('identifier')} ${this.endPoint.getAttribute('identifier')}`\n ];\n this.saveResponse(this.response);\n this.startPoint = null;\n this.endPoint = null;\n }\n });\n });\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener('qti-register-hotspot', this.positionHotspotOnRegister);\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-graphic-associate-interaction': QtiGraphicAssociateInteraction;\n }\n}\n","export function positionShapes(shape: string, coordsNumber: number[], img: HTMLImageElement, hotspot: HTMLElement) {\n // Determine the reference width and height based on the attributes or natural dimensions\n const imgWidth = img.getAttribute('width') ? parseFloat(img.getAttribute('width')!) : img.naturalWidth;\n const imgHeight = img.getAttribute('height') ? parseFloat(img.getAttribute('height')!) : img.naturalHeight;\n\n switch (shape) {\n case 'circle':\n {\n if (coordsNumber.length !== 3) {\n console.error('Invalid cirlce coordinates:', coordsNumber);\n return;\n }\n const [centerX, centerY, radius] = coordsNumber;\n\n // Calculate percentages for center and radius\n const centerXPer = (centerX / imgWidth) * 100;\n const centerYPer = (centerY / imgHeight) * 100;\n const radiusPer = (radius / imgWidth) * 100;\n\n // Subtract half the diameter (radiusPer in percentage) to center the circle\n hotspot.style.left = centerXPer - radiusPer + '%';\n hotspot.style.top = centerYPer - radiusPer + '%';\n // Use both imgWidth and imgHeight for radius calculations\n const radiusXPer = (radius / imgWidth) * 100; // Relative to width\n const radiusYPer = (radius / imgHeight) * 100; // Relative to height\n // Use percentage-based width and height to keep it proportional\n hotspot.style.width = 2 * radiusXPer + '%';\n hotspot.style.height = 2 * radiusYPer + '%';\n hotspot.style.borderRadius = `50%`; // Create a circular\n }\n break;\n\n case 'rect':\n {\n if (coordsNumber.length !== 4) {\n console.error('Invalid rectangle coordinates:', coordsNumber);\n return;\n }\n const [leftX, topY, rightX, bottomY] = coordsNumber;\n const leftXPer = (leftX / imgWidth) * 100;\n const topYPer = (topY / imgHeight) * 100;\n const rightXPer = (rightX / imgWidth) * 100;\n const bottomYPer = (bottomY / imgHeight) * 100;\n hotspot.style.left = leftXPer + '%';\n hotspot.style.top = topYPer + '%';\n hotspot.style.width = rightXPer - leftXPer + '%';\n hotspot.style.height = bottomYPer - topYPer + '%';\n }\n break;\n case 'ellipse':\n {\n if (coordsNumber.length !== 4) {\n console.error('Invalid ellipse coordinates:', coordsNumber);\n return;\n }\n const [centerX, centerY, radiusX, radiusY] = coordsNumber;\n const centerXPer = (centerX / imgWidth) * 100;\n const centerYPer = (centerY / imgHeight) * 100;\n const radiusXPer = (radiusX / imgWidth) * 100;\n const radiusYPer = (radiusY / imgHeight) * 100;\n\n hotspot.style.left = centerXPer - radiusXPer + '%';\n hotspot.style.top = centerYPer - radiusYPer + '%';\n hotspot.style.width = 2 * radiusXPer + '%';\n hotspot.style.height = 2 * radiusYPer + '%';\n hotspot.style.borderRadius = `50%`; // Create an elliptical shape\n }\n break;\n case 'poly':\n {\n if (coordsNumber.length < 6 || coordsNumber.length % 2 !== 0) {\n console.error('Invalid polygon coordinates:', coordsNumber);\n return;\n }\n // Convert coordsNumber to an array of {x, y}\n const polycoords = [];\n for (let i = 0; i < coordsNumber.length; i += 2) {\n polycoords.push({ x: coordsNumber[i], y: coordsNumber[i + 1] });\n }\n\n // Calculate the bounding box\n const leftX = Math.min(...polycoords.map(point => point.x));\n const rightX = Math.max(...polycoords.map(point => point.x));\n const topY = Math.min(...polycoords.map(point => point.y));\n const bottomY = Math.max(...polycoords.map(point => point.y));\n\n // Set the hotspot position and size in percentages\n const leftXPer = (leftX / imgWidth) * 100;\n const topYPer = (topY / imgHeight) * 100;\n const rightXPer = (rightX / imgWidth) * 100;\n const bottomYPer = (bottomY / imgHeight) * 100;\n\n hotspot.style.left = leftXPer + '%';\n hotspot.style.top = topYPer + '%';\n hotspot.style.width = rightXPer - leftXPer + '%';\n hotspot.style.height = bottomYPer - topYPer + '%';\n\n // Calculate the clip path based on the bounding box\n const polygonData = polycoords.map(point => ({\n x: ((point.x - leftX) / (rightX - leftX)) * 100,\n y: ((point.y - topY) / (bottomY - topY)) * 100\n }));\n\n const polyD = polygonData.map(p => `${p.x}% ${p.y}%`).join(',');\n hotspot.style.clipPath = `polygon(${polyD})`;\n }\n break;\n\n default:\n console.error(`Unsupported shape: ${shape}`);\n break;\n }\n}\n","import { css } from 'lit';\n\nexport default css`\n slot:not([name='prompt']) {\n // position: relative; /* qti-hotspot-choice relative to the slot */\n display: block;\n width: fit-content; /* hotspots not stretching further if image is at max size */\n }\n ::slotted(img) {\n /* image not selectable anymore */\n pointer-events: none;\n user-select: none;\n }\n ::slotted(qti-associable-hotspot) {\n transform: translate(-50%, -50%);\n }\n line-container {\n display: block;\n position: relative;\n width: fit-content;\n }\n svg {\n position: absolute;\n top: 0px;\n left: 0px;\n }\n`;\n","import { html } from 'lit';\nimport { customElement } from 'lit/decorators.js';\n\nimport { DragDropInteractionMixin } from '../internal/drag-drop/drag-drop-interaction-mixin';\nimport { Interaction } from '../../../exports/interaction';\nimport styles from './qti-graphic-gap-match-interaction.styles';\n\nimport type { QtiHotspotChoice } from '../qti-hotspot-choice';\nimport type { CSSResultGroup } from 'lit';\n\n@customElement('qti-graphic-gap-match-interaction')\nexport class QtiGraphicGapMatchInteraction extends DragDropInteractionMixin(\n Interaction,\n 'qti-gap-img, qti-gap-text',\n 'qti-associable-hotspot',\n `slot[part='drags']`\n) {\n static styles: CSSResultGroup = styles;\n\n override render() {\n return html` <slot name=\"prompt\"></slot>\n <slot part=\"image\"></slot>\n <slot part=\"drags\" name=\"drags\" class=\"hover-border\"></slot>\n <div role=\"alert\" id=\"validationMessage\"></div>`;\n }\n\n private positionHotspotOnRegister(e: CustomEvent<null>): void {\n const hotspot = e.target as QtiHotspotChoice;\n const coords = hotspot.getAttribute('coords');\n const shape = hotspot.getAttribute('shape');\n const coordsNumber = coords.split(',').map(s => parseInt(s));\n\n // positionHotspots(shape, coordsNumber, img, hotspot);\n switch (shape) {\n case 'circle':\n {\n const [centerX, centerY, radius] = coordsNumber;\n hotspot.style.left = centerX - radius + 'px';\n hotspot.style.top = centerY - radius + 'px';\n hotspot.style.width = hotspot.style.height = 2 * radius + 'px';\n }\n break;\n\n case 'rect':\n {\n const [leftX, topY, rightX, bottomY] = coordsNumber;\n hotspot.style.left = leftX + 'px';\n hotspot.style.top = topY + 'px';\n hotspot.style.width = rightX - leftX + 'px';\n hotspot.style.height = bottomY - topY + 'px';\n }\n break;\n\n default:\n break;\n }\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.addEventListener('qti-register-hotspot', this.positionHotspotOnRegister);\n }\n override disconnectedCallback() {\n super.disconnectedCallback();\n this.removeEventListener('qti-register-hotspot', this.positionHotspotOnRegister);\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-graphic-gap-match-interaction': QtiGraphicGapMatchInteraction;\n }\n}\n","import { css } from 'lit';\n\nexport default css`\n :host {\n display: flex;\n align-items: flex-start;\n flex-direction: column;\n flex-wrap: wrap;\n gap: 0.5rem;\n }\n\n :host(.qti-choices-top) {\n flex-direction: column-reverse;\n }\n :host(.qti-choices-bottom) {\n flex-direction: column;\n }\n :host(.qti-choices-left) {\n flex-direction: row-reverse;\n & [name='drags'] {\n width: 25%;\n }\n & [part='image'] {\n width: 75%;\n }\n }\n :host(.qti-choices-right) {\n flex-direction: row;\n & [name='drags'] {\n width: 25%;\n }\n & [part='image'] {\n width: 75%;\n }\n }\n [part='image'] {\n display: block;\n position: relative;\n }\n /* [part='drops'] , */\n\n [name='drags'] {\n display: flex;\n align-items: flex-start;\n flex-wrap: wrap;\n flex: 1;\n border: 2px solid transparent;\n padding: 0.3rem;\n border-radius: 0.3rem;\n gap: 0.5rem;\n }\n ::slotted(img) {\n display: inline-block;\n user-select: none;\n pointer-events: none;\n }\n`;\n","import { html } from 'lit';\nimport { customElement } from 'lit/decorators.js';\n\nimport { ChoicesMixin } from '../internal/choices/choices.mixin';\nimport { positionShapes } from '../internal/hotspots/hotspot';\nimport { Interaction } from '../../../exports/interaction';\nimport styles from './qti-graphic-order-interaction.styles';\n\nimport type { ResponseVariable } from '../../../exports/variables';\nimport type { QtiHotspotChoice } from '../qti-hotspot-choice';\nimport type { Choice } from '../internal/choices/choices.mixin';\nimport type { CSSResultGroup } from 'lit';\n\ntype HotspotChoice = Choice & { order: number; orderCorrect?: number };\n\n@customElement('qti-graphic-order-interaction')\nexport class QtiGraphicOrderInteraction extends ChoicesMixin(Interaction, 'qti-hotspot-choice') {\n static styles: CSSResultGroup = styles;\n\n protected choiceOrdering: boolean;\n\n protected _choiceElements: Choice[] = [];\n\n override render() {\n return html`\n <slot name=\"prompt\"></slot>\n <slot></slot>\n <div role=\"alert\" id=\"validationMessage\"></div>\n `;\n }\n\n private setHotspotOrder(e: CustomEvent<{ identifier: string }>): void {\n const { identifier } = e.detail;\n\n const hotspot = this._choiceElements.find(el => el.getAttribute('identifier') === identifier) as HotspotChoice;\n\n if (!hotspot) return;\n\n const maxSelection = this._choiceElements.length;\n\n if (!this.choiceOrdering) {\n this.choiceOrdering = true;\n\n if (hotspot.order == null) {\n // Hotspot is not selected, so assign the next available order\n const currentSelection = (this._choiceElements as HotspotChoice[]).filter(i => i.order != null).length;\n\n if (currentSelection >= maxSelection) {\n this.choiceOrdering = false;\n return; // Maximum selection reached\n }\n\n hotspot.order = currentSelection + 1;\n } else {\n // Hotspot is already selected, so remove its order and renumber the rest\n const removedOrder = hotspot.order;\n\n hotspot.order = null;\n\n (this._choiceElements as HotspotChoice[]).forEach(hotspot => {\n if (hotspot.order != null && hotspot.order > removedOrder) {\n hotspot.order--;\n }\n });\n }\n\n this.choiceOrdering = false;\n }\n }\n\n public toggleCorrectResponse(responseVariable: ResponseVariable, show: boolean) {\n const hotspots = this._choiceElements as HotspotChoice[];\n for (const hotspot of hotspots) {\n if (show && responseVariable.correctResponse?.length > 0 && Array.isArray(responseVariable.correctResponse)) {\n const index = responseVariable.correctResponse.findIndex(identifier => identifier === hotspot.identifier);\n if (index >= 0) {\n hotspot.orderCorrect = index + 1;\n } else {\n hotspot.orderCorrect = null;\n }\n } else {\n hotspot.orderCorrect = null;\n }\n }\n }\n\n private positionHotspotOnRegister(e: CustomEvent<QtiHotspotChoice>): void {\n const img = this.querySelector('img') as HTMLImageElement;\n const hotspot = e.target as QtiHotspotChoice;\n const coords = hotspot.getAttribute('coords');\n const shape = hotspot.getAttribute('shape');\n const coordsNumber = coords.split(',').map(s => parseInt(s));\n\n positionShapes(shape, coordsNumber, img, hotspot);\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.addEventListener('activate-qti-hotspot-choice', this.setHotspotOrder);\n this.addEventListener('register-qti-hotspot-choice', this.positionHotspotOnRegister);\n }\n override disconnectedCallback() {\n super.disconnectedCallback();\n this.removeEventListener('activate-qti-hotspot-choice', this.setHotspotOrder);\n this.removeEventListener('register-qti-hotspot-choice', this.positionHotspotOnRegister);\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-graphic-order-interaction': QtiGraphicOrderInteraction;\n }\n}\n","import { css } from 'lit';\n\nexport default css`\n slot:not([name='prompt']) {\n position: relative; /* qti-hotspot-choice relative to the slot */\n display: block;\n width: fit-content; /* hotspots not stretching further if image is at max size */\n }\n ::slotted(img) {\n /* image not selectable anymore */\n pointer-events: none;\n user-select: none;\n }\n`;\n","import { css, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport { ActiveElementMixin } from './internal/active-element/active-element.mixin';\n\n// type shape = { shape: 'rect' | 'circle' | 'poly'; coords: number[] };\n\n@customElement('qti-hotspot-choice')\nexport class QtiHotspotChoice extends ActiveElementMixin(LitElement, 'qti-hotspot-choice') {\n static styles = css`\n :host {\n display: flex;\n user-select: none;\n position: absolute;\n }\n `;\n @property({ attribute: 'aria-ordervalue', type: Number, reflect: true }) order: number;\n @property({ attribute: 'aria-ordercorrectvalue', type: Number, reflect: true }) orderCorrect: number;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-hotspot-choice': QtiHotspotChoice;\n }\n}\n","import { html } from 'lit';\nimport { customElement } from 'lit/decorators.js';\n\nimport { ChoicesMixin } from '../internal/choices/choices.mixin';\nimport { positionShapes } from '../internal/hotspots/hotspot';\nimport { Interaction } from '../../../exports/interaction';\nimport styles from './qti-hotspot-interaction.styles';\n\nimport type { QtiHotspotChoice } from '../qti-hotspot-choice';\nimport type { CSSResultGroup } from 'lit';\n\n@customElement('qti-hotspot-interaction')\nexport class QtiHotspotInteraction extends ChoicesMixin(Interaction, 'qti-hotspot-choice') {\n static styles: CSSResultGroup = styles;\n\n override render() {\n return html`\n <slot name=\"prompt\"></slot>\n <slot></slot>\n `;\n }\n\n private positionHotspotOnRegister(e: CustomEvent<QtiHotspotChoice>): void {\n const img = this.querySelector('img') as HTMLImageElement;\n const hotspot = e.target as QtiHotspotChoice;\n const coords = hotspot.getAttribute('coords');\n const shape = hotspot.getAttribute('shape');\n const coordsNumber = coords.split(',').map(s => parseInt(s));\n\n positionShapes(shape, coordsNumber, img, hotspot);\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.addEventListener('register-qti-hotspot-choice', this.positionHotspotOnRegister);\n }\n override disconnectedCallback() {\n super.disconnectedCallback();\n this.removeEventListener('unregister-qti-hotspot-choice', this.positionHotspotOnRegister);\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-hotspot-interaction': QtiHotspotInteraction;\n }\n}\n","import { css } from 'lit';\n\nexport default css`\n slot:not([name='prompt']) {\n position: relative; /* qti-hotspot-choice relative to the slot */\n display: block;\n width: fit-content; /* hotspots not stretching further if image is at max size */\n }\n ::slotted(img) {\n /* image not selectable anymore */\n pointer-events: none;\n user-select: none;\n /* width:100%; */\n }\n`;\n","import { html } from 'lit';\nimport { customElement } from 'lit/decorators.js';\n\nimport { ChoicesMixin } from '../internal/choices/choices.mixin';\nimport { Interaction } from '../../../exports/interaction';\n\n@customElement('qti-hottext-interaction')\nexport class QtiHottextInteraction extends ChoicesMixin(Interaction, 'qti-hottext') {\n override render = () => html`<slot></slot>`;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-hottext-interaction': QtiHottextInteraction;\n }\n}\n","import { css, html, LitElement } from 'lit';\nimport { customElement } from 'lit/decorators.js';\n\nimport { ActiveElementMixin } from './internal/active-element/active-element.mixin';\n\n@customElement('qti-hottext')\nexport class QtiHottext extends ActiveElementMixin(LitElement, 'qti-hottext') {\n static styles = css`\n :host {\n display: flex;\n user-select: none;\n }\n `;\n\n override render() {\n return html`<div part=\"ch\"><div part=\"cha\"></div></div>\n <slot></slot> `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-hottext': QtiHottext;\n }\n}\n","import { css, html } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\n\nimport { Interaction } from '../../../exports/interaction';\n\nimport type { ResponseVariable } from '../../../exports/variables';\n\ninterface OptionType {\n textContent: string;\n value: string;\n selected: boolean;\n}\n\n@customElement('qti-inline-choice-interaction')\nexport class QtiInlineChoiceInteraction extends Interaction {\n static override get styles() {\n return [\n css`\n :host {\n display: inline-block;\n }\n slot {\n display: flex;\n flex-direction: column;\n }\n [role='menu'] {\n position: absolute;\n z-index: 1000;\n }\n .anchor {\n /* anchor-name: --infobox; */\n width: fit-content;\n }\n\n .positionedElement {\n position: absolute;\n /* position-anchor: --infobox; */\n /* top: anchor(bottom); */\n }\n `\n ];\n }\n\n public static inputWidthClass = [\n '',\n 'qti-input-width-2',\n 'qti-input-width-1',\n 'qti-input-width-3',\n 'qti-input-width-4',\n 'qti-input-width-6',\n 'qti-input-width-10',\n 'qti-input-width-15',\n 'qti-input-width-20',\n 'qti-input-width-72'\n ];\n\n @state()\n protected options: OptionType[] = [];\n\n @state()\n protected correctOption: string = '';\n\n @property({ attribute: 'data-prompt', type: String })\n dataPrompt: string = 'select';\n\n override render() {\n return html`\n <select part=\"select\" @change=\"${this.choiceSelected}\" ?disabled=\"${this.disabled}\" ?readonly=\"${this.readonly}\">\n ${this.options.map(\n option => html`\n <option value=\"${option.value}\" ?selected=\"${option.selected}\">${unsafeHTML(option.textContent)}</option>\n `\n )}\n </select>\n\n ${unsafeHTML(this.correctOption)}\n `;\n }\n\n connectedCallback() {\n super.connectedCallback();\n this.addEventListener('on-dropdown-selected', this.choiceSelected);\n const choices = Array.from(this.querySelectorAll('qti-inline-choice'));\n this.options = [\n {\n textContent: this.dataPrompt,\n value: '',\n selected: false\n },\n ...choices.map(choice => ({\n textContent: choice.innerHTML,\n value: choice.getAttribute('identifier'),\n selected: false\n }))\n ];\n }\n\n disconnectedCallback() {\n this.removeEventListener('on-dropdown-selected', this.choiceSelected);\n }\n\n public validate(): boolean {\n const selectedOption = this.options.find(option => option.selected);\n return selectedOption ? selectedOption.value !== '' : false;\n }\n\n public reset() {\n this.options = this.options.map((option, i) => ({ ...option, selected: i === 0 }));\n }\n\n public set response(value: string | null) {\n this.options = this.options.map(option => {\n if (value && value === option.value) {\n option.selected = true;\n }\n return option;\n });\n }\n get response(): string | null {\n return this.options.find(option => option.selected)?.value || null;\n }\n\n toggleCorrectResponse(responseVariable: ResponseVariable, show: boolean) {\n this.correctResponse = show && responseVariable.correctResponse?.toString();\n if (!this.correctResponse) {\n this.correctOption = '';\n return;\n }\n\n // textSpan.classList.add('correct-option');\n // textSpan.textContent = text;\n\n // // Apply styles\n // textSpan.style.border = '1px solid var(--qti-correct)';\n // textSpan.style.borderRadius = '4px';\n // textSpan.style.padding = '2px 4px';\n // textSpan.style.margin = '4px';\n // textSpan.style.display = 'inline-block';\n\n this.correctOption = `<span part=\"correct-option\" style=\"border:1px solid var(--qti-correct); border-radius:4px; padding: 2px 4px; margin: 4px; display:inline-block\">${\n this.options.find(option => this.correctResponse === option.value).textContent\n }</span>`;\n }\n\n protected choiceSelected(event: Event) {\n const selectedOptionValue = (event.target as HTMLSelectElement).value;\n this.options = this.options.map(option => ({ ...option, selected: option.value === selectedOptionValue }));\n this.saveResponse(selectedOptionValue);\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-inline-choice-interaction': QtiInlineChoiceInteraction;\n }\n}\n","import { css, html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\n@customElement('qti-inline-choice')\nexport class QtiInlineChoice extends LitElement {\n static override get styles() {\n return [\n css`\n :host {\n display: block;\n cursor: pointer;\n }\n `\n ];\n }\n\n @property({ type: String })\n identifier: string;\n\n override connectedCallback() {\n super.connectedCallback();\n\n this.addEventListener('click', this._onSelectInlineChoice);\n\n this.dispatchEvent(\n new CustomEvent('qti-inline-choice-register', {\n bubbles: true,\n composed: true,\n cancelable: false\n })\n );\n }\n\n override disconnectedCallback() {\n this.removeEventListener('click', this._onSelectInlineChoice);\n }\n\n override render() {\n return html` <slot></slot> `;\n }\n\n private _onSelectInlineChoice() {\n // if (this.disabled || this.readonly) return;\n\n this.dispatchEvent(\n new CustomEvent('qti-inline-choice-select', {\n bubbles: true,\n cancelable: false,\n composed: true,\n detail: { identifier: this.identifier }\n })\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-inline-choice': QtiInlineChoice;\n }\n}\n","import { css, html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport { ActiveElementMixin } from './internal/active-element/active-element.mixin';\n\n/* \nqti-match-interaction\nqti-associate-interaction\n*/\n@customElement('qti-simple-associable-choice')\n// tslint:disable: indent\nexport class QtiSimpleAssociableChoice extends ActiveElementMixin(LitElement, 'qti-simple-associable-choice') {\n static styles = css`\n :host {\n display: flex;\n user-select: none;\n }\n slot {\n width: 100%;\n display: block;\n }\n slot[name='qti-simple-associable-choice'] {\n /* width: 100%; */\n }\n `;\n\n /** the minimal number of selections a candidate must make */\n @property({\n type: Number,\n attribute: 'match-min'\n })\n public matchMin: number = 0;\n\n /** the maximum number of selections a candidate must make, the other options will be disabled when max options is checked */\n @property({\n type: Number,\n attribute: 'match-max'\n })\n public matchMax: number = 1;\n\n @property({\n type: String,\n attribute: 'fixed',\n converter: {\n fromAttribute: (value: string | null) => value === 'true',\n toAttribute: (value: boolean) => String(value)\n }\n })\n public fixed: boolean = false;\n\n // pk: This needs some explanation\n // in the associate interaction there is a special slot for these qti-simple-associable-choices\n override connectedCallback(): void {\n super.connectedCallback();\n this.setAttribute('slot', 'qti-simple-associable-choice');\n this.setAttribute('part', 'qti-simple-associable-choice');\n }\n\n // pk: This needs some explanation\n // in qti-match-interaction, qti-simple-associable-choice is used to denote the\n // draggable, but also the droppable. WEIRD.. but lets deal with it.\n // So we have a slot for whenever another qti-simple-associable-choice is dropped in here.\n // And we have slot for content like in this associate interaction\n override render() {\n return html`\n <slot part=\"slot\"></slot>\n <slot part=\"dropslot\" name=\"qti-simple-associable-choice\"></slot>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-simple-associable-choice': QtiSimpleAssociableChoice;\n }\n}\n","import '../qti-simple-associable-choice';\n\nimport { html, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\n\nimport { DragDropInteractionMixin } from '../internal/drag-drop/drag-drop-interaction-mixin';\nimport styles from './qti-match-interaction.styles';\nimport { Interaction } from '../../../exports/interaction';\n\nimport type { ResponseVariable } from '../../../exports/variables';\nimport type { CSSResultGroup } from 'lit';\nimport type { ResponseInteraction } from '../../../exports/expression-result';\nimport type { QtiSimpleAssociableChoice } from '../qti-simple-associable-choice';\n\n@customElement('qti-match-interaction')\nexport class QtiMatchInteraction extends DragDropInteractionMixin(\n Interaction,\n 'qti-simple-match-set:first-of-type qti-simple-associable-choice, qti-simple-match-set:last-of-type > qti-simple-associable-choice > qti-simple-associable-choice',\n 'qti-simple-match-set:last-of-type > qti-simple-associable-choice',\n 'qti-simple-match-set:first-of-type'\n) {\n static styles: CSSResultGroup = styles;\n\n protected rows: QtiSimpleAssociableChoice[];\n protected cols: QtiSimpleAssociableChoice[];\n protected lastCheckedRadio: HTMLInputElement | null = null;\n\n @property({ type: String }) class: string = '';\n @state() protected _response: string | string[] = [];\n // dragDropApi: TouchDragAndDrop;\n get response(): string[] {\n if (!this.classList.contains('qti-match-tabular')) return super.response as string[];\n else return this._response as string[];\n }\n set response(val: string[]) {\n if (!this.classList.contains('qti-match-tabular')) super.response = val;\n else this._response = val;\n }\n @property({ type: String, attribute: 'response-identifier' }) responseIdentifier: string = '';\n @state() protected correctOptions: { text: string; gap: string }[] = [];\n\n async connectedCallback(): Promise<void> {\n super.connectedCallback();\n this.rows = Array.from<QtiSimpleAssociableChoice>(\n this.querySelectorAll('qti-simple-match-set:first-of-type qti-simple-associable-choice')\n );\n this.cols = Array.from<QtiSimpleAssociableChoice>(\n this.querySelectorAll('qti-simple-match-set:last-of-type qti-simple-associable-choice')\n );\n\n this.response = [];\n }\n\n protected handleRadioClick = e => {\n const radio = e.target as HTMLInputElement;\n if (this.lastCheckedRadio === radio) {\n radio.checked = false;\n this.lastCheckedRadio = null;\n this.handleRadioChange(e);\n } else {\n this.lastCheckedRadio = radio;\n }\n };\n\n protected handleRadioChange = e => {\n const checkbox = e.target as HTMLInputElement;\n const value = checkbox.value;\n const name = checkbox.name;\n const type = checkbox.type;\n\n if (checkbox.checked) {\n if (!this.response) {\n this.response = [value];\n } else if (this.response.indexOf(value) === -1) {\n if (type === 'radio') {\n this.response = this.response.filter(v => v.indexOf(name) === -1);\n }\n this.response = [...this.response, value];\n }\n this.lastCheckedRadio = checkbox;\n } else {\n this.response = this.response.filter(v => v !== value);\n this.lastCheckedRadio = null;\n }\n\n this.requestUpdate();\n this.dispatchEvent(\n new CustomEvent<ResponseInteraction>('qti-interaction-response', {\n bubbles: true,\n composed: true,\n detail: {\n responseIdentifier: this.responseIdentifier,\n response: Array.isArray(this.response) ? [...this.response] : this.response\n }\n })\n );\n };\n\n validate(): boolean {\n if (this.class.split(' ').includes('qti-match-tabular')) {\n return this.response?.length === this.rows.length;\n } else {\n return super.validate();\n }\n }\n\n public toggleCorrectResponse(responseVariable: ResponseVariable, show: boolean): void {\n if (responseVariable.correctResponse) {\n const response = Array.isArray(responseVariable.correctResponse)\n ? responseVariable.correctResponse\n : [responseVariable.correctResponse];\n\n const matches = response.map(x => {\n const [text, gap] = x.split(' ');\n return { text, gap };\n });\n\n if (!this.class.split(' ').includes('qti-match-tabular')) {\n if (show) {\n // Clear old correct options first\n this.querySelectorAll('.correct-option').forEach(el => el.remove());\n\n this.cols.forEach(gap => {\n const gapId = gap.getAttribute('identifier');\n const match = matches.find(m => m.gap === gapId);\n\n if (match?.text) {\n const textEl = this.querySelector(`qti-simple-associable-choice[identifier=\"${match.text}\"]`);\n const text = textEl?.textContent?.trim();\n\n if (text && !gap.previousElementSibling?.classList.contains('correct-option')) {\n const textSpan = document.createElement('span');\n textSpan.classList.add('correct-option');\n textSpan.textContent = text;\n\n // Style the span\n textSpan.style.border = '1px solid var(--qti-correct)';\n textSpan.style.borderRadius = '4px';\n textSpan.style.padding = '2px 4px';\n textSpan.style.display = 'inline-block';\n\n // Insert before the gap\n gap.insertAdjacentElement('beforebegin', textSpan);\n }\n }\n });\n }\n } else {\n if (show) {\n this.correctOptions = matches;\n } else {\n this.correctOptions = null;\n }\n }\n } else {\n // Remove all previously added correct responses\n this.querySelectorAll('.correct-option').forEach(el => el.remove());\n }\n }\n\n override render() {\n const isTabular = this.class.split(' ').includes('qti-match-tabular');\n return html`\n <slot name=\"prompt\"></slot>\n <slot ?hidden=${isTabular}></slot>\n\n ${isTabular\n ? html`\n <table part=\"table\">\n <tr part=\"r-header\">\n <td></td>\n ${this.cols.map(col => html`<th part=\"r-header\">${unsafeHTML(col.innerHTML)}</th>`)}\n </tr>\n\n ${this.rows.map(\n row =>\n html`<tr part=\"row\">\n <td part=\"c-header\">${unsafeHTML(row.innerHTML)}</td>\n ${this.cols.map(col => {\n const rowId = row.getAttribute('identifier');\n const colId = col.getAttribute('identifier');\n const value = `${rowId} ${colId}`;\n const selectedInRowCount = this.response.filter(v => v.split(' ')[0] === rowId).length || 0;\n const checked = this.response.includes(value);\n const type = row.matchMax === 1 ? 'radio' : 'checkbox';\n const isCorrect = !!this.correctOptions?.find(x => x.text === rowId && x.gap === colId);\n const part =\n type === 'radio'\n ? `rb ${checked ? 'rb-checked' : ''} ${this.correctOptions ? (isCorrect ? 'rb-correct' : 'rb-incorrect') : ''}`\n : `cb ${checked ? 'cb-checked' : ''} ${this.correctOptions ? (isCorrect ? 'cb-correct' : 'cb-incorrect') : ''}`;\n\n // disable if match max is greater than 1 and max is reached\n const disable =\n this.correctOptions?.length > 0\n ? true\n : row.matchMax === 1\n ? false\n : row.matchMax !== 0 && selectedInRowCount >= row.matchMax && !checked;\n return html`<td part=\"input-cell\">\n <div\n class=\"input-container\"\n style=\"position: relative; width: 24px; height: 24px; margin: 0 auto;\"\n >\n <input\n type=${type}\n part=${part}\n name=${rowId}\n value=${value}\n .disabled=${disable}\n @change=${e => this.handleRadioChange(e)}\n @click=${e => (row.matchMax === 1 ? this.handleRadioClick(e) : null)}\n />\n ${type === 'checkbox' && checked\n ? html`\n <svg\n part=\"checkmark\"\n viewBox=\"0 0 24 24\"\n style=\"position: absolute; width: 20px; height: 20px; top: 2px; left: 2px; pointer-events: none;\"\n >\n <path d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41L9 16.17z\" fill=\"white\" />\n </svg>\n `\n : ''}\n </div>\n </td>`;\n })}\n </tr>`\n )}\n </table>\n `\n : nothing}\n\n <div role=\"alert\" id=\"validationMessage\"></div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-match-interaction': QtiMatchInteraction;\n }\n}\n","import { css } from 'lit';\n// import componentStyles from '../../utilities/styles/component.styles';\n\n/* ${componentStyles} */\nexport default css`\n slot:not([hidden]) {\n /* slot where the */\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n align-items: flex-start; /* prevents the drag and drop container slots having the same height */\n }\n :host(.qti-choices-top) slot {\n flex-direction: column;\n }\n :host(.qti-choices-bottom) slot {\n flex-direction: column-reverse;\n }\n :host(.qti-choices-left) slot {\n flex-direction: row;\n }\n :host(.qti-choices-right) slot {\n flex-direction: row-reverse;\n }\n slot[name='prompt'] {\n display: block;\n }\n ::slotted(qti-simple-match-set) {\n /* Make sure the drag and drop container slots have the same width */\n flex: 1;\n }\n`;\n","import { css, html } from 'lit';\nimport { customElement } from 'lit/decorators.js';\n\nimport { Interaction } from '../../../exports/interaction';\n\n@customElement('qti-media-interaction')\nexport class QtiMediaInteraction extends Interaction {\n private _value = null;\n reset() {\n // throw new Error('Method not implemented.');\n }\n validate(): boolean {\n return true;\n // maybe check if the media has been played?\n }\n\n get response(): string | null {\n return this._value ? this._value.toString() : null;\n }\n\n set response(val: string | null) {\n if (val) {\n const isNumber = !isNaN(parseInt(val?.toString()));\n if (isNumber) {\n this._value = parseInt(val.toString());\n } else {\n throw new Error(`Value must be a number ${val}`);\n }\n }\n }\n\n static override get properties() {\n return {\n ...Interaction.properties,\n ...{\n step: {\n type: Number,\n attribute: 'step',\n default: 10\n }\n }\n };\n }\n\n static override styles = [css``];\n\n override render() {\n return html` <slot name=\"prompt\"></slot>\n <slot></slot>`;\n }\n\n constructor() {\n super();\n }\n\n override connectedCallback() {\n super.connectedCallback();\n // get audio, video of object tag.\n const mediaObject = this.querySelector('audio') || this.querySelector('video') || this.querySelector('object');\n if (mediaObject) {\n // listen to ended event\n mediaObject.addEventListener('ended', () => {\n // set value to 0\n // check if this.value is a number\n this._value++;\n this.saveResponse(this.value);\n });\n }\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-media-interaction': QtiMediaInteraction;\n }\n}\n","import { html } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport { DragDropInteractionMixin } from '../internal/drag-drop/drag-drop-interaction-mixin';\nimport { Interaction } from '../../../exports/interaction';\nimport styles from './qti-order-interaction.styles';\n\nimport type { ResponseVariable } from '../../../exports/variables';\nimport type { QtiSimpleChoice } from '../qti-simple-choice';\n@customElement('qti-order-interaction')\nexport class QtiOrderInteraction extends DragDropInteractionMixin(\n Interaction,\n `qti-simple-choice`,\n 'drop-list',\n `slot[part='drags']`\n) {\n static styles = styles;\n protected childrenMap: Element[];\n\n @state() protected nrChoices: number = 0;\n @state() correctResponses: string[] = [];\n @state() showCorrectResponses: boolean = false;\n\n /** orientation of choices */\n @property({ type: String })\n public orientation: 'horizontal' | 'vertical';\n\n override render() {\n const choices = Array.from(this.querySelectorAll('qti-simple-choice'));\n if (this.nrChoices < choices.length) {\n this.nrChoices = choices.length;\n }\n\n return html` <slot name=\"prompt\"> </slot>\n <div part=\"container\">\n <slot part=\"drags\"> </slot>\n <div part=\"drops\">\n ${[...Array(this.nrChoices)].map(\n (_, i) => html`<drop-list role=\"region\" part=\"drop-list\" identifier=\"droplist${i}\"></drop-list>`\n )}\n </div>\n </div>`;\n }\n\n public toggleCorrectResponse(responseVariable: ResponseVariable, show: boolean): void {\n // Always start by removing old correct answers\n this.shadowRoot.querySelectorAll('.correct-option').forEach(option => option.remove());\n\n if (show && responseVariable.correctResponse) {\n const response = Array.isArray(responseVariable.correctResponse)\n ? responseVariable.correctResponse\n : [responseVariable.correctResponse];\n\n const correctIds = response.map(r => r.split(' ')[0]); // e.g., ['A', 'B', 'C']\n\n const used = new Set<string>(); // to track already rendered correct-answers\n\n const gaps = this.querySelectorAll('qti-simple-choice');\n\n gaps.forEach((gap, i) => {\n const identifier = gap.getAttribute('identifier');\n if (!identifier || !correctIds.includes(identifier)) return;\n\n // Only render once per identifier\n if (used.has(identifier)) return;\n used.add(identifier);\n\n // Get the choice label\n const text = gap.textContent?.trim();\n if (!text) return;\n\n const relativeDrop = this.shadowRoot.querySelector(`drop-list[identifier=\"droplist${i}\"]`);\n if (!relativeDrop) return;\n\n const span = document.createElement('span');\n span.classList.add('correct-option');\n span.textContent = text;\n\n // Style\n span.style.border = '1px solid var(--qti-correct)';\n span.style.borderRadius = '4px';\n span.style.padding = '2px 4px';\n span.style.display = 'inline-block';\n span.style.marginTop = '4px';\n\n relativeDrop.insertAdjacentElement('afterend', span);\n });\n }\n }\n\n // some interactions have a different way of getting the response\n // this is called from the drag and drop mixin class\n // you have to implement your own getResponse method in the superclass\n // cause they are different for some interactions.\n getValue(val: string[]) {\n return val?.map((v, i) => `${v} droplist${i}`) || [];\n }\n\n // some interactions have a different way of getting the response\n // this is called from the drag and drop mixin class\n // you have to implement your own getResponse method in the superclass\n // cause they are different for some interactions.\n // MH: is this function called? Shouldn't we use getValue?\n protected getResponse(): string[] {\n const droppables = Array.from<QtiSimpleChoice>(this.shadowRoot.querySelectorAll('drop-list'));\n\n const response = droppables.map(droppable => {\n const dragsInDroppable = droppable.querySelectorAll('[qti-draggable=\"true\"]');\n const identifiers = Array.from(dragsInDroppable).map(d => d.getAttribute('identifier'));\n return [...identifiers].join(' ');\n });\n return response;\n }\n\n override async firstUpdated(changedProps) {\n super.firstUpdated(changedProps);\n this.childrenMap = Array.from(this.querySelectorAll('qti-simple-choice'));\n this.childrenMap.forEach(el => el.setAttribute('part', 'qti-simple-choice'));\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-order-interaction': QtiOrderInteraction;\n }\n}\n","import { css } from 'lit';\n// import componentStyles from '../../utilities/styles/component.styles';\n// :host {\n// display: inline-block;\n// position: relative;\n// }\n/* ${componentStyles} */\nexport default css`\n [part='drags'] {\n display: flex;\n align-items: flex-start;\n flex: 1;\n flex-wrap: wrap;\n }\n\n [part='drops'] {\n flex: 1;\n display: grid;\n grid-auto-flow: column;\n grid-auto-columns: 1fr;\n }\n\n :host([orientation='horizontal']) [part='drags'] {\n flex-direction: row;\n }\n :host([orientation='horizontal']) [part='drops'] {\n grid-auto-flow: column;\n }\n :host([orientation='vertical']) [part='drags'] {\n flex-direction: column;\n }\n :host([orientation='vertical']) [part='drops'] {\n grid-auto-flow: row;\n }\n\n [part='drop-list'] {\n display: block;\n flex: 1;\n }\n\n [part='container'] {\n display: flex;\n gap: 0.5rem;\n }\n :host(.qti-choices-top) [part='container'] {\n flex-direction: column;\n }\n :host(.qti-choices-bottom) [part='container'] {\n flex-direction: column-reverse;\n }\n :host(.qti-choices-left) [part='container'] {\n flex-direction: row;\n }\n :host(.qti-choices-right) [part='container'] {\n flex-direction: row-reverse;\n }\n`;\n","import { css, html } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { consume } from '@lit/context';\n\nimport styles from './qti-portable-custom-interaction.styles';\nimport { Interaction } from '../../../exports/interaction';\nimport { itemContext } from '../../../exports/qti-assessment-item.context';\nimport { removeDoubleSlashes } from '../../internal/utils';\n\nimport type { ResponseVariable } from '../../../exports/variables';\nimport type { CSSResultGroup } from 'lit';\nimport type { ItemContext } from '../../../exports/item.context';\nimport type { BaseType, Cardinality } from '../../../exports/expression-result';\nimport type {\n ConfigProperties,\n IMSpci,\n ModuleResolutionConfig,\n QtiVariableJSON,\n ResponseVariableType\n} from './interface';\n\ndeclare const requirejs: any;\ndeclare const define: any;\n\n@customElement('qti-portable-custom-interaction')\nexport class QtiPortableCustomInteraction extends Interaction {\n private _value: string | string[];\n\n // Only used in direct mode\n private pci: IMSpci<ConfigProperties<unknown>>;\n\n // Only used in iframe mode\n protected _iframeLoaded = false;\n protected _pendingMessages: Array<{ method: string; params: any }> = [];\n protected iframe: HTMLIFrameElement;\n\n private _responseCheckInterval: number | null = null;\n private _lastResponseStr: string = '';\n\n // Define a static style that applies to both direct and iframe modes\n static styles: CSSResultGroup = [\n styles,\n // Add default width/height for direct mode\n css`\n :host {\n display: block;\n width: 100%;\n min-height: 50px;\n }\n .qti-customInteraction {\n display: block;\n width: 100%;\n min-height: 50px;\n }\n `\n ];\n\n @property({ type: String, attribute: 'module' })\n module: string;\n\n @property({ type: String, attribute: 'custom-interaction-type-identifier' })\n customInteractionTypeIdentifier: string;\n\n @property({ type: String, attribute: 'data-require-paths' })\n requirePathsJson: string = '';\n\n @property({ type: String, attribute: 'data-require-shim' })\n requireShimJson: string = '';\n\n @property({ type: String, attribute: 'data-require-js-url' })\n requireJsUrl: string = 'https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js';\n\n @property({ type: String, attribute: 'data-base-url' })\n baseUrl: string = '';\n\n @property({ type: Boolean, attribute: 'data-use-iframe' })\n useIframe = false;\n\n @property({ type: Boolean, attribute: 'data-use-default-shims' })\n useDefaultShims = false;\n\n @property({ type: Boolean, attribute: 'data-use-default-paths' })\n useDefaultPaths = false;\n\n @state()\n private _errorMessage: string = null;\n\n @consume({ context: itemContext, subscribe: true })\n @state()\n protected context?: ItemContext;\n\n @state() response: string | string[] = [];\n\n private dom: HTMLElement;\n\n private _parsedRequirePaths: Record<string, string | string[]> = null;\n private _parsedRequireShim: Record<string, any> = null;\n\n /**\n * Parse the require paths JSON string into an object\n */\n private getRequirePaths(): Record<string, string | string[]> {\n if (this._parsedRequirePaths === null && this.requirePathsJson) {\n try {\n // Handle the array format [{name: \"path/name\", value: \"path/value\"}, ...]\n // and convert to object format {name: value, ...}\n const parsedJson = JSON.parse(this.requirePathsJson);\n if (Array.isArray(parsedJson)) {\n this._parsedRequirePaths = {};\n parsedJson.forEach(item => {\n if (item.name && item.value) {\n this._parsedRequirePaths[item.name] = item.value;\n }\n });\n } else {\n // If it's already in object format, use it directly\n this._parsedRequirePaths = parsedJson;\n }\n } catch (e) {\n console.error('Error parsing require paths JSON:', e);\n this._errorMessage = `Error parsing require paths JSON: ${e.message}`;\n this._parsedRequirePaths = {};\n }\n }\n return this._parsedRequirePaths || {};\n }\n\n /**\n * Parse the require shim JSON string into an object\n */\n private getRequireShim(): Record<string, any> {\n if (this._parsedRequireShim === null && this.requireShimJson) {\n try {\n this._parsedRequireShim = JSON.parse(this.requireShimJson);\n } catch (e) {\n console.error('Error parsing require shim JSON:', e);\n this._errorMessage = `Error parsing require shim JSON: ${e.message}`;\n this._parsedRequireShim = {};\n }\n }\n return this._parsedRequireShim || {};\n }\n\n /**\n * Get the default require paths\n */\n private getDefaultRequirePaths(): Record<string, string | string[]> {\n return {\n 'taoQtiItem/portableLib/OAT/util/event': '/assets/pci-scripts/portableLib/OAT/util/event',\n 'taoQtiItem/portableLib/OAT/util/html': '/assets/pci-scripts/portableLib/OAT/util/html',\n 'taoQtiItem/portableLib/OAT/util/EventMgr': '/assets/pci-scripts/portableLib/OAT/util/EventMgr',\n 'taoQtiItem/portableLib/OAT/util/math': '/assets/pci-scripts/portableLib/OAT/util/math',\n 'taoQtiItem/portableLib/OAT/util/xml': '/assets/pci-scripts/portableLib/OAT/util/xml',\n 'taoQtiItem/portableLib/OAT/util/tooltip': '/assets/pci-scripts/portableLib/OAT/util/tooltip',\n 'taoQtiItem/portableLib/jquery_2_1_1': '/assets/pci-scripts/portableLib/jquery_2_1_1',\n 'taoQtiItem/pci-scripts/portableLib/jquery.qtip': '/assets/portableLib/jquery.qtip',\n 'taoQtiItem/pci-scripts/portableLib/lodash': '/assets/pci-scripts/portableLib/lodash',\n 'taoQtiItem/pci-scripts/portableLib/raphael': '/assets/pci-scripts/portableLib/raphael',\n 'IMSGlobal/jquery_2_1_1': '/assets/pci-scripts/IMSGlobal/jquery_2_1_1',\n 'OAT/util/event': '/assets/pci-scripts/legacyPortableSharedLib/OAT/util/event',\n 'OAT/util/html': '/assets/pci-scripts/legacyPortableSharedLib/OAT/util/html',\n 'OAT/util/EventMgr': '/assets/pci-scripts/legacyPortableSharedLib/OAT/util/EventMgr',\n 'OAT/util/math': '/assets/pci-scripts/legacyPortableSharedLib/OAT/util/math',\n 'OAT/util/xml': '/assets/pci-scripts/legacyPortableSharedLib/OAT/util/xml',\n 'OAT/util/tooltip': '/assets/pci-scripts/legacyPortableSharedLib/OAT/util/tooltip',\n 'OAT/lodash': '/assets/pci-scripts/legacyPortableSharedLib/lodash',\n mathJax: '/assets/pci-scripts/mathjax/mathJax',\n css: '/assets/pci-scripts/css/css'\n };\n }\n\n /**\n * Get the default require shim\n */\n private getDefaultRequireShim(): Record<string, any> {\n return {\n mathJax: {\n exports: 'MathJax',\n init: function () {\n const anyWindow = window as any;\n if (anyWindow.MathJax) {\n anyWindow.MathJax.Hub.Config({\n showMathMenu: false,\n showMathMenuMSIE: false,\n menuSettings: { inTabOrder: false }\n });\n anyWindow.MathJax.Hub.Startup.MenuZoom = function () {\n /* nothing */\n };\n anyWindow.MathJax.Hub.Startup.onload();\n return anyWindow.MathJax;\n }\n }\n }\n };\n }\n\n /**\n * Get the final require paths by combining defaults with user-provided paths\n */\n private getFinalRequirePaths(): Record<string, string | string[]> {\n const defaults = this.getDefaultRequirePaths();\n const userPaths = this.getRequirePaths();\n if (this.useDefaultPaths) {\n return { ...defaults, ...userPaths };\n }\n return userPaths;\n }\n\n /**\n * Get the final require shim by combining defaults with user-provided shim\n */\n private getFinalRequireShim(): Record<string, any> {\n const userShim = this.getRequireShim();\n const defaults = this.getDefaultRequireShim();\n if (this.useDefaultShims) {\n return { ...defaults, ...userShim };\n }\n return userShim;\n }\n\n /**\n * Converts QtiVariableJSON to a string or string array\n */\n private convertQtiVariableJSON(input: QtiVariableJSON): string | string[] {\n for (const topLevelKey in input) {\n // eslint-disable-next-line no-prototype-builtins\n if (input.hasOwnProperty(topLevelKey)) {\n const nestedObject = input[topLevelKey as 'list' | 'base'];\n if (nestedObject) {\n for (const nestedKey in nestedObject) {\n // eslint-disable-next-line no-prototype-builtins\n if (nestedObject.hasOwnProperty(nestedKey)) {\n const value = nestedObject[nestedKey as keyof typeof nestedObject];\n if (Array.isArray(value)) {\n return value.map(String); // Convert each element in the array to string\n } else if (value !== undefined && value !== null) {\n return String(value); // Convert the single value to string\n }\n }\n }\n }\n }\n }\n return null;\n }\n\n /**\n * Adds hyphenated versions of camelCase keys to properties object\n */\n private addHyphenatedKeys(properties: Record<string, any>): Record<string, any> {\n const updatedProperties = { ...properties };\n\n for (const key in properties) {\n if (Object.prototype.hasOwnProperty.call(properties, key)) {\n const hyphenatedKey = key.replace(/[A-Z]/g, char => `-${char.toLowerCase()}`);\n updatedProperties[hyphenatedKey] = properties[key];\n }\n }\n\n return updatedProperties;\n }\n\n /**\n * Converts response variables to QtiVariableJSON\n */\n protected responseVariablesToQtiVariableJSON(\n input: string | string[],\n cardinality: Cardinality,\n baseType: BaseType\n ): QtiVariableJSON {\n if (cardinality !== 'single') {\n const list = { list: {} };\n list.list[baseType] = input;\n return list;\n } else {\n const base = { base: {} };\n base.base[baseType] = input;\n return base;\n }\n }\n\n validate(): boolean {\n return true;\n }\n\n set value(v: string | null) {\n if (v === null) {\n this._value = [];\n } else {\n this._value = Array.isArray(v) ? v : v.split(',');\n }\n // PCI handles response setting via boundTo property during initialization\n // No need to call setResponse directly\n }\n\n get value(): string | null {\n if (this.useIframe) {\n return this._value?.toString() || null;\n } else {\n // Try to get the value from the PCI first for direct mode\n const pciValue = this.pci?.getResponse();\n if (pciValue) {\n const convertedValue = this.convertQtiVariableJSON(pciValue);\n return Array.isArray(convertedValue) ? convertedValue.join(',') : convertedValue;\n }\n }\n\n // Fallback to stored value\n return Array.isArray(this._value) ? this._value.join(',') : this._value?.toString() || null;\n }\n\n set boundTo(newValue: Record<string, ResponseVariableType>) {\n if (!newValue || !newValue[this.responseIdentifier]) {\n return;\n }\n\n const value = this.convertQtiVariableJSON(newValue[this.responseIdentifier]);\n this._value = value;\n\n // No direct call to setResponse - PCI will handle this during initialization\n // through the boundTo property in the config\n\n this.saveResponse(value);\n }\n\n get boundTo(): Record<string, QtiVariableJSON> {\n const responseVariable: Record<string, QtiVariableJSON> = {};\n const variable = this.context?.variables?.find(v => v.identifier === this.responseIdentifier);\n if (variable) {\n const cardinality =\n this.context?.variables?.find(v => v.identifier === this.responseIdentifier)?.cardinality || 'single';\n const baseType =\n this.context?.variables?.find(v => v.identifier === this.responseIdentifier)?.baseType || 'string';\n const value = this.context?.variables?.find(v => v.identifier === this.responseIdentifier)?.value || null;\n const responseVal = this.responseVariablesToQtiVariableJSON(value as string | string[], cardinality, baseType);\n responseVariable[this.responseIdentifier] = responseVal;\n }\n\n return responseVariable;\n }\n\n /**\n * DIRECT MODE: Register PCI instance\n */\n register(pci: IMSpci<ConfigProperties<unknown>>) {\n this.pci = pci;\n this.dom = this.querySelector('qti-interaction-markup');\n if (!this.dom) {\n this.dom = document.createElement('div');\n this.appendChild(this.dom);\n }\n this.dom.classList.add('qti-customInteraction');\n\n // Add explicit styling to DOM element for direct mode\n this.dom.style.width = '100%';\n this.dom.style.minHeight = '50px';\n this.dom.style.display = 'block';\n\n this.dom.addEventListener('qti-interaction-changed', this._onInteractionChanged);\n if (this.querySelector('properties')) {\n (this.querySelector('properties') as HTMLElement).style.display = 'none';\n }\n\n const config: any = {\n properties: this.addHyphenatedKeys({ ...this.dataset }),\n onready: pciInstance => {\n this.pci = pciInstance;\n\n // Initialize the last response string once the PCI is ready\n if (this.pci && typeof this.pci.getResponse === 'function') {\n try {\n const response = this.pci.getResponse();\n this._lastResponseStr = JSON.stringify(response);\n } catch (error) {\n console.error('Error getting initial response:', error);\n }\n }\n\n // Set up a ResizeObserver to handle dynamic size changes in direct mode\n try {\n const resizeObserver = new ResizeObserver(entries => {\n for (const entry of entries) {\n if (entry.contentRect) {\n // Adjust container height based on content\n if (entry.contentRect.height > 0) {\n // Add a small buffer for padding\n this.style.height = `${entry.contentRect.height + 20}px`;\n }\n }\n }\n });\n\n // Observe the DOM element\n resizeObserver.observe(this.dom);\n\n // Store reference for cleanup\n (this as any)._resizeObserver = resizeObserver;\n } catch (e) {\n console.warn('ResizeObserver not supported, falling back to static sizing');\n }\n },\n ondone: (_pciInstance, response, _state, _status: 'interacting' | 'closed' | 'solution' | 'review') => {\n this.response = this.convertQtiVariableJSON(response);\n this.saveResponse(this.response);\n // Update the last response string\n this._lastResponseStr = JSON.stringify(response);\n },\n responseIdentifier: this.responseIdentifier,\n boundTo: this.boundTo\n };\n\n if (pci.getInstance) {\n pci.getInstance(this.dom, config, undefined);\n } else {\n // Try the TAO custom interaction initialization.\n const restoreTAOConfig = (element: HTMLElement): any => {\n const config: any = {};\n\n const parseDataAttributes = (element: HTMLElement) => {\n const result: Record<string, any> = {};\n\n // Separate direct attributes from nested ones\n Object.entries(element.dataset).forEach(([key, value]) => {\n if (!key.includes('__')) {\n // Direct attributes (like version)\n result[key] = value;\n }\n });\n\n // Parse nested attributes\n const nestedData: Record<string, Record<string, any>> = {};\n\n Object.entries(element.dataset).forEach(([key, value]) => {\n const parts = key.split('__');\n if (parts.length > 1) {\n const [group, index, prop] = parts;\n nestedData[group] = nestedData[group] || {};\n nestedData[group][index] = nestedData[group][index] || {};\n nestedData[group][index][prop] = value;\n }\n });\n\n // Convert nested groups to arrays\n Object.entries(nestedData).forEach(([key, group]) => {\n result[key] = Object.values(group);\n });\n\n return result;\n };\n\n const data = parseDataAttributes(element);\n for (const key in data) {\n if (Object.prototype.hasOwnProperty.call(data, key)) {\n const value = data[key];\n if (key === 'config') {\n config[key] = JSON.parse(value);\n } else {\n config[key] = value;\n }\n }\n }\n return config;\n };\n const taoConfig = restoreTAOConfig(this);\n (pci as any).initialize(\n this.customInteractionTypeIdentifier,\n this.dom.firstElementChild || this.dom,\n Object.keys(taoConfig).length ? taoConfig : null\n );\n }\n }\n\n /* ... rest of the code remains the same ... */\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n\n if (this.useIframe) {\n // IFRAME MODE cleanup\n window.removeEventListener('message', this.handleIframeMessage);\n } else {\n // DIRECT MODE cleanup\n // Clean up ResizeObserver if it exists\n // DIRECT MODE cleanup\n // Stop response checking interval\n this.stopResponseCheck();\n if ((this as any)._resizeObserver) {\n (this as any)._resizeObserver.disconnect();\n (this as any)._resizeObserver = null;\n }\n\n requirejs.undef(this.customInteractionTypeIdentifier);\n // Clear the modules in the context\n const context = requirejs.s.contexts;\n delete context[this.customInteractionTypeIdentifier];\n // Remove the event listener when the component is disconnected\n this.removeEventListener('qti-interaction-changed', this._onInteractionChanged);\n }\n }\n\n /**\n * IFRAME MODE: Send message to iframe\n */\n protected sendMessageToIframe(method: string, params: any) {\n if (!this._iframeLoaded) {\n this._pendingMessages.push({ method, params });\n return;\n }\n this.iframe.contentWindow.postMessage(\n {\n source: 'qti-portable-custom-interaction',\n method,\n params\n },\n '*'\n );\n }\n\n /**\n * IFRAME MODE: Process pending messages\n */\n private processPendingMessages() {\n if (this._pendingMessages.length) {\n this._pendingMessages.forEach(message => {\n this.sendMessageToIframe(message.method, message.params);\n });\n this._pendingMessages = [];\n }\n }\n\n /**\n * IFRAME MODE: Handle iframe messages\n */\n protected handleIframeMessage = (event: MessageEvent) => {\n const { data } = event;\n // Ensure the message is from our iframe\n if (!data || data.source !== 'qti-pci-iframe') {\n return;\n }\n switch (data.method) {\n case 'iframeReady':\n this.initializeInteraction();\n this.processPendingMessages();\n this.dispatchEvent(\n new CustomEvent('qti-portable-custom-interaction-loaded', {\n bubbles: true\n })\n );\n break;\n\n case 'resize':\n if (typeof data.height === 'number' && this.iframe) {\n this.iframe.style.height = `${data.height}px`;\n this.iframe.style.width = `${data.width}px`;\n }\n break;\n\n case 'interactionChanged': {\n const value = this.convertQtiVariableJSON(data.params.value);\n console.log('Interaction changed:', value);\n this.response = value;\n this.validate();\n this.saveResponse(this.response);\n break;\n }\n case 'error':\n this._errorMessage = data.params.message;\n console.error('Error from PCI iframe:', data.params.message);\n break;\n }\n };\n\n /**\n * IFRAME MODE: Create iframe element\n */\n protected createIframe() {\n this.iframe = document.createElement('iframe');\n this.iframe.id = `pci-iframe-${this.responseIdentifier}`;\n this.iframe.setAttribute('title', 'QTI PCI Iframe');\n this.iframe.setAttribute('aria-label', 'QTI PCI Iframe');\n this.iframe.setAttribute('aria-hidden', 'false');\n this.iframe.setAttribute('role', 'application');\n this.iframe.style.width = '100%';\n this.iframe.style.border = 'none';\n this.iframe.style.display = 'block';\n\n // Handle iframe load event\n this.iframe.onload = () => {\n this._iframeLoaded = true;\n this.addMarkupToIframe();\n // Send initialization data to iframe\n this.sendIframeInitData();\n };\n\n // Create a unique name for the iframe\n const iframeName = `qti-pci-${this.responseIdentifier}-${Date.now()}`;\n this.iframe.name = iframeName;\n\n // Generate iframe HTML content with all required scripts\n const iframeContent = this.generateIframeContent();\n\n // Set iframe src as data URI\n const encodedContent = encodeURIComponent(iframeContent);\n this.iframe.src = `data:text/html;charset=utf-8,${encodedContent}`;\n\n // Append iframe to component\n this.appendChild(this.iframe);\n }\n\n /**\n * IFRAME MODE: Send initialization data to iframe\n */\n private sendIframeInitData() {\n // Once iframe is loaded, send initialization data\n const initData = {\n module: this.module,\n customInteractionTypeIdentifier: this.customInteractionTypeIdentifier,\n baseUrl: !this.baseUrl\n ? window.location.origin\n : this.baseUrl.startsWith('http') || this.baseUrl.startsWith('blob') || this.baseUrl.startsWith('base64')\n ? this.baseUrl\n : removeDoubleSlashes(`${window.location.origin}${this.baseUrl}`),\n responseIdentifier: this.responseIdentifier,\n dataAttributes: { ...this.dataset },\n interactionModules: this.getInteractionModules(),\n boundTo: this.boundTo\n };\n\n this.sendMessageToIframe('initialize', initData);\n }\n\n /**\n * IFRAME MODE: Get interaction modules from DOM\n */\n private getInteractionModules() {\n const modules = [];\n const interactionModules = this.querySelector('qti-interaction-modules');\n\n if (interactionModules) {\n const moduleElements = interactionModules.querySelectorAll('qti-interaction-module');\n for (const module of moduleElements) {\n modules.push({\n id: module.getAttribute('id'),\n primaryPath: module.getAttribute('primary-path'),\n fallbackPath: module.getAttribute('fallback-path')\n });\n }\n }\n\n return modules;\n }\n\n /**\n * IFRAME MODE: Add markup and properties to iframe\n */\n private addMarkupToIframe() {\n // Get interaction markup if any\n const markup = this.querySelector('qti-interaction-markup');\n if (markup) {\n this.sendMessageToIframe('setMarkup', markup.innerHTML);\n }\n // Get properties if any\n const properties = this.querySelector('properties');\n if (properties) {\n this.sendMessageToIframe('setProperties', properties.innerHTML);\n }\n }\n\n /**\n * IFRAME MODE: Initialize the interaction\n */\n private initializeInteraction() {\n // No explicit action needed, as the PCI will initialize\n // with the boundTo property already provided\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n\n if (this.useIframe) {\n // IFRAME MODE\n window.addEventListener('message', this.handleIframeMessage);\n this.createIframe();\n } else {\n // DIRECT MODE\n define('qtiCustomInteractionContext', () => {\n return {\n register: ctxA => {\n this.register(ctxA);\n },\n notifyReady: () => {\n /* only used in the TAO version */\n }\n };\n });\n\n const config = this.buildRequireConfig();\n if (config) {\n const requirePCI = requirejs.config(config);\n requirejs.onError = function (err) {\n console.error('RequireJS error:', err);\n if (err.requireType === 'timeout') {\n console.error('Modules that timed out:', err.requireModules);\n }\n throw err;\n };\n requirePCI(['require'], require => {\n try {\n require([this.module], () => {}, err => {\n console.error('Error loading module:', err);\n });\n } catch (error) {\n console.error('Error in require call:', error);\n }\n });\n // Start periodically checking for response changes\n this.startResponseCheck();\n }\n }\n }\n\n /**\n * Start checking for response changes at regular intervals\n */\n private startResponseCheck(): void {\n // Clear any existing interval\n this.stopResponseCheck();\n\n // Set up a new interval\n this._responseCheckInterval = window.setInterval(() => {\n if (this.pci && typeof this.pci.getResponse === 'function') {\n try {\n const response = this.pci.getResponse();\n const responseStr = JSON.stringify(response);\n if (responseStr !== this._lastResponseStr) {\n this._lastResponseStr = responseStr;\n const convertedValue = this.convertQtiVariableJSON(response);\n this.saveResponse(convertedValue);\n }\n } catch (error) {\n console.error('Error checking for response changes:', error);\n }\n }\n }, 500);\n }\n\n /**\n * Stop checking for response changes\n */\n private stopResponseCheck(): void {\n if (this._responseCheckInterval !== null) {\n window.clearInterval(this._responseCheckInterval);\n this._responseCheckInterval = null;\n }\n }\n\n private _onInteractionChanged = (event: CustomEvent) => {\n // Prevent further propagation of the event\n event.stopPropagation();\n\n // Optionally, handle the event here (e.g., update internal state)\n const value = this.convertQtiVariableJSON(event.detail.value);\n this.response = value;\n this.saveResponse(value);\n };\n\n /**\n * DIRECT MODE: Build RequireJS configuration\n */\n buildRequireConfig() {\n // Set RequireJS paths and shim configuration if available\n const config: ModuleResolutionConfig = {\n context: this.customInteractionTypeIdentifier,\n catchError: true,\n paths: { ...this.getFinalRequirePaths(), ...(window['requirePaths'] || {}) },\n shim: { ...this.getFinalRequireShim(), ...(window['requireShim'] || {}) }\n };\n // Check if RequireJS is available, if not, set an error message\n if (!globalThis.require) {\n this._errorMessage = `RequireJS not found. Please load it via CDN: https://cdnjs.com/libraries/require.js`;\n return null;\n }\n const baseUrl = this.getAttribute('data-base-url');\n const interactionModules = this.querySelector('qti-interaction-modules');\n\n if (interactionModules) {\n const modules = interactionModules.querySelectorAll('qti-interaction-module');\n for (const module of modules) {\n const moduleId = module.getAttribute('id');\n const primaryPath = module.getAttribute('primary-path');\n const fallbackPath = module.getAttribute('fallback-path');\n\n if (moduleId && primaryPath) {\n // Set the paths using RequireJS's fallback array\n const paths = fallbackPath\n ? this.combineRequireResolvePaths(\n this.getResolvablePath(primaryPath, baseUrl),\n this.getResolvablePath(fallbackPath, baseUrl)\n )\n : this.getResolvablePath(primaryPath, baseUrl);\n const existingPath = config.paths[moduleId] || [];\n config.paths[moduleId] = this.combineRequireResolvePaths(existingPath, paths);\n }\n }\n }\n return config;\n }\n\n /**\n * DIRECT MODE: Helper method to combine require paths\n */\n private combineRequireResolvePaths(path1: string | string[], path2: string | string[]) {\n const path1Array = Array.isArray(path1) ? path1 : [path1];\n const path2Array = Array.isArray(path2) ? path2 : [path2];\n return path1Array.concat(path2Array).filter((value, index, self) => self.indexOf(value) === index);\n }\n\n /**\n * DIRECT MODE: Helper method to remove double slashes\n */\n private removeDoubleSlashes(str: string) {\n const singleForwardSlashes = str\n .replace(/([^:]\\/)\\/+/g, '$1')\n .replace(/\\/\\//g, '/')\n .replace('http:/', 'http://')\n .replace('https:/', 'https://');\n return singleForwardSlashes;\n }\n\n /**\n * DIRECT MODE: Load config from URL\n */\n loadConfig = async (url: string, baseUrl?: string): Promise<ModuleResolutionConfig> => {\n url = this.removeDoubleSlashes(url);\n try {\n const requireConfig = await fetch(url);\n if (requireConfig.ok) {\n const config = await requireConfig.json();\n const moduleCong = config as ModuleResolutionConfig;\n for (const moduleId in moduleCong.paths) {\n if (baseUrl) {\n moduleCong.paths[moduleId] = this.getResolvablePath(moduleCong.paths[moduleId], baseUrl);\n }\n }\n return moduleCong;\n }\n } catch (e) {\n // do nothing\n }\n return null;\n };\n\n /**\n * DIRECT MODE: Helper method to get resolvable path string\n */\n getResolvablePathString = (path: string, basePath?: string) => {\n path = path.replace(/\\.js$/, '');\n return path?.toLocaleLowerCase().startsWith('http') || !basePath\n ? path\n : this.removeDoubleSlashes(`${basePath}/${path}`);\n };\n\n /**\n * DIRECT MODE: Helper method to get resolvable path\n */\n getResolvablePath = (path: string | string[], basePath?: string) => {\n return Array.isArray(path)\n ? path.map(p => this.getResolvablePathString(p, basePath))\n : this.getResolvablePathString(path, basePath);\n };\n\n /**\n * IFRAME MODE: Generate iframe HTML content\n */\n protected generateIframeContent(): string {\n const parentStyles = window.getComputedStyle(document.body);\n\n // Get the configured require paths and shim\n const requirePaths = JSON.stringify(this.getFinalRequirePaths());\n const requireShim = JSON.stringify(this.getFinalRequireShim());\n\n // Extract just the font-related properties you want to copy\n const fontStyles = `\n font-family: ${parentStyles.getPropertyValue('font-family')};\n font-size: ${parentStyles.getPropertyValue('font-size')};\n line-height: ${parentStyles.getPropertyValue('line-height')};\n font-weight: ${parentStyles.getPropertyValue('font-weight')};\n color: ${parentStyles.getPropertyValue('color')};\n `;\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\" />\n <title>QTI PCI Container</title>\n <base href=\"${window.location.origin}\" /> \n <style>\n body, html {\n margin: 0;\n padding: 0;\n width: 100%;\n height: auto;\n overflow: hidden;\n /* Add the extracted font styles here */\n ${fontStyles}\n }\n .qti-customInteraction {\n width: 100%;\n height: 100%;\n }\n #pci-container {\n width: 100%;\n </style>\n <script src=\"${this.requireJsUrl}\"></script>\n <script>\n // Define standard paths and shims\n window.requirePaths = ${requirePaths};\n \n window.requireShim = ${requireShim};\n\n // Single initial RequireJS configuration with error handling\n window.requirejs.config({\n catchError: true,\n waitSeconds: 30,\n paths: window.requirePaths,\n shim: window.requireShim,\n onNodeCreated: function(node, config, moduleName, url) {\n console.log('RequireJS creating node for module:', moduleName, 'URL:', url);\n \n // Add error handler to script node\n node.addEventListener('error', function(evt) {\n console.error('Script load error for module:', moduleName, 'URL:', url, 'Event:', evt);\n });\n },\n onError: function(err) {\n console.error('RequireJS error:', {\n type: err.requireType,\n modules: err.requireModules,\n error: err\n });\n \n if (err.requireType === 'scripterror') {\n console.error('Script error usually indicates a network or CORS issue with:', err.requireModules);\n }\n \n // Notify parent window about the error\n window.parent.postMessage({\n source: 'qti-pci-iframe',\n method: 'error',\n params: {\n message: 'RequireJS ' + err.requireType + ' error for modules: ' + err.requireModules,\n details: {\n type: err.requireType,\n modules: err.requireModules,\n error: err.toString()\n }\n }\n }, '*');\n }\n });\n \n // PCI Manager for iframe implementation \n window.PCIManager = {\n pciInstance: null,\n container: null,\n customInteractionTypeIdentifier: null,\n \n initialize: function(config) {\n this.customInteractionTypeIdentifier = config.customInteractionTypeIdentifier;\n this.container = document.getElementById('pci-container');\n this.container.classList.add('qti-customInteraction');\n \n function getResolvablePath(path, basePath) {\n if (Array.isArray(path)) {\n return path.map(p => getResolvablePathString(p, basePath));\n } else {\n return getResolvablePathString(path, basePath);\n }\n }\n\n function removeDoubleSlashes(str) {\n return str\n .replace(/([^:\\\\/])\\\\/\\\\/+/g, '$1/')\n .replace(/\\\\/\\\\//g, '/')\n .replace('http:/', 'http://')\n .replace('https:/', 'https://');\n }\n \n function getResolvablePathString(path, basePath) {\n path = path.replace(/\\\\.js$/, '');\n return path?.toLocaleLowerCase().startsWith('http') || !basePath\n ? path\n : removeDoubleSlashes(\\`\\${basePath}/\\${path}\\`);\n }\n\n function combineRequireResolvePaths(path1, path2, baseUrl) {\n path1 = getResolvablePath(path1, baseUrl);\n const path1Array = Array.isArray(path1) ? path1 : [path1];\n if (!path2) {\n return path1Array;\n }\n path2 = getResolvablePath(path2, baseUrl);\n const path2Array = Array.isArray(path2) ? path2 : [path2];\n return path1Array.concat(path2Array).filter((value, index, self) => self.indexOf(value) === index);\n }\n\n // Update paths with modules from the config\n if (config.interactionModules && config.interactionModules.length > 0) {\n config.interactionModules.forEach(module => {\n if (module.id && module.primaryPath) {\n const currentPath = window.requirePaths[module.id] || [];\n const currentPaths = Array.isArray(currentPath) ? currentPath : [currentPath];\n const newPath = combineRequireResolvePaths(\n module.primaryPath, module.fallbackPath, config.baseUrl\n );\n window.requirePaths[module.id] = currentPaths.concat(newPath).filter((value, index, self) => self.indexOf(value) === index);\n }\n });\n }\n \n // The ONLY other requirejs.config call - with the context for this specific PCI\n window.requirejs.config({\n context: this.customInteractionTypeIdentifier,\n paths: window.requirePaths,\n shim: window.requireShim\n });\n \n // Define qtiCustomInteractionContext for the PCI\n define('qtiCustomInteractionContext', () => {\n return {\n register: pciInstance => {\n this.pciInstance = pciInstance;\n // Configure PCI instance\n const pciConfig = {\n properties: this.addHyphenatedKeys({ ...config.dataAttributes }),\n onready: pciInstance => {\n this.pciInstance = pciInstance;\n this.notifyReady();\n },\n ondone: (pciInstance, response, state, status) => {\n this.notifyInteractionChanged(response);\n },\n responseIdentifier: config.responseIdentifier,\n boundTo: config.boundTo,\n };\n \n if (pciInstance.getInstance) {\n pciInstance.getInstance(this.container, pciConfig, undefined);\n } else {\n // TAO custom interaction initialization\n const restoreTAOConfig = (dataset) => {\n const config = {};\n const parseDataAttributes = () => {\n const result = {};\n\n // Separate direct attributes from nested ones\n Object.entries(dataset || []).forEach(([key, value]) => {\n if (!key.includes('__')) {\n // Direct attributes (like version)\n result[key] = value;\n }\n });\n\n // Parse nested attributes\n const nestedData = {};\n\n Object.entries(dataset || []).forEach(([key, value]) => {\n const parts = key.split('__');\n if (parts.length > 1) {\n const [group, index, prop] = parts;\n nestedData[group] = nestedData[group] || {};\n nestedData[group][index] = nestedData[group][index] || {};\n nestedData[group][index][prop] = value;\n }\n });\n\n // Convert nested groups to arrays\n Object.entries(nestedData).forEach(([key, group]) => {\n result[key] = Object.values(group);\n });\n return result;\n };\n const data = parseDataAttributes();\n for (const key in data) {\n if (Object.prototype.hasOwnProperty.call(data, key)) {\n const value = data[key];\n if (key === 'config') {\n config[key] = JSON.parse(value);\n } else {\n config[key] = value;\n }\n }\n }\n return config;\n };\n const taoConfig = restoreTAOConfig(config.dataAttributes);\n\n this.pciInstance.initialize(\n this.customInteractionTypeIdentifier,\n this.container.firstElementChild || this.container,\n Object.keys(taoConfig).length ? taoConfig : null\n );\n }\n },\n notifyReady: () => {\n // Notify parent that the PCI is ready\n window.parent.postMessage({\n source: 'qti-pci-iframe',\n method: 'pciReady'\n }, '*');\n }\n };\n });\n \n // Load the PCI module\n this.loadModule(config.module);\n },\n \n loadModule: function(modulePath) {\n try { \n // Get the context-specific require\n const contextRequire = window.requirejs.config({\n context: this.customInteractionTypeIdentifier\n });\n \n contextRequire(['require'], require => { \n // Now load the actual module\n require([modulePath], () => {\n }, err => {\n console.error('Error loading module after tap loaded:', modulePath, err);\n this.notifyError('Module load error: ' + err.toString());\n });\n });\n } catch (error) {\n console.error('Exception in loadModule:', error);\n this.notifyError('Error in require call: ' + error.toString());\n }\n },\n \n notifyReady: function() {\n window.parent.postMessage({\n source: 'qti-pci-iframe',\n method: 'iframeReady'\n }, '*');\n },\n \n notifyInteractionChanged: function(response) {\n window.parent.postMessage({\n source: 'qti-pci-iframe',\n method: 'interactionChanged',\n params: { value: response }\n }, '*');\n },\n \n notifyError: function(message) {\n console.error('PCI Error:', message);\n window.parent.postMessage({\n source: 'qti-pci-iframe',\n method: 'error',\n params: { message: message }\n }, '*');\n },\n \n setMarkup: function(markupHtml) {\n this.container = document.getElementById('pci-container');\n this.container.innerHTML = markupHtml;\n },\n \n addHyphenatedKeys: function(properties) {\n const updatedProperties = { ...properties };\n for (const key in properties) {\n if (Object.prototype.hasOwnProperty.call(properties, key)) {\n const hyphenatedKey = key.replace(/[A-Z]/g, char => \\`-\\${char.toLowerCase()}\\`);\n updatedProperties[hyphenatedKey] = properties[key];\n }\n }\n return updatedProperties;\n },\n };\n \n // Set up message listener for communication with parent\n window.addEventListener('message', function(event) {\n const { data } = event;\n \n // Ensure the message is from our parent\n if (!data || data.source !== 'qti-portable-custom-interaction') {\n return;\n }\n \n switch(data.method) {\n case 'initialize':\n PCIManager.initialize(data.params);\n break;\n \n case 'setMarkup':\n PCIManager.setMarkup(data.params);\n break;\n \n case 'setBoundTo':\n // Handle setting boundTo\n break;\n \n case 'setProperties':\n // Handle setting properties\n break;\n }\n });\n \n // Notify parent that iframe has loaded\n window.addEventListener('load', function() {\n window.parent.postMessage({\n source: 'qti-pci-iframe',\n method: 'iframeLoaded'\n }, '*');\n });\n let resizeTimeout;\n let previousHeight = 0;\n const notifyResize = () => {\n const container = document.getElementById('pci-container');\n const newHeight = container.scrollHeight + 100;\n if (newHeight !== previousHeight) {\n previousHeight = newHeight;\n clearTimeout(resizeTimeout);\n resizeTimeout = setTimeout(() => {\n window.parent.postMessage({\n source: 'qti-pci-iframe',\n method: 'resize',\n height: newHeight,\n width: container.scrollWidth\n }, '*');\n }, 100); // Adjust debounce time as needed\n }\n };\n\n function setupResizeObserver() {\n const container = document.getElementById('pci-container');\n if (!container || !(container instanceof Element)) {\n console.warn('ResizeObserver: document.container is not an Element');\n return;\n }\n\n const resizeObserver = new ResizeObserver(() => {\n notifyResize();\n });\n\n resizeObserver.observe(container);\n }\n\n // Run setup once DOM is ready\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', () => {\n notifyResize(); // initial resize\n setupResizeObserver();\n });\n } else {\n notifyResize();\n setupResizeObserver();\n }\n\n window.addEventListener('load', () => {\n notifyResize();\n });\n let lastResponseStr = '';\n setInterval(() => {\n if (PCIManager.pciInstance && PCIManager.pciInstance.getResponse) {\n const response = PCIManager.pciInstance.getResponse();\n const responseStr = JSON.stringify(response);\n \n if (responseStr !== lastResponseStr) {\n lastResponseStr = responseStr;\n window.parent.postMessage({\n source: 'qti-pci-iframe',\n method: 'interactionChanged',\n params: { value: response }\n }, '*');\n }\n }\n }, 500); // Check every 500ms\n </script>\n</head>\n<body>\n <div id=\"pci-container\"></div>\n</body>\n</html>`;\n }\n\n /**\n * Toggle the display of the correct response\n * @param responseVariable The response variable containing the correct response\n * @param show Whether to show or hide the correct response\n */\n public toggleCorrectResponse(responseVariable: ResponseVariable, show: boolean) {\n // Store the correct response or clear it based on the show parameter\n this.correctResponse = show\n ? responseVariable?.correctResponse\n : responseVariable.cardinality === 'single'\n ? ''\n : [];\n\n // Get unique identifiers for this PCI's correct response elements\n const containerId = `correct-response-container-${this.responseIdentifier}`;\n\n // Check the parent element for any existing containers with this ID\n const existingContainers = this.parentElement?.querySelectorAll(`#${containerId}`);\n if (existingContainers) {\n existingContainers.forEach(existingContainer => {\n existingContainer.remove();\n });\n }\n\n // Handle the current interaction's state\n if (show) {\n // Disable the current interaction when showing correct response\n this.disable();\n } else {\n // Enable the current interaction when hiding correct response\n this.enable();\n return; // Exit early, nothing else to do\n }\n\n // If there's no correct response to show, exit\n if (!show || !responseVariable?.correctResponse) {\n return;\n }\n\n // Create a container for the correct response viewer\n const correctResponseContainer = document.createElement('div');\n correctResponseContainer.id = containerId;\n correctResponseContainer.className = 'pci-correct-response-container';\n correctResponseContainer.style.position = 'relative';\n correctResponseContainer.style.marginTop = '20px';\n correctResponseContainer.style.border = '2px solid green';\n correctResponseContainer.style.padding = '16px';\n correctResponseContainer.style.borderRadius = '4px';\n correctResponseContainer.style.backgroundColor = 'rgba(0, 128, 0, 0.05)';\n\n // Add a label for the correct response\n const label = document.createElement('div');\n label.textContent = 'Correct Response:';\n label.style.fontWeight = 'bold';\n label.style.marginBottom = '10px';\n label.style.color = 'green';\n correctResponseContainer.appendChild(label);\n\n // Instead of cloning, we'll create a new instance and copy necessary attributes\n const correctResponseViewer = document.createElement(\n 'qti-portable-custom-interaction'\n ) as QtiPortableCustomInteraction;\n\n // Copy all attributes from the original PCI\n Array.from(this.attributes).forEach(attr => {\n if (attr.name !== 'id' && attr.name !== 'response-identifier') {\n correctResponseViewer.setAttribute(attr.name, attr.value);\n }\n });\n\n // Set a unique response identifier to avoid conflicts\n const originalResponseId = this.responseIdentifier;\n correctResponseViewer.responseIdentifier = `${originalResponseId}-correct`;\n\n // Copy any light DOM content from the original PCI\n // This includes markup and properties\n Array.from(this.children).forEach(child => {\n const clonedChild = child.cloneNode(true);\n correctResponseViewer.appendChild(clonedChild);\n });\n\n // Store the correct response value\n const correctResponseValue = responseVariable.correctResponse;\n\n // Different initialization based on mode\n if (this.useIframe) {\n // For iframe mode, add a custom connected callback\n const originalConnectedCallback = correctResponseViewer.connectedCallback;\n correctResponseViewer.connectedCallback = function () {\n // Call the original connected callback to set up the iframe\n originalConnectedCallback.call(this);\n\n // Wait for iframe to load then set the correct response\n const checkIframeLoaded = () => {\n if (this._iframeLoaded) {\n // Set response after a small delay to ensure PCI is ready\n setTimeout(() => {\n const qtiVariableJSON = this.responseVariablesToQtiVariableJSON(\n correctResponseValue,\n responseVariable.cardinality,\n responseVariable.baseType\n );\n\n // Send the correct response to the iframe\n this.sendMessageToIframe('setBoundTo', {\n [originalResponseId]: qtiVariableJSON\n });\n\n // Disable interaction with the correct response viewer\n this.sendMessageToIframe('setState', { state: 'review' });\n }, 1000);\n\n return true;\n }\n return false;\n };\n\n // Try immediately\n if (!checkIframeLoaded()) {\n // If not loaded yet, set up an interval to check\n const intervalId = setInterval(() => {\n if (checkIframeLoaded()) {\n clearInterval(intervalId);\n }\n }, 100);\n\n // Safety timeout to clear interval after 10 seconds\n setTimeout(() => {\n clearInterval(intervalId);\n }, 10000);\n }\n };\n } else {\n // For direct mode, add a custom register method\n const originalRegister = correctResponseViewer.register;\n correctResponseViewer.register = function (pci) {\n // Call the original register method\n originalRegister.call(this, pci);\n\n // Once registered, set the correct response\n const setCorrectResponse = () => {\n if (this.pci) {\n if (typeof this.pci.setResponse === 'function') {\n // Convert to the format expected by the PCI\n const pciResponse = this.responseVariablesToQtiVariableJSON(\n correctResponseValue,\n responseVariable.cardinality,\n responseVariable.baseType\n );\n\n // Set the response\n this.pci.setResponse(pciResponse);\n\n // Disable interaction if the PCI supports it\n if (typeof this.pci.setState === 'function') {\n this.pci.setState('review');\n }\n\n return true;\n }\n }\n return false;\n };\n\n // Try to set response after a delay to ensure PCI is fully initialized\n setTimeout(() => {\n if (!setCorrectResponse()) {\n // If not successful, try again with a longer delay\n const intervalId = setInterval(() => {\n if (setCorrectResponse()) {\n clearInterval(intervalId);\n }\n }, 200);\n\n // Safety timeout to clear interval after 5 seconds\n setTimeout(() => {\n clearInterval(intervalId);\n }, 5000);\n }\n }, 500);\n };\n }\n\n // Make sure the viewer is not interactive\n correctResponseViewer.style.pointerEvents = 'none';\n\n // Add the correct response viewer to the container\n correctResponseContainer.appendChild(correctResponseViewer);\n\n // Append the container after this PCI\n this.after(correctResponseContainer);\n }\n /**\n * Method to disable the PCI for review mode\n * This can be used when showing the correct response\n */\n public disable() {\n // First, store the current state of the PCI\n this._previousState = {\n pointerEvents: this.style.pointerEvents,\n position: this.style.position\n };\n\n if (this.useIframe) {\n // For iframe mode, send a message to disable interaction\n this.sendMessageToIframe('setState', { state: 'disabled' });\n } else {\n // // For direct mode, use the PCI's disable method if available\n // if (this.pci && typeof this.pci.setState === 'function') {\n // this.pci.setState('disabled');\n // }\n }\n\n // Add an overlay to prevent interaction if not already there\n const existingOverlay = this.querySelector('.pci-interaction-overlay');\n if (!existingOverlay) {\n const overlay = document.createElement('div');\n overlay.className = 'pci-interaction-overlay';\n overlay.style.position = 'absolute';\n overlay.style.top = '0';\n overlay.style.left = '0';\n overlay.style.width = '100%';\n overlay.style.height = '100%';\n overlay.style.backgroundColor = 'rgba(200, 200, 200, 0.3)';\n overlay.style.zIndex = '100';\n overlay.style.pointerEvents = 'all';\n overlay.style.cursor = 'not-allowed';\n\n // Make sure the container is relatively positioned\n if (getComputedStyle(this).position === 'static') {\n this.style.position = 'relative';\n }\n\n this.appendChild(overlay);\n }\n }\n\n /**\n * Method to enable the PCI for interactive mode\n */\n public enable() {\n // Remove any overlays\n const overlay = this.querySelector('.pci-interaction-overlay');\n if (overlay) {\n overlay.remove();\n }\n\n // Restore previous state if available\n if (this._previousState) {\n if (this._previousState.pointerEvents) {\n this.style.pointerEvents = this._previousState.pointerEvents;\n }\n if (this._previousState.position) {\n this.style.position = this._previousState.position;\n }\n this._previousState = null;\n }\n\n if (this.useIframe) {\n // For iframe mode, send a message to enable interaction\n this.sendMessageToIframe('setState', { state: 'interacting' });\n } else {\n // // For direct mode, use the PCI's enable method if available\n // if (this.pci && typeof this.pci.setState === 'function') {\n // this.pci.setState('interacting');\n // }\n }\n }\n\n // Add this property to store the previous state\n private _previousState: {\n pointerEvents?: string;\n position?: string;\n } = null;\n\n override render() {\n return html`\n <slot></slot>\n ${this._errorMessage\n ? html`<div style=\"color:red\">\n <h1>Error</h1>\n ${this._errorMessage}\n </div>`\n : ''}\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-portable-custom-interaction': QtiPortableCustomInteraction;\n }\n}\n","import { css } from 'lit';\n// import componentStyles from '../../utilities/styles/component.styles';\n\n/* ${componentStyles} */\nexport default css`\n ::slotted(qti-interaction-markup) {\n display: none;\n }\n`;\n","import { LitElement, css, html } from 'lit';\n\nexport class QtiPositionObjectInteraction extends LitElement {\n override render() {\n return html`<slot></slot>`;\n }\n\n static override styles = [\n css`\n :host {\n display: block;\n }\n ::slotted(img) {\n position: absolute;\n cursor: move;\n user-select: none;\n left: 50%;\n transform: translateX(-50%);\n }\n `\n ];\n}\n\ncustomElements.define('qti-position-object-interaction', QtiPositionObjectInteraction);\n","import { LitElement, css, html } from 'lit';\nimport { customElement } from 'lit/decorators.js';\n\n@customElement('qti-position-object-stage')\nexport class QtiPositionObjectStage extends LitElement {\n choiceOrdering: boolean;\n startX: any;\n startY: any;\n dragElement: any;\n\n override render() {\n return html`<slot></slot>`;\n }\n\n static override styles = [\n css`\n :host {\n display: inline-block;\n position: relative;\n }\n `\n ];\n\n constructor() {\n super();\n this.removeMoveListener = this.removeMoveListener.bind(this);\n this.dragElementHandler = this.dragElementHandler.bind(this);\n }\n\n // Define a function to handle the mousemove event on the draggable element\n dragElementHandler(event) {\n event.preventDefault();\n\n // Calculate the distance the mouse has moved since the last event\n const deltaX = event.clientX - this.startX;\n const deltaY = event.clientY - this.startY;\n\n // Update the position of the draggable element\n this.dragElement.style.left = this.dragElement.offsetLeft + deltaX + 'px';\n this.dragElement.style.top = this.dragElement.offsetTop + deltaY + 'px';\n\n // Update the starting position of the mouse\n this.startX = event.clientX;\n this.startY = event.clientY;\n }\n\n override firstUpdated(a): void {\n super.firstUpdated(a);\n\n // Get the draggable and drop zone elements\n this.dragElement = this.querySelector('qti-position-object-interaction>img');\n // const canvasElement = document.getElementById('canvas');\n\n // Initialize variables for the starting position of the draggable element\n this.startX = 0;\n this.startY = 0;\n\n // Add a mousedown event listener to the draggable element\n this.dragElement.addEventListener('mousedown', (event: MouseEvent) => {\n // Save the starting position of the mouse\n this.startX = event.clientX;\n this.startY = event.clientY;\n\n // Add a mousemove event listener to the document\n document.addEventListener('mousemove', this.dragElementHandler, true);\n });\n document.addEventListener('mouseup', this.removeMoveListener);\n }\n\n removeMoveListener() {\n document.removeEventListener('mousemove', this.dragElementHandler, true);\n }\n\n override disconnectedCallback() {\n super.disconnectedCallback();\n document.removeEventListener('mousemove', this.dragElementHandler);\n document.removeEventListener('mouseup', this.removeMoveListener);\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-position-object-stage': QtiPositionObjectStage;\n }\n}\n","import { css, html } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { repeat } from 'lit/directives/repeat.js';\nimport { styleMap } from 'lit/directives/style-map.js';\n\nimport { Interaction } from '../../../exports/interaction';\nimport { positionShapes } from '../internal/hotspots/hotspot';\n\nimport type { QtiAreaMapEntry, QtiAreaMapping } from '../../qti-response-processing';\nimport type { ResponseVariable } from '../../../exports/variables';\n\n@customElement('qti-select-point-interaction')\nexport class QtiSelectPointInteraction extends Interaction {\n static override styles = [\n css`\n :host {\n display: block;\n }\n point-container {\n display: block;\n position: relative;\n width: fit-content;\n }\n\n ::slotted(img) {\n max-width: 100%;\n height: auto;\n display: block;\n }\n `\n ];\n\n @property({\n type: Number,\n attribute: 'max-choices'\n })\n public maxChoices: number = Infinity;\n\n @property({\n type: Number,\n attribute: 'min-choices'\n })\n public minChoices: number = 0;\n\n @state() response: string[] = [];\n\n @state()\n private _correctAreas: { shape: string; coords: string }[] = [];\n\n // Reference to the image element\n private _imgElement: HTMLImageElement | null = null;\n\n private _scaleX = 1;\n private _scaleY = 1;\n private _imageWidthOrginal = 0;\n private _imageHeightOrginal = 0;\n // Extracted click handler method\n private _onImageClick = (event: MouseEvent) => {\n if (!this._imgElement) {\n console.warn('No <img> element found in <qti-select-point-interaction>');\n return;\n }\n this.calculateScale();\n // Get the image's bounding rectangle and calculate scaling factors\n const rect = this._imgElement.getBoundingClientRect();\n\n // Calculate the x and y coordinates relative to the original image size\n const x = (event.clientX - rect.left) * this._scaleX;\n const y = (event.clientY - rect.top) * this._scaleY;\n\n // Save the new point as a string\n const newPoint = `${x.toFixed()} ${y.toFixed()}`;\n\n if (this.maxChoices === 1) {\n // If maxChoices is 1, replace the existing marker with the new one\n this.response = [newPoint];\n } else {\n // If maxChoices > 1, add a new marker if within the limit\n if (this.maxChoices === 0 || this.response.length < this.maxChoices) {\n this.response = [...this.response, newPoint];\n } else {\n // Optional: Notify the user to remove a marker before adding a new one\n // console.warn('Maximum number of points reached. Remove a marker to add a new one.');\n }\n }\n // Save the response with the calculated points\n this.saveResponse(this.response);\n };\n\n override connectedCallback() {\n super.connectedCallback();\n window.addEventListener('resize', this._onResize);\n }\n\n private _onResize = () => {\n this.calculateScale();\n };\n\n public toggleCorrectResponse(responseVariable: ResponseVariable, show: boolean) {\n if (!show) {\n this._correctAreas = [];\n return;\n }\n // Find the area mapping element from the response variable\n const areaMapping = responseVariable.areaMapping as QtiAreaMapping;\n let areaMapEntries: QtiAreaMapEntry[] = [];\n if (!areaMapping || areaMapping.areaMapEntries.length === 0) {\n if (responseVariable.correctResponse) {\n const correctResponses = Array.isArray(responseVariable.correctResponse)\n ? responseVariable.correctResponse\n : [responseVariable.correctResponse];\n if (correctResponses.length === 0 || correctResponses.find(r => r.split(' ').length < 2)) {\n console.error('No valid correct responses found for the response variable.');\n return null;\n }\n console.warn(\n `No area mapping found for the response variable. Using the correct responses to display the correct response but it probably won't score correct.`\n );\n // Create a new area mapping object with the correct responses\n areaMapEntries = correctResponses.map(r => {\n const coords = r.split(' ').join(',').concat(',10'); // Add a radius of 10 pixels to the coordinates\n return { shape: 'circle', coords, defaultValue: 1, mappedValue: 1 };\n });\n } else {\n console.error('No area mapping found for the response variable.');\n return;\n }\n } else {\n // Get all map entries from the area mapping\n areaMapEntries = areaMapping.areaMapEntries;\n }\n this._correctAreas = areaMapEntries.map(e => ({ coords: e.coords, shape: e.shape }));\n }\n\n override updated(changedProperties: Map<string | number | symbol, unknown>) {\n super.updated(changedProperties);\n const img = this._imgElement;\n if (img && changedProperties.has('_correctAreas') && this._correctAreas.length > 0) {\n this.calculateScale();\n this.shadowRoot.querySelectorAll('div').forEach((el: HTMLElement) => {\n const coords = el.dataset.coord;\n const shape = el.dataset.shape;\n if (coords && shape) {\n positionShapes(\n shape,\n coords.split(',').map(c => +c),\n img,\n el\n );\n }\n });\n }\n }\n\n override render() {\n return html` <slot name=\"prompt\"></slot>\n <point-container>\n ${repeat(\n this.response?.filter(point => point) || [],\n point => point,\n (point, index) => {\n const [x, y] = point.split(' ').map(Number);\n // point are based on the original image size, so we need calculate the percentage based on the original image\n const leftPercentage = (x / (this._imageWidthOrginal || 1)) * 100;\n const topPercentage = (y / (this._imageHeightOrginal || 1)) * 100;\n\n // Base size is 1rem (16px), scaled proportionally to the image's current size\n // Base size is 1rem in the original image size\n const baseSize = 16; // Assuming 1rem = 16px\n const widthPercentage = (baseSize / (this._imageWidthOrginal || 1)) * 100;\n const heightPercentage = (baseSize / (this._imageHeightOrginal || 1)) * 100;\n\n return html`\n <button\n part=\"point\"\n style=${styleMap({\n pointerEvents: this.maxChoices === 1 ? 'none' : 'auto',\n position: 'absolute',\n transform: 'translate(-50%, -50%)',\n left: `${leftPercentage}%`,\n top: `${topPercentage}%`,\n width: `min(${widthPercentage}%, 1rem)`,\n height: `min(${heightPercentage}%, 1rem)`,\n minWidth: `min(${widthPercentage}%, 1rem)`,\n minHeight: `min(${heightPercentage}%, 1rem)`,\n borderRadius: '50%', // Ensures round shape\n background: 'red' // Example styling, adjust as needed\n })}\n aria-label=\"Remove point at ${point}\"\n @click=${(e: Event) => {\n e.stopPropagation();\n this.response = (this.response || []).filter((_, i) => i !== index);\n this.saveResponse(this.response);\n }}\n ></button>\n `;\n }\n )}\n ${repeat(\n this._correctAreas?.filter(area => area) || [],\n area => area,\n (area, i) =>\n html`<div\n style=${styleMap({\n position: 'absolute',\n pointerEvents: 'none',\n backgroundColor: 'var(--qti-correct)',\n opacity: '0.5'\n })}\n data-coord=\"${area.coords}\"\n alt=${`correct-response-${i + 1}`}\n data-shape=\"${area.shape}\"\n ></div>`\n )}\n <slot></slot>\n </point-container>`;\n }\n\n reset(): void {\n this.response = null;\n }\n\n validate(): boolean {\n return this.response.length >= this.minChoices && this.response.length <= this.maxChoices;\n }\n\n private calculateScale() {\n // Get the image dimensions\n this._imageWidthOrginal = this._imgElement.getAttribute('width')\n ? parseFloat(this._imgElement.getAttribute('width')!)\n : this._imgElement.naturalWidth;\n this._imageHeightOrginal = this._imgElement.getAttribute('height')\n ? parseFloat(this._imgElement.getAttribute('height')!)\n : this._imgElement.naturalHeight;\n // Get the image's bounding rectangle and calculate scaling factors\n const rect = this._imgElement.getBoundingClientRect();\n this._scaleX = rect.width === 0 ? 1 : this._imageWidthOrginal / rect.width; // Horizontal scaling factor\n this._scaleY = rect.height === 0 ? 1 : this._imageHeightOrginal / rect.height; // Vertical scaling factor\n }\n\n override firstUpdated(): void {\n this._imgElement = this.querySelector('img');\n\n if (this._imgElement) {\n this.calculateScale();\n // Attach the click event listener to the image element\n this._imgElement.addEventListener('click', this._onImageClick);\n } else {\n console.warn('No <img> element found in <qti-select-point-interaction>');\n }\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n\n window.removeEventListener('resize', this._onResize);\n if (this._imgElement) {\n // Remove the click event listener from the image element\n this._imgElement.removeEventListener('click', this._onImageClick);\n }\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-select-point-interaction': QtiSelectPointInteraction;\n }\n}\n","import { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport { ActiveElementMixin } from './internal/active-element/active-element.mixin';\n\n/**\n * qti-order-interaction\n * qti-choice-interaction\n */\n@customElement('qti-simple-choice')\nexport class QtiSimpleChoice extends ActiveElementMixin(LitElement, 'qti-simple-choice') {\n @property({ type: String, attribute: 'template-identifier' })\n public templateIdentifier: string | null = null;\n\n @property({ type: String, attribute: 'show-hide' })\n public showHide: string | null = 'show';\n\n @property({\n type: Boolean,\n converter: {\n fromAttribute: (value: string | null) => value === 'true',\n toAttribute: (value: boolean) => String(value)\n }\n })\n public fixed: boolean = false;\n\n static styles = css`\n :host {\n display: flex;\n align-items: center;\n user-select: none;\n }\n slot {\n width: 100%;\n display: flex;\n align-items: center;\n }\n [part='ch'] {\n display: flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n }\n `;\n\n // property label\n @property({ type: String, attribute: false })\n public marker: string;\n\n get checked() {\n return this['internals'].states.has('--checked');\n }\n\n override render() {\n return html`<div part=\"ch\">\n <div part=\"cha\"></div>\n </div>\n ${this.marker ? html`<div id=\"label\">${this.marker}</div>` : nothing}\n <slot part=\"slot\"></slot>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-simple-choice': QtiSimpleChoice;\n }\n}\n","import { html } from 'lit';\nimport { customElement, property, query } from 'lit/decorators.js';\n\nimport styles from './qti-slider-interaction.styles';\nimport { Interaction } from '../../../exports/interaction';\n\nimport type { ResponseVariable } from '../../../exports/variables';\nimport type { CSSResultGroup } from 'lit';\n\n@customElement('qti-slider-interaction')\nexport class QtiSliderInteraction extends Interaction {\n static styles: CSSResultGroup = styles;\n\n private _value = 0;\n private _correctResponseNumber: number | null = null;\n\n @query('#rail') private _rail!: HTMLElement;\n\n @property({ type: Number, attribute: 'lower-bound' }) min = 0;\n @property({ type: Number, attribute: 'upper-bound' }) max = 100;\n @property({ type: Number, attribute: 'step' }) step = 1;\n\n validate(): boolean {\n return true;\n }\n\n override connectedCallback() {\n super.connectedCallback();\n this._updateValue(this.min); // Set initial value\n this.setAttribute('tabindex', '0');\n this.setAttribute('role', 'slider');\n }\n\n get response(): string {\n return this._value.toString();\n }\n\n set response(val: string) {\n const newValue = parseInt(val, 10);\n if (!isNaN(newValue)) {\n this._updateValue(newValue);\n }\n }\n\n public toggleCorrectResponse(responseVariable: ResponseVariable, show: boolean) {\n if (show) {\n this._correctResponse = responseVariable.correctResponse.toString();\n const nr = parseFloat(responseVariable.correctResponse.toString());\n if (!isNaN(nr)) {\n this._correctResponseNumber = nr;\n const valuePercentage = ((this._correctResponseNumber - this.min) / (this.max - this.min)) * 100;\n this.style.setProperty('--value-percentage-correct', `${valuePercentage}%`);\n } else {\n this._correctResponseNumber = null;\n }\n } else {\n this._correctResponseNumber = null;\n }\n this.requestUpdate();\n }\n\n private _updateValue(newValue: number) {\n const oldValue = this._value;\n this._value = Math.min(this.max, Math.max(this.min, newValue));\n if (this._value === oldValue) {\n return; // Do not update if the value is the same as before\n }\n const valuePercentage = ((this._value - this.min) / (this.max - this.min)) * 100;\n this.style.setProperty('--value-percentage', `${valuePercentage}%`);\n this._internals.setFormValue(this.value); // Update form value\n this.saveResponse(this.response);\n this.requestUpdate();\n }\n\n override render() {\n return html`\n <slot name=\"prompt\"></slot>\n <div id=\"slider\" part=\"slider\">\n <div id=\"bounds\" part=\"bounds\">\n <div>${this.min}</div>\n <div>${this.max}</div>\n </div>\n\n <div id=\"ticks\" part=\"ticks\"></div>\n\n <div id=\"rail\" part=\"rail\" @mousedown=${this._onMouseDown} @touchstart=${this._onTouchStart}>\n <div id=\"knob\" part=\"knob\">\n <div id=\"value\" part=\"value\">${this.response}</div>\n </div>\n\n ${this._correctResponseNumber !== null\n ? html`\n <div id=\"knob-correct\" part=\"knob-correct\">\n <div id=\"value\" part=\"value\">${this._correctResponseNumber}</div>\n </div>\n `\n : null}\n </div>\n </div>\n `;\n }\n\n private _onMouseDown(event: MouseEvent) {\n this._startDrag(event.pageX);\n const handleMouseMove = (e: MouseEvent) => this._onDrag(e.pageX);\n const handleMouseUp = () => {\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n this._onDragEnd();\n };\n\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n }\n\n private _onTouchStart(event: TouchEvent) {\n this._startDrag(event.touches[0].pageX);\n const handleTouchMove = (e: TouchEvent) => this._onDrag(e.touches[0].pageX);\n const handleTouchEnd = () => {\n document.removeEventListener('touchmove', handleTouchMove);\n document.removeEventListener('touchend', handleTouchEnd);\n this._onDragEnd();\n };\n\n document.addEventListener('touchmove', handleTouchMove, { passive: false });\n document.addEventListener('touchend', handleTouchEnd);\n }\n\n private _startDrag(pageX: number) {\n this._onDrag(pageX);\n }\n\n private _onDrag(pageX: number) {\n const railRect = this._rail.getBoundingClientRect();\n const diffX = pageX - railRect.left;\n const percentage = Math.min(1, Math.max(0, diffX / railRect.width));\n const steppedValue = this.min + Math.round((percentage * (this.max - this.min)) / this.step) * this.step;\n this._updateValue(steppedValue);\n }\n\n private _onDragEnd() {\n this.dispatchEvent(new Event('change', { bubbles: true }));\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-slider-interaction': QtiSliderInteraction;\n }\n}\n","import { css } from 'lit';\n\nexport default css`\n :host {\n display: block;\n --show-bounds: true;\n --show-ticks: true;\n --show-value: true;\n }\n\n [part='slider'] {\n margin-left: 2rem; /* mx-8 */\n margin-right: 2rem;\n padding-bottom: 1rem; /* pb-4 */\n padding-top: 1.25rem; /* pt-5 */\n }\n\n [part='bounds'] {\n display: flex;\n width: 100%;\n justify-content: space-between;\n margin-bottom: 0.5rem; /* mb-2 */\n }\n\n [part='ticks'] {\n margin-left: 0.125rem; /* mx-0.5 */\n margin-right: 0.125rem;\n margin-bottom: 0.25rem; /* mb-1 */\n height: 0.5rem; /* h-2 */\n background: linear-gradient(to right, var(--qti-border-color) var(--qti-border-thickness), transparent 1px) repeat-x\n 0 center / calc(calc(100% - var(--qti-border-thickness)) / ((var(--max) - var(--min)) / var(--step))) 100%;\n }\n\n [part='rail'] {\n display: flex;\n align-items: center;\n box-sizing: border-box;\n height: 0.375rem; /* h-1.5 */\n width: 100%;\n cursor: pointer;\n border-radius: 9999px; /* rounded-full */\n border: 1px solid #d1d5db; /* border-gray-300 */\n background-color: #e5e7eb; /* bg-gray-200 */\n }\n\n [part='knob'] {\n background-color: var(--qti-bg-active);\n border: 2px solid var(--qti-border-active);\n position: relative;\n height: 1rem; /* h-4 */\n width: 1rem; /* w-4 */\n transform-origin: center;\n transform: translateX(-50%);\n cursor: pointer;\n border-radius: 9999px; /* rounded-full */\n left: var(--value-percentage);\n }\n [part='knob-correct'] {\n background-color: var(--qti-correct-light);\n border: 2px solid var(--qti-correct);\n position: relative;\n height: 1rem; /* h-4 */\n width: 1rem; /* w-4 */\n transform-origin: center;\n transform: translateX(-50%);\n cursor: pointer;\n border-radius: 9999px; /* rounded-full */\n left: var(--value-percentage-correct);\n }\n\n [part='value'] {\n position: absolute;\n bottom: 2rem; /* bottom-8 */\n left: 0.5rem; /* left-2 */\n transform: translateX(-50%);\n cursor: pointer;\n border-radius: 0.25rem; /* rounded */\n background-color: #f3f4f6; /* bg-gray-100 */\n padding: 0.25rem 0.5rem; /* px-2 py-1 */\n text-align: center;\n color: #6b7280; /* text-gray-500 */\n }\n`;\n","import { html, nothing } from 'lit';\nimport { customElement, property, query, state } from 'lit/decorators.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { createRef } from 'lit/directives/ref.js';\n\nimport { Interaction } from '../../../exports/interaction';\nimport styles from './qti-text-entry-interaction.styles';\nimport { watch } from '../../../decorators/watch';\n\nimport type { ResponseVariable } from '../../../exports/variables';\nimport type { CSSResultGroup } from 'lit';\n@customElement('qti-text-entry-interaction')\nexport class QtiTextEntryInteraction extends Interaction {\n static styles: CSSResultGroup = styles;\n inputRef = createRef<HTMLInputElement>();\n\n @property({ type: Number, attribute: 'expected-length' }) expectedLength: number;\n\n @property({ type: String, attribute: 'pattern-mask' }) patternMask: string;\n\n @property({ type: String, attribute: 'placeholder-text' }) placeholderText: string;\n\n @property({ type: String, attribute: 'data-patternmask-message' }) dataPatternmaskMessage: string;\n\n @state()\n response: string | null = null;\n\n @query('input') private _input!: HTMLInputElement;\n\n @watch('response', { waitUntilFirstUpdate: true })\n protected _handleValueChange = () => {\n // const formData = new FormData();\n // formData.append(this.responseIdentifier, this.response);\n this._internals.setFormValue(this.value);\n this.validate();\n };\n\n get value(): string | null {\n return this.response || null;\n }\n set value(val: string | null) {\n this.response = val || null;\n }\n\n public override validate() {\n if (!this._input) return false;\n if (this.patternMask && this.dataPatternmaskMessage) {\n // Clear any custom error if the this._input is valid\n this._internals.setValidity({});\n this._input.setCustomValidity(''); // Clear the custom message\n const isValid = this._input.checkValidity();\n if (!isValid) {\n // Set custom error if invalid\n this._internals.setValidity({ customError: true }, this.dataPatternmaskMessage);\n this._input.setCustomValidity(this.dataPatternmaskMessage); // Set custom message only if invalid\n }\n } else {\n const isValid = this._input.checkValidity();\n this._internals.setValidity(isValid ? {} : { customError: false });\n }\n return this.response !== '' && this._input.checkValidity();\n }\n\n public toggleCorrectResponse(responseVariable: ResponseVariable, show: boolean): void {\n if (show && responseVariable.correctResponse) {\n const text = responseVariable.correctResponse.toString();\n this._correctResponse = text;\n // if (text) {\n // if (!this._input.nextElementSibling?.classList.contains('correct-option')) {\n // const textSpan = document.createElement('span');\n // textSpan.classList.add('correct-option');\n // textSpan.textContent = text;\n\n // // Apply styles\n // textSpan.style.border = '1px solid var(--qti-correct)';\n // textSpan.style.borderRadius = '4px';\n // textSpan.style.padding = '2px 4px';\n // textSpan.style.margin = '4px';\n // textSpan.style.display = 'inline-block';\n\n // this._input.insertAdjacentElement('afterend', textSpan);\n // }\n // } else if (this._input.nextElementSibling?.classList.contains('correct-option')) {\n // this._input.nextElementSibling?.remove();\n // }\n } else {\n // this._input.nextElementSibling?.remove();\n this._correctResponse = null;\n }\n }\n\n override render() {\n return html`\n <input\n part=\"input\"\n name=\"${this.responseIdentifier}\"\n spellcheck=\"false\"\n autocomplete=\"off\"\n @blur=\"${(_: FocusEvent) => {\n this.reportValidity();\n }}\"\n @keydown=\"${event => event.stopImmediatePropagation()}\"\n @keyup=\"${this.textChanged}\"\n @change=\"${this.textChanged}\"\n type=\"${this.patternMask == '[0-9]*' ? 'number' : 'text'}\"\n placeholder=\"${ifDefined(this.placeholderText ? this.placeholderText : undefined)}\"\n .value=\"${this.response}\"\n pattern=\"${ifDefined(this.patternMask ? this.patternMask : undefined)}\"\n maxlength=${1000}\n ?disabled=\"${this.disabled}\"\n ?readonly=\"${this.readonly}\"\n />\n ${this._correctResponse ? html`<div part=\"correct\">${this._correctResponse}</div>` : nothing}\n `;\n }\n // ${this._correctResponse ? html`<div popover part=\"correct\">${this._correctResponse}</div>` : nothing}\n\n protected textChanged(event: Event) {\n if (this.disabled || this.readonly) return;\n const input = event.target as HTMLInputElement;\n this.setEmptyAttribute(input.value);\n if (this.response !== input.value) {\n this.value = input.value;\n this.saveResponse(input.value);\n }\n }\n\n override reportValidity() {\n const input = this.shadowRoot.querySelector('input');\n if (!input) return false;\n\n // Run the validate function to ensure the custom validity state is up to date\n const isValid = this.validate();\n if (!isValid) {\n input.reportValidity();\n }\n return isValid;\n }\n\n reset(): void {\n this.response = '';\n }\n\n private setEmptyAttribute(text: string) {\n this.setAttribute('empty', text === '' ? 'true' : 'false');\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-text-entry-interaction': QtiTextEntryInteraction;\n }\n}\n","import { css } from 'lit';\n\nexport default css`\n :host {\n display: inline-block;\n }\n\n :host(.qti-input-width-1) [part='input'] {\n width: 1.1rem;\n min-width: 1.1rem;\n }\n\n :host(.qti-input-width-2) [part='input'] {\n width: 2.3rem;\n min-width: 2.3rem;\n }\n\n :host(.qti-input-width-3) [part='input'] {\n width: 3.3rem;\n min-width: 3.3rem;\n }\n\n :host(.qti-input-width-4) [part='input'] {\n width: 4.2rem;\n min-width: 4.2rem;\n }\n\n :host(.qti-input-width-6) [part='input'] {\n width: 6.6rem;\n min-width: 6.6rem;\n }\n\n :host(.qti-input-width-10) [part='input'] {\n width: 8rem;\n min-width: 8rem;\n }\n\n :host(.qti-input-width-15) [part='input'] {\n width: 12rem;\n min-width: 12rem;\n }\n\n :host(.qti-input-width-20) [part='input'] {\n width: 17rem;\n min-width: 17rem;\n }\n\n :host(.qti-input-width-25) [part='input'] {\n width: 20rem;\n min-width: 20rem;\n }\n\n :host(.qti-input-width-30) [part='input'] {\n width: 24rem;\n min-width: 24rem;\n }\n\n :host(.qti-input-width-35) [part='input'] {\n width: 28rem;\n min-width: 28rem;\n }\n\n :host(.qti-input-width-40) [part='input'] {\n width: 32rem;\n min-width: 32rem;\n }\n\n :host(.qti-input-width-45) [part='input'] {\n width: 36rem;\n min-width: 36rem;\n }\n\n :host(.qti-input-width-50) [part='input'] {\n width: 40rem;\n min-width: 40rem;\n }\n\n :host(.qti-input-width-72) [part='input'] {\n width: 57rem;\n min-width: 57rem;\n }\n\n :host {\n position: relative;\n }\n input {\n anchor-name: --text-entry-input;\n z-index: 100;\n position: relative;\n }\n\n [part='correct'] {\n padding: var(--qti-padding-vertical) var(--qti-padding-horizontal);\n background-color: var(--qti-bg);\n z-index: 0;\n position: absolute;\n left: 0;\n right: 0;\n position-anchor: --text-entry-input;\n bottom: anchor(top);\n left: anchor(left);\n /* opacity: 1; */\n transition: all 1s;\n\n @starting-style {\n display: grid;\n /* opacity: 0; */\n bottom: 0;\n }\n }\n`;\n","import { css, html } from 'lit';\nimport { customElement } from 'lit/decorators.js';\n\nimport { Interaction } from '../../../exports/interaction';\n\n@customElement('qti-upload-interaction')\nexport class QtiUploadInteraction extends Interaction {\n private _file: File | null = null;\n private _base64: string | null = null;\n\n reset() {\n this._file = null;\n this._base64 = null;\n this.saveResponse(null);\n }\n\n validate(): boolean {\n return this._base64 !== null; // Ensure the Base64 string is set\n }\n\n get response(): string | null {\n return this._base64; // Return the Base64 string\n }\n\n set response(base64: string | null) {\n if (typeof base64 === 'string') {\n this._base64 = base64;\n this.saveResponse(base64); // Save Base64 string as the response\n } else if (base64 === null) {\n this.reset();\n } else {\n throw new Error('Value must be a Base64-encoded string or null');\n }\n }\n\n static override get properties() {\n return {\n ...Interaction.properties\n };\n }\n\n static override styles = [\n css`\n :host {\n display: block;\n margin: 1em 0;\n }\n input[type='file'] {\n display: block;\n margin-top: 0.5em;\n }\n `\n ];\n\n override render() {\n return html`\n <div>\n <slot name=\"prompt\"></slot>\n <input type=\"file\" @change=\"${this._onFileChange}\" ?disabled=\"${this.disabled}\" ?readonly=\"${this.readonly}\" />\n </div>\n `;\n }\n\n private async _onFileChange(event: Event) {\n const input = event.target as HTMLInputElement;\n if (input.files && input.files.length > 0) {\n this._file = input.files[0];\n this._base64 = await this._convertToBase64(this._file);\n this.saveResponse(this._base64); // Save the Base64 string\n this.dispatchEvent(\n new CustomEvent('qti-interaction-response', {\n detail: { response: this._base64 }\n })\n );\n }\n }\n\n private _convertToBase64(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(reader.result as string);\n reader.onerror = () => reject(reader.error);\n reader.readAsDataURL(file); // Converts to Base64\n });\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-upload-interaction': QtiUploadInteraction;\n }\n}\n","import { customElement } from 'lit/decorators.js';\nimport { html, LitElement } from 'lit';\n\nimport styles from './qti-item-body.styles';\n\nimport type { CSSResultGroup } from 'lit';\n\n/**\n * @summary The qti-item-body node contains the text, graphics, media objects and interactions that describe the item's content and information about how it is structured.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/impl#h.sphpo6lu6zqi\n * @status stable\n * @since 4.0\n *\n * @slot - item body content.\n * @slot qti-rubric-block - the qti rubric block is placed above the item\n * @part qti-rubric-block - the qti rubric block part\n */\n@customElement('qti-item-body')\nexport class QtiItemBody extends LitElement {\n static styles: CSSResultGroup = styles;\n\n override render() {\n return html`<slot part=\"qti-rubric-blocks\" name=\"qti-rubric-block\"></slot><slot></slot>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-item-body': QtiItemBody;\n }\n}\n","import { css } from 'lit';\n\nexport default css`\n :host {\n display: block;\n }\n`;\n","import { css, html, LitElement } from 'lit';\nimport { customElement } from 'lit/decorators.js';\n\nimport type { QtiRule, QtiRuleBase } from '..';\n\n@customElement('qti-outcome-processing')\nexport class QtiOutcomeProcessing extends LitElement {\n static styles = [\n css`\n :host {\n display: none;\n }\n `\n ];\n\n override render() {\n return html`<slot></slot>`;\n }\n\n public process() {\n const logic = new QtiOutcomeProcessingProcessor();\n const rules = [...this.children] as QtiRule[];\n logic.process(rules);\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-outcome-processing': QtiOutcomeProcessing;\n }\n}\n\nexport class QtiOutcomeProcessingProcessor {\n public process(rules: QtiRuleBase[]) {\n for (const rule of rules) {\n rule.process();\n }\n }\n}\n","import { html, LitElement } from 'lit';\nimport { customElement } from 'lit/decorators.js';\n@customElement('qti-prompt')\nexport class QtiPrompt extends LitElement {\n override render() {\n return html`<slot></slot>`;\n }\n\n override connectedCallback(): void {\n // if prompts are in interactions they should have a slot, so the prompt has to go there\n // if prompt is in the body, then just display the prompt there.\n // A better check would be the latter, but not can't get through the shadowroot to find the slot\n const inInteraction = this.parentElement.tagName.endsWith('INTERACTION');\n if (inInteraction) {\n this.setAttribute('slot', 'prompt');\n }\n // const promptSlot = this.parentElement.shadowRoot.querySelector(\"[name='prompt']\");\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-prompt': QtiPrompt;\n }\n}\n","import { css, html, LitElement } from 'lit';\nimport { customElement } from 'lit/decorators.js';\n\nimport { mapResponse, mapResponsePoint, matchCorrect } from '../../internal/template-strings';\nimport { type QtiRule } from '../qti-rule/qti-rule';\n\nimport type { PropertyValueMap } from 'lit';\n\n@customElement('qti-response-processing')\nexport class QtiResponseProcessing extends LitElement {\n static styles = [\n css`\n :host {\n display: none;\n }\n `\n ];\n\n override render() {\n return html`<slot></slot>`;\n }\n\n public process() {\n const assessmentItem = this.closest('qti-assessment-item');\n if (!assessmentItem) return;\n const rules = [...this.children] as QtiRule[];\n for (const rule of rules) {\n rule.process();\n }\n }\n\n public firstUpdated(_changedProperties: PropertyValueMap<any> | Map<PropertyKey, unknown>): void {\n if (this.getAttribute('template')) {\n const splittedTemplateName = this.getAttribute('template')!.split('/');\n const templateName = splittedTemplateName[splittedTemplateName.length - 1].replace('.xml', '');\n this.innerHTML = '';\n switch (templateName) {\n case 'map_response': {\n this.appendChild(this.fragmentFromString(mapResponse).firstElementChild.firstElementChild);\n break;\n }\n case 'map_response_point': {\n this.appendChild(this.fragmentFromString(mapResponsePoint).firstElementChild.firstElementChild);\n break;\n }\n case 'match_correct':\n this.appendChild(this.fragmentFromString(matchCorrect).firstElementChild.firstElementChild);\n break;\n }\n }\n }\n\n private fragmentFromString(strHTML: string) {\n return document.createRange().createContextualFragment(strHTML);\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-response-processing': QtiResponseProcessing;\n }\n}\n","export const matchCorrect = `<qti-response-processing>\n <qti-response-condition>\n <qti-response-if>\n <qti-match>\n <qti-variable identifier=\"RESPONSE\"></qti-variable>\n <qti-correct identifier=\"RESPONSE\"></qti-correct>\n </qti-match>\n <qti-set-outcome-value identifier=\"SCORE\">\n <qti-base-value base-type=\"float\">1</qti-base-value>\n </qti-set-outcome-value>\n </qti-response-if>\n <qti-response-else>\n <qti-set-outcome-value identifier=\"SCORE\">\n <qti-base-value base-type=\"float\">0</qti-base-value>\n </qti-set-outcome-value>\n </qti-response-else>\n </qti-response-condition>\n</qti-response-processing>`;\n\nexport const mapResponse = `<qti-response-processing>\n <qti-response-condition>\n <qti-response-if>\n <qti-is-null>\n <qti-variable identifier=\"RESPONSE\"></qti-variable>\n </qti-is-null>\n <qti-set-outcome-value identifier=\"SCORE\">\n <qti-base-value base-type=\"float\">0.0</qti-base-value>\n </qti-set-outcome-value>\n </qti-response-if>\n <qti-response-else>\n <qti-set-outcome-value identifier=\"SCORE\">\n <qti-map-response identifier=\"RESPONSE\"> </qti-map-response>\n </qti-set-outcome-value>\n </qti-response-else>\n </qti-response-condition>\n</qti-response-processing>`;\n\nexport const mapResponsePoint = `<qti-response-processing>\n <qti-response-condition>\n <qti-response-if>\n <qti-is-null>\n <qti-variable identifier=\"RESPONSE\"></qti-variable>\n </qti-is-null>\n <qti-set-outcome-value identifier=\"SCORE\">\n <qti-base-value base-type=\"float\">0</qti-base-value>\n </qti-set-outcome-value>\n </qti-response-if>\n <qti-response-else>\n <qti-set-outcome-value identifier=\"SCORE\">\n <qti-map-response-point identifier=\"RESPONSE\"></qti-map-response-point>\n </qti-set-outcome-value>\n </qti-response-else>\n </qti-response-condition>\n</qti-response-processing>`;\n","import { property, state } from 'lit/decorators.js';\nimport { consume } from '@lit/context';\n\nimport { convertNumberToUniversalFormat } from '../../../internal/utils';\nimport { QtiRule } from '../qti-rule';\nimport { itemContext } from '../../../../exports/qti-assessment-item.context';\n\nimport type { QtiExpression } from '../../../../exports/qti-expression';\nimport type { OutcomeVariable } from '../../../../exports/variables';\nimport type { ItemContext } from '../../../../exports/item.context';\n\n/**\n * The lookupOutcomeValue rule sets the value of an outcome variable to the value obtained\n * by looking up the value of the associated expression in the lookupTable associated\n * with the outcome's declaration.\n */\nexport class QtiLookupOutcomeValue extends QtiRule {\n @property({ type: String }) identifier: string;\n\n @consume({ context: itemContext, subscribe: true })\n @state()\n protected context?: ItemContext;\n\n get childExpression(): QtiExpression<string> {\n return this.firstElementChild as QtiExpression<string>;\n }\n\n public override process(): number {\n const identifier = this.getAttribute('identifier');\n\n const outcomeVariable: OutcomeVariable | null =\n this.context.variables.find(v => v.identifier === identifier) || null;\n\n let value;\n if (outcomeVariable.interpolationTable) {\n value = outcomeVariable.interpolationTable.get(parseInt(this.childExpression.calculate()));\n }\n if (value === null || value === undefined) {\n console.warn('lookupOutcomeValue: value is null or undefined');\n return 0;\n }\n this.dispatchEvent(\n new CustomEvent<{ outcomeIdentifier: string; value: string | string[] }>('qti-set-outcome-value', {\n bubbles: true,\n composed: true,\n detail: {\n outcomeIdentifier: this.identifier,\n value: convertNumberToUniversalFormat(value)\n }\n })\n );\n return value;\n }\n}\ncustomElements.define('qti-lookup-outcome-value', QtiLookupOutcomeValue);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-lookup-outcome-value': QtiLookupOutcomeValue;\n }\n}\n","import { customElement } from 'lit/decorators.js';\nimport { html, LitElement } from 'lit';\n\n@customElement('qti-rule')\nexport class QtiRule extends LitElement implements QtiRuleBase {\n override render() {\n return html`<slot></slot>`;\n }\n\n public process() {\n throw new Error('Not implemented');\n }\n}\n\nexport interface QtiRuleBase {\n process(): any;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-rule': QtiRule;\n }\n}\n","import { html } from 'lit';\n\nimport { QtiRule } from '../qti-rule';\n\nimport type { QtiExpression } from '../../../../exports/qti-expression';\n\nexport class QtiResponseCondition extends QtiRule {\n override render() {\n return html`<slot></slot>`;\n }\n\n public override process() {\n const branches = [...this.children] as QtiExpression<any>[];\n\n for (let i = 0; i < branches.length; i++) {\n const branch = branches[i];\n\n if (branch.calculate()) {\n (branch as unknown as QtiRule).process();\n\n return;\n }\n }\n }\n}\n\ncustomElements.define('qti-response-condition', QtiResponseCondition);\n","import { convertNumberToUniversalFormat } from '../../../internal/utils';\nimport { QtiRule } from '../qti-rule';\n\nimport type { ResponseVariable } from '../../../../exports/variables';\nimport type { QtiExpression, QtiExpressionBase } from '../../../../exports/qti-expression';\nimport type { QtiRuleBase } from '../qti-rule';\n\n/**\n * Web component that processes `setOutcomeValue` in QTI.\n */\nexport class QtiSetOutcomeValue extends QtiRule {\n /**\n * Processes the QTI rule and dispatches a custom event with the computed outcome value.\n */\n public override process(): void {\n const outcomeIdentifier = this.getAttribute('identifier');\n\n if (!outcomeIdentifier) {\n console.warn('QtiSetOutcomeValue: Missing \"identifier\" attribute.');\n return;\n }\n\n const expression = this.firstElementChild as QtiExpression<string | ResponseVariable[]> | null;\n\n if (!expression) {\n console.warn('QtiSetOutcomeValue: No expression found.');\n return;\n }\n\n const rule = new QtiSetOutcomeValueRule<string | ResponseVariable[] | null>(expression);\n const value = rule.process();\n\n this.dispatchEvent(\n new CustomEvent<{ outcomeIdentifier: string; value: string | string[] | null }>('qti-set-outcome-value', {\n bubbles: true,\n composed: true,\n detail: {\n outcomeIdentifier,\n value: this.formatValue(value)\n }\n })\n );\n }\n\n /**\n * Formats the computed value before dispatching.\n * Ensures numbers are converted to a universal format.\n */\n private formatValue(value: string | string[] | null): string | string[] | null {\n if (Array.isArray(value)) {\n return value.map(convertNumberToUniversalFormat);\n }\n return value !== null ? convertNumberToUniversalFormat(value) : null;\n }\n}\n\n/**\n * Encapsulates the logic for processing QTI setOutcomeValue expressions.\n */\nexport class QtiSetOutcomeValueRule<T> implements QtiRuleBase {\n constructor(private expression: QtiExpressionBase<T>) {}\n\n /**\n * Evaluates the expression and returns its value.\n */\n process(): string | string[] | null {\n const value = (this.expression.calculate() ?? null) as unknown as string | string[] | null;\n\n if (value === null) {\n console.warn('QtiSetOutcomeValueRule: Evaluated value is null.');\n }\n\n return Array.isArray(value) ? (value as any).map(v => (v.value ? v.value : v)) : value;\n }\n}\n\n// Define the custom element\ncustomElements.define('qti-set-outcome-value', QtiSetOutcomeValue);\n","import { LitElement, html } from 'lit';\n\nimport type { QtiRule } from '../qti-rule/qti-rule';\n\nexport class QtiResponseElse extends LitElement {\n override render() {\n return html`<slot></slot>`;\n }\n\n public calculate() {\n return true;\n }\n\n public getSubRules(): QtiRule[] {\n return [...this.children] as QtiRule[];\n }\n\n public process() {\n const subRules = this.getSubRules();\n for (let i = 0; i < subRules.length; i++) {\n const subRule = subRules[i];\n subRule.process();\n }\n }\n}\n\ncustomElements.define('qti-response-else', QtiResponseElse);\n","import { html } from 'lit';\n\nimport { QtiResponseIf } from '../qti-response-if';\n\nexport class QtiResponseElseIf extends QtiResponseIf {\n override render() {\n return html`${super.render()}`;\n }\n}\n\ncustomElements.define('qti-response-else-if', QtiResponseElseIf);\n","import { QtiResponseElse } from '../qti-response-else';\n\nimport type { QtiExpression } from '../../../../exports/qti-expression';\nimport type { QtiRule } from '../../qti-rule/qti-rule';\n\nexport class QtiResponseIf extends QtiResponseElse {\n public override calculate() {\n const expression = this.firstElementChild as QtiExpression<boolean>;\n const result = expression.calculate() as boolean;\n return result;\n }\n\n public override getSubRules(): QtiRule[] {\n const result = [];\n for (let i = 1; i < this.children.length; i++) {\n result.push(this.children[i]);\n }\n return result;\n }\n}\n\ncustomElements.define('qti-response-if', QtiResponseIf);\n","import { customElement } from 'lit/decorators.js';\n\nimport { QtiConditionExpression } from '../../../../exports/qti-condition-expression';\n\nimport type { QtiExpression } from '../../../../exports/qti-expression';\n\ntype Constructor<T> = new (...args: any[]) => T;\n\n@customElement('qti-and')\nexport class QtiAnd extends qtiAndMixin(QtiConditionExpression as unknown as Constructor<QtiConditionExpression>) {\n public calculate() {\n return this.calculateChildren(Array.from(this.children as unknown as QtiExpression<any>[]));\n }\n}\n\ntype MockQtiExpression<T> = { calculate: () => T };\ntype MockConstructor = new (...args: any[]) => {};\nexport function qtiAndMixin<TBase extends MockConstructor>(Base: TBase) {\n return class MockQtiAnd extends Base {\n public calculateChildren(children: Array<MockQtiExpression<any>>) {\n // children can be a mix of qti-expression and qti-condition-expression\n const values = children.map(c => {\n const condition = c as MockQtiExpression<any>;\n if (!condition.calculate) {\n console.error(\"Element doesn't implement QtiConditionExpression\");\n return null;\n }\n const value = condition.calculate();\n let val = false;\n // convert string value to boolean and return null if not possible\n if (typeof value === 'string') {\n if (value === 'true') {\n val = true;\n } else if (value === 'false') {\n val = false;\n } else {\n console.error('unexpected val in qti-or, expected boolean');\n return null;\n }\n } else {\n if (typeof value === 'boolean') {\n val = value;\n }\n }\n return val;\n });\n return values.every(e => {\n return typeof e === 'boolean' && e;\n });\n }\n };\n}\n","import { property } from 'lit/decorators.js';\n\nimport { QtiExpression } from '../../../../exports/qti-expression';\n\nimport type { BaseType } from '../../../../exports/expression-result';\nexport class QtiBaseValue extends QtiExpression<string> {\n @property({ type: String, attribute: 'base-type' }) baseType: BaseType = 'string';\n\n public override getResult(): string {\n const value = this.textContent.trim();\n return value;\n }\n}\n\ncustomElements.define('qti-base-value', QtiBaseValue);\n","import { QtiConditionExpression } from '../../../../exports/qti-condition-expression';\n\nimport type { ResponseVariable } from '../../../../exports/variables';\n\n// PK: For the contains we assume the expressions to calculate are all directedPairs\n// I don't know it this in QTI is always the case however?\nexport class QtiContains extends QtiConditionExpression {\n public override getResult() {\n // TODO: implement this for other types than directedPair\n const values = this.getVariables() as ResponseVariable[];\n if (this.children.length === 2) {\n const value1 = values[0];\n const value2 = values[1];\n if (\n value1.baseType === 'directedPair' &&\n value2.baseType === 'directedPair' &&\n value1.cardinality === 'multiple'\n ) {\n const projection1 = value1.value as string[];\n const projection2 = value2.value as string[];\n const enumerable = projection1.filter(x => projection2.includes(x));\n\n const result = enumerable.length > 0;\n return result;\n } else if (\n value1.baseType === 'directedPair' &&\n value2.baseType === 'directedPair' &&\n value1.cardinality === 'single'\n ) {\n const projection1 = value1.value as string;\n const projection2 = value2.value as string[];\n return projection2.includes(projection1);\n } else {\n console.error(\n 'unsupported baseType or cardinality in qti contains, only baseType: directedPair and cardinality: multiple is supported'\n );\n }\n } else {\n console.error('unexpected number of children in qti contains');\n }\n return false;\n }\n}\n\ncustomElements.define('qti-contains', QtiContains);\n","import { QtiExpression } from '../../../../exports/qti-expression';\n\nimport type { ResponseVariable } from '../../../../exports/variables';\n\nexport class QtiCorrect extends QtiExpression<string | string[]> {\n get interpretation() {\n return this.getAttribute('interpretation') || '';\n }\n\n override getResult() {\n const identifier = this.getAttribute('identifier') || '';\n const responseVariable: ResponseVariable = this.context.variables.find(v => v.identifier === identifier) || null;\n if (responseVariable.cardinality !== 'single') {\n return responseVariable.correctResponse.length > 0 ? responseVariable.correctResponse[0] : '';\n } else {\n return responseVariable.correctResponse;\n }\n }\n}\n\ncustomElements.define('qti-correct', QtiCorrect);\n","import { property } from 'lit/decorators.js';\n\nimport { QtiExpression } from '../../../../exports/qti-expression';\n\nimport type { ResponseVariable } from '../../../../exports/variables';\n\nexport class QtiEqualRounded extends QtiExpression<boolean> {\n @property({ type: String }) roundingMode: 'decimalPlaces' | 'significantFigures' = 'significantFigures';\n\n get figures() {\n const attr = this.getAttribute('figures');\n if (!attr) {\n console.error('figures attribute is missing');\n return null;\n }\n const figures = parseInt(this.getAttribute('figures') || '0');\n if (isNaN(figures)) {\n console.error('figures attribute is not a number');\n return null;\n }\n if (figures < 0) {\n console.error('figures attribute is negative');\n return null;\n }\n if (figures < 1 && this.roundingMode === 'significantFigures') {\n console.error('figures cannot be smaller than 1 for RoundingMode significantFigures');\n return null;\n }\n return figures;\n }\n\n public override getResult() {\n if (this.children.length === 2) {\n const values = this.getVariables() as ResponseVariable[];\n const value1 = values[0];\n const value2 = values[1];\n if (this.roundingMode === null) {\n return null;\n }\n if (\n value1.cardinality !== 'single' ||\n value2.cardinality !== 'single' ||\n Array.isArray(value1.value) ||\n Array.isArray(value2.value)\n ) {\n console.error('unexpected cardinality in qti equal');\n return false;\n }\n switch (values[0].baseType) {\n case 'integer':\n case 'float': {\n const float1 = parseFloat(value1.value as string);\n const float2 = parseFloat(value2.value as string);\n\n if (!isNaN(float1) && !isNaN(float2)) {\n if (this.roundingMode === 'significantFigures') {\n return float1.toPrecision(this.figures) === float2.toPrecision(this.figures);\n } else {\n return (\n Math.round(float1 * Math.pow(10, this.figures)) / Math.pow(10, this.figures) ===\n Math.round(float2 * Math.pow(10, this.figures)) / Math.pow(10, this.figures)\n );\n }\n } else {\n console.error(`value cannot be casted to numeric value in equalRounded operator: ${float1}, ${float2}`);\n }\n break;\n }\n default: {\n console.error(`values other than float and int cannot be used in equalRounded operator.`);\n break;\n }\n }\n return false;\n }\n console.error('unexpected number of children in qti-equal-rounded');\n return null;\n }\n}\n\ncustomElements.define('qti-equal-rounded', QtiEqualRounded);\n","import { property } from 'lit/decorators.js';\n\nimport { ScoringHelper } from '../../utilities/scoring-helper';\nimport { QtiExpression } from '../../../../exports/qti-expression';\n\nimport type { ResponseVariable } from '../../../../exports/variables';\n\nexport class QtiEqual extends QtiExpression<boolean> {\n @property({ type: String }) toleranceMode: 'exact' | 'relative' | 'absolute' = 'exact';\n\n public override getResult() {\n if (this.children.length === 2) {\n const values = this.getVariables() as ResponseVariable[];\n const value1 = values[0];\n const value2 = values[1];\n if (this.toleranceMode !== 'exact') {\n console.error('toleranceMode is not supported yet');\n return false;\n }\n if (\n value1.cardinality !== 'single' ||\n value2.cardinality !== 'single' ||\n Array.isArray(value1.value) ||\n Array.isArray(value2.value)\n ) {\n console.error('unexpected cardinality in qti equal');\n return false;\n }\n return ScoringHelper.compareSingleValues(value1.value as string, value2.value as string, value1.baseType);\n }\n console.error('unexpected number of children in qti-equal');\n return null;\n }\n}\n\ncustomElements.define('qti-equal', QtiEqual);\n","import type { BaseType } from '../../../exports/expression-result';\n\nexport class ScoringHelper {\n /**\n * Checks if a given point is within a specified area.\n * @param point The point to test, represented as a string \"x y\" (e.g., \"102 113\").\n * @param areaKey The area definition, including shape and coordinates (e.g., \"circle,102,113,16\").\n * @param baseType The base type of the response, must be \"point\" for this method to proceed.\n * @returns True if the point is within the area; false otherwise.\n */\n public static isPointInArea(point: string, areaKey: string, baseType: string): boolean {\n if (baseType !== 'point') {\n console.warn(`Base type ${baseType} is not supported for point area mapping.`);\n return false;\n }\n\n // Parse the point as x and y coordinates\n const [px, py] = point.split(' ').map(Number);\n\n // Parse the area definition\n const [shape, ...coords] = areaKey.split(',');\n const coordinates = coords.map(Number);\n\n switch (shape.toLowerCase()) {\n case 'circle':\n case 'default': {\n const [cx, cy, radius] = coordinates;\n if (coordinates.length !== 3) {\n console.warn(`Invalid circle definition: ${areaKey}`);\n return false;\n }\n const distance = Math.sqrt((px - cx) ** 2 + (py - cy) ** 2);\n return distance <= radius;\n }\n\n case 'rect': {\n const [x1, y1, x2, y2] = coordinates;\n if (coordinates.length !== 4) {\n console.warn(`Invalid rectangle definition: ${areaKey}`);\n return false;\n }\n return px >= x1 && px <= x2 && py >= y1 && py <= y2;\n }\n\n case 'ellipse': {\n const [cx, cy, rx, ry] = coordinates;\n if (coordinates.length !== 4) {\n console.warn(`Invalid ellipse definition: ${areaKey}`);\n return false;\n }\n // Ellipse equation: ((px - cx)² / rx²) + ((py - cy)² / ry²) <= 1\n const normalizedX = (px - cx) ** 2 / rx ** 2;\n const normalizedY = (py - cy) ** 2 / ry ** 2;\n return normalizedX + normalizedY <= 1;\n }\n\n case 'poly': {\n if (coordinates.length < 6 || coordinates.length % 2 !== 0) {\n console.warn(`Invalid polygon definition: ${areaKey}`);\n return false;\n }\n const vertices = [];\n for (let i = 0; i < coordinates.length; i += 2) {\n vertices.push({ x: coordinates[i], y: coordinates[i + 1] });\n }\n return this.isPointInPolygon({ x: px, y: py }, vertices);\n }\n\n default:\n console.warn(`Unsupported shape type: ${shape}`);\n return false;\n }\n }\n\n /**\n * Checks if a point is inside a polygon using the ray-casting algorithm.\n * @param point The point to test.\n * @param vertices The vertices of the polygon in order (array of {x, y} objects).\n * @returns True if the point is inside the polygon; false otherwise.\n */\n static isPointInPolygon(point: { x: number; y: number }, vertices: { x: number; y: number }[]): boolean {\n let inside = false;\n for (let i = 0, j = vertices.length - 1; i < vertices.length; j = i++) {\n const xi = vertices[i].x,\n yi = vertices[i].y;\n const xj = vertices[j].x,\n yj = vertices[j].y;\n\n const intersect = yi > point.y !== yj > point.y && point.x < ((xj - xi) * (point.y - yi)) / (yj - yi) + xi;\n\n if (intersect) inside = !inside;\n }\n return inside;\n }\n\n public static compareSingleValues(value1: Readonly<string>, value2: Readonly<string>, baseType: BaseType): boolean {\n switch (baseType) {\n case 'identifier':\n case 'string':\n return value1 === value2;\n case 'integer': {\n const int1 = parseInt(value1, 10);\n const int2 = parseInt(value2, 10);\n if (!isNaN(int1) && !isNaN(int2)) {\n return int1 === int2;\n } else {\n console.error(`Cannot convert ${value1} and/or ${value2} to int.`);\n }\n break;\n }\n case 'float': {\n const float1 = parseFloat(value1);\n const float2 = parseFloat(value2);\n if (!isNaN(float1) && !isNaN(float2)) {\n return float1 === float2;\n } else {\n console.error(`couldn't convert ${value1} and/or ${value2} to float.`);\n }\n break;\n }\n case 'pair':\n case 'directedPair': {\n const pair1 = value1.split(' ').sort();\n const pair2 = value2.split(' ').sort();\n if (pair1.length === 2 && pair2.length === 2) {\n if (baseType === 'pair') {\n pair1.sort();\n pair2.sort();\n }\n return pair1.join(' ') === pair2.join(' ');\n } else {\n console.error(`compared two pair but one of the values does not have 2 values: 1: ${value1} 2: ${value2}`);\n }\n break;\n }\n }\n\n return false;\n }\n}\n","import { QtiExpression } from '../../../../exports/qti-expression';\n\nimport type { ResponseVariable } from '../../../../exports/variables';\n\nexport class QtiGt extends QtiExpression<boolean> {\n public override getResult(): boolean {\n if (this.children.length === 2) {\n const values = this.getVariables() as ResponseVariable[];\n const value1 = values[0];\n const value2 = values[1];\n if (\n (value1.baseType === 'integer' || value1.baseType === 'float') &&\n (value2.baseType === 'integer' || value2.baseType === 'float')\n ) {\n return +value1.value > +value2.value;\n } else {\n console.error('unexpected baseType or cardinality in qti gt');\n }\n }\n console.error('unexpected number of children in qt');\n return null;\n }\n}\n\ncustomElements.define('qti-gt', QtiGt);\n","import { QtiConditionExpression } from '../../../../exports/qti-condition-expression';\n\nimport type { ResponseVariable } from '../../../../exports/variables';\n\n// PK: For the contains we assume the expressions to calculate are all directedPairs\n// I don't know it this in QTI is always the case however?\nexport class QtiGte extends QtiConditionExpression {\n public override getResult(): boolean {\n if (this.children.length === 2) {\n const values = this.getVariables() as ResponseVariable[];\n const value1 = values[0];\n const value2 = values[1];\n if (\n (value1.baseType === 'integer' || value1.baseType === 'float') &&\n (value2.baseType === 'integer' || value2.baseType === 'float')\n ) {\n return +value1.value >= +value2.value;\n } else {\n console.error('unexpected baseType or cardinality in qti gte');\n return null;\n }\n }\n console.log('unexpected number of children in qte');\n return null;\n }\n}\n\ncustomElements.define('qti-gte', QtiGte);\n","import { QtiExpression } from '../../../../exports/qti-expression';\n\nimport type { ResponseVariable } from '../../../../exports/variables';\n\n// PK: For the contains we assume the expressions to calculate are all directedPairs\n// I don't know it this in QTI is always the case however?\nexport class QtiIsNull extends QtiExpression<boolean> {\n public override getResult(): boolean {\n if (this.children.length === 1) {\n const variables = this.getVariables() as ResponseVariable[];\n if (!variables) {\n return true;\n }\n const value = variables[0].value;\n return value == null || value == undefined || value === '';\n }\n console.error('unexpected number of children in qti Null');\n return null;\n }\n}\n\ncustomElements.define('qti-is-null', QtiIsNull);\n","import { QtiExpression } from '../../../../exports/qti-expression';\n\nimport type { ResponseVariable } from '../../../../exports/variables';\n\nexport class QtiLt extends QtiExpression<boolean> {\n public override getResult(): boolean {\n if (this.children.length === 2) {\n const values = this.getVariables() as ResponseVariable[];\n const value1 = values[0];\n const value2 = values[1];\n if (\n (value1.baseType === 'integer' || value1.baseType === 'float') &&\n (value2.baseType === 'integer' || value2.baseType === 'float')\n ) {\n return +value1.value < +value2.value;\n } else {\n console.error('unexpected baseType or cardinality in qti lt');\n }\n }\n console.error('unexpected number of children in lt');\n return null;\n }\n}\n\ncustomElements.define('qti-lt', QtiLt);\n","import { QtiConditionExpression } from '../../../../exports/qti-condition-expression';\n\nimport type { ResponseVariable } from '../../../../exports/variables';\n\n// PK: For the contains we assume the expressions to calculate are all directedPairs\n// I don't know it this in QTI is always the case however?\nexport class QtiLte extends QtiConditionExpression {\n public override getResult(): boolean {\n if (this.children.length === 2) {\n const values = this.getVariables() as ResponseVariable[];\n const value1 = values[0];\n const value2 = values[1];\n if (\n (value1.baseType === 'integer' || value1.baseType === 'float') &&\n (value2.baseType === 'integer' || value2.baseType === 'float')\n ) {\n return +value1.value <= +value2.value;\n } else {\n console.error('unexpected baseType or cardinality in qti lte');\n return null;\n }\n }\n console.log('unexpected number of children in lte');\n return null;\n }\n}\n\ncustomElements.define('qti-lte', QtiLte);\n","import { property } from 'lit/decorators.js';\n\nimport { ScoringHelper } from '../../utilities/scoring-helper';\nimport { QtiExpression } from '../../../../exports/qti-expression';\n\nimport type { ResponseVariable } from '../../../../exports/variables';\n\nexport class QtiMapResponse extends QtiExpression<number> {\n @property({ type: String }) identifier: string;\n\n public override getResult(): number {\n const response: ResponseVariable = this.context.variables.find(r => r.identifier === this.identifier);\n if (!response || !response.mapping) {\n console.error(`Response ${this.identifier} can not be found`);\n return null;\n }\n const mapping = response.mapping;\n const candidateResponses = !Array.isArray(response.value) ? [response.value] : response.value;\n let result = 0;\n for (const candidateResponse of candidateResponses) {\n const mappedValues = mapping.mapEntries.filter(entry => {\n if (response.baseType === 'string' && !entry.caseSensitive) {\n return ScoringHelper.compareSingleValues(\n entry.mapKey.toLowerCase(),\n candidateResponse.toLowerCase(),\n response.baseType\n );\n } else {\n return ScoringHelper.compareSingleValues(entry.mapKey, candidateResponse, response.baseType);\n }\n });\n // now find the mapped value with the highest value (if there are multiple)\n const mappedValue = mappedValues.reduce(\n (prev, current) => (prev.mappedValue > current.mappedValue ? prev : current),\n mappedValues.length > 0 ? mappedValues[0] : { mapKey: null, mappedValue: null } // Use the first element instead of a manual initial value\n );\n if (!(mappedValue === null || mappedValue.mappedValue == undefined)) {\n result += mappedValue.mappedValue;\n } else {\n result += mapping.defaultValue;\n }\n }\n if (mapping?.lowerBound !== null && mapping?.lowerBound !== undefined) {\n result = Math.max(mapping.lowerBound, result);\n }\n if (mapping?.upperBound !== null && mapping?.upperBound !== undefined) {\n result = Math.min(mapping.upperBound, result);\n }\n return result;\n }\n}\n\ncustomElements.define('qti-map-response', QtiMapResponse);\n","import { property } from 'lit/decorators.js';\n\nimport { QtiExpression } from '../../../internal/qti-expression';\nimport { ScoringHelper } from '../../utilities/scoring-helper';\n\nimport type { ResponseVariable } from '../../../../exports/variables';\nimport type { QtiAreaMapping } from '../qti-area-mapping/qti-area-mapping';\n\nexport class QtiMapResponsePoint extends QtiExpression<number> {\n @property({ type: String }) identifier: string;\n\n public override getResult(): number {\n const response: ResponseVariable = this.context.variables.find(r => r.identifier === this.identifier);\n if (!response) {\n console.warn(`Response ${this.identifier} cannot be found`);\n return null;\n }\n\n const areaMapping: QtiAreaMapping = response.areaMapping;\n if (!areaMapping) {\n console.warn(`Area mapping not found for response ${this.identifier}`);\n return null;\n }\n\n const candidateResponses = !Array.isArray(response.value) ? [response.value] : response.value;\n if (!candidateResponses || candidateResponses.length === 0) {\n console.warn(`No candidate responses for response ${this.identifier}`);\n return null;\n }\n\n let result = 0;\n\n // Keep track of areas that have already been matched\n const mappedAreas = new Set<string>();\n\n for (const candidateResponse of candidateResponses) {\n for (const entry of areaMapping.areaMapEntries) {\n if (mappedAreas.has(entry.coords)) {\n continue; // Skip areas that have already been mapped\n }\n const isPointInArea = ScoringHelper.isPointInArea(\n candidateResponse,\n `${entry.shape},${entry.coords}`,\n response.baseType\n );\n if (isPointInArea) {\n result += entry.mappedValue ?? 0;\n mappedAreas.add(entry.coords);\n }\n }\n }\n\n // Add default value for unmatched candidate responses\n if (mappedAreas.size < candidateResponses.length) {\n result += areaMapping.defaultValue;\n }\n\n // Apply bounds if defined\n if (areaMapping.lowerBound != null) {\n result = Math.max(areaMapping.lowerBound, result);\n }\n if (areaMapping.upperBound != null) {\n result = Math.min(areaMapping.upperBound, result);\n }\n\n return result;\n }\n}\n\ncustomElements.define('qti-map-response-point', QtiMapResponsePoint);\n","import { consume } from '@lit/context';\nimport { css, html, LitElement } from 'lit';\nimport { state } from 'lit/decorators.js';\n\nimport { itemContext } from '../../exports/qti-assessment-item.context';\n\nimport type { QtiMultiple } from '..';\nimport type { ItemContext } from '../../exports/item.context';\nimport type { VariableDeclaration, ResponseVariable } from '../../exports/variables';\n\nexport interface QtiExpressionBase<T> {\n // get assessmentItem(): QtiAssessmentItem;\n\n // getVariables(): VariableDeclaration<number | string | (number | string)[] | null>[];\n calculate(): Readonly<T>;\n}\n\nexport abstract class QtiExpression<T> extends LitElement implements QtiExpressionBase<T> {\n @state()\n protected result: any;\n\n // hide the slot with css\n static styles = css`\n slot {\n display: none;\n }\n `;\n\n override render() {\n return html`<pre>${JSON.stringify(this.result, null, 2)}</pre>\n <slot></slot>`;\n }\n\n public calculate(): Readonly<T> {\n this.result = this.getResult();\n return this.result;\n }\n\n protected getResult(): Readonly<T> {\n throw new Error('Not implemented');\n }\n\n @consume({ context: itemContext, subscribe: true })\n @state()\n protected context?: ItemContext;\n\n getVariables = (): VariableDeclaration<number | string | (number | string)[] | null>[] =>\n // FIXME: if this itself is multiple, this will never enter the qti-multiple switch\n // See this example here: https://github.com/1EdTech/qti-examples/blob/master/qtiv3-examples/packaging/items/Example05-feedbackBlock-adaptive.xml\n\n Array.from(this.children)\n .map((e: Element) => {\n switch (e.tagName.toLowerCase()) {\n case 'qti-base-value': {\n return {\n baseType: e.getAttribute('base-type'),\n value: e.textContent.trim(),\n cardinality: 'single'\n } as ResponseVariable;\n }\n case 'qti-variable': {\n const identifier = e.getAttribute('identifier') || '';\n const variable = this.context.variables.find(v => v.identifier === identifier) || null;\n return variable;\n }\n case 'qti-multiple': {\n const multiple = e as unknown as QtiMultiple;\n const values = multiple.getResult();\n if (values.length > 0) {\n return {\n identifier: '',\n baseType: values[0].baseType,\n value: values.map(v => v.value),\n cardinality: 'multiple',\n type: 'response'\n } as ResponseVariable;\n }\n return null;\n }\n case 'qti-correct': {\n const identifier = e.getAttribute('identifier') || '';\n const responseVariable: ResponseVariable =\n this.context.variables.find(v => v.identifier === identifier) || null;\n return {\n baseType: responseVariable.baseType,\n value: responseVariable.correctResponse,\n cardinality: responseVariable.cardinality\n } as ResponseVariable;\n }\n default: {\n // added for use of qti-equal-rounded\n try {\n const expression = e as QtiExpression<number>;\n const value = expression.getResult();\n return {\n baseType: 'integer',\n value: value.toString(),\n cardinality: 'single'\n } as ResponseVariable;\n } catch (error) {\n console.warn('default not sufficient');\n }\n return null;\n }\n }\n })\n .filter(v => v !== null);\n}\n","import { ScoringHelper } from '../../utilities/scoring-helper';\nimport { QtiExpression } from '../../../../exports/qti-expression';\n\nimport type { ResponseVariable } from '../../../../exports/variables';\n\nexport class QtiMatch extends QtiExpression<boolean> {\n //PK : FIXME.\n // This was a little experiment if we could call the match function as a static function,\n // This can be used for all kind of things, but now especially for use in\n // qti-response-condition-script\n // in which we pass the expressions as pure functions, and hope for the best.\n // SADLY, the getVariables throws roet in de eten.. weet nog niet precies hoe deze werkt.\n // Maar ik ga erin duiken.\n public override getResult() {\n if (this.children.length === 2) {\n const values = this.getVariables() as ResponseVariable[];\n const valueToMap = values[0];\n const correctValueInfo = values[1];\n return QtiMatch.match(valueToMap, correctValueInfo);\n }\n\n console.error('unexpected number of children in match');\n return null;\n }\n\n public static match(valueToMap: ResponseVariable, correctValueInfo: ResponseVariable) {\n if (valueToMap.value === null) return false;\n switch (correctValueInfo.cardinality) {\n case 'single': {\n if (Array.isArray(valueToMap.value) || Array.isArray(correctValueInfo.value)) {\n console.error('unexpected cardinality in qti match');\n return false;\n }\n return ScoringHelper.compareSingleValues(\n valueToMap.value?.toString(),\n correctValueInfo.value.toString(),\n correctValueInfo.baseType\n );\n }\n\n case 'ordered': {\n if (!Array.isArray(valueToMap.value) || !Array.isArray(correctValueInfo.value)) {\n console.error('unexpected cardinality in qti match');\n return false;\n }\n if (valueToMap.value.length !== correctValueInfo.value.length) {\n return false;\n }\n for (let i = 0; i < valueToMap.value.length; i++) {\n const result = ScoringHelper.compareSingleValues(\n correctValueInfo.value[i],\n valueToMap.value[i],\n correctValueInfo.baseType\n );\n if (!result) {\n return false;\n }\n }\n return true;\n }\n\n case 'multiple': {\n if (!Array.isArray(valueToMap.value) || !Array.isArray(correctValueInfo.value)) {\n console.error('unexpected cardinality in qti match');\n return false;\n }\n if (valueToMap.value.length !== correctValueInfo.value.length) {\n return false;\n }\n let answerIndex = 0;\n for (const correctAnswer of correctValueInfo.value) {\n let matchingValue: string | null = null;\n const arr = [...valueToMap.value];\n for (const mv of arr) {\n const result = ScoringHelper.compareSingleValues(correctAnswer, mv, correctValueInfo.baseType);\n if (result) {\n matchingValue = mv;\n break;\n }\n }\n if (matchingValue !== null) {\n (arr as string[]).splice(arr.indexOf(matchingValue), 1);\n } else {\n return false;\n }\n answerIndex++;\n }\n return true;\n }\n\n default:\n console.error('unexpected cardinality in qti match');\n return false;\n }\n }\n}\n\ncustomElements.define('qti-match', QtiMatch);\n","import { QtiExpression } from '../../../../exports/qti-expression';\n\nimport type { ResponseVariable } from '../../../../exports/variables';\n\nexport class QtiMember extends QtiExpression<boolean | null> {\n public override getResult() {\n const values = this.getVariables() as ResponseVariable[];\n\n if (!(this.children.length === 2)) {\n console.warn('The member operator takes two sub-expressions');\n }\n\n const [value1, value2] = values;\n\n if (\n !(\n value1.baseType === value2.baseType ||\n (value1.baseType === 'integer' && value2.baseType === 'float') ||\n (value1.baseType === 'float' && value2.baseType === 'integer')\n )\n ) {\n console.warn('Which must both have the same base-type');\n }\n if (!(value2.cardinality === 'multiple' || value2.cardinality === 'ordered')) {\n console.warn('and the second must be a multiple or ordered container');\n }\n if (value1.baseType === 'float' || value2.baseType === 'float') {\n console.warn('The member operator should not be used on sub-expressions with a base-type of float');\n }\n if (value1.baseType === 'duration' || value2.baseType === 'duration') {\n console.warn('It must not be used on sub-expressions with a base-type of duration');\n }\n\n // If either sub-expression is NULL then the result of the operator is NULL\n if (value1.value === null || value2.value === null) {\n return null;\n }\n\n // The result is a single boolean with a value of 'true' if the value given by the first sub-expression is in the container defined by the second sub-expression.\n const projection1 = value1.value as string;\n const projection2 = value2.value as string[];\n return projection2.includes(projection1);\n }\n}\n\ncustomElements.define('qti-member', QtiMember);\n","import { QtiExpression } from '../../../../exports/qti-expression';\n\nimport type { ResponseVariable, VariableDeclaration } from '../../../../exports/variables';\nexport class QtiMultiple extends QtiExpression<VariableDeclaration<string | string[]>[]> {\n public override getResult(): ResponseVariable[] {\n const variables = this.getVariables() as ResponseVariable[];\n if (variables.length === 0) {\n console.error('unexpected number of children in qti multiple');\n return null;\n }\n for (const variable of variables) {\n if (variable.cardinality !== 'multiple' && variable.cardinality !== 'single') {\n console.error('unexpected cardinality in qti multiple');\n return [];\n }\n }\n\n // const values = variables.map(v => v.value);\n // console.log(variables);\n // const flattenedArray = values.reduce((acc: string[], value: string | string[]) => {\n // return acc.concat(Array.isArray(value) ? [...value] : value);\n // }, []);\n // return flattenedArray;\n\n return variables;\n }\n}\n\ncustomElements.define('qti-multiple', QtiMultiple);\n","import { html } from 'lit';\n\nimport { QtiExpression } from '../../../../exports/qti-expression';\n\nexport class QtiNot extends QtiExpression<boolean> {\n override render() {\n return html`${super.render()}`;\n }\n\n public override getResult() {\n const expression = this.firstElementChild as QtiExpression<boolean>;\n const result = expression.calculate() as boolean;\n return !result;\n }\n}\n\ncustomElements.define('qti-not', QtiNot);\n","import { QtiConditionExpression } from '../../../../exports/qti-condition-expression';\n\nimport type { QtiExpression } from '../../../../exports/qti-expression';\n\nexport class QtiOr extends QtiConditionExpression {\n public override getResult() {\n // children can be a mix of qti-expression and qti-condition-expression\n const values = Array.from(this.children).map(c => {\n const condition = c as QtiExpression<any>;\n if (!condition.calculate) {\n console.error(\"Element doesn't implement QtiConditionExpression\");\n return null;\n }\n const value = condition.calculate();\n let val = false;\n // convert string value to boolean and return null if not possible\n if (typeof value === 'string') {\n if (value === 'true') {\n val = true;\n } else if (value === 'false') {\n val = false;\n } else {\n console.error('unexpected val in qti-or, expected boolean');\n return null;\n }\n } else {\n if (typeof value === 'boolean') {\n val = value;\n }\n }\n return val;\n });\n return values.some(e => {\n return typeof e === 'boolean' && e;\n });\n }\n}\n\ncustomElements.define('qti-or', QtiOr);\n","import { QtiExpression } from '../../../../exports/qti-expression';\n\nimport type { ResponseVariable } from '../../../../exports/variables';\nexport class QtiOrdered extends QtiExpression<ResponseVariable[]> {\n public override getResult(): ResponseVariable[] {\n const variables = this.getVariables() as ResponseVariable[];\n if (variables.length === 0) {\n console.error('unexpected number of children in qti multiple');\n return null;\n }\n for (const variable of variables) {\n if (variable.cardinality !== 'ordered' && variable.cardinality !== 'single') {\n console.error('unexpected cardinality in qti ordered');\n return [];\n }\n }\n return variables;\n }\n}\n\ncustomElements.define('qti-ordered', QtiOrdered);\n","import { consume } from '@lit/context';\nimport { LitElement, html, nothing } from 'lit';\nimport { property, state } from 'lit/decorators.js';\n\nimport { itemContext } from '../../../../exports/qti-assessment-item.context';\n\nimport type { VariableDeclaration } from '../../../../exports/variables';\nimport type { ItemContext } from '../../../../exports/item.context';\n\nexport class QtiPrintedVariable extends LitElement {\n @property({ type: String })\n identifier: string;\n\n @consume({ context: itemContext, subscribe: true })\n @state()\n protected context?: ItemContext;\n\n override render() {\n const value = this.context?.variables.find(v => v.identifier === this.identifier)?.value;\n return value === null ? nothing : html`${JSON.stringify(value, null, 2)}`;\n }\n\n public calculate(): VariableDeclaration<string | string[]> {\n const result = this.context.variables.find(v => v.identifier === this.identifier) || null;\n return result;\n }\n}\n\ncustomElements.define('qti-printed-variable', QtiPrintedVariable);\n","import { QtiExpression } from '../../../../exports/qti-expression';\n\nimport type { ResponseVariable } from '../../../../exports/variables';\n\nexport class QtiProduct extends QtiExpression<number> {\n public override getResult() {\n const values = this.getVariables() as ResponseVariable[];\n const product = values.reduce((accumulator, currentValue) => {\n if (currentValue.baseType == 'float' || currentValue.baseType == 'integer') {\n try {\n return accumulator * parseInt(currentValue.value.toString());\n } catch (error) {\n console.warn(`can not convert to number`);\n }\n } else {\n console.warn(`has another baseType ${currentValue.baseType}`);\n }\n return accumulator;\n }, 1);\n return product;\n }\n}\n\ncustomElements.define('qti-product', QtiProduct);\n","import { QtiExpression } from '../../../../exports/qti-expression';\n\ntype Constructor<T> = new (...args: any[]) => T;\nexport class QtiSubtract extends qtiSubtractMixin(QtiExpression<any> as unknown as Constructor<QtiExpression<number>>) {\n public override getResult() {\n // children can be a mix of qti-expression and qti-condition-expression\n const value = this.calculateChildren(Array.from(this.children as unknown as QtiExpression<any>[]));\n return value;\n }\n}\n\ntype MockQtiExpression<T> = { calculate: () => T };\ntype MockConstructor = new (...args: any[]) => {};\n\nexport function qtiSubtractMixin<TBase extends MockConstructor>(Base: TBase) {\n return class MockQtiSubtract extends Base {\n public calculateChildren(children: Array<MockQtiExpression<any>>) {\n // children can be a mix of qti-expression and qti-condition-expression\n const values = children.map(expression => {\n if (!expression.calculate) {\n console.error(\"Element doesn't implement QtiConditionExpression\");\n return null;\n }\n const value = expression.calculate();\n if (Number.isNaN(value)) {\n console.error('Unexpected value in qti-subtract, expected number');\n return null;\n }\n return Number(value);\n });\n if (values.some(value => value === null)) {\n console.error('One or more child expressions returned invalid values');\n return 0;\n }\n // Subtract the two values\n return values[0] - values[1];\n }\n };\n}\n","import { QtiSubtract } from './qti-subtract';\ncustomElements.define('qti-subtract', QtiSubtract);\n\nexport * from './qti-subtract';\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-subtract': QtiSubtract;\n }\n}\n","import { property } from 'lit/decorators.js';\n\nimport { ScoringHelper } from '../../utilities/scoring-helper';\nimport { QtiExpression } from '../../../../exports/qti-expression';\n\nimport type { ResponseVariable } from '../../../../exports/variables';\n\nexport class QtiStringMatch extends QtiExpression<boolean> {\n @property({ type: String, attribute: 'case-sensitive' }) caseSensitive = 'true';\n\n public override getResult() {\n if (this.children.length === 2) {\n const values = this.getVariables() as ResponseVariable[];\n const value1 = values[0];\n const value2 = values[1];\n if (\n value1.cardinality !== 'single' ||\n value2.cardinality !== 'single' ||\n Array.isArray(value1.value) ||\n Array.isArray(value2.value)\n ) {\n console.error('unexpected cardinality in qti string-match');\n return false;\n }\n const v1 = this.caseSensitive === 'true' ? value1.value : (value1.value as string).toLowerCase();\n const v2 = this.caseSensitive === 'true' ? value2.value : (value2.value as string).toLowerCase();\n return ScoringHelper.compareSingleValues(v1 as string, v2 as string, value1.baseType);\n }\n console.error('unexpected number of children in qti-string-match');\n return null;\n }\n}\n\ncustomElements.define('qti-string-match', QtiStringMatch);\n","import { QtiExpression } from '../../../../exports/qti-expression';\n\nimport type { QtiExpressionBase } from '../../../../exports/qti-expression';\n\nexport class QtiSum extends QtiExpression<number> {\n private _expression: QtiSumExpression;\n constructor() {\n super();\n this._expression = new QtiSumExpression(Array.from(this.children as unknown as QtiExpressionBase<number>[]));\n }\n\n public override getResult() {\n // children can be a mix of qti-expression and qti-condition-expression\n const value = this._expression.calculate();\n return value;\n }\n}\n\nexport class QtiSumExpression implements QtiExpressionBase<number> {\n constructor(private expressions: QtiExpressionBase<number>[]) {}\n\n public calculate() {\n const values = this.expressions.map(c => {\n if (!c.calculate) {\n console.error(\"Element doesn't implement QtiConditionExpression\");\n return null;\n }\n const value = c.calculate();\n if (Number.isNaN(value)) {\n console.error('unexpected value in qti-sum, expected number');\n return null;\n }\n\n return Number(value);\n });\n return values.reduce((a, b) => a + b, 0);\n }\n}\n\ncustomElements.define('qti-sum', QtiSum);\n","import { QtiExpression } from '../../../../exports/qti-expression';\n\nexport class QtiVariable extends QtiExpression<string | string[]> {\n public override getResult() {\n const identifier = this.getAttribute('identifier');\n const result = this.context.variables.find(v => v.identifier === identifier).value;\n return result;\n }\n}\n\ncustomElements.define('qti-variable', QtiVariable);\n","import { QtiExpression } from '../../../../exports/qti-expression';\n\nexport class QtiRandom extends QtiExpression<string> {\n public override getResult() {\n const values = this.getVariables();\n // console.log(values);\n\n if (values.length === 1) {\n const value = values[0].value;\n if (Array.isArray(value)) {\n const randomIndex = Math.floor(Math.random() * value.length);\n return value[randomIndex];\n }\n return value;\n }\n console.error('unexpected number of children in match');\n return null;\n }\n}\n\ncustomElements.define('qti-random', QtiRandom);\n","import { QtiExpression } from '../../../internal/qti-expression';\n\nimport type { ResponseVariable } from '../../../../exports/variables';\n\nexport class QtiDelete extends QtiExpression<string[] | null> {\n override getResult(): string[] | null {\n if (this.children.length === 2) {\n const values = this.getVariables() as ResponseVariable[];\n const value1 = values[0];\n const value2 = values[1];\n\n if (value1.cardinality !== 'single' || !Array.isArray(value2.value)) {\n console.error('unexpected cardinality in qti equal');\n return null;\n }\n\n if (values[0].baseType !== values[1].baseType) {\n console.error('The baseType of the two variables is different');\n return null;\n }\n\n const filtered = value2.value.filter(v => !value1.value.includes(v));\n\n return filtered;\n }\n }\n}\n\ncustomElements.define('qti-delete', QtiDelete);\n","import { LitElement, html } from 'lit';\nimport { customElement } from 'lit/decorators.js';\n\n@customElement('qti-content-body')\nexport class QtiContentBody extends LitElement {\n override render() {\n return html`<slot></slot>`;\n }\n}\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-content-body': QtiContentBody;\n }\n}\n","import { LitElement, css, html } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport { watch } from '../../decorators/watch';\n\n@customElement('qti-rubric-block')\nexport class QtiRubricBlock extends LitElement {\n @property({ type: String }) override id; // =\"qtiAspectInhoudRubricBlock\"\n\n @property({ type: String }) use: 'instructions' | 'scoring' | 'navigation'; // = \"scoring\"\n\n @property({ type: String }) view: 'author' | 'candidate' | 'proctor' | 'scorer' | 'testConstructor' | 'tutor';\n\n @property({ type: String, attribute: 'class' }) classNames;\n @watch('classNames', { waitUntilFirstUpdate: true })\n handleclassNamesChange() {\n const classNames = this.classNames.split(' ');\n classNames.forEach((className: string) => {\n switch (className) {\n case 'qti-rubric-discretionary-placement':\n this.setAttribute('slot', 'qti-rubric-block');\n break;\n case 'qti-rubric-inline':\n this.setAttribute('slot', '');\n break;\n default:\n break;\n }\n });\n }\n\n static override styles = css`\n :host {\n display: block;\n }\n `;\n\n override render() {\n return html`<slot></slot>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-rubric-block': QtiRubricBlock;\n }\n}\n","import { LitElement } from 'lit';\nimport { customElement } from 'lit/decorators.js';\n\nimport type { PropertyValueMap } from 'lit';\n\n@customElement('qti-stylesheet')\nexport class QtiStylesheet extends LitElement {\n private styleElement: HTMLStyleElement | null = null;\n\n protected firstUpdated(_changedProperties: PropertyValueMap<any> | Map<PropertyKey, unknown>): void {\n super.firstUpdated(_changedProperties);\n\n const link = this.getAttribute('href');\n\n if (link !== null) {\n // Fetch the stylesheet content\n fetch(link)\n .then(response => response.text())\n .then(cssContent => {\n // Minify the CSS content by removing whitespace and comments\n const minifiedCss = this.minifyCss(cssContent);\n\n // Create a <style> element with @scope surrounding the minified CSS\n this.styleElement = document.createElement('style');\n this.styleElement.media = 'screen';\n this.styleElement.textContent = `@scope {${minifiedCss}}`;\n\n // Append the style element to the parent element of this component\n if (this.parentElement) {\n this.parentElement.appendChild(this.styleElement);\n } else {\n console.warn('No parent element to append the scoped stylesheet to.');\n }\n })\n .catch(error => {\n console.error('Failed to load stylesheet:', error);\n });\n }\n\n if (this.textContent !== null && this.textContent.trim() !== '') {\n // Minify the inline CSS content\n const minifiedCss = this.minifyCss(this.textContent);\n\n // Directly create a <style> element with the @scope surrounding the minified inline styles\n this.styleElement = document.createElement('style');\n this.styleElement.media = 'screen';\n this.styleElement.textContent = `@scope {${minifiedCss}}`;\n\n // Append the style element to the parent element of this component\n if (this.parentElement) {\n this.parentElement.appendChild(this.styleElement);\n } else {\n console.warn('No parent element to append the scoped stylesheet to.');\n }\n }\n }\n\n private minifyCss(cssContent: string): string {\n // Remove comments, whitespace, and newline characters\n return cssContent\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, '') // Remove comments\n .replace(/\\s+/g, ' ') // Collapse whitespace\n .replace(/\\s*([{}:;])\\s*/g, '$1') // Remove spaces around {}, :, ;\n .trim(); // Trim leading/trailing whitespace\n }\n\n override disconnectedCallback() {\n if (this.styleElement) {\n try {\n this.styleElement.remove();\n } catch (error) {\n console.error('Could not remove stylesheet:', error);\n }\n }\n super.disconnectedCallback();\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-stylesheet': QtiStylesheet;\n }\n}\n","import { consume } from '@lit/context';\nimport { css, html } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport { itemContext } from '../../../exports/qti-assessment-item.context';\nimport { QtiVariableDeclaration } from '../qti-variable-declaration';\n\nimport type { BaseType, Cardinality } from '../../../exports/expression-result';\nimport type { OutcomeVariable } from '../../../exports/variables';\nimport type { ItemContext } from '../../../exports/item.context';\n\n@customElement('qti-outcome-declaration')\nexport class QtiOutcomeDeclaration extends QtiVariableDeclaration {\n @property({ type: String, attribute: 'base-type' }) baseType: BaseType;\n @property({ type: String, attribute: 'external-scored' }) externalScored: 'human' | 'externalMachine' | null = null;\n @property({ type: String }) identifier: string;\n @property({ type: String }) cardinality: Cardinality;\n\n @consume({ context: itemContext, subscribe: true })\n @state()\n public itemContext?: ItemContext;\n\n static styles = [\n css`\n :host {\n display: none;\n }\n `\n ];\n\n override render() {\n const value = this.itemContext?.variables.find(v => v.identifier === this.identifier)?.value;\n return html`${JSON.stringify(value, null, 2)}`;\n }\n\n get interpolationTable(): Map<number, number> | null {\n const table = this.querySelector('qti-interpolation-table');\n if (table) {\n const entries = new Map<number, number>();\n for (const entry of table.querySelectorAll('qti-interpolation-table-entry')) {\n if (!entry.getAttribute('source-value') && entry.getAttribute('target-value')) {\n console.error('source-value or target-value is missing in qti-interpolation-table-entry');\n }\n const sourceValue = parseInt(entry.getAttribute('source-value'));\n const targetValue = parseInt(entry.getAttribute('target-value'));\n if (isNaN(sourceValue) || isNaN(targetValue)) {\n console.error('source-value or target-value is not a number in qti-interpolation-table-entry');\n }\n entries.set(sourceValue, targetValue);\n }\n return entries;\n }\n return null;\n }\n\n public override connectedCallback() {\n super.connectedCallback();\n const outcomeVariable: OutcomeVariable = {\n identifier: this.identifier,\n cardinality: this.cardinality,\n baseType: this.baseType,\n type: 'outcome',\n value: null,\n interpolationTable: this.interpolationTable,\n externalScored: this.externalScored\n };\n // At runtime, outcome variables are instantiated as part of an item session.\n // Their values may be initialized with a default value and/or set during response processing.\n // If no default value is given in the declaration then the outcome variable is initialized to NULL unless the outcome is of a numeric type (integer or float) in which case it is initialized to 0.\n outcomeVariable.value = this.defaultValues(outcomeVariable);\n if (\n (outcomeVariable.value === null || outcomeVariable.value == undefined) &&\n (outcomeVariable.baseType === 'integer' || outcomeVariable.baseType === 'float')\n ) {\n outcomeVariable.value = '0';\n }\n this.dispatchEvent(\n new CustomEvent('qti-register-variable', {\n bubbles: true,\n composed: true,\n detail: { variable: outcomeVariable }\n })\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-outcome-declaration': QtiOutcomeDeclaration;\n }\n}\n","import { html, LitElement } from 'lit';\nimport { customElement } from 'lit/decorators.js';\n\nimport type { VariableDeclaration } from '../../exports/variables';\n\n@customElement('qti-variabledeclaration')\nexport class QtiVariableDeclaration extends LitElement {\n override render() {\n return html`<slot></slot>`;\n }\n\n protected defaultValues(variable: VariableDeclaration<string | string[] | null>) {\n const htmlValues = Array.from(this.querySelectorAll('qti-default-value > qti-value'));\n\n if (htmlValues.length === 0) {\n return null;\n }\n\n const defaultValues = htmlValues.map(n => n.innerHTML.trim());\n if (defaultValues.length > 1 || variable.cardinality === 'multiple' || variable.cardinality === 'ordered') {\n return defaultValues;\n }\n return defaultValues[0];\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-variabledeclaration': QtiVariableDeclaration;\n }\n}\n","import { consume } from '@lit/context';\nimport { css, html } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport { itemContext } from '../../../exports/qti-assessment-item.context';\nimport { QtiVariableDeclaration } from '../qti-variable-declaration';\n\nimport type { QtiAreaMapping } from '../../qti-response-processing';\nimport type { BaseType, Cardinality } from '../../../exports/expression-result';\nimport type { ResponseVariable } from '../../../exports/variables';\nimport type { QtiMapping } from '../../qti-response-processing/qti-expression/qti-mapping/qti-mapping';\nimport type { ItemContext } from '../../../exports/item.context';\n\n@customElement('qti-response-declaration')\nexport class QtiResponseDeclaration extends QtiVariableDeclaration {\n @property({ type: String, attribute: 'base-type' }) baseType: BaseType;\n\n @property({ type: String }) identifier: string;\n\n @property({ type: String }) cardinality: Cardinality;\n\n @consume({ context: itemContext, subscribe: true })\n @state()\n public itemContext?: ItemContext;\n\n static styles = [\n css`\n :host {\n display: none;\n }\n `\n ];\n\n override render() {\n const value = this.itemContext?.variables.find(v => v.identifier === this.identifier)?.value;\n return html`${JSON.stringify(value, null, 2)}`;\n }\n\n public override connectedCallback() {\n super.connectedCallback();\n\n const responseVariable: ResponseVariable = {\n baseType: this.baseType,\n identifier: this.identifier,\n correctResponse: this.correctResponse,\n cardinality: this.cardinality || 'single',\n mapping: this.mapping,\n areaMapping: this.areaMapping,\n value: null,\n type: 'response',\n candidateResponse: null\n };\n responseVariable.value = this.defaultValues(responseVariable);\n\n this.dispatchEvent(\n new CustomEvent('qti-register-variable', {\n bubbles: true,\n composed: true,\n detail: { variable: responseVariable }\n })\n );\n }\n\n private get correctResponse(): string | string[] {\n let result: string | string[];\n const correctResponse = this.querySelector('qti-correct-response');\n if (correctResponse) {\n const values = correctResponse.querySelectorAll('qti-value');\n if (this.cardinality === 'single' && values.length > 0) {\n result = values[0].textContent.trim();\n values[0].remove();\n } else if (this.cardinality !== 'single') {\n result = [];\n for (let i = 0; i < values.length; i++) {\n result.push(values[i].textContent.trim());\n values[i].remove();\n }\n }\n }\n return result;\n }\n\n private get mapping(): QtiMapping {\n const mappingElement = this.querySelector('qti-mapping');\n const lowerBound = parseInt(mappingElement?.getAttribute('lower-bound'));\n const uppperBound = parseInt(mappingElement?.getAttribute('upper-bound'));\n const mappingValue = {\n defaultValue: Number(mappingElement?.getAttribute('default-value')) || 0,\n lowerBound: isNaN(lowerBound) ? null : lowerBound,\n upperBound: isNaN(uppperBound) ? null : uppperBound,\n mapEntries: Array.from(mappingElement?.querySelectorAll('qti-map-entry') || []).map(el => ({\n mapKey: el.getAttribute('map-key') || '',\n mappedValue: Number(el.getAttribute('mapped-value')) || 0,\n caseSensitive: el.hasAttribute('case-sensitive') ? el.getAttribute('case-sensitive') !== 'false' : true\n }))\n };\n return mappingValue;\n }\n\n private get areaMapping(): QtiAreaMapping {\n const areaMappingElement = this.querySelector('qti-area-mapping') as HTMLElement;\n\n const defaultValue = Number(areaMappingElement?.getAttribute('default-value')) || 0;\n const lowerBound = parseInt(areaMappingElement?.getAttribute('lower-bound'));\n const uppperBound = parseInt(areaMappingElement?.getAttribute('upper-bound'));\n\n const areaMapEntries = Array.from(areaMappingElement?.querySelectorAll('qti-area-map-entry') || []).map(\n (el: HTMLElement) => ({\n shape: (el.getAttribute('shape') as 'default' | 'circle' | 'rect' | 'ellipse' | 'poly') || 'default',\n coords: el.getAttribute('coords') || '',\n mappedValue: Number(el.getAttribute('mapped-value')) || 0,\n defaultValue: Number(el.getAttribute('default-value')) || 0\n })\n );\n\n return {\n defaultValue,\n lowerBound: isNaN(lowerBound) ? null : lowerBound,\n upperBound: isNaN(uppperBound) ? null : uppperBound,\n areaMapEntries\n };\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-response-declaration': QtiResponseDeclaration;\n }\n}\n"],"mappings":"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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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","names":["LitElement","customElement","property","LitElement","property","customElement","LitElement","customElement","LitElement","customElement","LitElement","html","customElement","LitElement","html","customElement","html","customElement","consume","LitElement","property","state","LitElement","property","consume","state","html","customElement","css","html","customElement","html","css","customElement","css","html","customElement","html","css","customElement","LitElement","css","html","customElement","LitElement","html","css","customElement","html","customElement","state","property","property","css","html","state","customElement","html","customElement","property","property","state","property","state","property","property","css","html","property","customElement","html","customElement","property","state","iframe","html","property","state","customElement","html","LitElement","customElement","property","LitElement","html","property","customElement","html","ifDefined","customElement","property","state","css","html","ifDefined","state","property","customElement","css","LitElement","customElement","property","LitElement","css","property","customElement","html","customElement","css","html","customElement","css","html","LitElement","customElement","property","html","property","html","property","LitElement","html","css","property","customElement","css","html","LitElement","customElement","property","LitElement","html","css","property","customElement","html","customElement","state","ifDefined","css","html","ifDefined","state","customElement","html","customElement","css","html","customElement","html","customElement","css","html","hotspot","customElement","css","LitElement","customElement","property","LitElement","css","property","customElement","html","customElement","css","html","customElement","html","customElement","html","customElement","css","html","LitElement","customElement","LitElement","html","css","customElement","css","html","customElement","property","state","css","html","state","property","customElement","css","html","LitElement","customElement","property","LitElement","css","html","property","customElement","css","html","LitElement","customElement","property","LitElement","html","css","property","customElement","html","customElement","property","state","unsafeHTML","css","html","unsafeHTML","property","state","customElement","css","html","customElement","html","css","customElement","html","customElement","property","state","css","html","state","property","customElement","css","html","customElement","property","state","consume","css","config","element","require","html","css","property","state","consume","customElement","LitElement","css","html","LitElement","css","html","customElement","LitElement","html","css","customElement","css","html","customElement","property","state","repeat","html","repeat","css","property","state","customElement","css","html","LitElement","nothing","customElement","property","LitElement","html","nothing","css","property","customElement","html","customElement","property","query","css","html","query","property","customElement","html","nothing","customElement","property","query","state","ifDefined","css","html","ifDefined","nothing","property","state","query","customElement","css","html","customElement","html","css","customElement","customElement","html","LitElement","css","LitElement","html","customElement","css","html","LitElement","customElement","LitElement","html","css","customElement","html","LitElement","customElement","LitElement","html","customElement","css","html","LitElement","customElement","LitElement","html","css","customElement","property","state","consume","customElement","html","LitElement","LitElement","html","customElement","property","consume","state","html","html","LitElement","html","html","html","customElement","customElement","property","property","property","property","property","property","property","property","property","consume","css","html","LitElement","state","QtiExpression","LitElement","html","css","state","consume","QtiExpression","property","html","html","consume","LitElement","html","nothing","property","state","LitElement","nothing","html","property","consume","state","property","property","QtiExpression","LitElement","html","customElement","LitElement","html","customElement","LitElement","css","html","customElement","property","LitElement","html","css","property","customElement","LitElement","customElement","LitElement","customElement","consume","css","html","customElement","property","state","html","LitElement","customElement","LitElement","html","customElement","html","css","property","consume","state","customElement","consume","css","html","customElement","property","state","html","css","property","consume","state","customElement"]}