@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,973 +0,0 @@
1
- import { ReadAloudDimension, ReadAloudWordState, Stimulus, SpeechAssessment, GradeRecord, ReadAloudData, RecordingRef, LearnerResponse, ActivityData, ActivityResult, ItemOutcome, MediaPlayLedgerEntry, MediaPlayClaim, MediaPlayGrant, InteractionEvent, DeliveryPolicy, ItemScoringPolicy, ThemeTokens, RedactedActivityData, ItemGroup, SequenceEntry } from '@intellectif/lk-core';
2
- import { LearnerAi } from './ai/LkAiProvider.cjs';
3
- import { S as SpeechRecorderError, R as RecordedTake } from './machine-CuwKqWXC.cjs';
4
-
5
- /** The size captions are drawn at. */
6
- type CaptionSize = 'small' | 'medium' | 'large';
7
- /** What the player remembers between videos, for one browser. */
8
- interface VideoPreferences {
9
- /** One of the speed list. */
10
- speed: number;
11
- /** 0 to 1. */
12
- volume: number;
13
- muted: boolean;
14
- /** Captions shown — both lines, when there are two. */
15
- captions: boolean;
16
- /** The caption language chosen, as a track's `srclang`; null for the default track. */
17
- captionLanguage: string | null;
18
- /**
19
- * A second caption language, drawn under the first, as a track's `srclang`;
20
- * null for none. A learner's preference, never content: nothing about it is
21
- * authored. Never the same as `captionLanguage` — a pair of one language is
22
- * normalised to no second line.
23
- */
24
- secondaryCaptionLanguage: string | null;
25
- captionSize: CaptionSize;
26
- /** A dark box behind each caption line. Off draws the text with an outline only. */
27
- captionBackground: boolean;
28
- /** The contents and transcript panel is open. */
29
- panel: boolean;
30
- /** Single-key shortcuts act while the player has focus (WCAG 2.1.4 lets a learner turn them off). */
31
- shortcuts: boolean;
32
- }
33
-
34
- /**
35
- * One row of the shortcut list. The list and the key handler read the same
36
- * table, so a shortcut can never be documented and not work, or work and not
37
- * be documented.
38
- */
39
- type VideoShortcutAction = 'play-pause' | 'jump-10' | 'jump-5' | 'jump-1' | 'frame' | 'speed' | 'percent' | 'start-end' | 'chapter' | 'mute' | 'captions' | 'secondary-captions' | 'transcript' | 'picture-in-picture' | 'fullscreen' | 'shortcut-list';
40
-
41
- /**
42
- * Every string the SDK's own chrome renders.
43
- *
44
- * Until 0.8.1 these were literals, and `locale` set only the `lang` attribute —
45
- * so a learner sitting a Spanish paper read a Spanish passage inside an English
46
- * scaffold, and "No plays remaining" on a listening exam was untranslatable.
47
- * This is the whole surface, in one place, so a consumer can replace it.
48
- *
49
- * **Interpolation and plurals are functions, not format strings.** A message
50
- * like `"Question {n} of {total}"` needs a parser, and a parser needs plural
51
- * rules for every locale the SDK does not know. A function hands both problems
52
- * to the consumer, who has `Intl.PluralRules` and knows their own language:
53
- *
54
- * ```ts
55
- * questionProgress: (index, total) => `Pregunta ${index} de ${total}`,
56
- * wordCount: (n) => `${n} ${n === 1 ? 'palabra' : 'palabras'}`,
57
- * ```
58
- *
59
- * It also lets a translation reorder its arguments, which a positional token
60
- * cannot, and TypeScript checks the arity. No parser, no message catalogue
61
- * format, no runtime dependency.
62
- *
63
- * **What is deliberately NOT here: thrown errors.** Every `throw` in this
64
- * package is addressed to the developer who wired the component up, not to the
65
- * learner. Translating them would make them unsearchable and would put the one
66
- * audience who can act on them behind a translation. They stay English.
67
- */
68
- interface LkStrings {
69
- /** Multiple Choice submit button, and Written Response. */
70
- submit: string;
71
- /** Fill-in-the-Blanks in `practice`: the learner is checking their own work. */
72
- checkAnswers: string;
73
- /** Fill-in-the-Blanks in `exam`: nothing is checked on the client. */
74
- submitAnswers: string;
75
- /**
76
- * The scored result, read by a screen reader on submit.
77
- *
78
- * `percent` is already rounded to a whole number. The authored overall
79
- * feedback is appended SEPARATELY by the component, so a translation of this
80
- * sentence never has to carry the author's words — the two were previously
81
- * concatenated into one literal, which made the score sentence untranslatable
82
- * without also touching authored content.
83
- */
84
- scoreAnnouncement: (percent: number, passed: boolean) => string;
85
- /** Prefix announced on submit, before the score sentence. */
86
- answerSubmitted: string;
87
- /** An answer submitted for grading that has none yet. Never rendered as 0%. */
88
- notGradedYet: string;
89
- /** An outcome that carries no grade and never will. */
90
- noGradeAvailable: string;
91
- /** The button that reopens a graded answer for another try. */
92
- tryAgain: string;
93
- /** Ends the tries on a question and shows the right answer. */
94
- showAnswer: string;
95
- /** Ends the tries on a question where the paper shows no right answers. */
96
- keepAnswer: string;
97
- /**
98
- * After a graded try, how many more there are, and what each costs: a whole
99
- * percentage of the question's marks, `0` when a try costs nothing.
100
- */
101
- triesLeft: (tries: number, costPercent: number) => string;
102
- /**
103
- * When an earlier try is the one that counts: which rule chose it, and what
104
- * the try just made scored, as a whole percentage.
105
- */
106
- countedTry: (counts: 'first' | 'best', percent: number) => string;
107
- /**
108
- * When hints or tries cost this answer something: what it scored before
109
- * that, as a whole percentage. The score sentence before it is what it counts.
110
- */
111
- scoreBeforeCosts: (percent: number) => string;
112
- /** Beside the hints on a paper where they cost marks, before one is asked for. */
113
- hintCost: (percent: number) => string;
114
- showFeedback: string;
115
- hideFeedback: string;
116
- /** Accessible name of a blank's input. `ordinal` is 1-based. */
117
- blankLabel: (ordinal: number) => string;
118
- /** Accessible name of the selector for one gap in a Gap Select passage. */
119
- gapLabel: (ordinal: number) => string;
120
- /**
121
- * The empty first entry of a gap's selector — how a learner leaves a gap
122
- * alone, and how they take an answer back. Never a real choice.
123
- */
124
- gapPlaceholder: string;
125
- showHint: string;
126
- hideHint: string;
127
- /**
128
- * Announced when an essay is handed in. Distinct from {@link LkStrings.awaitingGrade},
129
- * which is the `review`-mode state of a submission made earlier: this one
130
- * confirms the act, and is the only thing a learner hears at the moment they
131
- * commit work that nothing on the client will grade.
132
- */
133
- responseSubmitted: string;
134
- /** Live word counter. Needs the count for languages whose plural rules differ. */
135
- wordCount: (count: number) => string;
136
- /** The authored bounds, e.g. "50–200 words". `min` is 0 when unbounded below. */
137
- wordBounds: (min: number, max: number) => string;
138
- /** A rubric criterion the grader marked not applicable. */
139
- notApplicable: string;
140
- /** A returned grade flagged for a human to look at — learner-visible by design. */
141
- awaitingHumanReview: string;
142
- /** Submitted, no grade back yet. */
143
- awaitingGrade: string;
144
- /** The grader could not produce a grade. */
145
- couldNotBeGraded: string;
146
- previous: string;
147
- next: string;
148
- /** Progress label, also the question region's accessible name. `index` is 1-based. */
149
- questionProgress: (index: number, total: number) => string;
150
- /** Shown when no renderer is registered for an activity type. */
151
- unsupportedActivity: string;
152
- /** Accessible name of the box the learner types the recording into. */
153
- dictationInputLabel: string;
154
- /** Accessible name of the group holding the recording. */
155
- dictationRecording: string;
156
- /** Accessible name of the group holding the slower recording, and its default `alt`. */
157
- dictationSlowRecording: string;
158
- /** The progressive-hint button, with how many transcript words are shown so far. */
159
- dictationRevealNextWord: (revealed: number, total: number) => string;
160
- /** Hides every revealed hint word again. */
161
- dictationResetHints: string;
162
- /** The solution toggle: shows the transcript after the attempt is marked. */
163
- showSolution: string;
164
- hideSolution: string;
165
- /** Accessible name of the revealed transcript. */
166
- dictationSolutionLabel: string;
167
- /** Accessible name of the word-by-word marked result. */
168
- dictationMarksLabel: string;
169
- /** Tells the learner the marks compare the normalised text, not what they typed. */
170
- dictationDiffNote: string;
171
- /**
172
- * The four sentences a screen reader hears for a marked word — the only
173
- * channel the marks have for assistive technology; the glyphs and the
174
- * character diff are decoration.
175
- */
176
- dictationWordCorrect: (word: string) => string;
177
- dictationWordWrong: (word: string, expected: string) => string;
178
- dictationWordMissing: (expected: string) => string;
179
- /**
180
- * A wrong word, where the right answer may not show — the paper withholds
181
- * solutions, or the learner is offered another try: it is wrong, and not
182
- * what it should be.
183
- */
184
- dictationWordWrongUnnamed: (word: string) => string;
185
- /** A missing word, where the right answer may not show: missing, and not named. */
186
- dictationWordMissingUnnamed: string;
187
- dictationWordExtra: (word: string) => string;
188
- /** The legend rows; the character-level marks reuse the same four. */
189
- dictationLegendCorrect: string;
190
- dictationLegendWrong: string;
191
- dictationLegendMissing: string;
192
- dictationLegendExtra: string;
193
- /** Marked result of an attempt with no words in it once punctuation and spacing are ignored, an empty one included. */
194
- dictationNothingTyped: string;
195
- /**
196
- * Appended to the score announcement, e.g. "4 of 6 words correct." — a whole
197
- * sentence, because authored feedback may follow it.
198
- */
199
- dictationWordsSummary: (correct: number, total: number) => string;
200
- /** Accessible name of the group holding the model recording. */
201
- readAloudModelRecording: string;
202
- /** Accessible name of the group holding the slower model recording, and its default `alt`. */
203
- readAloudSlowRecording: string;
204
- /** Starts a take. */
205
- readAloudRecord: string;
206
- /** Ends the take in progress. */
207
- readAloudStop: string;
208
- /** Throws the take away so the learner can start over. */
209
- readAloudRerecord: string;
210
- /** Accessible name of the player for the take the learner just made. */
211
- readAloudYourRecording: string;
212
- /**
213
- * In place of the player for the learner's own take, and of the buttons that
214
- * play one word of it, when the page refuses to play it — most often a
215
- * Content-Security-Policy whose `media-src` does not allow `blob:`. Said
216
- * rather than left as controls that do nothing when pressed.
217
- */
218
- readAloudPlaybackUnavailable: string;
219
- /**
220
- * Live progress while recording. Whole seconds, not a `m:ss` clock: a
221
- * recording is bounded in seconds by the item, and a translation should not
222
- * have to reimplement a clock to change the word around it.
223
- *
224
- * Shown on screen and hidden from assistive technology: it changes every
225
- * second, and a screen reader that spoke each change would speak into the
226
- * take being assessed. The two sentences below are what is announced instead.
227
- */
228
- readAloudRecordingProgress: (seconds: number, maxSeconds: number) => string;
229
- /** Announced once when a capture begins. */
230
- readAloudRecordingStarted: string;
231
- /**
232
- * Announced once when a capture ends, by the learner or at its own bound.
233
- * Carries the length because the progress counter is not announced: a take
234
- * that reads back as "20 of 20 seconds" is one that stopped itself.
235
- */
236
- readAloudRecordingStopped: (seconds: number, maxSeconds: number) => string;
237
- /** How many takes are left. Called with 0 as well, so the wording is one translation's. */
238
- readAloudTakesRemaining: (remaining: number, max: number) => string;
239
- /** `exam` only: hands the item in with no recording at all, deliberately. */
240
- readAloudSubmitWithoutRecording: string;
241
- /** Pending, while the take travels to the application's storage. */
242
- readAloudUploading: string;
243
- /** The take never reached storage, so nothing was submitted. */
244
- readAloudUploadFailed: string;
245
- /** Retries whichever step just failed. */
246
- readAloudTryAgain: string;
247
- /** Pending, while the assessor judges the take. */
248
- readAloudAssessing: string;
249
- /** The binding stores recordings but judges none, so there is no feedback to show. */
250
- readAloudAssessmentUnavailable: string;
251
- /** The assessor found no speech, or too little of it, in the take. */
252
- readAloudNotHeard: string;
253
- /** The assessor produced no grade for any other reason. The code itself is never shown. */
254
- readAloudNotAssessed: string;
255
- /** The assessment could not be run at all — a failure of the call, not of the reading. */
256
- readAloudAssessmentFailed: string;
257
- /**
258
- * What went wrong with the microphone or with the take. One function rather
259
- * than five keys, so a translation keeps the five sentences together and the
260
- * SDK keeps one name for the concept.
261
- */
262
- readAloudRecorderError: (reason: SpeechRecorderError) => string;
263
- /** Accessible name of the whole feedback region. */
264
- pronunciationFeedbackLabel: string;
265
- /** Name of one scored dimension, as a learner reads it. */
266
- pronunciationDimension: (dimension: ReadAloudDimension) => string;
267
- /** A dimension or a word the engine did not measure. NEVER rendered as 0%. */
268
- pronunciationNotAssessed: string;
269
- /** Accessible name of the word-by-word marks. */
270
- pronunciationWordsLabel: string;
271
- /** One legend row per marking state — the same four states the marks carry. */
272
- pronunciationLegend: (state: ReadAloudWordState) => string;
273
- /**
274
- * The four sentences a screen reader hears for a marked word: the only
275
- * channel the marks have for assistive technology, since the glyph and the
276
- * decoration are both hidden from it.
277
- */
278
- pronunciationWordCorrect: (word: string) => string;
279
- pronunciationWordMispronounced: (word: string) => string;
280
- pronunciationWordOmitted: (word: string) => string;
281
- pronunciationWordInserted: (word: string) => string;
282
- /** Opens one word's syllables, sounds and timings. */
283
- pronunciationWordDetails: (word: string) => string;
284
- pronunciationSyllables: string;
285
- pronunciationPhonemes: string;
286
- /** A syllable the engine also spelled out, e.g. `('ˈhæ', 'ha')`. */
287
- pronunciationSyllableSpelling: (syllable: string, grapheme: string) => string;
288
- /** A sound the engine named no symbol for; `ordinal` is 1-based. */
289
- pronunciationPhonemePosition: (ordinal: number) => string;
290
- /** Introduces the sounds the engine thought it heard in a sound's place. */
291
- pronunciationHeardAs: string;
292
- /** Plays one word out of the learner's own take. */
293
- pronunciationPlayWord: (word: string) => string;
294
- pronunciationBreakUnexpected: string;
295
- pronunciationBreakMissing: string;
296
- /** Shown only past the caller's own monotone threshold; the SDK sets none. */
297
- pronunciationMonotone: string;
298
- /** Names the alphabet the phoneme symbols are written in. */
299
- pronunciationIpaNote: string;
300
- /** Jump buttons, e.g. "Back 10 seconds". */
301
- videoBack: (seconds: number) => string;
302
- videoForward: (seconds: number) => string;
303
- /** The centre button once the video has ended. */
304
- videoReplay: string;
305
- /** The time readout flips between elapsed and remaining; these name what a press shows next. */
306
- videoShowRemaining: string;
307
- videoShowElapsed: string;
308
- /** The captions button, named by what a press does. */
309
- videoCaptionsShow: string;
310
- videoCaptionsHide: string;
311
- /** In the captions menu when a caption file could not be read. */
312
- videoCaptionsFailed: string;
313
- /** The same, for the second language: the first line keeps working. */
314
- videoSecondaryCaptionsFailed: string;
315
- /** A speed in the speed menu, e.g. "1.25×". */
316
- videoSpeedValue: (rate: number) => string;
317
- videoSettings: string;
318
- videoCaptionLanguage: string;
319
- /** The captions page's item, and page, for a second caption line under the first. */
320
- videoSecondCaptionLanguage: string;
321
- /**
322
- * The captions row of the settings menu when two languages show, from the
323
- * tracks' own labels: "English + Español". A translation may order them as its
324
- * language reads, but the first argument is always the upper line.
325
- */
326
- videoCaptionPair: (primary: string, secondary: string) => string;
327
- /** Announced when Shift + C finds no other language to show. */
328
- videoNoSecondLanguage: string;
329
- videoCaptionSize: string;
330
- videoCaptionSizeValue: (size: CaptionSize) => string;
331
- videoCaptionBackground: string;
332
- videoKeyboardShortcuts: string;
333
- videoShortcutList: string;
334
- /** Closes the shortcut list. */
335
- videoClose: string;
336
- /** A setting's state in the settings menu. */
337
- videoOn: string;
338
- videoOff: string;
339
- /** What each row of the shortcut list does. */
340
- videoShortcut: (action: VideoShortcutAction) => string;
341
- /** The button that opens the panel below the video, and its two tabs. */
342
- videoPanel: string;
343
- videoContents: string;
344
- videoTranscript: string;
345
- videoTranscriptSearch: string;
346
- videoTranscriptNoMatch: string;
347
- videoPictureInPicture: string;
348
- videoFullscreen: string;
349
- videoExitFullscreen: string;
350
- /**
351
- * Why the video will not play, by `MediaError.code` (1 aborted, 2 network,
352
- * 3 decode, 4 source), with 0 for anything else.
353
- */
354
- videoError: (code: number) => string;
355
- videoTryAgain: string;
356
- /** A quiz with no title of its own. */
357
- videoQuiz: string;
358
- /** Where the learner is inside a quiz, e.g. "Question 2 of 5". */
359
- videoQuestionProgress: (index: number, total: number) => string;
360
- /** A step of the quiz's step indicator, for assistive technology. */
361
- videoQuestionStep: (index: number, answered: boolean) => string;
362
- videoNextQuestion: string;
363
- videoContinue: string;
364
- videoSkipQuiz: string;
365
- videoRewatch: string;
366
- /** Exam mode, once a question is submitted: saved, not graded. */
367
- videoAnswerSaved: string;
368
- /** The end card, while an answer is still being stored or graded: why Finish waits. */
369
- videoAnswerPending: string;
370
- videoRequired: string;
371
- /** A quiz's progress in the contents panel and on the end screen. */
372
- videoQuizProgress: (answered: number, total: number) => string;
373
- /** Announced when a quiz opens. */
374
- videoQuizOpened: (time: string, questions: number) => string;
375
- /** Announced when a seek stopped at a required quiz. */
376
- videoHeldAtQuiz: (time: string) => string;
377
- /** Announced when a seek stopped at the furthest point reached. */
378
- videoHeldAhead: string;
379
- videoEnded: string;
380
- /** Practice end screen: questions answered, and the score. */
381
- videoEndScore: (answered: number, total: number, percent: number) => string;
382
- /** Exam end screen: questions answered, no score. */
383
- videoEndAnswered: (answered: number, total: number) => string;
384
- videoWatchAgain: string;
385
- videoFinish: string;
386
- /**
387
- * `<ActivityPreview>`, in place of a draft that still has something missing.
388
- * Author-facing, not learner-facing — but an editor is translated too.
389
- */
390
- previewIncomplete: string;
391
- /** `<ActivityPreview>`, in place of a draft with something wrong in it. */
392
- previewInvalid: string;
393
- /**
394
- * Accessible name of a provider iframe whose author supplied no `alt`.
395
- * `MediaSchema` requires `alt` on an embed, so validated content never
396
- * reaches this — but `validateActivity` is opt-in, and a screen-reader
397
- * learner meeting an unvalidated one should not meet it in English.
398
- */
399
- embeddedMedia: string;
400
- /**
401
- * Accessible name of the stimulus region when the author gave it no title.
402
- * Keyed by `Stimulus['kind']`, because "Recording" and "Passage" do not share
403
- * a gender or an article in every language.
404
- */
405
- stimulusKind: Record<Stimulus['kind'], string>;
406
- /**
407
- * How far the material carries, e.g. "Questions 3–8". Called with equal
408
- * `first` and `last` for a single question, so a translation can choose its
409
- * own singular rather than receive a pre-pluralised English one.
410
- */
411
- stimulusRange: (first: number, last: number) => string;
412
- /** Production fallback when an activity throws during render. */
413
- activityFailed: string;
414
- /** The same, when the activity's title is known. */
415
- activityFailedNamed: (title: string) => string;
416
- /** Production fallback when the activity has no title to name. */
417
- activityFailedUnnamed: string;
418
- /** The button that asks for an explanation of a graded answer. */
419
- aiExplain: string;
420
- /** The same button while the explanation is being written. */
421
- aiExplaining: string;
422
- /** The heading over an explanation, and its accessible name. */
423
- aiExplanation: string;
424
- /** When no explanation can be shown: the port failed, or its answer was refused. */
425
- aiExplanationUnavailable: string;
426
- /** The button that asks for a hint. */
427
- aiHint: string;
428
- /** The same button while the hint is being written. */
429
- aiHintLoading: string;
430
- /** The label before each hint. */
431
- aiHintNumber: (hintNumber: number) => string;
432
- /** The accessible name of the list of hints. */
433
- aiHints: string;
434
- /** When no hint can be shown: the port failed, or its hint gave the answer away. */
435
- aiHintUnavailable: string;
436
- /** In place of the hint button once every hint has been used. */
437
- aiNoMoreHints: string;
438
- /** Beneath every AI text: who wrote it. */
439
- aiNotice: string;
440
- /** The button that asks for feedback on a draft of a written response. */
441
- aiWritingFeedback: string;
442
- /** The same button while the feedback is being written. */
443
- aiWritingFeedbackLoading: string;
444
- /** The heading over feedback on a draft, and its accessible name. */
445
- aiWritingFeedbackHeading: string;
446
- /** When no feedback can be shown: the port failed, or its feedback was refused. */
447
- aiWritingFeedbackUnavailable: string;
448
- /** In place of the feedback button once the learner has used every request. */
449
- aiNoMoreWritingFeedback: string;
450
- /** Above feedback the learner has revised the draft since: its corrections may be out of date. */
451
- aiWritingFeedbackOutdated: string;
452
- /** The accessible name of the list of corrections the feedback suggests. */
453
- aiCorrections: string;
454
- /**
455
- * The rubric's weighted total of a model's judgements of a draft, as a whole
456
- * percentage — said to be an indication and not a grade, which it is not.
457
- */
458
- aiIndicativeScore: (percent: number) => string;
459
- /**
460
- * The listening-paper transport. Shipped in 0.8.0 as its own `mediaStrings`
461
- * prop, which still works — this is the same shape, reachable from the one
462
- * provider so a consumer does not wire two mechanisms.
463
- */
464
- media: MediaTransportStrings;
465
- }
466
- /** A partial override, nested one level for {@link LkStrings.media}. */
467
- type LkStringsOverride = Partial<Omit<LkStrings, 'media' | 'stimulusKind'>> & {
468
- media?: Partial<MediaTransportStrings>;
469
- stimulusKind?: Partial<Record<Stimulus['kind'], string>>;
470
- };
471
- /**
472
- * English defaults, byte-identical to what every component rendered before the
473
- * strings surface existed. Supplying no override changes nothing on screen.
474
- */
475
- declare const DEFAULT_STRINGS: LkStrings;
476
- /**
477
- * Layers an override onto a base dictionary.
478
- *
479
- * Two levels deep and no further, because the shape is two levels deep. A
480
- * generic deep merge would silently accept a nested object where a function
481
- * belongs and fail at render instead of at the call site.
482
- */
483
- declare function mergeStrings(base: LkStrings, override?: LkStringsOverride): LkStrings;
484
-
485
- /**
486
- * What an application's assessor came back with.
487
- *
488
- * `code` is a plain `string` and not `SpeechUnscorableCode`: an application's
489
- * own assessor may refuse a take for a reason the SDK has no name for, and a
490
- * narrower type would make it unreportable. This component classifies the two
491
- * codes that mean "nothing was heard" and treats every other one the same way.
492
- */
493
- type ReadAloudAssessResult = {
494
- status: 'graded';
495
- assessment: SpeechAssessment;
496
- grade: GradeRecord;
497
- } | {
498
- status: 'unscorable';
499
- code: string;
500
- assessment?: SpeechAssessment;
501
- } | {
502
- status: 'failed';
503
- retryable: boolean;
504
- };
505
- /**
506
- * How a take reaches the application, and how a judgement comes back.
507
- *
508
- * Named `recordingBinding` rather than `recording` because both
509
- * `ReadAloudData.recording` (the bounds) and `ReadAloudLearnerResponse.recording`
510
- * (the stored take) already exist: the plain name would read as one of those.
511
- */
512
- interface RecordingBinding {
513
- /**
514
- * Puts the take in your storage and returns its key. **Required** outside
515
- * `review`: without it a learner can speak into a control that submits
516
- * nothing. Settle it — a promise that never does leaves the submit pending
517
- * for ever.
518
- */
519
- upload(take: RecordedTake): Promise<RecordingRef>;
520
- /**
521
- * Judges the stored take. `practice` only — an exam never assesses on the
522
- * client. Optional: a binding without it records, uploads and submits, and
523
- * the feedback is replaced by a notice.
524
- */
525
- assess?(ref: RecordingRef): Promise<ReadAloudAssessResult>;
526
- /** A playable link to a stored take. `review` only. */
527
- playbackUrl?(ref: RecordingRef): Promise<string>;
528
- }
529
- interface ReadAloudProps extends ActivityProps<ReadAloudData> {
530
- /** How a take is stored and judged. See {@link RecordingBinding}. */
531
- recordingBinding?: RecordingBinding;
532
- /**
533
- * The evidence behind a stored grade, for `review`. Without it a graded
534
- * outcome still shows its marks, rebuilt from `outcome.grade.details`; with
535
- * neither, the score is shown and no marks are.
536
- */
537
- assessment?: SpeechAssessment;
538
- /**
539
- * Confidence above which a break note is shown, 0..1, forwarded to
540
- * {@link PronunciationFeedback}. No default — see its own prop.
541
- */
542
- breakThreshold?: number;
543
- /** The same, for the monotone note. */
544
- monotoneThreshold?: number;
545
- /**
546
- * The URL of a self-hosted copy of `CAPTURE_PROCESSOR_SOURCE`, handed to the
547
- * recorder, for a Content-Security-Policy whose `script-src` does not allow
548
- * `blob:`. Without it the capture module is loaded from a `blob:` URL, and a
549
- * policy that refuses one sends every take through the deprecated
550
- * main-thread `ScriptProcessorNode` — a take that still records, so nothing
551
- * says so. See `useSpeechRecorder`'s option of the same name.
552
- */
553
- workletUrl?: string;
554
- /**
555
- * Never called. A read-aloud answer is a key in your storage, and there is
556
- * none until the take has been uploaded — so there is no intermediate
557
- * response to report, and reporting the take itself would offer a host a
558
- * recording it has nowhere to put. `onSubmit` carries the response, once.
559
- */
560
- onChange?: (response: LearnerResponse) => void;
561
- }
562
-
563
- /**
564
- * How an activity is being presented. This is the single switch that decides
565
- * whether the component may grade, reveal, or submit — the three things a
566
- * summative exam must take away from the client.
567
- *
568
- * - `practice` (default, and the only behaviour before `renderMode` existed):
569
- * the component owns the attempt. It
570
- * scores locally on submit, reveals correctness and feedback, and calls
571
- * `onComplete` with a full {@link ActivityResult}.
572
- * - `exam`: the component NEVER scores and NEVER reveals correctness. Submit
573
- * emits the raw learner response through `onSubmit`; the server grades it.
574
- * Safe to render redacted data, because nothing here needs the answer key.
575
- * - `review`: read-only. Renders the learner's submitted answer, and marks
576
- * correctness only from an `outcome` the caller supplies (which the server
577
- * computed). Nothing is submittable.
578
- */
579
- type RenderMode = 'practice' | 'exam' | 'review';
580
- /**
581
- * Makes the answer-key-bearing parts of an activity optional, so a component
582
- * can render either full activity data OR a `redact()` projection with the
583
- * same props. Fields the SDK classifies `answer-key` become optional here;
584
- * a component in `exam` mode must not read them at all.
585
- */
586
- type Renderable<TData> = Omit<TData, 'scoringStrategy'> & {
587
- scoringStrategy?: unknown;
588
- /** Present on a `redact()` projection. */
589
- redacted?: true;
590
- };
591
- /**
592
- * {@link Renderable} DISTRIBUTED over a union of activity types.
593
- *
594
- * This distinction is load-bearing, not cosmetic. `Renderable<T>` is built on
595
- * `Omit`, and `Omit` does not distribute: `Omit<A | B, K>` collapses to the
596
- * keys A and B have IN COMMON, so `Renderable<ActivityData>` is a single
597
- * object type carrying only the fields every activity shares. Narrowing it
598
- * dies with it — after `if (data.type === 'multiple-choice')` the compiler
599
- * still refuses `data.options`, because the union it would narrow to no
600
- * longer exists.
601
- *
602
- * The conditional below re-distributes, so `RenderableActivity` is a real
603
- * union of per-type renderables and `.type` narrows again. Anything that
604
- * accepts "some renderable activity, I don't know which" — a custom renderer,
605
- * a sequence entry — must use THIS, not `Renderable<ActivityData>`.
606
- */
607
- type RenderableActivity<TData extends ActivityData = ActivityData> = TData extends unknown ? Renderable<TData> : never;
608
- /**
609
- * Sanitiser for author-supplied rich text (`questionHtml`, `promptHtml`, and a
610
- * stimulus's `bodyHtml`). The SDK deliberately ships NO sanitiser — that would
611
- * add a dependency and, worse, a false promise. Rich text is rendered only when
612
- * you supply this function; without it the component falls back to the
613
- * plain-text field, which is always escaped. Fail-safe by construction: the SDK
614
- * never injects HTML it was not explicitly given a sanitiser for.
615
- *
616
- * `FillInTheBlanks.passageHtml` is the one exception, and is **never**
617
- * rendered: the passage hosts the answer inputs, so it cannot be split at the
618
- * `{{blank}}` placeholders without voiding the sanitiser. The plain `passage`
619
- * is always used, and passing `passageHtml` warns in development.
620
- */
621
- type HtmlSanitizer = (html: string) => string;
622
- /**
623
- * The prop contract shared by every activity component (Req 3.1). Defined
624
- * here (React-specific) rather than in lk-core, which is React-free.
625
- *
626
- * Controlled / uncontrolled follows the React convention: pass `value` +
627
- * `onChange` to own the learner's answer (restore an in-progress attempt,
628
- * autosave a delta, drive a review); pass `defaultValue` to seed an
629
- * uncontrolled component; pass neither to keep the pre-2.1.0 behaviour, where
630
- * the component owns the answer outright.
631
- */
632
- interface ActivityProps<TData extends ActivityData = ActivityData> {
633
- /** Activity content. Accepts a `redact()` projection in `exam` mode. */
634
- data: RenderableActivity<TData>;
635
- /**
636
- * Called when the component scored the attempt itself. Only ever fires in
637
- * `practice` mode — in `exam` mode the client does not grade, so there is
638
- * no `ActivityResult` to give you; use `onSubmit`.
639
- */
640
- onComplete?: (result: ActivityResult) => void;
641
- /**
642
- * Called on submit with the raw learner response and no grade. Fires in
643
- * every mode, before `onComplete`, so an exam runner can persist the
644
- * response and let the server score it.
645
- */
646
- onSubmit?: (response: LearnerResponse) => void;
647
- /** Controlled value: the learner's current response. */
648
- value?: LearnerResponse;
649
- /** Initial response for an uncontrolled component (ignored when `value` is set). */
650
- defaultValue?: LearnerResponse;
651
- /**
652
- * Mount the component as already submitted — read at mount only, like any
653
- * `default*` prop.
654
- *
655
- * Restoring an attempt without it reopens a question the learner had already
656
- * submitted as answerable, so on a summative paper they can change and
657
- * re-submit it. `AttemptState.submittedSlotIds` is what this consumes.
658
- */
659
- defaultSubmitted?: boolean;
660
- /** Fires on every change to the learner's response. Required for a controlled component. */
661
- onChange?: (response: LearnerResponse) => void;
662
- /** Presentation mode. Defaults to `practice`. */
663
- renderMode?: RenderMode;
664
- /**
665
- * Server-computed outcome, used by `review` mode to mark correctness
666
- * without the client ever scoring. Ignored in other modes.
667
- */
668
- outcome?: ItemOutcome;
669
- /** Renders author-supplied rich text when provided. See {@link HtmlSanitizer}. */
670
- sanitizeHtml?: HtmlSanitizer;
671
- /**
672
- * Binds this activity's own `data.media` to a play budget the consumer
673
- * persists. Usually supplied by `<ActivitySequence mediaBudget={…}>`; pass it
674
- * yourself when rendering an activity standalone.
675
- */
676
- mediaBudget?: MediaBudgetBinding;
677
- /** Translations for the audio transport chrome. See {@link MediaTransportStrings}. */
678
- mediaStrings?: Partial<MediaTransportStrings>;
679
- /**
680
- * Overrides the SDK's chrome text for this activity, layered on whatever
681
- * `LkIntlProvider` supplies. `mediaStrings` still works and is merged after
682
- * this, so an existing 0.8.x call site keeps behaving as it did.
683
- */
684
- strings?: LkStringsOverride;
685
- onInteraction?: (event: InteractionEvent) => void;
686
- /**
687
- * The host's AI ports for this activity — an explanation after grading, hints
688
- * before submit — overriding `LkAiProvider`'s. Leave a port out to switch
689
- * that help off. Nothing AI appears in `exam`, and an item whose author
690
- * switched a feature off (`data.ai`) never shows it. See {@link LearnerAi}.
691
- */
692
- ai?: LearnerAi;
693
- /**
694
- * What the school running this paper lets a learner see: feedback,
695
- * solutions, hints, and AI help. Every setting only takes something away
696
- * from what the mode shows, and an absent policy takes nothing away. Inside
697
- * `<ActivitySequence>` or `<InteractiveVideo>`, the paper's own policy holds
698
- * as well, whichever is stricter. See `DeliveryPolicy` in lk-core.
699
- */
700
- delivery?: DeliveryPolicy | null;
701
- /**
702
- * How this question is scored when the learner can try again or ask for
703
- * hints: how many tries, which counts, what tries and hints cost. Applies in
704
- * `practice`, where the component grades — `<MultipleChoice>`,
705
- * `<FillInTheBlanks>`, `<GapSelect>` and `<Dictation>`. `<ReadAloud>` takes
706
- * the prop and ignores it: its tries are its own `recording.maxTakes`, and
707
- * its grade comes from your assessor, not from the component. Inside
708
- * `<ActivitySequence>` or `<InteractiveVideo>`, the paper's own policy wins
709
- * over this one. See `ItemScoringPolicy` in lk-core.
710
- *
711
- * With tries, `onComplete` fires after every graded try: `score` and
712
- * `passed` are the question's under the policy so far, and `xapiStatement`
713
- * records the try just made. A policy `validateItemScoringPolicy` refuses
714
- * throws at render.
715
- */
716
- scoring?: ItemScoringPolicy | null;
717
- /** Per-instance token overrides, applied as inline CSS vars on the root. */
718
- theme?: Partial<ThemeTokens>;
719
- /**
720
- * BCP 47 tag stamped as `lang` on this component's root. This is the
721
- * INTERFACE language — the SDK's own chrome renders inside that element — so
722
- * it should carry the same value you give `<LkIntlProvider locale>`. Passing
723
- * a different one re-declares the language of every SDK string in this
724
- * subtree without changing the words.
725
- *
726
- * It is NOT `data.locale`, which labels xAPI statements — and, on a
727
- * dictation, places the dictation's own words: `<Dictation>` puts it, and
728
- * the direction it names, on its title, hints, marks and solution. Other
729
- * authored content in another language belongs on `stimulus.locale`, which
730
- * `<StimulusPanel>` puts on the passage alone.
731
- */
732
- locale?: string;
733
- disabled?: boolean;
734
- }
735
- /**
736
- * Bridges a server-produced `redact()` projection into the `data` prop.
737
- *
738
- * `RedactedActivityData` is deliberately index-signature typed in lk-core — it
739
- * proves a payload is learner-safe, not what shape it has — so TypeScript
740
- * cannot know it still carries the public fields a renderer needs. This is the
741
- * SDK's single, documented crossing of that gap, so an exam runner does not
742
- * have to write `as unknown as` at every call site:
743
- *
744
- * ```tsx
745
- * <MultipleChoice
746
- * data={asRenderable<MultipleChoiceData>(redactedFromServer)}
747
- * renderMode="exam"
748
- * onSubmit={persist}
749
- * />
750
- * ```
751
- *
752
- * Safe because `exam` mode reads only public fields; the answer-key fields the
753
- * type claims are exactly the ones the component is forbidden to touch there.
754
- *
755
- * Per-type redacted interfaces (`RedactedMultipleChoiceData`, …) ship from
756
- * lk-core since 0.6.0, but they are not yet *assignable* to `data`:
757
- * {@link Renderable} widens `scoringStrategy` and leaves nested answer-key
758
- * fields (`options[].isCorrect`, `blanks[].acceptedAnswers`) required, so a
759
- * real redacted payload still needs this bridge. Closing that gap is tracked
760
- * in the roadmap.
761
- */
762
- declare function asRenderable<TData extends ActivityData>(redacted: RedactedActivityData): Renderable<TData>;
763
- /**
764
- * The same bridge as {@link asRenderable}, for a whole sequence: activities
765
- * and item groups as a server hands them over, ready for `<ActivitySequence>`.
766
- *
767
- * Needed for the same reason and no other. `redactItemGroup` returns
768
- * `ItemGroup<RedactedActivityData>`, and `RedactedActivityData` is an
769
- * index-signature type whose fields are all `unknown` — so its `question` is
770
- * not a `string` and it satisfies no per-type renderable, however the prop is
771
- * widened. Widening alone cannot fix this; a crossing point is required, and
772
- * having exactly one keeps `as unknown as` out of consumer code.
773
- *
774
- * ```tsx
775
- * const entries = await fetchExam(); // redacted, server-side
776
- * <ActivitySequence
777
- * activities={asRenderableSequence(entries)}
778
- * renderMode="exam" // REQUIRED: see below
779
- * shuffleSeed={attemptId}
780
- * onSubmit={persist}
781
- * />
782
- * ```
783
- *
784
- * Pass `renderMode="exam"` (or `"review"`). Redacted data has no answer key, and
785
- * almost every built-in activity throws at render in the default `practice`
786
- * mode rather than fail later: `<MultipleChoice>`, `<FillInTheBlanks>`,
787
- * `<GapSelect>` and `<Dictation>` because they grade locally, and
788
- * `<WrittenResponse>` because `practice` still runs its local submit path and
789
- * emits a practice-mode xAPI statement.
790
- *
791
- * `<ReadAloud>` is the exception and renders a projection in every mode: a
792
- * read-aloud item has no answer key to withhold, so `redact()` removes only the
793
- * authored feedback and leaves the reading, its language and its bounds — which
794
- * is everything the component puts on screen. It grades nothing locally either;
795
- * the grade comes back from whatever the application asked to judge the take.
796
- */
797
- declare function asRenderableSequence(entries: readonly (RedactedActivityData | RedactedItemGroupData)[]): readonly SequenceEntry<RenderableActivity>[];
798
- /** Structural shape of a `redactItemGroup()` projection, as it arrives from a server. */
799
- type RedactedItemGroupData = ItemGroup<RedactedActivityData> & {
800
- redacted: true;
801
- };
802
- /**
803
- * Every word the SDK's audio transport renders.
804
- *
805
- * Words, not characters: the `m:ss / m:ss` clock is digits and punctuation and
806
- * is formatted by the component, because it reads identically in every locale
807
- * this SDK targets. The scrubber's SPOKEN value does have a word in it and does
808
- * have a key ({@link MediaTransportStrings.timeValue}).
809
- *
810
- * Supply them to translate it. These are the highest-stakes strings on a
811
- * listening paper — "No plays remaining" decides whether a learner believes
812
- * they may try again — so shipping them as untranslatable English inside a
813
- * Spanish panel was not acceptable. Supplying any of them also sets `lang` on
814
- * the transport chrome, so a screen reader does not read the SDK's own words
815
- * with the passage's phonetics.
816
- */
817
- interface MediaTransportStrings {
818
- play: string;
819
- pause: string;
820
- preparing: string;
821
- mute: string;
822
- unmute: string;
823
- volume: string;
824
- speed: string;
825
- seek: string;
826
- /**
827
- * Spoken value of the scrubber, e.g. `('1:05', '4:30') => '1:05 of 4:30'`.
828
- * Takes ALREADY-FORMATTED `m:ss` strings: a translation should not have to
829
- * reimplement the clock to change the word between them.
830
- */
831
- timeValue: (elapsed: string, duration: string) => string;
832
- /** e.g. `(1, 2) => '1 of 2 plays remaining'`. */
833
- playsRemaining: (remaining: number, max: number) => string;
834
- noPlaysRemaining: string;
835
- /** Shown before the LAST play is spent, so a stray press cannot cost it. */
836
- lastPlayConfirm: string;
837
- lastPlayStart: string;
838
- lastPlayCancel: string;
839
- seekBlocked: string;
840
- rateBlocked: string;
841
- playFailed: string;
842
- }
843
- /**
844
- * Binds ONE media block to a play budget the consumer persists.
845
- *
846
- * The SDK refuses a play; it does not remember one. Everything durable here is
847
- * the consuming application's — see {@link SequenceMediaBudget.onPlayConsumed}.
848
- */
849
- interface MediaBudgetBinding {
850
- /** From `slotMediaKey(slotId)` / `stimulusMediaKey(slotId)` in lk-core. */
851
- key: string;
852
- /** Plays already spent, and where playback stood. Read at mount only. */
853
- entry?: MediaPlayLedgerEntry;
854
- /** Defaults to `renderMode !== 'review'`. An explicit boolean wins either way. */
855
- enforced?: boolean;
856
- /** Slot context stamped onto the claim and the interaction event. */
857
- slotId: string;
858
- index: number;
859
- activityId?: string;
860
- onPlayConsumed?: (claim: MediaPlayClaim) => undefined | Promise<MediaPlayGrant | undefined>;
861
- onPlayRefunded?: (claim: MediaPlayClaim) => void;
862
- onPosition?: (key: string, seconds: number) => void;
863
- /** Translations for the transport chrome. */
864
- strings?: Partial<MediaTransportStrings>;
865
- }
866
- /**
867
- * The pager-level half of a play budget. One prop, because it is one concept.
868
- */
869
- interface SequenceMediaBudget {
870
- /**
871
- * `MediaPlayLedger.entries` goes straight in. An absent key means nothing
872
- * spent. Read at mount, like `responses`.
873
- */
874
- plays?: Readonly<Record<string, MediaPlayLedgerEntry>>;
875
- /**
876
- * Re-seed token. Change this string and the budgets re-seed from `plays`
877
- * WITHOUT remounting the pager — the invigilator path ("the audio never
878
- * started, give her the play back") that would otherwise cost the learner
879
- * their focus, their scroll position and an unsaved answer.
880
- */
881
- resumeKey?: string;
882
- /** Explicit override of the default (`renderMode !== 'review'`). */
883
- enforced?: boolean;
884
- /**
885
- * Called the instant a play is claimed, BEFORE any audio is audible.
886
- *
887
- * Two tiers, chosen by what you return:
888
- *
889
- * - **Return nothing (optimistic).** Playback starts immediately and the
890
- * count is only as durable as your write. **Do not debounce this, and do
891
- * not batch it with the answer autosave** — an eight-second debounce is
892
- * exactly long enough to start a third play and hard-reload. A `pagehide`
893
- * beacon is a backstop, not the mechanism. A crash between this call and
894
- * your write landing RETURNS the play to the learner; that is the honest
895
- * description of what you are buying.
896
- * - **Return a promise (confirmed).** Playback is held — the button reads
897
- * "Preparing…" and is `aria-busy` — until it settles. Resolve with
898
- * `{ playsUsed }` from an ATOMIC server write (`UPDATE … SET plays = plays
899
- * + 1 … RETURNING plays`, or a compare-and-set on
900
- * `claim.previousPlaysUsed`). A resolved count above `maxPlays` refuses the
901
- * play, which is how a second tab is caught: two mounts both seeded at 0
902
- * both claim 1, and only an atomic increment can tell them apart. A
903
- * rejection charges nothing and lets the learner retry. This is the only
904
- * tier in which "consumed before audible" is true of storage rather than
905
- * only of memory; use it for summative papers.
906
- *
907
- * Never settle the promise and the learner cannot play at all: settle it.
908
- */
909
- onPlayConsumed?: (claim: MediaPlayClaim) => undefined | Promise<MediaPlayGrant | undefined>;
910
- /**
911
- * Called when a charged play produced no audio — the element errored before
912
- * playback advanced past 0.25 s, an expired signed URL being the realistic
913
- * cause. Supply it to give the play back, decrementing with a compare-and-set
914
- * on `claim.playsUsed`. Omit it and the play stays spent: the SDK will not
915
- * decrement a ledger it has no channel to correct.
916
- */
917
- onPlayRefunded?: (claim: MediaPlayClaim) => void;
918
- /**
919
- * Position reports, so a refresh resumes the play the learner already paid
920
- * for instead of charging them again. Fires on pause, on end (with 0), and at
921
- * most once per whole second of playback.
922
- *
923
- * **This one you MAY throttle** — the granularity you persist is the
924
- * granularity of the replay a crash grants. Three seconds is sane; three
925
- * minutes is not.
926
- */
927
- onPosition?: (key: string, seconds: number) => void;
928
- /** Translations for the transport chrome. Defaults are English. */
929
- strings?: Partial<MediaTransportStrings>;
930
- }
931
- /**
932
- * Which slot a recording belongs to, stamped on every call the pager makes.
933
- *
934
- * Exactly the shape {@link ActivitySequenceProps.onSubmit} already passes, so
935
- * one identity travels with the answer and with the take that answer points at
936
- * — and a consumer writes `slotId` in both places rather than reconciling two
937
- * spellings of "which question was this".
938
- */
939
- interface SequenceRecordingSlot {
940
- /** Identity from `flattenSequence` — stable under shuffling. Store against THIS. */
941
- slotId: string;
942
- /** Presented position, which moves under shuffling. */
943
- index: number;
944
- activityId: string;
945
- }
946
- /**
947
- * The pager-level half of a read-aloud recording binding: where every take in
948
- * this sequence is stored, and how a judgement comes back.
949
- *
950
- * One prop at both levels, because it is one concept — the media-budget
951
- * precedent ({@link SequenceMediaBudget} beside {@link MediaBudgetBinding}).
952
- * The difference is the second argument: a per-slot binding knows which slot it
953
- * belongs to, so a sequence-level one is told.
954
- *
955
- * The SDK records and hands over; it never judges. `assess` is `practice` only
956
- * and optional — a sequence that only stores takes gets the "assessment is not
957
- * available" notice rather than a throw — and `playbackUrl` is `review` only.
958
- * A slot whose activity is not a read-aloud never calls any of them.
959
- */
960
- interface SequenceRecordingBinding {
961
- /**
962
- * Puts the take in your storage and returns its key. **Required** outside
963
- * `review`: without it a learner can speak into a control that submits
964
- * nothing, which the component refuses to render. Settle it.
965
- */
966
- upload(take: RecordedTake, slot: SequenceRecordingSlot): Promise<RecordingRef>;
967
- /** Judges the stored take. `practice` only; an exam never assesses on the client. */
968
- assess?(ref: RecordingRef, slot: SequenceRecordingSlot): Promise<ReadAloudAssessResult>;
969
- /** A playable link to a stored take. `review` only. */
970
- playbackUrl?(ref: RecordingRef, slot: SequenceRecordingSlot): Promise<string>;
971
- }
972
-
973
- export { type ActivityProps as A, type CaptionSize as C, DEFAULT_STRINGS as D, type HtmlSanitizer as H, type LkStrings as L, type MediaBudgetBinding as M, type ReadAloudAssessResult as R, type SequenceMediaBudget as S, type VideoPreferences as V, type LkStringsOverride as a, type MediaTransportStrings as b, type ReadAloudProps as c, type RecordingBinding as d, type RenderMode as e, type Renderable as f, type RenderableActivity as g, type SequenceRecordingBinding as h, type SequenceRecordingSlot as i, asRenderable as j, asRenderableSequence as k, mergeStrings as m };