@intellectif/lk-react 23.1.0 → 23.1.2

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 (360) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/README.md +9 -5
  3. package/dist/ActivityErrorBoundary-B379hvtL.cjs +39 -0
  4. package/dist/ActivityErrorBoundary-B379hvtL.cjs.map +1 -0
  5. package/dist/ActivityErrorBoundary-Dw6SbWv3.js +34 -0
  6. package/dist/ActivityErrorBoundary-Dw6SbWv3.js.map +1 -0
  7. package/dist/ActivityMedia-CQQTRNl7.cjs +641 -0
  8. package/dist/ActivityMedia-CQQTRNl7.cjs.map +1 -0
  9. package/dist/ActivityMedia-vDiP-Psa.js +636 -0
  10. package/dist/ActivityMedia-vDiP-Psa.js.map +1 -0
  11. package/dist/ActivityPreview-1hhTkYuj.js +240 -0
  12. package/dist/ActivityPreview-1hhTkYuj.js.map +1 -0
  13. package/dist/ActivityPreview-BKr34exz.cjs +245 -0
  14. package/dist/ActivityPreview-BKr34exz.cjs.map +1 -0
  15. package/dist/ActivitySequence-CkX87pfB.js +839 -0
  16. package/dist/ActivitySequence-CkX87pfB.js.map +1 -0
  17. package/dist/ActivitySequence-CmoSyDnp.cjs +844 -0
  18. package/dist/ActivitySequence-CmoSyDnp.cjs.map +1 -0
  19. package/dist/Dictation-BlxRp-3k.js +926 -0
  20. package/dist/Dictation-BlxRp-3k.js.map +1 -0
  21. package/dist/Dictation-jECzL88E.cjs +931 -0
  22. package/dist/Dictation-jECzL88E.cjs.map +1 -0
  23. package/dist/FeedbackRegion-BNNMtTY-.cjs +108 -0
  24. package/dist/FeedbackRegion-BNNMtTY-.cjs.map +1 -0
  25. package/dist/FeedbackRegion-CyPSp8bA.js +85 -0
  26. package/dist/FeedbackRegion-CyPSp8bA.js.map +1 -0
  27. package/dist/FillInTheBlanks-B6xzqYXx.js +474 -0
  28. package/dist/FillInTheBlanks-B6xzqYXx.js.map +1 -0
  29. package/dist/FillInTheBlanks-BpKhdHg2.cjs +479 -0
  30. package/dist/FillInTheBlanks-BpKhdHg2.cjs.map +1 -0
  31. package/dist/GapSelect-DUSiaEQH.js +441 -0
  32. package/dist/GapSelect-DUSiaEQH.js.map +1 -0
  33. package/dist/GapSelect-payTq_Zn.cjs +446 -0
  34. package/dist/GapSelect-payTq_Zn.cjs.map +1 -0
  35. package/dist/InteractiveVideo-BguGv-HA.cjs +2955 -0
  36. package/dist/InteractiveVideo-BguGv-HA.cjs.map +1 -0
  37. package/dist/InteractiveVideo-Cg2jbU3j.js +2944 -0
  38. package/dist/InteractiveVideo-Cg2jbU3j.js.map +1 -0
  39. package/dist/LkAiProvider-DAPpA3PQ.d.cts +84 -0
  40. package/dist/LkAiProvider-DAPpA3PQ.d.cts.map +1 -0
  41. package/dist/LkAiProvider-QdEcIhoo.d.ts +84 -0
  42. package/dist/LkAiProvider-QdEcIhoo.d.ts.map +1 -0
  43. package/dist/LkIntlProvider-D_FdYXjQ.js +375 -0
  44. package/dist/LkIntlProvider-D_FdYXjQ.js.map +1 -0
  45. package/dist/LkIntlProvider-oi57lYB0.cjs +410 -0
  46. package/dist/LkIntlProvider-oi57lYB0.cjs.map +1 -0
  47. package/dist/MultipleChoice-COn5MtKY.cjs +433 -0
  48. package/dist/MultipleChoice-COn5MtKY.cjs.map +1 -0
  49. package/dist/MultipleChoice-Dra0_KYD.js +428 -0
  50. package/dist/MultipleChoice-Dra0_KYD.js.map +1 -0
  51. package/dist/PronunciationFeedback-DlMPGjkR.cjs +831 -0
  52. package/dist/PronunciationFeedback-DlMPGjkR.cjs.map +1 -0
  53. package/dist/PronunciationFeedback-Dxd6XPkO.js +772 -0
  54. package/dist/PronunciationFeedback-Dxd6XPkO.js.map +1 -0
  55. package/dist/ReadAloud-C8RhaUqV.js +1092 -0
  56. package/dist/{chunk-DC4CQCK5.js.map → ReadAloud-C8RhaUqV.js.map} +1 -1
  57. package/dist/ReadAloud-akDehitT.cjs +1103 -0
  58. package/dist/ReadAloud-akDehitT.cjs.map +1 -0
  59. package/dist/StimulusPanel-BgzByfkb.js +74 -0
  60. package/dist/StimulusPanel-BgzByfkb.js.map +1 -0
  61. package/dist/StimulusPanel-b66gaN3i.cjs +79 -0
  62. package/dist/StimulusPanel-b66gaN3i.cjs.map +1 -0
  63. package/dist/ThemeProvider-B6DyGqzh.d.cts +62 -0
  64. package/dist/ThemeProvider-B6DyGqzh.d.cts.map +1 -0
  65. package/dist/ThemeProvider-BCrxBaY-.d.ts +62 -0
  66. package/dist/ThemeProvider-BCrxBaY-.d.ts.map +1 -0
  67. package/dist/ThemeProvider-BRN1tj4n.cjs +187 -0
  68. package/dist/ThemeProvider-BRN1tj4n.cjs.map +1 -0
  69. package/dist/ThemeProvider-C7K9iMLX.js +158 -0
  70. package/dist/ThemeProvider-C7K9iMLX.js.map +1 -0
  71. package/dist/WrittenResponse-Bj3eFmGl.cjs +491 -0
  72. package/dist/WrittenResponse-Bj3eFmGl.cjs.map +1 -0
  73. package/dist/WrittenResponse-Cl8G6nO_.js +486 -0
  74. package/dist/WrittenResponse-Cl8G6nO_.js.map +1 -0
  75. package/dist/ai/LkAiProvider.cjs +34 -14
  76. package/dist/ai/LkAiProvider.cjs.map +1 -1
  77. package/dist/ai/LkAiProvider.d.cts +2 -83
  78. package/dist/ai/LkAiProvider.d.ts +2 -83
  79. package/dist/ai/LkAiProvider.js +33 -2
  80. package/dist/ai/LkAiProvider.js.map +1 -1
  81. package/dist/ai/useAiHelp.cjs +7 -25
  82. package/dist/ai/useAiHelp.d.cts +175 -177
  83. package/dist/ai/useAiHelp.d.cts.map +1 -0
  84. package/dist/ai/useAiHelp.d.ts +175 -177
  85. package/dist/ai/useAiHelp.d.ts.map +1 -0
  86. package/dist/ai/useAiHelp.js +3 -4
  87. package/dist/components/ActivityPreview.cjs +3 -29
  88. package/dist/components/ActivityPreview.d.cts +2 -81
  89. package/dist/components/ActivityPreview.d.ts +2 -81
  90. package/dist/components/ActivityPreview.js +2 -20
  91. package/dist/components/ActivitySequence.cjs +3 -30
  92. package/dist/components/ActivitySequence.d.cts +2 -432
  93. package/dist/components/ActivitySequence.d.ts +2 -432
  94. package/dist/components/ActivitySequence.js +2 -21
  95. package/dist/components/Dictation.cjs +4 -21
  96. package/dist/components/Dictation.d.cts +2 -19
  97. package/dist/components/Dictation.d.ts +2 -19
  98. package/dist/components/Dictation.js +3 -12
  99. package/dist/components/FillInTheBlanks.cjs +4 -20
  100. package/dist/components/FillInTheBlanks.d.cts +2 -30
  101. package/dist/components/FillInTheBlanks.d.ts +2 -30
  102. package/dist/components/FillInTheBlanks.js +3 -11
  103. package/dist/components/GapSelect.cjs +4 -20
  104. package/dist/components/GapSelect.d.cts +2 -27
  105. package/dist/components/GapSelect.d.ts +2 -27
  106. package/dist/components/GapSelect.js +3 -11
  107. package/dist/components/InteractiveVideo.cjs +5 -32
  108. package/dist/components/InteractiveVideo.d.cts +3 -291
  109. package/dist/components/InteractiveVideo.d.ts +3 -291
  110. package/dist/components/InteractiveVideo.js +3 -19
  111. package/dist/components/MultipleChoice.cjs +4 -20
  112. package/dist/components/MultipleChoice.d.cts +2 -26
  113. package/dist/components/MultipleChoice.d.ts +2 -26
  114. package/dist/components/MultipleChoice.js +3 -11
  115. package/dist/components/PronunciationFeedback.cjs +4 -17
  116. package/dist/components/PronunciationFeedback.d.cts +2 -90
  117. package/dist/components/PronunciationFeedback.d.ts +2 -90
  118. package/dist/components/PronunciationFeedback.js +3 -8
  119. package/dist/components/ReadAloud.cjs +4 -22
  120. package/dist/components/ReadAloud.d.cts +7 -11
  121. package/dist/components/ReadAloud.d.cts.map +1 -0
  122. package/dist/components/ReadAloud.d.ts +7 -11
  123. package/dist/components/ReadAloud.d.ts.map +1 -0
  124. package/dist/components/ReadAloud.js +3 -13
  125. package/dist/components/StimulusPanel.cjs +3 -14
  126. package/dist/components/StimulusPanel.d.cts +2 -51
  127. package/dist/components/StimulusPanel.d.ts +2 -51
  128. package/dist/components/StimulusPanel.js +2 -5
  129. package/dist/components/WrittenResponse.cjs +4 -19
  130. package/dist/components/WrittenResponse.d.cts +3 -18
  131. package/dist/components/WrittenResponse.d.ts +3 -18
  132. package/dist/components/WrittenResponse.js +3 -10
  133. package/dist/direction-Dq0_HtA5.js +183 -0
  134. package/dist/direction-Dq0_HtA5.js.map +1 -0
  135. package/dist/direction-K1pj0HCA.cjs +200 -0
  136. package/dist/direction-K1pj0HCA.cjs.map +1 -0
  137. package/dist/hooks/useActivityState.cjs +28 -10
  138. package/dist/hooks/useActivityState.cjs.map +1 -1
  139. package/dist/hooks/useActivityState.d.cts +25 -24
  140. package/dist/hooks/useActivityState.d.cts.map +1 -0
  141. package/dist/hooks/useActivityState.d.ts +25 -24
  142. package/dist/hooks/useActivityState.d.ts.map +1 -0
  143. package/dist/hooks/useActivityState.js +28 -2
  144. package/dist/hooks/useActivityState.js.map +1 -1
  145. package/dist/hooks/useSpeechRecorder.cjs +5 -16
  146. package/dist/hooks/useSpeechRecorder.d.cts +2 -127
  147. package/dist/hooks/useSpeechRecorder.d.ts +2 -127
  148. package/dist/hooks/useSpeechRecorder.js +3 -3
  149. package/dist/hooks/useXAPI.cjs +126 -10
  150. package/dist/hooks/useXAPI.cjs.map +1 -1
  151. package/dist/hooks/useXAPI.d.cts +14 -14
  152. package/dist/hooks/useXAPI.d.cts.map +1 -0
  153. package/dist/hooks/useXAPI.d.ts +14 -14
  154. package/dist/hooks/useXAPI.d.ts.map +1 -0
  155. package/dist/hooks/useXAPI.js +126 -2
  156. package/dist/hooks/useXAPI.js.map +1 -1
  157. package/dist/i18n/LkIntlProvider.cjs +9 -32
  158. package/dist/i18n/LkIntlProvider.d.cts +34 -38
  159. package/dist/i18n/LkIntlProvider.d.cts.map +1 -0
  160. package/dist/i18n/LkIntlProvider.d.ts +34 -38
  161. package/dist/i18n/LkIntlProvider.d.ts.map +1 -0
  162. package/dist/i18n/LkIntlProvider.js +3 -3
  163. package/dist/index-6P4rJHrJ.d.cts +432 -0
  164. package/dist/index-6P4rJHrJ.d.cts.map +1 -0
  165. package/dist/index-90CX504k.d.ts +90 -0
  166. package/dist/index-90CX504k.d.ts.map +1 -0
  167. package/dist/index-B_SgnjsC.d.cts +291 -0
  168. package/dist/index-B_SgnjsC.d.cts.map +1 -0
  169. package/dist/index-BavVW5z5.d.cts +25 -0
  170. package/dist/index-BavVW5z5.d.cts.map +1 -0
  171. package/dist/index-BhHv6Fiu.d.cts +28 -0
  172. package/dist/index-BhHv6Fiu.d.cts.map +1 -0
  173. package/dist/index-Bsu8VciA.d.ts +432 -0
  174. package/dist/index-Bsu8VciA.d.ts.map +1 -0
  175. package/dist/index-C1KGpD1k.d.ts +49 -0
  176. package/dist/index-C1KGpD1k.d.ts.map +1 -0
  177. package/dist/index-CKTpYTCC.d.cts +49 -0
  178. package/dist/index-CKTpYTCC.d.cts.map +1 -0
  179. package/dist/index-CO_SRFJj.d.ts +16 -0
  180. package/dist/index-CO_SRFJj.d.ts.map +1 -0
  181. package/dist/index-CSsuUsP7.d.cts +124 -0
  182. package/dist/index-CSsuUsP7.d.cts.map +1 -0
  183. package/dist/index-CunUyeuN.d.cts +78 -0
  184. package/dist/index-CunUyeuN.d.cts.map +1 -0
  185. package/dist/index-CzfRzks6.d.cts +90 -0
  186. package/dist/index-CzfRzks6.d.cts.map +1 -0
  187. package/dist/index-D14xtpBS.d.cts +24 -0
  188. package/dist/index-D14xtpBS.d.cts.map +1 -0
  189. package/dist/index-DHRPAPZf.d.ts +291 -0
  190. package/dist/index-DHRPAPZf.d.ts.map +1 -0
  191. package/dist/index-DLV6cK26.d.cts +16 -0
  192. package/dist/index-DLV6cK26.d.cts.map +1 -0
  193. package/dist/index-DbCCQ9cP.d.ts +124 -0
  194. package/dist/index-DbCCQ9cP.d.ts.map +1 -0
  195. package/dist/index-DeV5B2m5.d.ts +24 -0
  196. package/dist/index-DeV5B2m5.d.ts.map +1 -0
  197. package/dist/index-TZCJVSge.d.ts +28 -0
  198. package/dist/index-TZCJVSge.d.ts.map +1 -0
  199. package/dist/index-ZVvLHsd3.d.ts +25 -0
  200. package/dist/index-ZVvLHsd3.d.ts.map +1 -0
  201. package/dist/index-eQwBgpSw.d.ts +78 -0
  202. package/dist/index-eQwBgpSw.d.ts.map +1 -0
  203. package/dist/index.cjs +118 -163
  204. package/dist/index.cjs.map +1 -1
  205. package/dist/index.d.cts +20 -24
  206. package/dist/index.d.ts +20 -24
  207. package/dist/index.js +84 -29
  208. package/dist/index.js.map +1 -1
  209. package/dist/theme/ThemeProvider.cjs +8 -28
  210. package/dist/theme/ThemeProvider.d.cts +2 -59
  211. package/dist/theme/ThemeProvider.d.ts +2 -59
  212. package/dist/theme/ThemeProvider.js +3 -3
  213. package/dist/tries-CbbtZkdG.cjs +363 -0
  214. package/dist/tries-CbbtZkdG.cjs.map +1 -0
  215. package/dist/tries-DTHSrLCm.js +310 -0
  216. package/dist/tries-DTHSrLCm.js.map +1 -0
  217. package/dist/types-BOQd93x3.d.cts +994 -0
  218. package/dist/types-BOQd93x3.d.cts.map +1 -0
  219. package/dist/types-HIrgF_mS.d.ts +994 -0
  220. package/dist/types-HIrgF_mS.d.ts.map +1 -0
  221. package/dist/useAiHelp-B-ccDL5Q.js +906 -0
  222. package/dist/useAiHelp-B-ccDL5Q.js.map +1 -0
  223. package/dist/useAiHelp-h9yOLFqt.cjs +995 -0
  224. package/dist/useAiHelp-h9yOLFqt.cjs.map +1 -0
  225. package/dist/useSpeechRecorder--O_f-xvt.cjs +720 -0
  226. package/dist/useSpeechRecorder--O_f-xvt.cjs.map +1 -0
  227. package/dist/useSpeechRecorder-DtAYvl02.d.cts +154 -0
  228. package/dist/useSpeechRecorder-DtAYvl02.d.cts.map +1 -0
  229. package/dist/useSpeechRecorder-DtAYvl02.d.ts +154 -0
  230. package/dist/useSpeechRecorder-DtAYvl02.d.ts.map +1 -0
  231. package/dist/useSpeechRecorder-zIi9Dlw8.js +709 -0
  232. package/dist/useSpeechRecorder-zIi9Dlw8.js.map +1 -0
  233. package/package.json +10 -11
  234. package/dist/WrittenResponse-B7A5gHMj.d.ts +0 -115
  235. package/dist/WrittenResponse-BpL9p2Hn.d.cts +0 -115
  236. package/dist/ai/useAiHelp.cjs.map +0 -1
  237. package/dist/ai/useAiHelp.js.map +0 -1
  238. package/dist/chunk-2PNSVBLQ.cjs +0 -54
  239. package/dist/chunk-2PNSVBLQ.cjs.map +0 -1
  240. package/dist/chunk-2TW6WLBC.js +0 -80
  241. package/dist/chunk-2TW6WLBC.js.map +0 -1
  242. package/dist/chunk-4ZZWZSWI.js +0 -61
  243. package/dist/chunk-4ZZWZSWI.js.map +0 -1
  244. package/dist/chunk-6N43WDVG.js +0 -29
  245. package/dist/chunk-6N43WDVG.js.map +0 -1
  246. package/dist/chunk-7ALBSPYR.cjs +0 -436
  247. package/dist/chunk-7ALBSPYR.cjs.map +0 -1
  248. package/dist/chunk-7NFY3M3W.js +0 -234
  249. package/dist/chunk-7NFY3M3W.js.map +0 -1
  250. package/dist/chunk-7SB2MJA4.js +0 -29
  251. package/dist/chunk-7SB2MJA4.js.map +0 -1
  252. package/dist/chunk-ABJJ3LII.js +0 -434
  253. package/dist/chunk-ABJJ3LII.js.map +0 -1
  254. package/dist/chunk-BIGGXHAW.cjs +0 -342
  255. package/dist/chunk-BIGGXHAW.cjs.map +0 -1
  256. package/dist/chunk-C7QZE5BI.js +0 -430
  257. package/dist/chunk-C7QZE5BI.js.map +0 -1
  258. package/dist/chunk-CWTUWNV3.cjs +0 -2937
  259. package/dist/chunk-CWTUWNV3.cjs.map +0 -1
  260. package/dist/chunk-DC4CQCK5.js +0 -915
  261. package/dist/chunk-DS6HN3YR.cjs +0 -496
  262. package/dist/chunk-DS6HN3YR.cjs.map +0 -1
  263. package/dist/chunk-FDQR4GAZ.js +0 -240
  264. package/dist/chunk-FDQR4GAZ.js.map +0 -1
  265. package/dist/chunk-FKGMSOJF.js +0 -394
  266. package/dist/chunk-FKGMSOJF.js.map +0 -1
  267. package/dist/chunk-G6PXJ2SA.js +0 -823
  268. package/dist/chunk-G6PXJ2SA.js.map +0 -1
  269. package/dist/chunk-HNLRVRQR.js +0 -335
  270. package/dist/chunk-HNLRVRQR.js.map +0 -1
  271. package/dist/chunk-J3C72RPK.cjs +0 -31
  272. package/dist/chunk-J3C72RPK.cjs.map +0 -1
  273. package/dist/chunk-K63VPFOV.cjs +0 -134
  274. package/dist/chunk-K63VPFOV.cjs.map +0 -1
  275. package/dist/chunk-KFLIDTDU.cjs +0 -825
  276. package/dist/chunk-KFLIDTDU.cjs.map +0 -1
  277. package/dist/chunk-KHKH5LCT.cjs +0 -250
  278. package/dist/chunk-KHKH5LCT.cjs.map +0 -1
  279. package/dist/chunk-LBEKRN6Y.cjs +0 -664
  280. package/dist/chunk-LBEKRN6Y.cjs.map +0 -1
  281. package/dist/chunk-LPUWXIPR.cjs +0 -578
  282. package/dist/chunk-LPUWXIPR.cjs.map +0 -1
  283. package/dist/chunk-MCO52PV5.js +0 -520
  284. package/dist/chunk-MCO52PV5.js.map +0 -1
  285. package/dist/chunk-MKXEM2C5.cjs +0 -396
  286. package/dist/chunk-MKXEM2C5.cjs.map +0 -1
  287. package/dist/chunk-MXNC5UNO.js +0 -563
  288. package/dist/chunk-MXNC5UNO.js.map +0 -1
  289. package/dist/chunk-NAK55BYU.cjs +0 -859
  290. package/dist/chunk-NAK55BYU.cjs.map +0 -1
  291. package/dist/chunk-NDBMKGQ5.cjs +0 -599
  292. package/dist/chunk-NDBMKGQ5.cjs.map +0 -1
  293. package/dist/chunk-OD65OZIW.cjs +0 -159
  294. package/dist/chunk-OD65OZIW.cjs.map +0 -1
  295. package/dist/chunk-ORT3KLGI.js +0 -50
  296. package/dist/chunk-ORT3KLGI.js.map +0 -1
  297. package/dist/chunk-PNNUPUH4.cjs +0 -82
  298. package/dist/chunk-PNNUPUH4.cjs.map +0 -1
  299. package/dist/chunk-PWHECW6N.js +0 -2934
  300. package/dist/chunk-PWHECW6N.js.map +0 -1
  301. package/dist/chunk-RBS5A2DF.js +0 -857
  302. package/dist/chunk-RBS5A2DF.js.map +0 -1
  303. package/dist/chunk-RPWUDXG5.cjs +0 -63
  304. package/dist/chunk-RPWUDXG5.cjs.map +0 -1
  305. package/dist/chunk-TCDJY3H6.js +0 -494
  306. package/dist/chunk-TCDJY3H6.js.map +0 -1
  307. package/dist/chunk-TP5UMRAU.cjs +0 -918
  308. package/dist/chunk-TP5UMRAU.cjs.map +0 -1
  309. package/dist/chunk-TS7J6DTY.js +0 -597
  310. package/dist/chunk-TS7J6DTY.js.map +0 -1
  311. package/dist/chunk-TUVENMXB.cjs +0 -20
  312. package/dist/chunk-TUVENMXB.cjs.map +0 -1
  313. package/dist/chunk-UDCQTOVU.cjs +0 -523
  314. package/dist/chunk-UDCQTOVU.cjs.map +0 -1
  315. package/dist/chunk-UHKZXOXD.js +0 -128
  316. package/dist/chunk-UHKZXOXD.js.map +0 -1
  317. package/dist/chunk-V6BA44DS.cjs +0 -236
  318. package/dist/chunk-V6BA44DS.cjs.map +0 -1
  319. package/dist/chunk-XO5R73Y4.js +0 -653
  320. package/dist/chunk-XO5R73Y4.js.map +0 -1
  321. package/dist/chunk-XOR4MPEN.cjs +0 -31
  322. package/dist/chunk-XOR4MPEN.cjs.map +0 -1
  323. package/dist/chunk-YORQQXGO.js +0 -155
  324. package/dist/chunk-YORQQXGO.js.map +0 -1
  325. package/dist/chunk-YY4PFR3Z.cjs +0 -432
  326. package/dist/chunk-YY4PFR3Z.cjs.map +0 -1
  327. package/dist/chunk-ZPI6Q42R.js +0 -17
  328. package/dist/chunk-ZPI6Q42R.js.map +0 -1
  329. package/dist/components/ActivityPreview.cjs.map +0 -1
  330. package/dist/components/ActivityPreview.js.map +0 -1
  331. package/dist/components/ActivitySequence.cjs.map +0 -1
  332. package/dist/components/ActivitySequence.js.map +0 -1
  333. package/dist/components/Dictation.cjs.map +0 -1
  334. package/dist/components/Dictation.js.map +0 -1
  335. package/dist/components/FillInTheBlanks.cjs.map +0 -1
  336. package/dist/components/FillInTheBlanks.js.map +0 -1
  337. package/dist/components/GapSelect.cjs.map +0 -1
  338. package/dist/components/GapSelect.js.map +0 -1
  339. package/dist/components/InteractiveVideo.cjs.map +0 -1
  340. package/dist/components/InteractiveVideo.js.map +0 -1
  341. package/dist/components/MultipleChoice.cjs.map +0 -1
  342. package/dist/components/MultipleChoice.js.map +0 -1
  343. package/dist/components/PronunciationFeedback.cjs.map +0 -1
  344. package/dist/components/PronunciationFeedback.js.map +0 -1
  345. package/dist/components/ReadAloud.cjs.map +0 -1
  346. package/dist/components/ReadAloud.js.map +0 -1
  347. package/dist/components/StimulusPanel.cjs.map +0 -1
  348. package/dist/components/StimulusPanel.js.map +0 -1
  349. package/dist/components/WrittenResponse.cjs.map +0 -1
  350. package/dist/components/WrittenResponse.js.map +0 -1
  351. package/dist/hooks/useSpeechRecorder.cjs.map +0 -1
  352. package/dist/hooks/useSpeechRecorder.js.map +0 -1
  353. package/dist/i18n/LkIntlProvider.cjs.map +0 -1
  354. package/dist/i18n/LkIntlProvider.js.map +0 -1
  355. package/dist/machine-CuwKqWXC.d.cts +0 -26
  356. package/dist/machine-CuwKqWXC.d.ts +0 -26
  357. package/dist/theme/ThemeProvider.cjs.map +0 -1
  358. package/dist/theme/ThemeProvider.js.map +0 -1
  359. package/dist/types-C4IsUQsK.d.ts +0 -989
  360. package/dist/types-CJgZWtl4.d.cts +0 -989
@@ -0,0 +1,446 @@
1
+ 'use client';
2
+ const require_ai_LkAiProvider = require("./ai/LkAiProvider.cjs");
3
+ const require_useAiHelp = require("./useAiHelp-h9yOLFqt.cjs");
4
+ const require_LkIntlProvider = require("./LkIntlProvider-oi57lYB0.cjs");
5
+ const require_ActivityErrorBoundary = require("./ActivityErrorBoundary-B379hvtL.cjs");
6
+ const require_hooks_useActivityState = require("./hooks/useActivityState.cjs");
7
+ const require_ActivityMedia = require("./ActivityMedia-CQQTRNl7.cjs");
8
+ const require_tries = require("./tries-CbbtZkdG.cjs");
9
+ const require_FeedbackRegion = require("./FeedbackRegion-BNNMtTY-.cjs");
10
+ let react = require("react");
11
+ let react_jsx_runtime = require("react/jsx-runtime");
12
+ let _intellectif_lk_core = require("@intellectif/lk-core");
13
+ //#region src/components/GapSelect/GapSelect.tsx
14
+ const PLACEHOLDER = /\{\{\s*([^{}]+?)\s*\}\}/g;
15
+ /** Splits a passage into literal text and its `{{id}}` gaps, in order. */
16
+ function parsePassage(passage) {
17
+ const segments = [];
18
+ const re = new RegExp(PLACEHOLDER);
19
+ let last = 0;
20
+ let ordinal = 0;
21
+ let match = re.exec(passage);
22
+ while (match !== null) {
23
+ if (match.index > last) segments.push({
24
+ kind: "text",
25
+ value: passage.slice(last, match.index)
26
+ });
27
+ ordinal += 1;
28
+ segments.push({
29
+ kind: "gap",
30
+ id: match[1],
31
+ ordinal
32
+ });
33
+ last = match.index + match[0].length;
34
+ match = re.exec(passage);
35
+ }
36
+ if (last < passage.length) segments.push({
37
+ kind: "text",
38
+ value: passage.slice(last)
39
+ });
40
+ return segments;
41
+ }
42
+ const NO_SELECTIONS = {};
43
+ /**
44
+ * The selections out of a `LearnerResponse`. A response of another activity
45
+ * type reads as "nothing selected" rather than throwing — a controlled host
46
+ * that has not yet swapped its state on an activity change would otherwise
47
+ * crash the attempt.
48
+ */
49
+ function selectionsOf(response) {
50
+ return response !== void 0 && response.type === "gap-select" ? response.selections : NO_SELECTIONS;
51
+ }
52
+ /** Per-gap correctness keyed by gap id, from each detail's `outcome`. */
53
+ function correctnessByItem(details) {
54
+ const map = /* @__PURE__ */ new Map();
55
+ for (const detail of details) map.set(detail.itemId, require_useAiHelp.detailIsRight(detail));
56
+ return map;
57
+ }
58
+ /**
59
+ * The choices a gap offers: its own list, or the bank it names.
60
+ *
61
+ * Both survive redaction — they are what the learner picks from — so this is
62
+ * the one resolution that works identically on full and redacted data.
63
+ */
64
+ function choicesFor(banks, gap) {
65
+ if (gap.choices !== void 0) return gap.choices;
66
+ return banks?.find((bank) => bank.id === gap.bankId)?.choices ?? [];
67
+ }
68
+ function GapSelect$1({ data, onComplete, onSubmit, onChange, onInteraction, value, defaultValue, defaultSubmitted, renderMode = "practice", outcome, mediaBudget, mediaStrings, strings, theme, locale, disabled, shuffleSeed, ai: aiProp, delivery, scoring }) {
69
+ const isExam = renderMode === "exam";
70
+ const isReview = renderMode === "review";
71
+ const s = require_LkIntlProvider.useLkStrings(strings);
72
+ const ai = require_ai_LkAiProvider.useLearnerAi(aiProp);
73
+ const policy = require_FeedbackRegion.useDeliveryPolicy(delivery);
74
+ const scoringPolicy = require_tries.useItemScoringPolicy(scoring);
75
+ const devError = (0, react.useMemo)(() => {
76
+ if (!require_useAiHelp.isDevelopment()) return null;
77
+ if (data.redacted === true) try {
78
+ (0, _intellectif_lk_core.assertRedacted)(data);
79
+ return null;
80
+ } catch (error) {
81
+ return error instanceof Error ? error : new Error(String(error));
82
+ }
83
+ const result = (0, _intellectif_lk_core.validateActivity)("gap-select", data);
84
+ return result.success ? null : new _intellectif_lk_core.ActivitySchemaError("gap-select", result.errors);
85
+ }, [data]);
86
+ const { state, start, complete, getTimeSpent, reset } = require_hooks_useActivityState.useActivityState(defaultSubmitted === true ? "completed" : "idle");
87
+ const tries = require_tries.useTries({
88
+ policy: scoringPolicy,
89
+ graded: renderMode === "practice" && policy.feedback,
90
+ submitted: state === "completed",
91
+ disabled: disabled === true
92
+ });
93
+ const resetTries = tries.reset;
94
+ const isControlled = value !== void 0;
95
+ const [internalSelections, setInternalSelections] = (0, react.useState)(() => selectionsOf(defaultValue));
96
+ const [result, setResult] = (0, react.useState)(null);
97
+ const [summary, setSummary] = (0, react.useState)(null);
98
+ const [overall, setOverall] = (0, react.useState)(null);
99
+ const [feedbackHidden, setFeedbackHidden] = (0, react.useState)(false);
100
+ const seedHintsRef = (0, react.useRef)(require_tries.hintsOf(value ?? defaultValue));
101
+ const formRef = (0, react.useRef)(null);
102
+ const feedbackRef = (0, react.useRef)(null);
103
+ const focusAfterRef = (0, react.useRef)(null);
104
+ const selections = isControlled ? selectionsOf(value) : internalSelections;
105
+ const defaultValueRef = (0, react.useRef)(defaultValue);
106
+ (0, react.useEffect)(() => {
107
+ defaultValueRef.current = defaultValue;
108
+ }, [defaultValue]);
109
+ const defaultSubmittedRef = (0, react.useRef)(defaultSubmitted);
110
+ (0, react.useEffect)(() => {
111
+ defaultSubmittedRef.current = defaultSubmitted;
112
+ }, [defaultSubmitted]);
113
+ const lastDataRef = (0, react.useRef)(data);
114
+ (0, react.useEffect)(() => {
115
+ if (lastDataRef.current === data) return;
116
+ lastDataRef.current = data;
117
+ setInternalSelections(selectionsOf(defaultValueRef.current));
118
+ setResult(null);
119
+ setSummary(null);
120
+ setOverall(null);
121
+ setFeedbackHidden(false);
122
+ seedHintsRef.current = require_tries.hintsOf(defaultValueRef.current);
123
+ resetTries();
124
+ reset(defaultSubmittedRef.current === true ? "completed" : "idle");
125
+ }, [
126
+ data,
127
+ reset,
128
+ resetTries
129
+ ]);
130
+ const segments = (0, react.useMemo)(() => parsePassage(data.passage), [data.passage]);
131
+ const gapById = (0, react.useMemo)(() => new Map(data.gaps.map((gap) => [gap.id, gap])), [data.gaps]);
132
+ const sessionIdRef = (0, react.useRef)(null);
133
+ /**
134
+ * The choices each gap shows, in the order it shows them.
135
+ *
136
+ * Seeded PER GAP, not once for the activity: two gaps drawing on the same
137
+ * word bank must not be dealt the same order, or the bank's distractors line
138
+ * up column-wise and the second gap becomes easier than the first.
139
+ */
140
+ const choicesByGap = (0, react.useMemo)(() => {
141
+ const map = /* @__PURE__ */ new Map();
142
+ const seedSource = shuffleSeed ?? (sessionIdRef.current ??= require_useAiHelp.randomSessionId());
143
+ for (const gap of data.gaps) {
144
+ const choices = choicesFor(data.banks, gap);
145
+ map.set(gap.id, data.shuffleChoices === true ? (0, _intellectif_lk_core.seededShuffle)(choices, `${seedSource}:${data.id}:${gap.id}`, { version: 1 }) : choices);
146
+ }
147
+ return map;
148
+ }, [data, shuffleSeed]);
149
+ const aiHints = require_tries.useComponentAiHints({
150
+ ai,
151
+ data,
152
+ renderMode,
153
+ submitted: state === "completed",
154
+ disabled: disabled === true,
155
+ response: {
156
+ type: "gap-select",
157
+ selections
158
+ },
159
+ locale,
160
+ onInteraction,
161
+ strings: s,
162
+ delivery: policy
163
+ });
164
+ const hintsRevealed = renderMode === "practice" ? seedHintsRef.current + aiHints.used : 0;
165
+ const responseOf = (next) => ({
166
+ type: "gap-select",
167
+ selections: next,
168
+ ...hintsRevealed > 0 ? { hintsRevealed } : {}
169
+ });
170
+ const hintsSeenRef = (0, react.useRef)(aiHints.used);
171
+ (0, react.useEffect)(() => {
172
+ if (hintsSeenRef.current === aiHints.used) return;
173
+ hintsSeenRef.current = aiHints.used;
174
+ if (aiHints.used > 0) onChange?.(responseOf(selections));
175
+ }, [aiHints.used]);
176
+ (0, react.useEffect)(() => {
177
+ const target = focusAfterRef.current;
178
+ if (target === null) return;
179
+ focusAfterRef.current = null;
180
+ if (target === "answer") formRef.current?.querySelector("select:not(:disabled)")?.focus();
181
+ else feedbackRef.current?.focus();
182
+ });
183
+ if (devError) throw devError;
184
+ if (data.redacted === true && renderMode === "practice") throw new Error(`Gap Select "${data.id}" received redacted activity data in renderMode "practice", which grades locally and has no answer key to grade against. Render redacted data with renderMode="exam" (server grades) or "review" (pass \`outcome\`).`);
185
+ const submitted = state === "completed";
186
+ const inactive = disabled === true || submitted || isReview;
187
+ const marking = (isReview ? outcome?.status === "scored" : !isExam && submitted) && policy.feedback;
188
+ const fireInteraction = (type, payload) => {
189
+ onInteraction?.({
190
+ type,
191
+ activityId: data.id,
192
+ timestamp: Date.now(),
193
+ payload
194
+ });
195
+ };
196
+ const handleSelect = (gapId, choiceId) => {
197
+ if (inactive) return;
198
+ if (state === "idle") start();
199
+ const next = {
200
+ ...selections,
201
+ [gapId]: choiceId
202
+ };
203
+ if (!isControlled) setInternalSelections(next);
204
+ onChange?.(responseOf(next));
205
+ fireInteraction("gap-selected", {
206
+ gapId,
207
+ choiceId
208
+ });
209
+ };
210
+ const handleSubmit = (event) => {
211
+ event.preventDefault();
212
+ if (inactive) return;
213
+ const response = responseOf(selections);
214
+ onSubmit?.(response);
215
+ if (isExam) {
216
+ complete();
217
+ setSummary(s.answerSubmitted);
218
+ fireInteraction("submitted", { selections });
219
+ return;
220
+ }
221
+ const answer = (0, _intellectif_lk_core.score)("gap-select", data, response);
222
+ complete();
223
+ const timeSpent = getTimeSpent();
224
+ const counted = tries.record({
225
+ score: answer.score,
226
+ maxScore: answer.maxScore,
227
+ hintsRevealed
228
+ });
229
+ const mine = counted.tries[counted.tries.length - 1];
230
+ const costed = mine === void 0 ? answer.score : mine.scored;
231
+ const scoringResult = costed === answer.score ? answer : {
232
+ ...answer,
233
+ score: costed,
234
+ passed: (0, _intellectif_lk_core.computePassThreshold)(data, costed)
235
+ };
236
+ const passed = counted.score === scoringResult.score ? scoringResult.passed : (0, _intellectif_lk_core.computePassThreshold)(data, counted.score);
237
+ const xapiStatement = _intellectif_lk_core.xAPIBuilder.buildAnsweredStatement({
238
+ actor: require_useAiHelp.ANONYMOUS_ACTOR,
239
+ object: {
240
+ id: require_useAiHelp.objectIdFor(data.id),
241
+ name: { [data.locale ?? "en-US"]: data.title },
242
+ ...(0, _intellectif_lk_core.xapiDefinitionFor)(data)
243
+ },
244
+ scoringResult,
245
+ timeSpentMs: timeSpent,
246
+ response: JSON.stringify(selections)
247
+ });
248
+ setResult(answer);
249
+ onComplete?.(require_useAiHelp.stampTake({
250
+ score: counted.score,
251
+ maxScore: counted.maxScore,
252
+ passed,
253
+ timeSpent,
254
+ xapiStatement
255
+ }, require_useAiHelp.mintTake()));
256
+ setOverall(answer.feedback);
257
+ setSummary(`${s.answerSubmitted} ${s.scoreAnnouncement(Math.round(counted.score * 100), passed)}`);
258
+ fireInteraction("submitted", {
259
+ selections,
260
+ score: scoringResult.score
261
+ });
262
+ };
263
+ /** "Try again": the choices stay, to be changed; the marks go. */
264
+ const retry = () => {
265
+ reset("idle");
266
+ setSummary(null);
267
+ setOverall(null);
268
+ focusAfterRef.current = "answer";
269
+ };
270
+ /** "Keep this answer": no more tries. A gap select never writes in the right choice. */
271
+ const closeTries = () => {
272
+ tries.close();
273
+ focusAfterRef.current = "feedback";
274
+ };
275
+ const correctByGap = (0, react.useMemo)(() => {
276
+ if (isExam) return /* @__PURE__ */ new Map();
277
+ if (isReview) return outcome?.status === "scored" ? correctnessByItem(outcome.details) : /* @__PURE__ */ new Map();
278
+ return correctnessByItem(result?.details ?? []);
279
+ }, [
280
+ isExam,
281
+ isReview,
282
+ outcome,
283
+ result
284
+ ]);
285
+ const reviewSummary = (0, react.useMemo)(() => {
286
+ if (!isReview || outcome === void 0) return null;
287
+ if (outcome.status === "scored") return `${s.scoreAnnouncement(Math.round(outcome.score * 100), outcome.passed)}${outcome.feedback ? ` ${outcome.feedback}` : ""}`;
288
+ if (outcome.status === "deferred") return s.notGradedYet;
289
+ if (outcome.status === "graded") {
290
+ const percent = outcome.maxScore > 0 ? Math.round(outcome.score / outcome.maxScore * 100) : Math.round(outcome.score * 100);
291
+ return `${s.scoreAnnouncement(percent, outcome.passed)}${outcome.feedback ? ` ${outcome.feedback}` : ""}`;
292
+ }
293
+ return s.noGradeAvailable;
294
+ }, [
295
+ isReview,
296
+ outcome,
297
+ s
298
+ ]);
299
+ const anyFeedback = data.gaps.some((gap) => gap.feedback !== void 0);
300
+ const extra = !isReview && policy.feedback && submitted && tries.counted !== null ? require_tries.triesSummary(s, scoringPolicy, tries.counted, tries.open) : "";
301
+ const announced = summary === null ? null : `${summary}${extra ? ` ${extra}` : ""}${overall ? ` ${overall}` : ""}`;
302
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("form", {
303
+ ref: formRef,
304
+ className: "lk-gs",
305
+ "aria-label": data.title,
306
+ lang: locale,
307
+ "data-render-mode": renderMode,
308
+ style: theme,
309
+ onSubmit: handleSubmit,
310
+ children: [
311
+ data.media ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_ActivityMedia.ActivityMedia, {
312
+ media: data.media,
313
+ renderMode,
314
+ ...mediaBudget !== void 0 ? { mediaBudget } : {},
315
+ ...mediaStrings !== void 0 ? { mediaStrings } : {},
316
+ ...strings !== void 0 ? { strings } : {},
317
+ ...onInteraction !== void 0 ? { onInteraction } : {},
318
+ ...locale !== void 0 ? { locale } : {}
319
+ }) : null,
320
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("fieldset", {
321
+ disabled: inactive,
322
+ children: [
323
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
324
+ className: "lk-gs-passage",
325
+ children: segments.map((seg, i) => {
326
+ if (seg.kind === "text") return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: seg.value }, `t${i}`);
327
+ const gap = gapById.get(seg.id);
328
+ if (!gap) return null;
329
+ const choices = choicesByGap.get(seg.id) ?? [];
330
+ const correctness = correctByGap.get(seg.id);
331
+ const gapFeedback = isExam ? void 0 : gap.feedback;
332
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
333
+ className: "lk-gs-gap",
334
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
335
+ className: "lk-gs-select",
336
+ "aria-label": s.gapLabel(seg.ordinal),
337
+ value: selections[seg.id] ?? "",
338
+ disabled: inactive,
339
+ "aria-disabled": inactive || void 0,
340
+ "data-correct": marking && correctness !== void 0 ? String(correctness) : void 0,
341
+ onChange: (e) => handleSelect(seg.id, e.target.value),
342
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
343
+ value: "",
344
+ children: s.gapPlaceholder
345
+ }), choices.map((choice) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
346
+ value: choice.id,
347
+ children: choice.text
348
+ }, choice.id))]
349
+ }), marking && !feedbackHidden && gapFeedback ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
350
+ className: "lk-gs-gap-feedback",
351
+ role: "note",
352
+ "data-correct": correctness !== void 0 ? String(correctness) : void 0,
353
+ children: gapFeedback
354
+ }) : null]
355
+ }, seg.id);
356
+ })
357
+ }),
358
+ aiHints.offered && renderMode === "practice" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_tries.HintCost, {
359
+ policy: scoringPolicy,
360
+ strings: s
361
+ }) : null,
362
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_tries.AiHints, {
363
+ help: aiHints,
364
+ ai,
365
+ strings: s
366
+ }),
367
+ isReview ? null : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
368
+ type: "submit",
369
+ disabled: inactive,
370
+ children: isExam ? s.submitAnswers : s.checkAnswers
371
+ })
372
+ ]
373
+ }),
374
+ marking && anyFeedback ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
375
+ type: "button",
376
+ className: "lk-gs-feedback-toggle",
377
+ "aria-expanded": !feedbackHidden,
378
+ onClick: () => setFeedbackHidden((h) => !h),
379
+ children: feedbackHidden ? s.showFeedback : s.hideFeedback
380
+ }) : null,
381
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_FeedbackRegion.FeedbackRegion, {
382
+ id: `${data.id}-feedback`,
383
+ ...scoringPolicy.retries > 0 ? { ref: feedbackRef } : {},
384
+ children: require_FeedbackRegion.feedbackAnnouncement({
385
+ review: isReview,
386
+ feedback: policy.feedback,
387
+ outcome,
388
+ readBack: reviewSummary,
389
+ submitted: summary !== null,
390
+ result: announced,
391
+ received: s.answerSubmitted
392
+ })
393
+ }),
394
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_tries.TryActions, {
395
+ tries,
396
+ solutions: false,
397
+ strings: s,
398
+ onRetry: retry,
399
+ onClose: closeTries
400
+ }),
401
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_tries.AiExplanation, {
402
+ ai,
403
+ data,
404
+ renderMode,
405
+ submitted,
406
+ response: {
407
+ type: "gap-select",
408
+ selections
409
+ },
410
+ outcome,
411
+ locale,
412
+ onInteraction,
413
+ strings: s,
414
+ delivery: tries.open ? {
415
+ ...policy,
416
+ solutions: false
417
+ } : policy
418
+ })
419
+ ]
420
+ });
421
+ }
422
+ //#endregion
423
+ //#region src/components/GapSelect/index.tsx
424
+ /**
425
+ * Public Gap Select activity: the core wrapped in `ActivityErrorBoundary` so a
426
+ * render failure (including the dev schema-validation throw and the
427
+ * redacted-in-`practice` guard) degrades to an accessible fallback instead of
428
+ * crashing the host.
429
+ */
430
+ function GapSelect(props) {
431
+ const strings = require_LkIntlProvider.useLkStrings(props.strings);
432
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_ActivityErrorBoundary.ActivityErrorBoundary, {
433
+ activityTitle: props.data?.title,
434
+ strings,
435
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(GapSelect$1, { ...props })
436
+ });
437
+ }
438
+ //#endregion
439
+ Object.defineProperty(exports, "GapSelect", {
440
+ enumerable: true,
441
+ get: function() {
442
+ return GapSelect;
443
+ }
444
+ });
445
+
446
+ //# sourceMappingURL=GapSelect-payTq_Zn.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GapSelect-payTq_Zn.cjs","names":["detailIsRight","GapSelect","useLkStrings","useLearnerAi","useDeliveryPolicy","useItemScoringPolicy","useMemo","isDevelopment","validateActivity","ActivitySchemaError","useActivityState","useTries","useState","useRef","hintsOf","randomSessionId","seededShuffle","useComponentAiHints","score","computePassThreshold","xAPIBuilder","ANONYMOUS_ACTOR","objectIdFor","xapiDefinitionFor","stampTake","mintTake","triesSummary","ActivityMedia","HintCost","AiHints","FeedbackRegion","feedbackAnnouncement","TryActions","AiExplanation","useLkStrings","ActivityErrorBoundary","GapSelectCore"],"sources":["../src/components/GapSelect/GapSelect.tsx","../src/components/GapSelect/index.tsx"],"sourcesContent":["'use client';\n\nimport {\n ActivitySchemaError,\n assertRedacted,\n computePassThreshold,\n type GapSelectBank,\n type GapSelectChoice,\n type GapSelectData,\n type GapSelectGap,\n type GapSelectLearnerResponse,\n type LearnerResponse,\n type ScoringDetail,\n type ScoringResult,\n score,\n seededShuffle,\n validateActivity,\n xAPIBuilder,\n xapiDefinitionFor,\n} from '@intellectif/lk-core';\nimport { type CSSProperties, useEffect, useMemo, useRef, useState } from 'react';\nimport { useLearnerAi } from '../../ai/LkAiProvider.js';\nimport { useActivityState } from '../../hooks/useActivityState.js';\nimport { useLkStrings } from '../../i18n/LkIntlProvider.js';\nimport {\n ANONYMOUS_ACTOR,\n detailIsRight,\n isDevelopment,\n objectIdFor,\n randomSessionId,\n} from '../_internal.js';\nimport { ActivityMedia } from '../shared/ActivityMedia.js';\nimport { AiExplanation, AiHints, useComponentAiHints } from '../shared/AiHelp.js';\nimport { feedbackAnnouncement, useDeliveryPolicy } from '../shared/delivery.js';\nimport { FeedbackRegion } from '../shared/FeedbackRegion.js';\nimport { mintTake, stampTake } from '../shared/sequence-slot.js';\nimport {\n HintCost,\n hintsOf,\n TryActions,\n triesSummary,\n useItemScoringPolicy,\n useTries,\n} from '../shared/tries.js';\nimport type { ActivityProps } from '../types.js';\n\nexport interface GapSelectProps extends ActivityProps<GapSelectData> {\n /**\n * Seeds the per-gap choice shuffle when `data.shuffleChoices` is set. Pass\n * the attempt id, exactly as on `<MultipleChoice>`: an order nobody can\n * reproduce cannot be reconciled with the attempt a server recorded. Without\n * one, a random per-mount seed is used — stable within the mount, and\n * deliberately not reproducible.\n */\n shuffleSeed?: string;\n}\n\nconst PLACEHOLDER = /\\{\\{\\s*([^{}]+?)\\s*\\}\\}/g;\n\ntype Segment = { kind: 'text'; value: string } | { kind: 'gap'; id: string; ordinal: number };\n\n/** Splits a passage into literal text and its `{{id}}` gaps, in order. */\nfunction parsePassage(passage: string): Segment[] {\n const segments: Segment[] = [];\n const re = new RegExp(PLACEHOLDER);\n let last = 0;\n let ordinal = 0;\n let match = re.exec(passage);\n while (match !== null) {\n if (match.index > last) {\n segments.push({ kind: 'text', value: passage.slice(last, match.index) });\n }\n ordinal += 1;\n segments.push({ kind: 'gap', id: match[1] as string, ordinal });\n last = match.index + match[0].length;\n match = re.exec(passage);\n }\n if (last < passage.length) {\n segments.push({ kind: 'text', value: passage.slice(last) });\n }\n return segments;\n}\n\nconst NO_SELECTIONS: Record<string, string> = {};\n\n/**\n * The selections out of a `LearnerResponse`. A response of another activity\n * type reads as \"nothing selected\" rather than throwing — a controlled host\n * that has not yet swapped its state on an activity change would otherwise\n * crash the attempt.\n */\nfunction selectionsOf(response: LearnerResponse | undefined): Record<string, string> {\n return response !== undefined && response.type === 'gap-select'\n ? response.selections\n : NO_SELECTIONS;\n}\n\n/** Per-gap correctness keyed by gap id, from each detail's `outcome`. */\nfunction correctnessByItem(details: readonly ScoringDetail[]): Map<string, boolean> {\n const map = new Map<string, boolean>();\n for (const detail of details) {\n map.set(detail.itemId, detailIsRight(detail));\n }\n return map;\n}\n\n/**\n * The choices a gap offers: its own list, or the bank it names.\n *\n * Both survive redaction — they are what the learner picks from — so this is\n * the one resolution that works identically on full and redacted data.\n */\nfunction choicesFor(\n banks: readonly GapSelectBank[] | undefined,\n gap: GapSelectGap,\n): readonly GapSelectChoice[] {\n if (gap.choices !== undefined) {\n return gap.choices;\n }\n return banks?.find((bank) => bank.id === gap.bankId)?.choices ?? [];\n}\n\nexport function GapSelect({\n data,\n onComplete,\n onSubmit,\n onChange,\n onInteraction,\n value,\n defaultValue,\n defaultSubmitted,\n renderMode = 'practice',\n outcome,\n mediaBudget,\n mediaStrings,\n strings,\n theme,\n locale,\n disabled,\n shuffleSeed,\n ai: aiProp,\n delivery,\n scoring,\n}: GapSelectProps) {\n const isExam = renderMode === 'exam';\n const isReview = renderMode === 'review';\n const s = useLkStrings(strings);\n const ai = useLearnerAi(aiProp);\n const policy = useDeliveryPolicy(delivery);\n const scoringPolicy = useItemScoringPolicy(scoring);\n\n const devError = useMemo(() => {\n if (!isDevelopment()) {\n return null;\n }\n if (data.redacted === true) {\n try {\n assertRedacted(data);\n return null;\n } catch (error) {\n return error instanceof Error ? error : new Error(String(error));\n }\n }\n const result = validateActivity('gap-select', data);\n return result.success ? null : new ActivitySchemaError('gap-select', result.errors);\n }, [data]);\n\n const { state, start, complete, getTimeSpent, reset } = useActivityState(\n defaultSubmitted === true ? 'completed' : 'idle',\n );\n // Before anything that resets them: a new question starts with no tries.\n const tries = useTries({\n policy: scoringPolicy,\n graded: renderMode === 'practice' && policy.feedback,\n submitted: state === 'completed',\n disabled: disabled === true,\n });\n const resetTries = tries.reset;\n const isControlled = value !== undefined;\n const [internalSelections, setInternalSelections] = useState<Record<string, string>>(() =>\n selectionsOf(defaultValue),\n );\n const [result, setResult] = useState<ScoringResult | null>(null);\n const [summary, setSummary] = useState<string | null>(null);\n const [overall, setOverall] = useState<string | null>(null);\n const [feedbackHidden, setFeedbackHidden] = useState(false);\n // Hints the learner had been shown before this mount: a restored answer's\n // count stands, and the hints shown here add to it.\n const seedHintsRef = useRef(hintsOf(value ?? defaultValue));\n const formRef = useRef<HTMLFormElement>(null);\n const feedbackRef = useRef<HTMLDivElement>(null);\n const focusAfterRef = useRef<'answer' | 'feedback' | null>(null);\n\n const selections = isControlled ? selectionsOf(value) : internalSelections;\n\n const defaultValueRef = useRef(defaultValue);\n useEffect(() => {\n defaultValueRef.current = defaultValue;\n }, [defaultValue]);\n\n const defaultSubmittedRef = useRef(defaultSubmitted);\n useEffect(() => {\n defaultSubmittedRef.current = defaultSubmitted;\n }, [defaultSubmitted]);\n\n // Identity-guarded so the mount run is a no-op: without it this fires after\n // the first paint and undoes every seed it was just given.\n const lastDataRef = useRef(data);\n useEffect(() => {\n if (lastDataRef.current === data) {\n return;\n }\n lastDataRef.current = data;\n setInternalSelections(selectionsOf(defaultValueRef.current));\n setResult(null);\n setSummary(null);\n setOverall(null);\n setFeedbackHidden(false);\n seedHintsRef.current = hintsOf(defaultValueRef.current);\n resetTries();\n reset(defaultSubmittedRef.current === true ? 'completed' : 'idle');\n }, [data, reset, resetTries]);\n\n const segments = useMemo(() => parsePassage(data.passage), [data.passage]);\n const gapById = useMemo(() => new Map(data.gaps.map((gap) => [gap.id, gap])), [data.gaps]);\n\n const sessionIdRef = useRef<string | null>(null);\n /**\n * The choices each gap shows, in the order it shows them.\n *\n * Seeded PER GAP, not once for the activity: two gaps drawing on the same\n * word bank must not be dealt the same order, or the bank's distractors line\n * up column-wise and the second gap becomes easier than the first.\n */\n const choicesByGap = useMemo(() => {\n const map = new Map<string, readonly GapSelectChoice[]>();\n // biome-ignore lint/suspicious/noAssignInExpressions: sanctioned lazy ref initialization\n const seedSource = shuffleSeed ?? (sessionIdRef.current ??= randomSessionId());\n for (const gap of data.gaps) {\n const choices = choicesFor(data.banks, gap);\n map.set(\n gap.id,\n data.shuffleChoices === true\n ? seededShuffle(choices, `${seedSource}:${data.id}:${gap.id}`, { version: 1 })\n : choices,\n );\n }\n return map;\n }, [data, shuffleSeed]);\n\n // Hints are a hook, so they are read here, before the throws below.\n const answered = state === 'completed';\n const aiHints = useComponentAiHints({\n ai,\n data,\n renderMode,\n submitted: answered,\n disabled: disabled === true,\n response: { type: 'gap-select', selections },\n locale,\n onInteraction,\n strings: s,\n delivery: policy,\n });\n // Every hint the learner has been shown on this question, counted from its\n // start: what a scoring policy charges for. Hints exist only in practice.\n const hintsRevealed = renderMode === 'practice' ? seedHintsRef.current + aiHints.used : 0;\n const responseOf = (next: Record<string, string>): GapSelectLearnerResponse => ({\n type: 'gap-select',\n selections: next,\n ...(hintsRevealed > 0 ? { hintsRevealed } : {}),\n });\n // A hint shown is part of the answer's record: say so as it happens.\n const hintsSeenRef = useRef(aiHints.used);\n // biome-ignore lint/correctness/useExhaustiveDependencies: a new hint is the trigger, and the response it reports is this render's\n useEffect(() => {\n if (hintsSeenRef.current === aiHints.used) {\n return;\n }\n hintsSeenRef.current = aiHints.used;\n if (aiHints.used > 0) {\n onChange?.(responseOf(selections));\n }\n }, [aiHints.used]);\n useEffect(() => {\n const target = focusAfterRef.current;\n if (target === null) {\n return;\n }\n focusAfterRef.current = null;\n if (target === 'answer') {\n formRef.current?.querySelector<HTMLElement>('select:not(:disabled)')?.focus();\n } else {\n feedbackRef.current?.focus();\n }\n });\n\n // All hooks are called before these throws, so hook order stays stable.\n if (devError) {\n throw devError;\n }\n // Practice grades locally, and a redacted projection has no answer key to\n // grade against — `score()` would throw RedactedScoringError from the submit\n // handler, where no error boundary can reach it and after the learner has\n // answered. Fail at render instead, in production too, exactly as every other\n // built-in does.\n if (data.redacted === true && renderMode === 'practice') {\n throw new Error(\n `Gap Select \"${data.id}\" received redacted activity data in renderMode \"practice\", ` +\n 'which grades locally and has no answer key to grade against. ' +\n 'Render redacted data with renderMode=\"exam\" (server grades) or \"review\" (pass `outcome`).',\n );\n }\n\n const submitted = state === 'completed';\n const inactive = disabled === true || submitted || isReview;\n\n /**\n * Whether answer-key-derived information may be shown. Never in `exam`; in\n * `practice` only once this component has scored; in `review` only once the\n * caller supplies a SCORED outcome.\n */\n const revealing = isReview ? outcome?.status === 'scored' : !isExam && submitted;\n // What the delivery policy lets that reveal show: right and wrong, and the\n // author's feedback. A gap select never writes in the right choice, so\n // `solutions` has nothing here to hide.\n const marking = revealing && policy.feedback;\n\n const fireInteraction = (\n type: 'gap-selected' | 'submitted',\n payload: Record<string, unknown>,\n ): void => {\n onInteraction?.({ type, activityId: data.id, timestamp: Date.now(), payload });\n };\n\n const handleSelect = (gapId: string, choiceId: string): void => {\n if (inactive) {\n return;\n }\n if (state === 'idle') {\n start();\n }\n const next = { ...selections, [gapId]: choiceId };\n if (!isControlled) {\n setInternalSelections(next);\n }\n onChange?.(responseOf(next));\n fireInteraction('gap-selected', { gapId, choiceId });\n };\n\n const handleSubmit = (event: React.FormEvent): void => {\n event.preventDefault();\n if (inactive) {\n return;\n }\n const response = responseOf(selections);\n onSubmit?.(response);\n\n if (isExam) {\n // The client neither grades nor reveals: no score(), no read of any\n // answer-key field, no onComplete, and no xAPI statement — its\n // correctResponsesPattern IS the answer key.\n complete();\n setSummary(s.answerSubmitted);\n fireInteraction('submitted', { selections });\n return;\n }\n\n const answer = score('gap-select', data as GapSelectData, response);\n complete();\n const timeSpent = getTimeSpent();\n // The question's score under the policy — see MultipleChoice.\n const counted = tries.record({\n score: answer.score,\n maxScore: answer.maxScore,\n hintsRevealed,\n });\n const mine = counted.tries[counted.tries.length - 1];\n const costed = mine === undefined ? answer.score : mine.scored;\n const scoringResult =\n costed === answer.score\n ? answer\n : { ...answer, score: costed, passed: computePassThreshold(data as GapSelectData, costed) };\n const passed =\n counted.score === scoringResult.score\n ? scoringResult.passed\n : computePassThreshold(data as GapSelectData, counted.score);\n const xapiStatement = xAPIBuilder.buildAnsweredStatement({\n actor: ANONYMOUS_ACTOR,\n object: {\n id: objectIdFor(data.id),\n name: { [data.locale ?? 'en-US']: data.title },\n ...xapiDefinitionFor(data),\n },\n scoringResult,\n timeSpentMs: timeSpent,\n response: JSON.stringify(selections),\n });\n setResult(answer);\n onComplete?.(\n stampTake(\n { score: counted.score, maxScore: counted.maxScore, passed, timeSpent, xapiStatement },\n mintTake(),\n ),\n );\n setOverall(answer.feedback);\n setSummary(\n `${s.answerSubmitted} ${s.scoreAnnouncement(Math.round(counted.score * 100), passed)}`,\n );\n fireInteraction('submitted', { selections, score: scoringResult.score });\n };\n\n /** \"Try again\": the choices stay, to be changed; the marks go. */\n const retry = (): void => {\n reset('idle');\n setSummary(null);\n setOverall(null);\n focusAfterRef.current = 'answer';\n };\n\n /** \"Keep this answer\": no more tries. A gap select never writes in the right choice. */\n const closeTries = (): void => {\n tries.close();\n focusAfterRef.current = 'feedback';\n };\n\n const correctByGap = useMemo(() => {\n if (isExam) {\n return new Map<string, boolean>();\n }\n if (isReview) {\n return outcome?.status === 'scored'\n ? correctnessByItem(outcome.details)\n : new Map<string, boolean>();\n }\n return correctnessByItem(result?.details ?? []);\n }, [isExam, isReview, outcome, result]);\n\n const reviewSummary = useMemo(() => {\n if (!isReview || outcome === undefined) {\n return null;\n }\n if (outcome.status === 'scored') {\n return `${s.scoreAnnouncement(Math.round(outcome.score * 100), outcome.passed)}${\n outcome.feedback ? ` ${outcome.feedback}` : ''\n }`;\n }\n if (outcome.status === 'deferred') {\n return s.notGradedYet;\n }\n if (outcome.status === 'graded') {\n const percent =\n outcome.maxScore > 0\n ? Math.round((outcome.score / outcome.maxScore) * 100)\n : Math.round(outcome.score * 100);\n return `${s.scoreAnnouncement(percent, outcome.passed)}${\n outcome.feedback ? ` ${outcome.feedback}` : ''\n }`;\n }\n return s.noGradeAvailable;\n }, [isReview, outcome, s]);\n\n const anyFeedback = data.gaps.some((gap) => gap.feedback !== undefined);\n const extra =\n !isReview && policy.feedback && submitted && tries.counted !== null\n ? triesSummary(s, scoringPolicy, tries.counted, tries.open)\n : '';\n const announced =\n summary === null\n ? null\n : `${summary}${extra ? ` ${extra}` : ''}${overall ? ` ${overall}` : ''}`;\n\n return (\n <form\n ref={formRef}\n className=\"lk-gs\"\n aria-label={data.title}\n lang={locale}\n data-render-mode={renderMode}\n style={theme as CSSProperties | undefined}\n onSubmit={handleSubmit}\n >\n {data.media ? (\n <ActivityMedia\n media={data.media}\n renderMode={renderMode}\n {...(mediaBudget !== undefined ? { mediaBudget } : {})}\n {...(mediaStrings !== undefined ? { mediaStrings } : {})}\n {...(strings !== undefined ? { strings } : {})}\n {...(onInteraction !== undefined ? { onInteraction } : {})}\n {...(locale !== undefined ? { locale } : {})}\n />\n ) : null}\n <fieldset disabled={inactive}>\n <p className=\"lk-gs-passage\">\n {segments.map((seg, i) => {\n if (seg.kind === 'text') {\n // biome-ignore lint/suspicious/noArrayIndexKey: passage segments are positional and static\n return <span key={`t${i}`}>{seg.value}</span>;\n }\n const gap = gapById.get(seg.id);\n if (!gap) {\n return null;\n }\n const choices = choicesByGap.get(seg.id) ?? [];\n const correctness = correctByGap.get(seg.id);\n // Read defensively and never in exam: a redact() projection omits\n // both at runtime while the type still says they are there.\n const gapFeedback = isExam ? undefined : gap.feedback;\n return (\n <span key={seg.id} className=\"lk-gs-gap\">\n <select\n className=\"lk-gs-select\"\n aria-label={s.gapLabel(seg.ordinal)}\n value={selections[seg.id] ?? ''}\n disabled={inactive}\n aria-disabled={inactive || undefined}\n data-correct={\n marking && correctness !== undefined ? String(correctness) : undefined\n }\n onChange={(e) => handleSelect(seg.id, e.target.value)}\n >\n {/*\n The empty entry is part of the contract, not a decoration.\n It is how a learner leaves a gap alone — and how they take\n an answer back — so \"not answered\" stays distinguishable\n from \"answered wrongly\" all the way into ItemOutcome, where\n the scorer reports it as `incorrect-omission`.\n */}\n <option value=\"\">{s.gapPlaceholder}</option>\n {choices.map((choice) => (\n <option key={choice.id} value={choice.id}>\n {choice.text}\n </option>\n ))}\n </select>\n {marking && !feedbackHidden && gapFeedback ? (\n <span\n className=\"lk-gs-gap-feedback\"\n role=\"note\"\n data-correct={correctness !== undefined ? String(correctness) : undefined}\n >\n {gapFeedback}\n </span>\n ) : null}\n </span>\n );\n })}\n </p>\n {aiHints.offered && renderMode === 'practice' ? (\n <HintCost policy={scoringPolicy} strings={s} />\n ) : null}\n <AiHints help={aiHints} ai={ai} strings={s} />\n {isReview ? null : (\n <button type=\"submit\" disabled={inactive}>\n {isExam ? s.submitAnswers : s.checkAnswers}\n </button>\n )}\n </fieldset>\n {marking && anyFeedback ? (\n <button\n type=\"button\"\n className=\"lk-gs-feedback-toggle\"\n aria-expanded={!feedbackHidden}\n onClick={() => setFeedbackHidden((h) => !h)}\n >\n {feedbackHidden ? s.showFeedback : s.hideFeedback}\n </button>\n ) : null}\n <FeedbackRegion\n id={`${data.id}-feedback`}\n {...(scoringPolicy.retries > 0 ? { ref: feedbackRef } : {})}\n >\n {feedbackAnnouncement({\n review: isReview,\n feedback: policy.feedback,\n outcome,\n readBack: reviewSummary,\n submitted: summary !== null,\n result: announced,\n received: s.answerSubmitted,\n })}\n </FeedbackRegion>\n <TryActions\n tries={tries}\n solutions={false}\n strings={s}\n onRetry={retry}\n onClose={closeTries}\n />\n <AiExplanation\n ai={ai}\n data={data}\n renderMode={renderMode}\n submitted={submitted}\n response={{ type: 'gap-select', selections }}\n outcome={outcome}\n locale={locale}\n onInteraction={onInteraction}\n strings={s}\n // An explanation all but always names the answer: not while another\n // try is on offer.\n delivery={tries.open ? { ...policy, solutions: false } : policy}\n />\n </form>\n );\n}\n","'use client';\n\nimport { useLkStrings } from '../../i18n/LkIntlProvider.js';\nimport { ActivityErrorBoundary } from '../ActivityErrorBoundary.js';\nimport { GapSelect as GapSelectCore, type GapSelectProps } from './GapSelect.js';\n\nexport type { GapSelectProps } from './GapSelect.js';\n\n/**\n * Public Gap Select activity: the core wrapped in `ActivityErrorBoundary` so a\n * render failure (including the dev schema-validation throw and the\n * redacted-in-`practice` guard) degrades to an accessible fallback instead of\n * crashing the host.\n */\nexport function GapSelect(props: GapSelectProps): React.JSX.Element {\n const strings = useLkStrings(props.strings);\n return (\n <ActivityErrorBoundary activityTitle={props.data?.title} strings={strings}>\n <GapSelectCore {...props} />\n </ActivityErrorBoundary>\n );\n}\n"],"mappings":"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"}