@tinyweb_dev/oe-exam-sdk 0.1.2 → 0.1.4

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 (328) hide show
  1. package/README.md +58 -4
  2. package/dist/api/contest-rooms.d.ts +13 -0
  3. package/dist/api/contest-rooms.js +1 -0
  4. package/dist/api/contest-rooms.types.d.ts +47 -0
  5. package/dist/api/contest-rooms.types.js +1 -0
  6. package/dist/api/exam-entry.d.ts +14 -0
  7. package/dist/api/exam-entry.js +1 -0
  8. package/dist/api/exam-entry.types.d.ts +93 -0
  9. package/dist/api/exam-entry.types.js +1 -0
  10. package/dist/api/exam-questions.d.ts +1 -1
  11. package/dist/api/exam-questions.js +1 -1
  12. package/dist/api/exam-questions.types.d.ts +45 -1
  13. package/dist/api/index.d.ts +2 -0
  14. package/dist/api/index.js +1 -1
  15. package/dist/components/exams/CompletionDialog.d.ts +8 -0
  16. package/dist/components/exams/CompletionDialog.js +1 -0
  17. package/dist/components/exams/CreateExamInfoForm.d.ts +4 -1
  18. package/dist/components/exams/CreateExamInfoForm.js +1 -1
  19. package/dist/components/exams/CreateExamPageContainer.d.ts +3 -0
  20. package/dist/components/exams/CreateExamPageContainer.js +1 -1
  21. package/dist/components/exams/ExamCreator.d.ts +9 -3
  22. package/dist/components/exams/ExamCreator.js +1 -1
  23. package/dist/components/exams/ExamPartTabs.d.ts +1 -1
  24. package/dist/components/exams/ExamPartTabs.js +1 -1
  25. package/dist/components/exams/ExamPreviewDialog.d.ts +20 -0
  26. package/dist/components/exams/ExamPreviewDialog.js +1 -0
  27. package/dist/components/exams/ExamQuestionGrid.d.ts +1 -1
  28. package/dist/components/exams/ExamQuestionGrid.js +1 -1
  29. package/dist/components/exams/ExamQuestionsPageContainer.d.ts +3 -0
  30. package/dist/components/exams/ExamQuestionsPageContainer.js +1 -1
  31. package/dist/components/exams/ExamViewDialog.d.ts +24 -0
  32. package/dist/components/exams/ExamViewDialog.js +1 -0
  33. package/dist/components/exams/TemplateSelector.js +1 -1
  34. package/dist/components/exams/UnsavedChangesDialog.d.ts +8 -0
  35. package/dist/components/exams/UnsavedChangesDialog.js +1 -0
  36. package/dist/components/exams/api.d.ts +1 -1
  37. package/dist/components/exams/create-exam.texts.d.ts +58 -0
  38. package/dist/components/exams/create-exam.texts.js +1 -0
  39. package/dist/components/exams/create-exam.validation.js +1 -1
  40. package/dist/components/exams/entry/EntryRestartDialog.d.ts +12 -0
  41. package/dist/components/exams/entry/EntryRestartDialog.js +1 -0
  42. package/dist/components/exams/entry/StudentExamEntryPageContainer.d.ts +31 -0
  43. package/dist/components/exams/entry/StudentExamEntryPageContainer.js +1 -0
  44. package/dist/components/exams/entry/exam-entry.states.d.ts +22 -0
  45. package/dist/components/exams/entry/exam-entry.states.js +1 -0
  46. package/dist/components/exams/entry/exam-entry.utils.d.ts +16 -0
  47. package/dist/components/exams/entry/exam-entry.utils.js +1 -0
  48. package/dist/components/exams/entry/fullscreen-loading.d.ts +5 -0
  49. package/dist/components/exams/entry/fullscreen-loading.js +1 -0
  50. package/dist/components/exams/entry/index.d.ts +7 -0
  51. package/dist/components/exams/entry/index.js +1 -0
  52. package/dist/components/exams/exam-question-status.d.ts +9 -0
  53. package/dist/components/exams/exam-question-status.js +1 -0
  54. package/dist/components/exams/index.d.ts +19 -1
  55. package/dist/components/exams/index.js +1 -1
  56. package/dist/components/exams/rooms/StudentContestRoomsPageContainer.d.ts +18 -0
  57. package/dist/components/exams/rooms/StudentContestRoomsPageContainer.js +1 -0
  58. package/dist/components/exams/rooms/contest-rooms.utils.d.ts +32 -0
  59. package/dist/components/exams/rooms/contest-rooms.utils.js +1 -0
  60. package/dist/components/exams/rooms/index.d.ts +3 -0
  61. package/dist/components/exams/rooms/index.js +1 -0
  62. package/dist/components/exams/take/ExamTakingApiContext.d.ts +10 -0
  63. package/dist/components/exams/take/ExamTakingApiContext.js +1 -0
  64. package/dist/components/exams/take/ExamTakingPageContainer.d.ts +28 -4
  65. package/dist/components/exams/take/ExamTakingPageContainer.js +1 -1
  66. package/dist/components/exams/take/components/QuestionRenderer.d.ts +25 -0
  67. package/dist/components/exams/take/components/QuestionRenderer.js +1 -0
  68. package/dist/components/exams/take/components/index.d.ts +10 -0
  69. package/dist/components/exams/take/components/index.js +1 -0
  70. package/dist/components/exams/take/components/question-renderers/ArticlesViewer.d.ts +7 -0
  71. package/dist/components/exams/take/components/question-renderers/ArticlesViewer.js +1 -0
  72. package/dist/components/exams/take/components/question-renderers/MoversAnswerTheQuestionRenderer.d.ts +22 -0
  73. package/dist/components/exams/take/components/question-renderers/MoversAnswerTheQuestionRenderer.js +1 -0
  74. package/dist/components/exams/take/components/question-renderers/MoversChooseAdjectiveRenderer.d.ts +14 -0
  75. package/dist/components/exams/take/components/question-renderers/MoversChooseAdjectiveRenderer.js +1 -0
  76. package/dist/components/exams/take/components/question-renderers/MoversChooseBestAnswerRenderer.d.ts +2 -0
  77. package/dist/components/exams/take/components/question-renderers/MoversChooseBestAnswerRenderer.js +1 -0
  78. package/dist/components/exams/take/components/question-renderers/MoversColoringRenderer.d.ts +3 -0
  79. package/dist/components/exams/take/components/question-renderers/MoversColoringRenderer.js +1 -0
  80. package/dist/components/exams/take/components/question-renderers/MoversFillWordHintRenderer.d.ts +2 -0
  81. package/dist/components/exams/take/components/question-renderers/MoversFillWordHintRenderer.js +1 -0
  82. package/dist/components/exams/take/components/question-renderers/MoversGridFillRenderer.d.ts +2 -0
  83. package/dist/components/exams/take/components/question-renderers/MoversGridFillRenderer.js +1 -0
  84. package/dist/components/exams/take/components/question-renderers/MoversLabelThePictureRenderer.d.ts +2 -0
  85. package/dist/components/exams/take/components/question-renderers/MoversLabelThePictureRenderer.js +1 -0
  86. package/dist/components/exams/take/components/question-renderers/MoversListenAndWriteRenderer.d.ts +21 -0
  87. package/dist/components/exams/take/components/question-renderers/MoversListenAndWriteRenderer.js +1 -0
  88. package/dist/components/exams/take/components/question-renderers/MoversMatchByWritingAnswerRenderer.d.ts +19 -0
  89. package/dist/components/exams/take/components/question-renderers/MoversMatchByWritingAnswerRenderer.js +1 -0
  90. package/dist/components/exams/take/components/question-renderers/MoversPictureChooseRenderer.d.ts +2 -0
  91. package/dist/components/exams/take/components/question-renderers/MoversPictureChooseRenderer.js +1 -0
  92. package/dist/components/exams/take/components/question-renderers/MoversPictureFillBlankChooseRenderer.d.ts +2 -0
  93. package/dist/components/exams/take/components/question-renderers/MoversPictureFillBlankChooseRenderer.js +1 -0
  94. package/dist/components/exams/take/components/question-renderers/MoversReadingPassageRenderer.d.ts +2 -0
  95. package/dist/components/exams/take/components/question-renderers/MoversReadingPassageRenderer.js +1 -0
  96. package/dist/components/exams/take/components/question-renderers/MoversTrueFalseRenderer.d.ts +20 -0
  97. package/dist/components/exams/take/components/question-renderers/MoversTrueFalseRenderer.js +1 -0
  98. package/dist/components/exams/take/components/question-renderers/MoversWordFillParagraphRenderer.d.ts +32 -0
  99. package/dist/components/exams/take/components/question-renderers/MoversWordFillParagraphRenderer.js +1 -0
  100. package/dist/components/exams/take/components/question-renderers/MoversWordFillStructuredFormRenderer.d.ts +18 -0
  101. package/dist/components/exams/take/components/question-renderers/MoversWordFillStructuredFormRenderer.js +1 -0
  102. package/dist/components/exams/take/components/question-renderers/MoversWordOrderingRenderer.d.ts +19 -0
  103. package/dist/components/exams/take/components/question-renderers/MoversWordOrderingRenderer.js +1 -0
  104. package/dist/components/exams/take/components/question-renderers/MoversWriteSentencesRenderer.d.ts +22 -0
  105. package/dist/components/exams/take/components/question-renderers/MoversWriteSentencesRenderer.js +1 -0
  106. package/dist/components/exams/take/components/question-renderers/MoversWritingRenderer.d.ts +18 -0
  107. package/dist/components/exams/take/components/question-renderers/MoversWritingRenderer.js +1 -0
  108. package/dist/components/exams/take/components/question-renderers/index.d.ts +19 -0
  109. package/dist/components/exams/take/components/question-renderers/index.js +1 -0
  110. package/dist/components/exams/take/components/speaking/FindObjectInPicture.module.css +133 -0
  111. package/dist/components/exams/take/components/speaking/SpeakingAudioPlayer.d.ts +9 -0
  112. package/dist/components/exams/take/components/speaking/SpeakingAudioPlayer.js +1 -0
  113. package/dist/components/exams/take/components/speaking/SpeakingCompareImages.module.css +153 -0
  114. package/dist/components/exams/take/components/speaking/SpeakingContentFrame.d.ts +7 -0
  115. package/dist/components/exams/take/components/speaking/SpeakingContentFrame.js +1 -0
  116. package/dist/components/exams/take/components/speaking/SpeakingDragObjects.module.css +238 -0
  117. package/dist/components/exams/take/components/speaking/SpeakingExamLayout.d.ts +27 -0
  118. package/dist/components/exams/take/components/speaking/SpeakingExamLayout.js +1 -0
  119. package/dist/components/exams/take/components/speaking/SpeakingHeader.d.ts +6 -0
  120. package/dist/components/exams/take/components/speaking/SpeakingHeader.js +1 -0
  121. package/dist/components/exams/take/components/speaking/SpeakingInfoExchange.module.css +193 -0
  122. package/dist/components/exams/take/components/speaking/SpeakingInfoExchangeSummerSky.module.css +238 -0
  123. package/dist/components/exams/take/components/speaking/SpeakingInstructionBar.d.ts +5 -0
  124. package/dist/components/exams/take/components/speaking/SpeakingInstructionBar.js +1 -0
  125. package/dist/components/exams/take/components/speaking/SpeakingMicButton.d.ts +14 -0
  126. package/dist/components/exams/take/components/speaking/SpeakingMicButton.js +1 -0
  127. package/dist/components/exams/take/components/speaking/SpeakingNavButton.d.ts +7 -0
  128. package/dist/components/exams/take/components/speaking/SpeakingNavButton.js +1 -0
  129. package/dist/components/exams/take/components/speaking/SpeakingPartBadge.d.ts +6 -0
  130. package/dist/components/exams/take/components/speaking/SpeakingPartBadge.js +1 -0
  131. package/dist/components/exams/take/components/speaking/SpeakingReadDisplayedContent.module.css +115 -0
  132. package/dist/components/exams/take/components/speaking/SpeakingRecordingPreview.d.ts +11 -0
  133. package/dist/components/exams/take/components/speaking/SpeakingRecordingPreview.js +1 -0
  134. package/dist/components/exams/take/components/speaking/SpeakingReportErrorButton.d.ts +1 -0
  135. package/dist/components/exams/take/components/speaking/SpeakingReportErrorButton.js +1 -0
  136. package/dist/components/exams/take/components/speaking/SpeakingStoryImages.module.css +231 -0
  137. package/dist/components/exams/take/components/speaking/SpeakingVideoIntro.d.ts +13 -0
  138. package/dist/components/exams/take/components/speaking/SpeakingVideoIntro.js +1 -0
  139. package/dist/components/exams/take/components/speaking/index.d.ts +1 -0
  140. package/dist/components/exams/take/components/speaking/index.js +1 -0
  141. package/dist/components/exams/take/components/speaking/renderers/SpeakingChooseAnswerGroupRenderer.d.ts +16 -0
  142. package/dist/components/exams/take/components/speaking/renderers/SpeakingChooseAnswerGroupRenderer.js +1 -0
  143. package/dist/components/exams/take/components/speaking/renderers/SpeakingChooseObjectsRenderer.d.ts +16 -0
  144. package/dist/components/exams/take/components/speaking/renderers/SpeakingChooseObjectsRenderer.js +1 -0
  145. package/dist/components/exams/take/components/speaking/renderers/SpeakingCompareImagesRenderer.d.ts +17 -0
  146. package/dist/components/exams/take/components/speaking/renderers/SpeakingCompareImagesRenderer.js +1 -0
  147. package/dist/components/exams/take/components/speaking/renderers/SpeakingConversationRenderer.d.ts +16 -0
  148. package/dist/components/exams/take/components/speaking/renderers/SpeakingConversationRenderer.js +1 -0
  149. package/dist/components/exams/take/components/speaking/renderers/SpeakingCueCardRenderer.d.ts +17 -0
  150. package/dist/components/exams/take/components/speaking/renderers/SpeakingCueCardRenderer.js +1 -0
  151. package/dist/components/exams/take/components/speaking/renderers/SpeakingDescribeImageRenderer.d.ts +18 -0
  152. package/dist/components/exams/take/components/speaking/renderers/SpeakingDescribeImageRenderer.js +1 -0
  153. package/dist/components/exams/take/components/speaking/renderers/SpeakingDragObjectsRenderer.d.ts +16 -0
  154. package/dist/components/exams/take/components/speaking/renderers/SpeakingDragObjectsRenderer.js +1 -0
  155. package/dist/components/exams/take/components/speaking/renderers/SpeakingGNInterviewRenderer.d.ts +16 -0
  156. package/dist/components/exams/take/components/speaking/renderers/SpeakingGNInterviewRenderer.js +1 -0
  157. package/dist/components/exams/take/components/speaking/renderers/SpeakingInfoExchangeRenderer.d.ts +16 -0
  158. package/dist/components/exams/take/components/speaking/renderers/SpeakingInfoExchangeRenderer.js +1 -0
  159. package/dist/components/exams/take/components/speaking/renderers/SpeakingListenAndSpeakAnswerRenderer.d.ts +16 -0
  160. package/dist/components/exams/take/components/speaking/renderers/SpeakingListenAndSpeakAnswerRenderer.js +1 -0
  161. package/dist/components/exams/take/components/speaking/renderers/SpeakingOddOneOutRenderer.d.ts +16 -0
  162. package/dist/components/exams/take/components/speaking/renderers/SpeakingOddOneOutRenderer.js +1 -0
  163. package/dist/components/exams/take/components/speaking/renderers/SpeakingQuestionListRenderer.d.ts +26 -0
  164. package/dist/components/exams/take/components/speaking/renderers/SpeakingQuestionListRenderer.js +1 -0
  165. package/dist/components/exams/take/components/speaking/renderers/SpeakingQuestionRenderer.d.ts +32 -0
  166. package/dist/components/exams/take/components/speaking/renderers/SpeakingQuestionRenderer.js +1 -0
  167. package/dist/components/exams/take/components/speaking/renderers/SpeakingReadDisplayedContentRenderer.d.ts +34 -0
  168. package/dist/components/exams/take/components/speaking/renderers/SpeakingReadDisplayedContentRenderer.js +1 -0
  169. package/dist/components/exams/take/components/speaking/renderers/SpeakingSpontaneousQARenderer.d.ts +17 -0
  170. package/dist/components/exams/take/components/speaking/renderers/SpeakingSpontaneousQARenderer.js +1 -0
  171. package/dist/components/exams/take/components/speaking/renderers/SpeakingStoryImagesRenderer.d.ts +17 -0
  172. package/dist/components/exams/take/components/speaking/renderers/SpeakingStoryImagesRenderer.js +1 -0
  173. package/dist/components/exams/take/components/speaking/renderers/index.d.ts +13 -0
  174. package/dist/components/exams/take/components/speaking/renderers/index.js +1 -0
  175. package/dist/components/exams/take/hooks/index.d.ts +2 -0
  176. package/dist/components/exams/take/hooks/index.js +1 -0
  177. package/dist/components/exams/take/hooks/useAnswerAutosave.d.ts +27 -0
  178. package/dist/components/exams/take/hooks/useAnswerAutosave.js +1 -0
  179. package/dist/components/exams/take/hooks/useAttemptSubmit.d.ts +29 -0
  180. package/dist/components/exams/take/hooks/useAttemptSubmit.js +1 -0
  181. package/dist/components/exams/take/hooks/useAutoSave.d.ts +20 -0
  182. package/dist/components/exams/take/hooks/useAutoSave.js +1 -0
  183. package/dist/components/exams/take/hooks/useExamCountdown.d.ts +22 -0
  184. package/dist/components/exams/take/hooks/useExamCountdown.js +1 -0
  185. package/dist/components/exams/take/hooks/useExamTimer.d.ts +21 -0
  186. package/dist/components/exams/take/hooks/useExamTimer.js +1 -0
  187. package/dist/components/exams/take/hooks/useProctoringCamera.d.ts +19 -0
  188. package/dist/components/exams/take/hooks/useProctoringCamera.js +1 -0
  189. package/dist/components/exams/take/hooks/useProctoringSnapshot.d.ts +25 -0
  190. package/dist/components/exams/take/hooks/useProctoringSnapshot.js +1 -0
  191. package/dist/components/exams/take/hooks/useSpeakingConversationAudio.d.ts +19 -0
  192. package/dist/components/exams/take/hooks/useSpeakingConversationAudio.js +1 -0
  193. package/dist/components/exams/take/hooks/useSpeakingNavigation.d.ts +37 -0
  194. package/dist/components/exams/take/hooks/useSpeakingNavigation.js +1 -0
  195. package/dist/components/exams/take/hooks/useSpeakingRecorder.d.ts +45 -5
  196. package/dist/components/exams/take/hooks/useSpeakingRecorder.js +1 -1
  197. package/dist/components/exams/take/hooks/useSpeakingRendererSetup.d.ts +39 -0
  198. package/dist/components/exams/take/hooks/useSpeakingRendererSetup.js +1 -0
  199. package/dist/components/exams/take/hooks/useToeicAudio.d.ts +17 -0
  200. package/dist/components/exams/take/hooks/useToeicAudio.js +1 -0
  201. package/dist/components/exams/take/index.d.ts +9 -1
  202. package/dist/components/exams/take/index.js +1 -1
  203. package/dist/components/exams/take/types/speaking-cue-card.types.d.ts +10 -0
  204. package/dist/components/exams/take/types/speaking-cue-card.types.js +1 -0
  205. package/dist/components/exams/take/types/speaking.types.d.ts +153 -0
  206. package/dist/components/exams/take/types/speaking.types.js +1 -0
  207. package/dist/components/exams/take/types.d.ts +286 -1
  208. package/dist/components/exams/take/utils/answer-transformers.d.ts +26 -0
  209. package/dist/components/exams/take/utils/answer-transformers.js +1 -0
  210. package/dist/components/exams/take/utils/coloring-assignments.d.ts +5 -0
  211. package/dist/components/exams/take/utils/coloring-assignments.js +1 -0
  212. package/dist/components/exams/take/utils/question-transformers.d.ts +362 -0
  213. package/dist/components/exams/take/utils/question-transformers.js +1 -0
  214. package/dist/components/features/exam-entry/entry-state-cards.d.ts +19 -0
  215. package/dist/components/features/exam-entry/entry-state-cards.js +1 -0
  216. package/dist/components/features/exam-entry/index.d.ts +2 -0
  217. package/dist/components/features/exam-entry/index.js +1 -0
  218. package/dist/components/features/exam-entry/themed/CambridgeYleWaitingRoom.d.ts +12 -0
  219. package/dist/components/features/exam-entry/themed/CambridgeYleWaitingRoom.js +1 -0
  220. package/dist/components/features/exam-entry/themed/ThemedWaitingRoom.d.ts +14 -0
  221. package/dist/components/features/exam-entry/themed/ThemedWaitingRoom.js +1 -0
  222. package/dist/components/features/exam-entry/themed/ToeicWaitingRoom.d.ts +16 -0
  223. package/dist/components/features/exam-entry/themed/ToeicWaitingRoom.js +1 -0
  224. package/dist/components/features/exam-entry/themed/components/CloseButton.d.ts +9 -0
  225. package/dist/components/features/exam-entry/themed/components/CloseButton.js +1 -0
  226. package/dist/components/features/exam-entry/themed/components/ExamInfoPanel.d.ts +13 -0
  227. package/dist/components/features/exam-entry/themed/components/ExamInfoPanel.js +1 -0
  228. package/dist/components/features/exam-entry/themed/components/ModeSelector.d.ts +7 -0
  229. package/dist/components/features/exam-entry/themed/components/ModeSelector.js +1 -0
  230. package/dist/components/features/exam-entry/themed/components/StartButton.d.ts +11 -0
  231. package/dist/components/features/exam-entry/themed/components/StartButton.js +1 -0
  232. package/dist/components/features/exam-entry/themed/components/index.d.ts +4 -0
  233. package/dist/components/features/exam-entry/themed/components/index.js +1 -0
  234. package/dist/components/features/exam-entry/themed/index.d.ts +1 -0
  235. package/dist/components/features/exam-entry/themed/index.js +1 -0
  236. package/dist/components/results/ResultReviewPageContainer.d.ts +3 -1
  237. package/dist/components/results/ResultReviewPageContainer.js +1 -1
  238. package/dist/components/results/hooks/useResultReviewPolling.d.ts +27 -0
  239. package/dist/components/results/hooks/useResultReviewPolling.js +1 -0
  240. package/dist/components/results/index.d.ts +3 -0
  241. package/dist/components/results/index.js +1 -1
  242. package/dist/components/results/review-status.utils.d.ts +12 -0
  243. package/dist/components/results/review-status.utils.js +1 -0
  244. package/dist/components/shared/audio/SpeakingAudioPlayer.d.ts +12 -0
  245. package/dist/components/shared/audio/SpeakingAudioPlayer.js +1 -0
  246. package/dist/components/shared/audio/SpeakingAudioPlayer.module.css +115 -0
  247. package/dist/components/shared/audio/assets/fr-image-part1-border.png +0 -0
  248. package/dist/components/shared/audio/assets/ic-speaker.webp +0 -0
  249. package/dist/components/themes/cambridge-yle/CambridgeYleTimer.js +1 -1
  250. package/dist/components/themes/english-certification/EnglishCertificationAudioPlayer.d.ts +11 -3
  251. package/dist/components/themes/english-certification/EnglishCertificationAudioPlayer.js +1 -1
  252. package/dist/components/themes/english-certification/EnglishCertificationQuestionRenderer.d.ts +5 -1
  253. package/dist/components/themes/english-certification/EnglishCertificationQuestionRenderer.js +1 -1
  254. package/dist/components/themes/index.d.ts +11 -0
  255. package/dist/components/themes/index.js +1 -1
  256. package/dist/components/themes/spaceship/SpaceshipAudioPlayer.d.ts +8 -0
  257. package/dist/components/themes/spaceship/SpaceshipAudioPlayer.js +1 -0
  258. package/dist/components/themes/spaceship/SpaceshipLayout.d.ts +2 -0
  259. package/dist/components/themes/spaceship/SpaceshipLayout.js +1 -0
  260. package/dist/components/themes/spaceship/assets/images/X-sunset.png +0 -0
  261. package/dist/components/themes/spaceship/assets/images/X.webp +0 -0
  262. package/dist/components/themes/spaceship/assets/images/audio-bar.webp +0 -0
  263. package/dist/components/themes/spaceship/assets/images/background.webp +0 -0
  264. package/dist/components/themes/spaceship/assets/images/bg_sunset.png +0 -0
  265. package/dist/components/themes/spaceship/assets/images/big-blue-badge-sunset.png +0 -0
  266. package/dist/components/themes/spaceship/assets/images/big-blue-badge.png +0 -0
  267. package/dist/components/themes/spaceship/assets/images/big-blue-badge.webp +0 -0
  268. package/dist/components/themes/spaceship/assets/images/bingo.webp +0 -0
  269. package/dist/components/themes/spaceship/assets/images/blue-badge-sunset.png +0 -0
  270. package/dist/components/themes/spaceship/assets/images/blue-badge.png +0 -0
  271. package/dist/components/themes/spaceship/assets/images/blue-wrapper-sunset.png +0 -0
  272. package/dist/components/themes/spaceship/assets/images/blue-wrapper.webp +0 -0
  273. package/dist/components/themes/spaceship/assets/images/board_red.png +0 -0
  274. package/dist/components/themes/spaceship/assets/images/button_feedback_vi.png +0 -0
  275. package/dist/components/themes/spaceship/assets/images/circle-btn-right-sunset.png +0 -0
  276. package/dist/components/themes/spaceship/assets/images/circle-btn-right.png +0 -0
  277. package/dist/components/themes/spaceship/assets/images/circle-btn-sunset.png +0 -0
  278. package/dist/components/themes/spaceship/assets/images/circle-btn.webp +0 -0
  279. package/dist/components/themes/spaceship/assets/images/focus-vector.webp +0 -0
  280. package/dist/components/themes/spaceship/assets/images/head-phone_red.png +0 -0
  281. package/dist/components/themes/spaceship/assets/images/ic-mute-sunset.png +0 -0
  282. package/dist/components/themes/spaceship/assets/images/ic-mute.png +0 -0
  283. package/dist/components/themes/spaceship/assets/images/ic-play-sunset.png +0 -0
  284. package/dist/components/themes/spaceship/assets/images/ic-play-violet.webp +0 -0
  285. package/dist/components/themes/spaceship/assets/images/ic-play.webp +0 -0
  286. package/dist/components/themes/spaceship/assets/images/micro.png +0 -0
  287. package/dist/components/themes/spaceship/assets/images/next-small.webp +0 -0
  288. package/dist/components/themes/spaceship/assets/images/next-sunset.png +0 -0
  289. package/dist/components/themes/spaceship/assets/images/next.webp +0 -0
  290. package/dist/components/themes/spaceship/assets/images/purple-circle.webp +0 -0
  291. package/dist/components/themes/spaceship/assets/images/question-badge-sunset.png +0 -0
  292. package/dist/components/themes/spaceship/assets/images/question-badge.webp +0 -0
  293. package/dist/components/themes/spaceship/assets/images/red-badge-sunset.png +0 -0
  294. package/dist/components/themes/spaceship/assets/images/red-badge.webp +0 -0
  295. package/dist/components/themes/spaceship/assets/images/red-wrapper-sunset.png +0 -0
  296. package/dist/components/themes/spaceship/assets/images/red-wrapper.webp +0 -0
  297. package/dist/components/themes/spaceship/assets/images/robot-avatar.png +0 -0
  298. package/dist/components/themes/spaceship/assets/images/sound_red.png +0 -0
  299. package/dist/components/themes/spaceship/assets/images/student-avatar.png +0 -0
  300. package/dist/components/themes/spaceship/assets/images/teacher-play-sunset.png +0 -0
  301. package/dist/components/themes/spaceship/assets/images/teacher-play.webp +0 -0
  302. package/dist/components/themes/spaceship/assets/images/timer-badge.png +0 -0
  303. package/dist/components/themes/spaceship/assets/styles/SpaceshipLayout.module.css +347 -0
  304. package/dist/components/themes/spaceship/assets/styles/SpaceshipWaitingRoom.module.css +395 -0
  305. package/dist/components/ui/badge.d.ts +1 -1
  306. package/dist/index.d.ts +4 -4
  307. package/dist/index.js +1 -1
  308. package/dist/shared/index.d.ts +3 -0
  309. package/dist/shared/index.js +1 -1
  310. package/dist/shared/lib/stores/examTakingStore.d.ts +54 -0
  311. package/dist/shared/lib/stores/examTakingStore.js +1 -0
  312. package/dist/shared/lib/stores/gradingTransientStore.d.ts +23 -0
  313. package/dist/shared/lib/stores/gradingTransientStore.js +1 -0
  314. package/dist/shared/lib/themes/config/starters.config.d.ts +3 -0
  315. package/dist/shared/lib/themes/config/starters.config.js +1 -0
  316. package/dist/shared/lib/themes/index.d.ts +18 -0
  317. package/dist/shared/lib/themes/index.js +1 -0
  318. package/dist/shared/lib/themes/types.d.ts +39 -0
  319. package/dist/shared/lib/themes/types.js +1 -0
  320. package/dist/shared/lib/toast.d.ts +19 -0
  321. package/dist/shared/lib/toast.js +1 -0
  322. package/dist/shared/lib/utils/question-reverse-transform.d.ts +6 -0
  323. package/dist/shared/lib/utils/question-reverse-transform.js +1 -0
  324. package/dist/shared/lib/utils/question-transform-validation.d.ts +6 -0
  325. package/dist/shared/lib/utils/question-transform-validation.js +1 -0
  326. package/dist/shared/lib/utils/question-transform.d.ts +6 -2
  327. package/dist/shared/lib/utils/question-transform.js +1 -1
  328. package/package.json +19 -4
@@ -0,0 +1,347 @@
1
+ /* ===== Font Face ===== */
2
+ @font-face {
3
+ font-family: 'Open Sans';
4
+ src: url('https://fonts.gstatic.com/s/opensans/v34/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsjZ0B4taVQUwaEQXjN_mQ.woff') format('woff');
5
+ font-weight: 400;
6
+ font-style: normal;
7
+ font-display: swap;
8
+ }
9
+
10
+ @keyframes audioWaveBouncing {
11
+ 0% {
12
+ transform: scaleY(0.1);
13
+ }
14
+
15
+ 50% {
16
+ transform: scaleY(1);
17
+ }
18
+
19
+ 100% {
20
+ transform: scaleY(0.2);
21
+ }
22
+ }
23
+
24
+ .audioWaveBar {
25
+ background-color: rgba(255, 255, 255, 0.8);
26
+ border-radius: 9999px;
27
+ width: 3px;
28
+ height: 100%;
29
+ animation-name: audioWaveBouncing;
30
+ animation-timing-function: ease-in-out;
31
+ animation-iteration-count: infinite;
32
+ animation-direction: alternate;
33
+ transform-origin: center;
34
+ }
35
+
36
+ /* ===== Page Container ===== */
37
+ .pageContainer {
38
+ height: 100vh;
39
+ width: 100vw;
40
+ position: fixed;
41
+ inset: 0;
42
+ overflow: auto;
43
+ font-family: 'Open Sans', sans-serif;
44
+ }
45
+
46
+ .pageContainer::before {
47
+ content: "";
48
+ position: fixed;
49
+ inset: -20px;
50
+ background: url('../images/bg_sunset.png') no-repeat center center;
51
+ background-size: cover;
52
+ filter: blur(8px);
53
+ z-index: -1;
54
+ }
55
+
56
+ /* ===== Exam Container ===== */
57
+ .examContainer {
58
+ width: 100%;
59
+ display: flex;
60
+ justify-content: center;
61
+ padding: 0 30px 10px;
62
+ margin-top: 8%;
63
+ transform-origin: top;
64
+ height: 700px;
65
+ }
66
+
67
+ /* ===== Main Board ===== */
68
+ .examMainBoard {
69
+ position: relative;
70
+ height: 100%;
71
+ }
72
+
73
+ .examContentMainContainer {
74
+ background-color: white;
75
+ width: 1269px !important;
76
+ height: 100%;
77
+ border-radius: 33px;
78
+ border: 4px solid rgb(120, 30, 60);
79
+ box-shadow: rgb(163, 50, 80) 0px 0px 0px 7px, rgb(208, 120, 79) 0px 0px 0px 8px;
80
+ position: relative;
81
+ display: flex;
82
+ flex-direction: column;
83
+ align-items: center;
84
+ overflow: visible;
85
+ }
86
+
87
+ /* ===== Header Title (Top Left) ===== */
88
+ .headerTitleWrapper {
89
+ position: absolute;
90
+ top: -120px;
91
+ left: -15%;
92
+ z-index: 200;
93
+ }
94
+
95
+ @media (min-width: 1536px) {
96
+ .headerTitleWrapper {
97
+ left: -20%;
98
+ }
99
+ }
100
+
101
+ .exitButtonWrapper {
102
+ position: absolute;
103
+ z-index: 2;
104
+ transform: translate(-10px, -10px) scale(1.15);
105
+ user-select: none;
106
+ }
107
+
108
+ .circleBtn {
109
+ position: relative;
110
+ display: inline-block;
111
+ width: 90px;
112
+ height: 90px;
113
+ }
114
+
115
+ .circleBtnBg {
116
+ width: 100%;
117
+ height: 100%;
118
+ z-index: 0;
119
+ }
120
+
121
+ .circleBtnInner {
122
+ position: absolute;
123
+ inset: 0;
124
+ display: flex;
125
+ align-items: center;
126
+ justify-content: center;
127
+ width: 100%;
128
+ height: 100%;
129
+ cursor: pointer;
130
+ user-select: none;
131
+ }
132
+
133
+ .exitIcon {
134
+ width: 23px;
135
+ height: 23px;
136
+ }
137
+
138
+ .headerTitleBox {
139
+ border-radius: 24px;
140
+ position: absolute;
141
+ height: 64px;
142
+ display: flex;
143
+ justify-content: flex-end;
144
+ align-items: center;
145
+ border: 2px solid rgb(235, 151, 99);
146
+ background: linear-gradient(rgb(222, 71, 92) 0%, rgb(251, 154, 117) 100%);
147
+ box-shadow: rgba(0, 0, 0, 0.396) 3px 3px 0px 1px;
148
+ }
149
+
150
+ .headerTitleText {
151
+ color: white;
152
+ text-transform: uppercase;
153
+ padding-left: 80px;
154
+ }
155
+
156
+ .headerTitlePartName {
157
+ font-size: 1.125rem;
158
+ margin: 0;
159
+ line-height: 17px;
160
+ white-space: nowrap;
161
+ }
162
+
163
+ .headerTitleInstruction {
164
+ font-size: 0.875rem;
165
+ margin: 0;
166
+ line-height: 17px;
167
+ padding-right: 20px;
168
+ white-space: nowrap;
169
+ }
170
+
171
+ /* ===== Controls ===== */
172
+ .controlLeft {
173
+ width: 80px !important;
174
+ height: 100%;
175
+ display: flex;
176
+ flex-direction: column;
177
+ justify-content: center;
178
+ position: absolute;
179
+ left: -130px;
180
+ top: 0;
181
+ user-select: none;
182
+ }
183
+
184
+ .controlRight {
185
+ width: 80px !important;
186
+ height: 100%;
187
+ display: flex;
188
+ flex-direction: column;
189
+ justify-content: center;
190
+ position: absolute;
191
+ right: -120px;
192
+ top: 0;
193
+ user-select: none;
194
+ }
195
+
196
+ .nextPrevIcon {
197
+ width: auto;
198
+ height: 29px;
199
+ transform: translateX(4px);
200
+ }
201
+
202
+ .nextPrevIcon.rotate {
203
+ transform: rotate(180deg) translateX(4px);
204
+ }
205
+
206
+ /* ===== Audio Container (Big Blue Badge) ===== */
207
+ .examAudioContainer {
208
+ position: absolute;
209
+ top: -50px;
210
+ display: flex;
211
+ justify-content: center;
212
+ }
213
+
214
+ .bigBlueBadge {
215
+ position: relative;
216
+ display: flex;
217
+ }
218
+
219
+ .bigBlueBadgeBg {
220
+ z-index: 0;
221
+ height: 66px;
222
+ width: 999px;
223
+ }
224
+
225
+ .audioBarContent {
226
+ position: absolute;
227
+ inset: 0;
228
+ display: flex;
229
+ justify-content: center;
230
+ align-items: center;
231
+ padding-top: 12px;
232
+ }
233
+
234
+ .audioBarInner {
235
+ width: 100%;
236
+ display: flex;
237
+ align-items: center;
238
+ justify-content: flex-start;
239
+ padding: 0 24px;
240
+ gap: 12px;
241
+ }
242
+
243
+ .partLabel {
244
+ font-size: 28px;
245
+ text-transform: uppercase;
246
+ white-space: nowrap;
247
+ line-height: 40px;
248
+ color: white;
249
+ text-shadow: rgba(0, 0, 0, 0.25) 0px 3px 0px;
250
+ }
251
+
252
+ .teacherAvatarContainer {
253
+ border-radius: 9999px;
254
+ width: 72px;
255
+ height: 72px;
256
+ overflow: hidden;
257
+ cursor: pointer;
258
+ position: relative;
259
+ flex-shrink: 0;
260
+ }
261
+
262
+ .teacherPlayIcon {
263
+ object-fit: cover;
264
+ width: 100%;
265
+ height: 100%;
266
+ transform: scale(1.15);
267
+ }
268
+
269
+ .audioControlsWrapper {
270
+ height: 100%;
271
+ display: flex;
272
+ align-items: center;
273
+ gap: 7px;
274
+ width: 100%;
275
+ flex-grow: 1;
276
+ }
277
+
278
+ .audioTime {
279
+ color: white;
280
+ font-size: 0.875rem;
281
+ font-weight: 700;
282
+ transform: translateY(2px);
283
+ white-space: nowrap;
284
+ padding-right: 4px;
285
+ }
286
+
287
+ .sliderTrack {
288
+ border-radius: 2px;
289
+ height: 10px;
290
+ background-color: #541F0C;
291
+ overflow: hidden;
292
+ flex-grow: 1;
293
+ box-shadow: rgba(0, 0, 0, 0.5) 0px 0.587px 0px 0px;
294
+ position: relative;
295
+ cursor: pointer;
296
+ }
297
+
298
+ .sliderFill {
299
+ height: 100%;
300
+ border-radius: 1px;
301
+ background-color: #FFDC30;
302
+ box-shadow: rgb(247, 171, 22) 0px -4px 0px 0px inset;
303
+ }
304
+
305
+ .volumeContainer {
306
+ display: flex;
307
+ align-items: center;
308
+ gap: 8px;
309
+ width: 100px;
310
+ margin-right: 16px;
311
+ }
312
+
313
+ .volumeIcon {
314
+ cursor: pointer;
315
+ width: 24px;
316
+ height: 24px;
317
+ }
318
+
319
+ /* ===== Content Space ===== */
320
+ .examContentSpace {
321
+ margin-top: 50px;
322
+ width: 100%;
323
+ height: calc(100% - 95px);
324
+ display: flex;
325
+ flex-direction: column;
326
+ align-items: center;
327
+ position: relative;
328
+ }
329
+
330
+ /* ===== Feedback Button ===== */
331
+ .feedbackButton {
332
+ position: fixed;
333
+ right: 0;
334
+ bottom: 10%;
335
+ cursor: pointer;
336
+ z-index: 100;
337
+ }
338
+
339
+ .feedbackButton img {
340
+ width: 3vw;
341
+ }
342
+
343
+ @media (min-width: 1280px) {
344
+ .feedbackButton img {
345
+ width: 2vw;
346
+ }
347
+ }
@@ -0,0 +1,395 @@
1
+ .waitingRoomContainer {
2
+ display: flex;
3
+ flex-direction: column;
4
+ align-items: center;
5
+ justify-content: flex-start;
6
+ width: 100%;
7
+ height: 100%;
8
+ }
9
+
10
+ .introBoard {
11
+ display: flex;
12
+ flex-direction: column;
13
+ align-items: center;
14
+ position: relative;
15
+ height: 100%;
16
+ width: 100%;
17
+ }
18
+
19
+ .title {
20
+ margin-top: 20px;
21
+ text-transform: uppercase;
22
+ font-family: var(--font-nunito-theme), 'Open Sans', system-ui, sans-serif;
23
+ font-size: 42px;
24
+ text-align: center;
25
+ font-weight: 800;
26
+ letter-spacing: 1.5px;
27
+ line-height: 1.25;
28
+ color: #E6635D;
29
+ margin-bottom: 50px;
30
+ text-shadow: 2px 3px 0px rgba(230, 99, 93, 0.15);
31
+ }
32
+
33
+ .instructionIconsWrap {
34
+ display: flex;
35
+ justify-content: space-between;
36
+ gap: 4px;
37
+ width: 100%;
38
+ padding: 0 100px;
39
+ margin-bottom: 2rem;
40
+ }
41
+
42
+ .instructionIconItem {
43
+ display: flex;
44
+ gap: 4px;
45
+ align-items: center;
46
+ }
47
+
48
+ .instructionIconImg {
49
+ width: 120px;
50
+ height: 120px;
51
+ }
52
+
53
+ .instructionIconText {
54
+ color: #541F0C;
55
+ font-size: 22px;
56
+ line-height: 26px;
57
+ font-weight: 400;
58
+ width: 210px;
59
+ }
60
+
61
+ .aiBanner {
62
+ margin: 0 116px 2.5rem;
63
+ padding: 20px 36px;
64
+ background: linear-gradient(135deg, #fff5f4 0%, #fceae9 100%);
65
+ border: 2px solid #e6635d;
66
+ border-radius: 16px;
67
+ display: flex;
68
+ align-items: center;
69
+ gap: 20px;
70
+ box-shadow: 0 4px 16px rgba(230, 99, 93, 0.12);
71
+ }
72
+
73
+ .aiBannerIcon {
74
+ flex-shrink: 0;
75
+ width: 60px;
76
+ height: 60px;
77
+ background: white;
78
+ border-radius: 50%;
79
+ display: flex;
80
+ align-items: center;
81
+ justify-content: center;
82
+ box-shadow: 0 2px 10px rgba(230, 99, 93, 0.2);
83
+ }
84
+
85
+ .aiBannerContent {
86
+ display: flex;
87
+ flex-direction: column;
88
+ gap: 4px;
89
+ }
90
+
91
+ .aiBannerTitle {
92
+ color: #E6635D;
93
+ font-size: 20px;
94
+ font-weight: 700;
95
+ text-transform: uppercase;
96
+ letter-spacing: 0.5px;
97
+ margin: 0;
98
+ line-height: 1.2;
99
+ }
100
+
101
+ .aiBannerDesc {
102
+ color: #541F0C;
103
+ font-size: 18px;
104
+ font-weight: 400;
105
+ line-height: 1.5;
106
+ margin: 0;
107
+ }
108
+
109
+ .stepButtonContainer {
110
+ display: flex;
111
+ justify-content: center;
112
+ margin-bottom: 30px;
113
+ }
114
+
115
+ .btnAction {
116
+ position: relative;
117
+ display: flex;
118
+ cursor: pointer;
119
+ }
120
+
121
+ .btnActionBg {
122
+ z-index: 0;
123
+ height: 57px;
124
+ width: 258px;
125
+ }
126
+
127
+ .btnActionInner {
128
+ position: absolute;
129
+ inset: 0;
130
+ cursor: pointer;
131
+ display: flex;
132
+ justify-content: center;
133
+ align-items: center;
134
+ padding-top: 12px;
135
+ }
136
+
137
+ .btnActionText {
138
+ color: white;
139
+ line-height: 1.25;
140
+ font-family: var(--font-nunito-theme), 'Open Sans', system-ui, sans-serif;
141
+ font-weight: 800;
142
+ letter-spacing: 0.5px;
143
+ text-align: center;
144
+ margin: 0;
145
+ width: 100%;
146
+ user-select: none;
147
+ }
148
+
149
+ .btnActionTextInner {
150
+ font-size: 22px;
151
+ text-transform: uppercase;
152
+ display: block;
153
+ text-shadow: rgba(0, 0, 0, 0.25) 0px 3px 0px;
154
+ }
155
+
156
+ .spacer {
157
+ height: 60px;
158
+ }
159
+
160
+ /* Mic Test */
161
+ .micTestTitle {
162
+ margin-top: 20px;
163
+ text-transform: uppercase;
164
+ font-family: var(--font-nunito-theme), 'Open Sans', system-ui, sans-serif;
165
+ font-size: 42px;
166
+ text-align: center;
167
+ font-weight: 800;
168
+ letter-spacing: 1.5px;
169
+ line-height: 1.25;
170
+ color: #E6635D;
171
+ margin-bottom: 50px;
172
+ text-shadow: 2px 3px 0px rgba(230, 99, 93, 0.15);
173
+ }
174
+
175
+ .micTestContainer {
176
+ background-color: #FCEAE9;
177
+ border-radius: 10px;
178
+ width: 1031px;
179
+ display: flex;
180
+ flex-direction: column;
181
+ justify-content: center;
182
+ align-items: center;
183
+ padding-top: 35px;
184
+ padding-bottom: 44px;
185
+ margin-bottom: 43px;
186
+ }
187
+
188
+ @media (max-width: 1536px) {
189
+ .micTestContainer {
190
+ width: 80%;
191
+ }
192
+ }
193
+
194
+ .micTestSubTitle {
195
+ color: #E6635D;
196
+ text-align: center;
197
+ font-size: 16px;
198
+ font-weight: 400;
199
+ line-height: 25px;
200
+ width: 550px;
201
+ }
202
+
203
+ .micTestInstructionWrap {
204
+ margin: 0 auto 30px auto;
205
+ width: fit-content;
206
+ max-width: 700px;
207
+ text-align: left;
208
+ color: #E6635D;
209
+ font-size: 16px;
210
+ line-height: 1.6;
211
+ }
212
+
213
+ .micTestInstructionWrap p {
214
+ font-weight: 700;
215
+ margin: 0 0 10px 0;
216
+ font-size: 17px;
217
+ text-transform: uppercase;
218
+ }
219
+
220
+ .micTestList {
221
+ list-style-type: decimal;
222
+ padding-left: 36px;
223
+ margin: 0;
224
+ }
225
+
226
+ .micTestList li {
227
+ margin-bottom: 12px;
228
+ padding-left: 4px;
229
+ }
230
+
231
+ .micTestBarWrap {
232
+ position: relative;
233
+ width: 693px;
234
+ height: 54px;
235
+ margin-top: 0px;
236
+ }
237
+
238
+ .audioBarImg {
239
+ z-index: 0;
240
+ filter: hue-rotate(140deg) brightness(0.9) saturate(1.5);
241
+ width: 100%;
242
+ }
243
+
244
+ .micTestBarInner {
245
+ position: absolute;
246
+ inset: 0;
247
+ }
248
+
249
+ .relativeFull {
250
+ position: relative;
251
+ width: 100%;
252
+ height: 100%;
253
+ }
254
+
255
+ .micTestIconWrap {
256
+ position: absolute;
257
+ top: -20px;
258
+ left: -10px;
259
+ width: 94px;
260
+ height: 94px;
261
+ cursor: pointer;
262
+ }
263
+
264
+ .purpleCircleImg {
265
+ z-index: 0;
266
+ filter: hue-rotate(90deg) brightness(1.1) saturate(1.2);
267
+ }
268
+
269
+ .micTestIconInner {
270
+ position: absolute;
271
+ inset: 0;
272
+ display: flex;
273
+ align-items: center;
274
+ justify-content: center;
275
+ }
276
+
277
+ .focusVectorImg {
278
+ position: absolute;
279
+ top: -40px;
280
+ filter: hue-rotate(120deg) saturate(2);
281
+ }
282
+
283
+ .microImg {
284
+ transition: transform 0.2s;
285
+ }
286
+
287
+ .microImg:hover {
288
+ transform: scale(1.1);
289
+ }
290
+
291
+ .micTestTrackWrap {
292
+ margin-left: 97px;
293
+ height: 100%;
294
+ display: flex;
295
+ align-items: center;
296
+ gap: 7px;
297
+ padding-top: 4px;
298
+ padding-right: 24px;
299
+ }
300
+
301
+ .micTestTime {
302
+ color: white;
303
+ font-size: 14px;
304
+ font-weight: 700;
305
+ transform: translateY(2px);
306
+ white-space: nowrap;
307
+ padding-right: 8px;
308
+ }
309
+
310
+ .micTestTrack {
311
+ border-radius: 2px;
312
+ height: 10px;
313
+ background-color: #541F0C;
314
+ overflow: hidden;
315
+ flex-grow: 1;
316
+ box-shadow: rgba(0, 0, 0, 0.5) 0px 0.587px 0px 0px;
317
+ }
318
+
319
+ .micTestFill {
320
+ height: 100%;
321
+ border-radius: 1px;
322
+ background-color: #FFDC30;
323
+ box-shadow: rgb(247, 171, 22) 0px -4px 0px 0px inset;
324
+ transition: width 0.05s linear;
325
+ }
326
+
327
+ /* ===== Teacher Floating (Phương án B) ===== */
328
+ .teacherFloating {
329
+ position: fixed;
330
+ bottom: 0;
331
+ left: clamp(0px, calc(50vw - 950px), 24px);
332
+ z-index: 90;
333
+ display: flex;
334
+ flex-direction: column;
335
+ align-items: center;
336
+ animation: teacherSlideIn 1s cubic-bezier(0.16, 1, 0.3, 1) both;
337
+ animation-delay: 0.3s;
338
+ }
339
+
340
+ .teacherVideo {
341
+ width: clamp(120px, calc(50vw - 750px), 280px);
342
+ height: auto;
343
+ display: block;
344
+ filter: drop-shadow(0 4px 24px rgba(230, 99, 93, 0.35));
345
+ pointer-events: none;
346
+ }
347
+
348
+ .teacherGlow {
349
+ position: absolute;
350
+ bottom: 8px;
351
+ left: 50%;
352
+ transform: translateX(-50%);
353
+ width: clamp(80px, calc(50vw - 780px), 200px);
354
+ height: clamp(20px, calc(10vw - 150px), 50px);
355
+ background: radial-gradient(ellipse, rgba(230, 99, 93, 0.3) 0%, transparent 70%);
356
+ border-radius: 50%;
357
+ animation: glowPulse 3s ease-in-out infinite;
358
+ pointer-events: none;
359
+ }
360
+
361
+ @keyframes teacherSlideIn {
362
+ 0% {
363
+ opacity: 0;
364
+ transform: translateY(50px);
365
+ }
366
+
367
+ 100% {
368
+ opacity: 1;
369
+ transform: translateY(0);
370
+ }
371
+ }
372
+
373
+ @keyframes glowPulse {
374
+
375
+ 0%,
376
+ 100% {
377
+ opacity: 0.3;
378
+ }
379
+
380
+ 50% {
381
+ opacity: 0.7;
382
+ }
383
+ }
384
+
385
+ @media (prefers-reduced-motion: reduce) {
386
+ .teacherFloating {
387
+ animation: none;
388
+ opacity: 1;
389
+ }
390
+
391
+ .teacherGlow {
392
+ animation: none;
393
+ opacity: 0.5;
394
+ }
395
+ }