@intellectif/lk-react 23.0.1 → 23.1.1

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 (369) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/README.md +13 -9
  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/ReadAloud-C8RhaUqV.js.map +1 -0
  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-BRN1tj4n.cjs +187 -0
  64. package/dist/ThemeProvider-BRN1tj4n.cjs.map +1 -0
  65. package/dist/ThemeProvider-C7K9iMLX.js +158 -0
  66. package/dist/ThemeProvider-C7K9iMLX.js.map +1 -0
  67. package/dist/ThemeProvider-CocC8ODJ.d.ts +62 -0
  68. package/dist/ThemeProvider-CocC8ODJ.d.ts.map +1 -0
  69. package/dist/ThemeProvider-DS4KOL86.d.cts +62 -0
  70. package/dist/ThemeProvider-DS4KOL86.d.cts.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 -73
  78. package/dist/ai/LkAiProvider.d.ts +2 -73
  79. package/dist/ai/LkAiProvider.js +33 -2
  80. package/dist/ai/LkAiProvider.js.map +1 -1
  81. package/dist/ai/useAiHelp.cjs +7 -23
  82. package/dist/ai/useAiHelp.d.cts +198 -121
  83. package/dist/ai/useAiHelp.d.cts.map +1 -0
  84. package/dist/ai/useAiHelp.d.ts +198 -121
  85. package/dist/ai/useAiHelp.d.ts.map +1 -0
  86. package/dist/ai/useAiHelp.js +3 -6
  87. package/dist/components/ActivityPreview.cjs +3 -31
  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 -22
  91. package/dist/components/ActivitySequence.cjs +3 -32
  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 -23
  95. package/dist/components/Dictation.cjs +4 -23
  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 -14
  99. package/dist/components/FillInTheBlanks.cjs +4 -22
  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 -13
  103. package/dist/components/GapSelect.cjs +4 -22
  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 -13
  107. package/dist/components/InteractiveVideo.cjs +5 -34
  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 -21
  111. package/dist/components/MultipleChoice.cjs +4 -22
  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 -13
  115. package/dist/components/PronunciationFeedback.cjs +4 -16
  116. package/dist/components/PronunciationFeedback.d.cts +2 -69
  117. package/dist/components/PronunciationFeedback.d.ts +2 -69
  118. package/dist/components/PronunciationFeedback.js +3 -7
  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 -21
  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 -12
  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-2iDJohip.d.cts +90 -0
  164. package/dist/index-2iDJohip.d.cts.map +1 -0
  165. package/dist/index-BAqT5tXN.d.ts +90 -0
  166. package/dist/index-BAqT5tXN.d.ts.map +1 -0
  167. package/dist/index-BRbEfXgE.d.ts +78 -0
  168. package/dist/index-BRbEfXgE.d.ts.map +1 -0
  169. package/dist/index-BW7aA5eN.d.cts +25 -0
  170. package/dist/index-BW7aA5eN.d.cts.map +1 -0
  171. package/dist/index-BeiVd-qe.d.ts +124 -0
  172. package/dist/index-BeiVd-qe.d.ts.map +1 -0
  173. package/dist/index-C1KGpD1k.d.ts +49 -0
  174. package/dist/index-C1KGpD1k.d.ts.map +1 -0
  175. package/dist/index-C7cCHEze.d.cts +24 -0
  176. package/dist/index-C7cCHEze.d.cts.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-CN3_TwDL.d.ts +28 -0
  180. package/dist/index-CN3_TwDL.d.ts.map +1 -0
  181. package/dist/index-CNoAqj5I.d.ts +16 -0
  182. package/dist/index-CNoAqj5I.d.ts.map +1 -0
  183. package/dist/index-CTlht6OV.d.cts +432 -0
  184. package/dist/index-CTlht6OV.d.cts.map +1 -0
  185. package/dist/index-CmgSzapt.d.cts +124 -0
  186. package/dist/index-CmgSzapt.d.cts.map +1 -0
  187. package/dist/index-D4WYDN_p.d.cts +28 -0
  188. package/dist/index-D4WYDN_p.d.cts.map +1 -0
  189. package/dist/index-DAJ6KK49.d.ts +25 -0
  190. package/dist/index-DAJ6KK49.d.ts.map +1 -0
  191. package/dist/index-DIiacP_z.d.cts +78 -0
  192. package/dist/index-DIiacP_z.d.cts.map +1 -0
  193. package/dist/index-DR0SOJig.d.ts +291 -0
  194. package/dist/index-DR0SOJig.d.ts.map +1 -0
  195. package/dist/index-DRMauOVH.d.ts +432 -0
  196. package/dist/index-DRMauOVH.d.ts.map +1 -0
  197. package/dist/index-bmmRfGad.d.cts +16 -0
  198. package/dist/index-bmmRfGad.d.cts.map +1 -0
  199. package/dist/index-n9PKZm7W.d.cts +291 -0
  200. package/dist/index-n9PKZm7W.d.cts.map +1 -0
  201. package/dist/index-zu9H7owf.d.ts +24 -0
  202. package/dist/index-zu9H7owf.d.ts.map +1 -0
  203. package/dist/index.cjs +118 -161
  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 -31
  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/theme/skin.css +46 -1
  214. package/dist/tries-CbbtZkdG.cjs +363 -0
  215. package/dist/{chunk-W6UMY7PF.cjs.map → tries-CbbtZkdG.cjs.map} +1 -1
  216. package/dist/tries-DTHSrLCm.js +310 -0
  217. package/dist/tries-DTHSrLCm.js.map +1 -0
  218. package/dist/types-BOQd93x3.d.cts +994 -0
  219. package/dist/types-BOQd93x3.d.cts.map +1 -0
  220. package/dist/types-HIrgF_mS.d.ts +994 -0
  221. package/dist/types-HIrgF_mS.d.ts.map +1 -0
  222. package/dist/useAiHelp-B-ccDL5Q.js +906 -0
  223. package/dist/useAiHelp-B-ccDL5Q.js.map +1 -0
  224. package/dist/useAiHelp-h9yOLFqt.cjs +995 -0
  225. package/dist/useAiHelp-h9yOLFqt.cjs.map +1 -0
  226. package/dist/useSpeechRecorder--O_f-xvt.cjs +720 -0
  227. package/dist/useSpeechRecorder--O_f-xvt.cjs.map +1 -0
  228. package/dist/useSpeechRecorder-DtAYvl02.d.cts +154 -0
  229. package/dist/useSpeechRecorder-DtAYvl02.d.cts.map +1 -0
  230. package/dist/useSpeechRecorder-DtAYvl02.d.ts +154 -0
  231. package/dist/useSpeechRecorder-DtAYvl02.d.ts.map +1 -0
  232. package/dist/useSpeechRecorder-zIi9Dlw8.js +709 -0
  233. package/dist/useSpeechRecorder-zIi9Dlw8.js.map +1 -0
  234. package/package.json +10 -11
  235. package/dist/WrittenResponse-CgRrjM4S.d.ts +0 -115
  236. package/dist/WrittenResponse-D2K1VW_V.d.cts +0 -115
  237. package/dist/ai/useAiHelp.cjs.map +0 -1
  238. package/dist/ai/useAiHelp.js.map +0 -1
  239. package/dist/chunk-2OP5YHRR.js +0 -543
  240. package/dist/chunk-2OP5YHRR.js.map +0 -1
  241. package/dist/chunk-2TW6WLBC.js +0 -80
  242. package/dist/chunk-2TW6WLBC.js.map +0 -1
  243. package/dist/chunk-4MXECBZT.js +0 -888
  244. package/dist/chunk-4MXECBZT.js.map +0 -1
  245. package/dist/chunk-54DX6SLS.cjs +0 -42
  246. package/dist/chunk-54DX6SLS.cjs.map +0 -1
  247. package/dist/chunk-6GQLCCGN.js +0 -858
  248. package/dist/chunk-6GQLCCGN.js.map +0 -1
  249. package/dist/chunk-6N43WDVG.js +0 -29
  250. package/dist/chunk-6N43WDVG.js.map +0 -1
  251. package/dist/chunk-6RIM5EQP.cjs +0 -393
  252. package/dist/chunk-6RIM5EQP.cjs.map +0 -1
  253. package/dist/chunk-7F2YQWMW.cjs +0 -553
  254. package/dist/chunk-7F2YQWMW.cjs.map +0 -1
  255. package/dist/chunk-B4JRBV56.cjs +0 -63
  256. package/dist/chunk-B4JRBV56.cjs.map +0 -1
  257. package/dist/chunk-B7JU52YQ.cjs +0 -437
  258. package/dist/chunk-B7JU52YQ.cjs.map +0 -1
  259. package/dist/chunk-C4PSJ3ZC.js +0 -329
  260. package/dist/chunk-C4PSJ3ZC.js.map +0 -1
  261. package/dist/chunk-CXIP7ERK.js +0 -389
  262. package/dist/chunk-CXIP7ERK.js.map +0 -1
  263. package/dist/chunk-DPNCCWOV.js +0 -395
  264. package/dist/chunk-DPNCCWOV.js.map +0 -1
  265. package/dist/chunk-DXFCYNST.js +0 -35
  266. package/dist/chunk-DXFCYNST.js.map +0 -1
  267. package/dist/chunk-DZ7VLLDQ.cjs +0 -891
  268. package/dist/chunk-DZ7VLLDQ.cjs.map +0 -1
  269. package/dist/chunk-E4UF4XZM.js +0 -29
  270. package/dist/chunk-E4UF4XZM.js.map +0 -1
  271. package/dist/chunk-ERV666AR.js +0 -435
  272. package/dist/chunk-ERV666AR.js.map +0 -1
  273. package/dist/chunk-FISEZBLF.cjs +0 -31
  274. package/dist/chunk-FISEZBLF.cjs.map +0 -1
  275. package/dist/chunk-HYOUMTPW.js +0 -597
  276. package/dist/chunk-HYOUMTPW.js.map +0 -1
  277. package/dist/chunk-HZIT24BK.js +0 -61
  278. package/dist/chunk-HZIT24BK.js.map +0 -1
  279. package/dist/chunk-IYGF7PZY.cjs +0 -2938
  280. package/dist/chunk-IYGF7PZY.cjs.map +0 -1
  281. package/dist/chunk-J2QIHZ3H.cjs +0 -27
  282. package/dist/chunk-J2QIHZ3H.cjs.map +0 -1
  283. package/dist/chunk-JMEZYYCE.js +0 -2935
  284. package/dist/chunk-JMEZYYCE.js.map +0 -1
  285. package/dist/chunk-K63VPFOV.cjs +0 -134
  286. package/dist/chunk-K63VPFOV.cjs.map +0 -1
  287. package/dist/chunk-KI6DJ5ZF.js +0 -495
  288. package/dist/chunk-KI6DJ5ZF.js.map +0 -1
  289. package/dist/chunk-MCO52PV5.js +0 -520
  290. package/dist/chunk-MCO52PV5.js.map +0 -1
  291. package/dist/chunk-MXZHL4U5.cjs +0 -860
  292. package/dist/chunk-MXZHL4U5.cjs.map +0 -1
  293. package/dist/chunk-NFGUJ52G.cjs +0 -336
  294. package/dist/chunk-NFGUJ52G.cjs.map +0 -1
  295. package/dist/chunk-O7MINPKZ.js +0 -431
  296. package/dist/chunk-O7MINPKZ.js.map +0 -1
  297. package/dist/chunk-OD65OZIW.cjs +0 -159
  298. package/dist/chunk-OD65OZIW.cjs.map +0 -1
  299. package/dist/chunk-OJGTJOWI.cjs +0 -20
  300. package/dist/chunk-OJGTJOWI.cjs.map +0 -1
  301. package/dist/chunk-PGAPZ6UE.cjs +0 -497
  302. package/dist/chunk-PGAPZ6UE.cjs.map +0 -1
  303. package/dist/chunk-PNNUPUH4.cjs +0 -82
  304. package/dist/chunk-PNNUPUH4.cjs.map +0 -1
  305. package/dist/chunk-QAZO3ANW.cjs +0 -433
  306. package/dist/chunk-QAZO3ANW.cjs.map +0 -1
  307. package/dist/chunk-RX3A6KIY.js +0 -17
  308. package/dist/chunk-RX3A6KIY.js.map +0 -1
  309. package/dist/chunk-SHDSOOBF.cjs +0 -826
  310. package/dist/chunk-SHDSOOBF.cjs.map +0 -1
  311. package/dist/chunk-SPSKDNEE.js +0 -824
  312. package/dist/chunk-SPSKDNEE.js.map +0 -1
  313. package/dist/chunk-TGTP5DKF.js +0 -234
  314. package/dist/chunk-TGTP5DKF.js.map +0 -1
  315. package/dist/chunk-U4KTOH7C.js +0 -22
  316. package/dist/chunk-U4KTOH7C.js.map +0 -1
  317. package/dist/chunk-U5VFJVQ2.js +0 -241
  318. package/dist/chunk-U5VFJVQ2.js.map +0 -1
  319. package/dist/chunk-UDCQTOVU.cjs +0 -523
  320. package/dist/chunk-UDCQTOVU.cjs.map +0 -1
  321. package/dist/chunk-UHKZXOXD.js +0 -128
  322. package/dist/chunk-UHKZXOXD.js.map +0 -1
  323. package/dist/chunk-UKUHVCZX.cjs +0 -599
  324. package/dist/chunk-UKUHVCZX.cjs.map +0 -1
  325. package/dist/chunk-VPU6UY4O.cjs +0 -55
  326. package/dist/chunk-VPU6UY4O.cjs.map +0 -1
  327. package/dist/chunk-W6UMY7PF.cjs +0 -251
  328. package/dist/chunk-WZ2TBXVB.cjs +0 -236
  329. package/dist/chunk-WZ2TBXVB.cjs.map +0 -1
  330. package/dist/chunk-XOR4MPEN.cjs +0 -31
  331. package/dist/chunk-XOR4MPEN.cjs.map +0 -1
  332. package/dist/chunk-XS6OYYVR.cjs +0 -397
  333. package/dist/chunk-XS6OYYVR.cjs.map +0 -1
  334. package/dist/chunk-XYJBRKBZ.js +0 -51
  335. package/dist/chunk-XYJBRKBZ.js.map +0 -1
  336. package/dist/chunk-YORQQXGO.js +0 -155
  337. package/dist/chunk-YORQQXGO.js.map +0 -1
  338. package/dist/components/ActivityPreview.cjs.map +0 -1
  339. package/dist/components/ActivityPreview.js.map +0 -1
  340. package/dist/components/ActivitySequence.cjs.map +0 -1
  341. package/dist/components/ActivitySequence.js.map +0 -1
  342. package/dist/components/Dictation.cjs.map +0 -1
  343. package/dist/components/Dictation.js.map +0 -1
  344. package/dist/components/FillInTheBlanks.cjs.map +0 -1
  345. package/dist/components/FillInTheBlanks.js.map +0 -1
  346. package/dist/components/GapSelect.cjs.map +0 -1
  347. package/dist/components/GapSelect.js.map +0 -1
  348. package/dist/components/InteractiveVideo.cjs.map +0 -1
  349. package/dist/components/InteractiveVideo.js.map +0 -1
  350. package/dist/components/MultipleChoice.cjs.map +0 -1
  351. package/dist/components/MultipleChoice.js.map +0 -1
  352. package/dist/components/PronunciationFeedback.cjs.map +0 -1
  353. package/dist/components/PronunciationFeedback.js.map +0 -1
  354. package/dist/components/ReadAloud.cjs.map +0 -1
  355. package/dist/components/ReadAloud.js.map +0 -1
  356. package/dist/components/StimulusPanel.cjs.map +0 -1
  357. package/dist/components/StimulusPanel.js.map +0 -1
  358. package/dist/components/WrittenResponse.cjs.map +0 -1
  359. package/dist/components/WrittenResponse.js.map +0 -1
  360. package/dist/hooks/useSpeechRecorder.cjs.map +0 -1
  361. package/dist/hooks/useSpeechRecorder.js.map +0 -1
  362. package/dist/i18n/LkIntlProvider.cjs.map +0 -1
  363. package/dist/i18n/LkIntlProvider.js.map +0 -1
  364. package/dist/machine-CuwKqWXC.d.cts +0 -26
  365. package/dist/machine-CuwKqWXC.d.ts +0 -26
  366. package/dist/theme/ThemeProvider.cjs.map +0 -1
  367. package/dist/theme/ThemeProvider.js.map +0 -1
  368. package/dist/types-CO0XLEN6.d.cts +0 -973
  369. package/dist/types-CrtIcRcK.d.ts +0 -973
@@ -1,134 +0,0 @@
1
- 'use client';
2
- 'use strict';
3
-
4
- var react = require('react');
5
- var jsxRuntime = require('react/jsx-runtime');
6
-
7
- // src/theme/ThemeProvider.tsx
8
-
9
- // src/theme/dark-theme.ts
10
- var darkTheme = {
11
- "--lk-color-primary": "#fafafa",
12
- "--lk-color-primary-hover": "#e4e4e7",
13
- "--lk-color-surface": "#09090b",
14
- "--lk-color-surface-raised": "#18181b",
15
- "--lk-color-border": "#27272a",
16
- "--lk-color-text": "#fafafa",
17
- "--lk-color-text-muted": "#a1a1aa",
18
- "--lk-color-success": "#4ade80",
19
- "--lk-color-error": "#f87171",
20
- "--lk-color-warning": "#fbbf24",
21
- "--lk-color-focus-ring": "#fafafa"
22
- };
23
-
24
- // src/theme/tokens.ts
25
- var defaultTheme = {
26
- // ── Colours (light) — neutral monochrome; semantic success/error/warning
27
- // retained for status legibility ────────────────────────────────────────
28
- "--lk-color-primary": "#18181b",
29
- "--lk-color-primary-hover": "#27272a",
30
- "--lk-color-surface": "#ffffff",
31
- "--lk-color-surface-raised": "#fafafa",
32
- "--lk-color-border": "#e4e4e7",
33
- "--lk-color-text": "#18181b",
34
- "--lk-color-text-muted": "#52525b",
35
- "--lk-color-success": "#15803d",
36
- "--lk-color-error": "#b91c1c",
37
- "--lk-color-warning": "#b45309",
38
- "--lk-color-focus-ring": "#18181b",
39
- "--lk-color-media-accent": "#ffffff",
40
- // An interactive video's two caption lines. The second is warm yellow, the
41
- // convention for a second subtitle line, and clears 4.5:1 on the caption box
42
- // whatever the video shows through it (see contrast.test.ts).
43
- "--lk-iv-caption-color": "#ffffff",
44
- "--lk-iv-caption-secondary-color": "#ffe066",
45
- "--lk-iv-caption-secondary-scale": "0.85",
46
- "--lk-iv-caption-gap": "0.25em",
47
- // ── Spacing ──────────────────────────────────────────────────────────────
48
- "--lk-spacing-xs": "4px",
49
- "--lk-spacing-sm": "8px",
50
- "--lk-spacing-md": "16px",
51
- "--lk-spacing-lg": "24px",
52
- "--lk-spacing-xl": "32px",
53
- // ── Typography ───────────────────────────────────────────────────────────
54
- "--lk-font-family-base": 'system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif',
55
- "--lk-font-size-sm": "0.875rem",
56
- "--lk-font-size-base": "1rem",
57
- "--lk-font-size-lg": "1.125rem",
58
- "--lk-font-weight-normal": "400",
59
- "--lk-font-weight-bold": "700",
60
- "--lk-line-height-base": "1.5",
61
- // ── Shape ────────────────────────────────────────────────────────────────
62
- "--lk-radius-sm": "0.25rem",
63
- "--lk-radius-base": "0.5rem",
64
- "--lk-radius-lg": "0.75rem",
65
- // ── Motion ───────────────────────────────────────────────────────────────
66
- "--lk-transition-fast": "150ms ease",
67
- "--lk-transition-base": "250ms ease"
68
- };
69
-
70
- // src/theme/tailwind.ts
71
- var BUCKETS = [
72
- ["--lk-color-", "colors"],
73
- ["--lk-spacing-", "spacing"],
74
- ["--lk-radius-", "borderRadius"],
75
- ["--lk-font-family-", "fontFamily"],
76
- ["--lk-font-size-", "fontSize"]
77
- ];
78
- function createTailwindTheme(theme) {
79
- const merged = { ...defaultTheme, ...theme };
80
- const extension = {
81
- colors: {},
82
- spacing: {},
83
- borderRadius: {},
84
- fontFamily: {},
85
- fontSize: {}
86
- };
87
- for (const [tokenName, fallback] of Object.entries(merged)) {
88
- for (const [prefix, bucket] of BUCKETS) {
89
- if (tokenName.startsWith(prefix)) {
90
- extension[bucket][`lk-${tokenName.slice(prefix.length)}`] = `var(${tokenName}, ${fallback})`;
91
- break;
92
- }
93
- }
94
- }
95
- return extension;
96
- }
97
- var ThemeContext = react.createContext(defaultTheme);
98
- var DARK_QUERY = "(prefers-color-scheme: dark)";
99
- function subscribePrefersDark(onChange) {
100
- if (typeof window === "undefined" || typeof window.matchMedia !== "function") {
101
- return () => {
102
- };
103
- }
104
- const mql = window.matchMedia(DARK_QUERY);
105
- mql.addEventListener("change", onChange);
106
- return () => mql.removeEventListener("change", onChange);
107
- }
108
- function getPrefersDark() {
109
- if (typeof window === "undefined" || typeof window.matchMedia !== "function") {
110
- return false;
111
- }
112
- return window.matchMedia(DARK_QUERY).matches;
113
- }
114
- function ThemeProvider({ theme, children }) {
115
- const prefersDark = react.useSyncExternalStore(subscribePrefersDark, getPrefersDark, () => false);
116
- const activeTheme = react.useMemo(() => {
117
- if (theme !== void 0) {
118
- return { ...defaultTheme, ...theme };
119
- }
120
- return prefersDark ? { ...defaultTheme, ...darkTheme } : defaultTheme;
121
- }, [theme, prefersDark]);
122
- return /* @__PURE__ */ jsxRuntime.jsx(ThemeContext.Provider, { value: activeTheme, children: /* @__PURE__ */ jsxRuntime.jsx("div", { style: activeTheme, children }) });
123
- }
124
- function useTheme() {
125
- return react.useContext(ThemeContext);
126
- }
127
-
128
- exports.ThemeProvider = ThemeProvider;
129
- exports.createTailwindTheme = createTailwindTheme;
130
- exports.darkTheme = darkTheme;
131
- exports.defaultTheme = defaultTheme;
132
- exports.useTheme = useTheme;
133
- //# sourceMappingURL=chunk-K63VPFOV.cjs.map
134
- //# sourceMappingURL=chunk-K63VPFOV.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/theme/dark-theme.ts","../src/theme/tokens.ts","../src/theme/tailwind.ts","../src/theme/ThemeProvider.tsx"],"names":["createContext","useSyncExternalStore","useMemo","jsx","useContext"],"mappings":"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","file":"chunk-K63VPFOV.cjs","sourcesContent":["import type { ThemeTokens } from '@intellectif/lk-core';\n\n/**\n * Dark-mode colour overrides, merged over {@link defaultTheme} by\n * `ThemeProvider`. Colours only — spacing/typography/shape/motion are\n * theme-invariant. All pairs verified WCAG 2.2 AA against the dark surface.\n */\nexport const darkTheme: Partial<ThemeTokens> = {\n '--lk-color-primary': '#fafafa',\n '--lk-color-primary-hover': '#e4e4e7',\n '--lk-color-surface': '#09090b',\n '--lk-color-surface-raised': '#18181b',\n '--lk-color-border': '#27272a',\n '--lk-color-text': '#fafafa',\n '--lk-color-text-muted': '#a1a1aa',\n '--lk-color-success': '#4ade80',\n '--lk-color-error': '#f87171',\n '--lk-color-warning': '#fbbf24',\n '--lk-color-focus-ring': '#fafafa',\n};\n","import type { ThemeTokens } from '@intellectif/lk-core';\n\n/**\n * Canonical default theme token values. `defaults.css` mirrors these exactly.\n * Palette is a neutral monochrome, deliberately unbranded, so the SDK carries\n * nobody's look out of the box; consumers rebrand via `ThemeProvider`. All\n * colour pairs are verified to meet WCAG 2.2 AA: 4.5:1 for normal text, 3:1 for\n * UI / focus ring (see theme/__tests__/contrast.test.ts).\n */\nexport const defaultTheme: ThemeTokens = {\n // ── Colours (light) — neutral monochrome; semantic success/error/warning\n // retained for status legibility ────────────────────────────────────────\n '--lk-color-primary': '#18181b',\n '--lk-color-primary-hover': '#27272a',\n '--lk-color-surface': '#ffffff',\n '--lk-color-surface-raised': '#fafafa',\n '--lk-color-border': '#e4e4e7',\n '--lk-color-text': '#18181b',\n '--lk-color-text-muted': '#52525b',\n '--lk-color-success': '#15803d',\n '--lk-color-error': '#b91c1c',\n '--lk-color-warning': '#b45309',\n '--lk-color-focus-ring': '#18181b',\n '--lk-color-media-accent': '#ffffff',\n // An interactive video's two caption lines. The second is warm yellow, the\n // convention for a second subtitle line, and clears 4.5:1 on the caption box\n // whatever the video shows through it (see contrast.test.ts).\n '--lk-iv-caption-color': '#ffffff',\n '--lk-iv-caption-secondary-color': '#ffe066',\n '--lk-iv-caption-secondary-scale': '0.85',\n '--lk-iv-caption-gap': '0.25em',\n\n // ── Spacing ──────────────────────────────────────────────────────────────\n '--lk-spacing-xs': '4px',\n '--lk-spacing-sm': '8px',\n '--lk-spacing-md': '16px',\n '--lk-spacing-lg': '24px',\n '--lk-spacing-xl': '32px',\n\n // ── Typography ───────────────────────────────────────────────────────────\n '--lk-font-family-base':\n 'system-ui, -apple-system, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif',\n '--lk-font-size-sm': '0.875rem',\n '--lk-font-size-base': '1rem',\n '--lk-font-size-lg': '1.125rem',\n '--lk-font-weight-normal': '400',\n '--lk-font-weight-bold': '700',\n '--lk-line-height-base': '1.5',\n\n // ── Shape ────────────────────────────────────────────────────────────────\n '--lk-radius-sm': '0.25rem',\n '--lk-radius-base': '0.5rem',\n '--lk-radius-lg': '0.75rem',\n\n // ── Motion ───────────────────────────────────────────────────────────────\n '--lk-transition-fast': '150ms ease',\n '--lk-transition-base': '250ms ease',\n};\n","import type { ThemeTokens } from '@intellectif/lk-core';\nimport { defaultTheme } from './tokens.js';\n\n/**\n * Shape consumed by a Tailwind config's `theme.extend`. Every entry is a\n * `var(--lk-token, <fallback>)` reference: the var keeps utilities live\n * (ThemeProvider / dark-mode override at runtime); the fallback makes them\n * work with zero setup (no provider, no `defaults.css` import).\n */\nexport interface TailwindThemeExtension {\n colors: Record<string, string>;\n spacing: Record<string, string>;\n borderRadius: Record<string, string>;\n fontFamily: Record<string, string>;\n fontSize: Record<string, string>;\n}\n\n/**\n * Token-prefix → Tailwind bucket. `--lk-font-weight-*`, `--lk-line-height-*`\n * and `--lk-transition-*` are intentionally absent: the first two have no\n * matching `theme.extend` group here, and the transition tokens hold a\n * `<duration> <easing>` shorthand that would emit invalid\n * `transition-duration: 150ms ease` if mapped to Tailwind's `transitionDuration`.\n */\nconst BUCKETS = [\n ['--lk-color-', 'colors'],\n ['--lk-spacing-', 'spacing'],\n ['--lk-radius-', 'borderRadius'],\n ['--lk-font-family-', 'fontFamily'],\n ['--lk-font-size-', 'fontSize'],\n] as const;\n\n/**\n * Converts SDK theme tokens into a Tailwind `theme.extend` object so Tailwind\n * projects consume the same `--lk-*` tokens as the components — one shared\n * source of truth rather than a parallel, conflicting palette.\n */\nexport function createTailwindTheme(theme: Partial<ThemeTokens>): TailwindThemeExtension {\n const merged: Record<string, string> = { ...defaultTheme, ...theme };\n const extension: TailwindThemeExtension = {\n colors: {},\n spacing: {},\n borderRadius: {},\n fontFamily: {},\n fontSize: {},\n };\n\n for (const [tokenName, fallback] of Object.entries(merged)) {\n for (const [prefix, bucket] of BUCKETS) {\n if (tokenName.startsWith(prefix)) {\n extension[bucket][`lk-${tokenName.slice(prefix.length)}`] =\n `var(${tokenName}, ${fallback})`;\n break;\n }\n }\n }\n\n return extension;\n}\n","'use client';\n\nimport type { ThemeTokens } from '@intellectif/lk-core';\nimport {\n type CSSProperties,\n createContext,\n type ReactNode,\n useContext,\n useMemo,\n useSyncExternalStore,\n} from 'react';\nimport { darkTheme } from './dark-theme.js';\nimport { defaultTheme } from './tokens.js';\n\nexport { darkTheme } from './dark-theme.js';\nexport { createTailwindTheme, type TailwindThemeExtension } from './tailwind.js';\nexport { defaultTheme } from './tokens.js';\n\nconst ThemeContext = createContext<ThemeTokens>(defaultTheme);\n\nconst DARK_QUERY = '(prefers-color-scheme: dark)';\n\n/** Subscribe to OS dark-mode changes; no-op when there is no `window`. */\nfunction subscribePrefersDark(onChange: () => void): () => void {\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') {\n return () => {};\n }\n const mql = window.matchMedia(DARK_QUERY);\n mql.addEventListener('change', onChange);\n return () => mql.removeEventListener('change', onChange);\n}\n\n/** Current OS dark-mode preference; `false` when there is no `window`. */\nfunction getPrefersDark(): boolean {\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') {\n return false;\n }\n return window.matchMedia(DARK_QUERY).matches;\n}\n\nexport interface ThemeProviderProps {\n /** Partial token overrides. When provided, dark auto-detection is disabled. */\n theme?: Partial<ThemeTokens>;\n children: ReactNode;\n}\n\n/**\n * Provides theme tokens to descendant activity components as scoped inline CSS\n * custom properties on a wrapper `<div>`, and via {@link useTheme}.\n *\n * Resolution: an explicit `theme` prop merges over {@link defaultTheme} (and\n * suppresses dark auto-detect, per Req 13.5). With no `theme` prop, the OS\n * `prefers-color-scheme: dark` preference auto-applies {@link darkTheme}.\n * SSR-safe: the server snapshot is always light, so hydration never mismatches.\n */\nexport function ThemeProvider({ theme, children }: ThemeProviderProps) {\n const prefersDark = useSyncExternalStore(subscribePrefersDark, getPrefersDark, () => false);\n\n const activeTheme = useMemo<ThemeTokens>(() => {\n if (theme !== undefined) {\n return { ...defaultTheme, ...theme };\n }\n return prefersDark ? { ...defaultTheme, ...darkTheme } : defaultTheme;\n }, [theme, prefersDark]);\n\n return (\n <ThemeContext.Provider value={activeTheme}>\n <div style={activeTheme as CSSProperties}>{children}</div>\n </ThemeContext.Provider>\n );\n}\n\n/** Returns the currently active theme tokens (defaults when no provider). */\nexport function useTheme(): ThemeTokens {\n return useContext(ThemeContext);\n}\n"]}
@@ -1,495 +0,0 @@
1
- 'use client';
2
- import { useItemScoringPolicy, useTries, hintsOf, useComponentAiHints, triesSummary, HintCost, AiHints, TryActions, AiExplanation } from './chunk-U5VFJVQ2.js';
3
- import { useLearnerAi } from './chunk-RX3A6KIY.js';
4
- import { useDeliveryPolicy, FeedbackRegion, outcomeShowsMarks } from './chunk-XYJBRKBZ.js';
5
- import { stampTake, mintTake } from './chunk-U4KTOH7C.js';
6
- import { ActivityErrorBoundary } from './chunk-E4UF4XZM.js';
7
- import { isDevelopment, detailIsRight, ANONYMOUS_ACTOR, objectIdFor } from './chunk-DXFCYNST.js';
8
- import { ActivityMedia } from './chunk-HYOUMTPW.js';
9
- import { useActivityState } from './chunk-6N43WDVG.js';
10
- import { useLkStrings } from './chunk-C4PSJ3ZC.js';
11
- import { assertRedacted, validateActivity, ActivitySchemaError, score, computePassThreshold, xAPIBuilder, xapiDefinitionFor } from '@intellectif/lk-core';
12
- import { useMemo, useState, useRef, useEffect } from 'react';
13
- import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
14
-
15
- var PLACEHOLDER = /\{\{\s*([^{}]+?)\s*\}\}/g;
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) {
24
- segments.push({ kind: "text", value: passage.slice(last, match.index) });
25
- }
26
- ordinal += 1;
27
- segments.push({ kind: "blank", id: match[1], ordinal });
28
- last = match.index + match[0].length;
29
- match = re.exec(passage);
30
- }
31
- if (last < passage.length) {
32
- segments.push({ kind: "text", value: passage.slice(last) });
33
- }
34
- return segments;
35
- }
36
- var NO_ANSWERS = {};
37
- function answersOf(response) {
38
- return response !== void 0 && response.type === "fill-in-the-blanks" ? response.answers : NO_ANSWERS;
39
- }
40
- function correctnessByItem(details) {
41
- const map = /* @__PURE__ */ new Map();
42
- for (const detail of details) {
43
- map.set(detail.itemId, detailIsRight(detail));
44
- }
45
- return map;
46
- }
47
- function FillInTheBlanks({
48
- data,
49
- onComplete,
50
- onSubmit,
51
- onChange,
52
- onInteraction,
53
- value,
54
- defaultValue,
55
- defaultSubmitted,
56
- renderMode = "practice",
57
- outcome,
58
- sanitizeHtml,
59
- mediaBudget,
60
- mediaStrings,
61
- strings,
62
- theme,
63
- locale,
64
- disabled,
65
- showCorrectAnswers,
66
- ai: aiProp,
67
- delivery,
68
- scoring
69
- }) {
70
- const isExam = renderMode === "exam";
71
- const isReview = renderMode === "review";
72
- const s = useLkStrings(strings);
73
- const ai = useLearnerAi(aiProp);
74
- const policy = useDeliveryPolicy(delivery);
75
- const scoringPolicy = useItemScoringPolicy(scoring);
76
- const devError = useMemo(() => {
77
- if (!isDevelopment()) {
78
- return null;
79
- }
80
- if (data.redacted === true) {
81
- try {
82
- assertRedacted(data);
83
- return null;
84
- } catch (error) {
85
- return error instanceof Error ? error : new Error(String(error));
86
- }
87
- }
88
- const result2 = validateActivity("fill-in-the-blanks", data);
89
- return result2.success ? null : new ActivitySchemaError("fill-in-the-blanks", result2.errors);
90
- }, [data]);
91
- const { state, start, complete, getTimeSpent, reset } = useActivityState(
92
- defaultSubmitted === true ? "completed" : "idle"
93
- );
94
- const tries = useTries({
95
- policy: scoringPolicy,
96
- graded: renderMode === "practice" && policy.feedback,
97
- submitted: state === "completed",
98
- disabled: disabled === true
99
- });
100
- const resetTries = tries.reset;
101
- const isControlled = value !== void 0;
102
- const [internalAnswers, setInternalAnswers] = useState(
103
- () => answersOf(defaultValue)
104
- );
105
- const [revealed, setRevealed] = useState(() => /* @__PURE__ */ new Set());
106
- const [seen, setSeen] = useState(() => /* @__PURE__ */ new Set());
107
- const [result, setResult] = useState(null);
108
- const [summary, setSummary] = useState(null);
109
- const [overall, setOverall] = useState(null);
110
- const [feedbackHidden, setFeedbackHidden] = useState(false);
111
- const seedHintsRef = useRef(hintsOf(value ?? defaultValue));
112
- const formRef = useRef(null);
113
- const feedbackRef = useRef(null);
114
- const focusAfterRef = useRef(null);
115
- const answers = isControlled ? answersOf(value) : internalAnswers;
116
- const defaultValueRef = useRef(defaultValue);
117
- useEffect(() => {
118
- defaultValueRef.current = defaultValue;
119
- }, [defaultValue]);
120
- const defaultSubmittedRef = useRef(defaultSubmitted);
121
- useEffect(() => {
122
- defaultSubmittedRef.current = defaultSubmitted;
123
- }, [defaultSubmitted]);
124
- const lastDataRef = useRef(data);
125
- useEffect(() => {
126
- if (lastDataRef.current === data) {
127
- return;
128
- }
129
- lastDataRef.current = data;
130
- setInternalAnswers(answersOf(defaultValueRef.current));
131
- setRevealed(/* @__PURE__ */ new Set());
132
- setSeen(/* @__PURE__ */ new Set());
133
- setResult(null);
134
- setSummary(null);
135
- setOverall(null);
136
- setFeedbackHidden(false);
137
- seedHintsRef.current = hintsOf(defaultValueRef.current);
138
- resetTries();
139
- reset(defaultSubmittedRef.current === true ? "completed" : "idle");
140
- }, [data, reset, resetTries]);
141
- useEffect(() => {
142
- if (isDevelopment() && sanitizeHtml !== void 0 && data.passageHtml !== void 0) {
143
- console.warn(
144
- "[lk-react] FillInTheBlanks ignores `passageHtml`: the passage hosts the answer inputs, so rich HTML cannot be split at {{placeholders}} without voiding the sanitiser. Rendering the plain `passage` instead."
145
- );
146
- }
147
- }, [sanitizeHtml, data.passageHtml]);
148
- const segments = useMemo(() => parsePassage(data.passage), [data.passage]);
149
- const blankById = useMemo(() => new Map(data.blanks.map((b) => [b.id, b])), [data.blanks]);
150
- const answered = state === "completed";
151
- const aiHints = useComponentAiHints({
152
- ai,
153
- data,
154
- renderMode,
155
- submitted: answered,
156
- disabled: disabled === true,
157
- response: { type: "fill-in-the-blanks", answers },
158
- locale,
159
- onInteraction,
160
- strings: s,
161
- delivery: policy
162
- });
163
- const hintsRevealed = renderMode === "practice" ? seedHintsRef.current + seen.size + aiHints.used : 0;
164
- const responseOf = (next, hints = hintsRevealed) => ({
165
- type: "fill-in-the-blanks",
166
- answers: next,
167
- ...hints > 0 ? { hintsRevealed: hints } : {}
168
- });
169
- const aiSeenRef = useRef(aiHints.used);
170
- useEffect(() => {
171
- if (aiSeenRef.current === aiHints.used) {
172
- return;
173
- }
174
- aiSeenRef.current = aiHints.used;
175
- if (aiHints.used > 0) {
176
- onChange?.(responseOf(answers));
177
- }
178
- }, [aiHints.used]);
179
- useEffect(() => {
180
- const target = focusAfterRef.current;
181
- if (target === null) {
182
- return;
183
- }
184
- focusAfterRef.current = null;
185
- if (target === "answer") {
186
- formRef.current?.querySelector("input:not(:disabled)")?.focus();
187
- } else {
188
- feedbackRef.current?.focus();
189
- }
190
- });
191
- if (devError) {
192
- throw devError;
193
- }
194
- if (data.redacted === true && renderMode === "practice") {
195
- throw new Error(
196
- `Fill-in-the-Blanks "${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\`).`
197
- );
198
- }
199
- const submitted = state === "completed";
200
- const inactive = disabled === true || submitted || isReview;
201
- const revealing = isReview ? outcome?.status === "scored" : !isExam && submitted;
202
- const marking = revealing && policy.feedback;
203
- const showingAnswers = marking && policy.solutions && showCorrectAnswers === true && !tries.open;
204
- const fireInteraction = (type, payload) => {
205
- onInteraction?.({ type, activityId: data.id, timestamp: Date.now(), payload });
206
- };
207
- const handleChange = (blankId, text) => {
208
- if (inactive) {
209
- return;
210
- }
211
- if (state === "idle") {
212
- start();
213
- }
214
- const next = { ...answers, [blankId]: text };
215
- if (!isControlled) {
216
- setInternalAnswers(next);
217
- }
218
- onChange?.(responseOf(next));
219
- fireInteraction("blank-filled", { blankId, value: text });
220
- };
221
- const toggleHint = (blankId) => {
222
- if (inactive) {
223
- return;
224
- }
225
- if (state === "idle") {
226
- start();
227
- }
228
- setRevealed((prev) => {
229
- const next = new Set(prev);
230
- if (next.has(blankId)) {
231
- next.delete(blankId);
232
- return next;
233
- }
234
- next.add(blankId);
235
- return next;
236
- });
237
- if (!revealed.has(blankId)) {
238
- fireInteraction("hint-requested", { blankId });
239
- }
240
- if (!seen.has(blankId)) {
241
- setSeen((prev) => new Set(prev).add(blankId));
242
- if (renderMode === "practice") {
243
- onChange?.(responseOf(answers, hintsRevealed + 1));
244
- }
245
- }
246
- };
247
- const handleSubmit = (event) => {
248
- event.preventDefault();
249
- if (inactive) {
250
- return;
251
- }
252
- const response = responseOf(answers);
253
- onSubmit?.(response);
254
- if (isExam) {
255
- complete();
256
- setSummary(s.answerSubmitted);
257
- fireInteraction("submitted", { answers });
258
- return;
259
- }
260
- const answer = score("fill-in-the-blanks", data, response);
261
- complete();
262
- const timeSpent = getTimeSpent();
263
- const counted = tries.record({
264
- score: answer.score,
265
- maxScore: answer.maxScore,
266
- hintsRevealed
267
- });
268
- const mine = counted.tries[counted.tries.length - 1];
269
- const costed = mine === void 0 ? answer.score : mine.scored;
270
- const scoringResult = costed === answer.score ? answer : {
271
- ...answer,
272
- score: costed,
273
- passed: computePassThreshold(data, costed)
274
- };
275
- const passed = counted.score === scoringResult.score ? scoringResult.passed : computePassThreshold(data, counted.score);
276
- const xapiStatement = xAPIBuilder.buildAnsweredStatement({
277
- actor: ANONYMOUS_ACTOR,
278
- object: {
279
- id: objectIdFor(data.id),
280
- name: { [data.locale ?? "en-US"]: data.title },
281
- ...xapiDefinitionFor(data)
282
- },
283
- scoringResult,
284
- timeSpentMs: timeSpent,
285
- response: JSON.stringify(answers)
286
- });
287
- setResult(answer);
288
- onComplete?.(
289
- stampTake(
290
- { score: counted.score, maxScore: counted.maxScore, passed, timeSpent, xapiStatement },
291
- mintTake()
292
- )
293
- );
294
- setOverall(answer.feedback);
295
- setSummary(
296
- `${s.answerSubmitted} ${s.scoreAnnouncement(Math.round(counted.score * 100), passed)}`
297
- );
298
- fireInteraction("submitted", { answers, score: scoringResult.score });
299
- };
300
- const retry = () => {
301
- reset("idle");
302
- setSummary(null);
303
- setOverall(null);
304
- focusAfterRef.current = "answer";
305
- };
306
- const closeTries = () => {
307
- tries.close();
308
- focusAfterRef.current = "feedback";
309
- };
310
- const correctByBlank = useMemo(() => {
311
- if (isExam) {
312
- return /* @__PURE__ */ new Map();
313
- }
314
- if (isReview) {
315
- return outcome?.status === "scored" ? correctnessByItem(outcome.details) : /* @__PURE__ */ new Map();
316
- }
317
- return correctnessByItem(result?.details ?? []);
318
- }, [isExam, isReview, outcome, result]);
319
- const reviewSummary = useMemo(() => {
320
- if (!isReview || outcome === void 0) {
321
- return null;
322
- }
323
- if (outcome.status === "scored") {
324
- return `${s.scoreAnnouncement(Math.round(outcome.score * 100), outcome.passed)}${outcome.feedback ? ` ${outcome.feedback}` : ""}`;
325
- }
326
- if (outcome.status === "deferred") {
327
- return s.notGradedYet;
328
- }
329
- if (outcome.status === "graded") {
330
- const percent = outcome.maxScore > 0 ? Math.round(outcome.score / outcome.maxScore * 100) : Math.round(outcome.score * 100);
331
- return `${s.scoreAnnouncement(percent, outcome.passed)}${outcome.feedback ? ` ${outcome.feedback}` : ""}`;
332
- }
333
- return s.noGradeAvailable;
334
- }, [isReview, outcome, s]);
335
- const extra = !isReview && policy.feedback && submitted && tries.counted !== null ? triesSummary(s, scoringPolicy, tries.counted, tries.open) : "";
336
- const announced = summary === null ? null : `${summary}${extra ? ` ${extra}` : ""}${overall ? ` ${overall}` : ""}`;
337
- const hintsOffered = renderMode === "practice" && !submitted && (aiHints.offered || policy.hints && data.blanks.some((blank) => blank.hint));
338
- return /* @__PURE__ */ jsxs(
339
- "form",
340
- {
341
- ref: formRef,
342
- className: "lk-fib",
343
- "aria-label": data.title,
344
- lang: locale,
345
- "data-render-mode": renderMode,
346
- style: theme,
347
- onSubmit: handleSubmit,
348
- children: [
349
- data.media ? /* @__PURE__ */ jsx(
350
- ActivityMedia,
351
- {
352
- media: data.media,
353
- renderMode,
354
- ...mediaBudget !== void 0 ? { mediaBudget } : {},
355
- ...mediaStrings !== void 0 ? { mediaStrings } : {},
356
- ...strings !== void 0 ? { strings } : {},
357
- ...onInteraction !== void 0 ? { onInteraction } : {},
358
- ...locale !== void 0 ? { locale } : {}
359
- }
360
- ) : null,
361
- /* @__PURE__ */ jsxs("fieldset", { disabled: inactive, children: [
362
- /* @__PURE__ */ jsx("p", { className: "lk-fib-passage", children: segments.map((seg, i) => {
363
- if (seg.kind === "text") {
364
- return /* @__PURE__ */ jsx("span", { children: seg.value }, `t${i}`);
365
- }
366
- const blank = blankById.get(seg.id);
367
- if (!blank) {
368
- return null;
369
- }
370
- const acceptedAnswers = isExam ? void 0 : blank.acceptedAnswers;
371
- const blankFeedback = isExam ? void 0 : blank.feedback;
372
- const correctness = correctByBlank.get(seg.id);
373
- const hintId = `${data.id}-hint-${seg.id}`;
374
- const hint = policy.hints ? blank.hint : void 0;
375
- const correctAnswer = acceptedAnswers?.[0];
376
- if (showingAnswers && correctness === false && correctAnswer) {
377
- return /* @__PURE__ */ jsx("span", { className: "lk-fib-answer", "data-correct": "false", children: correctAnswer }, seg.id);
378
- }
379
- return /* @__PURE__ */ jsxs("span", { className: "lk-fib-blank", children: [
380
- /* @__PURE__ */ jsx(
381
- "input",
382
- {
383
- type: "text",
384
- "aria-label": s.blankLabel(seg.ordinal),
385
- "aria-describedby": hint ? hintId : void 0,
386
- value: answers[seg.id] ?? "",
387
- disabled: inactive,
388
- "aria-disabled": inactive || void 0,
389
- "data-correct": marking && correctness !== void 0 ? String(correctness) : void 0,
390
- onChange: (e) => handleChange(seg.id, e.target.value)
391
- }
392
- ),
393
- hint ? /* @__PURE__ */ jsxs(Fragment, { children: [
394
- /* @__PURE__ */ jsx(
395
- "button",
396
- {
397
- type: "button",
398
- className: "lk-fib-hint-btn",
399
- "aria-controls": hintId,
400
- "aria-expanded": revealed.has(seg.id),
401
- "aria-label": revealed.has(seg.id) ? s.hideHint : s.showHint,
402
- disabled: inactive,
403
- onClick: () => toggleHint(seg.id),
404
- children: /* @__PURE__ */ jsx(
405
- "svg",
406
- {
407
- className: "lk-fib-hint-icon",
408
- viewBox: "0 0 24 24",
409
- width: "16",
410
- height: "16",
411
- "aria-hidden": "true",
412
- focusable: "false",
413
- children: /* @__PURE__ */ jsx(
414
- "path",
415
- {
416
- fill: "currentColor",
417
- d: "M9 21h6v-1H9v1Zm3-19a7 7 0 0 0-4 12.74V17h8v-2.26A7 7 0 0 0 12 2Z"
418
- }
419
- )
420
- }
421
- )
422
- }
423
- ),
424
- /* @__PURE__ */ jsx("span", { id: hintId, "aria-live": "polite", children: revealed.has(seg.id) ? hint : "" })
425
- ] }) : null,
426
- marking && !feedbackHidden && blankFeedback ? /* @__PURE__ */ jsx(
427
- "span",
428
- {
429
- className: "lk-fib-blank-feedback",
430
- role: "note",
431
- "data-correct": correctness !== void 0 ? String(correctness) : void 0,
432
- children: blankFeedback
433
- }
434
- ) : null
435
- ] }, seg.id);
436
- }) }),
437
- hintsOffered ? /* @__PURE__ */ jsx(HintCost, { policy: scoringPolicy, strings: s }) : null,
438
- /* @__PURE__ */ jsx(AiHints, { help: aiHints, ai, strings: s }),
439
- isReview ? null : /* @__PURE__ */ jsx("button", { type: "submit", disabled: inactive, children: isExam ? s.submitAnswers : s.checkAnswers })
440
- ] }),
441
- marking && data.blanks.some((b) => b.feedback) ? /* @__PURE__ */ jsx(
442
- "button",
443
- {
444
- type: "button",
445
- className: "lk-fib-feedback-toggle",
446
- "aria-expanded": !feedbackHidden,
447
- onClick: () => setFeedbackHidden((h) => !h),
448
- children: feedbackHidden ? s.showFeedback : s.hideFeedback
449
- }
450
- ) : null,
451
- /* @__PURE__ */ jsx(
452
- FeedbackRegion,
453
- {
454
- id: `${data.id}-feedback`,
455
- ...scoringPolicy.retries > 0 ? { ref: feedbackRef } : {},
456
- children: isReview ? policy.feedback || !outcomeShowsMarks(outcome) ? reviewSummary : null : policy.feedback || summary === null ? announced : s.answerSubmitted
457
- }
458
- ),
459
- /* @__PURE__ */ jsx(
460
- TryActions,
461
- {
462
- tries,
463
- solutions: policy.solutions && showCorrectAnswers === true,
464
- strings: s,
465
- onRetry: retry,
466
- onClose: closeTries
467
- }
468
- ),
469
- /* @__PURE__ */ jsx(
470
- AiExplanation,
471
- {
472
- ai,
473
- data,
474
- renderMode,
475
- submitted,
476
- response: { type: "fill-in-the-blanks", answers },
477
- outcome,
478
- locale,
479
- onInteraction,
480
- strings: s,
481
- delivery: tries.open ? { ...policy, solutions: false } : policy
482
- }
483
- )
484
- ]
485
- }
486
- );
487
- }
488
- function FillInTheBlanks2(props) {
489
- const strings = useLkStrings(props.strings);
490
- return /* @__PURE__ */ jsx(ActivityErrorBoundary, { activityTitle: props.data?.title, strings, children: /* @__PURE__ */ jsx(FillInTheBlanks, { ...props }) });
491
- }
492
-
493
- export { FillInTheBlanks2 as FillInTheBlanks };
494
- //# sourceMappingURL=chunk-KI6DJ5ZF.js.map
495
- //# sourceMappingURL=chunk-KI6DJ5ZF.js.map