@intellectif/lk-react 23.0.1 → 23.1.0

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 (178) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +4 -4
  3. package/dist/{WrittenResponse-CgRrjM4S.d.ts → WrittenResponse-B7A5gHMj.d.ts} +1 -1
  4. package/dist/{WrittenResponse-D2K1VW_V.d.cts → WrittenResponse-BpL9p2Hn.d.cts} +1 -1
  5. package/dist/ai/LkAiProvider.cjs +3 -3
  6. package/dist/ai/LkAiProvider.d.cts +12 -2
  7. package/dist/ai/LkAiProvider.d.ts +12 -2
  8. package/dist/ai/LkAiProvider.js +1 -1
  9. package/dist/ai/useAiHelp.cjs +9 -7
  10. package/dist/ai/useAiHelp.d.cts +82 -3
  11. package/dist/ai/useAiHelp.d.ts +82 -3
  12. package/dist/ai/useAiHelp.js +2 -4
  13. package/dist/{chunk-VPU6UY4O.cjs → chunk-2PNSVBLQ.cjs} +5 -6
  14. package/dist/chunk-2PNSVBLQ.cjs.map +1 -0
  15. package/dist/{chunk-HZIT24BK.js → chunk-4ZZWZSWI.js} +4 -4
  16. package/dist/{chunk-HZIT24BK.js.map → chunk-4ZZWZSWI.js.map} +1 -1
  17. package/dist/{chunk-B7JU52YQ.cjs → chunk-7ALBSPYR.cjs} +34 -35
  18. package/dist/chunk-7ALBSPYR.cjs.map +1 -0
  19. package/dist/{chunk-TGTP5DKF.js → chunk-7NFY3M3W.js} +10 -10
  20. package/dist/{chunk-TGTP5DKF.js.map → chunk-7NFY3M3W.js.map} +1 -1
  21. package/dist/{chunk-E4UF4XZM.js → chunk-7SB2MJA4.js} +4 -4
  22. package/dist/{chunk-E4UF4XZM.js.map → chunk-7SB2MJA4.js.map} +1 -1
  23. package/dist/{chunk-ERV666AR.js → chunk-ABJJ3LII.js} +9 -10
  24. package/dist/chunk-ABJJ3LII.js.map +1 -0
  25. package/dist/{chunk-NFGUJ52G.cjs → chunk-BIGGXHAW.cjs} +8 -2
  26. package/dist/chunk-BIGGXHAW.cjs.map +1 -0
  27. package/dist/{chunk-O7MINPKZ.js → chunk-C7QZE5BI.js} +9 -10
  28. package/dist/chunk-C7QZE5BI.js.map +1 -0
  29. package/dist/{chunk-IYGF7PZY.cjs → chunk-CWTUWNV3.cjs} +25 -26
  30. package/dist/chunk-CWTUWNV3.cjs.map +1 -0
  31. package/dist/{chunk-4MXECBZT.js → chunk-DC4CQCK5.js} +40 -13
  32. package/dist/chunk-DC4CQCK5.js.map +1 -0
  33. package/dist/{chunk-PGAPZ6UE.cjs → chunk-DS6HN3YR.cjs} +34 -35
  34. package/dist/chunk-DS6HN3YR.cjs.map +1 -0
  35. package/dist/{chunk-U5VFJVQ2.js → chunk-FDQR4GAZ.js} +3 -4
  36. package/dist/chunk-FDQR4GAZ.js.map +1 -0
  37. package/dist/{chunk-DPNCCWOV.js → chunk-FKGMSOJF.js} +8 -9
  38. package/dist/chunk-FKGMSOJF.js.map +1 -0
  39. package/dist/{chunk-SPSKDNEE.js → chunk-G6PXJ2SA.js} +11 -12
  40. package/dist/chunk-G6PXJ2SA.js.map +1 -0
  41. package/dist/{chunk-C4PSJ3ZC.js → chunk-HNLRVRQR.js} +8 -2
  42. package/dist/chunk-HNLRVRQR.js.map +1 -0
  43. package/dist/{chunk-FISEZBLF.cjs → chunk-J3C72RPK.cjs} +7 -7
  44. package/dist/{chunk-FISEZBLF.cjs.map → chunk-J3C72RPK.cjs.map} +1 -1
  45. package/dist/{chunk-SHDSOOBF.cjs → chunk-KFLIDTDU.cjs} +25 -26
  46. package/dist/chunk-KFLIDTDU.cjs.map +1 -0
  47. package/dist/{chunk-W6UMY7PF.cjs → chunk-KHKH5LCT.cjs} +7 -8
  48. package/dist/chunk-KHKH5LCT.cjs.map +1 -0
  49. package/dist/{chunk-7F2YQWMW.cjs → chunk-LBEKRN6Y.cjs} +122 -11
  50. package/dist/chunk-LBEKRN6Y.cjs.map +1 -0
  51. package/dist/{chunk-6RIM5EQP.cjs → chunk-LPUWXIPR.cjs} +197 -12
  52. package/dist/chunk-LPUWXIPR.cjs.map +1 -0
  53. package/dist/{chunk-XS6OYYVR.cjs → chunk-MKXEM2C5.cjs} +19 -20
  54. package/dist/chunk-MKXEM2C5.cjs.map +1 -0
  55. package/dist/{chunk-CXIP7ERK.js → chunk-MXNC5UNO.js} +182 -8
  56. package/dist/chunk-MXNC5UNO.js.map +1 -0
  57. package/dist/{chunk-MXZHL4U5.cjs → chunk-NAK55BYU.cjs} +31 -32
  58. package/dist/chunk-NAK55BYU.cjs.map +1 -0
  59. package/dist/{chunk-UKUHVCZX.cjs → chunk-NDBMKGQ5.cjs} +5 -5
  60. package/dist/{chunk-UKUHVCZX.cjs.map → chunk-NDBMKGQ5.cjs.map} +1 -1
  61. package/dist/{chunk-XYJBRKBZ.js → chunk-ORT3KLGI.js} +3 -4
  62. package/dist/chunk-ORT3KLGI.js.map +1 -0
  63. package/dist/{chunk-JMEZYYCE.js → chunk-PWHECW6N.js} +11 -12
  64. package/dist/chunk-PWHECW6N.js.map +1 -0
  65. package/dist/{chunk-6GQLCCGN.js → chunk-RBS5A2DF.js} +9 -10
  66. package/dist/chunk-RBS5A2DF.js.map +1 -0
  67. package/dist/{chunk-B4JRBV56.cjs → chunk-RPWUDXG5.cjs} +6 -6
  68. package/dist/{chunk-B4JRBV56.cjs.map → chunk-RPWUDXG5.cjs.map} +1 -1
  69. package/dist/{chunk-KI6DJ5ZF.js → chunk-TCDJY3H6.js} +9 -10
  70. package/dist/chunk-TCDJY3H6.js.map +1 -0
  71. package/dist/{chunk-DZ7VLLDQ.cjs → chunk-TP5UMRAU.cjs} +66 -39
  72. package/dist/chunk-TP5UMRAU.cjs.map +1 -0
  73. package/dist/{chunk-HYOUMTPW.js → chunk-TS7J6DTY.js} +3 -3
  74. package/dist/{chunk-HYOUMTPW.js.map → chunk-TS7J6DTY.js.map} +1 -1
  75. package/dist/{chunk-OJGTJOWI.cjs → chunk-TUVENMXB.cjs} +2 -2
  76. package/dist/chunk-TUVENMXB.cjs.map +1 -0
  77. package/dist/{chunk-WZ2TBXVB.cjs → chunk-V6BA44DS.cjs} +18 -18
  78. package/dist/{chunk-WZ2TBXVB.cjs.map → chunk-V6BA44DS.cjs.map} +1 -1
  79. package/dist/{chunk-2OP5YHRR.js → chunk-XO5R73Y4.js} +120 -10
  80. package/dist/chunk-XO5R73Y4.js.map +1 -0
  81. package/dist/{chunk-QAZO3ANW.cjs → chunk-YY4PFR3Z.cjs} +34 -35
  82. package/dist/chunk-YY4PFR3Z.cjs.map +1 -0
  83. package/dist/{chunk-RX3A6KIY.js → chunk-ZPI6Q42R.js} +2 -2
  84. package/dist/chunk-ZPI6Q42R.js.map +1 -0
  85. package/dist/components/ActivityPreview.cjs +16 -18
  86. package/dist/components/ActivityPreview.d.cts +2 -2
  87. package/dist/components/ActivityPreview.d.ts +2 -2
  88. package/dist/components/ActivityPreview.js +15 -17
  89. package/dist/components/ActivitySequence.cjs +17 -19
  90. package/dist/components/ActivitySequence.d.cts +2 -2
  91. package/dist/components/ActivitySequence.d.ts +2 -2
  92. package/dist/components/ActivitySequence.js +16 -18
  93. package/dist/components/Dictation.cjs +9 -11
  94. package/dist/components/Dictation.d.cts +1 -1
  95. package/dist/components/Dictation.d.ts +1 -1
  96. package/dist/components/Dictation.js +8 -10
  97. package/dist/components/FillInTheBlanks.cjs +9 -11
  98. package/dist/components/FillInTheBlanks.d.cts +1 -1
  99. package/dist/components/FillInTheBlanks.d.ts +1 -1
  100. package/dist/components/FillInTheBlanks.js +8 -10
  101. package/dist/components/GapSelect.cjs +9 -11
  102. package/dist/components/GapSelect.d.cts +1 -1
  103. package/dist/components/GapSelect.d.ts +1 -1
  104. package/dist/components/GapSelect.js +8 -10
  105. package/dist/components/InteractiveVideo.cjs +16 -18
  106. package/dist/components/InteractiveVideo.d.cts +2 -2
  107. package/dist/components/InteractiveVideo.d.ts +2 -2
  108. package/dist/components/InteractiveVideo.js +14 -16
  109. package/dist/components/MultipleChoice.cjs +9 -11
  110. package/dist/components/MultipleChoice.d.cts +1 -1
  111. package/dist/components/MultipleChoice.d.ts +1 -1
  112. package/dist/components/MultipleChoice.js +8 -10
  113. package/dist/components/PronunciationFeedback.cjs +6 -5
  114. package/dist/components/PronunciationFeedback.d.cts +28 -7
  115. package/dist/components/PronunciationFeedback.d.ts +28 -7
  116. package/dist/components/PronunciationFeedback.js +5 -4
  117. package/dist/components/ReadAloud.cjs +9 -9
  118. package/dist/components/ReadAloud.d.cts +2 -2
  119. package/dist/components/ReadAloud.d.ts +2 -2
  120. package/dist/components/ReadAloud.js +8 -8
  121. package/dist/components/StimulusPanel.cjs +4 -4
  122. package/dist/components/StimulusPanel.d.cts +1 -1
  123. package/dist/components/StimulusPanel.d.ts +1 -1
  124. package/dist/components/StimulusPanel.js +3 -3
  125. package/dist/components/WrittenResponse.cjs +8 -10
  126. package/dist/components/WrittenResponse.d.cts +3 -3
  127. package/dist/components/WrittenResponse.d.ts +3 -3
  128. package/dist/components/WrittenResponse.js +7 -9
  129. package/dist/i18n/LkIntlProvider.cjs +7 -7
  130. package/dist/i18n/LkIntlProvider.d.cts +2 -2
  131. package/dist/i18n/LkIntlProvider.d.ts +2 -2
  132. package/dist/i18n/LkIntlProvider.js +1 -1
  133. package/dist/index.cjs +58 -56
  134. package/dist/index.cjs.map +1 -1
  135. package/dist/index.d.cts +3 -3
  136. package/dist/index.d.ts +3 -3
  137. package/dist/index.js +18 -20
  138. package/dist/index.js.map +1 -1
  139. package/dist/theme/skin.css +46 -1
  140. package/dist/{types-CrtIcRcK.d.ts → types-C4IsUQsK.d.ts} +16 -0
  141. package/dist/{types-CO0XLEN6.d.cts → types-CJgZWtl4.d.cts} +16 -0
  142. package/package.json +3 -3
  143. package/dist/chunk-2OP5YHRR.js.map +0 -1
  144. package/dist/chunk-4MXECBZT.js.map +0 -1
  145. package/dist/chunk-54DX6SLS.cjs +0 -42
  146. package/dist/chunk-54DX6SLS.cjs.map +0 -1
  147. package/dist/chunk-6GQLCCGN.js.map +0 -1
  148. package/dist/chunk-6RIM5EQP.cjs.map +0 -1
  149. package/dist/chunk-7F2YQWMW.cjs.map +0 -1
  150. package/dist/chunk-B7JU52YQ.cjs.map +0 -1
  151. package/dist/chunk-C4PSJ3ZC.js.map +0 -1
  152. package/dist/chunk-CXIP7ERK.js.map +0 -1
  153. package/dist/chunk-DPNCCWOV.js.map +0 -1
  154. package/dist/chunk-DXFCYNST.js +0 -35
  155. package/dist/chunk-DXFCYNST.js.map +0 -1
  156. package/dist/chunk-DZ7VLLDQ.cjs.map +0 -1
  157. package/dist/chunk-ERV666AR.js.map +0 -1
  158. package/dist/chunk-IYGF7PZY.cjs.map +0 -1
  159. package/dist/chunk-J2QIHZ3H.cjs +0 -27
  160. package/dist/chunk-J2QIHZ3H.cjs.map +0 -1
  161. package/dist/chunk-JMEZYYCE.js.map +0 -1
  162. package/dist/chunk-KI6DJ5ZF.js.map +0 -1
  163. package/dist/chunk-MXZHL4U5.cjs.map +0 -1
  164. package/dist/chunk-NFGUJ52G.cjs.map +0 -1
  165. package/dist/chunk-O7MINPKZ.js.map +0 -1
  166. package/dist/chunk-OJGTJOWI.cjs.map +0 -1
  167. package/dist/chunk-PGAPZ6UE.cjs.map +0 -1
  168. package/dist/chunk-QAZO3ANW.cjs.map +0 -1
  169. package/dist/chunk-RX3A6KIY.js.map +0 -1
  170. package/dist/chunk-SHDSOOBF.cjs.map +0 -1
  171. package/dist/chunk-SPSKDNEE.js.map +0 -1
  172. package/dist/chunk-U4KTOH7C.js +0 -22
  173. package/dist/chunk-U4KTOH7C.js.map +0 -1
  174. package/dist/chunk-U5VFJVQ2.js.map +0 -1
  175. package/dist/chunk-VPU6UY4O.cjs.map +0 -1
  176. package/dist/chunk-W6UMY7PF.cjs.map +0 -1
  177. package/dist/chunk-XS6OYYVR.cjs.map +0 -1
  178. package/dist/chunk-XYJBRKBZ.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/InteractiveVideo/format.ts","../src/components/InteractiveVideo/icons.tsx","../src/components/InteractiveVideo/shortcuts.ts","../src/components/InteractiveVideo/tracks.ts","../src/components/InteractiveVideo/panels.tsx","../src/components/InteractiveVideo/prefs.ts","../src/components/InteractiveVideo/quiz-engine.ts","../src/components/InteractiveVideo/vtt.ts","../src/components/InteractiveVideo/Scrubber.tsx","../src/components/InteractiveVideo/InteractiveVideo.tsx","../src/components/InteractiveVideo/index.tsx"],"names":["jsx","jsxs","Fragment","useRef","useEffect","useState","useMemo","useCallback","useLkStrings","useLearnerAi","resolveDeliveryPolicy","resolveItemScoringPolicy","isDevelopment","assertRedactedItemGroup","validateItemGroup","ActivitySchemaError","flattenSequence","pending","MultipleChoice","FillInTheBlanks","GapSelect","Dictation","ReadAloud","readMediaProgress","ActivityErrorBoundary","stopCaptureGroup","SequenceSlotContext","InteractiveVideo"],"mappings":"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","file":"chunk-IYGF7PZY.cjs","sourcesContent":["/** The speeds a learner can choose, slowest first. */\nexport const SPEEDS = [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2, 2.5] as const;\n\n/**\n * A time as a clock: `4:05`, or `1:02:03` past an hour. Whole seconds,\n * rounded down, so the clock never shows a second that has not happened yet.\n */\nexport function clock(value: number): string {\n const total = Number.isFinite(value) && value > 0 ? Math.floor(value) : 0;\n const hours = Math.floor(total / 3600);\n const minutes = Math.floor((total % 3600) / 60);\n const secs = total % 60;\n const pad = (n: number): string => String(n).padStart(2, '0');\n return hours > 0 ? `${hours}:${pad(minutes)}:${pad(secs)}` : `${minutes}:${pad(secs)}`;\n}\n\n/** The next speed in `direction` from `current`, held inside the list. */\nexport function nudgeSpeed(current: number, direction: 1 | -1): number {\n const at = SPEEDS.indexOf(current as (typeof SPEEDS)[number]);\n const from = at === -1 ? SPEEDS.indexOf(1) : at;\n return SPEEDS[Math.min(SPEEDS.length - 1, Math.max(0, from + direction))] as number;\n}\n","'use client';\n\nimport type { ReactNode } from 'react';\n\n/**\n * The player's icons: inline SVG, one stroke weight, drawn in `currentColor`,\n * so a theme recolours them and forced-colours mode repaints them. Inline\n * because the package has no runtime dependencies, and a 24 × 24 grid keeps\n * every icon on one optical size. Always decorative: the button that holds\n * one carries the name.\n */\nfunction Icon({ children, filled = false }: { children: ReactNode; filled?: boolean }) {\n return (\n <svg\n className=\"lk-iv-icon\"\n viewBox=\"0 0 24 24\"\n width=\"20\"\n height=\"20\"\n fill={filled ? 'currentColor' : 'none'}\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n {children}\n </svg>\n );\n}\n\nexport const PlayIcon = () => (\n <Icon filled>\n <path d=\"M8 5.5v13a1 1 0 0 0 1.5.86l10.2-6.5a1 1 0 0 0 0-1.72L9.5 4.64A1 1 0 0 0 8 5.5Z\" />\n </Icon>\n);\n\nexport const PauseIcon = () => (\n <Icon filled>\n <rect x=\"6.5\" y=\"5\" width=\"3.5\" height=\"14\" rx=\"1\" />\n <rect x=\"14\" y=\"5\" width=\"3.5\" height=\"14\" rx=\"1\" />\n </Icon>\n);\n\nexport const ReplayIcon = () => (\n <Icon>\n <path d=\"M4 12a8 8 0 1 0 2.4-5.7\" />\n <path d=\"M4 4v4h4\" />\n </Icon>\n);\n\nexport const BackIcon = () => (\n <Icon>\n <path d=\"M11 6.5 5.5 12l5.5 5.5\" />\n <path d=\"M18.5 6.5 13 12l5.5 5.5\" />\n </Icon>\n);\n\nexport const ForwardIcon = () => (\n <Icon>\n <path d=\"m13 6.5 5.5 5.5-5.5 5.5\" />\n <path d=\"M5.5 6.5 11 12l-5.5 5.5\" />\n </Icon>\n);\n\nexport const VolumeIcon = ({ level }: { level: 'muted' | 'low' | 'high' }) => (\n <Icon>\n <path d=\"M4 9.5v5h3.5L12 18.5v-13L7.5 9.5H4Z\" />\n {level === 'muted' ? (\n <path d=\"m16 9.5 5 5m0-5-5 5\" />\n ) : (\n <>\n <path d=\"M15.5 9.5a3.5 3.5 0 0 1 0 5\" />\n {level === 'high' ? <path d=\"M18 7a7 7 0 0 1 0 10\" /> : null}\n </>\n )}\n </Icon>\n);\n\nexport const CaptionsIcon = ({ on }: { on: boolean }) => (\n <Icon>\n <rect x=\"3\" y=\"5.5\" width=\"18\" height=\"13\" rx=\"2.5\" />\n <path d=\"M10 10.5a2 2 0 1 0 0 3M16 10.5a2 2 0 1 0 0 3\" />\n {on ? null : <path d=\"m4 20 16-16\" />}\n </Icon>\n);\n\nexport const SettingsIcon = () => (\n <Icon>\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n <path d=\"M12 3.5v2M12 18.5v2M20.5 12h-2M5.5 12h-2M18 6l-1.4 1.4M7.4 16.6 6 18M18 18l-1.4-1.4M7.4 7.4 6 6\" />\n </Icon>\n);\n\nexport const ContentsIcon = () => (\n <Icon>\n <path d=\"M9 6.5h11M9 12h11M9 17.5h11\" />\n <path d=\"M4.5 6.5h.01M4.5 12h.01M4.5 17.5h.01\" />\n </Icon>\n);\n\nexport const PictureInPictureIcon = () => (\n <Icon>\n <rect x=\"3\" y=\"5\" width=\"18\" height=\"14\" rx=\"2\" />\n <rect x=\"12\" y=\"11.5\" width=\"6.5\" height=\"5\" rx=\"1\" />\n </Icon>\n);\n\nexport const FullscreenIcon = ({ on }: { on: boolean }) => (\n <Icon>\n {on ? (\n <path d=\"M9 4v3a2 2 0 0 1-2 2H4M20 9h-3a2 2 0 0 1-2-2V4M4 15h3a2 2 0 0 1 2 2v3M15 20v-3a2 2 0 0 1 2-2h3\" />\n ) : (\n <path d=\"M4 9V6a2 2 0 0 1 2-2h3M15 4h3a2 2 0 0 1 2 2v3M20 15v3a2 2 0 0 1-2 2h-3M9 20H6a2 2 0 0 1-2-2v-3\" />\n )}\n </Icon>\n);\n\nexport const CheckIcon = () => (\n <Icon>\n <path d=\"m5 12.5 4.5 4.5L19 7.5\" />\n </Icon>\n);\n\nexport const ChevronIcon = ({ direction }: { direction: 'left' | 'right' }) => (\n <Icon>\n <path d={direction === 'right' ? 'm9.5 6 6 6-6 6' : 'm14.5 6-6 6 6 6'} />\n </Icon>\n);\n\nexport const CloseIcon = () => (\n <Icon>\n <path d=\"m6.5 6.5 11 11m0-11-11 11\" />\n </Icon>\n);\n\nexport const AlertIcon = () => (\n <Icon>\n <path d=\"M12 4 2.8 19.5h18.4L12 4Z\" />\n <path d=\"M12 10v4M12 17h.01\" />\n </Icon>\n);\n","/**\n * One row of the shortcut list. The list and the key handler read the same\n * table, so a shortcut can never be documented and not work, or work and not\n * be documented.\n */\nexport type VideoShortcutAction =\n | 'play-pause'\n | 'jump-10'\n | 'jump-5'\n | 'jump-1'\n | 'frame'\n | 'speed'\n | 'percent'\n | 'start-end'\n | 'chapter'\n | 'mute'\n | 'captions'\n | 'secondary-captions'\n | 'transcript'\n | 'picture-in-picture'\n | 'fullscreen'\n | 'shortcut-list';\n\n/** The keys of each row, as shown in the list. */\nexport const SHORTCUT_KEYS: readonly { action: VideoShortcutAction; keys: string }[] = [\n { action: 'play-pause', keys: 'Space / K' },\n { action: 'jump-10', keys: 'J / L' },\n { action: 'jump-5', keys: '← / →' },\n { action: 'jump-1', keys: 'Shift + ← / →' },\n { action: 'frame', keys: ', / .' },\n { action: 'speed', keys: '< / >' },\n { action: 'percent', keys: '0 – 9' },\n { action: 'start-end', keys: 'Home / End' },\n { action: 'chapter', keys: '[ / ]' },\n { action: 'mute', keys: 'M' },\n { action: 'captions', keys: 'C' },\n { action: 'secondary-captions', keys: 'Shift + C' },\n { action: 'transcript', keys: 'T' },\n { action: 'picture-in-picture', keys: 'P' },\n { action: 'fullscreen', keys: 'F' },\n { action: 'shortcut-list', keys: '?' },\n];\n\n/** Seconds J / L move. */\nexport const JUMP_SECONDS = 10;\n/** Frame step: an approximation, since a video does not report its frame rate. */\nexport const FRAME_SECONDS = 1 / 30;\n","import type { MediaTrack } from '@intellectif/lk-core';\nimport type { VideoPreferences } from './prefs.js';\nimport type { Cue } from './vtt.js';\n\n/** The two lines a learner can have: which track each shows, if any. */\nexport interface CaptionTracks {\n primary?: MediaTrack;\n secondary?: MediaTrack;\n}\n\nconst primarySubtag = (tag: string): string => (tag.split('-')[0] ?? tag).toLowerCase();\n\n/** Two tracks in one language: the `captions` one, which transcribes rather than translates. */\nfunction preferCaptions(tracks: readonly MediaTrack[]): MediaTrack | undefined {\n return tracks.find((track) => track.kind === 'captions') ?? tracks[0];\n}\n\n/** The track for `language`: an exact match, else one of the same primary language (`pt` ↔ `pt-BR`). */\nfunction matchLanguage(tracks: readonly MediaTrack[], language: string): MediaTrack | undefined {\n const wanted = language.toLowerCase();\n const exact = tracks.filter((track) => track.srclang.toLowerCase() === wanted);\n if (exact.length > 0) {\n return preferCaptions(exact);\n }\n const family = primarySubtag(wanted);\n return preferCaptions(tracks.filter((track) => primarySubtag(track.srclang) === family));\n}\n\n/** Tracks a player draws: the caption and subtitle kinds. */\nfunction drawable(tracks: readonly MediaTrack[]): MediaTrack[] {\n return tracks.filter((track) => track.kind === 'captions' || track.kind === 'subtitles');\n}\n\n/**\n * The tracks that can be a second line beside `primary`: every drawable track\n * in a different language from it. A second track in the primary's own\n * language — the `subtitles` beside its `captions` — would only print the same\n * words twice, so it is never offered and never chosen.\n */\nexport function secondaryCandidates(\n tracks: readonly MediaTrack[],\n primary: MediaTrack | undefined,\n): MediaTrack[] {\n const taken = primary?.srclang.toLowerCase();\n return drawable(tracks).filter((track) => track.srclang.toLowerCase() !== taken);\n}\n\n/**\n * Which track each caption line shows, from the learner's two choices.\n *\n * The primary line always shows something while there are tracks:\n * 1. the track in `captionLanguage` (case-insensitive);\n * 2. else one of the same primary language — `pt` finds `pt-BR`, `es` finds\n * `es-419`;\n * 3. else the `default` track;\n * 4. else the first.\n *\n * Where two tracks share a language, the `captions` one wins.\n *\n * The secondary line is stricter: it appears only when `secondaryCaptionLanguage`\n * is set and matches a track in another language, by steps 1 and 2 alone —\n * never the default, never the first. A second line the learner did not choose\n * must never appear.\n */\nexport function resolveCaptionTracks(\n tracks: readonly MediaTrack[],\n preferences: Pick<VideoPreferences, 'captionLanguage' | 'secondaryCaptionLanguage'>,\n): CaptionTracks {\n const usable = drawable(tracks);\n if (usable.length === 0) {\n return {};\n }\n const primary =\n (preferences.captionLanguage === null\n ? undefined\n : matchLanguage(usable, preferences.captionLanguage)) ??\n usable.find((track) => track.default === true) ??\n usable[0];\n const second = preferences.secondaryCaptionLanguage;\n const secondary =\n second === null ? undefined : matchLanguage(secondaryCandidates(usable, primary), second);\n return secondary === undefined ? { primary } : { primary, secondary };\n}\n\n/** How long two cues share, in seconds; zero or less when they do not meet. */\nconst overlap = (a: Cue, b: Cue): number => Math.min(a.end, b.end) - Math.max(a.start, b.start);\n\n/**\n * How far back past the last cue that starts before a second-language cue to\n * look for one still running. Captions overlap rarely and briefly; this is the\n * bound `cueIndexAt` uses for the same reason.\n */\nconst LOOKBACK = 8;\n\n/**\n * The second-language cues that belong under each first-language line of the\n * transcript, by index of the first-language cue.\n *\n * A second-language cue belongs to the line it overlaps MOST — the two tracks\n * need not share timings, and a translation segmented differently still pairs\n * sensibly — and to the earlier line on a tie. A cue that overlaps no line is\n * left out: it is still drawn over the video at its own time, but a transcript\n * row is a first-language line, and there is none for it to sit under.\n *\n * Both lists are sorted by start, as `parseWebVtt` returns them.\n */\nexport function pairSecondaryCues(primary: readonly Cue[], secondary: readonly Cue[]): Cue[][] {\n const rows: Cue[][] = primary.map(() => []);\n for (const cue of secondary) {\n // The first primary cue that starts at or after this cue ends: every\n // candidate lies before it.\n let low = 0;\n let high = primary.length;\n while (low < high) {\n const middle = (low + high) >> 1;\n if ((primary[middle] as Cue).start < cue.end) {\n low = middle + 1;\n } else {\n high = middle;\n }\n }\n let best = -1;\n let bestShare = 0;\n let misses = 0;\n for (let index = low - 1; index >= 0 && misses <= LOOKBACK; index -= 1) {\n const share = overlap(primary[index] as Cue, cue);\n if (share > 0) {\n misses = 0;\n // Walking backwards, so an equal share moves the cue to the earlier line.\n if (share >= bestShare) {\n best = index;\n bestShare = share;\n }\n } else {\n misses += 1;\n }\n }\n if (best !== -1) {\n (rows[best] as Cue[]).push(cue);\n }\n }\n return rows;\n}\n","'use client';\n\nimport type { MediaTrack, TimelineChapter } from '@intellectif/lk-core';\nimport { type ReactNode, useEffect, useMemo, useRef, useState } from 'react';\nimport type { LkStrings } from '../../i18n/strings.js';\nimport { clock, SPEEDS } from './format.js';\nimport { CheckIcon, ChevronIcon, CloseIcon, ReplayIcon } from './icons.js';\nimport type { CaptionSize, VideoPreferences } from './prefs.js';\nimport type { MarkerState } from './Scrubber.js';\nimport { SHORTCUT_KEYS } from './shortcuts.js';\nimport { pairSecondaryCues, secondaryCandidates } from './tracks.js';\nimport type { Cue } from './vtt.js';\n\n/**\n * A menu of items, with the arrow keys moving between them and Escape closing\n * it — focus then goes back to the button that opened it. When the menu opens\n * focus goes to the row a sub-page was left for, when coming back from one;\n * else the checked item; else the first.\n */\nfunction Menu({\n label,\n onClose,\n children,\n returnTo,\n}: {\n label: string;\n onClose: () => void;\n children: ReactNode;\n /** The `data-menu-key` of the row to focus, when this page is returned to. */\n returnTo?: string | undefined;\n}) {\n const ref = useRef<HTMLDivElement>(null);\n useEffect(() => {\n const items = ref.current?.querySelectorAll<HTMLElement>('[role^=\"menuitem\"]');\n const back =\n returnTo === undefined\n ? null\n : ref.current?.querySelector<HTMLElement>(`[data-menu-key=\"${returnTo}\"]`);\n const checked = ref.current?.querySelector<HTMLElement>('[aria-checked=\"true\"]');\n (back ?? checked ?? items?.[0])?.focus();\n }, [returnTo]);\n const onKeyDown = (event: React.KeyboardEvent<HTMLDivElement>): void => {\n const items = Array.from(\n ref.current?.querySelectorAll<HTMLElement>('[role^=\"menuitem\"]') ?? [],\n );\n const at = items.indexOf(document.activeElement as HTMLElement);\n const move = (to: number): void => {\n event.preventDefault();\n items[(to + items.length) % items.length]?.focus();\n };\n if (event.key === 'ArrowDown') {\n move(at + 1);\n } else if (event.key === 'ArrowUp') {\n move(at - 1);\n } else if (event.key === 'Home') {\n move(0);\n } else if (event.key === 'End') {\n move(items.length - 1);\n } else if (event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n onClose();\n }\n // Everything else stays inside the menu: a letter must not reach the player's shortcuts.\n event.stopPropagation();\n };\n return (\n <div ref={ref} className=\"lk-iv-menu\" role=\"menu\" aria-label={label} onKeyDown={onKeyDown}>\n {children}\n </div>\n );\n}\n\nexport function SpeedMenu({\n speed,\n strings,\n onChoose,\n onClose,\n}: {\n speed: number;\n strings: LkStrings;\n onChoose: (speed: number) => void;\n onClose: () => void;\n}) {\n return (\n <Menu label={strings.media.speed} onClose={onClose}>\n {SPEEDS.map((rate) => (\n <button\n key={rate}\n type=\"button\"\n role=\"menuitemradio\"\n aria-checked={rate === speed}\n className=\"lk-iv-menu-item\"\n onClick={() => onChoose(rate)}\n >\n <span>{strings.videoSpeedValue(rate)}</span>\n {rate === speed ? <CheckIcon /> : null}\n </button>\n ))}\n </Menu>\n );\n}\n\ntype SettingsPage = 'main' | 'captions' | 'second' | 'size';\n\nexport function SettingsMenu({\n preferences,\n tracks,\n primaryTrack,\n secondaryTrack,\n captionsFailed,\n strings,\n onChange,\n onCaptionTrack,\n onSecondaryTrack,\n onShowShortcuts,\n onClose,\n}: {\n preferences: VideoPreferences;\n tracks: readonly MediaTrack[];\n /** The track each caption line shows now; see `resolveCaptionTracks`. */\n primaryTrack: MediaTrack | undefined;\n secondaryTrack: MediaTrack | undefined;\n /** Per line: which language could not be loaded. */\n captionsFailed: { primary: boolean; secondary: boolean };\n strings: LkStrings;\n onChange: (change: Partial<VideoPreferences>) => void;\n /** A first language picked; the player swaps it with the second when they meet. */\n onCaptionTrack: (track: MediaTrack) => void;\n /** A second language picked, or `null` for none. */\n onSecondaryTrack: (track: MediaTrack | null) => void;\n onShowShortcuts: () => void;\n onClose: () => void;\n}) {\n const [page, setPage] = useState<SettingsPage>('main');\n // The page just left, so its row on the page returned to takes focus again.\n const [returnTo, setReturnTo] = useState<SettingsPage | undefined>(undefined);\n const open = (next: SettingsPage): void => {\n setReturnTo(undefined);\n setPage(next);\n };\n const leave = (): void => {\n setReturnTo(page);\n setPage(page === 'second' ? 'captions' : 'main');\n };\n const captionsValue =\n !preferences.captions || primaryTrack === undefined\n ? strings.videoOff\n : secondaryTrack === undefined\n ? primaryTrack.label\n : strings.videoCaptionPair(primaryTrack.label, secondaryTrack.label);\n // Every other language: never the first line's own, which would print the same words twice.\n const partners = secondaryCandidates(tracks, primaryTrack);\n const failedNotes = (\n <>\n {captionsFailed.primary && page === 'captions' ? (\n <p className=\"lk-iv-menu-note\" role=\"status\">\n {strings.videoCaptionsFailed}\n </p>\n ) : null}\n {captionsFailed.secondary ? (\n <p className=\"lk-iv-menu-note\" role=\"status\">\n {strings.videoSecondaryCaptionsFailed}\n </p>\n ) : null}\n </>\n );\n const back = (\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"lk-iv-menu-item lk-iv-menu-back\"\n onClick={leave}\n >\n <ChevronIcon direction=\"left\" />\n <span>\n {page === 'captions'\n ? strings.videoCaptionLanguage\n : page === 'second'\n ? strings.videoSecondCaptionLanguage\n : strings.videoCaptionSize}\n </span>\n </button>\n );\n /** A radio naming a track in its own language and writing direction. */\n const trackRadio = (track: MediaTrack, on: boolean, choose: () => void): ReactNode => (\n <button\n key={`${track.kind}:${track.srclang}`}\n type=\"button\"\n role=\"menuitemradio\"\n aria-checked={on}\n className=\"lk-iv-menu-item\"\n lang={track.srclang}\n onClick={choose}\n >\n <span dir=\"auto\">{track.label}</span>\n {on ? <CheckIcon /> : null}\n </button>\n );\n if (page === 'captions') {\n return (\n <Menu\n key=\"captions\"\n label={strings.videoCaptionLanguage}\n onClose={onClose}\n returnTo={returnTo}\n >\n {back}\n <button\n type=\"button\"\n role=\"menuitemradio\"\n aria-checked={!preferences.captions}\n className=\"lk-iv-menu-item\"\n onClick={() => onChange({ captions: false })}\n >\n <span>{strings.videoOff}</span>\n {!preferences.captions ? <CheckIcon /> : null}\n </button>\n {tracks.map((track) =>\n trackRadio(track, preferences.captions && primaryTrack === track, () =>\n onCaptionTrack(track),\n ),\n )}\n {partners.length > 0 ? (\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"lk-iv-menu-item\"\n data-menu-key=\"second\"\n onClick={() => open('second')}\n >\n <span>{strings.videoSecondCaptionLanguage}</span>\n <span className=\"lk-iv-menu-value\">\n <span dir=\"auto\" lang={secondaryTrack?.srclang}>\n {secondaryTrack === undefined ? strings.videoOff : secondaryTrack.label}\n </span>\n <ChevronIcon direction=\"right\" />\n </span>\n </button>\n ) : null}\n {failedNotes}\n </Menu>\n );\n }\n if (page === 'second') {\n return (\n <Menu key=\"second\" label={strings.videoSecondCaptionLanguage} onClose={onClose}>\n {back}\n <button\n type=\"button\"\n role=\"menuitemradio\"\n aria-checked={secondaryTrack === undefined}\n className=\"lk-iv-menu-item\"\n onClick={() => onSecondaryTrack(null)}\n >\n <span>{strings.videoOff}</span>\n {secondaryTrack === undefined ? <CheckIcon /> : null}\n </button>\n {partners.map((track) =>\n trackRadio(track, secondaryTrack === track, () => onSecondaryTrack(track)),\n )}\n {failedNotes}\n </Menu>\n );\n }\n if (page === 'size') {\n return (\n <Menu key=\"size\" label={strings.videoCaptionSize} onClose={onClose}>\n {back}\n {(['small', 'medium', 'large'] as CaptionSize[]).map((size) => (\n <button\n key={size}\n type=\"button\"\n role=\"menuitemradio\"\n aria-checked={preferences.captionSize === size}\n className=\"lk-iv-menu-item\"\n onClick={() => onChange({ captionSize: size })}\n >\n <span>{strings.videoCaptionSizeValue(size)}</span>\n {preferences.captionSize === size ? <CheckIcon /> : null}\n </button>\n ))}\n </Menu>\n );\n }\n return (\n <Menu key=\"main\" label={strings.videoSettings} onClose={onClose} returnTo={returnTo}>\n {tracks.length > 0 ? (\n <>\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"lk-iv-menu-item\"\n data-menu-key=\"captions\"\n onClick={() => open('captions')}\n >\n <span>{strings.videoCaptionLanguage}</span>\n <span className=\"lk-iv-menu-value\">\n <span dir=\"auto\">{captionsValue}</span>\n <ChevronIcon direction=\"right\" />\n </span>\n </button>\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"lk-iv-menu-item\"\n data-menu-key=\"size\"\n onClick={() => open('size')}\n >\n <span>{strings.videoCaptionSize}</span>\n <span className=\"lk-iv-menu-value\">\n {strings.videoCaptionSizeValue(preferences.captionSize)}\n <ChevronIcon direction=\"right\" />\n </span>\n </button>\n <button\n type=\"button\"\n role=\"menuitemcheckbox\"\n aria-checked={preferences.captionBackground}\n className=\"lk-iv-menu-item\"\n onClick={() => onChange({ captionBackground: !preferences.captionBackground })}\n >\n <span>{strings.videoCaptionBackground}</span>\n <span className=\"lk-iv-menu-value\">\n {preferences.captionBackground ? strings.videoOn : strings.videoOff}\n </span>\n </button>\n </>\n ) : null}\n <button\n type=\"button\"\n role=\"menuitemcheckbox\"\n aria-checked={preferences.shortcuts}\n className=\"lk-iv-menu-item\"\n onClick={() => onChange({ shortcuts: !preferences.shortcuts })}\n >\n <span>{strings.videoKeyboardShortcuts}</span>\n <span className=\"lk-iv-menu-value\">\n {preferences.shortcuts ? strings.videoOn : strings.videoOff}\n </span>\n </button>\n <button type=\"button\" role=\"menuitem\" className=\"lk-iv-menu-item\" onClick={onShowShortcuts}>\n <span>{strings.videoShortcutList}</span>\n <kbd className=\"lk-iv-kbd\">?</kbd>\n </button>\n </Menu>\n );\n}\n\n/** The shortcut list, over the video. The same table the key handler reads. */\nexport function ShortcutSheet({ strings, onClose }: { strings: LkStrings; onClose: () => void }) {\n const closeRef = useRef<HTMLButtonElement>(null);\n useEffect(() => {\n closeRef.current?.focus();\n }, []);\n return (\n <div\n className=\"lk-iv-sheet\"\n role=\"dialog\"\n aria-modal=\"false\"\n aria-label={strings.videoKeyboardShortcuts}\n onKeyDown={(event) => {\n if (event.key === 'Escape' || event.key === '?') {\n event.preventDefault();\n event.stopPropagation();\n onClose();\n }\n }}\n >\n <div className=\"lk-iv-sheet-head\">\n <h3 className=\"lk-iv-sheet-title\">{strings.videoKeyboardShortcuts}</h3>\n <button\n ref={closeRef}\n type=\"button\"\n className=\"lk-iv-button\"\n aria-label={strings.videoClose}\n onClick={onClose}\n >\n <CloseIcon />\n </button>\n </div>\n <dl className=\"lk-iv-shortcuts\">\n {SHORTCUT_KEYS.map(({ action, keys }) => (\n <div key={action} className=\"lk-iv-shortcut\">\n <dt>\n <kbd className=\"lk-iv-kbd\">{keys}</kbd>\n </dt>\n <dd>{strings.videoShortcut(action)}</dd>\n </div>\n ))}\n </dl>\n </div>\n );\n}\n\nexport interface ContentsQuiz {\n id: string;\n at: number;\n title: string;\n answered: number;\n total: number;\n required: boolean;\n state: MarkerState;\n}\n\n/**\n * The panel below the video: the chapters and quizzes in time order, and the\n * transcript. Nothing here costs a request — the transcript is the captions,\n * already parsed.\n */\nexport function ContentsPanel({\n idPrefix,\n tab,\n onTab,\n chapters,\n quizzes,\n cues,\n primaryLanguage,\n secondaryCues,\n secondaryLanguage,\n activeCue,\n limit,\n strings,\n onSeek,\n onOpenQuiz,\n}: {\n /** Unique per player, so two players on one page never share an id. */\n idPrefix: string;\n tab: 'contents' | 'transcript';\n onTab: (tab: 'contents' | 'transcript') => void;\n chapters: readonly TimelineChapter[];\n quizzes: readonly ContentsQuiz[];\n /** The first caption line's cues: one transcript row each. */\n cues: readonly Cue[];\n primaryLanguage?: string | undefined;\n /** The second line's cues, shown under the row each overlaps most; empty for none. */\n secondaryCues: readonly Cue[];\n secondaryLanguage?: string | undefined;\n activeCue: number;\n /** No line past this point is listed (the no-skip-ahead spoiler rule). */\n limit: number;\n strings: LkStrings;\n onSeek: (seconds: number) => void;\n onOpenQuiz: (id: string) => void;\n}) {\n const [query, setQuery] = useState('');\n const listRef = useRef<HTMLDivElement>(null);\n const followUntil = useRef(0);\n const hasTranscript = cues.length > 0;\n const shownTab = hasTranscript ? tab : 'contents';\n\n // Paired once per pair of tracks; the spoiler limit and the search filter\n // what is paired, so neither re-pairs as the video plays.\n const paired = useMemo(() => pairSecondaryCues(cues, secondaryCues), [cues, secondaryCues]);\n const lines = useMemo(() => {\n const trimmed = query.trim().toLowerCase();\n return cues\n .map((cue, index) => ({\n cue,\n index,\n // The spoiler limit holds for the second language as for the first.\n second: (paired[index] ?? [])\n .filter((line) => line.start <= limit)\n .map((line) => line.text)\n .join(' '),\n }))\n .filter(({ cue }) => cue.start <= limit)\n .filter(\n ({ cue, second }) =>\n trimmed === '' ||\n cue.text.toLowerCase().includes(trimmed) ||\n second.toLowerCase().includes(trimmed),\n );\n }, [cues, paired, limit, query]);\n\n // Follows the spoken line, unless the learner scrolled the list themselves a\n // moment ago, or is searching: a list that jumps away mid-read is worse than\n // one that waits.\n // biome-ignore lint/correctness/useExhaustiveDependencies: activeCue is the trigger — the list follows the line being spoken\n useEffect(() => {\n if (shownTab !== 'transcript' || query.trim() !== '' || Date.now() < followUntil.current) {\n return;\n }\n const active = listRef.current?.querySelector<HTMLElement>('[data-active=\"true\"]');\n if (active !== null && active !== undefined && listRef.current !== null) {\n const list = listRef.current;\n const top = active.offsetTop - list.clientHeight / 3;\n list.scrollTo?.({ top, behavior: 'smooth' });\n }\n }, [activeCue, shownTab, query]);\n\n const rows = [\n ...chapters.map((chapter) => ({ kind: 'chapter' as const, at: chapter.at, chapter })),\n ...quizzes.map((quiz) => ({ kind: 'quiz' as const, at: quiz.at, quiz })),\n ].sort((a, b) => a.at - b.at || (a.kind === 'chapter' ? -1 : 1));\n\n const highlight = (text: string): ReactNode => {\n const trimmed = query.trim();\n const at = trimmed === '' ? -1 : text.toLowerCase().indexOf(trimmed.toLowerCase());\n if (at === -1) {\n return text;\n }\n return (\n <>\n {text.slice(0, at)}\n <mark>{text.slice(at, at + trimmed.length)}</mark>\n {text.slice(at + trimmed.length)}\n </>\n );\n };\n\n return (\n <section className=\"lk-iv-panel\" aria-label={strings.videoPanel}>\n {hasTranscript ? (\n <div className=\"lk-iv-tabs\" role=\"tablist\" aria-label={strings.videoPanel}>\n {(['contents', 'transcript'] as const).map((name) => (\n <button\n key={name}\n type=\"button\"\n role=\"tab\"\n id={`${idPrefix}-tab-${name}`}\n aria-controls={`${idPrefix}-tabpanel`}\n aria-selected={shownTab === name}\n tabIndex={shownTab === name ? 0 : -1}\n className=\"lk-iv-tab\"\n onClick={() => onTab(name)}\n onKeyDown={(event) => {\n if (event.key === 'ArrowLeft' || event.key === 'ArrowRight') {\n event.preventDefault();\n onTab(name === 'contents' ? 'transcript' : 'contents');\n }\n }}\n >\n {name === 'contents' ? strings.videoContents : strings.videoTranscript}\n </button>\n ))}\n </div>\n ) : null}\n {shownTab === 'contents' ? (\n <ol\n className=\"lk-iv-contents\"\n {...(hasTranscript\n ? {\n role: 'tabpanel',\n id: `${idPrefix}-tabpanel`,\n 'aria-labelledby': `${idPrefix}-tab-contents`,\n }\n : { 'aria-label': strings.videoContents })}\n >\n {rows.map((row) =>\n row.kind === 'chapter' ? (\n <li key={`c-${row.at}`} className=\"lk-iv-contents-chapter\">\n <button type=\"button\" className=\"lk-iv-row\" onClick={() => onSeek(row.chapter.at)}>\n <span className=\"lk-iv-row-time\">{clock(row.chapter.at)}</span>\n <span className=\"lk-iv-row-title\">{row.chapter.title}</span>\n </button>\n </li>\n ) : (\n <li\n key={`q-${row.quiz.id}`}\n className=\"lk-iv-contents-quiz\"\n data-state={row.quiz.state}\n >\n <button type=\"button\" className=\"lk-iv-row\" onClick={() => onOpenQuiz(row.quiz.id)}>\n <span className=\"lk-iv-row-time\">{clock(row.quiz.at)}</span>\n <span className=\"lk-iv-row-title\">\n <span\n className=\"lk-iv-marker-dot\"\n data-state={row.quiz.state}\n aria-hidden=\"true\"\n />\n {row.quiz.title}\n {row.quiz.required ? (\n <>\n {' '}\n <span className=\"lk-iv-tag\">{strings.videoRequired}</span>\n </>\n ) : null}\n </span>\n <span className=\"lk-iv-row-status\">\n {strings.videoQuizProgress(row.quiz.answered, row.quiz.total)}\n </span>\n </button>\n </li>\n ),\n )}\n </ol>\n ) : (\n <div\n className=\"lk-iv-transcript\"\n role=\"tabpanel\"\n id={`${idPrefix}-tabpanel`}\n aria-labelledby={`${idPrefix}-tab-transcript`}\n >\n <input\n id={`${idPrefix}-search`}\n className=\"lk-iv-search\"\n type=\"search\"\n value={query}\n placeholder={strings.videoTranscriptSearch}\n aria-label={strings.videoTranscriptSearch}\n onChange={(event) => setQuery(event.target.value)}\n />\n <div\n ref={listRef}\n className=\"lk-iv-lines\"\n onWheel={() => {\n followUntil.current = Date.now() + 4000;\n }}\n onTouchMove={() => {\n followUntil.current = Date.now() + 4000;\n }}\n >\n {lines.length === 0 ? (\n <p className=\"lk-iv-empty\">{strings.videoTranscriptNoMatch}</p>\n ) : (\n lines.map(({ cue, index, second }) => (\n <button\n key={`${cue.start}-${index}`}\n type=\"button\"\n className=\"lk-iv-line\"\n data-active={index === activeCue || undefined}\n onClick={() => onSeek(cue.start)}\n >\n <span className=\"lk-iv-row-time\">{clock(cue.start)}</span>\n {secondaryCues.length === 0 ? (\n <span lang={primaryLanguage} dir=\"auto\">\n {highlight(cue.text)}\n </span>\n ) : (\n <span className=\"lk-iv-line-text\">\n <span lang={primaryLanguage} dir=\"auto\">\n {highlight(cue.text)}\n </span>\n {second === '' ? null : (\n <span className=\"lk-iv-line-secondary\" lang={secondaryLanguage} dir=\"auto\">\n {highlight(second)}\n </span>\n )}\n </span>\n )}\n </button>\n ))\n )}\n </div>\n </div>\n )}\n </section>\n );\n}\n\n/** Over the last frame: what the learner did, and where to go from here. */\nexport function EndScreen({\n idPrefix,\n renderMode,\n quizzes,\n answered,\n total,\n percent,\n strings,\n onOpenQuiz,\n onWatchAgain,\n pending,\n onFinish,\n}: {\n idPrefix: string;\n renderMode: 'practice' | 'exam' | 'review';\n quizzes: readonly ContentsQuiz[];\n answered: number;\n total: number;\n percent: number | null;\n strings: LkStrings;\n onOpenQuiz: (id: string) => void;\n onWatchAgain: () => void;\n /** An answer is still being stored or graded: Finish waits, and says so. */\n pending: boolean;\n onFinish: (() => void) | undefined;\n}) {\n const pendingId = `${idPrefix}-end-pending`;\n const headingRef = useRef<HTMLHeadingElement>(null);\n useEffect(() => {\n headingRef.current?.focus();\n }, []);\n return (\n <section className=\"lk-iv-end\" aria-labelledby={`${idPrefix}-end-title`}>\n <div className=\"lk-iv-end-card\">\n <h3 id={`${idPrefix}-end-title`} ref={headingRef} tabIndex={-1} className=\"lk-iv-end-title\">\n {strings.videoEnded}\n </h3>\n {total > 0 ? (\n <p className=\"lk-iv-end-summary\">\n {percent !== null && renderMode !== 'exam'\n ? strings.videoEndScore(answered, total, percent)\n : strings.videoEndAnswered(answered, total)}\n </p>\n ) : null}\n {quizzes.length > 0 ? (\n <ol className=\"lk-iv-end-list\">\n {quizzes.map((quiz) => (\n <li key={quiz.id}>\n <button\n type=\"button\"\n className=\"lk-iv-row\"\n data-state={quiz.state}\n onClick={() => onOpenQuiz(quiz.id)}\n >\n <span className=\"lk-iv-row-time\">{clock(quiz.at)}</span>\n <span className=\"lk-iv-row-title\">\n <span className=\"lk-iv-marker-dot\" data-state={quiz.state} aria-hidden=\"true\" />\n {quiz.title}\n </span>\n <span className=\"lk-iv-row-status\">\n {strings.videoQuizProgress(quiz.answered, quiz.total)}\n </span>\n </button>\n </li>\n ))}\n </ol>\n ) : null}\n {onFinish !== undefined && pending ? (\n <p id={pendingId} className=\"lk-iv-end-pending\" role=\"status\">\n {strings.videoAnswerPending}\n </p>\n ) : null}\n <div className=\"lk-iv-end-actions\">\n <button type=\"button\" className=\"lk-iv-action\" onClick={onWatchAgain}>\n <ReplayIcon />\n {strings.videoWatchAgain}\n </button>\n {onFinish !== undefined ? (\n <button\n type=\"button\"\n className=\"lk-iv-action lk-iv-action-primary\"\n aria-disabled={pending || undefined}\n aria-describedby={pending ? pendingId : undefined}\n onClick={onFinish}\n >\n {strings.videoFinish}\n </button>\n ) : null}\n </div>\n </div>\n </section>\n );\n}\n","import { SPEEDS } from './format.js';\n\n/** The size captions are drawn at. */\nexport type CaptionSize = 'small' | 'medium' | 'large';\n\n/** What the player remembers between videos, for one browser. */\nexport interface VideoPreferences {\n /** One of the speed list. */\n speed: number;\n /** 0 to 1. */\n volume: number;\n muted: boolean;\n /** Captions shown — both lines, when there are two. */\n captions: boolean;\n /** The caption language chosen, as a track's `srclang`; null for the default track. */\n captionLanguage: string | null;\n /**\n * A second caption language, drawn under the first, as a track's `srclang`;\n * null for none. A learner's preference, never content: nothing about it is\n * authored. Never the same as `captionLanguage` — a pair of one language is\n * normalised to no second line.\n */\n secondaryCaptionLanguage: string | null;\n captionSize: CaptionSize;\n /** A dark box behind each caption line. Off draws the text with an outline only. */\n captionBackground: boolean;\n /** The contents and transcript panel is open. */\n panel: boolean;\n /** Single-key shortcuts act while the player has focus (WCAG 2.1.4 lets a learner turn them off). */\n shortcuts: boolean;\n}\n\nexport const DEFAULT_PREFERENCES: VideoPreferences = {\n speed: 1,\n volume: 1,\n muted: false,\n captions: true,\n captionLanguage: null,\n secondaryCaptionLanguage: null,\n captionSize: 'medium',\n captionBackground: true,\n panel: false,\n shortcuts: true,\n};\n\nconst STORAGE_KEY = 'lk.video.v1';\n\n/** A BCP 47 tag as a track's `srclang` carries one: `en`, `pt-BR`, `es-419`. */\nconst LANGUAGE_TAG = /^[A-Za-z]{2,3}(-[A-Za-z0-9]{2,8})*$/;\n\nconst BOOLEAN_FIELDS = ['muted', 'captions', 'captionBackground', 'panel', 'shortcuts'] as const;\nconst LANGUAGE_FIELDS = ['captionLanguage', 'secondaryCaptionLanguage'] as const;\n\n/**\n * Every field of `raw` that is present and usable, clamped — and nothing at\n * all for a field that is absent or unusable, so a layer below it applies.\n *\n * Anything in storage is writable by the learner and survives a schema\n * change, so it is input from a stranger: one `volume: 50` must not mute every\n * video, and a `speed: null` must not pin playback at a rate the menu cannot\n * undo. A host's layers go through here too — a `speed: 3` is no more a rate\n * the menu can undo for having come from code.\n *\n * `null` is a value for the two language fields (the default track; no second\n * line), so it counts as present; an unparseable tag does not.\n */\nexport function sanitizePartialPreferences(raw: unknown): Partial<VideoPreferences> {\n if (typeof raw !== 'object' || raw === null || Array.isArray(raw)) {\n return {};\n }\n const value = raw as Partial<Record<keyof VideoPreferences, unknown>>;\n const has = (key: keyof VideoPreferences): boolean => Object.hasOwn(value, key);\n const out: Partial<VideoPreferences> = {};\n if (has('speed') && (SPEEDS as readonly unknown[]).includes(value.speed)) {\n out.speed = value.speed as number;\n }\n if (has('volume') && typeof value.volume === 'number' && Number.isFinite(value.volume)) {\n out.volume = Math.min(1, Math.max(0, value.volume));\n }\n for (const field of BOOLEAN_FIELDS) {\n if (has(field) && typeof value[field] === 'boolean') {\n out[field] = value[field] as boolean;\n }\n }\n for (const field of LANGUAGE_FIELDS) {\n const tag = value[field];\n if (has(field) && (tag === null || (typeof tag === 'string' && LANGUAGE_TAG.test(tag)))) {\n out[field] = tag as string | null;\n }\n }\n if (\n has('captionSize') &&\n (value.captionSize === 'small' ||\n value.captionSize === 'medium' ||\n value.captionSize === 'large')\n ) {\n out.captionSize = value.captionSize;\n }\n return out;\n}\n\n/** A pair of one language is no pair: the second line is dropped, case-insensitively. */\nfunction normalised(preferences: VideoPreferences): VideoPreferences {\n const { captionLanguage: first, secondaryCaptionLanguage: second } = preferences;\n return first !== null && second !== null && first.toLowerCase() === second.toLowerCase()\n ? { ...preferences, secondaryCaptionLanguage: null }\n : preferences;\n}\n\n/** A whole, clamped set of preferences from anything: what is unusable takes its default. */\nexport function sanitizePreferences(raw: unknown): VideoPreferences {\n return normalised({ ...DEFAULT_PREFERENCES, ...sanitizePartialPreferences(raw) });\n}\n\n/**\n * The preferences in force, decided field by field, highest first:\n *\n * 1. `force` — the host's `preferences` prop, which overrides what the\n * learner chose, on every mount;\n * 2. `stored` — what the learner chose in this browser;\n * 3. `defaults` — the host's `defaultPreferences` prop: a starting point, such\n * as a language pair kept on the learner's account;\n * 4. the SDK's own defaults.\n *\n * Deciding per field is the point: a learner who has only ever changed the\n * volume has chosen no caption language, so the host's suggested pair applies\n * to them — where a whole stored object would have beaten it.\n */\nexport function resolvePreferences(layers: {\n force?: unknown;\n stored?: unknown;\n defaults?: unknown;\n /**\n * What the learner changed while this video has been open. Above the force,\n * which applies when the video opens: a learner who closes a panel the host\n * opened keeps it closed when the preferences are next resolved — when the\n * host's `defaultPreferences` change, say.\n */\n chosen?: unknown;\n}): VideoPreferences {\n return normalised({\n ...DEFAULT_PREFERENCES,\n ...sanitizePartialPreferences(layers.defaults),\n ...sanitizePartialPreferences(layers.stored),\n ...sanitizePartialPreferences(layers.force),\n ...sanitizePartialPreferences(layers.chosen),\n });\n}\n\n/** `previous` with a learner's change applied, clamped and normalised like everything else. */\nexport function applyPreferenceChange(\n previous: VideoPreferences,\n change: Partial<VideoPreferences>,\n): VideoPreferences {\n return normalised({ ...previous, ...sanitizePartialPreferences(change) });\n}\n\n/**\n * What the learner chose in this browser: only the fields present in storage.\n * Every read goes through a `try`: a private window, blocked site data or a\n * sandboxed frame throws on `localStorage` itself.\n */\nexport function readStoredPreferences(): Partial<VideoPreferences> {\n try {\n const stored = globalThis.localStorage?.getItem(STORAGE_KEY);\n return stored ? sanitizePartialPreferences(JSON.parse(stored)) : {};\n } catch {\n return {};\n }\n}\n\n/**\n * Remembers a learner's change: the fields they changed, merged into what they\n * chose before. Only what the learner chose is stored — never a value the host\n * forced or suggested — so a host that later suggests a different pair still\n * reaches a learner who never picked one. A payload written by 15.0, which\n * stored every field, reads as every field chosen: the behaviour it had.\n *\n * A browser that will not store them loses nothing but the memory.\n */\nexport function rememberPreferences(change: Partial<VideoPreferences>): void {\n try {\n const next = { ...readStoredPreferences(), ...sanitizePartialPreferences(change) };\n globalThis.localStorage?.setItem(STORAGE_KEY, JSON.stringify(next));\n } catch {\n /* storage refused: the preferences still apply for this video */\n }\n}\n","import type { MediaTimeline, TimelineCue } from '@intellectif/lk-core';\n\n/**\n * The quiz playback has just reached, or undefined: the EARLIEST quiz with\n * `previous < at ≤ now` that has not been handled in this pass.\n *\n * Crossing, never equality: at 2.5× speed about 0.6 s of video passes between\n * two `timeupdate` events, so a quiz checked for `now === at` is missed. And\n * the earliest wins, so when a janky frame carries playback past two quizzes\n * at once, the player opens the first, stops there, and meets the second as\n * playback continues — no quiz is ever skipped by speed.\n */\nexport function crossedQuiz(\n cues: readonly TimelineCue[],\n previous: number,\n now: number,\n handled: ReadonlySet<string>,\n): TimelineCue | undefined {\n let earliest: TimelineCue | undefined;\n for (const cue of cues) {\n if (handled.has(cue.id) || !(previous < cue.at && cue.at <= now)) {\n continue;\n }\n if (earliest === undefined || cue.at < earliest.at) {\n earliest = cue;\n }\n }\n return earliest;\n}\n\n/** The quizzes that open when the video ends: every one at or past its duration. */\nexport function quizzesAtEnd(\n cues: readonly TimelineCue[],\n duration: number,\n handled: ReadonlySet<string>,\n): TimelineCue[] {\n return cues\n .filter((cue) => !handled.has(cue.id) && cue.at >= duration - 0.05)\n .sort((a, b) => a.at - b.at);\n}\n\n/** Why a seek was held short of where it was asked to go. */\nexport type SeekHold =\n | { kind: 'required'; cue: TimelineCue }\n | { kind: 'no-skip-ahead'; furthest: number };\n\n/**\n * Where a seek from `from` to `to` may actually land.\n *\n * Backward is always free. Forward stops at the first `required` quiz whose\n * questions are not all answered — landing ON it, so it opens — and, under\n * `no-skip-ahead`, at the furthest point the learner has reached. The earlier\n * of the two limits wins, and the answer says which, so the player can tell\n * the learner why the seek stopped short.\n */\nexport function limitSeek(\n timeline: MediaTimeline,\n from: number,\n to: number,\n furthest: number,\n finished: (cueId: string) => boolean,\n): { at: number; hold?: SeekHold } {\n if (to <= from) {\n return { at: to };\n }\n let at = to;\n let hold: SeekHold | undefined;\n if (timeline.navigation === 'no-skip-ahead' && to > furthest) {\n at = Math.max(from, furthest);\n hold = { kind: 'no-skip-ahead', furthest };\n }\n const blocking = timeline.cues\n .filter((cue) => cue.required === true && cue.at > from && cue.at <= to && !finished(cue.id))\n .sort((a, b) => a.at - b.at)[0];\n if (blocking !== undefined && blocking.at <= at) {\n return { at: blocking.at, hold: { kind: 'required', cue: blocking } };\n }\n return hold === undefined ? { at } : { at, hold };\n}\n\n/**\n * The earliest point a resumed learner may start from: never past the first\n * `required` quiz with a question still unanswered, whatever the stored\n * position says — a resume is never a way past a required quiz.\n */\nexport function limitResume(\n timeline: MediaTimeline,\n at: number,\n finished: (cueId: string) => boolean,\n): number {\n const blocking = timeline.cues\n .filter((cue) => cue.required === true && cue.at < at && !finished(cue.id))\n .sort((a, b) => a.at - b.at)[0];\n // Just before the quiz, so pressing play crosses it and it opens.\n return blocking === undefined ? at : Math.max(0, blocking.at - 0.25);\n}\n","/** One caption: when it shows, and what it says, as plain text. */\nexport interface Cue {\n /** Seconds. */\n start: number;\n /** Seconds, after `start`. */\n end: number;\n text: string;\n}\n\n/** Bytes of WebVTT read at most. A caption file is text; this is several hours of it. */\nconst MAX_VTT_LENGTH = 2_000_000;\n/** Cues kept at most, for the same reason: the transcript renders every one. */\nconst MAX_CUES = 10_000;\n\nconst BYTE_ORDER_MARK = String.fromCharCode(0xfeff);\n\nconst TIMESTAMP = /^(?:(\\d+):)?([0-5]\\d):([0-5]\\d)\\.(\\d{3})$/;\n\nfunction seconds(stamp: string): number | undefined {\n const match = TIMESTAMP.exec(stamp.trim());\n if (match === null) {\n return undefined;\n }\n const [, hours = '0', minutes = '0', secs = '0', millis = '0'] = match;\n return Number(hours) * 3600 + Number(minutes) * 60 + Number(secs) + Number(millis) / 1000;\n}\n\nconst ENTITIES: Record<string, string> = {\n amp: '&',\n lt: '<',\n gt: '>',\n quot: '\"',\n apos: \"'\",\n // Built from code points: an escape can be rewritten as the raw, invisible\n // character itself, by a formatter or an editor.\n nbsp: String.fromCharCode(0xa0),\n lrm: String.fromCharCode(0x200e),\n rlm: String.fromCharCode(0x200f),\n};\n\n/**\n * A cue payload as the text a learner reads: markup removed (`<v Speaker>`,\n * `<i>`, `<c.class>`, inline timestamps), entities decoded, lines joined with\n * a space.\n */\nfunction plainText(payload: string): string {\n return payload\n .replace(/<[^>]*>/g, '')\n .replace(/&(#x?[0-9a-f]+|[a-z]+);/gi, (whole, name: string) => {\n if (name.startsWith('#')) {\n const code =\n name[1] === 'x' || name[1] === 'X'\n ? Number.parseInt(name.slice(2), 16)\n : Number.parseInt(name.slice(1), 10);\n return Number.isFinite(code) && code > 0 && code <= 0x10ffff\n ? String.fromCodePoint(code)\n : whole;\n }\n return ENTITIES[name.toLowerCase()] ?? whole;\n })\n .replace(/\\s*\\n\\s*/g, ' ')\n .trim();\n}\n\n/**\n * Reads a WebVTT file into cues, sorted by start. Never throws: a malformed cue\n * is skipped, and text that is not WebVTT at all answers an empty list.\n *\n * The SDK parses captions itself rather than handing them to a `<track>`:\n * the caption preview on the progress bar, the transcript and its search all\n * need the cues as data, a host whose caption URL needs its credentials can\n * pass the text in, and a test environment with no media stack can read them.\n * Cue settings (position, alignment) are ignored — the player draws captions\n * in one place, above its own controls.\n */\nexport function parseWebVtt(input: string): Cue[] {\n if (typeof input !== 'string') {\n return [];\n }\n const raw = input.slice(0, MAX_VTT_LENGTH);\n const text = (raw.startsWith(BYTE_ORDER_MARK) ? raw.slice(1) : raw).replace(/\\r\\n?/g, '\\n');\n if (!/^WEBVTT(?:[ \\t].*)?(?:\\n|$)/.test(text)) {\n return [];\n }\n const cues: Cue[] = [];\n for (const block of text.split(/\\n{2,}/)) {\n if (cues.length >= MAX_CUES) {\n break;\n }\n const lines = block.split('\\n');\n const timingIndex = lines.findIndex((line) => line.includes('-->'));\n if (timingIndex === -1) {\n continue;\n }\n const [from = '', rest = ''] = (lines[timingIndex] as string).split('-->');\n const start = seconds(from);\n const end = seconds(rest.trim().split(/\\s+/)[0] ?? '');\n if (start === undefined || end === undefined || end <= start) {\n continue;\n }\n const payload = plainText(lines.slice(timingIndex + 1).join('\\n'));\n if (payload === '') {\n continue;\n }\n cues.push({ start, end, text: payload });\n }\n // Stable: two cues at one moment keep the order the file gave them.\n return cues\n .map((cue, index) => ({ cue, index }))\n .sort((a, b) => a.cue.start - b.cue.start || a.index - b.index)\n .map(({ cue }) => cue);\n}\n\n/**\n * The cue showing at `time`, or -1. When cues overlap, the one that started\n * last wins — the newest line is the one being spoken.\n */\nexport function cueIndexAt(cues: readonly Cue[], time: number): number {\n let low = 0;\n let high = cues.length - 1;\n let found = -1;\n // The last cue that starts at or before `time`.\n while (low <= high) {\n const middle = (low + high) >> 1;\n if ((cues[middle] as Cue).start <= time) {\n found = middle;\n low = middle + 1;\n } else {\n high = middle - 1;\n }\n }\n for (let index = found; index >= 0 && index > found - 8; index -= 1) {\n const cue = cues[index] as Cue;\n if (time < cue.end) {\n return index;\n }\n }\n return -1;\n}\n","'use client';\n\nimport type { TimelineChapter } from '@intellectif/lk-core';\nimport { useCallback, useRef, useState } from 'react';\nimport type { LkStrings } from '../../i18n/strings.js';\nimport { clock } from './format.js';\nimport { type Cue, cueIndexAt } from './vtt.js';\n\n/** How a quiz's marker is drawn. Never by colour alone: each state has its own shape. */\nexport type MarkerState =\n | 'unreached'\n | 'open'\n | 'answered'\n | 'correct'\n | 'partial'\n | 'incorrect'\n | 'pending';\n\nexport interface ScrubberMarker {\n id: string;\n at: number;\n label: string;\n state: MarkerState;\n required: boolean;\n}\n\ninterface ScrubberProps {\n current: number;\n duration: number;\n buffered: number;\n chapters: readonly TimelineChapter[];\n markers: readonly ScrubberMarker[];\n cues: readonly Cue[];\n /** No caption past this point shows in the preview (the no-skip-ahead spoiler rule). */\n previewLimit: number;\n strings: LkStrings;\n onSeek: (seconds: number) => void;\n onScrubChange: (scrubbing: boolean) => void;\n}\n\ninterface Hover {\n x: number;\n width: number;\n time: number;\n}\n\n/** Half the widest the bubble may grow, in px: keeps it inside the track at the ends. */\nconst BUBBLE_HALF = 120;\n/** How near the pointer must be to a marker, in px, for the bubble to name its quiz. */\nconst MARKER_REACH = 8;\n\n/**\n * The progress bar.\n *\n * A thin line at rest and a thicker one under the pointer — the line, not the\n * control, is what should be visible — over a generous hit strip, so a thin bar\n * is still easy to grab. Pointer events with capture, so a drag that leaves the\n * bar keeps scrubbing. It is one slider for assistive technology; its markers\n * are drawn, not focusable, and a keyboard learner reaches quizzes through\n * `[` / `]` and the contents panel instead.\n */\nexport function Scrubber({\n current,\n duration,\n buffered,\n chapters,\n markers,\n cues,\n previewLimit,\n strings,\n onSeek,\n onScrubChange,\n}: ScrubberProps) {\n const trackRef = useRef<HTMLDivElement>(null);\n const [hover, setHover] = useState<Hover | null>(null);\n const [dragging, setDragging] = useState(false);\n const ready = duration > 0;\n const percent = (value: number): string =>\n `${ready ? Math.min(100, Math.max(0, (value / duration) * 100)) : 0}%`;\n\n const measure = useCallback(\n (clientX: number): Hover | null => {\n const rect = trackRef.current?.getBoundingClientRect();\n if (rect === undefined || rect.width === 0 || !ready) {\n return null;\n }\n const ratio = Math.min(1, Math.max(0, (clientX - rect.left) / rect.width));\n return { x: ratio * rect.width, width: rect.width, time: ratio * duration };\n },\n [duration, ready],\n );\n\n const onPointerDown = (event: React.PointerEvent<HTMLDivElement>): void => {\n const at = measure(event.clientX);\n if (at === null) {\n return;\n }\n event.currentTarget.setPointerCapture(event.pointerId);\n setDragging(true);\n onScrubChange(true);\n setHover(at);\n onSeek(at.time);\n };\n const onPointerMove = (event: React.PointerEvent<HTMLDivElement>): void => {\n const at = measure(event.clientX);\n if (at === null) {\n return;\n }\n setHover(at);\n if (dragging) {\n onSeek(at.time);\n }\n };\n const endDrag = (event: React.PointerEvent<HTMLDivElement>): void => {\n if (!dragging) {\n return;\n }\n if (event.currentTarget.hasPointerCapture(event.pointerId)) {\n event.currentTarget.releasePointerCapture(event.pointerId);\n }\n setDragging(false);\n onScrubChange(false);\n };\n\n // Handled here and not allowed to bubble: the player has its own arrow keys,\n // and letting both run would move the playhead twice per press.\n const onKeyDown = (event: React.KeyboardEvent<HTMLDivElement>): void => {\n if (!ready) {\n return;\n }\n const step = event.shiftKey ? 1 : 5;\n const moves: Record<string, number> = {\n ArrowLeft: -step,\n ArrowRight: step,\n ArrowDown: -step,\n ArrowUp: step,\n PageDown: -30,\n PageUp: 30,\n };\n const move = moves[event.key];\n if (move !== undefined) {\n event.preventDefault();\n event.stopPropagation();\n onSeek(current + move);\n } else if (event.key === 'Home' || event.key === 'End') {\n event.preventDefault();\n event.stopPropagation();\n onSeek(event.key === 'Home' ? 0 : duration);\n }\n };\n\n const chapterAt = (time: number): TimelineChapter | undefined =>\n [...chapters].reverse().find((chapter) => chapter.at <= time);\n const hoverCue =\n hover !== null && hover.time <= previewLimit ? cues[cueIndexAt(cues, hover.time)] : undefined;\n const hoverMarker =\n hover === null\n ? undefined\n : markers.find(\n (marker) => Math.abs((marker.at / duration) * hover.width - hover.x) <= MARKER_REACH,\n );\n const hoverChapter = hover === null ? undefined : chapterAt(hover.time);\n const bubbleLeft =\n hover === null\n ? 0\n : hover.width > BUBBLE_HALF * 2\n ? Math.min(hover.width - BUBBLE_HALF, Math.max(BUBBLE_HALF, hover.x))\n : hover.width / 2;\n const currentChapter = chapterAt(current);\n\n return (\n <div\n ref={trackRef}\n className=\"lk-iv-scrubber\"\n role=\"slider\"\n tabIndex={ready ? 0 : -1}\n aria-label={strings.media.seek}\n aria-valuemin={0}\n aria-valuemax={Math.round(duration)}\n aria-valuenow={Math.round(current)}\n aria-valuetext={\n currentChapter === undefined\n ? strings.media.timeValue(clock(current), clock(duration))\n : `${strings.media.timeValue(clock(current), clock(duration))}, ${currentChapter.title}`\n }\n data-dragging={dragging || undefined}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={endDrag}\n onPointerCancel={endDrag}\n onPointerLeave={() => {\n if (!dragging) {\n setHover(null);\n }\n }}\n onKeyDown={onKeyDown}\n >\n <div className=\"lk-iv-scrubber-track\" aria-hidden=\"true\">\n <div className=\"lk-iv-scrubber-buffered\" style={{ width: percent(buffered) }} />\n <div className=\"lk-iv-scrubber-played\" style={{ width: percent(current) }} />\n {chapters\n .filter((chapter) => chapter.at > 0 && chapter.at < duration)\n .map((chapter) => (\n <span\n key={`chapter-${chapter.at}`}\n className=\"lk-iv-scrubber-gap\"\n style={{ insetInlineStart: percent(chapter.at) }}\n />\n ))}\n </div>\n <div\n className=\"lk-iv-scrubber-thumb\"\n aria-hidden=\"true\"\n style={{ insetInlineStart: percent(current) }}\n />\n {markers.map((marker) => (\n <span\n key={marker.id}\n className=\"lk-iv-marker\"\n data-state={marker.state}\n data-required={marker.required || undefined}\n aria-hidden=\"true\"\n style={{ insetInlineStart: percent(Math.min(marker.at, duration)) }}\n />\n ))}\n {hover !== null ? (\n <div\n className=\"lk-iv-bubble\"\n aria-hidden=\"true\"\n style={{ insetInlineStart: `${bubbleLeft}px` }}\n >\n <span className=\"lk-iv-bubble-time\">\n {clock(hover.time)}\n {hoverChapter !== undefined ? (\n <span className=\"lk-iv-bubble-chapter\"> · {hoverChapter.title}</span>\n ) : null}\n </span>\n {hoverMarker !== undefined ? (\n <span className=\"lk-iv-bubble-quiz\">{hoverMarker.label}</span>\n ) : null}\n {hoverCue !== undefined ? (\n <span className=\"lk-iv-bubble-caption\">{hoverCue.text}</span>\n ) : null}\n </div>\n ) : null}\n </div>\n );\n}\n","'use client';\n\nimport {\n type ActivityResult,\n ActivitySchemaError,\n assertRedactedItemGroup,\n type DeliveryPolicy,\n flattenSequence,\n type InteractionEvent,\n type InteractionKind,\n type ItemGroup,\n type ItemOutcome,\n type ItemScoringPolicy,\n type LearnerResponse,\n type MediaProgress,\n type MediaTimeline,\n type MediaTrack,\n type ResolvedDeliveryPolicy,\n type ResolvedItemScoringPolicy,\n readMediaProgress,\n resolveDeliveryPolicy,\n resolveItemScoringPolicy,\n type SequenceSlot,\n type SpeechAssessment,\n type ThemeTokens,\n type TimelineCue,\n validateItemGroup,\n} from '@intellectif/lk-core';\nimport {\n type CSSProperties,\n type ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { type LearnerAi, useLearnerAi } from '../../ai/LkAiProvider.js';\nimport { useLkStrings } from '../../i18n/LkIntlProvider.js';\nimport type { LkStrings, LkStringsOverride } from '../../i18n/strings.js';\nimport { isDevelopment } from '../_internal.js';\nimport { ActivityErrorBoundary } from '../ActivityErrorBoundary.js';\nimport { Dictation } from '../Dictation/index.js';\nimport { FillInTheBlanks } from '../FillInTheBlanks/index.js';\nimport { GapSelect } from '../GapSelect/index.js';\nimport { MultipleChoice } from '../MultipleChoice/index.js';\nimport { ReadAloud } from '../ReadAloud/index.js';\nimport type { RecordingBinding } from '../ReadAloud/ReadAloud.js';\nimport { stopCaptureGroup } from '../shared/capture-registry.js';\nimport {\n type SequenceSlotChannel,\n SequenceSlotContext,\n type TakeState,\n} from '../shared/sequence-slot.js';\nimport type {\n HtmlSanitizer,\n RenderableActivity,\n RenderMode,\n SequenceRecordingBinding,\n SequenceRecordingSlot,\n} from '../types.js';\nimport { clock, nudgeSpeed } from './format.js';\nimport {\n AlertIcon,\n BackIcon,\n CaptionsIcon,\n ContentsIcon,\n ForwardIcon,\n FullscreenIcon,\n PauseIcon,\n PictureInPictureIcon,\n PlayIcon,\n ReplayIcon,\n SettingsIcon,\n VolumeIcon,\n} from './icons.js';\nimport {\n ContentsPanel,\n type ContentsQuiz,\n EndScreen,\n SettingsMenu,\n ShortcutSheet,\n SpeedMenu,\n} from './panels.js';\nimport {\n applyPreferenceChange,\n readStoredPreferences,\n rememberPreferences,\n resolvePreferences,\n sanitizePartialPreferences,\n type VideoPreferences,\n} from './prefs.js';\nimport { crossedQuiz, limitResume, limitSeek, quizzesAtEnd } from './quiz-engine.js';\nimport { type MarkerState, Scrubber, type ScrubberMarker } from './Scrubber.js';\nimport { FRAME_SECONDS, JUMP_SECONDS } from './shortcuts.js';\nimport { resolveCaptionTracks, secondaryCandidates } from './tracks.js';\nimport { type Cue, cueIndexAt, parseWebVtt } from './vtt.js';\n\n/** An item group whose items may be `redact()` projections: the client's view of an interactive video. */\nexport type RenderableItemGroup = ItemGroup<RenderableActivity>;\n\n/** A question's place: its slot, as `<ActivitySequence>` reports it, plus the quiz it sits in. */\nexport interface InteractiveVideoSlot extends SequenceRecordingSlot {\n cueId: string;\n}\n\n/** What `onFinished` reports: every question, and how the learner left it. */\nexport interface InteractiveVideoSummary {\n slots: {\n slotId: string;\n activityId: string;\n cueId: string;\n status: 'answered' | 'skipped' | 'unreached';\n }[];\n}\n\n/**\n * One question, as `renderQuestion` is handed it: what to draw, and the six\n * calls through which the video learns what the learner did.\n *\n * The calls are the ones the SDK's own components make, so a question the host\n * draws counts exactly as one the SDK draws — in the step dots, in whether a\n * required quiz lets the learner go on, on the end card and in `onFinished`.\n * Each keeps ONE identity per question for the life of the player, so it is\n * safe in an effect's dependencies, and each does nothing once the player has\n * unmounted.\n */\nexport interface InteractiveVideoQuestion {\n /** The question, as the SDK would have rendered it: full data, or a `redact()` projection. */\n activity: RenderableActivity;\n /** Where it sits: the same object `onSubmit` and `onActivityComplete` are handed, for the life of the player. */\n slot: InteractiveVideoSlot;\n /**\n * Passed through untouched. The SDK cannot enforce a mode for pixels it does\n * not draw: in `exam` the host must not reveal correctness, and in `review`\n * nothing is submittable — `submit`, `complete` and `clear` are ignored there.\n */\n renderMode: RenderMode;\n /**\n * `true` while this question is the one on screen: its quiz is open and it is\n * the current step. `false` from the moment it leaves the screen — another\n * step, the quiz closing, another quiz opening — and `true` again when the\n * learner comes back.\n *\n * WHEN IT TURNS `false`, STOP THE MICROPHONE, ANY TIMER AND ANY SPEECH. The\n * video pauses the `<audio>` and `<video>` elements inside the question and\n * stops the recorders the SDK started, but it cannot reach a recorder it did\n * not create.\n */\n active: boolean;\n locale?: string;\n /** The answer restored from `responses`. A starting value: read it once, as the SDK's components do. */\n defaultValue?: LearnerResponse;\n /** Whether `submittedSlotIds` names this question: it was handed in before this attempt resumed. */\n defaultSubmitted: boolean;\n /** Its stored outcome from `outcomes`: review, or the grade of a question graded later. Read live. */\n outcome?: ItemOutcome;\n /**\n * An element inside the player, for popovers and tooltips. Portal into it\n * rather than into `document.body`: in fullscreen only the player is painted,\n * and anything outside it silently vanishes. It is drawn above the quiz, is\n * the same element for the life of the player — one for every question, so\n * key what you put in it — and is `null` only before the player's first\n * commit.\n */\n portalContainer: HTMLElement | null;\n /**\n * The AI ports in force for this video — its `ai` prop, else an\n * `LkAiProvider` above it — for a host that offers its own explanations or\n * hints. Absent in `exam`: no question gives AI help there, and the SDK\n * hands its ports to none.\n */\n ai?: LearnerAi;\n /**\n * The video's delivery policy, every setting spelled out: what this question\n * may show. The SDK cannot keep a policy in pixels it does not draw — where\n * `feedback` or `solutions` is `false`, show no mark and no answer.\n */\n delivery: ResolvedDeliveryPolicy;\n /**\n * The video's scoring policy, every setting spelled out: how many tries a\n * question gives, which counts, and what tries and hints cost. The SDK's own\n * questions apply it; a question you draw scores by it with lk-core's\n * `scoreTries`, or not at all.\n */\n scoring: ResolvedItemScoringPolicy;\n /**\n * The learner committed an answer: marks the question answered and forwards\n * to `onSubmit(response, slot)`. Latest wins: call it again for a new take or\n * a corrected answer.\n */\n submit(response: LearnerResponse): void;\n /**\n * The answer has a result: marks the question answered, keeps `score / maxScore`\n * for the end card when `maxScore > 0`, and forwards to\n * `onActivityComplete(result, slot)`. Latest wins. Counts as answered on its\n * own, without a `submit`, and forwards exactly what was called — no\n * `onSubmit` is invented for it.\n */\n complete(result: ActivityResult): void;\n /**\n * The learner withdrew the answer — a \"Try again\". The question is unanswered\n * again and its score forgotten: its step dot empties, a required quiz holds\n * the learner again, and `onFinished` would report it `skipped`. Calls no\n * host callback: the host already knows.\n */\n clear(): void;\n /**\n * Work is on its way for this question — an upload, an assessment. While any\n * question is pending, Finish on the end card waits, and a video that ends\n * does not finish by itself; closing the quiz, paging and seeking do not wait.\n * Call `setPending(false)` however the work ends, a failure included.\n */\n setPending(pending: boolean): void;\n /** Forwards to `onInteraction`, with this question's `activityId` and the time filled in. */\n emit(type: InteractionKind, payload?: Record<string, unknown>): void;\n}\n\nexport interface InteractiveVideoProps {\n /** An item group with a video stimulus and a timeline. Redacted projections in exam and review. */\n group: RenderableItemGroup;\n /**\n * `practice` (the default) grades each question and shows its feedback;\n * `exam` submits without showing correctness — a check-in marked later;\n * `review` shows how each question was marked.\n *\n * `exam` does NOT make the video fit for an official summative exam. The\n * learner controls the recording — rewinds it, slows it, reads its\n * transcript — while the questions are open, and nothing here times a\n * question or holds a single pass. Deliver a paper of record with\n * `<ActivitySequence>`.\n */\n renderMode?: RenderMode;\n /** Where to resume. Read through `readMediaProgress` and clamped; a required quiz is never skipped by a resume. */\n progress?: MediaProgress;\n /** At most every 5 s while playing, and on pause, seek, a quiz opening and the end. */\n onProgress?: (progress: MediaProgress) => void;\n /** Answers restored from the host, by slot id: `AttemptState.responses`. Read once, at mount. */\n responses?: Readonly<Record<string, LearnerResponse>>;\n /**\n * Questions the learner had already submitted, from\n * `AttemptState.submittedSlotIds`: mounted submitted, and counted as\n * answered, so a resumed video neither reopens a committed answer nor stops\n * again at a quiz already done. Read once, at mount.\n */\n submittedSlotIds?: readonly string[];\n /** Stored outcomes, by slot id: review, and the grades of questions graded later. */\n outcomes?: Readonly<Record<string, ItemOutcome>>;\n onSubmit?: (response: LearnerResponse, slot: InteractiveVideoSlot) => void;\n onActivityComplete?: (result: ActivityResult, slot: InteractiveVideoSlot) => void;\n /**\n * Once per mount: when the learner presses Finish, or the video ends with every\n * question answered — either way, only once no answer is still on its way.\n */\n onFinished?: (summary: InteractiveVideoSummary) => void;\n onInteraction?: (event: InteractionEvent) => void;\n /**\n * Draws a question yourself. Called for each question once its quiz has\n * opened, and on every render after;\n * return `undefined` for the SDK's own component, so a host can take over one\n * activity type and leave the rest. `null` draws nothing, and is kept.\n *\n * The video still owns everything around the question: when it opens,\n * whether it counts as answered, whether a required quiz lets the learner go\n * on, pausing, resume and the end summary — all through the calls on\n * {@link InteractiveVideoQuestion}. A question the host draws is never\n * treated differently from one the SDK draws.\n *\n * THE HOST MUST STOP ITS MICROPHONE WHEN `active` TURNS `false`: the SDK stops\n * only the recorders it created. And the SDK cannot keep a mode for pixels it\n * does not draw: in `exam` reveal no correctness, and in `review` accept no\n * answer.\n *\n * What you return is keyed by the question's slot and stays mounted for the\n * life of the player, like the SDK's own questions, and sits inside the same\n * error boundary: a throw degrades that one question, never the video.\n */\n renderQuestion?: (question: InteractiveVideoQuestion) => ReactNode | undefined;\n /**\n * Where read-aloud takes are stored and judged. Required for every read-aloud\n * the SDK draws itself, outside review; a video whose read-alouds are all\n * drawn by `renderQuestion` needs none.\n */\n recordingBinding?: SequenceRecordingBinding;\n /** Speech assessments by slot id, so `review` shows the marks behind a read-aloud's grade. Read live. */\n assessments?: Readonly<Record<string, SpeechAssessment>>;\n /** A self-hosted copy of the read-aloud capture processor, for a strict Content-Security-Policy. */\n workletUrl?: string;\n /**\n * Fetches a caption file with the host's credentials and returns its WebVTT\n * text. Without it, the player fetches `src` itself — which a `<track>`\n * could not do for a URL that needs an Authorization header.\n */\n captionsLoader?: (track: MediaTrack) => Promise<string>;\n /**\n * FORCES preferences: each field given here overrides what the learner chose,\n * every time the video opens. For a starting point the learner can still\n * change — a language pair, say — pass `defaultPreferences` instead. Read when\n * the video opens; the learner's own changes after that hold.\n */\n preferences?: Partial<VideoPreferences>;\n /**\n * Preferences to start from, below what the learner chose in this browser:\n * each field applies until the learner changes it. A host that keeps the\n * learner's choice on their account passes it back here — on a new device\n * nothing is stored, so the account's choice applies; on the same device the\n * stored choice is that same choice. Read live: a value that arrives after\n * the video opens still fills every field nobody chose.\n */\n defaultPreferences?: Partial<VideoPreferences>;\n /**\n * After each change the learner makes — a menu, a shortcut, the volume, the\n * speed — with the preferences now in force and the fields that changed.\n * Never when the video opens, and never for `preferences`. The player still\n * remembers the change in this browser; this is for a host that keeps it on\n * the learner's account as well.\n */\n onPreferencesChange?: (next: VideoPreferences, change: Partial<VideoPreferences>) => void;\n /** A short label in the corner, such as a lesson code. */\n label?: string;\n /** Seed for the option order of multiple-choice and gap-select questions: the attempt id. */\n shuffleSeed?: string;\n locale?: string;\n strings?: LkStringsOverride;\n /**\n * The host's AI ports, for every question the SDK draws: explanations after\n * grading, hints before submit. The same as `LkAiProvider`, for this one\n * video. Nothing AI appears in `exam`. See {@link LearnerAi}.\n */\n ai?: LearnerAi;\n /**\n * What a learner may see around the video's questions — feedback,\n * solutions, hints, AI help — for every question in it, and on the end card:\n * with `feedback: false` it counts answers and shows no score. Each setting\n * only takes away. See `DeliveryPolicy` in lk-core.\n */\n delivery?: DeliveryPolicy | null;\n /**\n * How the video's questions are scored when a learner can try again or ask\n * for hints — for every question in it. A later try replaces a question's\n * grade, as any answer given again does, until the learner finishes: then\n * every question's tries close. See `ItemScoringPolicy` in lk-core.\n *\n * A policy `validateItemScoringPolicy` refuses throws at render.\n */\n scoring?: ItemScoringPolicy | null;\n theme?: Partial<ThemeTokens>;\n sanitizeHtml?: HtmlSanitizer;\n}\n\n/** What distinguishes one video's content from another's: when it changes, the player starts over. */\nfunction contentKey(group: RenderableItemGroup): string {\n try {\n return JSON.stringify([group.id, group.stimulus, group.items, group.timeline]);\n } catch {\n return String(group?.id);\n }\n}\n\n/**\n * An interactive video: a video that pauses at each quiz so the learner can\n * answer it inside the player, then carries on.\n *\n * A formative tool, for lessons and practice — not for official summative\n * exams, which `<ActivitySequence>` delivers. See `renderMode`.\n *\n * The player state is keyed on the CONTENT, not on the object: a host that\n * rebuilds its activity objects on every render — `redactItemGroup` returns a\n * new one each call — must not restart the video or lose an answer. Only a\n * different video, different questions or a moved quiz starts it over.\n */\nexport function InteractiveVideo(props: InteractiveVideoProps) {\n const key = useMemo(() => contentKey(props.group), [props.group]);\n return <Player key={key} {...props} />;\n}\n\n/**\n * The next frame, or a timer where there are no frames: a page rendered in a\n * document that never paints — a test environment, a hidden iframe — must\n * still track the playhead and still announce.\n */\nfunction onNextFrame(run: () => void): () => void {\n if (typeof requestAnimationFrame === 'function') {\n const frame = requestAnimationFrame(run);\n return () => cancelAnimationFrame(frame);\n }\n const timer = setTimeout(run, 33);\n return () => clearTimeout(timer);\n}\n\n/** A track as the cue cache knows it. */\nfunction trackKey(track: MediaTrack): string {\n return `${track.kind}:${track.srclang}:${track.src}`;\n}\n\nconst NO_CUES: Cue[] = [];\n\n/**\n * One caption line's cues: loaded when its track changes, and never another\n * track's. A late answer for a track the line has since left is dropped — a\n * slow Spanish file must never land in a line that now shows Portuguese — and\n * until the new track's cues arrive the line shows nothing rather than the old\n * language, unless they are cached already.\n */\nfunction useCaptionLine(\n track: MediaTrack | undefined,\n load: (track: MediaTrack) => Promise<Cue[]>,\n peek: (key: string) => Cue[] | undefined,\n): { cues: Cue[]; failed: boolean } {\n const key = track === undefined ? undefined : trackKey(track);\n const [line, setLine] = useState<{ key?: string; cues: Cue[]; failed: boolean }>({\n cues: NO_CUES,\n failed: false,\n });\n const trackRef = useRef(track);\n trackRef.current = track;\n useEffect(() => {\n const wanted = trackRef.current;\n if (key === undefined || wanted === undefined) {\n return;\n }\n let live = true;\n load(wanted).then(\n (cues) => {\n if (live) {\n setLine({ key, cues, failed: false });\n }\n },\n () => {\n if (live) {\n setLine({ key, cues: NO_CUES, failed: true });\n }\n },\n );\n return () => {\n live = false;\n };\n }, [key, load]);\n if (key === undefined) {\n return { cues: NO_CUES, failed: false };\n }\n if (line.key === key) {\n return line;\n }\n return { cues: peek(key) ?? NO_CUES, failed: false };\n}\n\n/** What `video-captions-changed` reports: the language of each line on screen, or `null`. */\nfunction captionsShown(\n tracks: readonly MediaTrack[],\n preferences: VideoPreferences,\n): { srclang: string | null; secondary: string | null } {\n if (!preferences.captions) {\n return { srclang: null, secondary: null };\n }\n const shown = resolveCaptionTracks(tracks, preferences);\n return { srclang: shown.primary?.srclang ?? null, secondary: shown.secondary?.srclang ?? null };\n}\n\n/** One id per mount, for the quiz capture groups. Module-level: never a render-time `useId`. */\nlet playerCount = 0;\n\nconst ITEM_TYPES = new Set([\n 'multiple-choice',\n 'fill-in-the-blanks',\n 'gap-select',\n 'dictation',\n 'read-aloud',\n]);\n\nfunction Player(props: InteractiveVideoProps) {\n const {\n renderMode = 'practice',\n onProgress,\n onSubmit,\n onActivityComplete,\n onFinished,\n onInteraction,\n recordingBinding,\n workletUrl,\n captionsLoader,\n label,\n shuffleSeed,\n locale,\n theme,\n sanitizeHtml,\n } = props;\n const strings = useLkStrings(props.strings);\n const aiInForce = useLearnerAi(props.ai);\n // The video's policy, spelled out: its own end card reads it, every\n // question's channel publishes it, and a host's question is handed it.\n const delivery = resolveDeliveryPolicy(props.delivery);\n // And its scoring policy: resolved here, so one nobody could apply fails the\n // player at render rather than grading by a guess.\n const scoringKey = JSON.stringify(props.scoring ?? null);\n // biome-ignore lint/correctness/useExhaustiveDependencies: the policy's content is the trigger, not its identity\n const scoring = useMemo<ResolvedItemScoringPolicy>(\n () => resolveItemScoringPolicy(props.scoring),\n [scoringKey],\n );\n const scoringGiven = props.scoring !== undefined && props.scoring !== null;\n\n // The group this mount was made for. The key above changes whenever the\n // content does, so reading the first one keeps every question's `data`\n // object stable — a renderer resets when its data's identity changes.\n const group = useRef(props.group).current;\n const timeline: MediaTimeline = group.timeline ?? { cues: [] };\n const media = group.stimulus.media;\n const chapters = timeline.chapters ?? [];\n\n const devError = useMemo(() => {\n if (!isDevelopment()) {\n return null;\n }\n if (group.timeline === undefined) {\n return new Error(\n `InteractiveVideo \"${group.id}\" was given an item group with no timeline. Give it a timeline — a list of quizzes, each at a moment of the video — or render it with <ActivitySequence>.`,\n );\n }\n if ((group as { redacted?: unknown }).redacted === true) {\n try {\n assertRedactedItemGroup(group as unknown as Parameters<typeof assertRedactedItemGroup>[0]);\n } catch (error) {\n return error as Error;\n }\n return null;\n }\n const result = validateItemGroup(group);\n return result.success ? null : new ActivitySchemaError('item-group', result.errors);\n }, [group]);\n\n const slots = useMemo(() => {\n try {\n return flattenSequence<RenderableActivity>([group]);\n } catch {\n return [];\n }\n }, [group]);\n\n // The quizzes the video can open: those with at least one question it can show.\n const cues = useMemo(\n () =>\n timeline.cues.filter((cue) =>\n slots.some((slot) => slot.group?.cue?.id === cue.id && ITEM_TYPES.has(slot.activity.type)),\n ),\n [timeline.cues, slots],\n );\n const slotsByCue = useMemo(() => {\n const byCue = new Map<string, SequenceSlot<RenderableActivity>[]>();\n for (const slot of slots) {\n const cueId = slot.group?.cue?.id;\n if (cueId !== undefined && ITEM_TYPES.has(slot.activity.type)) {\n byCue.set(cueId, [...(byCue.get(cueId) ?? []), slot]);\n }\n }\n return byCue;\n }, [slots]);\n\n const [playerId] = useState(() => {\n playerCount += 1;\n return `lk-iv-${playerCount}`;\n });\n\n // ── Preferences ──────────────────────────────────────────────────────\n // Four layers, field by field — see `resolvePreferences`. Storage is read\n // after mount, not during render: a server render has no storage, and a\n // first client render that read it would disagree with the server's.\n const forced = useRef(props.preferences).current;\n // The host's defaults, by content: a host that builds the object afresh on\n // every render must not have them re-resolved on every render.\n const defaultsKey = JSON.stringify(props.defaultPreferences ?? null);\n const defaults = useMemo<unknown>(() => JSON.parse(defaultsKey), [defaultsKey]);\n // What the learner changed while this video has been open.\n const chosen = useRef<Partial<VideoPreferences>>({});\n const [preferences, setPreferences] = useState<VideoPreferences>(() =>\n resolvePreferences({ force: forced, defaults: props.defaultPreferences }),\n );\n const preferencesRef = useRef(preferences);\n preferencesRef.current = preferences;\n useEffect(() => {\n setPreferences(\n resolvePreferences({\n force: forced,\n stored: readStoredPreferences(),\n defaults,\n chosen: chosen.current,\n }),\n );\n }, [forced, defaults]);\n\n // ── Answers ──────────────────────────────────────────────────────────\n // Read at mount, like `responses`: a later change is a different attempt,\n // and a different attempt is a remount with a new `key`.\n const [submitted] = useState(() => new Set(props.submittedSlotIds ?? []));\n const [answered, setAnswered] = useState<ReadonlySet<string>>(() => {\n const seeded = new Set<string>();\n for (const slot of slots) {\n if (\n submitted.has(slot.slotId) ||\n (props.outcomes !== undefined && Object.hasOwn(props.outcomes, slot.slotId))\n ) {\n seeded.add(slot.slotId);\n }\n }\n return seeded;\n });\n const answeredRef = useRef(answered);\n answeredRef.current = answered;\n const setSlotAnswered = useCallback((slotId: string, on: boolean) => {\n setAnswered((previous) => {\n if (previous.has(slotId) === on) {\n return previous;\n }\n const next = new Set(previous);\n if (on) {\n next.add(slotId);\n } else {\n next.delete(slotId);\n }\n answeredRef.current = next;\n return next;\n });\n }, []);\n // Each question's latest `score / maxScore`, for the end card. State, not a\n // ref: a second result for a question already answered changes the score and\n // nothing else, and the card must still show it.\n const [scores, setScores] = useState<ReadonlyMap<string, number>>(() => new Map());\n const setSlotScore = useCallback((slotId: string, score: number | undefined) => {\n setScores((previous) => {\n if (previous.get(slotId) === score) {\n return previous;\n }\n const next = new Map(previous);\n if (score === undefined) {\n next.delete(slotId);\n } else {\n next.set(slotId, score);\n }\n return next;\n });\n }, []);\n\n // Work on its way — a take being stored or judged — by source and question:\n // `host:<slotId>` from `setPending`, `take:<slotId>` from an SDK read-aloud's\n // channel. While any is here, nothing hands the attempt over.\n const [pending, setPendingState] = useState<ReadonlySet<string>>(() => new Set());\n const pendingRef = useRef(pending);\n const setPendingKey = useCallback((key: string, on: boolean) => {\n setPendingState((previous) => {\n if (previous.has(key) === on) {\n return previous;\n }\n const next = new Set(previous);\n if (on) {\n next.add(key);\n } else {\n next.delete(key);\n }\n pendingRef.current = next;\n return next;\n });\n }, []);\n // The latest take each SDK read-aloud reported: a report for an older take\n // describes one the learner has replaced.\n const latestTakes = useRef(new Map<string, number>());\n\n // False once the player has unmounted: a late call from a question's upload\n // or assessment then describes nothing on screen. Set in the effect as well\n // as cleared in its cleanup, for the remount a development build rehearses.\n const alive = useRef(true);\n useEffect(() => {\n alive.current = true;\n return () => {\n alive.current = false;\n };\n }, []);\n const finished = useCallback(\n (cueId: string): boolean =>\n (slotsByCue.get(cueId) ?? []).every((slot) => answeredRef.current.has(slot.slotId)),\n [slotsByCue],\n );\n\n // ── Playback state ───────────────────────────────────────────────────\n const shellRef = useRef<HTMLDivElement>(null);\n const videoRef = useRef<HTMLVideoElement>(null);\n const playButtonRef = useRef<HTMLButtonElement>(null);\n const quizHeadingRef = useRef<HTMLHeadingElement>(null);\n // Where a host's question portals its popovers: inside the shell, so it is\n // painted in fullscreen. State rather than a ref, so the render after the\n // first commit hands every question the element and not `null`.\n const [portalContainer, setPortalContainer] = useState<HTMLDivElement | null>(null);\n const [playing, setPlaying] = useState(false);\n const [waiting, setWaiting] = useState(false);\n const [errorCode, setErrorCode] = useState<number | null>(null);\n const [current, setCurrent] = useState(0);\n const [duration, setDuration] = useState(0);\n const [buffered, setBuffered] = useState(0);\n const [scrubbing, setScrubbing] = useState(false);\n const [ended, setEnded] = useState(false);\n const [fullscreen, setFullscreen] = useState(false);\n const [pictureInPicture, setPictureInPicture] = useState(false);\n const [countdown, setCountdown] = useState(false);\n const [menu, setMenu] = useState<'speed' | 'settings' | null>(null);\n const [sheet, setSheet] = useState(false);\n const [panelTab, setPanelTab] = useState<'contents' | 'transcript'>('contents');\n const [chromeShown, setChromeShown] = useState(true);\n const [focusInChrome, setFocusInChrome] = useState(false);\n const [announcement, setAnnouncement] = useState('');\n const previousTime = useRef(0);\n const furthest = useRef(0);\n const [furthestShown, setFurthestShown] = useState(0);\n const lastProgressAt = useRef(0);\n const hideTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n // How the last press arrived: a tap on a playing video brings the controls\n // back first, where a click pauses it.\n const lastPointer = useRef('mouse');\n const finishedOnce = useRef(false);\n // Finishing closes every question's tries; state as well as the ref, so the\n // questions re-render to see it.\n const [, setFinishedState] = useState(false);\n\n // ── Quizzes ──────────────────────────────────────────────────────────\n const [openQuiz, setOpenQuiz] = useState<{ cueId: string; step: number } | null>(null);\n const openQuizRef = useRef(openQuiz);\n openQuizRef.current = openQuiz;\n const [mounted, setMounted] = useState<ReadonlySet<string>>(new Set());\n // Quizzes closed with Continue or Skip in this session: never reopened by playback.\n const handled = useRef(new Set<string>());\n\n const announce = useCallback((text: string) => {\n // Cleared first, so the same sentence twice is announced twice.\n setAnnouncement('');\n onNextFrame(() => setAnnouncement(text));\n }, []);\n const emit = useCallback(\n (type: string, payload?: Record<string, unknown>) => {\n onInteraction?.({\n type,\n activityId: group.id,\n timestamp: Date.now(),\n ...(payload !== undefined ? { payload } : {}),\n } as InteractionEvent);\n },\n [onInteraction, group.id],\n );\n const reportProgress = useCallback(\n (force: boolean) => {\n const video = videoRef.current;\n if (onProgress === undefined || video === null) {\n return;\n }\n const now = Date.now();\n if (!force && now - lastProgressAt.current < 5000) {\n return;\n }\n lastProgressAt.current = now;\n onProgress({ progressVersion: '1.0', at: video.currentTime, furthest: furthest.current });\n },\n [onProgress],\n );\n\n const quizTitle = useCallback(\n (cue: TimelineCue): string => cue.title ?? strings.videoQuiz,\n [strings.videoQuiz],\n );\n\n const openAt = useCallback(\n (cue: TimelineCue) => {\n const video = videoRef.current;\n const quizSlots = slotsByCue.get(cue.id) ?? [];\n if (video !== null) {\n video.pause();\n if (Math.abs(video.currentTime - cue.at) > 0.25 && cue.at <= (video.duration || cue.at)) {\n video.currentTime = Math.min(cue.at, video.duration || cue.at);\n }\n previousTime.current = cue.at;\n // A quiz cannot draw over native fullscreen or a picture-in-picture\n // window: both hold only the video. Leave them, then show the quiz.\n const webkit = video as HTMLVideoElement & {\n webkitDisplayingFullscreen?: boolean;\n webkitExitFullscreen?: () => void;\n };\n if (webkit.webkitDisplayingFullscreen) {\n webkit.webkitExitFullscreen?.();\n }\n if (typeof document !== 'undefined' && document.pictureInPictureElement === video) {\n void document.exitPictureInPicture?.().catch(() => undefined);\n }\n }\n const firstOpen = quizSlots.findIndex((slot) => !answeredRef.current.has(slot.slotId));\n setMenu(null);\n setSheet(false);\n setEnded(false);\n setMounted((previous) => (previous.has(cue.id) ? previous : new Set([...previous, cue.id])));\n setOpenQuiz({ cueId: cue.id, step: firstOpen === -1 ? 0 : firstOpen });\n announce(strings.videoQuizOpened(clock(cue.at), quizSlots.length));\n emit('video-quiz-opened', { cueId: cue.id, at: cue.at });\n reportProgress(true);\n },\n [slotsByCue, announce, strings, emit, reportProgress],\n );\n\n // Focus moves into the quiz when it opens, to its heading.\n useEffect(() => {\n if (openQuiz !== null) {\n quizHeadingRef.current?.focus();\n }\n }, [openQuiz?.cueId, openQuiz]);\n\n const closeQuiz = useCallback(\n (how: 'continue' | 'skip' | 'rewatch') => {\n const open = openQuizRef.current;\n if (open === null) {\n return;\n }\n const cue = cues.find((candidate) => candidate.id === open.cueId);\n // Whatever was being recorded or played inside the quiz stops with it:\n // each question's pane does that as it is hidden.\n setOpenQuiz(null);\n const video = videoRef.current;\n if (how === 'rewatch' && cue !== undefined && video !== null) {\n const earlier = [...cues.map((c) => c.at), ...chapters.map((c) => c.at)]\n .filter((at) => at < cue.at - 0.5)\n .sort((a, b) => b - a)[0];\n const to = earlier ?? 0;\n video.currentTime = to;\n previousTime.current = to;\n setCurrent(to);\n } else if (cue !== undefined) {\n handled.current.add(cue.id);\n emit(how === 'skip' ? 'video-quiz-skipped' : 'video-quiz-closed', { cueId: cue.id });\n }\n playButtonRef.current?.focus();\n if (\n video !== null &&\n !(video.ended || (duration > 0 && video.currentTime >= duration - 0.05))\n ) {\n void video.play().catch(() => setPlaying(false));\n } else if (video !== null) {\n // At the end: a quiz placed at the end may be followed by another.\n const next = quizzesAtEnd(cues, duration, handled.current)[0];\n if (next !== undefined) {\n openAt(next);\n } else {\n setEnded(true);\n }\n }\n },\n [cues, chapters, emit, duration, openAt],\n );\n\n // ── The clock ────────────────────────────────────────────────────────\n const onTick = useCallback(\n (now: number) => {\n const before = previousTime.current;\n previousTime.current = now;\n if (now > furthest.current) {\n furthest.current = now;\n }\n if (openQuizRef.current !== null || scrubbing) {\n return;\n }\n const crossed = crossedQuiz(cues, before, now, handled.current);\n if (crossed !== undefined) {\n openAt(crossed);\n }\n },\n [cues, scrubbing, openAt],\n );\n\n // Frames, not `timeupdate`: `timeupdate` fires about four times a second,\n // which lurches the bar and — at 2.5× — lets a quiz slip 0.6 s past its mark.\n useEffect(() => {\n if (!playing || scrubbing) {\n return;\n }\n let cancel = () => {};\n const tick = (): void => {\n const video = videoRef.current;\n if (video !== null) {\n setCurrent(video.currentTime);\n setBuffered(bufferedAhead(video));\n onTick(video.currentTime);\n if (furthest.current > furthestShown + 1) {\n setFurthestShown(furthest.current);\n }\n reportProgress(false);\n }\n cancel = onNextFrame(tick);\n };\n cancel = onNextFrame(tick);\n return () => cancel();\n }, [playing, scrubbing, onTick, reportProgress, furthestShown]);\n\n // ── Seeking ──────────────────────────────────────────────────────────\n const seek = useCallback(\n (to: number) => {\n const video = videoRef.current;\n if (video === null || duration <= 0) {\n return;\n }\n const from = video.currentTime;\n const target = Math.min(Math.max(0, to), duration);\n const limited =\n renderMode === 'review'\n ? { at: target }\n : limitSeek(timeline, from, target, furthest.current, finished);\n video.currentTime = limited.at;\n // A seek never opens a quiz by crossing it; only playback does.\n previousTime.current = limited.at;\n setCurrent(limited.at);\n setEnded(false);\n emit('video-seeked', { from, to: limited.at, clamped: limited.hold !== undefined });\n if (limited.hold?.kind === 'required') {\n // Opened first, so the reason is the sentence that is heard: the\n // quiz's own announcement would otherwise replace it.\n openAt(limited.hold.cue);\n announce(strings.videoHeldAtQuiz(clock(limited.hold.cue.at)));\n } else if (limited.hold?.kind === 'no-skip-ahead') {\n announce(strings.videoHeldAhead);\n }\n reportProgress(true);\n },\n [duration, renderMode, timeline, finished, emit, announce, strings, openAt, reportProgress],\n );\n\n const togglePlay = useCallback(() => {\n const video = videoRef.current;\n if (video === null) {\n return;\n }\n if (ended) {\n setEnded(false);\n handled.current.clear();\n video.currentTime = 0;\n previousTime.current = -1;\n void video.play().catch(() => setPlaying(false));\n return;\n }\n if (video.paused) {\n // The first play: a quiz at 0 opens before anything plays.\n if (video.currentTime === 0 && previousTime.current <= 0) {\n const atStart = crossedQuiz(cues, -1, 0, handled.current);\n if (atStart !== undefined) {\n previousTime.current = 0;\n openAt(atStart);\n return;\n }\n }\n void video.play().catch(() => setPlaying(false));\n } else {\n video.pause();\n }\n }, [ended, cues, openAt]);\n\n // ── Captions ─────────────────────────────────────────────────────────\n const tracks: MediaTrack[] = useMemo(() => {\n if (media?.tracks !== undefined && media.tracks.length > 0) {\n return media.tracks.filter(\n (track) => track.kind === 'captions' || track.kind === 'subtitles',\n );\n }\n return media?.captionsUrl !== undefined\n ? [\n {\n kind: 'captions',\n src: media.captionsUrl,\n srclang: locale ?? 'en',\n label: strings.videoCaptionLanguage,\n },\n ]\n : [];\n }, [media, locale, strings.videoCaptionLanguage]);\n const { primary: primaryTrack, secondary: secondaryTrack } = useMemo(\n () =>\n resolveCaptionTracks(tracks, {\n captionLanguage: preferences.captionLanguage,\n secondaryCaptionLanguage: preferences.secondaryCaptionLanguage,\n }),\n [tracks, preferences.captionLanguage, preferences.secondaryCaptionLanguage],\n );\n const loaderRef = useRef(captionsLoader);\n loaderRef.current = captionsLoader;\n // Parsed cues per track, for the life of the mount: switching languages back\n // and forth never refetches. The promise while a file loads — so a swap, which\n // asks for a file both lines want, makes one request — and the cues once it\n // has. A failure is forgotten, so coming back to that language tries again.\n const loading = useRef(new Map<string, Promise<Cue[]>>());\n const loaded = useRef(new Map<string, Cue[]>());\n const loadCues = useCallback((track: MediaTrack): Promise<Cue[]> => {\n const key = trackKey(track);\n const pending = loading.current.get(key);\n if (pending !== undefined) {\n return pending;\n }\n const request = Promise.resolve()\n .then(() =>\n loaderRef.current\n ? loaderRef.current(track)\n : fetch(track.src, { credentials: 'same-origin' }).then((response) => {\n if (!response.ok) {\n throw new Error(String(response.status));\n }\n return response.text();\n }),\n )\n .then((text) => {\n const parsed = parseWebVtt(text);\n if (parsed.length === 0) {\n throw new Error('The caption file held no cues.');\n }\n loaded.current.set(key, parsed);\n return parsed;\n });\n loading.current.set(key, request);\n request.catch(() => {\n loading.current.delete(key);\n });\n return request;\n }, []);\n const peekCues = useCallback((key: string) => loaded.current.get(key), []);\n const primaryLine = useCaptionLine(primaryTrack, loadCues, peekCues);\n const secondaryLine = useCaptionLine(secondaryTrack, loadCues, peekCues);\n const primaryCues = primaryLine.cues;\n const secondaryCues = secondaryLine.cues;\n // Per line: a second language that failed never takes the first one with it.\n const captionsFailed = { primary: primaryLine.failed, secondary: secondaryLine.failed };\n const hasCaptions = primaryCues.length > 0 || secondaryCues.length > 0;\n // The transcript and the preview on the bar are the first line's.\n const hasTranscript = primaryCues.length > 0;\n const activeCueIndex = useMemo(() => cueIndexAt(primaryCues, current), [primaryCues, current]);\n const secondaryCueIndex = useMemo(\n () => cueIndexAt(secondaryCues, current),\n [secondaryCues, current],\n );\n const spoilerLimit =\n timeline.navigation === 'no-skip-ahead' && renderMode !== 'review'\n ? Math.max(furthestShown, current)\n : Number.POSITIVE_INFINITY;\n\n // ── Changing preferences ─────────────────────────────────────────────\n const onPreferencesChangeRef = useRef(props.onPreferencesChange);\n onPreferencesChangeRef.current = props.onPreferencesChange;\n const tracksRef = useRef(tracks);\n tracksRef.current = tracks;\n /** The last second language the learner had, for Shift + C to bring back. */\n const lastSecondary = useRef<string | null>(null);\n /**\n * A change the learner made: applied, remembered in this browser, handed to\n * the host, and — when it changes the captions on screen — reported.\n */\n const changePreferences = useCallback(\n (change: Partial<VideoPreferences>) => {\n const previous = preferencesRef.current;\n const next = applyPreferenceChange(previous, change);\n if (previous.secondaryCaptionLanguage !== null) {\n lastSecondary.current = previous.secondaryCaptionLanguage;\n }\n chosen.current = { ...chosen.current, ...change };\n preferencesRef.current = next;\n setPreferences(next);\n rememberPreferences(change);\n onPreferencesChangeRef.current?.(next, change);\n const before = captionsShown(tracksRef.current, previous);\n const after = captionsShown(tracksRef.current, next);\n if (before.srclang !== after.srclang || before.secondary !== after.secondary) {\n emit('video-captions-changed', after);\n }\n },\n [emit],\n );\n\n /**\n * A first language picked from the menu. Picking the language the second\n * line shows swaps the two — English + Español becomes Español + English —\n * rather than silently dropping one.\n */\n const chooseCaptionTrack = (track: MediaTrack): void => {\n const swaps =\n primaryTrack !== undefined &&\n secondaryTrack !== undefined &&\n track.srclang.toLowerCase() === secondaryTrack.srclang.toLowerCase();\n changePreferences({\n captions: true,\n captionLanguage: track.srclang,\n ...(swaps ? { secondaryCaptionLanguage: primaryTrack.srclang } : {}),\n });\n };\n\n /** A second language picked from the menu, or none. Picking one shows the captions. */\n const chooseSecondaryTrack = (track: MediaTrack | null): void => {\n changePreferences(\n track === null\n ? { secondaryCaptionLanguage: null }\n : { secondaryCaptionLanguage: track.srclang, captions: true },\n );\n };\n\n /**\n * Shift + C. With a second line showing, it goes; with one chosen but the\n * captions off, the pair comes back; otherwise a second line comes on — the\n * last language the learner had, else the host's suggestion, else the first\n * other language the video has. Pressing the key is asking for a second\n * line, so that first language is the learner's choice, not a fallback the\n * player made for them. With no other language at all, it says so and\n * changes nothing.\n */\n const toggleSecondary = (): void => {\n if (secondaryTrack !== undefined) {\n changePreferences(\n preferences.captions ? { secondaryCaptionLanguage: null } : { captions: true },\n );\n return;\n }\n const wanted = [\n lastSecondary.current,\n preferences.secondaryCaptionLanguage,\n sanitizePartialPreferences(defaults).secondaryCaptionLanguage ?? null,\n secondaryCandidates(tracks, primaryTrack)[0]?.srclang ?? null,\n ];\n for (const language of wanted) {\n if (language === null) {\n continue;\n }\n const { secondary } = resolveCaptionTracks(tracks, {\n captionLanguage: preferences.captionLanguage,\n secondaryCaptionLanguage: language,\n });\n if (secondary !== undefined) {\n changePreferences({ secondaryCaptionLanguage: secondary.srclang, captions: true });\n return;\n }\n }\n announce(strings.videoNoSecondLanguage);\n };\n\n // ── Element state React does not own ─────────────────────────────────\n useEffect(() => {\n const video = videoRef.current;\n if (video !== null) {\n video.playbackRate = preferences.speed;\n video.volume = preferences.volume;\n video.muted = preferences.muted;\n }\n }, [preferences.speed, preferences.volume, preferences.muted]);\n\n useEffect(() => {\n const onChange = (): void => setFullscreen(document.fullscreenElement === shellRef.current);\n document.addEventListener('fullscreenchange', onChange);\n return () => document.removeEventListener('fullscreenchange', onChange);\n }, []);\n\n // React has no props for these two events.\n useEffect(() => {\n const video = videoRef.current;\n if (video === null) {\n return;\n }\n const enter = (): void => {\n setPictureInPicture(true);\n emit('video-pip-changed', { on: true });\n };\n const leave = (): void => {\n setPictureInPicture(false);\n emit('video-pip-changed', { on: false });\n };\n video.addEventListener('enterpictureinpicture', enter);\n video.addEventListener('leavepictureinpicture', leave);\n return () => {\n video.removeEventListener('enterpictureinpicture', enter);\n video.removeEventListener('leavepictureinpicture', leave);\n };\n }, [emit]);\n\n useEffect(\n () => () => {\n if (hideTimer.current !== null) {\n clearTimeout(hideTimer.current);\n }\n },\n [],\n );\n\n const revealChrome = useCallback(() => {\n setChromeShown(true);\n if (hideTimer.current !== null) {\n clearTimeout(hideTimer.current);\n }\n hideTimer.current = setTimeout(() => setChromeShown(false), 2400);\n }, []);\n\n const toggleFullscreen = useCallback(() => {\n const shell = shellRef.current;\n const video = videoRef.current as\n | (HTMLVideoElement & { webkitEnterFullscreen?: () => void })\n | null;\n if (typeof document === 'undefined' || shell === null) {\n return;\n }\n if (document.fullscreenElement) {\n void document.exitFullscreen().catch(() => undefined);\n } else if (\n typeof shell.requestFullscreen === 'function' &&\n document.fullscreenEnabled !== false\n ) {\n void shell.requestFullscreen().catch(() => undefined);\n } else {\n // iPhone: only the video element can go fullscreen, natively. A quiz\n // takes it back out before it opens.\n video?.webkitEnterFullscreen?.();\n }\n emit('video-fullscreen-changed');\n }, [emit]);\n\n const pictureInPictureSupported =\n typeof document !== 'undefined' && document.pictureInPictureEnabled === true;\n const togglePictureInPicture = useCallback(() => {\n const video = videoRef.current;\n if (video === null) {\n return;\n }\n if (document.pictureInPictureElement) {\n void document.exitPictureInPicture().catch(() => undefined);\n } else {\n void video.requestPictureInPicture?.().catch(() => undefined);\n }\n }, []);\n\n // ── Keyboard ─────────────────────────────────────────────────────────\n const jumpPoints = useMemo(\n () =>\n [...new Set([...chapters.map((c) => c.at), ...cues.map((c) => c.at)])].sort((a, b) => a - b),\n [chapters, cues],\n );\n const onKeyDown = (event: React.KeyboardEvent<HTMLDivElement>): void => {\n // A quiz owns the keyboard while it is open: a letter typed into an answer\n // must never scrub the video.\n if (openQuiz !== null || !preferences.shortcuts) {\n return;\n }\n const target = event.target as HTMLElement;\n if (\n target.isContentEditable ||\n ['INPUT', 'TEXTAREA', 'SELECT'].includes(target.tagName) ||\n (target.tagName === 'BUTTON' && (event.key === ' ' || event.key === 'Enter'))\n ) {\n return;\n }\n if (event.ctrlKey || event.metaKey || event.altKey) {\n return;\n }\n const video = videoRef.current;\n const key = event.key;\n const done = (): void => {\n event.preventDefault();\n revealChrome();\n };\n if (/^[0-9]$/.test(key)) {\n done();\n seek((Number(key) / 10) * duration);\n return;\n }\n switch (key) {\n case ' ':\n case 'k':\n case 'K':\n done();\n togglePlay();\n return;\n case 'j':\n case 'J':\n done();\n seek(current - JUMP_SECONDS);\n return;\n case 'l':\n case 'L':\n done();\n seek(current + JUMP_SECONDS);\n return;\n case 'ArrowLeft':\n done();\n seek(current - (event.shiftKey ? 1 : 5));\n return;\n case 'ArrowRight':\n done();\n seek(current + (event.shiftKey ? 1 : 5));\n return;\n case 'Home':\n done();\n seek(0);\n return;\n case 'End':\n done();\n seek(duration);\n return;\n case ',':\n case '.':\n done();\n video?.pause();\n seek(current + (key === ',' ? -FRAME_SECONDS : FRAME_SECONDS));\n return;\n case '<':\n case '>':\n done();\n changePreferences({ speed: nudgeSpeed(preferences.speed, key === '<' ? -1 : 1) });\n return;\n case '[': {\n done();\n const previous = [...jumpPoints].reverse().find((at) => at < current - 1);\n seek(previous ?? 0);\n return;\n }\n case ']': {\n done();\n const next = jumpPoints.find((at) => at > current + 0.5);\n if (next !== undefined) {\n seek(next);\n }\n return;\n }\n case 'm':\n case 'M':\n done();\n changePreferences({ muted: !preferences.muted });\n return;\n case 'c':\n case 'C':\n // Shift + C is the second line; C is both lines together.\n if (event.shiftKey) {\n done();\n toggleSecondary();\n } else if (hasCaptions) {\n done();\n changePreferences({ captions: !preferences.captions });\n }\n return;\n case 't':\n case 'T':\n if (hasTranscript) {\n done();\n setPanelTab('transcript');\n changePreferences({ panel: !(preferences.panel && panelTab === 'transcript') });\n }\n return;\n case 'p':\n case 'P':\n if (pictureInPictureSupported) {\n done();\n togglePictureInPicture();\n }\n return;\n case 'f':\n case 'F':\n done();\n toggleFullscreen();\n return;\n case '?':\n done();\n setSheet((open) => !open);\n return;\n default:\n return;\n }\n };\n\n // ── Quiz status, for markers, contents and the end screen ────────────\n const quizzes: ContentsQuiz[] = cues.map((cue) => {\n const quizSlots = slotsByCue.get(cue.id) ?? [];\n const count = quizSlots.filter((slot) => answered.has(slot.slotId)).length;\n return {\n id: cue.id,\n at: cue.at,\n title: quizTitle(cue),\n answered: count,\n total: quizSlots.length,\n // In review the attempt is over: nothing is required of the learner any\n // more, in the list or on the bar.\n required: cue.required === true && renderMode !== 'review',\n state: markerState(quizSlots, answered, renderMode, props.outcomes),\n };\n });\n const markers: ScrubberMarker[] = quizzes.map((quiz) => ({\n id: quiz.id,\n at: quiz.at,\n label: `${quiz.title} · ${strings.videoQuizProgress(quiz.answered, quiz.total)}`,\n state: quiz.state,\n required: quiz.required,\n }));\n const totalQuestions = quizzes.reduce((sum, quiz) => sum + quiz.total, 0);\n const answeredCount = quizzes.reduce((sum, quiz) => sum + quiz.answered, 0);\n const graded = [...scores.values()];\n const percent =\n graded.length === 0\n ? null\n : Math.round((graded.reduce((a, b) => a + b, 0) / graded.length) * 100);\n\n const summary = useCallback((): InteractiveVideoSummary => {\n return {\n slots: slots\n .filter((slot) => slot.group?.cue !== undefined)\n .map((slot) => {\n const cueId = slot.group?.cue?.id as string;\n return {\n slotId: slot.slotId,\n activityId: slot.activity.id,\n cueId,\n status: answeredRef.current.has(slot.slotId)\n ? ('answered' as const)\n : handled.current.has(cueId)\n ? ('skipped' as const)\n : ('unreached' as const),\n };\n }),\n };\n }, [slots]);\n // Finishing hands the attempt over, so both ways to it — Finish, and the end\n // of the video — wait for every answer on its way: a take still uploading is\n // not answered yet, and would be reported skipped and then submitted after the\n // summary that called it skipped.\n const finish = useCallback(() => {\n if (finishedOnce.current) {\n return;\n }\n finishedOnce.current = true;\n setFinishedState(true);\n onFinished?.(summary());\n }, [onFinished, summary]);\n const answerPending = pending.size > 0;\n // The video ended with every question answered: that is finishing too — once\n // nothing is on its way.\n useEffect(() => {\n if (\n ended &&\n !answerPending &&\n totalQuestions > 0 &&\n answeredCount === totalQuestions &&\n renderMode !== 'review'\n ) {\n finish();\n }\n }, [ended, answerPending, totalQuestions, answeredCount, renderMode, finish]);\n\n // ── Rendering the questions ──────────────────────────────────────────\n const slotBindings = useMemo(() => {\n const bindings = new Map<string, RecordingBinding>();\n if (recordingBinding === undefined) {\n return bindings;\n }\n // As the pager builds them: called on the binding, so a binding written as\n // a class keeps its `this`, and `assess` / `playbackUrl` copied only when\n // supplied — a binding carrying `assess: undefined` is one a take would call.\n const { assess, playbackUrl } = recordingBinding;\n for (const slot of slots) {\n const place: SequenceRecordingSlot = {\n slotId: slot.slotId,\n index: slot.index,\n activityId: slot.activity.id,\n };\n bindings.set(slot.slotId, {\n upload: (take) => recordingBinding.upload(take, place),\n ...(assess !== undefined\n ? { assess: (ref) => assess.call(recordingBinding, ref, place) }\n : {}),\n ...(playbackUrl !== undefined\n ? { playbackUrl: (ref) => playbackUrl.call(recordingBinding, ref, place) }\n : {}),\n });\n }\n return bindings;\n }, [slots, recordingBinding]);\n\n // ── What each question reports through ──────────────────────────────\n // Where each question sits: one object per question for the life of the\n // player, handed to `onSubmit` and to `renderQuestion` alike.\n const places = useMemo(() => {\n const byId = new Map<string, InteractiveVideoSlot>();\n for (const [cueId, cueSlots] of slotsByCue) {\n for (const slot of cueSlots) {\n byId.set(slot.slotId, {\n slotId: slot.slotId,\n index: slot.index,\n activityId: slot.activity.id,\n cueId,\n });\n }\n }\n return byId;\n }, [slotsByCue]);\n\n // The host's callbacks as of the latest render: the calls below keep one\n // identity for the life of the player, so they read these through a ref.\n const reportTo = useRef({\n onSubmit,\n onActivityComplete,\n onInteraction,\n renderMode,\n delivery,\n scoring: scoringGiven ? scoring : undefined,\n });\n reportTo.current = {\n onSubmit,\n onActivityComplete,\n onInteraction,\n renderMode,\n delivery,\n scoring: scoringGiven ? scoring : undefined,\n };\n\n /**\n * The calls a question reports what the learner did through — the SDK's own\n * components and a host's alike, so nothing downstream can tell them apart.\n * Made once per question.\n */\n const calls = useRef(new Map<string, QuestionCalls>());\n const callsFor = (place: InteractiveVideoSlot): QuestionCalls => {\n const made = calls.current.get(place.slotId);\n if (made !== undefined) {\n return made;\n }\n const { slotId } = place;\n const warned = new Set<string>();\n // Nothing is submittable in review. The SDK's own components never try; a\n // host's is told, once per call, that its answer went nowhere.\n const refused = (call: string): boolean => {\n if (reportTo.current.renderMode !== 'review') {\n return false;\n }\n if (isDevelopment() && !warned.has(call)) {\n warned.add(call);\n console.warn(\n `InteractiveVideo: \\`${call}()\\` was called for question \"${slotId}\" in renderMode \"review\", where nothing is submittable. It was ignored.`,\n );\n }\n return true;\n };\n const next: QuestionCalls = {\n submit: (response) => {\n if (!alive.current || refused('submit')) {\n return;\n }\n setSlotAnswered(slotId, true);\n reportTo.current.onSubmit?.(response, place);\n },\n complete: (result) => {\n if (!alive.current || refused('complete')) {\n return;\n }\n setSlotAnswered(slotId, true);\n // Latest wins, a result with nothing to score included: the card shows\n // the score of the answer the question holds now, or none.\n setSlotScore(slotId, result.maxScore > 0 ? result.score / result.maxScore : undefined);\n reportTo.current.onActivityComplete?.(result, place);\n },\n clear: () => {\n if (!alive.current || refused('clear')) {\n return;\n }\n setSlotAnswered(slotId, false);\n setSlotScore(slotId, undefined);\n },\n setPending: (on) => {\n if (!alive.current) {\n return;\n }\n setPendingKey(`host:${slotId}`, on === true);\n },\n emit: (type, payload) => {\n if (!alive.current) {\n return;\n }\n reportTo.current.onInteraction?.({\n type,\n activityId: place.activityId,\n timestamp: Date.now(),\n ...(payload !== undefined ? { payload } : {}),\n } as InteractionEvent);\n },\n };\n calls.current.set(slotId, next);\n return next;\n };\n\n /**\n * What an SDK read-aloud reports about each take, through its slot's channel.\n * A take being stored or judged is on its way; every other state is not. A\n * failure the learner may retry is not on its way either: nothing comes of\n * it unless they press Try again, which reports the take in flight again.\n * (A pager holds its set for one while the learner is on that question; the\n * video's Finish is on the end card, where no question is.)\n */\n const reportTake = (slotId: string, take: number, state: TakeState): void => {\n if (!alive.current) {\n return;\n }\n const latest = latestTakes.current.get(slotId);\n if (latest !== undefined && take < latest) {\n return;\n }\n latestTakes.current.set(slotId, take);\n setPendingKey(`take:${slotId}`, state === 'in-flight');\n };\n // One channel per question for the life of the player: a recorder joins its\n // capture group once, and a new object each render would re-render it.\n // `reportTake` reads only refs and stable setters, so the first render's is\n // as good as any.\n const channels = useRef(new Map<string, SequenceSlotChannel>());\n const channelFor = (slotId: string): SequenceSlotChannel => {\n let channel = channels.current.get(slotId);\n if (channel === undefined) {\n channel = {\n captureGroup: `${playerId}::${slotId}`,\n // Read live, so a question drawn by the host cannot be offered AI help\n // by a provider above the player while the video is an exam.\n get renderMode() {\n return reportTo.current.renderMode;\n },\n get delivery() {\n return reportTo.current.delivery;\n },\n get scoring() {\n return reportTo.current.scoring;\n },\n get triesClosed() {\n return finishedOnce.current;\n },\n // The video waits for no try: its Finish is on the end card, where no\n // question is, and finishing closes every question's tries.\n triesState: () => {},\n takeState: (take, state) => reportTake(slotId, take, state),\n };\n channels.current.set(slotId, channel);\n }\n return channel;\n };\n\n // ── Rendering the questions ──────────────────────────────────────────\n /** What the host restored for a question: read the way the SDK's components read it. */\n const seedsFor = (\n slotId: string,\n ): { restored: LearnerResponse | undefined; outcome: ItemOutcome | undefined } => ({\n restored:\n props.responses !== undefined && Object.hasOwn(props.responses, slotId)\n ? props.responses[slotId]\n : undefined,\n outcome:\n props.outcomes !== undefined && Object.hasOwn(props.outcomes, slotId)\n ? props.outcomes[slotId]\n : undefined,\n });\n\n /** The question as `renderQuestion` is handed it. */\n const questionFor = (\n slot: SequenceSlot<RenderableActivity>,\n place: InteractiveVideoSlot,\n active: boolean,\n ): InteractiveVideoQuestion => {\n const { restored, outcome } = seedsFor(slot.slotId);\n return {\n activity: slot.activity,\n slot: place,\n renderMode,\n active,\n ...(locale !== undefined ? { locale } : {}),\n ...(restored !== undefined ? { defaultValue: restored } : {}),\n defaultSubmitted: submitted.has(slot.slotId),\n ...(outcome !== undefined ? { outcome } : {}),\n portalContainer,\n ...(aiInForce !== undefined && renderMode !== 'exam' ? { ai: aiInForce } : {}),\n delivery,\n scoring,\n ...callsFor(place),\n };\n };\n\n /** The SDK's own component for a question. */\n const sdkQuestion = (\n slot: SequenceSlot<RenderableActivity>,\n place: InteractiveVideoSlot,\n ): ReactNode => {\n const activity = slot.activity;\n const { restored, outcome } = seedsFor(slot.slotId);\n const reported = callsFor(place);\n const common = {\n renderMode,\n ...(restored !== undefined ? { defaultValue: restored } : {}),\n ...(submitted.has(slot.slotId) ? { defaultSubmitted: true } : {}),\n ...(outcome !== undefined ? { outcome } : {}),\n onSubmit: reported.submit,\n onComplete: reported.complete,\n ...(onInteraction !== undefined ? { onInteraction } : {}),\n ...(sanitizeHtml !== undefined ? { sanitizeHtml } : {}),\n ...(props.strings !== undefined ? { strings: props.strings } : {}),\n ...(props.ai !== undefined ? { ai: props.ai } : {}),\n ...(props.delivery !== undefined && props.delivery !== null\n ? { delivery: props.delivery }\n : {}),\n ...(scoringGiven ? { scoring: props.scoring } : {}),\n ...(locale !== undefined ? { locale } : {}),\n };\n switch (activity.type) {\n case 'multiple-choice':\n return (\n <MultipleChoice\n data={activity}\n {...common}\n {...(shuffleSeed !== undefined ? { shuffleSeed } : {})}\n />\n );\n case 'fill-in-the-blanks':\n return <FillInTheBlanks data={activity} {...common} />;\n case 'gap-select':\n return (\n <GapSelect\n data={activity}\n {...common}\n {...(shuffleSeed !== undefined ? { shuffleSeed } : {})}\n />\n );\n case 'dictation':\n return <Dictation data={activity} {...common} />;\n case 'read-aloud': {\n const binding = slotBindings.get(slot.slotId);\n const assessment =\n props.assessments !== undefined && Object.hasOwn(props.assessments, slot.slotId)\n ? props.assessments[slot.slotId]\n : undefined;\n return (\n <ReadAloud\n data={activity}\n {...common}\n {...(binding !== undefined ? { recordingBinding: binding } : {})}\n {...(assessment !== undefined ? { assessment } : {})}\n {...(workletUrl !== undefined ? { workletUrl } : {})}\n />\n );\n }\n default:\n return null;\n }\n };\n\n if (devError !== null) {\n throw devError;\n }\n\n // ── The quiz panel ───────────────────────────────────────────────────\n const openCue = openQuiz === null ? undefined : cues.find((cue) => cue.id === openQuiz.cueId);\n const openSlots = openCue === undefined ? [] : (slotsByCue.get(openCue.id) ?? []);\n const step = openQuiz?.step ?? 0;\n const stepSlot = openSlots[step];\n const stepAnswered = stepSlot !== undefined && answered.has(stepSlot.slotId);\n const lastStep = step >= openSlots.length - 1;\n const required = openCue?.required === true && renderMode !== 'review';\n const canAdvance = !required || stepAnswered;\n const goToStep = (next: number): void => {\n setOpenQuiz((open) => (open === null ? open : { ...open, step: next }));\n const slot = openSlots[next];\n if (slot !== undefined && openCue !== undefined) {\n announce(strings.videoQuestionProgress(next + 1, openSlots.length));\n emit('video-quiz-question-shown', { cueId: openCue.id, slotId: slot.slotId });\n }\n };\n\n // Never over a quiz, the end card or a failure: the captions belong to the\n // video, and nothing is being spoken behind any of the three. Each line shows\n // its own cue — the two tracks need not share timings — and a line with\n // nothing to say at this moment is not drawn, while the other stays.\n const captionsHidden = !preferences.captions || openQuiz !== null || ended || errorCode !== null;\n const primaryText = captionsHidden ? undefined : primaryCues[activeCueIndex]?.text;\n const secondaryText = captionsHidden ? undefined : secondaryCues[secondaryCueIndex]?.text;\n const chromeVisible =\n !playing ||\n chromeShown ||\n menu !== null ||\n scrubbing ||\n focusInChrome ||\n sheet ||\n openQuiz !== null;\n const volumeLevel =\n preferences.muted || preferences.volume === 0\n ? 'muted'\n : preferences.volume < 0.5\n ? 'low'\n : 'high';\n\n return (\n // biome-ignore lint/a11y/noStaticElementInteractions: the player's keyboard shortcuts, scoped to the player; each is also a button\n <div\n ref={shellRef}\n className=\"lk-iv\"\n tabIndex={-1}\n lang={locale}\n style={theme as CSSProperties | undefined}\n data-render-mode={renderMode}\n data-quiz-open={openQuiz !== null || undefined}\n data-fullscreen={fullscreen || undefined}\n data-chrome={chromeVisible ? 'shown' : 'hidden'}\n onKeyDown={onKeyDown}\n >\n <div\n className=\"lk-iv-stage\"\n onPointerDown={(event) => {\n lastPointer.current = event.pointerType;\n }}\n onPointerMove={(event) => {\n if (event.pointerType !== 'touch') {\n revealChrome();\n }\n }}\n onPointerLeave={() => {\n if (playing) {\n setChromeShown(false);\n }\n }}\n >\n <video\n ref={videoRef}\n className=\"lk-iv-video\"\n src={media?.url}\n {...(media?.poster !== undefined ? { poster: media.poster } : {})}\n preload=\"metadata\"\n playsInline\n aria-label={group.title ?? media?.alt}\n onClick={() => {\n if (lastPointer.current === 'touch' && !chromeVisible) {\n revealChrome();\n return;\n }\n togglePlay();\n }}\n onDoubleClick={toggleFullscreen}\n onPlay={() => {\n setPlaying(true);\n setEnded(false);\n revealChrome();\n emit('video-played', { at: videoRef.current?.currentTime ?? 0 });\n }}\n onPause={() => {\n setPlaying(false);\n emit('video-paused', { at: videoRef.current?.currentTime ?? 0 });\n reportProgress(true);\n }}\n onWaiting={() => setWaiting(true)}\n onPlaying={() => setWaiting(false)}\n onProgress={(event) => setBuffered(bufferedAhead(event.currentTarget))}\n onTimeUpdate={(event) => {\n // The paused case, where the frame loop is off but a media key or\n // the picture-in-picture window still moves the playhead.\n if (!playing && !scrubbing) {\n setCurrent(event.currentTarget.currentTime);\n }\n }}\n onRateChange={(event) =>\n emit('video-rate-changed', { rate: event.currentTarget.playbackRate })\n }\n onLoadedMetadata={(event) => {\n const video = event.currentTarget;\n const length = Number.isFinite(video.duration) ? video.duration : 0;\n setDuration(length);\n video.playbackRate = preferences.speed;\n video.volume = preferences.volume;\n video.muted = preferences.muted;\n const stored = readMediaProgress(props.progress, length);\n if (stored !== null) {\n const at =\n renderMode === 'review' ? stored.at : limitResume(timeline, stored.at, finished);\n furthest.current = Math.max(stored.furthest, at);\n setFurthestShown(furthest.current);\n video.currentTime = at;\n previousTime.current = at;\n setCurrent(at);\n }\n }}\n onEnded={() => {\n setPlaying(false);\n setCurrent(duration);\n emit('video-ended');\n reportProgress(true);\n const atEnd = quizzesAtEnd(cues, duration, handled.current);\n const first = atEnd[0];\n if (first !== undefined) {\n openAt(first);\n } else {\n setEnded(true);\n }\n }}\n onError={(event) => {\n setWaiting(false);\n setErrorCode(event.currentTarget.error?.code ?? 0);\n }}\n />\n\n {label !== undefined ? <span className=\"lk-iv-label\">{label}</span> : null}\n\n {primaryText !== undefined || secondaryText !== undefined ? (\n // The lines keep `.lk-iv-caption`, `data-size` and `data-background`\n // as well, so a stylesheet written against 15.x still matches them.\n <div\n className=\"lk-iv-captions\"\n data-size={preferences.captionSize}\n data-background={preferences.captionBackground || undefined}\n >\n {primaryText !== undefined ? (\n <div\n className=\"lk-iv-caption\"\n data-role=\"primary\"\n data-size={preferences.captionSize}\n data-background={preferences.captionBackground || undefined}\n lang={primaryTrack?.srclang}\n dir=\"auto\"\n >\n <span>{primaryText}</span>\n </div>\n ) : null}\n {secondaryText !== undefined ? (\n <div\n className=\"lk-iv-caption\"\n data-role=\"secondary\"\n data-size={preferences.captionSize}\n data-background={preferences.captionBackground || undefined}\n lang={secondaryTrack?.srclang}\n dir=\"auto\"\n >\n <span>{secondaryText}</span>\n </div>\n ) : null}\n </div>\n ) : null}\n\n {waiting && errorCode === null && openQuiz === null ? (\n <span className=\"lk-iv-spinner\" aria-hidden=\"true\" />\n ) : null}\n\n {errorCode !== null ? (\n <div className=\"lk-iv-error\" role=\"alert\">\n <AlertIcon />\n <p>{strings.videoError(errorCode)}</p>\n <button\n type=\"button\"\n className=\"lk-iv-action\"\n onClick={() => {\n setErrorCode(null);\n videoRef.current?.load();\n }}\n >\n {strings.videoTryAgain}\n </button>\n </div>\n ) : null}\n\n {!playing && !waiting && errorCode === null && openQuiz === null && !ended ? (\n <button\n type=\"button\"\n className=\"lk-iv-big-play\"\n aria-label={strings.media.play}\n onClick={togglePlay}\n >\n <PlayIcon />\n </button>\n ) : null}\n\n {/* biome-ignore lint/a11y/noStaticElementInteractions: focus is only observed, to keep the controls shown while a keyboard user is among them */}\n <div\n className=\"lk-iv-chrome\"\n inert={openQuiz !== null}\n onFocus={() => setFocusInChrome(true)}\n onBlur={(event) => {\n if (!event.currentTarget.contains(event.relatedTarget as Node | null)) {\n setFocusInChrome(false);\n }\n }}\n >\n <Scrubber\n current={current}\n duration={duration}\n buffered={buffered}\n chapters={chapters}\n markers={markers}\n cues={primaryCues}\n previewLimit={spoilerLimit}\n strings={strings}\n onSeek={seek}\n onScrubChange={setScrubbing}\n />\n <div className=\"lk-iv-bar\">\n <div className=\"lk-iv-bar-group\">\n <button\n ref={playButtonRef}\n type=\"button\"\n className=\"lk-iv-button\"\n aria-label={\n ended ? strings.videoReplay : playing ? strings.media.pause : strings.media.play\n }\n onClick={togglePlay}\n >\n {ended ? <ReplayIcon /> : playing ? <PauseIcon /> : <PlayIcon />}\n </button>\n <button\n type=\"button\"\n className=\"lk-iv-button lk-iv-wide\"\n aria-label={strings.videoBack(JUMP_SECONDS)}\n onClick={() => seek(current - JUMP_SECONDS)}\n >\n <BackIcon />\n </button>\n <button\n type=\"button\"\n className=\"lk-iv-button lk-iv-wide\"\n aria-label={strings.videoForward(JUMP_SECONDS)}\n onClick={() => seek(current + JUMP_SECONDS)}\n >\n <ForwardIcon />\n </button>\n <div className=\"lk-iv-volume\">\n <button\n type=\"button\"\n className=\"lk-iv-button\"\n aria-label={preferences.muted ? strings.media.unmute : strings.media.mute}\n aria-pressed={preferences.muted}\n onClick={() => changePreferences({ muted: !preferences.muted })}\n >\n <VolumeIcon level={volumeLevel} />\n </button>\n <input\n id={`${playerId}-volume`}\n className=\"lk-iv-volume-slider\"\n type=\"range\"\n min={0}\n max={1}\n step={0.05}\n value={preferences.muted ? 0 : preferences.volume}\n aria-label={strings.media.volume}\n onChange={(event) =>\n changePreferences({ volume: Number(event.target.value), muted: false })\n }\n />\n </div>\n <button\n type=\"button\"\n className=\"lk-iv-time\"\n aria-label={countdown ? strings.videoShowElapsed : strings.videoShowRemaining}\n onClick={() => setCountdown((on) => !on)}\n >\n <span aria-hidden=\"true\">\n {countdown ? `-${clock(Math.max(0, duration - current))}` : clock(current)}\n <span className=\"lk-iv-time-total\"> / {clock(duration)}</span>\n </span>\n </button>\n </div>\n <div className=\"lk-iv-bar-group\">\n {quizzes.length > 0 || chapters.length > 0 || hasTranscript ? (\n <button\n type=\"button\"\n className=\"lk-iv-button\"\n aria-label={strings.videoPanel}\n aria-pressed={preferences.panel}\n onClick={() => changePreferences({ panel: !preferences.panel })}\n >\n <ContentsIcon />\n </button>\n ) : null}\n {hasCaptions ? (\n <button\n type=\"button\"\n className=\"lk-iv-button\"\n aria-label={\n preferences.captions ? strings.videoCaptionsHide : strings.videoCaptionsShow\n }\n aria-pressed={preferences.captions}\n onClick={() => changePreferences({ captions: !preferences.captions })}\n >\n <CaptionsIcon on={preferences.captions} />\n </button>\n ) : null}\n <div className=\"lk-iv-menu-anchor\">\n <button\n type=\"button\"\n className=\"lk-iv-button lk-iv-speed\"\n aria-label={strings.media.speed}\n aria-haspopup=\"menu\"\n aria-expanded={menu === 'speed'}\n onClick={() => setMenu((open) => (open === 'speed' ? null : 'speed'))}\n >\n <span aria-hidden=\"true\">{`${preferences.speed}×`}</span>\n </button>\n {menu === 'speed' ? (\n <SpeedMenu\n speed={preferences.speed}\n strings={strings}\n onChoose={(speed) => {\n changePreferences({ speed });\n setMenu(null);\n }}\n onClose={() => setMenu(null)}\n />\n ) : null}\n </div>\n <div className=\"lk-iv-menu-anchor\">\n <button\n type=\"button\"\n className=\"lk-iv-button\"\n aria-label={strings.videoSettings}\n aria-haspopup=\"menu\"\n aria-expanded={menu === 'settings'}\n onClick={() => setMenu((open) => (open === 'settings' ? null : 'settings'))}\n >\n <SettingsIcon />\n </button>\n {menu === 'settings' ? (\n <SettingsMenu\n preferences={preferences}\n tracks={tracks}\n primaryTrack={primaryTrack}\n secondaryTrack={secondaryTrack}\n captionsFailed={captionsFailed}\n onCaptionTrack={chooseCaptionTrack}\n onSecondaryTrack={chooseSecondaryTrack}\n strings={strings}\n onChange={changePreferences}\n onShowShortcuts={() => {\n setMenu(null);\n setSheet(true);\n }}\n onClose={() => setMenu(null)}\n />\n ) : null}\n </div>\n {pictureInPictureSupported ? (\n <button\n type=\"button\"\n className=\"lk-iv-button lk-iv-wide\"\n aria-label={strings.videoPictureInPicture}\n aria-pressed={pictureInPicture}\n onClick={togglePictureInPicture}\n >\n <PictureInPictureIcon />\n </button>\n ) : null}\n <button\n type=\"button\"\n className=\"lk-iv-button\"\n aria-label={fullscreen ? strings.videoExitFullscreen : strings.videoFullscreen}\n onClick={toggleFullscreen}\n >\n <FullscreenIcon on={fullscreen} />\n </button>\n </div>\n </div>\n </div>\n\n <div\n className=\"lk-iv-quiz\"\n role=\"dialog\"\n aria-modal=\"false\"\n aria-labelledby={`${playerId}-quiz-title`}\n hidden={openQuiz === null}\n onKeyDown={(event) => {\n // A question that handled Escape itself — a host's popover closing,\n // whose keydown React carries up through the portal — prevents it,\n // and the quiz stays open.\n if (\n event.key === 'Escape' &&\n !event.defaultPrevented &&\n !required &&\n openQuiz !== null\n ) {\n event.preventDefault();\n closeQuiz('skip');\n }\n }}\n >\n {openCue !== undefined ? (\n <div className=\"lk-iv-quiz-head\">\n <h3\n id={`${playerId}-quiz-title`}\n ref={quizHeadingRef}\n tabIndex={-1}\n className=\"lk-iv-quiz-title\"\n >\n {quizTitle(openCue)}\n <span className=\"lk-iv-quiz-time\"> · {clock(openCue.at)}</span>\n {required ? (\n <>\n {' '}\n <span className=\"lk-iv-tag\">{strings.videoRequired}</span>\n </>\n ) : null}\n </h3>\n {openSlots.length > 1 ? (\n <div className=\"lk-iv-steps\">\n <span className=\"lk-iv-steps-label\">\n {strings.videoQuestionProgress(step + 1, openSlots.length)}\n </span>\n <ol className=\"lk-iv-steps-dots\">\n {openSlots.map((slot, index) => (\n <li key={slot.slotId}>\n <button\n type=\"button\"\n className=\"lk-iv-step\"\n data-current={index === step || undefined}\n data-answered={answered.has(slot.slotId) || undefined}\n aria-current={index === step ? 'step' : undefined}\n aria-label={strings.videoQuestionStep(\n index + 1,\n answered.has(slot.slotId),\n )}\n onClick={() => goToStep(index)}\n />\n </li>\n ))}\n </ol>\n </div>\n ) : null}\n </div>\n ) : null}\n <div className=\"lk-iv-quiz-body\">\n {cues\n .filter((cue) => mounted.has(cue.id))\n .map((cue) =>\n (slotsByCue.get(cue.id) ?? []).map((slot, index) => {\n const shown = openQuiz?.cueId === cue.id && step === index;\n const place = places.get(slot.slotId) as InteractiveVideoSlot;\n return (\n <QuestionPane\n key={slot.slotId}\n hidden={!shown}\n channel={channelFor(slot.slotId)}\n >\n <SlotQuestion\n title={slot.activity.title}\n strings={strings}\n render={props.renderQuestion}\n question={\n props.renderQuestion === undefined\n ? undefined\n : questionFor(slot, place, shown)\n }\n sdk={() => sdkQuestion(slot, place)}\n setHostPending={callsFor(place).setPending}\n />\n </QuestionPane>\n );\n }),\n )}\n </div>\n {openCue !== undefined ? (\n <div className=\"lk-iv-quiz-foot\">\n <div className=\"lk-iv-quiz-foot-start\">\n <button type=\"button\" className=\"lk-iv-link\" onClick={() => closeQuiz('rewatch')}>\n <ReplayIcon />\n {strings.videoRewatch}\n </button>\n {!required && !lastStep ? (\n <button type=\"button\" className=\"lk-iv-link\" onClick={() => closeQuiz('skip')}>\n {strings.videoSkipQuiz}\n </button>\n ) : null}\n </div>\n <div className=\"lk-iv-quiz-foot-end\">\n {renderMode === 'exam' && stepAnswered ? (\n <span className=\"lk-iv-saved\" role=\"status\">\n {strings.videoAnswerSaved}\n </span>\n ) : null}\n {/* Quiet until the question is answered: the question's own\n Submit is the one strong button on the panel until then. */}\n <button\n type=\"button\"\n className={\n stepAnswered || renderMode === 'review'\n ? 'lk-iv-action lk-iv-action-primary'\n : 'lk-iv-action'\n }\n aria-disabled={!canAdvance || undefined}\n onClick={() => {\n if (!canAdvance) {\n return;\n }\n if (lastStep) {\n closeQuiz('continue');\n } else {\n goToStep(step + 1);\n }\n }}\n >\n {lastStep ? strings.videoContinue : strings.videoNextQuestion}\n {lastStep ? <PlayIcon /> : null}\n </button>\n </div>\n </div>\n ) : null}\n </div>\n\n {ended && openQuiz === null ? (\n <EndScreen\n idPrefix={playerId}\n renderMode={renderMode}\n quizzes={quizzes}\n answered={answeredCount}\n total={totalQuestions}\n // No score where the policy shows no grades: the card still\n // counts what was answered, as it does in an exam.\n percent={delivery.feedback ? percent : null}\n strings={strings}\n onOpenQuiz={(id) => {\n const cue = cues.find((candidate) => candidate.id === id);\n if (cue !== undefined) {\n openAt(cue);\n }\n }}\n onWatchAgain={togglePlay}\n pending={answerPending}\n onFinish={\n renderMode === 'review'\n ? undefined\n : () => {\n // Refused out loud: Finish stays in the tab order and says\n // it is waiting, rather than doing nothing silently.\n if (pendingRef.current.size > 0) {\n announce(strings.videoAnswerPending);\n return;\n }\n finish();\n }\n }\n />\n ) : null}\n\n {sheet ? (\n <ShortcutSheet\n strings={strings}\n onClose={() => {\n setSheet(false);\n playButtonRef.current?.focus();\n }}\n />\n ) : null}\n </div>\n\n {preferences.panel ? (\n <ContentsPanel\n idPrefix={playerId}\n tab={panelTab}\n onTab={setPanelTab}\n chapters={chapters}\n quizzes={quizzes}\n cues={primaryCues}\n primaryLanguage={primaryTrack?.srclang}\n secondaryCues={secondaryTrack === undefined ? NO_CUES : secondaryCues}\n secondaryLanguage={secondaryTrack?.srclang}\n activeCue={activeCueIndex}\n limit={spoilerLimit}\n strings={strings}\n onSeek={seek}\n onOpenQuiz={(id) => {\n const cue = cues.find((candidate) => candidate.id === id);\n if (cue === undefined) {\n return;\n }\n // Within navigation limits: a quiz the learner may not reach yet\n // stays where it is, and the seek says why.\n if (\n renderMode !== 'review' &&\n limitSeek(\n timeline,\n videoRef.current?.currentTime ?? 0,\n cue.at,\n furthest.current,\n finished,\n ).at <\n cue.at - 0.25\n ) {\n seek(cue.at);\n return;\n }\n openAt(cue);\n }}\n />\n ) : null}\n\n <div className=\"lk-iv-live\" aria-live=\"polite\" aria-atomic=\"true\">\n {announcement}\n </div>\n\n {/* A host question's popovers. Last in the shell, so it paints above the\n quiz and, in fullscreen, is painted at all. */}\n <div ref={setPortalContainer} className=\"lk-iv-portal\" />\n </div>\n );\n}\n\n/** The calls a question reports through: the part of {@link InteractiveVideoQuestion} that never changes. */\ntype QuestionCalls = Pick<\n InteractiveVideoQuestion,\n 'submit' | 'complete' | 'clear' | 'setPending' | 'emit'\n>;\n\n/**\n * One question's content: the host's, when `renderQuestion` returns anything\n * but `undefined`, else the SDK's own component. Inside the boundary either\n * way, and `renderQuestion` is called inside it too, so a host that throws —\n * while rendering, or while deciding what to render — loses that one question\n * and never the video.\n */\nfunction SlotQuestion({\n title,\n strings,\n ...content\n}: {\n title: string | undefined;\n strings: LkStrings;\n render: ((question: InteractiveVideoQuestion) => ReactNode | undefined) | undefined;\n question: InteractiveVideoQuestion | undefined;\n sdk: () => ReactNode;\n setHostPending: (pending: boolean) => void;\n}) {\n return (\n <ActivityErrorBoundary\n {...(title !== undefined ? { activityTitle: title } : {})}\n strings={strings}\n >\n <SlotContent {...content} />\n </ActivityErrorBoundary>\n );\n}\n\nfunction SlotContent({\n render,\n question,\n sdk,\n setHostPending,\n}: {\n render: ((question: InteractiveVideoQuestion) => ReactNode | undefined) | undefined;\n question: InteractiveVideoQuestion | undefined;\n sdk: () => ReactNode;\n setHostPending: (pending: boolean) => void;\n}) {\n const hosted = render !== undefined && question !== undefined ? render(question) : undefined;\n const hosting = hosted !== undefined;\n // A host tree that goes away — it threw, or the host stopped drawing this\n // question — can no longer end the work it said was on its way, and a\n // pending nobody can clear would hold Finish for ever.\n useEffect(() => {\n if (!hosting) {\n return;\n }\n return () => setHostPending(false);\n }, [hosting, setHostPending]);\n return hosting ? hosted : sdk();\n}\n\n/**\n * One question of a quiz. Every question stays mounted once its quiz has\n * opened, so an answer survives stepping back or rewinding the video; hiding\n * it — another question, or the quiz closing — stops whatever it was\n * recording or playing, as a sequence's pane does.\n */\nfunction QuestionPane({\n hidden,\n channel,\n children,\n}: {\n hidden: boolean;\n channel: SequenceSlotChannel;\n children: ReactNode;\n}) {\n const ref = useRef<HTMLDivElement>(null);\n const captureGroup = channel.captureGroup;\n useEffect(() => {\n if (!hidden) {\n return;\n }\n stopCaptureGroup(captureGroup);\n for (const media of ref.current?.querySelectorAll('audio, video') ?? []) {\n const element = media as HTMLMediaElement;\n if (!element.paused) {\n element.pause();\n }\n }\n }, [hidden, captureGroup]);\n return (\n <div ref={ref} className=\"lk-iv-question\" hidden={hidden}>\n <SequenceSlotContext.Provider value={channel}>{children}</SequenceSlotContext.Provider>\n </div>\n );\n}\n\n/** How far the browser has downloaded past the playhead, in seconds from 0. */\nfunction bufferedAhead(video: HTMLVideoElement): number {\n const ranges = video.buffered as TimeRanges | undefined;\n if (ranges === undefined) {\n return 0;\n }\n for (let index = 0; index < ranges.length; index += 1) {\n if (ranges.start(index) <= video.currentTime && video.currentTime <= ranges.end(index)) {\n return ranges.end(index);\n }\n }\n return 0;\n}\n\n/** A quiz's marker state: its shape on the progress bar and its dot in the lists. */\nfunction markerState(\n quizSlots: readonly SequenceSlot<RenderableActivity>[],\n answered: ReadonlySet<string>,\n renderMode: RenderMode,\n outcomes: Readonly<Record<string, ItemOutcome>> | undefined,\n): MarkerState {\n if (renderMode === 'review' && outcomes !== undefined) {\n const results = quizSlots.map((slot) =>\n Object.hasOwn(outcomes, slot.slotId) ? outcomes[slot.slotId] : undefined,\n );\n if (results.some((outcome) => outcome === undefined || outcome.status === 'deferred')) {\n return 'pending';\n }\n const scored = results.filter(\n (outcome): outcome is Extract<ItemOutcome, { status: 'scored' }> =>\n outcome?.status === 'scored',\n );\n if (scored.length === results.length && scored.every((outcome) => outcome.passed)) {\n return 'correct';\n }\n return scored.some((outcome) => outcome.passed) ? 'partial' : 'incorrect';\n }\n const count = quizSlots.filter((slot) => answered.has(slot.slotId)).length;\n if (count === quizSlots.length && count > 0) {\n return 'answered';\n }\n // Begun, not finished. A quiz passed or skipped with nothing answered keeps\n // its empty ring: the bar shows what the learner did, not where they went.\n if (count > 0) {\n return 'open';\n }\n return 'unreached';\n}\n","'use client';\n\nimport { useLkStrings } from '../../i18n/LkIntlProvider.js';\nimport { ActivityErrorBoundary } from '../ActivityErrorBoundary.js';\nimport {\n InteractiveVideo as InteractiveVideoCore,\n type InteractiveVideoProps,\n} from './InteractiveVideo.js';\n\nexport type {\n InteractiveVideoProps,\n InteractiveVideoQuestion,\n InteractiveVideoSlot,\n InteractiveVideoSummary,\n RenderableItemGroup,\n} from './InteractiveVideo.js';\nexport type { CaptionSize, VideoPreferences } from './prefs.js';\n// Which track each caption line shows, for a host that wants to state it —\n// in its own language menu, say — the way the player will decide it.\nexport { type CaptionTracks, resolveCaptionTracks } from './tracks.js';\n\n/**\n * Public interactive video: the player wrapped in `ActivityErrorBoundary`, so a\n * render failure — the development-time schema check among them — degrades to\n * an accessible fallback instead of taking the host page down.\n *\n * A formative tool, for lessons and practice — not for official summative\n * exams, which `<ActivitySequence>` delivers.\n */\nexport function InteractiveVideo(props: InteractiveVideoProps) {\n const strings = useLkStrings(props.strings);\n return (\n <ActivityErrorBoundary\n {...(props.group?.title !== undefined ? { activityTitle: props.group.title } : {})}\n strings={strings}\n >\n <InteractiveVideoCore {...props} />\n </ActivityErrorBoundary>\n );\n}\n"]}