@intellectif/lk-react 23.1.0 → 23.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (360) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/README.md +9 -5
  3. package/dist/ActivityErrorBoundary-B379hvtL.cjs +39 -0
  4. package/dist/ActivityErrorBoundary-B379hvtL.cjs.map +1 -0
  5. package/dist/ActivityErrorBoundary-Dw6SbWv3.js +34 -0
  6. package/dist/ActivityErrorBoundary-Dw6SbWv3.js.map +1 -0
  7. package/dist/ActivityMedia-CQQTRNl7.cjs +641 -0
  8. package/dist/ActivityMedia-CQQTRNl7.cjs.map +1 -0
  9. package/dist/ActivityMedia-vDiP-Psa.js +636 -0
  10. package/dist/ActivityMedia-vDiP-Psa.js.map +1 -0
  11. package/dist/ActivityPreview-1hhTkYuj.js +240 -0
  12. package/dist/ActivityPreview-1hhTkYuj.js.map +1 -0
  13. package/dist/ActivityPreview-BKr34exz.cjs +245 -0
  14. package/dist/ActivityPreview-BKr34exz.cjs.map +1 -0
  15. package/dist/ActivitySequence-CkX87pfB.js +839 -0
  16. package/dist/ActivitySequence-CkX87pfB.js.map +1 -0
  17. package/dist/ActivitySequence-CmoSyDnp.cjs +844 -0
  18. package/dist/ActivitySequence-CmoSyDnp.cjs.map +1 -0
  19. package/dist/Dictation-BlxRp-3k.js +926 -0
  20. package/dist/Dictation-BlxRp-3k.js.map +1 -0
  21. package/dist/Dictation-jECzL88E.cjs +931 -0
  22. package/dist/Dictation-jECzL88E.cjs.map +1 -0
  23. package/dist/FeedbackRegion-BNNMtTY-.cjs +108 -0
  24. package/dist/FeedbackRegion-BNNMtTY-.cjs.map +1 -0
  25. package/dist/FeedbackRegion-CyPSp8bA.js +85 -0
  26. package/dist/FeedbackRegion-CyPSp8bA.js.map +1 -0
  27. package/dist/FillInTheBlanks-B6xzqYXx.js +474 -0
  28. package/dist/FillInTheBlanks-B6xzqYXx.js.map +1 -0
  29. package/dist/FillInTheBlanks-BpKhdHg2.cjs +479 -0
  30. package/dist/FillInTheBlanks-BpKhdHg2.cjs.map +1 -0
  31. package/dist/GapSelect-DUSiaEQH.js +441 -0
  32. package/dist/GapSelect-DUSiaEQH.js.map +1 -0
  33. package/dist/GapSelect-payTq_Zn.cjs +446 -0
  34. package/dist/GapSelect-payTq_Zn.cjs.map +1 -0
  35. package/dist/InteractiveVideo-BguGv-HA.cjs +2955 -0
  36. package/dist/InteractiveVideo-BguGv-HA.cjs.map +1 -0
  37. package/dist/InteractiveVideo-Cg2jbU3j.js +2944 -0
  38. package/dist/InteractiveVideo-Cg2jbU3j.js.map +1 -0
  39. package/dist/LkAiProvider-DAPpA3PQ.d.cts +84 -0
  40. package/dist/LkAiProvider-DAPpA3PQ.d.cts.map +1 -0
  41. package/dist/LkAiProvider-QdEcIhoo.d.ts +84 -0
  42. package/dist/LkAiProvider-QdEcIhoo.d.ts.map +1 -0
  43. package/dist/LkIntlProvider-D_FdYXjQ.js +375 -0
  44. package/dist/LkIntlProvider-D_FdYXjQ.js.map +1 -0
  45. package/dist/LkIntlProvider-oi57lYB0.cjs +410 -0
  46. package/dist/LkIntlProvider-oi57lYB0.cjs.map +1 -0
  47. package/dist/MultipleChoice-COn5MtKY.cjs +433 -0
  48. package/dist/MultipleChoice-COn5MtKY.cjs.map +1 -0
  49. package/dist/MultipleChoice-Dra0_KYD.js +428 -0
  50. package/dist/MultipleChoice-Dra0_KYD.js.map +1 -0
  51. package/dist/PronunciationFeedback-DlMPGjkR.cjs +831 -0
  52. package/dist/PronunciationFeedback-DlMPGjkR.cjs.map +1 -0
  53. package/dist/PronunciationFeedback-Dxd6XPkO.js +772 -0
  54. package/dist/PronunciationFeedback-Dxd6XPkO.js.map +1 -0
  55. package/dist/ReadAloud-C8RhaUqV.js +1092 -0
  56. package/dist/{chunk-DC4CQCK5.js.map → ReadAloud-C8RhaUqV.js.map} +1 -1
  57. package/dist/ReadAloud-akDehitT.cjs +1103 -0
  58. package/dist/ReadAloud-akDehitT.cjs.map +1 -0
  59. package/dist/StimulusPanel-BgzByfkb.js +74 -0
  60. package/dist/StimulusPanel-BgzByfkb.js.map +1 -0
  61. package/dist/StimulusPanel-b66gaN3i.cjs +79 -0
  62. package/dist/StimulusPanel-b66gaN3i.cjs.map +1 -0
  63. package/dist/ThemeProvider-B6DyGqzh.d.cts +62 -0
  64. package/dist/ThemeProvider-B6DyGqzh.d.cts.map +1 -0
  65. package/dist/ThemeProvider-BCrxBaY-.d.ts +62 -0
  66. package/dist/ThemeProvider-BCrxBaY-.d.ts.map +1 -0
  67. package/dist/ThemeProvider-BRN1tj4n.cjs +187 -0
  68. package/dist/ThemeProvider-BRN1tj4n.cjs.map +1 -0
  69. package/dist/ThemeProvider-C7K9iMLX.js +158 -0
  70. package/dist/ThemeProvider-C7K9iMLX.js.map +1 -0
  71. package/dist/WrittenResponse-Bj3eFmGl.cjs +491 -0
  72. package/dist/WrittenResponse-Bj3eFmGl.cjs.map +1 -0
  73. package/dist/WrittenResponse-Cl8G6nO_.js +486 -0
  74. package/dist/WrittenResponse-Cl8G6nO_.js.map +1 -0
  75. package/dist/ai/LkAiProvider.cjs +34 -14
  76. package/dist/ai/LkAiProvider.cjs.map +1 -1
  77. package/dist/ai/LkAiProvider.d.cts +2 -83
  78. package/dist/ai/LkAiProvider.d.ts +2 -83
  79. package/dist/ai/LkAiProvider.js +33 -2
  80. package/dist/ai/LkAiProvider.js.map +1 -1
  81. package/dist/ai/useAiHelp.cjs +7 -25
  82. package/dist/ai/useAiHelp.d.cts +175 -177
  83. package/dist/ai/useAiHelp.d.cts.map +1 -0
  84. package/dist/ai/useAiHelp.d.ts +175 -177
  85. package/dist/ai/useAiHelp.d.ts.map +1 -0
  86. package/dist/ai/useAiHelp.js +3 -4
  87. package/dist/components/ActivityPreview.cjs +3 -29
  88. package/dist/components/ActivityPreview.d.cts +2 -81
  89. package/dist/components/ActivityPreview.d.ts +2 -81
  90. package/dist/components/ActivityPreview.js +2 -20
  91. package/dist/components/ActivitySequence.cjs +3 -30
  92. package/dist/components/ActivitySequence.d.cts +2 -432
  93. package/dist/components/ActivitySequence.d.ts +2 -432
  94. package/dist/components/ActivitySequence.js +2 -21
  95. package/dist/components/Dictation.cjs +4 -21
  96. package/dist/components/Dictation.d.cts +2 -19
  97. package/dist/components/Dictation.d.ts +2 -19
  98. package/dist/components/Dictation.js +3 -12
  99. package/dist/components/FillInTheBlanks.cjs +4 -20
  100. package/dist/components/FillInTheBlanks.d.cts +2 -30
  101. package/dist/components/FillInTheBlanks.d.ts +2 -30
  102. package/dist/components/FillInTheBlanks.js +3 -11
  103. package/dist/components/GapSelect.cjs +4 -20
  104. package/dist/components/GapSelect.d.cts +2 -27
  105. package/dist/components/GapSelect.d.ts +2 -27
  106. package/dist/components/GapSelect.js +3 -11
  107. package/dist/components/InteractiveVideo.cjs +5 -32
  108. package/dist/components/InteractiveVideo.d.cts +3 -291
  109. package/dist/components/InteractiveVideo.d.ts +3 -291
  110. package/dist/components/InteractiveVideo.js +3 -19
  111. package/dist/components/MultipleChoice.cjs +4 -20
  112. package/dist/components/MultipleChoice.d.cts +2 -26
  113. package/dist/components/MultipleChoice.d.ts +2 -26
  114. package/dist/components/MultipleChoice.js +3 -11
  115. package/dist/components/PronunciationFeedback.cjs +4 -17
  116. package/dist/components/PronunciationFeedback.d.cts +2 -90
  117. package/dist/components/PronunciationFeedback.d.ts +2 -90
  118. package/dist/components/PronunciationFeedback.js +3 -8
  119. package/dist/components/ReadAloud.cjs +4 -22
  120. package/dist/components/ReadAloud.d.cts +7 -11
  121. package/dist/components/ReadAloud.d.cts.map +1 -0
  122. package/dist/components/ReadAloud.d.ts +7 -11
  123. package/dist/components/ReadAloud.d.ts.map +1 -0
  124. package/dist/components/ReadAloud.js +3 -13
  125. package/dist/components/StimulusPanel.cjs +3 -14
  126. package/dist/components/StimulusPanel.d.cts +2 -51
  127. package/dist/components/StimulusPanel.d.ts +2 -51
  128. package/dist/components/StimulusPanel.js +2 -5
  129. package/dist/components/WrittenResponse.cjs +4 -19
  130. package/dist/components/WrittenResponse.d.cts +3 -18
  131. package/dist/components/WrittenResponse.d.ts +3 -18
  132. package/dist/components/WrittenResponse.js +3 -10
  133. package/dist/direction-Dq0_HtA5.js +183 -0
  134. package/dist/direction-Dq0_HtA5.js.map +1 -0
  135. package/dist/direction-K1pj0HCA.cjs +200 -0
  136. package/dist/direction-K1pj0HCA.cjs.map +1 -0
  137. package/dist/hooks/useActivityState.cjs +28 -10
  138. package/dist/hooks/useActivityState.cjs.map +1 -1
  139. package/dist/hooks/useActivityState.d.cts +25 -24
  140. package/dist/hooks/useActivityState.d.cts.map +1 -0
  141. package/dist/hooks/useActivityState.d.ts +25 -24
  142. package/dist/hooks/useActivityState.d.ts.map +1 -0
  143. package/dist/hooks/useActivityState.js +28 -2
  144. package/dist/hooks/useActivityState.js.map +1 -1
  145. package/dist/hooks/useSpeechRecorder.cjs +5 -16
  146. package/dist/hooks/useSpeechRecorder.d.cts +2 -127
  147. package/dist/hooks/useSpeechRecorder.d.ts +2 -127
  148. package/dist/hooks/useSpeechRecorder.js +3 -3
  149. package/dist/hooks/useXAPI.cjs +126 -10
  150. package/dist/hooks/useXAPI.cjs.map +1 -1
  151. package/dist/hooks/useXAPI.d.cts +14 -14
  152. package/dist/hooks/useXAPI.d.cts.map +1 -0
  153. package/dist/hooks/useXAPI.d.ts +14 -14
  154. package/dist/hooks/useXAPI.d.ts.map +1 -0
  155. package/dist/hooks/useXAPI.js +126 -2
  156. package/dist/hooks/useXAPI.js.map +1 -1
  157. package/dist/i18n/LkIntlProvider.cjs +9 -32
  158. package/dist/i18n/LkIntlProvider.d.cts +34 -38
  159. package/dist/i18n/LkIntlProvider.d.cts.map +1 -0
  160. package/dist/i18n/LkIntlProvider.d.ts +34 -38
  161. package/dist/i18n/LkIntlProvider.d.ts.map +1 -0
  162. package/dist/i18n/LkIntlProvider.js +3 -3
  163. package/dist/index-6P4rJHrJ.d.cts +432 -0
  164. package/dist/index-6P4rJHrJ.d.cts.map +1 -0
  165. package/dist/index-90CX504k.d.ts +90 -0
  166. package/dist/index-90CX504k.d.ts.map +1 -0
  167. package/dist/index-B_SgnjsC.d.cts +291 -0
  168. package/dist/index-B_SgnjsC.d.cts.map +1 -0
  169. package/dist/index-BavVW5z5.d.cts +25 -0
  170. package/dist/index-BavVW5z5.d.cts.map +1 -0
  171. package/dist/index-BhHv6Fiu.d.cts +28 -0
  172. package/dist/index-BhHv6Fiu.d.cts.map +1 -0
  173. package/dist/index-Bsu8VciA.d.ts +432 -0
  174. package/dist/index-Bsu8VciA.d.ts.map +1 -0
  175. package/dist/index-C1KGpD1k.d.ts +49 -0
  176. package/dist/index-C1KGpD1k.d.ts.map +1 -0
  177. package/dist/index-CKTpYTCC.d.cts +49 -0
  178. package/dist/index-CKTpYTCC.d.cts.map +1 -0
  179. package/dist/index-CO_SRFJj.d.ts +16 -0
  180. package/dist/index-CO_SRFJj.d.ts.map +1 -0
  181. package/dist/index-CSsuUsP7.d.cts +124 -0
  182. package/dist/index-CSsuUsP7.d.cts.map +1 -0
  183. package/dist/index-CunUyeuN.d.cts +78 -0
  184. package/dist/index-CunUyeuN.d.cts.map +1 -0
  185. package/dist/index-CzfRzks6.d.cts +90 -0
  186. package/dist/index-CzfRzks6.d.cts.map +1 -0
  187. package/dist/index-D14xtpBS.d.cts +24 -0
  188. package/dist/index-D14xtpBS.d.cts.map +1 -0
  189. package/dist/index-DHRPAPZf.d.ts +291 -0
  190. package/dist/index-DHRPAPZf.d.ts.map +1 -0
  191. package/dist/index-DLV6cK26.d.cts +16 -0
  192. package/dist/index-DLV6cK26.d.cts.map +1 -0
  193. package/dist/index-DbCCQ9cP.d.ts +124 -0
  194. package/dist/index-DbCCQ9cP.d.ts.map +1 -0
  195. package/dist/index-DeV5B2m5.d.ts +24 -0
  196. package/dist/index-DeV5B2m5.d.ts.map +1 -0
  197. package/dist/index-TZCJVSge.d.ts +28 -0
  198. package/dist/index-TZCJVSge.d.ts.map +1 -0
  199. package/dist/index-ZVvLHsd3.d.ts +25 -0
  200. package/dist/index-ZVvLHsd3.d.ts.map +1 -0
  201. package/dist/index-eQwBgpSw.d.ts +78 -0
  202. package/dist/index-eQwBgpSw.d.ts.map +1 -0
  203. package/dist/index.cjs +118 -163
  204. package/dist/index.cjs.map +1 -1
  205. package/dist/index.d.cts +20 -24
  206. package/dist/index.d.ts +20 -24
  207. package/dist/index.js +84 -29
  208. package/dist/index.js.map +1 -1
  209. package/dist/theme/ThemeProvider.cjs +8 -28
  210. package/dist/theme/ThemeProvider.d.cts +2 -59
  211. package/dist/theme/ThemeProvider.d.ts +2 -59
  212. package/dist/theme/ThemeProvider.js +3 -3
  213. package/dist/tries-CbbtZkdG.cjs +363 -0
  214. package/dist/tries-CbbtZkdG.cjs.map +1 -0
  215. package/dist/tries-DTHSrLCm.js +310 -0
  216. package/dist/tries-DTHSrLCm.js.map +1 -0
  217. package/dist/types-BOQd93x3.d.cts +994 -0
  218. package/dist/types-BOQd93x3.d.cts.map +1 -0
  219. package/dist/types-HIrgF_mS.d.ts +994 -0
  220. package/dist/types-HIrgF_mS.d.ts.map +1 -0
  221. package/dist/useAiHelp-B-ccDL5Q.js +906 -0
  222. package/dist/useAiHelp-B-ccDL5Q.js.map +1 -0
  223. package/dist/useAiHelp-h9yOLFqt.cjs +995 -0
  224. package/dist/useAiHelp-h9yOLFqt.cjs.map +1 -0
  225. package/dist/useSpeechRecorder--O_f-xvt.cjs +720 -0
  226. package/dist/useSpeechRecorder--O_f-xvt.cjs.map +1 -0
  227. package/dist/useSpeechRecorder-DtAYvl02.d.cts +154 -0
  228. package/dist/useSpeechRecorder-DtAYvl02.d.cts.map +1 -0
  229. package/dist/useSpeechRecorder-DtAYvl02.d.ts +154 -0
  230. package/dist/useSpeechRecorder-DtAYvl02.d.ts.map +1 -0
  231. package/dist/useSpeechRecorder-zIi9Dlw8.js +709 -0
  232. package/dist/useSpeechRecorder-zIi9Dlw8.js.map +1 -0
  233. package/package.json +10 -11
  234. package/dist/WrittenResponse-B7A5gHMj.d.ts +0 -115
  235. package/dist/WrittenResponse-BpL9p2Hn.d.cts +0 -115
  236. package/dist/ai/useAiHelp.cjs.map +0 -1
  237. package/dist/ai/useAiHelp.js.map +0 -1
  238. package/dist/chunk-2PNSVBLQ.cjs +0 -54
  239. package/dist/chunk-2PNSVBLQ.cjs.map +0 -1
  240. package/dist/chunk-2TW6WLBC.js +0 -80
  241. package/dist/chunk-2TW6WLBC.js.map +0 -1
  242. package/dist/chunk-4ZZWZSWI.js +0 -61
  243. package/dist/chunk-4ZZWZSWI.js.map +0 -1
  244. package/dist/chunk-6N43WDVG.js +0 -29
  245. package/dist/chunk-6N43WDVG.js.map +0 -1
  246. package/dist/chunk-7ALBSPYR.cjs +0 -436
  247. package/dist/chunk-7ALBSPYR.cjs.map +0 -1
  248. package/dist/chunk-7NFY3M3W.js +0 -234
  249. package/dist/chunk-7NFY3M3W.js.map +0 -1
  250. package/dist/chunk-7SB2MJA4.js +0 -29
  251. package/dist/chunk-7SB2MJA4.js.map +0 -1
  252. package/dist/chunk-ABJJ3LII.js +0 -434
  253. package/dist/chunk-ABJJ3LII.js.map +0 -1
  254. package/dist/chunk-BIGGXHAW.cjs +0 -342
  255. package/dist/chunk-BIGGXHAW.cjs.map +0 -1
  256. package/dist/chunk-C7QZE5BI.js +0 -430
  257. package/dist/chunk-C7QZE5BI.js.map +0 -1
  258. package/dist/chunk-CWTUWNV3.cjs +0 -2937
  259. package/dist/chunk-CWTUWNV3.cjs.map +0 -1
  260. package/dist/chunk-DC4CQCK5.js +0 -915
  261. package/dist/chunk-DS6HN3YR.cjs +0 -496
  262. package/dist/chunk-DS6HN3YR.cjs.map +0 -1
  263. package/dist/chunk-FDQR4GAZ.js +0 -240
  264. package/dist/chunk-FDQR4GAZ.js.map +0 -1
  265. package/dist/chunk-FKGMSOJF.js +0 -394
  266. package/dist/chunk-FKGMSOJF.js.map +0 -1
  267. package/dist/chunk-G6PXJ2SA.js +0 -823
  268. package/dist/chunk-G6PXJ2SA.js.map +0 -1
  269. package/dist/chunk-HNLRVRQR.js +0 -335
  270. package/dist/chunk-HNLRVRQR.js.map +0 -1
  271. package/dist/chunk-J3C72RPK.cjs +0 -31
  272. package/dist/chunk-J3C72RPK.cjs.map +0 -1
  273. package/dist/chunk-K63VPFOV.cjs +0 -134
  274. package/dist/chunk-K63VPFOV.cjs.map +0 -1
  275. package/dist/chunk-KFLIDTDU.cjs +0 -825
  276. package/dist/chunk-KFLIDTDU.cjs.map +0 -1
  277. package/dist/chunk-KHKH5LCT.cjs +0 -250
  278. package/dist/chunk-KHKH5LCT.cjs.map +0 -1
  279. package/dist/chunk-LBEKRN6Y.cjs +0 -664
  280. package/dist/chunk-LBEKRN6Y.cjs.map +0 -1
  281. package/dist/chunk-LPUWXIPR.cjs +0 -578
  282. package/dist/chunk-LPUWXIPR.cjs.map +0 -1
  283. package/dist/chunk-MCO52PV5.js +0 -520
  284. package/dist/chunk-MCO52PV5.js.map +0 -1
  285. package/dist/chunk-MKXEM2C5.cjs +0 -396
  286. package/dist/chunk-MKXEM2C5.cjs.map +0 -1
  287. package/dist/chunk-MXNC5UNO.js +0 -563
  288. package/dist/chunk-MXNC5UNO.js.map +0 -1
  289. package/dist/chunk-NAK55BYU.cjs +0 -859
  290. package/dist/chunk-NAK55BYU.cjs.map +0 -1
  291. package/dist/chunk-NDBMKGQ5.cjs +0 -599
  292. package/dist/chunk-NDBMKGQ5.cjs.map +0 -1
  293. package/dist/chunk-OD65OZIW.cjs +0 -159
  294. package/dist/chunk-OD65OZIW.cjs.map +0 -1
  295. package/dist/chunk-ORT3KLGI.js +0 -50
  296. package/dist/chunk-ORT3KLGI.js.map +0 -1
  297. package/dist/chunk-PNNUPUH4.cjs +0 -82
  298. package/dist/chunk-PNNUPUH4.cjs.map +0 -1
  299. package/dist/chunk-PWHECW6N.js +0 -2934
  300. package/dist/chunk-PWHECW6N.js.map +0 -1
  301. package/dist/chunk-RBS5A2DF.js +0 -857
  302. package/dist/chunk-RBS5A2DF.js.map +0 -1
  303. package/dist/chunk-RPWUDXG5.cjs +0 -63
  304. package/dist/chunk-RPWUDXG5.cjs.map +0 -1
  305. package/dist/chunk-TCDJY3H6.js +0 -494
  306. package/dist/chunk-TCDJY3H6.js.map +0 -1
  307. package/dist/chunk-TP5UMRAU.cjs +0 -918
  308. package/dist/chunk-TP5UMRAU.cjs.map +0 -1
  309. package/dist/chunk-TS7J6DTY.js +0 -597
  310. package/dist/chunk-TS7J6DTY.js.map +0 -1
  311. package/dist/chunk-TUVENMXB.cjs +0 -20
  312. package/dist/chunk-TUVENMXB.cjs.map +0 -1
  313. package/dist/chunk-UDCQTOVU.cjs +0 -523
  314. package/dist/chunk-UDCQTOVU.cjs.map +0 -1
  315. package/dist/chunk-UHKZXOXD.js +0 -128
  316. package/dist/chunk-UHKZXOXD.js.map +0 -1
  317. package/dist/chunk-V6BA44DS.cjs +0 -236
  318. package/dist/chunk-V6BA44DS.cjs.map +0 -1
  319. package/dist/chunk-XO5R73Y4.js +0 -653
  320. package/dist/chunk-XO5R73Y4.js.map +0 -1
  321. package/dist/chunk-XOR4MPEN.cjs +0 -31
  322. package/dist/chunk-XOR4MPEN.cjs.map +0 -1
  323. package/dist/chunk-YORQQXGO.js +0 -155
  324. package/dist/chunk-YORQQXGO.js.map +0 -1
  325. package/dist/chunk-YY4PFR3Z.cjs +0 -432
  326. package/dist/chunk-YY4PFR3Z.cjs.map +0 -1
  327. package/dist/chunk-ZPI6Q42R.js +0 -17
  328. package/dist/chunk-ZPI6Q42R.js.map +0 -1
  329. package/dist/components/ActivityPreview.cjs.map +0 -1
  330. package/dist/components/ActivityPreview.js.map +0 -1
  331. package/dist/components/ActivitySequence.cjs.map +0 -1
  332. package/dist/components/ActivitySequence.js.map +0 -1
  333. package/dist/components/Dictation.cjs.map +0 -1
  334. package/dist/components/Dictation.js.map +0 -1
  335. package/dist/components/FillInTheBlanks.cjs.map +0 -1
  336. package/dist/components/FillInTheBlanks.js.map +0 -1
  337. package/dist/components/GapSelect.cjs.map +0 -1
  338. package/dist/components/GapSelect.js.map +0 -1
  339. package/dist/components/InteractiveVideo.cjs.map +0 -1
  340. package/dist/components/InteractiveVideo.js.map +0 -1
  341. package/dist/components/MultipleChoice.cjs.map +0 -1
  342. package/dist/components/MultipleChoice.js.map +0 -1
  343. package/dist/components/PronunciationFeedback.cjs.map +0 -1
  344. package/dist/components/PronunciationFeedback.js.map +0 -1
  345. package/dist/components/ReadAloud.cjs.map +0 -1
  346. package/dist/components/ReadAloud.js.map +0 -1
  347. package/dist/components/StimulusPanel.cjs.map +0 -1
  348. package/dist/components/StimulusPanel.js.map +0 -1
  349. package/dist/components/WrittenResponse.cjs.map +0 -1
  350. package/dist/components/WrittenResponse.js.map +0 -1
  351. package/dist/hooks/useSpeechRecorder.cjs.map +0 -1
  352. package/dist/hooks/useSpeechRecorder.js.map +0 -1
  353. package/dist/i18n/LkIntlProvider.cjs.map +0 -1
  354. package/dist/i18n/LkIntlProvider.js.map +0 -1
  355. package/dist/machine-CuwKqWXC.d.cts +0 -26
  356. package/dist/machine-CuwKqWXC.d.ts +0 -26
  357. package/dist/theme/ThemeProvider.cjs.map +0 -1
  358. package/dist/theme/ThemeProvider.js.map +0 -1
  359. package/dist/types-C4IsUQsK.d.ts +0 -989
  360. package/dist/types-CJgZWtl4.d.cts +0 -989
@@ -1,989 +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
- /** The button that asks for coaching on a graded reading aloud. */
460
- aiCoaching: string;
461
- /** The same button while the coaching is being written. */
462
- aiCoachingLoading: string;
463
- /** The heading over coaching on a reading, and its accessible name. */
464
- aiCoachingHeading: string;
465
- /** When no coaching can be shown: the port failed, or its coaching was refused. */
466
- aiCoachingUnavailable: string;
467
- /** The accessible name of the list of words the coaching works on. */
468
- aiCoachingWords: string;
469
- /**
470
- * The sound a tip is about, as the speech engine spelt it — in the alphabet
471
- * it reported, usually IPA — and, when the engine said so, what it was heard
472
- * as instead.
473
- */
474
- aiCoachingSound: (expected: string, heard: string | undefined) => string;
475
- /**
476
- * The listening-paper transport. Shipped in 0.8.0 as its own `mediaStrings`
477
- * prop, which still works — this is the same shape, reachable from the one
478
- * provider so a consumer does not wire two mechanisms.
479
- */
480
- media: MediaTransportStrings;
481
- }
482
- /** A partial override, nested one level for {@link LkStrings.media}. */
483
- type LkStringsOverride = Partial<Omit<LkStrings, 'media' | 'stimulusKind'>> & {
484
- media?: Partial<MediaTransportStrings>;
485
- stimulusKind?: Partial<Record<Stimulus['kind'], string>>;
486
- };
487
- /**
488
- * English defaults, byte-identical to what every component rendered before the
489
- * strings surface existed. Supplying no override changes nothing on screen.
490
- */
491
- declare const DEFAULT_STRINGS: LkStrings;
492
- /**
493
- * Layers an override onto a base dictionary.
494
- *
495
- * Two levels deep and no further, because the shape is two levels deep. A
496
- * generic deep merge would silently accept a nested object where a function
497
- * belongs and fail at render instead of at the call site.
498
- */
499
- declare function mergeStrings(base: LkStrings, override?: LkStringsOverride): LkStrings;
500
-
501
- /**
502
- * What an application's assessor came back with.
503
- *
504
- * `code` is a plain `string` and not `SpeechUnscorableCode`: an application's
505
- * own assessor may refuse a take for a reason the SDK has no name for, and a
506
- * narrower type would make it unreportable. This component classifies the two
507
- * codes that mean "nothing was heard" and treats every other one the same way.
508
- */
509
- type ReadAloudAssessResult = {
510
- status: 'graded';
511
- assessment: SpeechAssessment;
512
- grade: GradeRecord;
513
- } | {
514
- status: 'unscorable';
515
- code: string;
516
- assessment?: SpeechAssessment;
517
- } | {
518
- status: 'failed';
519
- retryable: boolean;
520
- };
521
- /**
522
- * How a take reaches the application, and how a judgement comes back.
523
- *
524
- * Named `recordingBinding` rather than `recording` because both
525
- * `ReadAloudData.recording` (the bounds) and `ReadAloudLearnerResponse.recording`
526
- * (the stored take) already exist: the plain name would read as one of those.
527
- */
528
- interface RecordingBinding {
529
- /**
530
- * Puts the take in your storage and returns its key. **Required** outside
531
- * `review`: without it a learner can speak into a control that submits
532
- * nothing. Settle it — a promise that never does leaves the submit pending
533
- * for ever.
534
- */
535
- upload(take: RecordedTake): Promise<RecordingRef>;
536
- /**
537
- * Judges the stored take. `practice` only — an exam never assesses on the
538
- * client. Optional: a binding without it records, uploads and submits, and
539
- * the feedback is replaced by a notice.
540
- */
541
- assess?(ref: RecordingRef): Promise<ReadAloudAssessResult>;
542
- /** A playable link to a stored take. `review` only. */
543
- playbackUrl?(ref: RecordingRef): Promise<string>;
544
- }
545
- interface ReadAloudProps extends ActivityProps<ReadAloudData> {
546
- /** How a take is stored and judged. See {@link RecordingBinding}. */
547
- recordingBinding?: RecordingBinding;
548
- /**
549
- * The evidence behind a stored grade, for `review`. Without it a graded
550
- * outcome still shows its marks, rebuilt from `outcome.grade.details`; with
551
- * neither, the score is shown and no marks are.
552
- */
553
- assessment?: SpeechAssessment;
554
- /**
555
- * Confidence above which a break note is shown, 0..1, forwarded to
556
- * {@link PronunciationFeedback}. No default — see its own prop.
557
- */
558
- breakThreshold?: number;
559
- /** The same, for the monotone note. */
560
- monotoneThreshold?: number;
561
- /**
562
- * The URL of a self-hosted copy of `CAPTURE_PROCESSOR_SOURCE`, handed to the
563
- * recorder, for a Content-Security-Policy whose `script-src` does not allow
564
- * `blob:`. Without it the capture module is loaded from a `blob:` URL, and a
565
- * policy that refuses one sends every take through the deprecated
566
- * main-thread `ScriptProcessorNode` — a take that still records, so nothing
567
- * says so. See `useSpeechRecorder`'s option of the same name.
568
- */
569
- workletUrl?: string;
570
- /**
571
- * Never called. A read-aloud answer is a key in your storage, and there is
572
- * none until the take has been uploaded — so there is no intermediate
573
- * response to report, and reporting the take itself would offer a host a
574
- * recording it has nowhere to put. `onSubmit` carries the response, once.
575
- */
576
- onChange?: (response: LearnerResponse) => void;
577
- }
578
-
579
- /**
580
- * How an activity is being presented. This is the single switch that decides
581
- * whether the component may grade, reveal, or submit — the three things a
582
- * summative exam must take away from the client.
583
- *
584
- * - `practice` (default, and the only behaviour before `renderMode` existed):
585
- * the component owns the attempt. It
586
- * scores locally on submit, reveals correctness and feedback, and calls
587
- * `onComplete` with a full {@link ActivityResult}.
588
- * - `exam`: the component NEVER scores and NEVER reveals correctness. Submit
589
- * emits the raw learner response through `onSubmit`; the server grades it.
590
- * Safe to render redacted data, because nothing here needs the answer key.
591
- * - `review`: read-only. Renders the learner's submitted answer, and marks
592
- * correctness only from an `outcome` the caller supplies (which the server
593
- * computed). Nothing is submittable.
594
- */
595
- type RenderMode = 'practice' | 'exam' | 'review';
596
- /**
597
- * Makes the answer-key-bearing parts of an activity optional, so a component
598
- * can render either full activity data OR a `redact()` projection with the
599
- * same props. Fields the SDK classifies `answer-key` become optional here;
600
- * a component in `exam` mode must not read them at all.
601
- */
602
- type Renderable<TData> = Omit<TData, 'scoringStrategy'> & {
603
- scoringStrategy?: unknown;
604
- /** Present on a `redact()` projection. */
605
- redacted?: true;
606
- };
607
- /**
608
- * {@link Renderable} DISTRIBUTED over a union of activity types.
609
- *
610
- * This distinction is load-bearing, not cosmetic. `Renderable<T>` is built on
611
- * `Omit`, and `Omit` does not distribute: `Omit<A | B, K>` collapses to the
612
- * keys A and B have IN COMMON, so `Renderable<ActivityData>` is a single
613
- * object type carrying only the fields every activity shares. Narrowing it
614
- * dies with it — after `if (data.type === 'multiple-choice')` the compiler
615
- * still refuses `data.options`, because the union it would narrow to no
616
- * longer exists.
617
- *
618
- * The conditional below re-distributes, so `RenderableActivity` is a real
619
- * union of per-type renderables and `.type` narrows again. Anything that
620
- * accepts "some renderable activity, I don't know which" — a custom renderer,
621
- * a sequence entry — must use THIS, not `Renderable<ActivityData>`.
622
- */
623
- type RenderableActivity<TData extends ActivityData = ActivityData> = TData extends unknown ? Renderable<TData> : never;
624
- /**
625
- * Sanitiser for author-supplied rich text (`questionHtml`, `promptHtml`, and a
626
- * stimulus's `bodyHtml`). The SDK deliberately ships NO sanitiser — that would
627
- * add a dependency and, worse, a false promise. Rich text is rendered only when
628
- * you supply this function; without it the component falls back to the
629
- * plain-text field, which is always escaped. Fail-safe by construction: the SDK
630
- * never injects HTML it was not explicitly given a sanitiser for.
631
- *
632
- * `FillInTheBlanks.passageHtml` is the one exception, and is **never**
633
- * rendered: the passage hosts the answer inputs, so it cannot be split at the
634
- * `{{blank}}` placeholders without voiding the sanitiser. The plain `passage`
635
- * is always used, and passing `passageHtml` warns in development.
636
- */
637
- type HtmlSanitizer = (html: string) => string;
638
- /**
639
- * The prop contract shared by every activity component (Req 3.1). Defined
640
- * here (React-specific) rather than in lk-core, which is React-free.
641
- *
642
- * Controlled / uncontrolled follows the React convention: pass `value` +
643
- * `onChange` to own the learner's answer (restore an in-progress attempt,
644
- * autosave a delta, drive a review); pass `defaultValue` to seed an
645
- * uncontrolled component; pass neither to keep the pre-2.1.0 behaviour, where
646
- * the component owns the answer outright.
647
- */
648
- interface ActivityProps<TData extends ActivityData = ActivityData> {
649
- /** Activity content. Accepts a `redact()` projection in `exam` mode. */
650
- data: RenderableActivity<TData>;
651
- /**
652
- * Called when the component scored the attempt itself. Only ever fires in
653
- * `practice` mode — in `exam` mode the client does not grade, so there is
654
- * no `ActivityResult` to give you; use `onSubmit`.
655
- */
656
- onComplete?: (result: ActivityResult) => void;
657
- /**
658
- * Called on submit with the raw learner response and no grade. Fires in
659
- * every mode, before `onComplete`, so an exam runner can persist the
660
- * response and let the server score it.
661
- */
662
- onSubmit?: (response: LearnerResponse) => void;
663
- /** Controlled value: the learner's current response. */
664
- value?: LearnerResponse;
665
- /** Initial response for an uncontrolled component (ignored when `value` is set). */
666
- defaultValue?: LearnerResponse;
667
- /**
668
- * Mount the component as already submitted — read at mount only, like any
669
- * `default*` prop.
670
- *
671
- * Restoring an attempt without it reopens a question the learner had already
672
- * submitted as answerable, so on a summative paper they can change and
673
- * re-submit it. `AttemptState.submittedSlotIds` is what this consumes.
674
- */
675
- defaultSubmitted?: boolean;
676
- /** Fires on every change to the learner's response. Required for a controlled component. */
677
- onChange?: (response: LearnerResponse) => void;
678
- /** Presentation mode. Defaults to `practice`. */
679
- renderMode?: RenderMode;
680
- /**
681
- * Server-computed outcome, used by `review` mode to mark correctness
682
- * without the client ever scoring. Ignored in other modes.
683
- */
684
- outcome?: ItemOutcome;
685
- /** Renders author-supplied rich text when provided. See {@link HtmlSanitizer}. */
686
- sanitizeHtml?: HtmlSanitizer;
687
- /**
688
- * Binds this activity's own `data.media` to a play budget the consumer
689
- * persists. Usually supplied by `<ActivitySequence mediaBudget={…}>`; pass it
690
- * yourself when rendering an activity standalone.
691
- */
692
- mediaBudget?: MediaBudgetBinding;
693
- /** Translations for the audio transport chrome. See {@link MediaTransportStrings}. */
694
- mediaStrings?: Partial<MediaTransportStrings>;
695
- /**
696
- * Overrides the SDK's chrome text for this activity, layered on whatever
697
- * `LkIntlProvider` supplies. `mediaStrings` still works and is merged after
698
- * this, so an existing 0.8.x call site keeps behaving as it did.
699
- */
700
- strings?: LkStringsOverride;
701
- onInteraction?: (event: InteractionEvent) => void;
702
- /**
703
- * The host's AI ports for this activity — an explanation after grading, hints
704
- * before submit — overriding `LkAiProvider`'s. Leave a port out to switch
705
- * that help off. Nothing AI appears in `exam`, and an item whose author
706
- * switched a feature off (`data.ai`) never shows it. See {@link LearnerAi}.
707
- */
708
- ai?: LearnerAi;
709
- /**
710
- * What the school running this paper lets a learner see: feedback,
711
- * solutions, hints, and AI help. Every setting only takes something away
712
- * from what the mode shows, and an absent policy takes nothing away. Inside
713
- * `<ActivitySequence>` or `<InteractiveVideo>`, the paper's own policy holds
714
- * as well, whichever is stricter. See `DeliveryPolicy` in lk-core.
715
- */
716
- delivery?: DeliveryPolicy | null;
717
- /**
718
- * How this question is scored when the learner can try again or ask for
719
- * hints: how many tries, which counts, what tries and hints cost. Applies in
720
- * `practice`, where the component grades — `<MultipleChoice>`,
721
- * `<FillInTheBlanks>`, `<GapSelect>` and `<Dictation>`. `<ReadAloud>` takes
722
- * the prop and ignores it: its tries are its own `recording.maxTakes`, and
723
- * its grade comes from your assessor, not from the component. Inside
724
- * `<ActivitySequence>` or `<InteractiveVideo>`, the paper's own policy wins
725
- * over this one. See `ItemScoringPolicy` in lk-core.
726
- *
727
- * With tries, `onComplete` fires after every graded try: `score` and
728
- * `passed` are the question's under the policy so far, and `xapiStatement`
729
- * records the try just made. A policy `validateItemScoringPolicy` refuses
730
- * throws at render.
731
- */
732
- scoring?: ItemScoringPolicy | null;
733
- /** Per-instance token overrides, applied as inline CSS vars on the root. */
734
- theme?: Partial<ThemeTokens>;
735
- /**
736
- * BCP 47 tag stamped as `lang` on this component's root. This is the
737
- * INTERFACE language — the SDK's own chrome renders inside that element — so
738
- * it should carry the same value you give `<LkIntlProvider locale>`. Passing
739
- * a different one re-declares the language of every SDK string in this
740
- * subtree without changing the words.
741
- *
742
- * It is NOT `data.locale`, which labels xAPI statements — and, on a
743
- * dictation, places the dictation's own words: `<Dictation>` puts it, and
744
- * the direction it names, on its title, hints, marks and solution. Other
745
- * authored content in another language belongs on `stimulus.locale`, which
746
- * `<StimulusPanel>` puts on the passage alone.
747
- */
748
- locale?: string;
749
- disabled?: boolean;
750
- }
751
- /**
752
- * Bridges a server-produced `redact()` projection into the `data` prop.
753
- *
754
- * `RedactedActivityData` is deliberately index-signature typed in lk-core — it
755
- * proves a payload is learner-safe, not what shape it has — so TypeScript
756
- * cannot know it still carries the public fields a renderer needs. This is the
757
- * SDK's single, documented crossing of that gap, so an exam runner does not
758
- * have to write `as unknown as` at every call site:
759
- *
760
- * ```tsx
761
- * <MultipleChoice
762
- * data={asRenderable<MultipleChoiceData>(redactedFromServer)}
763
- * renderMode="exam"
764
- * onSubmit={persist}
765
- * />
766
- * ```
767
- *
768
- * Safe because `exam` mode reads only public fields; the answer-key fields the
769
- * type claims are exactly the ones the component is forbidden to touch there.
770
- *
771
- * Per-type redacted interfaces (`RedactedMultipleChoiceData`, …) ship from
772
- * lk-core since 0.6.0, but they are not yet *assignable* to `data`:
773
- * {@link Renderable} widens `scoringStrategy` and leaves nested answer-key
774
- * fields (`options[].isCorrect`, `blanks[].acceptedAnswers`) required, so a
775
- * real redacted payload still needs this bridge. Closing that gap is tracked
776
- * in the roadmap.
777
- */
778
- declare function asRenderable<TData extends ActivityData>(redacted: RedactedActivityData): Renderable<TData>;
779
- /**
780
- * The same bridge as {@link asRenderable}, for a whole sequence: activities
781
- * and item groups as a server hands them over, ready for `<ActivitySequence>`.
782
- *
783
- * Needed for the same reason and no other. `redactItemGroup` returns
784
- * `ItemGroup<RedactedActivityData>`, and `RedactedActivityData` is an
785
- * index-signature type whose fields are all `unknown` — so its `question` is
786
- * not a `string` and it satisfies no per-type renderable, however the prop is
787
- * widened. Widening alone cannot fix this; a crossing point is required, and
788
- * having exactly one keeps `as unknown as` out of consumer code.
789
- *
790
- * ```tsx
791
- * const entries = await fetchExam(); // redacted, server-side
792
- * <ActivitySequence
793
- * activities={asRenderableSequence(entries)}
794
- * renderMode="exam" // REQUIRED: see below
795
- * shuffleSeed={attemptId}
796
- * onSubmit={persist}
797
- * />
798
- * ```
799
- *
800
- * Pass `renderMode="exam"` (or `"review"`). Redacted data has no answer key, and
801
- * almost every built-in activity throws at render in the default `practice`
802
- * mode rather than fail later: `<MultipleChoice>`, `<FillInTheBlanks>`,
803
- * `<GapSelect>` and `<Dictation>` because they grade locally, and
804
- * `<WrittenResponse>` because `practice` still runs its local submit path and
805
- * emits a practice-mode xAPI statement.
806
- *
807
- * `<ReadAloud>` is the exception and renders a projection in every mode: a
808
- * read-aloud item has no answer key to withhold, so `redact()` removes only the
809
- * authored feedback and leaves the reading, its language and its bounds — which
810
- * is everything the component puts on screen. It grades nothing locally either;
811
- * the grade comes back from whatever the application asked to judge the take.
812
- */
813
- declare function asRenderableSequence(entries: readonly (RedactedActivityData | RedactedItemGroupData)[]): readonly SequenceEntry<RenderableActivity>[];
814
- /** Structural shape of a `redactItemGroup()` projection, as it arrives from a server. */
815
- type RedactedItemGroupData = ItemGroup<RedactedActivityData> & {
816
- redacted: true;
817
- };
818
- /**
819
- * Every word the SDK's audio transport renders.
820
- *
821
- * Words, not characters: the `m:ss / m:ss` clock is digits and punctuation and
822
- * is formatted by the component, because it reads identically in every locale
823
- * this SDK targets. The scrubber's SPOKEN value does have a word in it and does
824
- * have a key ({@link MediaTransportStrings.timeValue}).
825
- *
826
- * Supply them to translate it. These are the highest-stakes strings on a
827
- * listening paper — "No plays remaining" decides whether a learner believes
828
- * they may try again — so shipping them as untranslatable English inside a
829
- * Spanish panel was not acceptable. Supplying any of them also sets `lang` on
830
- * the transport chrome, so a screen reader does not read the SDK's own words
831
- * with the passage's phonetics.
832
- */
833
- interface MediaTransportStrings {
834
- play: string;
835
- pause: string;
836
- preparing: string;
837
- mute: string;
838
- unmute: string;
839
- volume: string;
840
- speed: string;
841
- seek: string;
842
- /**
843
- * Spoken value of the scrubber, e.g. `('1:05', '4:30') => '1:05 of 4:30'`.
844
- * Takes ALREADY-FORMATTED `m:ss` strings: a translation should not have to
845
- * reimplement the clock to change the word between them.
846
- */
847
- timeValue: (elapsed: string, duration: string) => string;
848
- /** e.g. `(1, 2) => '1 of 2 plays remaining'`. */
849
- playsRemaining: (remaining: number, max: number) => string;
850
- noPlaysRemaining: string;
851
- /** Shown before the LAST play is spent, so a stray press cannot cost it. */
852
- lastPlayConfirm: string;
853
- lastPlayStart: string;
854
- lastPlayCancel: string;
855
- seekBlocked: string;
856
- rateBlocked: string;
857
- playFailed: string;
858
- }
859
- /**
860
- * Binds ONE media block to a play budget the consumer persists.
861
- *
862
- * The SDK refuses a play; it does not remember one. Everything durable here is
863
- * the consuming application's — see {@link SequenceMediaBudget.onPlayConsumed}.
864
- */
865
- interface MediaBudgetBinding {
866
- /** From `slotMediaKey(slotId)` / `stimulusMediaKey(slotId)` in lk-core. */
867
- key: string;
868
- /** Plays already spent, and where playback stood. Read at mount only. */
869
- entry?: MediaPlayLedgerEntry;
870
- /** Defaults to `renderMode !== 'review'`. An explicit boolean wins either way. */
871
- enforced?: boolean;
872
- /** Slot context stamped onto the claim and the interaction event. */
873
- slotId: string;
874
- index: number;
875
- activityId?: string;
876
- onPlayConsumed?: (claim: MediaPlayClaim) => undefined | Promise<MediaPlayGrant | undefined>;
877
- onPlayRefunded?: (claim: MediaPlayClaim) => void;
878
- onPosition?: (key: string, seconds: number) => void;
879
- /** Translations for the transport chrome. */
880
- strings?: Partial<MediaTransportStrings>;
881
- }
882
- /**
883
- * The pager-level half of a play budget. One prop, because it is one concept.
884
- */
885
- interface SequenceMediaBudget {
886
- /**
887
- * `MediaPlayLedger.entries` goes straight in. An absent key means nothing
888
- * spent. Read at mount, like `responses`.
889
- */
890
- plays?: Readonly<Record<string, MediaPlayLedgerEntry>>;
891
- /**
892
- * Re-seed token. Change this string and the budgets re-seed from `plays`
893
- * WITHOUT remounting the pager — the invigilator path ("the audio never
894
- * started, give her the play back") that would otherwise cost the learner
895
- * their focus, their scroll position and an unsaved answer.
896
- */
897
- resumeKey?: string;
898
- /** Explicit override of the default (`renderMode !== 'review'`). */
899
- enforced?: boolean;
900
- /**
901
- * Called the instant a play is claimed, BEFORE any audio is audible.
902
- *
903
- * Two tiers, chosen by what you return:
904
- *
905
- * - **Return nothing (optimistic).** Playback starts immediately and the
906
- * count is only as durable as your write. **Do not debounce this, and do
907
- * not batch it with the answer autosave** — an eight-second debounce is
908
- * exactly long enough to start a third play and hard-reload. A `pagehide`
909
- * beacon is a backstop, not the mechanism. A crash between this call and
910
- * your write landing RETURNS the play to the learner; that is the honest
911
- * description of what you are buying.
912
- * - **Return a promise (confirmed).** Playback is held — the button reads
913
- * "Preparing…" and is `aria-busy` — until it settles. Resolve with
914
- * `{ playsUsed }` from an ATOMIC server write (`UPDATE … SET plays = plays
915
- * + 1 … RETURNING plays`, or a compare-and-set on
916
- * `claim.previousPlaysUsed`). A resolved count above `maxPlays` refuses the
917
- * play, which is how a second tab is caught: two mounts both seeded at 0
918
- * both claim 1, and only an atomic increment can tell them apart. A
919
- * rejection charges nothing and lets the learner retry. This is the only
920
- * tier in which "consumed before audible" is true of storage rather than
921
- * only of memory; use it for summative papers.
922
- *
923
- * Never settle the promise and the learner cannot play at all: settle it.
924
- */
925
- onPlayConsumed?: (claim: MediaPlayClaim) => undefined | Promise<MediaPlayGrant | undefined>;
926
- /**
927
- * Called when a charged play produced no audio — the element errored before
928
- * playback advanced past 0.25 s, an expired signed URL being the realistic
929
- * cause. Supply it to give the play back, decrementing with a compare-and-set
930
- * on `claim.playsUsed`. Omit it and the play stays spent: the SDK will not
931
- * decrement a ledger it has no channel to correct.
932
- */
933
- onPlayRefunded?: (claim: MediaPlayClaim) => void;
934
- /**
935
- * Position reports, so a refresh resumes the play the learner already paid
936
- * for instead of charging them again. Fires on pause, on end (with 0), and at
937
- * most once per whole second of playback.
938
- *
939
- * **This one you MAY throttle** — the granularity you persist is the
940
- * granularity of the replay a crash grants. Three seconds is sane; three
941
- * minutes is not.
942
- */
943
- onPosition?: (key: string, seconds: number) => void;
944
- /** Translations for the transport chrome. Defaults are English. */
945
- strings?: Partial<MediaTransportStrings>;
946
- }
947
- /**
948
- * Which slot a recording belongs to, stamped on every call the pager makes.
949
- *
950
- * Exactly the shape {@link ActivitySequenceProps.onSubmit} already passes, so
951
- * one identity travels with the answer and with the take that answer points at
952
- * — and a consumer writes `slotId` in both places rather than reconciling two
953
- * spellings of "which question was this".
954
- */
955
- interface SequenceRecordingSlot {
956
- /** Identity from `flattenSequence` — stable under shuffling. Store against THIS. */
957
- slotId: string;
958
- /** Presented position, which moves under shuffling. */
959
- index: number;
960
- activityId: string;
961
- }
962
- /**
963
- * The pager-level half of a read-aloud recording binding: where every take in
964
- * this sequence is stored, and how a judgement comes back.
965
- *
966
- * One prop at both levels, because it is one concept — the media-budget
967
- * precedent ({@link SequenceMediaBudget} beside {@link MediaBudgetBinding}).
968
- * The difference is the second argument: a per-slot binding knows which slot it
969
- * belongs to, so a sequence-level one is told.
970
- *
971
- * The SDK records and hands over; it never judges. `assess` is `practice` only
972
- * and optional — a sequence that only stores takes gets the "assessment is not
973
- * available" notice rather than a throw — and `playbackUrl` is `review` only.
974
- * A slot whose activity is not a read-aloud never calls any of them.
975
- */
976
- interface SequenceRecordingBinding {
977
- /**
978
- * Puts the take in your storage and returns its key. **Required** outside
979
- * `review`: without it a learner can speak into a control that submits
980
- * nothing, which the component refuses to render. Settle it.
981
- */
982
- upload(take: RecordedTake, slot: SequenceRecordingSlot): Promise<RecordingRef>;
983
- /** Judges the stored take. `practice` only; an exam never assesses on the client. */
984
- assess?(ref: RecordingRef, slot: SequenceRecordingSlot): Promise<ReadAloudAssessResult>;
985
- /** A playable link to a stored take. `review` only. */
986
- playbackUrl?(ref: RecordingRef, slot: SequenceRecordingSlot): Promise<string>;
987
- }
988
-
989
- 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 };