@intellectif/lk-react 14.0.0 → 15.0.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 (139) hide show
  1. package/CHANGELOG.md +49 -0
  2. package/README.md +5 -2
  3. package/dist/{WrittenResponse-pB1ik8hg.d.cts → WrittenResponse-BPbhERgk.d.cts} +1 -1
  4. package/dist/{WrittenResponse-C0P34En1.d.ts → WrittenResponse-ZAxLR_AU.d.ts} +1 -1
  5. package/dist/{chunk-YEYKJFEC.cjs → chunk-26GQO5I2.cjs} +12 -12
  6. package/dist/{chunk-YEYKJFEC.cjs.map → chunk-26GQO5I2.cjs.map} +1 -1
  7. package/dist/chunk-2HAEQDHQ.js +2330 -0
  8. package/dist/chunk-2HAEQDHQ.js.map +1 -0
  9. package/dist/{chunk-47HHC4GD.js → chunk-33BQNWAQ.js} +5 -5
  10. package/dist/{chunk-47HHC4GD.js.map → chunk-33BQNWAQ.js.map} +1 -1
  11. package/dist/{chunk-SE6WWDVW.cjs → chunk-4H3JTX74.cjs} +13 -13
  12. package/dist/{chunk-SE6WWDVW.cjs.map → chunk-4H3JTX74.cjs.map} +1 -1
  13. package/dist/{chunk-TDJEKXEP.js → chunk-52GXJNQ3.js} +84 -2
  14. package/dist/chunk-52GXJNQ3.js.map +1 -0
  15. package/dist/{chunk-USBANZ7K.cjs → chunk-53YOZOGN.cjs} +5 -5
  16. package/dist/{chunk-USBANZ7K.cjs.map → chunk-53YOZOGN.cjs.map} +1 -1
  17. package/dist/{chunk-LLXCX5KK.js → chunk-AF72QUBI.js} +5 -5
  18. package/dist/{chunk-LLXCX5KK.js.map → chunk-AF72QUBI.js.map} +1 -1
  19. package/dist/{chunk-XUEIUEPI.js → chunk-CE6OGJE6.js} +5 -5
  20. package/dist/{chunk-XUEIUEPI.js.map → chunk-CE6OGJE6.js.map} +1 -1
  21. package/dist/{chunk-RRH7ZPXC.cjs → chunk-DP3DM7FR.cjs} +6 -6
  22. package/dist/{chunk-RRH7ZPXC.cjs.map → chunk-DP3DM7FR.cjs.map} +1 -1
  23. package/dist/{chunk-J2CDPIRC.cjs → chunk-DQ3VVU5T.cjs} +27 -25
  24. package/dist/chunk-DQ3VVU5T.cjs.map +1 -0
  25. package/dist/{chunk-U3APKQ7P.cjs → chunk-EKBEKDWO.cjs} +13 -13
  26. package/dist/{chunk-U3APKQ7P.cjs.map → chunk-EKBEKDWO.cjs.map} +1 -1
  27. package/dist/{chunk-RXS455MR.js → chunk-EVBYEWHO.js} +3 -2
  28. package/dist/chunk-EVBYEWHO.js.map +1 -0
  29. package/dist/{chunk-B2XQLU2E.cjs → chunk-FKGUKFC7.cjs} +24 -6
  30. package/dist/chunk-FKGUKFC7.cjs.map +1 -0
  31. package/dist/{chunk-YMBBM5K7.js → chunk-H6I2JDNW.js} +10 -10
  32. package/dist/{chunk-YMBBM5K7.js.map → chunk-H6I2JDNW.js.map} +1 -1
  33. package/dist/{chunk-XIBOFTOL.js → chunk-HA3VRF6E.js} +22 -4
  34. package/dist/chunk-HA3VRF6E.js.map +1 -0
  35. package/dist/{chunk-I33FOKZ7.js → chunk-I2QGW4GD.js} +14 -12
  36. package/dist/chunk-I2QGW4GD.js.map +1 -0
  37. package/dist/{chunk-72UGRIMM.js → chunk-IE5ZNCWN.js} +5 -5
  38. package/dist/{chunk-72UGRIMM.js.map → chunk-IE5ZNCWN.js.map} +1 -1
  39. package/dist/{chunk-NDQD3ZRY.cjs → chunk-L7NE7PR4.cjs} +13 -13
  40. package/dist/{chunk-NDQD3ZRY.cjs.map → chunk-L7NE7PR4.cjs.map} +1 -1
  41. package/dist/{chunk-D57QZILZ.js → chunk-QEB6O6GU.js} +62 -37
  42. package/dist/chunk-QEB6O6GU.js.map +1 -0
  43. package/dist/{chunk-62AKSD5Y.js → chunk-QM4AV6EG.js} +39 -11
  44. package/dist/chunk-QM4AV6EG.js.map +1 -0
  45. package/dist/{chunk-LGCUOLP6.js → chunk-RT5FTHUU.js} +5 -5
  46. package/dist/{chunk-LGCUOLP6.js.map → chunk-RT5FTHUU.js.map} +1 -1
  47. package/dist/chunk-SRD4KVAP.cjs +2332 -0
  48. package/dist/chunk-SRD4KVAP.cjs.map +1 -0
  49. package/dist/{chunk-BVRUUYYR.cjs → chunk-UAYWLYFW.cjs} +18 -18
  50. package/dist/{chunk-BVRUUYYR.cjs.map → chunk-UAYWLYFW.cjs.map} +1 -1
  51. package/dist/{chunk-D4DQFTA7.cjs → chunk-UCKA22ZJ.cjs} +3 -2
  52. package/dist/chunk-UCKA22ZJ.cjs.map +1 -0
  53. package/dist/{chunk-F4TBCRGI.cjs → chunk-WKOV25NP.cjs} +42 -13
  54. package/dist/chunk-WKOV25NP.cjs.map +1 -0
  55. package/dist/{chunk-WTS34S5E.cjs → chunk-XMJE34FY.cjs} +13 -13
  56. package/dist/{chunk-WTS34S5E.cjs.map → chunk-XMJE34FY.cjs.map} +1 -1
  57. package/dist/{chunk-SWY6PWXK.js → chunk-YWQH35VO.js} +4 -4
  58. package/dist/{chunk-SWY6PWXK.js.map → chunk-YWQH35VO.js.map} +1 -1
  59. package/dist/{chunk-LB3FEV7Z.cjs → chunk-Z6TVOAO5.cjs} +84 -2
  60. package/dist/chunk-Z6TVOAO5.cjs.map +1 -0
  61. package/dist/{chunk-36FTYJWJ.cjs → chunk-ZH5WT2IE.cjs} +80 -55
  62. package/dist/chunk-ZH5WT2IE.cjs.map +1 -0
  63. package/dist/{chunk-BO6P723E.js → chunk-ZJMTHPHY.js} +3 -3
  64. package/dist/{chunk-BO6P723E.js.map → chunk-ZJMTHPHY.js.map} +1 -1
  65. package/dist/components/ActivityPreview.cjs +12 -12
  66. package/dist/components/ActivityPreview.d.cts +2 -2
  67. package/dist/components/ActivityPreview.d.ts +2 -2
  68. package/dist/components/ActivityPreview.js +11 -11
  69. package/dist/components/ActivitySequence.cjs +13 -13
  70. package/dist/components/ActivitySequence.d.cts +14 -7
  71. package/dist/components/ActivitySequence.d.ts +14 -7
  72. package/dist/components/ActivitySequence.js +12 -12
  73. package/dist/components/Dictation.cjs +5 -5
  74. package/dist/components/Dictation.d.cts +1 -1
  75. package/dist/components/Dictation.d.ts +1 -1
  76. package/dist/components/Dictation.js +4 -4
  77. package/dist/components/FillInTheBlanks.cjs +5 -5
  78. package/dist/components/FillInTheBlanks.d.cts +1 -1
  79. package/dist/components/FillInTheBlanks.d.ts +1 -1
  80. package/dist/components/FillInTheBlanks.js +4 -4
  81. package/dist/components/GapSelect.cjs +5 -5
  82. package/dist/components/GapSelect.d.cts +1 -1
  83. package/dist/components/GapSelect.d.ts +1 -1
  84. package/dist/components/GapSelect.js +4 -4
  85. package/dist/components/InteractiveVideo.cjs +26 -0
  86. package/dist/components/InteractiveVideo.cjs.map +1 -0
  87. package/dist/components/InteractiveVideo.d.cts +77 -0
  88. package/dist/components/InteractiveVideo.d.ts +77 -0
  89. package/dist/components/InteractiveVideo.js +17 -0
  90. package/dist/components/InteractiveVideo.js.map +1 -0
  91. package/dist/components/MultipleChoice.cjs +5 -5
  92. package/dist/components/MultipleChoice.d.cts +1 -1
  93. package/dist/components/MultipleChoice.d.ts +1 -1
  94. package/dist/components/MultipleChoice.js +4 -4
  95. package/dist/components/PronunciationFeedback.cjs +4 -4
  96. package/dist/components/PronunciationFeedback.d.cts +5 -2
  97. package/dist/components/PronunciationFeedback.d.ts +5 -2
  98. package/dist/components/PronunciationFeedback.js +3 -3
  99. package/dist/components/ReadAloud.cjs +6 -6
  100. package/dist/components/ReadAloud.d.cts +2 -2
  101. package/dist/components/ReadAloud.d.ts +2 -2
  102. package/dist/components/ReadAloud.js +5 -5
  103. package/dist/components/StimulusPanel.cjs +4 -4
  104. package/dist/components/StimulusPanel.d.cts +1 -1
  105. package/dist/components/StimulusPanel.d.ts +1 -1
  106. package/dist/components/StimulusPanel.js +3 -3
  107. package/dist/components/WrittenResponse.cjs +5 -5
  108. package/dist/components/WrittenResponse.d.cts +3 -3
  109. package/dist/components/WrittenResponse.d.ts +3 -3
  110. package/dist/components/WrittenResponse.js +4 -4
  111. package/dist/i18n/LkIntlProvider.cjs +7 -7
  112. package/dist/i18n/LkIntlProvider.d.cts +2 -2
  113. package/dist/i18n/LkIntlProvider.d.ts +2 -2
  114. package/dist/i18n/LkIntlProvider.js +1 -1
  115. package/dist/index.cjs +44 -39
  116. package/dist/index.cjs.map +1 -1
  117. package/dist/index.d.cts +3 -2
  118. package/dist/index.d.ts +3 -2
  119. package/dist/index.js +15 -14
  120. package/dist/index.js.map +1 -1
  121. package/dist/{strings--ADnHcaA.d.cts → strings-5588Q4Te.d.cts} +118 -1
  122. package/dist/{strings-CtdSf2St.d.ts → strings-D0IWcsUm.d.ts} +118 -1
  123. package/dist/theme/ThemeProvider.cjs +6 -6
  124. package/dist/theme/ThemeProvider.js +1 -1
  125. package/dist/theme/defaults.css +2 -0
  126. package/dist/theme/skin.css +1365 -1
  127. package/package.json +13 -3
  128. package/dist/chunk-36FTYJWJ.cjs.map +0 -1
  129. package/dist/chunk-62AKSD5Y.js.map +0 -1
  130. package/dist/chunk-B2XQLU2E.cjs.map +0 -1
  131. package/dist/chunk-D4DQFTA7.cjs.map +0 -1
  132. package/dist/chunk-D57QZILZ.js.map +0 -1
  133. package/dist/chunk-F4TBCRGI.cjs.map +0 -1
  134. package/dist/chunk-I33FOKZ7.js.map +0 -1
  135. package/dist/chunk-J2CDPIRC.cjs.map +0 -1
  136. package/dist/chunk-LB3FEV7Z.cjs.map +0 -1
  137. package/dist/chunk-RXS455MR.js.map +0 -1
  138. package/dist/chunk-TDJEKXEP.js.map +0 -1
  139. package/dist/chunk-XIBOFTOL.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/InteractiveVideo/format.ts","../src/components/InteractiveVideo/icons.tsx","../src/components/InteractiveVideo/shortcuts.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","isDevelopment","assertRedactedItemGroup","validateItemGroup","ActivitySchemaError","flattenSequence","MultipleChoice","FillInTheBlanks","GapSelect","Dictation","ReadAloud","readMediaProgress","stopCaptureGroup","SequenceSlotContext","InteractiveVideo","ActivityErrorBoundary"],"mappings":"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","file":"chunk-SRD4KVAP.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 | '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: '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","'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 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. The first item, or\n * the checked one, takes focus when the menu opens.\n */\nfunction Menu({\n label,\n onClose,\n children,\n}: {\n label: string;\n onClose: () => void;\n children: ReactNode;\n}) {\n const ref = useRef<HTMLDivElement>(null);\n useEffect(() => {\n const items = ref.current?.querySelectorAll<HTMLElement>('[role^=\"menuitem\"]');\n const checked = ref.current?.querySelector<HTMLElement>('[aria-checked=\"true\"]');\n (checked ?? items?.[0])?.focus();\n }, []);\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' | 'size';\n\nexport function SettingsMenu({\n preferences,\n tracks,\n activeTrack,\n captionsFailed,\n strings,\n onChange,\n onShowShortcuts,\n onClose,\n}: {\n preferences: VideoPreferences;\n tracks: readonly MediaTrack[];\n activeTrack: MediaTrack | undefined;\n captionsFailed: boolean;\n strings: LkStrings;\n onChange: (change: Partial<VideoPreferences>) => void;\n onShowShortcuts: () => void;\n onClose: () => void;\n}) {\n const [page, setPage] = useState<SettingsPage>('main');\n const captionsValue =\n !preferences.captions || activeTrack === undefined ? strings.videoOff : activeTrack.label;\n const back = (\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"lk-iv-menu-item lk-iv-menu-back\"\n onClick={() => setPage('main')}\n >\n <ChevronIcon direction=\"left\" />\n <span>{page === 'captions' ? strings.videoCaptionLanguage : strings.videoCaptionSize}</span>\n </button>\n );\n if (page === 'captions') {\n return (\n <Menu key=\"captions\" label={strings.videoCaptionLanguage} onClose={onClose}>\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 const on = preferences.captions && activeTrack === track;\n return (\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={() => onChange({ captions: true, captionLanguage: track.srclang })}\n >\n <span>{track.label}</span>\n {on ? <CheckIcon /> : null}\n </button>\n );\n })}\n {captionsFailed ? (\n <p className=\"lk-iv-menu-note\" role=\"status\">\n {strings.videoCaptionsFailed}\n </p>\n ) : null}\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}>\n {tracks.length > 0 ? (\n <>\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"lk-iv-menu-item\"\n onClick={() => setPage('captions')}\n >\n <span>{strings.videoCaptionLanguage}</span>\n <span className=\"lk-iv-menu-value\">\n {captionsValue}\n <ChevronIcon direction=\"right\" />\n </span>\n </button>\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"lk-iv-menu-item\"\n onClick={() => setPage('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 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 cues: readonly Cue[];\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 const lines = useMemo(() => {\n const trimmed = query.trim().toLowerCase();\n return cues\n .map((cue, index) => ({ cue, index }))\n .filter(({ cue }) => cue.start <= limit)\n .filter(({ cue }) => trimmed === '' || cue.text.toLowerCase().includes(trimmed));\n }, [cues, 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 }) => (\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 <span>{highlight(cue.text)}</span>\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 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 onFinish: (() => void) | undefined;\n}) {\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 <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 type=\"button\" className=\"lk-iv-action lk-iv-action-primary\" onClick={onFinish}>\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. */\n captions: boolean;\n /** The caption language chosen, as a track's `srclang`; null for the default track. */\n captionLanguage: 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 captionSize: 'medium',\n captionBackground: true,\n panel: false,\n shortcuts: true,\n};\n\nconst STORAGE_KEY = 'lk.video.v1';\n\n/**\n * Clamps every value on the way IN. Anything in storage is writable by the\n * learner and survives a schema change, so it is input from a stranger: one\n * `volume: 50` must not mute every video, and a `speed: null` must not pin\n * playback at a rate the menu cannot undo.\n */\nexport function sanitizePreferences(raw: unknown): VideoPreferences {\n if (typeof raw !== 'object' || raw === null) {\n return DEFAULT_PREFERENCES;\n }\n const value = raw as Partial<Record<keyof VideoPreferences, unknown>>;\n const bool = (input: unknown, fallback: boolean): boolean =>\n typeof input === 'boolean' ? input : fallback;\n const speed = (SPEEDS as readonly unknown[]).includes(value.speed)\n ? (value.speed as number)\n : DEFAULT_PREFERENCES.speed;\n const volume =\n typeof value.volume === 'number' && Number.isFinite(value.volume)\n ? Math.min(1, Math.max(0, value.volume))\n : DEFAULT_PREFERENCES.volume;\n const size =\n value.captionSize === 'small' || value.captionSize === 'medium' || value.captionSize === 'large'\n ? value.captionSize\n : DEFAULT_PREFERENCES.captionSize;\n const language =\n typeof value.captionLanguage === 'string' &&\n /^[A-Za-z]{2,3}(-[A-Za-z0-9]{2,8})*$/.test(value.captionLanguage)\n ? value.captionLanguage\n : null;\n return {\n speed,\n volume,\n muted: bool(value.muted, DEFAULT_PREFERENCES.muted),\n captions: bool(value.captions, DEFAULT_PREFERENCES.captions),\n captionLanguage: language,\n captionSize: size,\n captionBackground: bool(value.captionBackground, DEFAULT_PREFERENCES.captionBackground),\n panel: bool(value.panel, DEFAULT_PREFERENCES.panel),\n shortcuts: bool(value.shortcuts, DEFAULT_PREFERENCES.shortcuts),\n };\n}\n\n/**\n * The stored preferences. Every read goes through a `try`: a private window,\n * blocked site data or a sandboxed frame throws on `localStorage` itself.\n */\nexport function readPreferences(): VideoPreferences {\n try {\n const stored = globalThis.localStorage?.getItem(STORAGE_KEY);\n return stored ? sanitizePreferences(JSON.parse(stored)) : DEFAULT_PREFERENCES;\n } catch {\n return DEFAULT_PREFERENCES;\n }\n}\n\n/** Remembers the preferences. A browser that will not store them loses nothing but the memory. */\nexport function writePreferences(preferences: VideoPreferences): void {\n try {\n globalThis.localStorage?.setItem(STORAGE_KEY, JSON.stringify(preferences));\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 flattenSequence,\n type InteractionEvent,\n type ItemGroup,\n type ItemOutcome,\n type LearnerResponse,\n type MediaProgress,\n type MediaTimeline,\n type MediaTrack,\n readMediaProgress,\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 { useLkStrings } from '../../i18n/LkIntlProvider.js';\nimport type { LkStringsOverride } from '../../i18n/strings.js';\nimport { isDevelopment } from '../_internal.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 { type SequenceSlotChannel, SequenceSlotContext } 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 DEFAULT_PREFERENCES,\n readPreferences,\n type VideoPreferences,\n writePreferences,\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 { 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\nexport interface InteractiveVideoProps {\n /** An item group with a video stimulus and a timeline. Redacted projections in exam and review. */\n group: RenderableItemGroup;\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 /** Once per mount: when the learner presses Finish, or the video ends with every question answered. */\n onFinished?: (summary: InteractiveVideoSummary) => void;\n onInteraction?: (event: InteractionEvent) => void;\n /** Where read-aloud takes are stored and judged. Required when the video holds a read-aloud, outside review. */\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 /** Overrides what the learner's browser remembers. */\n preferences?: Partial<VideoPreferences>;\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 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 * 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/** 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\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 // Read after mount, not during render: a server render has no storage, and\n // a first client render that read it would disagree with the server's.\n const [preferences, setPreferences] = useState<VideoPreferences>(() => ({\n ...DEFAULT_PREFERENCES,\n ...props.preferences,\n }));\n const preferenceOverride = useRef(props.preferences);\n useEffect(() => {\n setPreferences({ ...readPreferences(), ...preferenceOverride.current });\n }, []);\n const changePreferences = useCallback((change: Partial<VideoPreferences>) => {\n setPreferences((previous) => {\n const next = { ...previous, ...change };\n writePreferences(next);\n return next;\n });\n }, []);\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 scores = useRef(new Map<string, number>());\n const markAnswered = useCallback((slotId: string) => {\n setAnswered((previous) => {\n if (previous.has(slotId)) {\n return previous;\n }\n const next = new Set(previous);\n next.add(slotId);\n answeredRef.current = next;\n return next;\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 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\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 activeTrack =\n tracks.find((track) => track.srclang === preferences.captionLanguage) ??\n tracks.find((track) => track.default === true) ??\n tracks[0];\n const [captionCues, setCaptionCues] = useState<Cue[]>([]);\n const [captionsFailed, setCaptionsFailed] = useState(false);\n const loaderRef = useRef(captionsLoader);\n loaderRef.current = captionsLoader;\n useEffect(() => {\n if (activeTrack === undefined) {\n setCaptionCues([]);\n return;\n }\n let live = true;\n setCaptionsFailed(false);\n const load = loaderRef.current\n ? loaderRef.current(activeTrack)\n : fetch(activeTrack.src, { credentials: 'same-origin' }).then((response) => {\n if (!response.ok) {\n throw new Error(String(response.status));\n }\n return response.text();\n });\n Promise.resolve(load)\n .then((text) => {\n if (live) {\n const parsed = parseWebVtt(text);\n setCaptionCues(parsed);\n setCaptionsFailed(parsed.length === 0);\n }\n })\n .catch(() => {\n if (live) {\n setCaptionCues([]);\n setCaptionsFailed(true);\n }\n });\n return () => {\n live = false;\n };\n }, [activeTrack]);\n const hasCaptions = captionCues.length > 0;\n const activeCueIndex = useMemo(() => cueIndexAt(captionCues, current), [captionCues, current]);\n const spoilerLimit =\n timeline.navigation === 'no-skip-ahead' && renderMode !== 'review'\n ? Math.max(furthestShown, current)\n : Number.POSITIVE_INFINITY;\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 if (hasCaptions) {\n done();\n changePreferences({ captions: !preferences.captions });\n }\n return;\n case 't':\n case 'T':\n if (hasCaptions) {\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.current.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 const finish = useCallback(() => {\n if (finishedOnce.current) {\n return;\n }\n finishedOnce.current = true;\n onFinished?.(summary());\n }, [onFinished, summary]);\n // The video ended with every question answered: that is finishing too.\n useEffect(() => {\n if (\n ended &&\n totalQuestions > 0 &&\n answeredCount === totalQuestions &&\n renderMode !== 'review'\n ) {\n finish();\n }\n }, [ended, 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 const renderQuestion = (slot: SequenceSlot<RenderableActivity>, cueId: string): ReactNode => {\n const activity = slot.activity;\n const place: InteractiveVideoSlot = {\n slotId: slot.slotId,\n index: slot.index,\n activityId: activity.id,\n cueId,\n };\n const restored =\n props.responses !== undefined && Object.hasOwn(props.responses, slot.slotId)\n ? props.responses[slot.slotId]\n : undefined;\n const outcome =\n props.outcomes !== undefined && Object.hasOwn(props.outcomes, slot.slotId)\n ? props.outcomes[slot.slotId]\n : undefined;\n const common = {\n renderMode,\n ...(restored !== undefined ? { defaultValue: restored } : {}),\n ...(submitted.has(slot.slotId) ? { defaultSubmitted: true } : {}),\n ...(outcome !== undefined ? { outcome } : {}),\n onSubmit: (response: LearnerResponse) => {\n markAnswered(slot.slotId);\n onSubmit?.(response, place);\n },\n onComplete: (result: ActivityResult) => {\n markAnswered(slot.slotId);\n if (result.maxScore > 0) {\n scores.current.set(slot.slotId, result.score / result.maxScore);\n }\n onActivityComplete?.(result, place);\n },\n ...(onInteraction !== undefined ? { onInteraction } : {}),\n ...(sanitizeHtml !== undefined ? { sanitizeHtml } : {}),\n ...(props.strings !== undefined ? { strings: props.strings } : {}),\n ...(locale !== undefined ? { locale } : {}),\n };\n let question: ReactNode;\n switch (activity.type) {\n case 'multiple-choice':\n question = (\n <MultipleChoice\n data={activity}\n {...common}\n {...(shuffleSeed !== undefined ? { shuffleSeed } : {})}\n />\n );\n break;\n case 'fill-in-the-blanks':\n question = <FillInTheBlanks data={activity} {...common} />;\n break;\n case 'gap-select':\n question = (\n <GapSelect\n data={activity}\n {...common}\n {...(shuffleSeed !== undefined ? { shuffleSeed } : {})}\n />\n );\n break;\n case 'dictation':\n question = <Dictation data={activity} {...common} />;\n break;\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 question = (\n <ReadAloud\n data={activity}\n {...common}\n {...(binding !== undefined ? { recordingBinding: binding } : {})}\n {...(assessment !== undefined ? { assessment } : {})}\n {...(workletUrl !== undefined ? { workletUrl } : {})}\n />\n );\n break;\n }\n default:\n question = null;\n }\n return question;\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 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 = { captureGroup: `${playerId}::${slotId}`, takeState: () => undefined };\n channels.current.set(slotId, channel);\n }\n return channel;\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 caption belongs to the\n // video, and nothing is being spoken behind any of the three.\n const showCaption =\n preferences.captions &&\n hasCaptions &&\n activeCueIndex !== -1 &&\n openQuiz === null &&\n !ended &&\n errorCode === null;\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 {showCaption ? (\n <div\n className=\"lk-iv-caption\"\n data-size={preferences.captionSize}\n data-background={preferences.captionBackground || undefined}\n lang={activeTrack?.srclang}\n >\n <span>{captionCues[activeCueIndex]?.text}</span>\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={captionCues}\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 || hasCaptions ? (\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={() => {\n changePreferences({ captions: !preferences.captions });\n emit('video-captions-changed', {\n srclang: preferences.captions ? null : (activeTrack?.srclang ?? null),\n });\n }}\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 activeTrack={activeTrack}\n captionsFailed={captionsFailed}\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 if (event.key === 'Escape' && !required && openQuiz !== null) {\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 <QuestionPane\n key={slot.slotId}\n hidden={!(openQuiz?.cueId === cue.id && step === index)}\n channel={channelFor(slot.slotId)}\n >\n {renderQuestion(slot, cue.id)}\n </QuestionPane>\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 percent={percent}\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 onFinish={renderMode === 'review' ? undefined : finish}\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={captionCues}\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 </div>\n );\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 InteractiveVideoSlot,\n InteractiveVideoSummary,\n RenderableItemGroup,\n} from './InteractiveVideo.js';\nexport type { CaptionSize, VideoPreferences } from './prefs.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 */\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"]}
@@ -1,14 +1,14 @@
1
1
  'use client';
2
2
  'use strict';
3
3
 
4
- var chunkYEYKJFEC_cjs = require('./chunk-YEYKJFEC.cjs');
5
- var chunkNDQD3ZRY_cjs = require('./chunk-NDQD3ZRY.cjs');
6
- var chunkSE6WWDVW_cjs = require('./chunk-SE6WWDVW.cjs');
7
- var chunkU3APKQ7P_cjs = require('./chunk-U3APKQ7P.cjs');
8
- var chunkWTS34S5E_cjs = require('./chunk-WTS34S5E.cjs');
9
- var chunk36FTYJWJ_cjs = require('./chunk-36FTYJWJ.cjs');
10
- var chunkUSBANZ7K_cjs = require('./chunk-USBANZ7K.cjs');
11
- var chunkLB3FEV7Z_cjs = require('./chunk-LB3FEV7Z.cjs');
4
+ var chunk26GQO5I2_cjs = require('./chunk-26GQO5I2.cjs');
5
+ var chunkL7NE7PR4_cjs = require('./chunk-L7NE7PR4.cjs');
6
+ var chunk4H3JTX74_cjs = require('./chunk-4H3JTX74.cjs');
7
+ var chunkEKBEKDWO_cjs = require('./chunk-EKBEKDWO.cjs');
8
+ var chunkXMJE34FY_cjs = require('./chunk-XMJE34FY.cjs');
9
+ var chunkZH5WT2IE_cjs = require('./chunk-ZH5WT2IE.cjs');
10
+ var chunk53YOZOGN_cjs = require('./chunk-53YOZOGN.cjs');
11
+ var chunkZ6TVOAO5_cjs = require('./chunk-Z6TVOAO5.cjs');
12
12
  var lkCore = require('@intellectif/lk-core');
13
13
  var react = require('react');
14
14
  var jsxRuntime = require('react/jsx-runtime');
@@ -39,7 +39,7 @@ function ActivityPreview({
39
39
  theme,
40
40
  locale
41
41
  }) {
42
- const s = chunkLB3FEV7Z_cjs.useLkStrings(strings);
42
+ const s = chunkZ6TVOAO5_cjs.useLkStrings(strings);
43
43
  const type = isRecord(draft) && typeof draft.type === "string" ? draft.type : void 0;
44
44
  const contentKey = contentKeyOf(draft);
45
45
  const result = react.useMemo(
@@ -106,7 +106,7 @@ function ActivityPreview({
106
106
  const data = result.data;
107
107
  const key = `${renderMode}:${responseKey}:${recordingKeyOf(data)}`;
108
108
  if (marking?.kind === "failed") {
109
- return /* @__PURE__ */ jsxRuntime.jsx(chunkUSBANZ7K_cjs.ActivityErrorBoundary, { activityTitle: data.title, strings: s, children: /* @__PURE__ */ jsxRuntime.jsx(Rethrow, { error: marking.error }) }, key);
109
+ return /* @__PURE__ */ jsxRuntime.jsx(chunk53YOZOGN_cjs.ActivityErrorBoundary, { activityTitle: data.title, strings: s, children: /* @__PURE__ */ jsxRuntime.jsx(Rethrow, { error: marking.error }) }, key);
110
110
  }
111
111
  const shared = {
112
112
  renderMode,
@@ -133,7 +133,7 @@ function ActivityPreview({
133
133
  switch (data.type) {
134
134
  case "multiple-choice":
135
135
  return /* @__PURE__ */ jsxRuntime.jsx(
136
- chunkNDQD3ZRY_cjs.MultipleChoice,
136
+ chunkL7NE7PR4_cjs.MultipleChoice,
137
137
  {
138
138
  data,
139
139
  shuffleSeed: shuffleSeed ?? PREVIEW_SHUFFLE_SEED,
@@ -142,10 +142,10 @@ function ActivityPreview({
142
142
  key
143
143
  );
144
144
  case "fill-in-the-blanks":
145
- return /* @__PURE__ */ jsxRuntime.jsx(chunkSE6WWDVW_cjs.FillInTheBlanks, { data, ...shared }, key);
145
+ return /* @__PURE__ */ jsxRuntime.jsx(chunk4H3JTX74_cjs.FillInTheBlanks, { data, ...shared }, key);
146
146
  case "gap-select":
147
147
  return /* @__PURE__ */ jsxRuntime.jsx(
148
- chunkU3APKQ7P_cjs.GapSelect,
148
+ chunkEKBEKDWO_cjs.GapSelect,
149
149
  {
150
150
  data,
151
151
  shuffleSeed: shuffleSeed ?? PREVIEW_SHUFFLE_SEED,
@@ -154,11 +154,11 @@ function ActivityPreview({
154
154
  key
155
155
  );
156
156
  case "written-response":
157
- return /* @__PURE__ */ jsxRuntime.jsx(chunkYEYKJFEC_cjs.WrittenResponse, { data, ...shared }, key);
157
+ return /* @__PURE__ */ jsxRuntime.jsx(chunk26GQO5I2_cjs.WrittenResponse, { data, ...shared }, key);
158
158
  case "dictation":
159
- return /* @__PURE__ */ jsxRuntime.jsx(chunkWTS34S5E_cjs.Dictation, { data, ...shared }, key);
159
+ return /* @__PURE__ */ jsxRuntime.jsx(chunkXMJE34FY_cjs.Dictation, { data, ...shared }, key);
160
160
  case "read-aloud":
161
- return /* @__PURE__ */ jsxRuntime.jsx(chunk36FTYJWJ_cjs.ReadAloud, { data, recordingBinding: PREVIEW_RECORDING, ...shared }, key);
161
+ return /* @__PURE__ */ jsxRuntime.jsx(chunkZH5WT2IE_cjs.ReadAloud, { data, recordingBinding: PREVIEW_RECORDING, ...shared }, key);
162
162
  default:
163
163
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "lk-preview-unsupported", role: "note", children: s.unsupportedActivity });
164
164
  }
@@ -232,5 +232,5 @@ function contentKeyOf(value, enclosing = /* @__PURE__ */ new Set()) {
232
232
  }
233
233
 
234
234
  exports.ActivityPreview = ActivityPreview;
235
- //# sourceMappingURL=chunk-BVRUUYYR.cjs.map
236
- //# sourceMappingURL=chunk-BVRUUYYR.cjs.map
235
+ //# sourceMappingURL=chunk-UAYWLYFW.cjs.map
236
+ //# sourceMappingURL=chunk-UAYWLYFW.cjs.map