@tinyweb_dev/oe-exam-sdk 0.1.27 → 0.1.29

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 (809) hide show
  1. package/README.md +79 -6
  2. package/dist/api/contest-rooms.js +54 -1
  3. package/dist/api/contest-rooms.types.js +1 -1
  4. package/dist/api/exam-create.js +179 -1
  5. package/dist/api/exam-create.types.js +1 -1
  6. package/dist/api/exam-entry.js +68 -1
  7. package/dist/api/exam-entry.types.js +1 -1
  8. package/dist/api/exam-questions.js +149 -1
  9. package/dist/api/exam-questions.types.js +1 -1
  10. package/dist/api/exam-taking.js +84 -1
  11. package/dist/api/exam-taking.types.d.ts +7 -0
  12. package/dist/api/exam-taking.types.js +1 -1
  13. package/dist/api/index.js +8 -1
  14. package/dist/api/result-review.js +62 -1
  15. package/dist/api/result-review.types.js +16 -1
  16. package/dist/components/CueCardEditor.js +58 -1
  17. package/dist/components/common/ResolvedImage.js +15 -1
  18. package/dist/components/exams/CompletionDialog.js +8 -1
  19. package/dist/components/exams/CreateExamInfoForm.js +84 -1
  20. package/dist/components/exams/CreateExamPageContainer.js +110 -1
  21. package/dist/components/exams/ExamCreator.js +287 -1
  22. package/dist/components/exams/ExamPartTabs.js +138 -1
  23. package/dist/components/exams/ExamPreviewDialog.d.ts +6 -7
  24. package/dist/components/exams/ExamPreviewDialog.js +121 -1
  25. package/dist/components/exams/ExamPreviewPartContent.d.ts +18 -0
  26. package/dist/components/exams/ExamPreviewPartContent.js +27 -0
  27. package/dist/components/exams/ExamPreviewSidebar.d.ts +17 -0
  28. package/dist/components/exams/ExamPreviewSidebar.js +37 -0
  29. package/dist/components/exams/ExamQuestionGrid.js +37 -1
  30. package/dist/components/exams/ExamQuestionsPageContainer.js +112 -1
  31. package/dist/components/exams/ExamViewDialog.js +61 -1
  32. package/dist/components/exams/PartAudioUploader.js +9 -1
  33. package/dist/components/exams/TemplateSelector.js +76 -1
  34. package/dist/components/exams/UnsavedChangesDialog.js +7 -1
  35. package/dist/components/exams/api.js +3 -1
  36. package/dist/components/exams/create-exam.texts.js +1 -1
  37. package/dist/components/exams/create-exam.validation.js +18 -1
  38. package/dist/components/exams/entry/EntryRestartDialog.js +11 -1
  39. package/dist/components/exams/entry/StudentExamEntryPageContainer.js +358 -1
  40. package/dist/components/exams/entry/exam-entry.states.js +26 -1
  41. package/dist/components/exams/entry/exam-entry.utils.js +55 -1
  42. package/dist/components/exams/entry/fullscreen-loading.js +18 -1
  43. package/dist/components/exams/entry/index.js +4 -1
  44. package/dist/components/exams/exam-preview.types.d.ts +30 -0
  45. package/dist/components/exams/exam-preview.types.js +62 -0
  46. package/dist/components/exams/exam-question-status.js +45 -1
  47. package/dist/components/exams/exam-template.utils.js +18 -1
  48. package/dist/components/exams/index.d.ts +1 -0
  49. package/dist/components/exams/index.js +19 -1
  50. package/dist/components/exams/rooms/StudentContestRoomsPageContainer.js +183 -1
  51. package/dist/components/exams/rooms/contest-rooms.utils.js +93 -1
  52. package/dist/components/exams/rooms/index.js +2 -1
  53. package/dist/components/exams/take/ExamTakingApiContext.js +25 -1
  54. package/dist/components/exams/take/ExamTakingPageContainer.js +955 -1
  55. package/dist/components/exams/take/GenericQuestionRenderer.js +14 -1
  56. package/dist/components/exams/take/components/QuestionRenderer.js +207 -1
  57. package/dist/components/exams/take/components/index.js +11 -1
  58. package/dist/components/exams/take/components/question-renderers/ArticlesViewer.js +8 -1
  59. package/dist/components/exams/take/components/question-renderers/MoversAnswerTheQuestionRenderer.js +30 -1
  60. package/dist/components/exams/take/components/question-renderers/MoversChooseAdjectiveRenderer.js +63 -1
  61. package/dist/components/exams/take/components/question-renderers/MoversChooseBestAnswerRenderer.js +136 -1
  62. package/dist/components/exams/take/components/question-renderers/MoversColoringRenderer.js +379 -1
  63. package/dist/components/exams/take/components/question-renderers/MoversCrossOutWordGroupRenderer.d.ts +20 -0
  64. package/dist/components/exams/take/components/question-renderers/MoversCrossOutWordGroupRenderer.js +141 -0
  65. package/dist/components/exams/take/components/question-renderers/MoversFillWordHintRenderer.js +131 -1
  66. package/dist/components/exams/take/components/question-renderers/MoversGridFillRenderer.js +76 -1
  67. package/dist/components/exams/take/components/question-renderers/MoversLabelThePictureRenderer.js +68 -1
  68. package/dist/components/exams/take/components/question-renderers/MoversListenAndWriteRenderer.js +42 -1
  69. package/dist/components/exams/take/components/question-renderers/MoversMatchByWritingAnswerRenderer.js +131 -1
  70. package/dist/components/exams/take/components/question-renderers/MoversPictureChooseRenderer.js +76 -1
  71. package/dist/components/exams/take/components/question-renderers/MoversPictureFillBlankChooseRenderer.js +68 -1
  72. package/dist/components/exams/take/components/question-renderers/MoversReadingPassageRenderer.js +62 -1
  73. package/dist/components/exams/take/components/question-renderers/MoversTrueFalseRenderer.d.ts +1 -1
  74. package/dist/components/exams/take/components/question-renderers/MoversTrueFalseRenderer.js +51 -1
  75. package/dist/components/exams/take/components/question-renderers/MoversWordFillParagraphRenderer.js +171 -1
  76. package/dist/components/exams/take/components/question-renderers/MoversWordFillStructuredFormRenderer.js +198 -1
  77. package/dist/components/exams/take/components/question-renderers/MoversWordOrderAndMatchGroupRenderer.d.ts +15 -0
  78. package/dist/components/exams/take/components/question-renderers/MoversWordOrderAndMatchGroupRenderer.js +36 -0
  79. package/dist/components/exams/take/components/question-renderers/MoversWordOrderingRenderer.js +92 -1
  80. package/dist/components/exams/take/components/question-renderers/MoversWriteSentencesRenderer.js +11 -1
  81. package/dist/components/exams/take/components/question-renderers/MoversWritingRenderer.js +56 -1
  82. package/dist/components/exams/take/components/question-renderers/index.d.ts +2 -0
  83. package/dist/components/exams/take/components/question-renderers/index.js +25 -1
  84. package/dist/components/exams/take/components/speaking/SpeakingAudioPlayer.js +85 -1
  85. package/dist/components/exams/take/components/speaking/SpeakingContentFrame.js +10 -1
  86. package/dist/components/exams/take/components/speaking/SpeakingExamLayout.js +15 -1
  87. package/dist/components/exams/take/components/speaking/SpeakingHeader.js +6 -1
  88. package/dist/components/exams/take/components/speaking/SpeakingInstructionBar.js +8 -1
  89. package/dist/components/exams/take/components/speaking/SpeakingMicButton.js +59 -1
  90. package/dist/components/exams/take/components/speaking/SpeakingNavButton.js +7 -1
  91. package/dist/components/exams/take/components/speaking/SpeakingPartBadge.js +5 -1
  92. package/dist/components/exams/take/components/speaking/SpeakingReadDisplayedContent.module.css +120 -0
  93. package/dist/components/exams/take/components/speaking/SpeakingRecordingPreview.js +73 -1
  94. package/dist/components/exams/take/components/speaking/SpeakingReportErrorButton.js +8 -1
  95. package/dist/components/exams/take/components/speaking/SpeakingSpontaneousQA.module.css +344 -0
  96. package/dist/components/exams/take/components/speaking/SpeakingVideoIntro.js +32 -1
  97. package/dist/components/exams/take/components/speaking/index.js +1 -1
  98. package/dist/components/exams/take/components/speaking/renderers/SpeakingChooseAnswerGroupRenderer.js +63 -1
  99. package/dist/components/exams/take/components/speaking/renderers/SpeakingChooseObjectsRenderer.js +95 -1
  100. package/dist/components/exams/take/components/speaking/renderers/SpeakingCompareImagesRenderer.js +35 -1
  101. package/dist/components/exams/take/components/speaking/renderers/SpeakingConversationRenderer.js +147 -1
  102. package/dist/components/exams/take/components/speaking/renderers/SpeakingCueCardRenderer.js +232 -1
  103. package/dist/components/exams/take/components/speaking/renderers/SpeakingDescribeImageRenderer.js +193 -1
  104. package/dist/components/exams/take/components/speaking/renderers/SpeakingDragObjectsRenderer.js +155 -1
  105. package/dist/components/exams/take/components/speaking/renderers/SpeakingGNInterviewRenderer.js +212 -1
  106. package/dist/components/exams/take/components/speaking/renderers/SpeakingInfoExchangeRenderer.js +77 -1
  107. package/dist/components/exams/take/components/speaking/renderers/SpeakingListenAndSpeakAnswerRenderer.js +64 -1
  108. package/dist/components/exams/take/components/speaking/renderers/SpeakingOddOneOutRenderer.js +69 -1
  109. package/dist/components/exams/take/components/speaking/renderers/SpeakingQuestionListRenderer.js +64 -1
  110. package/dist/components/exams/take/components/speaking/renderers/SpeakingQuestionRenderer.js +92 -1
  111. package/dist/components/exams/take/components/speaking/renderers/SpeakingReadDisplayedContentRenderer.js +202 -1
  112. package/dist/components/exams/take/components/speaking/renderers/SpeakingSpontaneousQARenderer.js +339 -1
  113. package/dist/components/exams/take/components/speaking/renderers/SpeakingSpontaneousQaGroupRenderer.d.ts +19 -0
  114. package/dist/components/exams/take/components/speaking/renderers/SpeakingSpontaneousQaGroupRenderer.js +76 -0
  115. package/dist/components/exams/take/components/speaking/renderers/SpeakingStoryImagesRenderer.js +56 -1
  116. package/dist/components/exams/take/components/speaking/renderers/SpontaneousQACambridgeLayout.d.ts +24 -0
  117. package/dist/components/exams/take/components/speaking/renderers/SpontaneousQACambridgeLayout.js +120 -0
  118. package/dist/components/exams/take/components/speaking/renderers/SpontaneousQAInlineAudioPlayer.d.ts +8 -0
  119. package/dist/components/exams/take/components/speaking/renderers/SpontaneousQAInlineAudioPlayer.js +94 -0
  120. package/dist/components/exams/take/components/speaking/renderers/SpontaneousQASummerSkyAudioPlayer.d.ts +8 -0
  121. package/dist/components/exams/take/components/speaking/renderers/SpontaneousQASummerSkyAudioPlayer.js +101 -0
  122. package/dist/components/exams/take/components/speaking/renderers/index.d.ts +1 -0
  123. package/dist/components/exams/take/components/speaking/renderers/index.js +14 -1
  124. package/dist/components/exams/take/exam-taking.utils.d.ts +13 -0
  125. package/dist/components/exams/take/exam-taking.utils.js +203 -1
  126. package/dist/components/exams/take/hooks/index.js +2 -1
  127. package/dist/components/exams/take/hooks/useAnswerAutosave.js +71 -1
  128. package/dist/components/exams/take/hooks/useAttemptSubmit.js +38 -1
  129. package/dist/components/exams/take/hooks/useAutoSave.js +83 -1
  130. package/dist/components/exams/take/hooks/useExamCountdown.js +35 -1
  131. package/dist/components/exams/take/hooks/useExamTimer.js +97 -1
  132. package/dist/components/exams/take/hooks/useProctoringCamera.js +118 -1
  133. package/dist/components/exams/take/hooks/useProctoringSnapshot.js +76 -1
  134. package/dist/components/exams/take/hooks/useSpeakingConversationAudio.js +178 -1
  135. package/dist/components/exams/take/hooks/useSpeakingNavigation.js +51 -1
  136. package/dist/components/exams/take/hooks/useSpeakingRecorder.js +406 -1
  137. package/dist/components/exams/take/hooks/useSpeakingRendererSetup.js +136 -1
  138. package/dist/components/exams/take/hooks/useSpontaneousQaGroupRecorder.d.ts +11 -0
  139. package/dist/components/exams/take/hooks/useSpontaneousQaGroupRecorder.js +352 -0
  140. package/dist/components/exams/take/hooks/useSpontaneousQaGroupRendererSetup.d.ts +42 -0
  141. package/dist/components/exams/take/hooks/useSpontaneousQaGroupRendererSetup.js +166 -0
  142. package/dist/components/exams/take/hooks/useToeicAudio.js +35 -1
  143. package/dist/components/exams/take/index.js +6 -1
  144. package/dist/components/exams/take/types/speaking-cue-card.types.js +1 -1
  145. package/dist/components/exams/take/types/speaking.types.js +7 -1
  146. package/dist/components/exams/take/types.js +4 -1
  147. package/dist/components/exams/take/utils/answer-transformers.js +452 -1
  148. package/dist/components/exams/take/utils/cambridge-yle-inline-speaking.d.ts +21 -0
  149. package/dist/components/exams/take/utils/cambridge-yle-inline-speaking.js +44 -0
  150. package/dist/components/exams/take/utils/coloring-assignments.js +40 -1
  151. package/dist/components/exams/take/utils/cross-out-word-group.transformer.d.ts +21 -0
  152. package/dist/components/exams/take/utils/cross-out-word-group.transformer.js +83 -0
  153. package/dist/components/exams/take/utils/question-transformers.d.ts +43 -2
  154. package/dist/components/exams/take/utils/question-transformers.js +1137 -1
  155. package/dist/components/features/exam-entry/entry-state-cards.js +19 -1
  156. package/dist/components/features/exam-entry/index.js +2 -1
  157. package/dist/components/features/exam-entry/themed/CambridgeYleWaitingRoom.js +121 -1
  158. package/dist/components/features/exam-entry/themed/ThemedWaitingRoom.js +37 -1
  159. package/dist/components/features/exam-entry/themed/ToeicWaitingRoom.js +15 -1
  160. package/dist/components/features/exam-entry/themed/cambridge-yle-waiting-parts.js +80 -1
  161. package/dist/components/features/exam-entry/themed/components/CloseButton.js +6 -1
  162. package/dist/components/features/exam-entry/themed/components/ExamInfoPanel.js +17 -1
  163. package/dist/components/features/exam-entry/themed/components/ModeSelector.js +6 -1
  164. package/dist/components/features/exam-entry/themed/components/StartButton.js +12 -1
  165. package/dist/components/features/exam-entry/themed/components/index.js +4 -1
  166. package/dist/components/features/exam-entry/themed/index.js +3 -1
  167. package/dist/components/index.d.ts +1 -0
  168. package/dist/components/index.js +43 -1
  169. package/dist/components/questions/_shared/config/question-types.config.js +362 -1
  170. package/dist/components/questions/_shared/constants/color-palette.js +21 -1
  171. package/dist/components/questions/_shared/hooks/useAnswerGroupQuestionGroup.js +105 -1
  172. package/dist/components/questions/_shared/hooks/useBasicQuestionGroup.js +222 -1
  173. package/dist/components/questions/_shared/hooks/useCompareImagesGroup.js +140 -1
  174. package/dist/components/questions/_shared/hooks/useImageQuestionGroup.js +123 -1
  175. package/dist/components/questions/_shared/hooks/useInfoExchangeGroup.js +50 -1
  176. package/dist/components/questions/_shared/hooks/useQuestionFormState.js +54 -1
  177. package/dist/components/questions/_shared/hooks/useQuestionInitialization.js +123 -1
  178. package/dist/components/questions/_shared/hooks/useQuestionListGroup.js +121 -1
  179. package/dist/components/questions/_shared/hooks/useQuestionOnChange.js +70 -1
  180. package/dist/components/questions/_shared/hooks/useSceneQuestionGroup.js +194 -1
  181. package/dist/components/questions/_shared/index.js +7 -1
  182. package/dist/components/questions/_shared/types/answer-the-question.type.js +1 -1
  183. package/dist/components/questions/_shared/types/arrange-letters-into-words.type.js +1 -1
  184. package/dist/components/questions/_shared/types/choose-correct-adjective.type.js +3 -1
  185. package/dist/components/questions/_shared/types/choose-the-correct-answer-group.type.d.ts +1 -0
  186. package/dist/components/questions/_shared/types/choose-the-correct-answer-group.type.js +1 -1
  187. package/dist/components/questions/_shared/types/color-region.config.js +1 -1
  188. package/dist/components/questions/_shared/types/cross-out-word-group.type.d.ts +2 -0
  189. package/dist/components/questions/_shared/types/cross-out-word-group.type.js +1 -1
  190. package/dist/components/questions/_shared/types/fill-in-blank.type.js +1 -1
  191. package/dist/components/questions/_shared/types/fill-missing-words-in-grid.type.js +1 -1
  192. package/dist/components/questions/_shared/types/gn-speaking-interview.type.js +1 -1
  193. package/dist/components/questions/_shared/types/index.d.ts +1 -0
  194. package/dist/components/questions/_shared/types/index.js +14 -1
  195. package/dist/components/questions/_shared/types/label-the-picture.type.js +1 -1
  196. package/dist/components/questions/_shared/types/listen-and-choose-from-answer-group.type.js +1 -1
  197. package/dist/components/questions/_shared/types/listen-and-choose-objects-in-scene.type.js +1 -1
  198. package/dist/components/questions/_shared/types/listen-and-drag-objects-into-scene.type.js +1 -1
  199. package/dist/components/questions/_shared/types/listen-and-speak-answer.type.js +1 -1
  200. package/dist/components/questions/_shared/types/listen-and-speak-compare-images.type.js +1 -1
  201. package/dist/components/questions/_shared/types/listen-and-speak-image-group.type.js +1 -1
  202. package/dist/components/questions/_shared/types/listen-and-speak-info-exchange.type.js +1 -1
  203. package/dist/components/questions/_shared/types/listen-and-speak-odd-one-out.type.js +3 -1
  204. package/dist/components/questions/_shared/types/listen-and-speak-question-list.type.js +1 -1
  205. package/dist/components/questions/_shared/types/listen-and-speak-with-story-images.type.js +3 -1
  206. package/dist/components/questions/_shared/types/listen-and-tick-answer.type.js +1 -1
  207. package/dist/components/questions/_shared/types/listening-drawline.type.js +1 -1
  208. package/dist/components/questions/_shared/types/look-and-choose-answer.type.js +1 -1
  209. package/dist/components/questions/_shared/types/look-picture-fill-word-hint.type.js +1 -1
  210. package/dist/components/questions/_shared/types/match-by-writing-answer.type.js +1 -1
  211. package/dist/components/questions/_shared/types/multiple-choice.type.d.ts +5 -0
  212. package/dist/components/questions/_shared/types/multiple-choice.type.js +1 -1
  213. package/dist/components/questions/_shared/types/question-group.type.js +11 -1
  214. package/dist/components/questions/_shared/types/read-and-color-objects.type.js +1 -1
  215. package/dist/components/questions/_shared/types/read-displayed-content.type.js +1 -1
  216. package/dist/components/questions/_shared/types/read-passage-and-answer-questions.type.js +1 -1
  217. package/dist/components/questions/_shared/types/speaking-describe-image.type.js +1 -1
  218. package/dist/components/questions/_shared/types/spontaneous-qa-group.type.d.ts +37 -0
  219. package/dist/components/questions/_shared/types/spontaneous-qa-group.type.js +1 -0
  220. package/dist/components/questions/_shared/types/spontaneous-qa.type.js +1 -1
  221. package/dist/components/questions/_shared/types/true-false-group.type.js +1 -1
  222. package/dist/components/questions/_shared/types/word-fill-paragraph-with-options.type.js +1 -1
  223. package/dist/components/questions/_shared/types/word-fill-paragraph.type.js +1 -1
  224. package/dist/components/questions/_shared/types/word-fill-structured-form.type.d.ts +20 -11
  225. package/dist/components/questions/_shared/types/word-fill-structured-form.type.js +1 -1
  226. package/dist/components/questions/_shared/types/word-order-and-match-group.type.d.ts +38 -0
  227. package/dist/components/questions/_shared/types/word-order-and-match-group.type.js +1 -0
  228. package/dist/components/questions/_shared/types/word-ordering.type.js +1 -1
  229. package/dist/components/questions/_shared/types/write-a-short-letter.type.js +1 -1
  230. package/dist/components/questions/_shared/types/write-correct-verb-form.type.js +3 -1
  231. package/dist/components/questions/_shared/types/write-sentences.type.js +1 -1
  232. package/dist/components/questions/_shared/types/write-short-paragraph.type.js +1 -1
  233. package/dist/components/questions/_shared/utils/answer-builder.js +79 -1
  234. package/dist/components/questions/_shared/utils/createColorRegionRegistration.js +39 -1
  235. package/dist/components/questions/_shared/utils/id-generator.js +3 -1
  236. package/dist/components/questions/_shared/utils/parseFillBlankStem.d.ts +30 -0
  237. package/dist/components/questions/_shared/utils/parseFillBlankStem.js +69 -0
  238. package/dist/components/questions/_shared/utils/question-validation.js +21 -1
  239. package/dist/components/questions/components/ColorNode.js +85 -1
  240. package/dist/components/questions/components/ColorRegionClient.js +545 -1
  241. package/dist/components/questions/components/ColorRegionCreator.js +420 -1
  242. package/dist/components/questions/components/ColorRegionNode.js +59 -1
  243. package/dist/components/questions/components/CreatorGuide.js +103 -1
  244. package/dist/components/questions/components/NameNode.js +26 -1
  245. package/dist/components/questions/components/QuestionBankOption.js +46 -1
  246. package/dist/components/questions/components/QuestionBasicInfoForm.js +9 -1
  247. package/dist/components/questions/components/QuestionCommonFields.js +33 -1
  248. package/dist/components/questions/components/QuestionSearchDropdown.js +258 -1
  249. package/dist/components/questions/components/QuestionTypeSelector.js +32 -1
  250. package/dist/components/questions/components/QuestionTypeSpecificForms.js +6 -1
  251. package/dist/components/questions/components/RegionNode.js +94 -1
  252. package/dist/components/questions/components/index.js +14 -1
  253. package/dist/components/questions/creator/QuestionCreator.js +90 -1
  254. package/dist/components/questions/creator/QuestionGroupCreator.js +119 -1
  255. package/dist/components/questions/creator/dedicated-component-router.js +79 -1
  256. package/dist/components/questions/creator/index.js +3 -1
  257. package/dist/components/questions/creator/question-type-registry.js +90 -1
  258. package/dist/components/questions/groups/ArticlesGroupCard.js +121 -1
  259. package/dist/components/questions/groups/BasicQuestionGroupCard.js +50 -1
  260. package/dist/components/questions/groups/DocumentGroupCard.js +114 -1
  261. package/dist/components/questions/groups/MatchAnswerGroupCard.js +25 -1
  262. package/dist/components/questions/index.d.ts +1 -0
  263. package/dist/components/questions/index.js +11 -1
  264. package/dist/components/questions/question-bank/EditQuestionBankDialog.d.ts +2 -0
  265. package/dist/components/questions/question-bank/EditQuestionBankDialog.js +114 -0
  266. package/dist/components/questions/question-bank/QuestionEditorRenderer.d.ts +23 -0
  267. package/dist/components/questions/question-bank/QuestionEditorRenderer.js +75 -0
  268. package/dist/components/questions/question-bank/difficulty.d.ts +15 -0
  269. package/dist/components/questions/question-bank/difficulty.js +33 -0
  270. package/dist/components/questions/question-bank/editor-adapters/choice-adapters.d.ts +5 -0
  271. package/dist/components/questions/question-bank/editor-adapters/choice-adapters.js +101 -0
  272. package/dist/components/questions/question-bank/editor-adapters/index.d.ts +5 -0
  273. package/dist/components/questions/question-bank/editor-adapters/index.js +4 -0
  274. package/dist/components/questions/question-bank/editor-adapters/media-adapters.d.ts +6 -0
  275. package/dist/components/questions/question-bank/editor-adapters/media-adapters.js +140 -0
  276. package/dist/components/questions/question-bank/editor-adapters/types.d.ts +1 -0
  277. package/dist/components/questions/question-bank/editor-adapters/types.js +1 -0
  278. package/dist/components/questions/question-bank/editor-adapters/unsupported-fallback.d.ts +8 -0
  279. package/dist/components/questions/question-bank/editor-adapters/unsupported-fallback.js +6 -0
  280. package/dist/components/questions/question-bank/editor-adapters/writing-adapters.d.ts +5 -0
  281. package/dist/components/questions/question-bank/editor-adapters/writing-adapters.js +114 -0
  282. package/dist/components/questions/question-bank/index.d.ts +4 -0
  283. package/dist/components/questions/question-bank/index.js +3 -0
  284. package/dist/components/questions/question-bank/types.d.ts +59 -0
  285. package/dist/components/questions/question-bank/types.js +1 -0
  286. package/dist/components/questions/types/answer-the-question/AnswerTheQuestionClient.js +37 -1
  287. package/dist/components/questions/types/answer-the-question/AnswerTheQuestionCreator.js +351 -1
  288. package/dist/components/questions/types/answer-the-question/register.js +67 -1
  289. package/dist/components/questions/types/answer-the-question/transform.js +36 -1
  290. package/dist/components/questions/types/arrange-letters-into-words/ArrangeLettersIntoWordsClient.js +141 -1
  291. package/dist/components/questions/types/arrange-letters-into-words/ArrangeLettersIntoWordsCreator.js +118 -1
  292. package/dist/components/questions/types/arrange-letters-into-words/index.js +2 -1
  293. package/dist/components/questions/types/arrange-letters-into-words/register.js +4 -1
  294. package/dist/components/questions/types/arrange-letters-into-words/transform.js +24 -1
  295. package/dist/components/questions/types/choose-correct-adjective/ChooseCorrectAdjectiveClient.js +74 -1
  296. package/dist/components/questions/types/choose-correct-adjective/ChooseCorrectAdjectiveCreator.js +169 -1
  297. package/dist/components/questions/types/choose-correct-adjective/index.js +2 -1
  298. package/dist/components/questions/types/choose-correct-adjective/register.js +55 -1
  299. package/dist/components/questions/types/choose-correct-adjective/transform.js +16 -1
  300. package/dist/components/questions/types/choose-the-correct-answer/ChooseTheCorrectAnswerClient.js +149 -1
  301. package/dist/components/questions/types/choose-the-correct-answer/ChooseTheCorrectAnswerCreator.js +568 -1
  302. package/dist/components/questions/types/choose-the-correct-answer/index.js +3 -1
  303. package/dist/components/questions/types/choose-the-correct-answer/normalize.d.ts +9 -0
  304. package/dist/components/questions/types/choose-the-correct-answer/normalize.js +88 -1
  305. package/dist/components/questions/types/choose-the-correct-answer/register.js +99 -1
  306. package/dist/components/questions/types/choose-the-correct-answer/transform.js +70 -1
  307. package/dist/components/questions/types/choose-the-correct-answer-group/ChooseTheCorrectAnswerGroupClient.js +22 -1
  308. package/dist/components/questions/types/choose-the-correct-answer-group/ChooseTheCorrectAnswerGroupCreator.js +163 -1
  309. package/dist/components/questions/types/choose-the-correct-answer-group/index.d.ts +1 -0
  310. package/dist/components/questions/types/choose-the-correct-answer-group/index.js +3 -1
  311. package/dist/components/questions/types/choose-the-correct-answer-group/map-choose-the-correct-answer-group-data.d.ts +4 -0
  312. package/dist/components/questions/types/choose-the-correct-answer-group/map-choose-the-correct-answer-group-data.js +94 -0
  313. package/dist/components/questions/types/choose-the-correct-answer-group/register.js +36 -1
  314. package/dist/components/questions/types/choose-the-correct-answer-group/transform.js +55 -1
  315. package/dist/components/questions/types/cross-out-word-group/CrossOutWordGroupClient.js +27 -1
  316. package/dist/components/questions/types/cross-out-word-group/CrossOutWordGroupCreator.js +231 -1
  317. package/dist/components/questions/types/cross-out-word-group/index.d.ts +1 -0
  318. package/dist/components/questions/types/cross-out-word-group/index.js +5 -1
  319. package/dist/components/questions/types/cross-out-word-group/map-cross-out-word-group-data.d.ts +6 -0
  320. package/dist/components/questions/types/cross-out-word-group/map-cross-out-word-group-data.js +110 -0
  321. package/dist/components/questions/types/cross-out-word-group/register.js +36 -1
  322. package/dist/components/questions/types/cross-out-word-group/transform.js +67 -1
  323. package/dist/components/questions/types/fill-in-blank/FillInBlankClient.js +275 -1
  324. package/dist/components/questions/types/fill-in-blank/FillInBlankCreator.js +464 -1
  325. package/dist/components/questions/types/fill-in-blank/index.js +2 -1
  326. package/dist/components/questions/types/fill-in-blank/register.js +148 -1
  327. package/dist/components/questions/types/fill-in-blank/transform.js +88 -1
  328. package/dist/components/questions/types/fill-missing-words-in-grid/FillMissingWordsInGridClient.js +117 -1
  329. package/dist/components/questions/types/fill-missing-words-in-grid/FillMissingWordsInGridCreator.js +671 -1
  330. package/dist/components/questions/types/fill-missing-words-in-grid/index.js +2 -1
  331. package/dist/components/questions/types/fill-missing-words-in-grid/register.js +37 -1
  332. package/dist/components/questions/types/fill-missing-words-in-grid/transform.js +15 -1
  333. package/dist/components/questions/types/gn-speaking-interview/GNSpeakingInterviewCreator.js +262 -1
  334. package/dist/components/questions/types/gn-speaking-interview/register.js +121 -1
  335. package/dist/components/questions/types/gn-speaking-interview/transform.js +48 -1
  336. package/dist/components/questions/types/image-object-matching/ImageObjectMatchingClient.js +16 -1
  337. package/dist/components/questions/types/image-object-matching/ImageObjectMatchingCreator.js +27 -1
  338. package/dist/components/questions/types/image-object-matching/index.js +2 -1
  339. package/dist/components/questions/types/image-object-matching/register.js +3 -1
  340. package/dist/components/questions/types/image-object-matching/transform.js +2 -1
  341. package/dist/components/questions/types/label-the-picture/LabelThePictureClient.js +102 -1
  342. package/dist/components/questions/types/label-the-picture/LabelThePictureCreator.js +344 -1
  343. package/dist/components/questions/types/label-the-picture/index.js +2 -1
  344. package/dist/components/questions/types/label-the-picture/register.js +54 -1
  345. package/dist/components/questions/types/label-the-picture/transform.js +28 -1
  346. package/dist/components/questions/types/listen-and-choose-from-answer-group/ListenAndChooseFromAnswerGroupClient.js +78 -1
  347. package/dist/components/questions/types/listen-and-choose-from-answer-group/ListenAndChooseFromAnswerGroupCreator.js +232 -1
  348. package/dist/components/questions/types/listen-and-choose-from-answer-group/index.js +2 -1
  349. package/dist/components/questions/types/listen-and-choose-from-answer-group/register.js +82 -1
  350. package/dist/components/questions/types/listen-and-choose-from-answer-group/transform.js +27 -1
  351. package/dist/components/questions/types/listen-and-choose-objects-in-scene/ListenAndChooseObjectsInSceneClient.js +70 -1
  352. package/dist/components/questions/types/listen-and-choose-objects-in-scene/ListenAndChooseObjectsInSceneCreator.js +386 -1
  353. package/dist/components/questions/types/listen-and-choose-objects-in-scene/index.js +2 -1
  354. package/dist/components/questions/types/listen-and-choose-objects-in-scene/register.js +100 -1
  355. package/dist/components/questions/types/listen-and-choose-objects-in-scene/transform.js +33 -1
  356. package/dist/components/questions/types/listen-and-drag-objects-into-scene/ListenAndDragObjectsIntoSceneClient.js +106 -1
  357. package/dist/components/questions/types/listen-and-drag-objects-into-scene/ListenAndDragObjectsIntoSceneCreator.js +457 -1
  358. package/dist/components/questions/types/listen-and-drag-objects-into-scene/index.js +2 -1
  359. package/dist/components/questions/types/listen-and-drag-objects-into-scene/register.js +110 -1
  360. package/dist/components/questions/types/listen-and-drag-objects-into-scene/transform.js +35 -1
  361. package/dist/components/questions/types/listen-and-speak-answer/ArrowIndicator.js +8 -1
  362. package/dist/components/questions/types/listen-and-speak-answer/ListenAndSpeakAnswerClient.js +22 -1
  363. package/dist/components/questions/types/listen-and-speak-answer/ListenAndSpeakAnswerCreator.js +291 -1
  364. package/dist/components/questions/types/listen-and-speak-answer/index.js +2 -1
  365. package/dist/components/questions/types/listen-and-speak-answer/register.js +84 -1
  366. package/dist/components/questions/types/listen-and-speak-answer/transform.js +27 -1
  367. package/dist/components/questions/types/listen-and-speak-compare-images/ListenAndSpeakCompareImagesClient.js +32 -1
  368. package/dist/components/questions/types/listen-and-speak-compare-images/ListenAndSpeakCompareImagesCreator.js +295 -1
  369. package/dist/components/questions/types/listen-and-speak-compare-images/register.js +79 -1
  370. package/dist/components/questions/types/listen-and-speak-compare-images/transform.js +27 -1
  371. package/dist/components/questions/types/listen-and-speak-image-group/ListenAndSpeakImageGroupClient.js +34 -1
  372. package/dist/components/questions/types/listen-and-speak-image-group/ListenAndSpeakImageGroupCreator.js +285 -1
  373. package/dist/components/questions/types/listen-and-speak-image-group/register.js +81 -1
  374. package/dist/components/questions/types/listen-and-speak-image-group/transform.js +26 -1
  375. package/dist/components/questions/types/listen-and-speak-info-exchange/ListenAndSpeakInfoExchangeClient.js +38 -1
  376. package/dist/components/questions/types/listen-and-speak-info-exchange/ListenAndSpeakInfoExchangeCreator.js +385 -1
  377. package/dist/components/questions/types/listen-and-speak-info-exchange/register.js +87 -1
  378. package/dist/components/questions/types/listen-and-speak-info-exchange/transform.js +32 -1
  379. package/dist/components/questions/types/listen-and-speak-odd-one-out/ListenAndSpeakOddOneOutClient.js +26 -1
  380. package/dist/components/questions/types/listen-and-speak-odd-one-out/ListenAndSpeakOddOneOutCreator.js +247 -1
  381. package/dist/components/questions/types/listen-and-speak-odd-one-out/register.js +59 -1
  382. package/dist/components/questions/types/listen-and-speak-odd-one-out/transform.js +18 -1
  383. package/dist/components/questions/types/listen-and-speak-question-list/ListenAndSpeakQuestionListClient.js +26 -1
  384. package/dist/components/questions/types/listen-and-speak-question-list/ListenAndSpeakQuestionListCreator.js +256 -1
  385. package/dist/components/questions/types/listen-and-speak-question-list/register.js +81 -1
  386. package/dist/components/questions/types/listen-and-speak-question-list/transform.js +26 -1
  387. package/dist/components/questions/types/listen-and-speak-with-story-images/ListenAndSpeakWithStoryImagesClient.js +26 -1
  388. package/dist/components/questions/types/listen-and-speak-with-story-images/ListenAndSpeakWithStoryImagesCreator.js +230 -1
  389. package/dist/components/questions/types/listen-and-speak-with-story-images/register.js +56 -1
  390. package/dist/components/questions/types/listen-and-speak-with-story-images/transform.js +16 -1
  391. package/dist/components/questions/types/look-picture-choose-correct-answer/LookPictureChooseCorrectAnswerClient.js +72 -1
  392. package/dist/components/questions/types/look-picture-choose-correct-answer/LookPictureChooseCorrectAnswerCreator.js +230 -1
  393. package/dist/components/questions/types/look-picture-choose-correct-answer/index.js +1 -1
  394. package/dist/components/questions/types/look-picture-choose-correct-answer/register.js +66 -1
  395. package/dist/components/questions/types/look-picture-choose-correct-answer/transform.js +42 -1
  396. package/dist/components/questions/types/look-picture-fill-blank-choose-answer/LookPictureFillBlankChooseAnswerClient.js +96 -1
  397. package/dist/components/questions/types/look-picture-fill-blank-choose-answer/LookPictureFillBlankChooseAnswerCreator.js +238 -1
  398. package/dist/components/questions/types/look-picture-fill-blank-choose-answer/index.js +2 -1
  399. package/dist/components/questions/types/look-picture-fill-blank-choose-answer/register.js +76 -1
  400. package/dist/components/questions/types/look-picture-fill-blank-choose-answer/transform.js +19 -1
  401. package/dist/components/questions/types/look-picture-fill-word-hint/LookPictureFillWordHintClient.js +134 -1
  402. package/dist/components/questions/types/look-picture-fill-word-hint/LookPictureFillWordHintCreator.js +617 -1
  403. package/dist/components/questions/types/look-picture-fill-word-hint/index.js +2 -1
  404. package/dist/components/questions/types/look-picture-fill-word-hint/register.js +82 -1
  405. package/dist/components/questions/types/look-picture-fill-word-hint/transform.js +29 -1
  406. package/dist/components/questions/types/match-by-writing-answer/MatchByWritingAnswerClient.js +38 -1
  407. package/dist/components/questions/types/match-by-writing-answer/MatchByWritingAnswerCreator.js +359 -1
  408. package/dist/components/questions/types/match-by-writing-answer/index.js +3 -1
  409. package/dist/components/questions/types/match-by-writing-answer/register.js +58 -1
  410. package/dist/components/questions/types/match-by-writing-answer/transform.js +61 -1
  411. package/dist/components/questions/types/read-and-color-objects/ReadAndColorObjectsClient.js +16 -1
  412. package/dist/components/questions/types/read-and-color-objects/ReadAndColorObjectsCreator.js +23 -1
  413. package/dist/components/questions/types/read-and-color-objects/index.js +2 -1
  414. package/dist/components/questions/types/read-and-color-objects/register.js +3 -1
  415. package/dist/components/questions/types/read-and-color-objects/transform.js +36 -1
  416. package/dist/components/questions/types/read-displayed-content/ReadDisplayedContentCreator.js +125 -1
  417. package/dist/components/questions/types/read-displayed-content/register.js +64 -1
  418. package/dist/components/questions/types/read-displayed-content/transform.js +12 -1
  419. package/dist/components/questions/types/read-passage-and-answer-questions/ReadPassageAndAnswerQuestionsClient.js +65 -1
  420. package/dist/components/questions/types/read-passage-and-answer-questions/ReadPassageAndAnswerQuestionsCreator.js +511 -1
  421. package/dist/components/questions/types/read-passage-and-answer-questions/index.js +2 -1
  422. package/dist/components/questions/types/read-passage-and-answer-questions/register.js +58 -1
  423. package/dist/components/questions/types/read-passage-and-answer-questions/transform.js +28 -1
  424. package/dist/components/questions/types/speaking-conversation/SpeakingConversationCreator.js +373 -1
  425. package/dist/components/questions/types/speaking-conversation/SpeakingConversationPreviewClient.js +41 -1
  426. package/dist/components/questions/types/speaking-conversation/register.js +110 -1
  427. package/dist/components/questions/types/speaking-conversation/transform.js +34 -1
  428. package/dist/components/questions/types/speaking-cue-card/SpeakingCueCardCreator.js +74 -1
  429. package/dist/components/questions/types/speaking-cue-card/register.js +52 -1
  430. package/dist/components/questions/types/speaking-cue-card/transform.js +12 -1
  431. package/dist/components/questions/types/speaking-describe-image/SpeakingDescribeImageClient.js +10 -1
  432. package/dist/components/questions/types/speaking-describe-image/SpeakingDescribeImageCreator.js +161 -1
  433. package/dist/components/questions/types/speaking-describe-image/index.js +2 -1
  434. package/dist/components/questions/types/speaking-describe-image/register.js +69 -1
  435. package/dist/components/questions/types/speaking-describe-image/transform.js +16 -1
  436. package/dist/components/questions/types/spontaneous-qa/SpontaneousQACreator.js +234 -1
  437. package/dist/components/questions/types/spontaneous-qa/register.js +93 -1
  438. package/dist/components/questions/types/spontaneous-qa/transform.js +34 -1
  439. package/dist/components/questions/types/spontaneous-qa-group/SpontaneousQaGroupClient.d.ts +2 -0
  440. package/dist/components/questions/types/spontaneous-qa-group/SpontaneousQaGroupClient.js +9 -0
  441. package/dist/components/questions/types/spontaneous-qa-group/SpontaneousQaGroupCreator.d.ts +2 -0
  442. package/dist/components/questions/types/spontaneous-qa-group/SpontaneousQaGroupCreator.js +179 -0
  443. package/dist/components/questions/types/spontaneous-qa-group/creator-helpers.d.ts +5 -0
  444. package/dist/components/questions/types/spontaneous-qa-group/creator-helpers.js +43 -0
  445. package/dist/components/questions/types/spontaneous-qa-group/flatten.d.ts +14 -0
  446. package/dist/components/questions/types/spontaneous-qa-group/flatten.js +69 -0
  447. package/dist/components/questions/types/spontaneous-qa-group/index.d.ts +2 -0
  448. package/dist/components/questions/types/spontaneous-qa-group/index.js +2 -0
  449. package/dist/components/questions/types/spontaneous-qa-group/register.d.ts +2 -0
  450. package/dist/components/questions/types/spontaneous-qa-group/register.js +139 -0
  451. package/dist/components/questions/types/spontaneous-qa-group/transform.d.ts +2 -0
  452. package/dist/components/questions/types/spontaneous-qa-group/transform.js +52 -0
  453. package/dist/components/questions/types/true-false/TrueFalseClient.js +75 -1
  454. package/dist/components/questions/types/true-false/TrueFalseCreator.js +244 -1
  455. package/dist/components/questions/types/true-false/index.js +2 -1
  456. package/dist/components/questions/types/true-false/register.js +77 -1
  457. package/dist/components/questions/types/true-false/transform.js +32 -1
  458. package/dist/components/questions/types/true-false-group/TrueFalseGroupClient.js +25 -1
  459. package/dist/components/questions/types/true-false-group/TrueFalseGroupCreator.js +129 -1
  460. package/dist/components/questions/types/true-false-group/index.d.ts +1 -0
  461. package/dist/components/questions/types/true-false-group/index.js +5 -1
  462. package/dist/components/questions/types/true-false-group/map-true-false-group-data.d.ts +4 -0
  463. package/dist/components/questions/types/true-false-group/map-true-false-group-data.js +69 -0
  464. package/dist/components/questions/types/true-false-group/register.js +36 -1
  465. package/dist/components/questions/types/true-false-group/transform.js +43 -1
  466. package/dist/components/questions/types/word-fill-paragraph/WordFillParagraphClient.js +233 -1
  467. package/dist/components/questions/types/word-fill-paragraph/WordFillParagraphCreator.js +631 -1
  468. package/dist/components/questions/types/word-fill-paragraph/WordFillParagraphWrapper.js +28 -1
  469. package/dist/components/questions/types/word-fill-paragraph/index.js +2 -1
  470. package/dist/components/questions/types/word-fill-paragraph/register.js +136 -1
  471. package/dist/components/questions/types/word-fill-paragraph/transform.js +56 -1
  472. package/dist/components/questions/types/word-fill-structured-form/WfsfWordBankEditor.js +86 -1
  473. package/dist/components/questions/types/word-fill-structured-form/WordFillStructuredFormClient.js +246 -1
  474. package/dist/components/questions/types/word-fill-structured-form/WordFillStructuredFormCreator.d.ts +2 -0
  475. package/dist/components/questions/types/word-fill-structured-form/WordFillStructuredFormCreator.js +484 -1
  476. package/dist/components/questions/types/word-fill-structured-form/index.d.ts +1 -0
  477. package/dist/components/questions/types/word-fill-structured-form/index.js +3 -1
  478. package/dist/components/questions/types/word-fill-structured-form/map-wfsf-question-data.d.ts +7 -0
  479. package/dist/components/questions/types/word-fill-structured-form/map-wfsf-question-data.js +113 -0
  480. package/dist/components/questions/types/word-fill-structured-form/register.js +36 -1
  481. package/dist/components/questions/types/word-fill-structured-form/transform.js +77 -1
  482. package/dist/components/questions/types/word-fill-structured-form/wfsf-word-bank.utils.js +110 -1
  483. package/dist/components/questions/types/word-order-and-match-group/WordOrderAndMatchGroupClient.d.ts +3 -0
  484. package/dist/components/questions/types/word-order-and-match-group/WordOrderAndMatchGroupClient.js +190 -0
  485. package/dist/components/questions/types/word-order-and-match-group/WordOrderAndMatchGroupCreator.d.ts +3 -0
  486. package/dist/components/questions/types/word-order-and-match-group/WordOrderAndMatchGroupCreator.js +182 -0
  487. package/dist/components/questions/types/word-order-and-match-group/index.d.ts +4 -0
  488. package/dist/components/questions/types/word-order-and-match-group/index.js +4 -0
  489. package/dist/components/questions/types/word-order-and-match-group/register.d.ts +2 -0
  490. package/dist/components/questions/types/word-order-and-match-group/register.js +121 -0
  491. package/dist/components/questions/types/word-order-and-match-group/transform.d.ts +2 -0
  492. package/dist/components/questions/types/word-order-and-match-group/transform.js +70 -0
  493. package/dist/components/questions/types/word-ordering/WordOrderingClient.js +84 -1
  494. package/dist/components/questions/types/word-ordering/WordOrderingCreator.js +192 -1
  495. package/dist/components/questions/types/word-ordering/index.js +2 -1
  496. package/dist/components/questions/types/word-ordering/register.js +46 -1
  497. package/dist/components/questions/types/word-ordering/transform.js +24 -1
  498. package/dist/components/questions/types/write-a-short-letter/WriteAShortLetterClient.js +99 -1
  499. package/dist/components/questions/types/write-a-short-letter/WriteAShortLetterCreator.js +320 -1
  500. package/dist/components/questions/types/write-a-short-letter/index.js +2 -1
  501. package/dist/components/questions/types/write-a-short-letter/register.js +68 -1
  502. package/dist/components/questions/types/write-a-short-letter/transform.js +25 -1
  503. package/dist/components/questions/types/write-correct-verb-form/WriteCorrectVerbFormClient.js +61 -1
  504. package/dist/components/questions/types/write-correct-verb-form/WriteCorrectVerbFormCreator.js +196 -1
  505. package/dist/components/questions/types/write-correct-verb-form/index.js +2 -1
  506. package/dist/components/questions/types/write-correct-verb-form/register.js +62 -1
  507. package/dist/components/questions/types/write-correct-verb-form/transform.js +17 -1
  508. package/dist/components/questions/types/write-sentences/WriteSentencesClient.js +22 -1
  509. package/dist/components/questions/types/write-sentences/WriteSentencesCreator.js +174 -1
  510. package/dist/components/questions/types/write-sentences/index.js +2 -1
  511. package/dist/components/questions/types/write-sentences/register.js +58 -1
  512. package/dist/components/questions/types/write-sentences/transform.js +28 -1
  513. package/dist/components/questions/types/write-short-paragraph/WriteShortParagraphClient.js +96 -1
  514. package/dist/components/questions/types/write-short-paragraph/WriteShortParagraphCreator.js +161 -1
  515. package/dist/components/questions/types/write-short-paragraph/index.js +2 -1
  516. package/dist/components/questions/types/write-short-paragraph/register.js +4 -1
  517. package/dist/components/questions/types/write-short-paragraph/transform.js +21 -1
  518. package/dist/components/questions/viewer/ChooseTheCorrectAnswerGroupViewer.d.ts +8 -0
  519. package/dist/components/questions/viewer/ChooseTheCorrectAnswerGroupViewer.js +11 -0
  520. package/dist/components/questions/viewer/CrossOutWordGroupViewer.d.ts +7 -0
  521. package/dist/components/questions/viewer/CrossOutWordGroupViewer.js +8 -0
  522. package/dist/components/questions/viewer/QuestionGroupViewer.js +36 -1
  523. package/dist/components/questions/viewer/QuestionViewer.js +692 -1
  524. package/dist/components/questions/viewer/SpontaneousQaGroupViewer.d.ts +5 -0
  525. package/dist/components/questions/viewer/SpontaneousQaGroupViewer.js +82 -0
  526. package/dist/components/questions/viewer/TrueFalseGroupViewer.d.ts +8 -0
  527. package/dist/components/questions/viewer/TrueFalseGroupViewer.js +11 -0
  528. package/dist/components/questions/viewer/WordFillStructuredFormViewer.d.ts +9 -0
  529. package/dist/components/questions/viewer/WordFillStructuredFormViewer.js +14 -0
  530. package/dist/components/questions/viewer/WordOrderAndMatchGroupViewer.d.ts +6 -0
  531. package/dist/components/questions/viewer/WordOrderAndMatchGroupViewer.js +95 -0
  532. package/dist/components/questions/viewer/index.d.ts +6 -0
  533. package/dist/components/questions/viewer/index.js +8 -1
  534. package/dist/components/results/ResultReviewPageContainer.js +220 -1
  535. package/dist/components/results/ReviewQuestionRenderer.js +55 -1
  536. package/dist/components/results/hooks/useResultReviewPolling.js +76 -1
  537. package/dist/components/results/index.js +22 -1
  538. package/dist/components/results/renderers/QuestionExplanations.js +19 -1
  539. package/dist/components/results/renderers/ReviewChooseAdjectiveRenderer.js +94 -1
  540. package/dist/components/results/renderers/ReviewChooseBestAnswerRenderer.js +75 -1
  541. package/dist/components/results/renderers/ReviewColoringRenderer.js +110 -1
  542. package/dist/components/results/renderers/ReviewListenAndWriteRenderer.js +48 -1
  543. package/dist/components/results/renderers/ReviewListenChooseAnswerGroupRenderer.js +87 -1
  544. package/dist/components/results/renderers/ReviewListenChooseObjectsRenderer.js +104 -1
  545. package/dist/components/results/renderers/ReviewListenDragObjectsRenderer.js +123 -1
  546. package/dist/components/results/renderers/ReviewListeningHeader.js +104 -1
  547. package/dist/components/results/renderers/ReviewSpeakingAIPanel.js +116 -1
  548. package/dist/components/results/renderers/ReviewSpeakingMedia.js +48 -1
  549. package/dist/components/results/renderers/ReviewSpeakingQuestionItem.js +42 -1
  550. package/dist/components/results/renderers/ReviewSpeakingRenderer.js +12 -1
  551. package/dist/components/results/renderers/ReviewSpeakingRenderer.types.js +85 -1
  552. package/dist/components/results/renderers/review-question-body-dedicated.js +104 -1
  553. package/dist/components/results/renderers/review-question-body-movers.js +148 -1
  554. package/dist/components/results/renderers/review-speaking-map.js +226 -1
  555. package/dist/components/results/renderers/review-spontaneous-qa-group.d.ts +4 -0
  556. package/dist/components/results/renderers/review-spontaneous-qa-group.js +74 -0
  557. package/dist/components/results/report/BadgeTitle.js +5 -1
  558. package/dist/components/results/report/ExamSkillRow.js +20 -1
  559. package/dist/components/results/report/OceanEduExamReport.js +58 -1
  560. package/dist/components/results/report/OceanEduSpeakingReport.js +62 -1
  561. package/dist/components/results/report/OverallAssessmentSection.js +17 -1
  562. package/dist/components/results/report/ResultErrorState.js +18 -1
  563. package/dist/components/results/report/ResultLoadingState.js +10 -1
  564. package/dist/components/results/report/ResultNotPublicState.js +27 -1
  565. package/dist/components/results/report/SpeakingReportParts.js +14 -1
  566. package/dist/components/results/report/SpeakingReportShared.js +86 -1
  567. package/dist/components/results/report/SpeakingRubricSection.js +171 -1
  568. package/dist/components/results/report/speaking-report.utils.js +198 -1
  569. package/dist/components/results/result-review.utils.js +6 -1
  570. package/dist/components/results/review-data.js +222 -1
  571. package/dist/components/results/review-renderer.utils.js +97 -1
  572. package/dist/components/results/review-status.utils.js +36 -1
  573. package/dist/components/results/review-types.js +1 -1
  574. package/dist/components/results/speaking/SpeakingResultAudioPlayer.js +77 -1
  575. package/dist/components/results/speaking/SpeakingReviewResult.js +48 -1
  576. package/dist/components/results/utils/review-score.utils.js +72 -1
  577. package/dist/components/results/utils/speaking-summary.js +224 -1
  578. package/dist/components/results/utils/transform-speaking-review.js +183 -1
  579. package/dist/components/shared/RichTextEditor.d.ts +9 -0
  580. package/dist/components/shared/RichTextEditor.js +47 -0
  581. package/dist/components/shared/audio/SpeakingAudioPlayer.js +100 -1
  582. package/dist/components/themes/cambridge-yle/CambridgeYleAudioPlayer.js +140 -1
  583. package/dist/components/themes/cambridge-yle/CambridgeYleBottomNav.js +10 -1
  584. package/dist/components/themes/cambridge-yle/CambridgeYleExamLayout.d.ts +1 -1
  585. package/dist/components/themes/cambridge-yle/CambridgeYleExamLayout.js +18 -1
  586. package/dist/components/themes/cambridge-yle/CambridgeYleExampleText.js +11 -1
  587. package/dist/components/themes/cambridge-yle/CambridgeYleHeader.js +11 -1
  588. package/dist/components/themes/cambridge-yle/CambridgeYleInstructionBanner.d.ts +2 -1
  589. package/dist/components/themes/cambridge-yle/CambridgeYleInstructionBanner.js +19 -1
  590. package/dist/components/themes/cambridge-yle/CambridgeYleNavButton.js +13 -1
  591. package/dist/components/themes/cambridge-yle/CambridgeYlePartBanner.d.ts +1 -1
  592. package/dist/components/themes/cambridge-yle/CambridgeYlePartBanner.js +3 -1
  593. package/dist/components/themes/cambridge-yle/CambridgeYleProgressBar.js +6 -1
  594. package/dist/components/themes/cambridge-yle/CambridgeYleQuestionCard.js +5 -1
  595. package/dist/components/themes/cambridge-yle/CambridgeYleQuestionCardFullWidth.js +9 -1
  596. package/dist/components/themes/cambridge-yle/CambridgeYleSidebar.d.ts +2 -1
  597. package/dist/components/themes/cambridge-yle/CambridgeYleSidebar.js +61 -1
  598. package/dist/components/themes/cambridge-yle/CambridgeYleTimer.d.ts +1 -1
  599. package/dist/components/themes/cambridge-yle/CambridgeYleTimer.js +25 -1
  600. package/dist/components/themes/cambridge-yle/index.js +13 -1
  601. package/dist/components/themes/english-certification/EcAnswerTheQuestion.js +25 -1
  602. package/dist/components/themes/english-certification/EcMatchByWritingAnswer.js +89 -1
  603. package/dist/components/themes/english-certification/EcWordFillParagraph.js +56 -1
  604. package/dist/components/themes/english-certification/EcWordFillStructuredForm.js +192 -1
  605. package/dist/components/themes/english-certification/EcWritingTask.js +60 -1
  606. package/dist/components/themes/english-certification/EnglishCertificationAudioPlayer.js +108 -1
  607. package/dist/components/themes/english-certification/EnglishCertificationBrand.js +11 -1
  608. package/dist/components/themes/english-certification/EnglishCertificationExamLayout.js +34 -1
  609. package/dist/components/themes/english-certification/EnglishCertificationFlagButton.js +15 -1
  610. package/dist/components/themes/english-certification/EnglishCertificationFooterBar.js +19 -1
  611. package/dist/components/themes/english-certification/EnglishCertificationGroupedQuestion.js +166 -1
  612. package/dist/components/themes/english-certification/EnglishCertificationHeader.js +31 -1
  613. package/dist/components/themes/english-certification/EnglishCertificationInstructionBanner.js +79 -1
  614. package/dist/components/themes/english-certification/EnglishCertificationNavigationPanel.js +71 -1
  615. package/dist/components/themes/english-certification/EnglishCertificationOptionSelector.js +79 -1
  616. package/dist/components/themes/english-certification/EnglishCertificationPartHeader.js +47 -1
  617. package/dist/components/themes/english-certification/EnglishCertificationPassagePanel.js +77 -1
  618. package/dist/components/themes/english-certification/EnglishCertificationQuestionCard.js +25 -1
  619. package/dist/components/themes/english-certification/EnglishCertificationQuestionItem.js +36 -1
  620. package/dist/components/themes/english-certification/EnglishCertificationQuestionRenderer.js +81 -1
  621. package/dist/components/themes/english-certification/EnglishCertificationReadingSection.js +95 -1
  622. package/dist/components/themes/english-certification/EnglishCertificationSingleQuestion.js +18 -1
  623. package/dist/components/themes/english-certification/EnglishCertificationSingleQuestionList.js +32 -1
  624. package/dist/components/themes/english-certification/english-cert-scroll.js +163 -1
  625. package/dist/components/themes/english-certification/english-certification-theme.js +58 -1
  626. package/dist/components/themes/english-certification/grouped-question-utils.js +243 -1
  627. package/dist/components/themes/english-certification/index.js +24 -1
  628. package/dist/components/themes/index.js +25 -1
  629. package/dist/components/themes/summer-sky/SummerSkyAudioPlayer.js +170 -1
  630. package/dist/components/themes/summer-sky/SummerSkyExitModal.js +21 -1
  631. package/dist/components/themes/summer-sky/SummerSkyLayout.js +221 -1
  632. package/dist/components/themes/summer-sky/SummerSkySubmitModal.js +18 -1
  633. package/dist/components/themes/summer-sky/SummerSkyWaitingRoom.js +193 -1
  634. package/dist/components/themes/types.js +1 -1
  635. package/dist/components/ui/alert-dialog.js +26 -1
  636. package/dist/components/ui/alert.js +22 -1
  637. package/dist/components/ui/avatar.js +12 -1
  638. package/dist/components/ui/badge.js +38 -1
  639. package/dist/components/ui/button.js +35 -1
  640. package/dist/components/ui/calendar.js +76 -1
  641. package/dist/components/ui/card.js +16 -1
  642. package/dist/components/ui/carousel.js +91 -1
  643. package/dist/components/ui/checkbox.js +9 -1
  644. package/dist/components/ui/collapsible.js +13 -1
  645. package/dist/components/ui/command.js +34 -1
  646. package/dist/components/ui/confirm-dialog.js +49 -1
  647. package/dist/components/ui/dialog.js +23 -1
  648. package/dist/components/ui/drawer.js +35 -1
  649. package/dist/components/ui/dropdown-menu.js +33 -1
  650. package/dist/components/ui/file-upload.js +155 -1
  651. package/dist/components/ui/form.js +62 -1
  652. package/dist/components/ui/hover-card.js +10 -1
  653. package/dist/components/ui/image-preview.js +29 -1
  654. package/dist/components/ui/input.js +8 -1
  655. package/dist/components/ui/label.js +9 -1
  656. package/dist/components/ui/language-switcher.js +15 -1
  657. package/dist/components/ui/multi-select.js +90 -1
  658. package/dist/components/ui/points-input.js +33 -1
  659. package/dist/components/ui/popover.js +26 -1
  660. package/dist/components/ui/progress.js +16 -1
  661. package/dist/components/ui/radio-group.js +12 -1
  662. package/dist/components/ui/scroll-area.js +11 -1
  663. package/dist/components/ui/select.js +38 -1
  664. package/dist/components/ui/separator.js +8 -1
  665. package/dist/components/ui/sheet.js +40 -1
  666. package/dist/components/ui/single-select.js +76 -1
  667. package/dist/components/ui/skeleton.js +6 -1
  668. package/dist/components/ui/switch.js +8 -1
  669. package/dist/components/ui/table.js +20 -1
  670. package/dist/components/ui/tabs.js +17 -1
  671. package/dist/components/ui/textarea.js +8 -1
  672. package/dist/components/ui/tooltip.js +11 -1
  673. package/dist/index.d.ts +3 -1
  674. package/dist/index.js +24 -1
  675. package/dist/shared/constants/ApiConstant.d.ts +1 -0
  676. package/dist/shared/constants/ApiConstant.js +278 -1
  677. package/dist/shared/constants/QueryKeyConstant.js +112 -1
  678. package/dist/shared/constants/exam-level.enum.js +41 -1
  679. package/dist/shared/constants/landings/placement-test.constants.js +431 -1
  680. package/dist/shared/constants/question-skills.js +277 -1
  681. package/dist/shared/constants/routes.js +81 -1
  682. package/dist/shared/index.js +10 -1
  683. package/dist/shared/lib/hooks/index.js +10 -1
  684. package/dist/shared/lib/hooks/useAlertDialog.js +57 -1
  685. package/dist/shared/lib/hooks/useAudioPlayCounter.js +30 -1
  686. package/dist/shared/lib/hooks/useAudioPreview.js +81 -1
  687. package/dist/shared/lib/hooks/useAudioUpload.js +24 -1
  688. package/dist/shared/lib/hooks/useConfirmDialog.js +89 -1
  689. package/dist/shared/lib/hooks/useDebouncedCallback.js +32 -1
  690. package/dist/shared/lib/hooks/useDelayedAutoPlay.js +12 -1
  691. package/dist/shared/lib/hooks/useFileUpload.js +24 -1
  692. package/dist/shared/lib/hooks/useImageUrl.js +5 -1
  693. package/dist/shared/lib/hooks/usePresignedFileUrl.js +108 -1
  694. package/dist/shared/lib/hooks/useReactHookForm.js +31 -1
  695. package/dist/shared/lib/hooks/useToast.js +62 -1
  696. package/dist/shared/lib/html-content.js +22 -1
  697. package/dist/shared/lib/i18n/index.js +54 -1
  698. package/dist/shared/lib/i18n/messages/en/admin.d.ts +11 -4
  699. package/dist/shared/lib/i18n/messages/en/admin.js +2111 -1
  700. package/dist/shared/lib/i18n/messages/en/auth.js +86 -1
  701. package/dist/shared/lib/i18n/messages/en/common.js +140 -1
  702. package/dist/shared/lib/i18n/messages/en/file-upload.js +18 -1
  703. package/dist/shared/lib/i18n/messages/en/student.js +133 -1
  704. package/dist/shared/lib/i18n/messages/en/terms.js +37 -1
  705. package/dist/shared/lib/i18n/messages/en.d.ts +11 -4
  706. package/dist/shared/lib/i18n/messages/en.js +15 -1
  707. package/dist/shared/lib/i18n/messages/vi/admin.d.ts +11 -4
  708. package/dist/shared/lib/i18n/messages/vi/admin.js +2111 -1
  709. package/dist/shared/lib/i18n/messages/vi/auth.js +86 -1
  710. package/dist/shared/lib/i18n/messages/vi/common.js +140 -1
  711. package/dist/shared/lib/i18n/messages/vi/file-upload.js +18 -1
  712. package/dist/shared/lib/i18n/messages/vi/student.js +133 -1
  713. package/dist/shared/lib/i18n/messages/vi/terms.js +37 -1
  714. package/dist/shared/lib/i18n/messages/vi.d.ts +11 -4
  715. package/dist/shared/lib/i18n/messages/vi.js +15 -1
  716. package/dist/shared/lib/i18n/types.js +1 -1
  717. package/dist/shared/lib/stores/examQuestionStore.js +212 -1
  718. package/dist/shared/lib/stores/examTakingStore.js +240 -1
  719. package/dist/shared/lib/stores/gradingTransientStore.js +39 -1
  720. package/dist/shared/lib/stores/localeStore.js +10 -1
  721. package/dist/shared/lib/themes/config/starters.config.js +71 -1
  722. package/dist/shared/lib/themes/index.js +49 -1
  723. package/dist/shared/lib/themes/types.js +2 -1
  724. package/dist/shared/lib/toast.js +43 -1
  725. package/dist/shared/lib/utils/public-page.js +44 -1
  726. package/dist/shared/lib/utils/question-reverse-transform.js +438 -1
  727. package/dist/shared/lib/utils/question-transform-types.js +1 -1
  728. package/dist/shared/lib/utils/question-transform-validation.js +194 -1
  729. package/dist/shared/lib/utils/question-transform.js +199 -1
  730. package/dist/shared/lib/utils.js +168 -1
  731. package/dist/shared/lib/validation/choose-correct-answer.validation.js +111 -1
  732. package/dist/shared/lib/validation/label-the-picture.validation.js +19 -1
  733. package/dist/shared/lib/validation/listen-and-choose-from-answer-group.validation.js +46 -1
  734. package/dist/shared/lib/validation/listen-and-choose-objects-in-scene.validation.js +21 -1
  735. package/dist/shared/lib/validation/listen-and-drag-objects-into-scene.validation.js +34 -1
  736. package/dist/shared/lib/validation/listen-and-speak-answer.validation.js +40 -1
  737. package/dist/shared/lib/validation/listen-and-speak-compare-images.validation.js +45 -1
  738. package/dist/shared/lib/validation/listen-and-speak-image-group.validation.js +19 -1
  739. package/dist/shared/lib/validation/listen-and-speak-info-exchange.validation.js +39 -1
  740. package/dist/shared/lib/validation/listen-and-speak-odd-one-out.validation.js +32 -1
  741. package/dist/shared/lib/validation/listen-and-speak-question-list.validation.js +19 -1
  742. package/dist/shared/lib/validation/listen-and-speak-with-story-images.validation.js +28 -1
  743. package/dist/shared/lib/validation/look-picture-choose-correct-answer.validation.js +12 -1
  744. package/dist/shared/lib/validation/look-picture-fill-blank-choose-answer.validation.js +47 -1
  745. package/dist/shared/lib/validation/read-and-color-objects.validation.js +29 -1
  746. package/dist/shared/lib/validation/read-displayed-content.validation.js +28 -1
  747. package/dist/shared/lib/validation/speaking-conversation.validation.js +75 -1
  748. package/dist/shared/lib/validation/speaking-describe-image.validation.js +31 -1
  749. package/dist/shared/lib/validation/spontaneous-qa.validation.js +48 -1
  750. package/dist/shared/lib/validation/word-fill-paragraph-default.validation.js +38 -1
  751. package/dist/shared/lib/validation/word-fill-paragraph-with-options.validation.js +39 -1
  752. package/dist/shared/lib/validation/word-fill-paragraph.validation.js +43 -1
  753. package/dist/shared/lib/validation/word-ordering.validation.js +33 -1
  754. package/dist/shared/types/branch.types.js +6 -1
  755. package/dist/shared/types/common.types.d.ts +1 -1
  756. package/dist/shared/types/common.types.js +49 -1
  757. package/dist/shared/types/entities/exam-schedule.types.js +5 -1
  758. package/dist/shared/types/entities/exam.types.js +1 -1
  759. package/dist/shared/types/entities/question.types.js +4 -1
  760. package/dist/shared/types/entities/result.types.js +4 -1
  761. package/dist/shared/types/entities/user.types.js +4 -1
  762. package/dist/shared/types/exam-taking.types.js +2 -1
  763. package/dist/shared/types/history.types.js +34 -1
  764. package/dist/shared/types/index.js +1 -1
  765. package/dist/shared/types/questions/choose-correct-adjective.js +4 -1
  766. package/dist/shared/types/questions/choose-the-correct-answer-group.d.ts +1 -0
  767. package/dist/shared/types/questions/choose-the-correct-answer-group.js +1 -1
  768. package/dist/shared/types/questions/choose-the-correct-answer.js +9 -1
  769. package/dist/shared/types/questions/cross-out-word-group.d.ts +2 -0
  770. package/dist/shared/types/questions/cross-out-word-group.js +1 -1
  771. package/dist/shared/types/questions/fill-missing-words-in-grid.js +11 -1
  772. package/dist/shared/types/questions/index.d.ts +1 -0
  773. package/dist/shared/types/questions/index.js +46 -1
  774. package/dist/shared/types/questions/listen-and-speak-answer.js +1 -1
  775. package/dist/shared/types/questions/listen-and-speak-compare-images.js +1 -1
  776. package/dist/shared/types/questions/listen-and-speak-image-group.js +1 -1
  777. package/dist/shared/types/questions/listen-and-speak-info-exchange.js +3 -1
  778. package/dist/shared/types/questions/listen-and-speak-odd-one-out.js +3 -1
  779. package/dist/shared/types/questions/listen-and-speak-question-list.js +1 -1
  780. package/dist/shared/types/questions/listen-and-speak-with-story-images.js +3 -1
  781. package/dist/shared/types/questions/look-picture-choose-correct-answer.js +5 -1
  782. package/dist/shared/types/questions/look-picture-fill-blank-choose-answer.js +9 -1
  783. package/dist/shared/types/questions/look-picture-fill-word-hint.js +7 -1
  784. package/dist/shared/types/questions/read-displayed-content.js +1 -1
  785. package/dist/shared/types/questions/speaking-conversation.js +7 -1
  786. package/dist/shared/types/questions/speaking-describe-image.js +1 -1
  787. package/dist/shared/types/questions/spontaneous-qa.js +1 -1
  788. package/dist/shared/types/questions/word-order-and-match-group.d.ts +33 -0
  789. package/dist/shared/types/questions/word-order-and-match-group.js +1 -0
  790. package/dist/shared/types/questions/write-correct-verb-form.js +12 -1
  791. package/dist/shared/types/role.types.js +1 -1
  792. package/dist/shared/types/structure-management.js +28 -1
  793. package/dist/shared/types/student.types.js +57 -1
  794. package/dist/shared/types/teacher-dashboard-rooms.js +2 -1
  795. package/package.json +184 -165
  796. package/dist/mcp/config.d.ts +0 -12
  797. package/dist/mcp/config.js +0 -1
  798. package/dist/mcp/http-client.d.ts +0 -6
  799. package/dist/mcp/http-client.js +0 -1
  800. package/dist/mcp/index.d.ts +0 -6
  801. package/dist/mcp/index.js +0 -2
  802. package/dist/mcp/tools/_helpers.d.ts +0 -4
  803. package/dist/mcp/tools/_helpers.js +0 -1
  804. package/dist/mcp/tools/exams.d.ts +0 -2
  805. package/dist/mcp/tools/exams.js +0 -1
  806. package/dist/mcp/tools/index.d.ts +0 -2
  807. package/dist/mcp/tools/index.js +0 -1
  808. package/dist/mcp/tools/results.d.ts +0 -2
  809. package/dist/mcp/tools/results.js +0 -1
@@ -1 +1,19 @@
1
- "use client";import{jsx as e,jsxs as t}from"react/jsx-runtime";import{ROUTES as n}from"../../../shared/constants/routes";import{Clock as r,CheckCircle as i,XCircle as l,Loader2 as a,Play as s,Trophy as c}from"lucide-react";export function BeforeStartCard({countdown:n,formatCountdown:i}){return t("div",{className:"flex flex-col items-center justify-center rounded-2xl bg-black/20 px-6 py-8 text-center ring-1 ring-white/10 backdrop-blur-sm",children:[e(r,{className:"mb-3 h-10 w-10 text-amber-400"}),e("h2",{className:"mb-1 text-xl font-extrabold text-white",children:"Chưa đến giờ thi"}),e("p",{className:"mb-4 text-sm font-medium text-white/80",children:"Bài thi sẽ bắt đầu sau:"}),e("div",{className:"rounded-xl bg-black/30 px-6 py-3 ring-1 ring-white/5",children:e("p",{className:"font-mono text-2xl font-extrabold tracking-wider text-amber-300",children:i(n)})})]})}export function WithinWindowCard({autoStartCountdown:n,isStarting:r,showCountdown:i,onStartClick:l}){return t("div",i?{className:"flex flex-col items-center justify-center rounded-2xl bg-black/20 px-6 py-8 text-center ring-1 ring-white/10 backdrop-blur-sm",children:[e("h2",{className:"mb-4 text-xl font-extrabold text-white",children:"Chuẩn bị vào thi"}),e("div",{className:"flex h-16 w-16 items-center justify-center rounded-full bg-emerald-500/20 ring-2 ring-emerald-400/50",children:e("span",{className:"text-3xl font-extrabold text-emerald-300",children:n})}),t("p",{className:"mt-4 text-sm font-medium text-white/80",children:["Bài thi sẽ tự động bắt đầu sau ",n," giây"]}),r&&t("div",{className:"mt-3 flex items-center gap-2 text-sm font-medium text-emerald-300",children:[e(a,{className:"h-4 w-4 animate-spin"}),e("span",{children:"Đang bắt đầu bài thi..."})]})]}:{className:"flex flex-col items-center justify-center rounded-2xl bg-black/20 px-6 py-8 text-center ring-1 ring-white/10 backdrop-blur-sm",children:[e("h2",{className:"mb-6 text-xl font-extrabold text-white",children:"Sẵn sàng vào thi"}),e("button",{onClick:l,className:"group flex h-20 w-20 cursor-pointer items-center justify-center rounded-full bg-emerald-500 shadow-lg ring-4 ring-emerald-500/30 transition-all duration-200 hover:scale-105 hover:bg-emerald-400 active:scale-95",children:e(s,{className:"h-8 w-8 text-white transition-transform group-hover:scale-110",fill:"white"})}),e("p",{className:"mt-5 text-sm font-medium text-white/80",children:"Nhấn nút trên để bắt đầu bài thi"})]})}export function ExpiredCard(){return t("div",{className:"flex flex-col items-center justify-center rounded-2xl bg-black/20 px-6 py-8 text-center ring-1 ring-white/10 backdrop-blur-sm",children:[e(l,{className:"mb-3 h-10 w-10 text-red-400"}),e("h2",{className:"text-xl font-extrabold text-white",children:"Đã hết thời gian"}),e("p",{className:"mt-2 text-sm font-medium text-white/80",children:"Thời gian làm bài đã kết thúc"})]})}export function AlreadySubmittedCard({attempt:r}){return t("div",{className:"flex flex-col items-center justify-center rounded-2xl bg-black/20 px-6 py-8 text-center ring-1 ring-white/10 backdrop-blur-sm",children:[e(i,{className:"mb-3 h-10 w-10 text-emerald-400"}),e("h2",{className:"mb-4 text-xl font-extrabold text-white",children:"Đã hoàn thành bài thi"}),null!=r?.totalScore&&t("div",{className:"mb-5 flex items-center gap-3 rounded-xl bg-black/30 px-5 py-3 ring-1 ring-white/5",children:[e(c,{className:"h-5 w-5 text-yellow-400"}),e("span",{className:"text-sm font-semibold text-white/90",children:"Điểm số:"}),t("span",{className:"text-xl font-extrabold text-yellow-400",children:[r.totalScore,t("span",{className:"text-sm font-bold text-white/50",children:["/",r.maxScore]})]})]}),r?e("button",{className:"inline-flex cursor-pointer items-center gap-2 rounded-full bg-emerald-600 px-6 py-2.5 text-sm font-bold text-white shadow-lg transition-all duration-200 hover:-translate-y-0.5 hover:bg-emerald-500 active:translate-y-0 active:scale-95",onClick:()=>window.location.href=n.STUDENT.RESULT_DETAIL(r.id),children:"Xem chi tiết kết quả"}):e("p",{className:"text-sm font-medium text-white/80",children:"Phòng thi này không cho phép thi nhiều lần."})]})}
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { ROUTES } from '../../../shared/constants/routes';
4
+ import { Clock, CheckCircle, XCircle, Loader2, Play, Trophy } from 'lucide-react';
5
+ export function BeforeStartCard({ countdown, formatCountdown }) {
6
+ return (_jsxs("div", { className: "flex flex-col items-center justify-center rounded-2xl bg-black/20 px-6 py-8 text-center ring-1 ring-white/10 backdrop-blur-sm", children: [_jsx(Clock, { className: "mb-3 h-10 w-10 text-amber-400" }), _jsx("h2", { className: "mb-1 text-xl font-extrabold text-white", children: "Ch\u01B0a \u0111\u1EBFn gi\u1EDD thi" }), _jsx("p", { className: "mb-4 text-sm font-medium text-white/80", children: "B\u00E0i thi s\u1EBD b\u1EAFt \u0111\u1EA7u sau:" }), _jsx("div", { className: "rounded-xl bg-black/30 px-6 py-3 ring-1 ring-white/5", children: _jsx("p", { className: "font-mono text-2xl font-extrabold tracking-wider text-amber-300", children: formatCountdown(countdown) }) })] }));
7
+ }
8
+ export function WithinWindowCard({ autoStartCountdown, isStarting, showCountdown, onStartClick, }) {
9
+ if (!showCountdown) {
10
+ return (_jsxs("div", { className: "flex flex-col items-center justify-center rounded-2xl bg-black/20 px-6 py-8 text-center ring-1 ring-white/10 backdrop-blur-sm", children: [_jsx("h2", { className: "mb-6 text-xl font-extrabold text-white", children: "S\u1EB5n s\u00E0ng v\u00E0o thi" }), _jsx("button", { onClick: onStartClick, className: "group flex h-20 w-20 cursor-pointer items-center justify-center rounded-full bg-emerald-500 shadow-lg ring-4 ring-emerald-500/30 transition-all duration-200 hover:scale-105 hover:bg-emerald-400 active:scale-95", children: _jsx(Play, { className: "h-8 w-8 text-white transition-transform group-hover:scale-110", fill: "white" }) }), _jsx("p", { className: "mt-5 text-sm font-medium text-white/80", children: "Nh\u1EA5n n\u00FAt tr\u00EAn \u0111\u1EC3 b\u1EAFt \u0111\u1EA7u b\u00E0i thi" })] }));
11
+ }
12
+ return (_jsxs("div", { className: "flex flex-col items-center justify-center rounded-2xl bg-black/20 px-6 py-8 text-center ring-1 ring-white/10 backdrop-blur-sm", children: [_jsx("h2", { className: "mb-4 text-xl font-extrabold text-white", children: "Chu\u1EA9n b\u1ECB v\u00E0o thi" }), _jsx("div", { className: "flex h-16 w-16 items-center justify-center rounded-full bg-emerald-500/20 ring-2 ring-emerald-400/50", children: _jsx("span", { className: "text-3xl font-extrabold text-emerald-300", children: autoStartCountdown }) }), _jsxs("p", { className: "mt-4 text-sm font-medium text-white/80", children: ["B\u00E0i thi s\u1EBD t\u1EF1 \u0111\u1ED9ng b\u1EAFt \u0111\u1EA7u sau ", autoStartCountdown, " gi\u00E2y"] }), isStarting && (_jsxs("div", { className: "mt-3 flex items-center gap-2 text-sm font-medium text-emerald-300", children: [_jsx(Loader2, { className: "h-4 w-4 animate-spin" }), _jsx("span", { children: "\u0110ang b\u1EAFt \u0111\u1EA7u b\u00E0i thi..." })] }))] }));
13
+ }
14
+ export function ExpiredCard() {
15
+ return (_jsxs("div", { className: "flex flex-col items-center justify-center rounded-2xl bg-black/20 px-6 py-8 text-center ring-1 ring-white/10 backdrop-blur-sm", children: [_jsx(XCircle, { className: "mb-3 h-10 w-10 text-red-400" }), _jsx("h2", { className: "text-xl font-extrabold text-white", children: "\u0110\u00E3 h\u1EBFt th\u1EDDi gian" }), _jsx("p", { className: "mt-2 text-sm font-medium text-white/80", children: "Th\u1EDDi gian l\u00E0m b\u00E0i \u0111\u00E3 k\u1EBFt th\u00FAc" })] }));
16
+ }
17
+ export function AlreadySubmittedCard({ attempt }) {
18
+ return (_jsxs("div", { className: "flex flex-col items-center justify-center rounded-2xl bg-black/20 px-6 py-8 text-center ring-1 ring-white/10 backdrop-blur-sm", children: [_jsx(CheckCircle, { className: "mb-3 h-10 w-10 text-emerald-400" }), _jsx("h2", { className: "mb-4 text-xl font-extrabold text-white", children: "\u0110\u00E3 ho\u00E0n th\u00E0nh b\u00E0i thi" }), attempt?.totalScore !== undefined && attempt?.totalScore !== null && (_jsxs("div", { className: "mb-5 flex items-center gap-3 rounded-xl bg-black/30 px-5 py-3 ring-1 ring-white/5", children: [_jsx(Trophy, { className: "h-5 w-5 text-yellow-400" }), _jsx("span", { className: "text-sm font-semibold text-white/90", children: "\u0110i\u1EC3m s\u1ED1:" }), _jsxs("span", { className: "text-xl font-extrabold text-yellow-400", children: [attempt.totalScore, _jsxs("span", { className: "text-sm font-bold text-white/50", children: ["/", attempt.maxScore] })] })] })), attempt ? (_jsx("button", { className: "inline-flex cursor-pointer items-center gap-2 rounded-full bg-emerald-600 px-6 py-2.5 text-sm font-bold text-white shadow-lg transition-all duration-200 hover:-translate-y-0.5 hover:bg-emerald-500 active:translate-y-0 active:scale-95", onClick: () => (window.location.href = ROUTES.STUDENT.RESULT_DETAIL(attempt.id)), children: "Xem chi ti\u1EBFt k\u1EBFt qu\u1EA3" })) : (_jsx("p", { className: "text-sm font-medium text-white/80", children: "Ph\u00F2ng thi n\u00E0y kh\u00F4ng cho ph\u00E9p thi nhi\u1EC1u l\u1EA7n." }))] }));
19
+ }
@@ -1 +1,2 @@
1
- export{ThemedWaitingRoom}from"./themed";export{BeforeStartCard,WithinWindowCard,ExpiredCard,AlreadySubmittedCard}from"./entry-state-cards";
1
+ export { ThemedWaitingRoom } from './themed';
2
+ export { BeforeStartCard, WithinWindowCard, ExpiredCard, AlreadySubmittedCard, } from './entry-state-cards';
@@ -1 +1,121 @@
1
- "use client";import{jsx as e,jsxs as t}from"react/jsx-runtime";import{useState as n}from"react";import a from"next/image";import{Loader2 as i,Clock as l,Trophy as s,Layers as r,Target as c,HelpCircle as o,ChevronDown as h,X as m}from"lucide-react";import{PartRow as d,groupPartsByCategory as x}from"./cambridge-yle-waiting-parts";import p from"../../../../components/themes/cambridge-yle/assets/images/background-ocean-edu-2.png";import g from"../../../../components/themes/cambridge-yle/assets/images/frame.png";import u from"../../../../components/themes/cambridge-yle/assets/images/bg-title.png";import b from"../../../../components/themes/cambridge-yle/assets/images/close.png";import f from"../../../../components/themes/cambridge-yle/assets/images/rocket.png";const w=[{q:"Bài test này kéo dài bao lâu?",a:"Thời gian làm bài sẽ được hiển thị trên màn hình. Hãy theo dõi đồng hồ để phân bổ thời gian hợp lý."},{q:"Em có cần hoàn thành tất cả câu hỏi không?",a:"Để kết quả phản ánh chính xác nhất năng lực hiện tại, em cố gắng hoàn thành toàn bộ câu hỏi trong thời gian quy định."},{q:"Nếu mất mạng giữa chừng thì sao?",a:"Trong một số trường hợp, hệ thống có thể tự động lưu tiến trình làm bài. Hãy kết nối lại internet sớm nhất có thể. Tuy nhiên để tránh gián đoạn, em nên sử dụng kết nối internet ổn định trong suốt quá trình làm bài."},{q:"Em không nghe được audio thì phải làm sao?",a:"Em hãy kiểm tra loa, tai nghe và âm lượng thiết bị trước. Nếu vẫn gặp lỗi, hãy thử tải lại trang hoặc đổi sang trình duyệt khác để tiếp tục làm bài."},{q:"Trang web bị lag hoặc không tải được câu hỏi?",a:"Em có thể thử làm mới trang, kiểm tra lại kết nối internet hoặc đổi trình duyệt/thiết bị khác. Nếu tình trạng vẫn tiếp diễn, hãy liên hệ trung tâm để được hỗ trợ nhanh nhất."},{q:"Em có thể xem lại đáp án sau khi nộp bài không?",a:"Sau khi nộp bài, sẽ có phiếu kết quả AI chấm điểm trả về, phân tích từng câu hỏi em đã làm."},{q:"Nếu em nộp nhầm thì sao?",a:"Sau khi nộp bài, em sẽ không thể chỉnh sửa câu trả lời. Em có thể liên hệ thầy cô ở trung tâm để hỗ trợ làm lại bài khác."},{q:"Em có được dùng từ điển hoặc tài liệu không?",a:"Để kết quả phản ánh đúng năng lực hiện tại, em nên làm bài trong điều kiện tương tự một bài kiểm tra thực tế và hạn chế sử dụng tài liệu hỗ trợ."},{q:"Em cần chuẩn bị gì trước khi bắt đầu?",a:"Em nên chuẩn bị thiết bị có kết nối internet ổn định, tai nghe (nếu có phần Listening), không gian yên tĩnh và dành đủ thời gian để hoàn thành bài test liên tục."},{q:"Em nên làm gì nếu gặp lỗi hệ thống?",a:"Nếu gặp lỗi trong quá trình làm bài, em hãy chụp lại màn hình lỗi (nếu có) và liên hệ trung tâm để được hỗ trợ xử lý nhanh nhất."}];function v({className:t="",size:n=18}){return e("svg",{width:n,height:n,viewBox:"0 0 24 24",className:t,fill:"currentColor",children:e("path",{d:"M12 0l2.4 9.6L24 12l-9.6 2.4L12 24l-2.4-9.6L0 12l9.6-2.4L12 0z"})})}export function CambridgeYleWaitingRoom({room:i,onStart:f,isStarting:k,showCountdown:_,autoStartCountdown:C,closeRedirectUrl:z,onClose:j}){const q=i.exam?.name||"",S=i.contest?.name||"",E=i.exam?.parts??[],I=E.length>0?E.length:i.exam?.numberOfParts||1,B=i.exam?.durationMinutes||45,L=i.exam?.totalScore||100,T=i.exam?.passScore||0,W=i.exam?.level?.trim()||"",[P,$]=n(!1),[H,O]=n(0);return t("div",{className:"fixed inset-0 z-50 flex items-center justify-center overflow-hidden",children:[e("div",{className:"absolute inset-0 scale-105 bg-cover bg-center",style:{backgroundImage:`url(${p.src})`,filter:"blur(2px) brightness(0.8) saturate(0.9)"}}),e("div",{className:"absolute inset-0 bg-gradient-to-b from-blue-950/50 via-blue-900/40 to-blue-950/60"}),e(v,{className:"absolute left-[8%] top-[14%] text-yellow-300 drop-shadow-[0_0_8px_rgba(255,255,150,0.8)]",size:22}),e(v,{className:"absolute right-[10%] top-[10%] text-yellow-200 drop-shadow-[0_0_8px_rgba(255,255,150,0.8)]",size:16}),e(v,{className:"absolute left-[15%] bottom-[18%] text-white/80",size:14}),e(v,{className:"absolute right-[6%] bottom-[24%] text-yellow-300 drop-shadow-[0_0_8px_rgba(255,255,150,0.8)]",size:20}),e(v,{className:"absolute left-[45%] top-[8%] text-white/70",size:12}),e("div",{className:"relative z-10",style:{width:"min(98vw, calc(98vh * 1552 / 672), 1800px)"},children:t("div",{className:"relative aspect-[1552/672] w-full",children:[e(a,{src:g,alt:"",fill:!0,className:"object-contain",priority:!0,unoptimized:!0}),e("div",{className:"absolute left-1/2 top-0 z-20 max-w-[min(92%,720px,calc(100%-7rem))] -translate-x-1/2 -translate-y-1/2",children:e("div",{className:"relative flex h-[clamp(52px,7vw,72px)] min-w-[240px] max-w-full items-center justify-center px-6 pt-0.5 drop-shadow-xl sm:px-15",style:{borderStyle:"solid",borderColor:"transparent",borderWidth:0,borderImageSource:`url(${u.src})`,borderImageSlice:"10 85 fill",borderImageWidth:"0 calc(clamp(52px, 7vw, 72px) / 2)",borderImageRepeat:"stretch"},children:e("span",{className:"relative z-10 whitespace-nowrap text-center text-sm font-extrabold uppercase tracking-[0.12em] text-white drop-shadow sm:text-base sm:tracking-[0.15em]",children:S})})}),e("button",{onClick:()=>{j?j():z&&(window.location.href=z)},className:"absolute right-[7%] top-[-2%] z-30 cursor-pointer transition-transform hover:scale-110 active:scale-95","aria-label":"Close",children:e(a,{src:b,alt:"Close",width:56,height:56,unoptimized:!0})}),t("div",{className:"absolute inset-0 z-10 overflow-hidden px-[9%] pt-[4%] pb-[calc(7%+1.75rem)]",children:[t("div",{className:"flex h-full min-h-0 items-stretch gap-4",children:[t("div",{className:"mx-auto flex h-full w-full max-w-[560px] min-h-0 flex-[0_0_46%] flex-col gap-1",children:[e("h1",{className:"shrink-0 text-center text-2xl font-black uppercase tracking-wide text-white sm:text-3xl md:text-4xl lg:text-5xl 2xl:text-5xl",style:{fontWeight:900,margin:"0.1em 0",textShadow:["0 1px 0 #cfe3ff","0 2px 0 #a8c8ee","0 3px 0 #6f9cd4","0 4px 0 #4a7cb8","0 5px 0 #2f5e9c","0 6px 0 #1a4480","0 8px 12px rgba(0,0,0,0.45)","0 0 22px rgba(120,180,255,0.55)"].join(", ")},children:i.name}),W?e("div",{className:"flex w-full min-w-0 shrink-0 flex-col items-center gap-1 px-1",children:e("span",{className:"rounded-full bg-cyan-400/30 px-3 py-0.5 text-[11px] font-black uppercase tracking-wider text-cyan-100 ring-1 ring-cyan-300/60 shadow-sm backdrop-blur-xs",children:W})}):null,e("p",{className:"mt-0.5 hidden shrink-0 text-center text-sm font-bold text-[#21cffb] md:text-base 2xl:block 2xl:text-lg",children:"Đánh giá năng lực • Xác định lộ trình • Bứt phá tương lai"}),e("p",{className:"mx-auto mt-0.5 hidden max-w-2xl shrink-0 text-center text-xs font-medium text-cyan-50/90 drop-shadow-sm md:text-sm 2xl:block",children:"Bài thi giúp bạn biết chính xác trình độ hiện tại và được Ocean Edu tư vấn lộ trình học tập phù hợp nhất."}),t("div",{className:"mt-1.5 hidden shrink-0 items-center justify-center gap-2 2xl:flex",children:[e("span",{className:"h-px w-10 bg-white"}),e(v,{className:"text-white",size:12}),e("span",{className:"text-xs font-extrabold uppercase tracking-[0.3em] text-white md:text-sm",children:"Bài thi bao gồm"}),e(v,{className:"text-white",size:12}),e("span",{className:"h-px w-10 bg-white"})]}),t("div",{className:"mt-1.5 grid shrink-0 grid-cols-3 gap-2",children:[e(y,{icon:e(r,{className:"h-5 w-5"}),value:I,label:"Phần thi"}),e(y,{icon:e(l,{className:"h-5 w-5"}),value:B,label:"Phút"}),e(y,{icon:e(s,{className:"h-5 w-5"}),value:L,label:"Tổng điểm"})]}),E.length>0?t("div",{className:"mt-2 flex min-h-0 flex-1 flex-col overflow-hidden",children:[q?t("div",{className:"mb-2 flex w-full shrink-0 flex-col items-center py-1",title:q,children:[e("span",{className:"text-[11px] font-black uppercase tracking-[0.25em] text-cyan-300/90",children:"ĐỀ THI"}),e("h2",{className:"w-full truncate text-center text-base font-black uppercase tracking-wide text-white drop-shadow-sm sm:text-lg md:text-xl",children:q})]}):null,t("div",{className:"mb-2 flex shrink-0 items-center justify-between px-1",children:[e("span",{className:"text-xs font-black uppercase tracking-[0.2em] text-cyan-100 sm:text-sm",children:"Cấu trúc bài thi"}),T>0&&t("span",{className:"text-xs font-bold text-white/90 sm:text-sm",children:["Điểm đạt:"," ",t("span",{className:"font-black text-yellow-300",children:[T,"/",L]})]})]}),e("div",{className:"cambridge-scrollbar min-h-0 flex-1 overflow-y-auto pr-1 pb-2",children:e("div",{className:"space-y-2.5 pb-8",children:x(E).map(n=>t("div",{className:"space-y-1.5",children:[t("div",{className:"flex items-center gap-2 px-1",children:[e("span",{className:"flex-none text-[11px] font-extrabold uppercase tracking-[0.14em] text-cyan-200",children:n.label}),e("span",{className:"h-px flex-1 bg-white/15"}),n.totalPoints>0&&t("span",{className:"flex-none text-[11px] font-bold text-white/75",children:[n.totalPoints," điểm"]})]}),n.parts.map((t,a)=>e(d,{part:t,showSkill:!1},t.id||`${n.key}-${a}`))]},n.key))})})]}):T>0&&t("div",{className:"mt-1.5 flex shrink-0 items-center gap-3 rounded-xl bg-[#0000001c] px-3 py-2.5",children:[e("span",{className:"flex h-9 w-9 flex-none items-center justify-center rounded-full bg-[#00000021] text-white",children:e(c,{className:"h-4 w-4"})}),e("span",{className:"text-sm font-bold text-white md:text-base",children:"Điểm tối thiểu cần đạt"}),t("span",{className:"ml-auto text-sm font-black text-yellow-300 md:text-lg",children:[T,"/",L]})]})]}),e("div",{className:"relative hidden flex-[0_0_42%] md:block",children:e("div",{className:"absolute left-0 top-[4%] z-20 max-w-[60%]",children:t("div",{className:"relative rounded-2xl bg-white px-3 py-2 text-center text-[11px] font-semibold text-sky-900 shadow-xl ring-2 ring-sky-200 md:text-xs",children:["Cùng mình khám phá trình độ của bạn nhé!",e("span",{className:"absolute -bottom-1.5 right-6 h-3 w-3 rotate-45 bg-white ring-2 ring-sky-200"})]})})})]}),e("div",{className:"pointer-events-none absolute inset-x-[9%] bottom-[6%] z-20 flex justify-center",children:e("div",{className:"pointer-events-auto",children:e(N,{onClick:f,isStarting:k,showCountdown:_,autoStartCountdown:C})})})]})]})}),t("button",{type:"button",onClick:()=>$(!0),"aria-label":"Câu hỏi thường gặp",className:"group fixed bottom-5 right-5 z-40 inline-flex cursor-pointer items-center gap-2 rounded-full bg-gradient-to-b from-cyan-300 via-sky-500 to-sky-700 px-4 py-3 text-sm font-bold text-white shadow-[0_6px_0_0_#0c4a6e,0_10px_22px_rgba(14,165,233,0.45)] ring-2 ring-cyan-200/50 transition-all duration-150 hover:-translate-y-0.5 hover:brightness-110 active:translate-y-1 active:shadow-[0_1px_0_0_#0c4a6e,0_3px_8px_rgba(14,165,233,0.3)]",children:[e(o,{className:"h-5 w-5",strokeWidth:2.5}),e("span",{className:"hidden sm:inline",style:{textShadow:"0 1px 0 rgba(12,74,110,0.5)"},children:"Câu hỏi thường gặp"})]}),P&&t("div",{className:"fixed inset-0 z-[60] flex items-center justify-center p-4",role:"dialog","aria-modal":"true","aria-label":"Câu hỏi thường gặp",children:[e("div",{className:"absolute inset-0 bg-blue-950/70 backdrop-blur-sm",onClick:()=>$(!1)}),t("div",{className:"relative z-10 flex max-h-[85vh] w-full max-w-2xl flex-col overflow-hidden rounded-3xl bg-gradient-to-br from-cyan-300/20 via-white/5 to-white/0 p-px shadow-[0_20px_60px_-15px_rgba(10,75,140,0.7)] backdrop-blur-xl",children:[e("div",{className:"pointer-events-none absolute -left-12 -top-12 h-40 w-40 rounded-full bg-cyan-400/30 blur-3xl"}),e("div",{className:"pointer-events-none absolute -right-12 -bottom-12 h-40 w-40 rounded-full bg-sky-500/25 blur-3xl"}),t("div",{className:"relative flex max-h-[85vh] flex-col overflow-hidden rounded-[calc(1.5rem-1px)] bg-gradient-to-b from-[#0e3d70]/95 via-[#0a4b8c]/95 to-[#0a3866]/95 ring-1 ring-cyan-300/20",children:[t("div",{className:"flex items-center gap-3 px-6 py-5",children:[e("div",{className:"flex h-12 w-12 flex-none items-center justify-center rounded-full bg-gradient-to-br from-cyan-300 to-sky-600 shadow-[0_6px_18px_-4px_rgba(34,211,238,0.6)] ring-4 ring-cyan-300/20",children:e(o,{className:"h-6 w-6 text-white",strokeWidth:2.5})}),t("div",{className:"flex-1",children:[e("h2",{className:"text-lg font-extrabold tracking-tight text-white drop-shadow-md",children:"Câu hỏi thường gặp"}),e("p",{className:"mt-0.5 text-xs font-medium text-cyan-100/70",children:"Những điều cần biết trước khi làm bài"})]}),e("button",{type:"button",onClick:()=>$(!1),"aria-label":"Đóng",className:"flex h-9 w-9 flex-none cursor-pointer items-center justify-center rounded-full bg-white/10 text-white/80 ring-1 ring-white/15 transition-all duration-150 hover:bg-white/20 hover:text-white",children:e(m,{className:"h-5 w-5"})})]}),e("div",{className:"mx-6 h-px bg-gradient-to-r from-transparent via-cyan-300/25 to-transparent"}),e("div",{className:"flex-1 overflow-y-auto px-4 py-4 sm:px-6",children:e("ul",{className:"space-y-2",children:w.map((n,a)=>{const i=H===a;return t("li",{className:"overflow-hidden rounded-2xl ring-1 transition-colors duration-200 "+(i?"bg-white/[0.08] ring-cyan-300/30":"bg-white/[0.04] ring-white/10 hover:bg-white/[0.06]"),children:[t("button",{type:"button",onClick:()=>O(i?null:a),className:"flex w-full cursor-pointer items-center gap-3 px-4 py-3 text-left","aria-expanded":i,children:[e("span",{className:"flex h-7 w-7 flex-none items-center justify-center rounded-full text-xs font-black transition-colors "+(i?"bg-gradient-to-br from-yellow-300 to-orange-500 text-white":"bg-white/10 text-cyan-100"),children:a+1}),e("span",{className:"flex-1 text-sm font-bold text-white",children:n.q}),e(h,{className:"h-5 w-5 flex-none text-cyan-200 transition-transform duration-200 "+(i?"rotate-180":"")})]}),e("div",{className:"grid transition-all duration-200 "+(i?"grid-rows-[1fr] opacity-100":"grid-rows-[0fr] opacity-0"),children:e("div",{className:"overflow-hidden",children:e("p",{className:"px-4 pb-4 pl-14 text-sm leading-relaxed text-cyan-50/90",children:n.a})})})]},a)})})}),e("div",{className:"border-t border-white/10 bg-white/[0.03] px-6 py-3 text-center text-xs text-cyan-100/60",children:"Cần hỗ trợ thêm? Liên hệ trung tâm Ocean Edu để được giải đáp."})]})]})]})]})}function y({icon:n,value:a,label:i}){return t("div",{className:"flex items-center justify-center gap-2 rounded-2xl bg-black/25 px-2 py-2 ring-1 ring-white/10 shadow-inner",children:[e("span",{className:"flex h-8 w-8 flex-none items-center justify-center rounded-full bg-cyan-400/20 text-cyan-200 ring-1 ring-cyan-300/30 md:h-9 md:w-9",children:n}),t("div",{className:"flex flex-col items-start leading-tight",children:[e("div",{className:"text-xl font-black text-white md:text-2xl",children:a}),e("div",{className:"text-[11px] font-extrabold text-cyan-100/95 md:text-xs",children:i})]})]})}function N({onClick:n,isStarting:l,showCountdown:s,autoStartCountdown:r}){return s?e("div",{className:"inline-flex h-14 w-48 items-center justify-center rounded-full bg-yellow-400 text-2xl font-black text-[#1a3a6e]",children:r}):t("button",{onClick:n,disabled:l,className:"group relative inline-flex cursor-pointer items-center gap-3 rounded-full bg-gradient-to-b from-[#ffd54a] via-[#ffb733] to-[#ff8a1f] py-2.5 pl-8 pr-10 shadow-[0_6px_0_0_#c46410,0_10px_18px_rgba(0,0,0,0.4)] ring-2 ring-orange-300/60 transition-all duration-150 hover:-translate-y-0.5 hover:brightness-110 hover:shadow-[0_8px_0_0_#c46410,0_14px_22px_rgba(0,0,0,0.45)] active:translate-y-1.5 active:shadow-[0_1px_0_0_#c46410,0_2px_6px_rgba(0,0,0,0.3)] disabled:cursor-not-allowed disabled:opacity-70",children:[l?e(i,{className:"h-7 w-7 animate-spin text-white"}):e(a,{src:f,alt:"",width:36,height:36,unoptimized:!0}),e("span",{className:"text-xl font-black text-white",style:{color:"#685030"},children:"Bắt đầu"})]})}
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useState } from 'react';
4
+ import Image from 'next/image';
5
+ import { Loader2, Clock, Trophy, Layers, Target, HelpCircle, ChevronDown, X } from 'lucide-react';
6
+ import { PartRow, groupPartsByCategory } from './cambridge-yle-waiting-parts';
7
+ import bgImage from '../../../../components/themes/cambridge-yle/assets/images/background-ocean-edu-2.png';
8
+ import frameImage from '../../../../components/themes/cambridge-yle/assets/images/frame.png';
9
+ import bgTitleImage from '../../../../components/themes/cambridge-yle/assets/images/bg-title.png';
10
+ import closeImage from '../../../../components/themes/cambridge-yle/assets/images/close.png';
11
+ import rocketImage from '../../../../components/themes/cambridge-yle/assets/images/rocket.png';
12
+ const FAQS = [
13
+ {
14
+ q: 'Bài test này kéo dài bao lâu?',
15
+ a: 'Thời gian làm bài sẽ được hiển thị trên màn hình. Hãy theo dõi đồng hồ để phân bổ thời gian hợp lý.',
16
+ },
17
+ {
18
+ q: 'Em có cần hoàn thành tất cả câu hỏi không?',
19
+ a: 'Để kết quả phản ánh chính xác nhất năng lực hiện tại, em cố gắng hoàn thành toàn bộ câu hỏi trong thời gian quy định.',
20
+ },
21
+ {
22
+ q: 'Nếu mất mạng giữa chừng thì sao?',
23
+ a: 'Trong một số trường hợp, hệ thống có thể tự động lưu tiến trình làm bài. Hãy kết nối lại internet sớm nhất có thể. Tuy nhiên để tránh gián đoạn, em nên sử dụng kết nối internet ổn định trong suốt quá trình làm bài.',
24
+ },
25
+ {
26
+ q: 'Em không nghe được audio thì phải làm sao?',
27
+ a: 'Em hãy kiểm tra loa, tai nghe và âm lượng thiết bị trước. Nếu vẫn gặp lỗi, hãy thử tải lại trang hoặc đổi sang trình duyệt khác để tiếp tục làm bài.',
28
+ },
29
+ {
30
+ q: 'Trang web bị lag hoặc không tải được câu hỏi?',
31
+ a: 'Em có thể thử làm mới trang, kiểm tra lại kết nối internet hoặc đổi trình duyệt/thiết bị khác. Nếu tình trạng vẫn tiếp diễn, hãy liên hệ trung tâm để được hỗ trợ nhanh nhất.',
32
+ },
33
+ {
34
+ q: 'Em có thể xem lại đáp án sau khi nộp bài không?',
35
+ a: 'Sau khi nộp bài, sẽ có phiếu kết quả AI chấm điểm trả về, phân tích từng câu hỏi em đã làm.',
36
+ },
37
+ {
38
+ q: 'Nếu em nộp nhầm thì sao?',
39
+ a: 'Sau khi nộp bài, em sẽ không thể chỉnh sửa câu trả lời. Em có thể liên hệ thầy cô ở trung tâm để hỗ trợ làm lại bài khác.',
40
+ },
41
+ {
42
+ q: 'Em có được dùng từ điển hoặc tài liệu không?',
43
+ a: 'Để kết quả phản ánh đúng năng lực hiện tại, em nên làm bài trong điều kiện tương tự một bài kiểm tra thực tế và hạn chế sử dụng tài liệu hỗ trợ.',
44
+ },
45
+ {
46
+ q: 'Em cần chuẩn bị gì trước khi bắt đầu?',
47
+ a: 'Em nên chuẩn bị thiết bị có kết nối internet ổn định, tai nghe (nếu có phần Listening), không gian yên tĩnh và dành đủ thời gian để hoàn thành bài test liên tục.',
48
+ },
49
+ {
50
+ q: 'Em nên làm gì nếu gặp lỗi hệ thống?',
51
+ a: 'Nếu gặp lỗi trong quá trình làm bài, em hãy chụp lại màn hình lỗi (nếu có) và liên hệ trung tâm để được hỗ trợ xử lý nhanh nhất.',
52
+ },
53
+ ];
54
+ function Sparkle({ className = '', size = 18 }) {
55
+ return (_jsx("svg", { width: size, height: size, viewBox: "0 0 24 24", className: className, fill: "currentColor", children: _jsx("path", { d: "M12 0l2.4 9.6L24 12l-9.6 2.4L12 24l-2.4-9.6L0 12l9.6-2.4L12 0z" }) }));
56
+ }
57
+ export function CambridgeYleWaitingRoom({ room, onStart, isStarting, showCountdown, autoStartCountdown, closeRedirectUrl, onClose, }) {
58
+ const examName = room.exam?.name || '';
59
+ const contestName = room.contest?.name || '';
60
+ const examParts = room.exam?.parts ?? [];
61
+ const parts = examParts.length > 0
62
+ ? examParts.length
63
+ : room.exam?.numberOfParts || 1;
64
+ const duration = room.exam?.durationMinutes || 45;
65
+ const maxScore = room.exam?.totalScore || 100;
66
+ const passScore = room.exam?.passScore || 0;
67
+ const level = room.exam?.level?.trim() || '';
68
+ const [faqOpen, setFaqOpen] = useState(false);
69
+ const [openIndex, setOpenIndex] = useState(0);
70
+ const handleClose = () => {
71
+ if (onClose) {
72
+ onClose();
73
+ }
74
+ else if (closeRedirectUrl) {
75
+ window.location.href = closeRedirectUrl;
76
+ }
77
+ };
78
+ return (_jsxs("div", { className: "fixed inset-0 z-50 flex items-center justify-center overflow-hidden", children: [_jsx("div", { className: "absolute inset-0 scale-105 bg-cover bg-center", style: {
79
+ backgroundImage: `url(${bgImage.src})`,
80
+ filter: 'blur(2px) brightness(0.8) saturate(0.9)',
81
+ } }), _jsx("div", { className: "absolute inset-0 bg-gradient-to-b from-blue-950/50 via-blue-900/40 to-blue-950/60" }), _jsx(Sparkle, { className: "absolute left-[8%] top-[14%] text-yellow-300 drop-shadow-[0_0_8px_rgba(255,255,150,0.8)]", size: 22 }), _jsx(Sparkle, { className: "absolute right-[10%] top-[10%] text-yellow-200 drop-shadow-[0_0_8px_rgba(255,255,150,0.8)]", size: 16 }), _jsx(Sparkle, { className: "absolute left-[15%] bottom-[18%] text-white/80", size: 14 }), _jsx(Sparkle, { className: "absolute right-[6%] bottom-[24%] text-yellow-300 drop-shadow-[0_0_8px_rgba(255,255,150,0.8)]", size: 20 }), _jsx(Sparkle, { className: "absolute left-[45%] top-[8%] text-white/70", size: 12 }), _jsx("div", { className: "relative z-10", style: { width: 'min(98vw, calc(98vh * 1552 / 672), 1800px)' }, children: _jsxs("div", { className: "relative aspect-[1552/672] w-full", children: [_jsx(Image, { src: frameImage, alt: "", fill: true, className: "object-contain", priority: true, unoptimized: true }), _jsx("div", { className: "absolute left-1/2 top-0 z-20 max-w-[min(92%,720px,calc(100%-7rem))] -translate-x-1/2 -translate-y-1/2", children: _jsx("div", { className: "relative flex h-[clamp(52px,7vw,72px)] min-w-[240px] max-w-full items-center justify-center px-6 pt-0.5 drop-shadow-xl sm:px-15", style: {
82
+ // 9-slice: left/right ~ half height so pill ends stay circular; only center stretches
83
+ borderStyle: 'solid',
84
+ borderColor: 'transparent',
85
+ borderWidth: 0,
86
+ borderImageSource: `url(${bgTitleImage.src})`,
87
+ // Source 512×171 — lock ~85px side caps (≈ half height of asset)
88
+ borderImageSlice: '10 85 fill',
89
+ borderImageWidth: '0 calc(clamp(52px, 7vw, 72px) / 2)',
90
+ borderImageRepeat: 'stretch',
91
+ }, children: _jsx("span", { className: "relative z-10 whitespace-nowrap text-center text-sm font-extrabold uppercase tracking-[0.12em] text-white drop-shadow sm:text-base sm:tracking-[0.15em]", children: contestName }) }) }), _jsx("button", { onClick: handleClose, className: "absolute right-[7%] top-[-2%] z-30 cursor-pointer transition-transform hover:scale-110 active:scale-95", "aria-label": "Close", children: _jsx(Image, { src: closeImage, alt: "Close", width: 56, height: 56, unoptimized: true }) }), _jsxs("div", { className: "absolute inset-0 z-10 overflow-hidden px-[9%] pt-[4%] pb-[calc(7%+1.75rem)]", children: [_jsxs("div", { className: "flex h-full min-h-0 items-stretch gap-4", children: [_jsxs("div", { className: "mx-auto flex h-full w-full max-w-[560px] min-h-0 flex-[0_0_46%] flex-col gap-1", children: [_jsx("h1", { className: "shrink-0 text-center text-2xl font-black uppercase tracking-wide text-white sm:text-3xl md:text-4xl lg:text-5xl 2xl:text-5xl", style: {
92
+ fontWeight: 900,
93
+ margin: '0.1em 0',
94
+ textShadow: [
95
+ '0 1px 0 #cfe3ff',
96
+ '0 2px 0 #a8c8ee',
97
+ '0 3px 0 #6f9cd4',
98
+ '0 4px 0 #4a7cb8',
99
+ '0 5px 0 #2f5e9c',
100
+ '0 6px 0 #1a4480',
101
+ '0 8px 12px rgba(0,0,0,0.45)',
102
+ '0 0 22px rgba(120,180,255,0.55)',
103
+ ].join(', '),
104
+ }, children: room.name }), level ? (_jsx("div", { className: "flex w-full min-w-0 shrink-0 flex-col items-center gap-1 px-1", children: _jsx("span", { className: "rounded-full bg-cyan-400/30 px-3 py-0.5 text-[11px] font-black uppercase tracking-wider text-cyan-100 ring-1 ring-cyan-300/60 shadow-sm backdrop-blur-xs", children: level }) })) : null, _jsx("p", { className: "mt-0.5 hidden shrink-0 text-center text-sm font-bold text-[#21cffb] md:text-base 2xl:block 2xl:text-lg", children: "\u0110\u00E1nh gi\u00E1 n\u0103ng l\u1EF1c \u2022 X\u00E1c \u0111\u1ECBnh l\u1ED9 tr\u00ECnh \u2022 B\u1EE9t ph\u00E1 t\u01B0\u01A1ng lai" }), _jsx("p", { className: "mx-auto mt-0.5 hidden max-w-2xl shrink-0 text-center text-xs font-medium text-cyan-50/90 drop-shadow-sm md:text-sm 2xl:block", children: "B\u00E0i thi gi\u00FAp b\u1EA1n bi\u1EBFt ch\u00EDnh x\u00E1c tr\u00ECnh \u0111\u1ED9 hi\u1EC7n t\u1EA1i v\u00E0 \u0111\u01B0\u1EE3c Ocean Edu t\u01B0 v\u1EA5n l\u1ED9 tr\u00ECnh h\u1ECDc t\u1EADp ph\u00F9 h\u1EE3p nh\u1EA5t." }), _jsxs("div", { className: "mt-1.5 hidden shrink-0 items-center justify-center gap-2 2xl:flex", children: [_jsx("span", { className: "h-px w-10 bg-white" }), _jsx(Sparkle, { className: "text-white", size: 12 }), _jsx("span", { className: "text-xs font-extrabold uppercase tracking-[0.3em] text-white md:text-sm", children: "B\u00E0i thi bao g\u1ED3m" }), _jsx(Sparkle, { className: "text-white", size: 12 }), _jsx("span", { className: "h-px w-10 bg-white" })] }), _jsxs("div", { className: "mt-1.5 grid shrink-0 grid-cols-3 gap-2", children: [_jsx(StatCard, { icon: _jsx(Layers, { className: "h-5 w-5" }), value: parts, label: "Ph\u1EA7n thi" }), _jsx(StatCard, { icon: _jsx(Clock, { className: "h-5 w-5" }), value: duration, label: "Ph\u00FAt" }), _jsx(StatCard, { icon: _jsx(Trophy, { className: "h-5 w-5" }), value: maxScore, label: "T\u1ED5ng \u0111i\u1EC3m" })] }), examParts.length > 0 ? (_jsxs("div", { className: "mt-2 flex min-h-0 flex-1 flex-col overflow-hidden", children: [examName ? (_jsxs("div", { className: "mb-2 flex w-full shrink-0 flex-col items-center py-1", title: examName, children: [_jsx("span", { className: "text-[11px] font-black uppercase tracking-[0.25em] text-cyan-300/90", children: "\u0110\u1EC0 THI" }), _jsx("h2", { className: "w-full truncate text-center text-base font-black uppercase tracking-wide text-white drop-shadow-sm sm:text-lg md:text-xl", children: examName })] })) : null, _jsxs("div", { className: "mb-2 flex shrink-0 items-center justify-between px-1", children: [_jsx("span", { className: "text-xs font-black uppercase tracking-[0.2em] text-cyan-100 sm:text-sm", children: "C\u1EA5u tr\u00FAc b\u00E0i thi" }), passScore > 0 && (_jsxs("span", { className: "text-xs font-bold text-white/90 sm:text-sm", children: ["\u0110i\u1EC3m \u0111\u1EA1t:", ' ', _jsxs("span", { className: "font-black text-yellow-300", children: [passScore, "/", maxScore] })] }))] }), _jsx("div", { className: "cambridge-scrollbar min-h-0 flex-1 overflow-y-auto pr-1 pb-2", children: _jsx("div", { className: "space-y-2.5 pb-8", children: groupPartsByCategory(examParts).map((group) => (_jsxs("div", { className: "space-y-1.5", children: [_jsxs("div", { className: "flex items-center gap-2 px-1", children: [_jsx("span", { className: "flex-none text-[11px] font-extrabold uppercase tracking-[0.14em] text-cyan-200", children: group.label }), _jsx("span", { className: "h-px flex-1 bg-white/15" }), group.totalPoints > 0 && (_jsxs("span", { className: "flex-none text-[11px] font-bold text-white/75", children: [group.totalPoints, " \u0111i\u1EC3m"] }))] }), group.parts.map((part, index) => (_jsx(PartRow, { part: part, showSkill: false }, part.id || `${group.key}-${index}`)))] }, group.key))) }) })] })) : (passScore > 0 && (_jsxs("div", { className: "mt-1.5 flex shrink-0 items-center gap-3 rounded-xl bg-[#0000001c] px-3 py-2.5", children: [_jsx("span", { className: "flex h-9 w-9 flex-none items-center justify-center rounded-full bg-[#00000021] text-white", children: _jsx(Target, { className: "h-4 w-4" }) }), _jsx("span", { className: "text-sm font-bold text-white md:text-base", children: "\u0110i\u1EC3m t\u1ED1i thi\u1EC3u c\u1EA7n \u0111\u1EA1t" }), _jsxs("span", { className: "ml-auto text-sm font-black text-yellow-300 md:text-lg", children: [passScore, "/", maxScore] })] })))] }), _jsx("div", { className: "relative hidden flex-[0_0_42%] md:block", children: _jsx("div", { className: "absolute left-0 top-[4%] z-20 max-w-[60%]", children: _jsxs("div", { className: "relative rounded-2xl bg-white px-3 py-2 text-center text-[11px] font-semibold text-sky-900 shadow-xl ring-2 ring-sky-200 md:text-xs", children: ["C\u00F9ng m\u00ECnh kh\u00E1m ph\u00E1 tr\u00ECnh \u0111\u1ED9 c\u1EE7a b\u1EA1n nh\u00E9!", _jsx("span", { className: "absolute -bottom-1.5 right-6 h-3 w-3 rotate-45 bg-white ring-2 ring-sky-200" })] }) }) })] }), _jsx("div", { className: "pointer-events-none absolute inset-x-[9%] bottom-[6%] z-20 flex justify-center", children: _jsx("div", { className: "pointer-events-auto", children: _jsx(StartOvalButton, { onClick: onStart, isStarting: isStarting, showCountdown: showCountdown, autoStartCountdown: autoStartCountdown }) }) })] })] }) }), _jsxs("button", { type: "button", onClick: () => setFaqOpen(true), "aria-label": "C\u00E2u h\u1ECFi th\u01B0\u1EDDng g\u1EB7p", className: "group fixed bottom-5 right-5 z-40 inline-flex cursor-pointer items-center gap-2 rounded-full bg-gradient-to-b from-cyan-300 via-sky-500 to-sky-700 px-4 py-3 text-sm font-bold text-white shadow-[0_6px_0_0_#0c4a6e,0_10px_22px_rgba(14,165,233,0.45)] ring-2 ring-cyan-200/50 transition-all duration-150 hover:-translate-y-0.5 hover:brightness-110 active:translate-y-1 active:shadow-[0_1px_0_0_#0c4a6e,0_3px_8px_rgba(14,165,233,0.3)]", children: [_jsx(HelpCircle, { className: "h-5 w-5", strokeWidth: 2.5 }), _jsx("span", { className: "hidden sm:inline", style: { textShadow: '0 1px 0 rgba(12,74,110,0.5)' }, children: "C\u00E2u h\u1ECFi th\u01B0\u1EDDng g\u1EB7p" })] }), faqOpen && (_jsxs("div", { className: "fixed inset-0 z-[60] flex items-center justify-center p-4", role: "dialog", "aria-modal": "true", "aria-label": "C\u00E2u h\u1ECFi th\u01B0\u1EDDng g\u1EB7p", children: [_jsx("div", { className: "absolute inset-0 bg-blue-950/70 backdrop-blur-sm", onClick: () => setFaqOpen(false) }), _jsxs("div", { className: "relative z-10 flex max-h-[85vh] w-full max-w-2xl flex-col overflow-hidden rounded-3xl bg-gradient-to-br from-cyan-300/20 via-white/5 to-white/0 p-px shadow-[0_20px_60px_-15px_rgba(10,75,140,0.7)] backdrop-blur-xl", children: [_jsx("div", { className: "pointer-events-none absolute -left-12 -top-12 h-40 w-40 rounded-full bg-cyan-400/30 blur-3xl" }), _jsx("div", { className: "pointer-events-none absolute -right-12 -bottom-12 h-40 w-40 rounded-full bg-sky-500/25 blur-3xl" }), _jsxs("div", { className: "relative flex max-h-[85vh] flex-col overflow-hidden rounded-[calc(1.5rem-1px)] bg-gradient-to-b from-[#0e3d70]/95 via-[#0a4b8c]/95 to-[#0a3866]/95 ring-1 ring-cyan-300/20", children: [_jsxs("div", { className: "flex items-center gap-3 px-6 py-5", children: [_jsx("div", { className: "flex h-12 w-12 flex-none items-center justify-center rounded-full bg-gradient-to-br from-cyan-300 to-sky-600 shadow-[0_6px_18px_-4px_rgba(34,211,238,0.6)] ring-4 ring-cyan-300/20", children: _jsx(HelpCircle, { className: "h-6 w-6 text-white", strokeWidth: 2.5 }) }), _jsxs("div", { className: "flex-1", children: [_jsx("h2", { className: "text-lg font-extrabold tracking-tight text-white drop-shadow-md", children: "C\u00E2u h\u1ECFi th\u01B0\u1EDDng g\u1EB7p" }), _jsx("p", { className: "mt-0.5 text-xs font-medium text-cyan-100/70", children: "Nh\u1EEFng \u0111i\u1EC1u c\u1EA7n bi\u1EBFt tr\u01B0\u1EDBc khi l\u00E0m b\u00E0i" })] }), _jsx("button", { type: "button", onClick: () => setFaqOpen(false), "aria-label": "\u0110\u00F3ng", className: "flex h-9 w-9 flex-none cursor-pointer items-center justify-center rounded-full bg-white/10 text-white/80 ring-1 ring-white/15 transition-all duration-150 hover:bg-white/20 hover:text-white", children: _jsx(X, { className: "h-5 w-5" }) })] }), _jsx("div", { className: "mx-6 h-px bg-gradient-to-r from-transparent via-cyan-300/25 to-transparent" }), _jsx("div", { className: "flex-1 overflow-y-auto px-4 py-4 sm:px-6", children: _jsx("ul", { className: "space-y-2", children: FAQS.map((item, idx) => {
105
+ const isOpen = openIndex === idx;
106
+ return (_jsxs("li", { className: `overflow-hidden rounded-2xl ring-1 transition-colors duration-200 ${isOpen
107
+ ? 'bg-white/[0.08] ring-cyan-300/30'
108
+ : 'bg-white/[0.04] ring-white/10 hover:bg-white/[0.06]'}`, children: [_jsxs("button", { type: "button", onClick: () => setOpenIndex(isOpen ? null : idx), className: "flex w-full cursor-pointer items-center gap-3 px-4 py-3 text-left", "aria-expanded": isOpen, children: [_jsx("span", { className: `flex h-7 w-7 flex-none items-center justify-center rounded-full text-xs font-black transition-colors ${isOpen
109
+ ? 'bg-gradient-to-br from-yellow-300 to-orange-500 text-white'
110
+ : 'bg-white/10 text-cyan-100'}`, children: idx + 1 }), _jsx("span", { className: "flex-1 text-sm font-bold text-white", children: item.q }), _jsx(ChevronDown, { className: `h-5 w-5 flex-none text-cyan-200 transition-transform duration-200 ${isOpen ? 'rotate-180' : ''}` })] }), _jsx("div", { className: `grid transition-all duration-200 ${isOpen ? 'grid-rows-[1fr] opacity-100' : 'grid-rows-[0fr] opacity-0'}`, children: _jsx("div", { className: "overflow-hidden", children: _jsx("p", { className: "px-4 pb-4 pl-14 text-sm leading-relaxed text-cyan-50/90", children: item.a }) }) })] }, idx));
111
+ }) }) }), _jsx("div", { className: "border-t border-white/10 bg-white/[0.03] px-6 py-3 text-center text-xs text-cyan-100/60", children: "C\u1EA7n h\u1ED7 tr\u1EE3 th\u00EAm? Li\u00EAn h\u1EC7 trung t\u00E2m Ocean Edu \u0111\u1EC3 \u0111\u01B0\u1EE3c gi\u1EA3i \u0111\u00E1p." })] })] })] }))] }));
112
+ }
113
+ function StatCard({ icon, value, label, }) {
114
+ return (_jsxs("div", { className: "flex items-center justify-center gap-2 rounded-2xl bg-black/25 px-2 py-2 ring-1 ring-white/10 shadow-inner", children: [_jsx("span", { className: "flex h-8 w-8 flex-none items-center justify-center rounded-full bg-cyan-400/20 text-cyan-200 ring-1 ring-cyan-300/30 md:h-9 md:w-9", children: icon }), _jsxs("div", { className: "flex flex-col items-start leading-tight", children: [_jsx("div", { className: "text-xl font-black text-white md:text-2xl", children: value }), _jsx("div", { className: "text-[11px] font-extrabold text-cyan-100/95 md:text-xs", children: label })] })] }));
115
+ }
116
+ function StartOvalButton({ onClick, isStarting, showCountdown, autoStartCountdown, }) {
117
+ if (showCountdown) {
118
+ return (_jsx("div", { className: "inline-flex h-14 w-48 items-center justify-center rounded-full bg-yellow-400 text-2xl font-black text-[#1a3a6e]", children: autoStartCountdown }));
119
+ }
120
+ return (_jsxs("button", { onClick: onClick, disabled: isStarting, className: "group relative inline-flex cursor-pointer items-center gap-3 rounded-full bg-gradient-to-b from-[#ffd54a] via-[#ffb733] to-[#ff8a1f] py-2.5 pl-8 pr-10 shadow-[0_6px_0_0_#c46410,0_10px_18px_rgba(0,0,0,0.4)] ring-2 ring-orange-300/60 transition-all duration-150 hover:-translate-y-0.5 hover:brightness-110 hover:shadow-[0_8px_0_0_#c46410,0_14px_22px_rgba(0,0,0,0.45)] active:translate-y-1.5 active:shadow-[0_1px_0_0_#c46410,0_2px_6px_rgba(0,0,0,0.3)] disabled:cursor-not-allowed disabled:opacity-70", children: [isStarting ? (_jsx(Loader2, { className: "h-7 w-7 animate-spin text-white" })) : (_jsx(Image, { src: rocketImage, alt: "", width: 36, height: 36, unoptimized: true })), _jsx("span", { className: "text-xl font-black text-white", style: { color: '#685030' }, children: "B\u1EAFt \u0111\u1EA7u" })] }));
121
+ }
@@ -1 +1,37 @@
1
- "use client";import{jsx as e,jsxs as t}from"react/jsx-runtime";import a from"next/image";import{ROUTES as s}from"../../../../shared/constants/routes";import{CloseButton as i,ModeSelector as o,ExamInfoPanel as r,StartButton as n}from"./components";export function ThemedWaitingRoom({room:l,theme:c,onStart:d,isStarting:m,showCountdown:u,autoStartCountdown:h,closeRedirectUrl:p}){const b=l.name,g={parts:l.exam?.numberOfParts||1,duration:l.exam?.durationMinutes||15,maxScore:l.exam?.totalScore||8,passScore:l.exam?.passScore||0,examName:l.exam?.name,contestClassification:l.contest?.classification,level:l.exam?.level},f=c.visuals?.backgroundFilter??"grayscale(1) blur(10px) saturate(0.85) brightness(0.9)",v=c.visuals?.backgroundOverlay??"linear-gradient(to bottom, rgba(0, 0, 0, 0.2), transparent, rgba(0, 0, 0, 0.3))",x=c.visuals?.cardBackground??"radial-gradient(60% 60% at 50% 40%, rgba(184, 229, 157, 0.85) 0%, rgba(115, 213, 133, 0.85) 100%)";return t("div",{className:"fixed inset-0 z-50 flex items-center justify-center overflow-hidden",children:[e("div",{className:"absolute inset-0 scale-110 bg-cover bg-center",style:{backgroundImage:`url(${c.assets.background})`,filter:f}}),e("div",{className:"absolute inset-0",style:{background:v}}),t("div",{className:"relative z-10 w-[88%] max-w-2xl sm:w-[70%] md:w-[50%] lg:w-[42%]",children:[e(i,{imageSrc:c.assets.closeButton,onClick:()=>{"undefined"!=typeof window&&(window.location.href=p||s.STUDENT.CONTESTS_DISCOVER)},className:"absolute -right-3 -top-7 z-30",size:72}),t("div",{className:"absolute left-1/2 top-0 z-10 -translate-x-1/2 -translate-y-1/2",children:[e(a,{src:c.assets.titleBar,alt:"",width:260,height:56,className:"drop-shadow-lg",style:void 0,priority:!0,unoptimized:!0}),e("span",{className:"absolute mt-2.5 inset-0 flex items-center justify-center pb-1 text-sm font-extrabold tracking-wider text-white drop-shadow",children:c.displayName})]}),e("div",{className:"relative overflow-hidden rounded-3xl p-[3px] shadow-2xl",style:{background:"linear-gradient(180deg, #38bdf8 0%, #0ea5e9 35%, #0473f9 70%, #1d4ed8 100%)"},children:e("div",{className:"overflow-hidden rounded-[calc(1.5rem-3px)] ring-1 ring-white/30",children:t("div",{className:"relative p-6 pt-12 md:p-8 md:pt-14 lg:p-10 lg:pt-16",style:{background:x},children:[e("div",{className:"mb-5",children:e(o,{label:b,theme:c})}),e("div",{className:"mb-6",children:e(r,{parts:g.parts,duration:g.duration,maxScore:g.maxScore,passScore:g.passScore,examName:g.examName,contestClassification:g.contestClassification,level:g.level,theme:c})}),e("div",{className:"flex justify-center pb-2",children:e(n,{onClick:d,isLoading:m,showCountdown:u,countdown:h,rocketSrc:c.assets.startIcon,theme:c})}),e("div",{className:"pointer-events-none absolute -bottom-1 -left-1 opacity-60",children:e(a,{src:c.assets.bottomLeft,alt:"",width:80,height:80,unoptimized:!0})}),e("div",{className:"pointer-events-none absolute -bottom-1 -right-1 opacity-60",children:e(a,{src:c.assets.bottomRight,alt:"",width:80,height:80,unoptimized:!0})})]})})})]}),c.assets.feedbackButton&&e("button",{className:"absolute bottom-4 right-0 z-20 transition-transform hover:scale-105","aria-label":"Báo cáo lỗi",children:e(a,{src:c.assets.feedbackButton,alt:"Báo cáo lỗi",width:35,height:100,unoptimized:!0})})]})}
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import Image from 'next/image';
4
+ import { ROUTES } from '../../../../shared/constants/routes';
5
+ import { CloseButton, ModeSelector, ExamInfoPanel, StartButton } from './components';
6
+ export function ThemedWaitingRoom({ room, theme, onStart, isStarting, showCountdown, autoStartCountdown, closeRedirectUrl, }) {
7
+ const handleClose = () => {
8
+ if (typeof window !== 'undefined') {
9
+ window.location.href = closeRedirectUrl || ROUTES.STUDENT.CONTESTS_DISCOVER;
10
+ }
11
+ };
12
+ // Mode selector shows room name
13
+ const modeLabel = room.name;
14
+ // Extract exam info for the panel
15
+ const examInfo = {
16
+ parts: room.exam?.numberOfParts || 1,
17
+ duration: room.exam?.durationMinutes || 15,
18
+ maxScore: room.exam?.totalScore || 8,
19
+ passScore: room.exam?.passScore || 0,
20
+ examName: room.exam?.name,
21
+ contestClassification: room.contest?.classification,
22
+ level: room.exam?.level,
23
+ };
24
+ const backgroundFilter = theme.visuals?.backgroundFilter ?? 'grayscale(1) blur(10px) saturate(0.85) brightness(0.9)';
25
+ const backgroundOverlay = theme.visuals?.backgroundOverlay ??
26
+ 'linear-gradient(to bottom, rgba(0, 0, 0, 0.2), transparent, rgba(0, 0, 0, 0.3))';
27
+ const cardBackground = theme.visuals?.cardBackground ??
28
+ 'radial-gradient(60% 60% at 50% 40%, rgba(184, 229, 157, 0.85) 0%, rgba(115, 213, 133, 0.85) 100%)';
29
+ return (_jsxs("div", { className: "fixed inset-0 z-50 flex items-center justify-center overflow-hidden", children: [_jsx("div", { className: "absolute inset-0 scale-110 bg-cover bg-center", style: {
30
+ backgroundImage: `url(${theme.assets.background})`,
31
+ filter: backgroundFilter,
32
+ } }), _jsx("div", { className: "absolute inset-0", style: { background: backgroundOverlay } }), _jsxs("div", { className: "relative z-10 w-[88%] max-w-2xl sm:w-[70%] md:w-[50%] lg:w-[42%]", children: [_jsx(CloseButton, { imageSrc: theme.assets.closeButton, onClick: handleClose, className: "absolute -right-3 -top-7 z-30", size: 72 }), _jsxs("div", { className: "absolute left-1/2 top-0 z-10 -translate-x-1/2 -translate-y-1/2", children: [_jsx(Image, { src: theme.assets.titleBar, alt: "", width: 260, height: 56, className: "drop-shadow-lg", style: undefined, priority: true, unoptimized: true }), _jsx("span", { className: "absolute mt-2.5 inset-0 flex items-center justify-center pb-1 text-sm font-extrabold tracking-wider text-white drop-shadow", children: theme.displayName })] }), _jsx("div", { className: "relative overflow-hidden rounded-3xl p-[3px] shadow-2xl", style: {
33
+ background: 'linear-gradient(180deg, #38bdf8 0%, #0ea5e9 35%, #0473f9 70%, #1d4ed8 100%)',
34
+ }, children: _jsx("div", { className: "overflow-hidden rounded-[calc(1.5rem-3px)] ring-1 ring-white/30", children: _jsxs("div", { className: "relative p-6 pt-12 md:p-8 md:pt-14 lg:p-10 lg:pt-16", style: {
35
+ background: cardBackground,
36
+ }, children: [_jsx("div", { className: "mb-5", children: _jsx(ModeSelector, { label: modeLabel, theme: theme }) }), _jsx("div", { className: "mb-6", children: _jsx(ExamInfoPanel, { parts: examInfo.parts, duration: examInfo.duration, maxScore: examInfo.maxScore, passScore: examInfo.passScore, examName: examInfo.examName, contestClassification: examInfo.contestClassification, level: examInfo.level, theme: theme }) }), _jsx("div", { className: "flex justify-center pb-2", children: _jsx(StartButton, { onClick: onStart, isLoading: isStarting, showCountdown: showCountdown, countdown: autoStartCountdown, rocketSrc: theme.assets.startIcon, theme: theme }) }), _jsx("div", { className: "pointer-events-none absolute -bottom-1 -left-1 opacity-60", children: _jsx(Image, { src: theme.assets.bottomLeft, alt: "", width: 80, height: 80, unoptimized: true }) }), _jsx("div", { className: "pointer-events-none absolute -bottom-1 -right-1 opacity-60", children: _jsx(Image, { src: theme.assets.bottomRight, alt: "", width: 80, height: 80, unoptimized: true }) })] }) }) })] }), theme.assets.feedbackButton && (_jsx("button", { className: "absolute bottom-4 right-0 z-20 transition-transform hover:scale-105", "aria-label": "B\u00E1o c\u00E1o l\u1ED7i", children: _jsx(Image, { src: theme.assets.feedbackButton, alt: "B\u00E1o c\u00E1o l\u1ED7i", width: 35, height: 100, unoptimized: true }) }))] }));
37
+ }
@@ -1 +1,15 @@
1
- "use client";import{jsx as e,jsxs as a,Fragment as t}from"react/jsx-runtime";import{Loader2 as s}from"lucide-react";import{Button as l}from"../../../../components/ui/button";export function ToeicWaitingRoom({room:n,onStart:r,isStarting:i,showCountdown:d,autoStartCountdown:c,onClose:m}){return a("div",{className:"fixed inset-0 z-50 flex flex-col items-center justify-center overflow-auto bg-gradient-to-b from-slate-50 to-slate-100 px-4 py-8",children:[a("div",{className:"mb-8 text-center",children:[a("div",{className:"mb-2 inline-flex items-center gap-2 rounded-full border border-blue-200 bg-blue-50 px-4 py-1.5",children:[e("span",{className:"h-2 w-2 rounded-full bg-blue-500"}),e("span",{className:"text-xs font-semibold uppercase tracking-wider text-blue-700",children:"Ocean Edu"})]}),e("h1",{className:"text-2xl font-bold text-gray-900 sm:text-3xl",children:"TOEIC Listening and Reading Test"}),e("p",{className:"mt-2 text-gray-500",children:n.name})]}),a("div",{className:"w-full max-w-lg rounded-2xl border border-gray-200 bg-white p-6 shadow-sm sm:p-8",children:[a("div",{className:"mb-6",children:[e("h2",{className:"mb-4 text-sm font-semibold uppercase tracking-wider text-gray-400",children:"Cấu trúc bài thi"}),a("div",{className:"space-y-3",children:[a("div",{className:"rounded-lg border border-gray-100 bg-gray-50 p-4",children:[a("div",{className:"mb-2 flex items-center justify-between",children:[e("span",{className:"text-sm font-semibold text-gray-700",children:"Listening"}),e("span",{className:"text-xs font-medium text-gray-400",children:"~45 phút"})]}),e("div",{className:"flex flex-wrap gap-1.5",children:["Part 1: Photographs","Part 2: Question-Response","Part 3: Conversations"].map(a=>e("span",{className:"rounded bg-blue-100 px-2 py-0.5 text-xs text-blue-700",children:a},a))}),e("p",{className:"mt-2 text-xs text-gray-500",children:"100 câu hỏi · Nghe và chọn đáp án đúng"})]}),a("div",{className:"rounded-lg border border-gray-100 bg-gray-50 p-4",children:[a("div",{className:"mb-2 flex items-center justify-between",children:[e("span",{className:"text-sm font-semibold text-gray-700",children:"Reading"}),e("span",{className:"text-xs font-medium text-gray-400",children:"~75 phút"})]}),e("div",{className:"flex flex-wrap gap-1.5",children:["Part 5: Incomplete Sentences","Part 6: Text Completion","Part 7: Reading Comprehension"].map(a=>e("span",{className:"rounded bg-green-100 px-2 py-0.5 text-xs text-green-700",children:a},a))}),e("p",{className:"mt-2 text-xs text-gray-500",children:"100 câu hỏi · Đọc hiểu và chọn đáp án đúng"})]})]})]}),a("div",{className:"mb-6 rounded-lg border border-amber-100 bg-amber-50 p-4",children:[e("h3",{className:"mb-2 text-sm font-semibold text-amber-700",children:"Lưu ý quan trọng"}),a("ul",{className:"space-y-1 text-xs text-amber-800",children:[a("li",{className:"flex items-start gap-1.5",children:[e("span",{className:"mt-0.5 h-1.5 w-1.5 shrink-0 rounded-full bg-amber-500"}),"Không thể tạm dừng bài thi sau khi bắt đầu"]}),a("li",{className:"flex items-start gap-1.5",children:[e("span",{className:"mt-0.5 h-1.5 w-1.5 shrink-0 rounded-full bg-amber-500"}),"Không thể quay lại câu trước sau khi chuyển câu"]}),a("li",{className:"flex items-start gap-1.5",children:[e("span",{className:"mt-0.5 h-1.5 w-1.5 shrink-0 rounded-full bg-amber-500"}),"Bài thi sẽ tự động nộp khi hết thời gian 120 phút"]}),a("li",{className:"flex items-start gap-1.5",children:[e("span",{className:"mt-0.5 h-1.5 w-1.5 shrink-0 rounded-full bg-amber-500"}),"Điểm số: Listening (5–495) + Reading (5–495) = Total (10–990)"]})]})]}),e("div",{className:"mb-6 grid grid-cols-3 gap-3",children:[{label:"Tổng câu hỏi",value:"200"},{label:"Thời gian",value:"120 phút"},{label:"Thang điểm",value:"990"}].map(({label:t,value:s})=>a("div",{className:"rounded-lg bg-slate-50 p-3 text-center",children:[e("div",{className:"text-lg font-bold text-gray-900",children:s}),e("div",{className:"text-xs text-gray-400",children:t})]},t))}),e(l,{onClick:r,disabled:i,className:"h-12 w-full rounded-xl bg-blue-600 text-base font-semibold hover:bg-blue-700 disabled:cursor-not-allowed disabled:opacity-60",children:i?a(t,{children:[e(s,{className:"mr-2 h-4 w-4 animate-spin"}),"Đang khởi tạo..."]}):d?a(t,{children:["Bắt đầu sau ",c,"s..."]}):"Bắt đầu bài thi"})]}),m&&e("button",{onClick:m,className:"mt-6 text-sm text-gray-400 hover:text-gray-600",children:"Quay lại danh sách phòng thi"})]})}
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { Loader2 } from 'lucide-react';
4
+ import { Button } from '../../../../components/ui/button';
5
+ /**
6
+ * Professional waiting room for TOEIC exam entry.
7
+ * Neutral, business-appropriate design (no cartoon elements).
8
+ */
9
+ export function ToeicWaitingRoom({ room, onStart, isStarting, showCountdown, autoStartCountdown, onClose, }) {
10
+ return (_jsxs("div", { className: "fixed inset-0 z-50 flex flex-col items-center justify-center overflow-auto bg-gradient-to-b from-slate-50 to-slate-100 px-4 py-8", children: [_jsxs("div", { className: "mb-8 text-center", children: [_jsxs("div", { className: "mb-2 inline-flex items-center gap-2 rounded-full border border-blue-200 bg-blue-50 px-4 py-1.5", children: [_jsx("span", { className: "h-2 w-2 rounded-full bg-blue-500" }), _jsx("span", { className: "text-xs font-semibold uppercase tracking-wider text-blue-700", children: "Ocean Edu" })] }), _jsx("h1", { className: "text-2xl font-bold text-gray-900 sm:text-3xl", children: "TOEIC Listening and Reading Test" }), _jsx("p", { className: "mt-2 text-gray-500", children: room.name })] }), _jsxs("div", { className: "w-full max-w-lg rounded-2xl border border-gray-200 bg-white p-6 shadow-sm sm:p-8", children: [_jsxs("div", { className: "mb-6", children: [_jsx("h2", { className: "mb-4 text-sm font-semibold uppercase tracking-wider text-gray-400", children: "C\u1EA5u tr\u00FAc b\u00E0i thi" }), _jsxs("div", { className: "space-y-3", children: [_jsxs("div", { className: "rounded-lg border border-gray-100 bg-gray-50 p-4", children: [_jsxs("div", { className: "mb-2 flex items-center justify-between", children: [_jsx("span", { className: "text-sm font-semibold text-gray-700", children: "Listening" }), _jsx("span", { className: "text-xs font-medium text-gray-400", children: "~45 ph\u00FAt" })] }), _jsx("div", { className: "flex flex-wrap gap-1.5", children: ['Part 1: Photographs', 'Part 2: Question-Response', 'Part 3: Conversations'].map((p) => (_jsx("span", { className: "rounded bg-blue-100 px-2 py-0.5 text-xs text-blue-700", children: p }, p))) }), _jsx("p", { className: "mt-2 text-xs text-gray-500", children: "100 c\u00E2u h\u1ECFi \u00B7 Nghe v\u00E0 ch\u1ECDn \u0111\u00E1p \u00E1n \u0111\u00FAng" })] }), _jsxs("div", { className: "rounded-lg border border-gray-100 bg-gray-50 p-4", children: [_jsxs("div", { className: "mb-2 flex items-center justify-between", children: [_jsx("span", { className: "text-sm font-semibold text-gray-700", children: "Reading" }), _jsx("span", { className: "text-xs font-medium text-gray-400", children: "~75 ph\u00FAt" })] }), _jsx("div", { className: "flex flex-wrap gap-1.5", children: ['Part 5: Incomplete Sentences', 'Part 6: Text Completion', 'Part 7: Reading Comprehension'].map((p) => (_jsx("span", { className: "rounded bg-green-100 px-2 py-0.5 text-xs text-green-700", children: p }, p))) }), _jsx("p", { className: "mt-2 text-xs text-gray-500", children: "100 c\u00E2u h\u1ECFi \u00B7 \u0110\u1ECDc hi\u1EC3u v\u00E0 ch\u1ECDn \u0111\u00E1p \u00E1n \u0111\u00FAng" })] })] })] }), _jsxs("div", { className: "mb-6 rounded-lg border border-amber-100 bg-amber-50 p-4", children: [_jsx("h3", { className: "mb-2 text-sm font-semibold text-amber-700", children: "L\u01B0u \u00FD quan tr\u1ECDng" }), _jsxs("ul", { className: "space-y-1 text-xs text-amber-800", children: [_jsxs("li", { className: "flex items-start gap-1.5", children: [_jsx("span", { className: "mt-0.5 h-1.5 w-1.5 shrink-0 rounded-full bg-amber-500" }), "Kh\u00F4ng th\u1EC3 t\u1EA1m d\u1EEBng b\u00E0i thi sau khi b\u1EAFt \u0111\u1EA7u"] }), _jsxs("li", { className: "flex items-start gap-1.5", children: [_jsx("span", { className: "mt-0.5 h-1.5 w-1.5 shrink-0 rounded-full bg-amber-500" }), "Kh\u00F4ng th\u1EC3 quay l\u1EA1i c\u00E2u tr\u01B0\u1EDBc sau khi chuy\u1EC3n c\u00E2u"] }), _jsxs("li", { className: "flex items-start gap-1.5", children: [_jsx("span", { className: "mt-0.5 h-1.5 w-1.5 shrink-0 rounded-full bg-amber-500" }), "B\u00E0i thi s\u1EBD t\u1EF1 \u0111\u1ED9ng n\u1ED9p khi h\u1EBFt th\u1EDDi gian 120 ph\u00FAt"] }), _jsxs("li", { className: "flex items-start gap-1.5", children: [_jsx("span", { className: "mt-0.5 h-1.5 w-1.5 shrink-0 rounded-full bg-amber-500" }), "\u0110i\u1EC3m s\u1ED1: Listening (5\u2013495) + Reading (5\u2013495) = Total (10\u2013990)"] })] })] }), _jsx("div", { className: "mb-6 grid grid-cols-3 gap-3", children: [
11
+ { label: 'Tổng câu hỏi', value: '200' },
12
+ { label: 'Thời gian', value: '120 phút' },
13
+ { label: 'Thang điểm', value: '990' },
14
+ ].map(({ label, value }) => (_jsxs("div", { className: "rounded-lg bg-slate-50 p-3 text-center", children: [_jsx("div", { className: "text-lg font-bold text-gray-900", children: value }), _jsx("div", { className: "text-xs text-gray-400", children: label })] }, label))) }), _jsx(Button, { onClick: onStart, disabled: isStarting, className: "h-12 w-full rounded-xl bg-blue-600 text-base font-semibold hover:bg-blue-700 disabled:cursor-not-allowed disabled:opacity-60", children: isStarting ? (_jsxs(_Fragment, { children: [_jsx(Loader2, { className: "mr-2 h-4 w-4 animate-spin" }), "\u0110ang kh\u1EDFi t\u1EA1o..."] })) : showCountdown ? (_jsxs(_Fragment, { children: ["B\u1EAFt \u0111\u1EA7u sau ", autoStartCountdown, "s..."] })) : ('Bắt đầu bài thi') })] }), onClose && (_jsx("button", { onClick: onClose, className: "mt-6 text-sm text-gray-400 hover:text-gray-600", children: "Quay l\u1EA1i danh s\u00E1ch ph\u00F2ng thi" }))] }));
15
+ }
@@ -1 +1,80 @@
1
- import{jsx as e,jsxs as t}from"react/jsx-runtime";import{BookOpen as n,Mic as a,Headphones as r,PenLine as s,MessageSquareText as o}from"lucide-react";const l={READING:{label:"Reading",Icon:n,iconWrap:"bg-emerald-400/20 text-emerald-200 ring-emerald-300/30"},WRITING:{label:"Writing",Icon:s,iconWrap:"bg-orange-400/20 text-orange-200 ring-orange-300/30"},LISTENING:{label:"Listening",Icon:r,iconWrap:"bg-sky-400/20 text-sky-200 ring-sky-300/30"},SPEAKING:{label:"Speaking",Icon:a,iconWrap:"bg-fuchsia-400/20 text-fuchsia-200 ring-fuchsia-300/30"}},i={label:"",Icon:o,iconWrap:"bg-white/15 text-white ring-white/20"};function c(e){const t=e?.trim();return t?t.replace(/_/g," ").toLowerCase().replace(/\band\b/g,"&").replace(/\s+/g," ").trim().replace(/\b\w/g,e=>e.toUpperCase()):"Khác"}export function groupPartsByCategory(e){const t=[],n=new Map;for(const a of e){const e=a.category||a.skill||"OTHER",r=e.toUpperCase();let s=n.get(r);s||(s={key:r,label:c(e),totalPoints:0,parts:[]},n.set(r,s),t.push(r)),s.parts.push(a),a.points>0&&(s.totalPoints+=a.points)}return t.map(e=>n.get(e))}export function PartRow({part:n,showSkill:a=!0}){const r=function(e){const t=(e.skill||"").toUpperCase();if(l[t])return l[t];const n=`${e.skill??""} ${e.category??""}`.toUpperCase();for(const e of Object.keys(l))if(n.includes(e))return l[e];return i}(n),{Icon:s}=r,o=r.label,c=n.questionCount>0?`${n.questionCount} câu`:"";return t("div",{className:"flex items-center gap-3.5 rounded-xl bg-white/[0.08] px-3.5 py-2 ring-1 ring-white/15 transition-colors hover:bg-white/[0.14]",children:[e("span",{className:`flex h-9 w-9 flex-none items-center justify-center rounded-full ring-1.5 ${r.iconWrap}`,children:e(s,{className:"h-5 w-5",strokeWidth:2.5})}),t("div",{className:"min-w-0 flex-1 truncate text-base leading-snug",children:[e("span",{className:"font-black text-white",children:n.name}),a&&o&&t("span",{className:"font-bold text-cyan-100/80",children:[" · ",o]}),c&&t("span",{className:"font-bold text-yellow-200/90",children:[" · ",c]})]}),n.points>0&&t("div",{className:"flex flex-none items-baseline gap-1 rounded-lg bg-black/20 px-2 py-0.5 ring-1 ring-yellow-400/20",children:[e("span",{className:"text-lg font-black text-yellow-300 md:text-xl",children:n.points}),e("span",{className:"text-xs font-black uppercase tracking-wider text-yellow-100",children:"ĐIỂM"})]})]})}
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { BookOpen, Mic, Headphones, PenLine, MessageSquareText } from 'lucide-react';
3
+ /** Per-skill visuals so students can read the exam composition at a glance. */
4
+ const SKILL_META = {
5
+ READING: {
6
+ label: 'Reading',
7
+ Icon: BookOpen,
8
+ iconWrap: 'bg-emerald-400/20 text-emerald-200 ring-emerald-300/30',
9
+ },
10
+ WRITING: {
11
+ label: 'Writing',
12
+ Icon: PenLine,
13
+ iconWrap: 'bg-orange-400/20 text-orange-200 ring-orange-300/30',
14
+ },
15
+ LISTENING: {
16
+ label: 'Listening',
17
+ Icon: Headphones,
18
+ iconWrap: 'bg-sky-400/20 text-sky-200 ring-sky-300/30',
19
+ },
20
+ SPEAKING: {
21
+ label: 'Speaking',
22
+ Icon: Mic,
23
+ iconWrap: 'bg-fuchsia-400/20 text-fuchsia-200 ring-fuchsia-300/30',
24
+ },
25
+ };
26
+ const DEFAULT_META = {
27
+ label: '',
28
+ Icon: MessageSquareText,
29
+ iconWrap: 'bg-white/15 text-white ring-white/20',
30
+ };
31
+ function resolveMeta(part) {
32
+ const skill = (part.skill || '').toUpperCase();
33
+ if (SKILL_META[skill])
34
+ return SKILL_META[skill];
35
+ const haystack = `${part.skill ?? ''} ${part.category ?? ''}`.toUpperCase();
36
+ for (const key of Object.keys(SKILL_META)) {
37
+ if (haystack.includes(key))
38
+ return SKILL_META[key];
39
+ }
40
+ return DEFAULT_META;
41
+ }
42
+ /** "READING_AND_WRITING" -> "Reading & Writing"; "SPEAKING" -> "Speaking". */
43
+ function formatCategory(value) {
44
+ const v = value?.trim();
45
+ if (!v)
46
+ return 'Khác';
47
+ return v
48
+ .replace(/_/g, ' ')
49
+ .toLowerCase()
50
+ .replace(/\band\b/g, '&')
51
+ .replace(/\s+/g, ' ')
52
+ .trim()
53
+ .replace(/\b\w/g, (c) => c.toUpperCase());
54
+ }
55
+ /** Groups parts by their `category` (falling back to skill), preserving first-seen order. */
56
+ export function groupPartsByCategory(parts) {
57
+ const order = [];
58
+ const byKey = new Map();
59
+ for (const part of parts) {
60
+ const source = part.category || part.skill || 'OTHER';
61
+ const key = source.toUpperCase();
62
+ let group = byKey.get(key);
63
+ if (!group) {
64
+ group = { key, label: formatCategory(source), totalPoints: 0, parts: [] };
65
+ byKey.set(key, group);
66
+ order.push(key);
67
+ }
68
+ group.parts.push(part);
69
+ if (part.points > 0)
70
+ group.totalPoints += part.points;
71
+ }
72
+ return order.map((key) => byKey.get(key));
73
+ }
74
+ export function PartRow({ part, showSkill = true, }) {
75
+ const meta = resolveMeta(part);
76
+ const { Icon } = meta;
77
+ const skillLabel = meta.label;
78
+ const questionLabel = part.questionCount > 0 ? `${part.questionCount} câu` : '';
79
+ return (_jsxs("div", { className: "flex items-center gap-3.5 rounded-xl bg-white/[0.08] px-3.5 py-2 ring-1 ring-white/15 transition-colors hover:bg-white/[0.14]", children: [_jsx("span", { className: `flex h-9 w-9 flex-none items-center justify-center rounded-full ring-1.5 ${meta.iconWrap}`, children: _jsx(Icon, { className: "h-5 w-5", strokeWidth: 2.5 }) }), _jsxs("div", { className: "min-w-0 flex-1 truncate text-base leading-snug", children: [_jsx("span", { className: "font-black text-white", children: part.name }), showSkill && skillLabel && (_jsxs("span", { className: "font-bold text-cyan-100/80", children: [" \u00B7 ", skillLabel] })), questionLabel && _jsxs("span", { className: "font-bold text-yellow-200/90", children: [" \u00B7 ", questionLabel] })] }), part.points > 0 && (_jsxs("div", { className: "flex flex-none items-baseline gap-1 rounded-lg bg-black/20 px-2 py-0.5 ring-1 ring-yellow-400/20", children: [_jsx("span", { className: "text-lg font-black text-yellow-300 md:text-xl", children: part.points }), _jsx("span", { className: "text-xs font-black uppercase tracking-wider text-yellow-100", children: "\u0110I\u1EC2M" })] }))] }));
80
+ }
@@ -1 +1,6 @@
1
- "use client";import{jsx as e}from"react/jsx-runtime";import t from"next/image";export function CloseButton({imageSrc:i,onClick:r,className:a="",size:o=80,imageFilter:s}){return e("button",{onClick:r,className:`cursor-pointer transition-transform hover:scale-105 active:scale-95 ${a}`,"aria-label":"Đóng",children:e(t,{src:i,alt:"Đóng",width:o,height:o,className:"drop-shadow-lg",style:s?{filter:s}:void 0,unoptimized:!0})})}
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import Image from 'next/image';
4
+ export function CloseButton({ imageSrc, onClick, className = '', size = 80, imageFilter }) {
5
+ return (_jsx("button", { onClick: onClick, className: `cursor-pointer transition-transform hover:scale-105 active:scale-95 ${className}`, "aria-label": "\u0110\u00F3ng", children: _jsx(Image, { src: imageSrc, alt: "\u0110\u00F3ng", width: size, height: size, className: "drop-shadow-lg", style: imageFilter ? { filter: imageFilter } : undefined, unoptimized: true }) }));
6
+ }
@@ -1 +1,17 @@
1
- "use client";import{jsx as e,jsxs as t}from"react/jsx-runtime";import{Clock as l,Trophy as i,Target as n,Layers as a,FileText as r,Sparkles as s}from"lucide-react";const x={A1:{bg:"bg-emerald-100",text:"text-emerald-700",ring:"ring-emerald-300/50"},A2:{bg:"bg-teal-100",text:"text-teal-700",ring:"ring-teal-300/50"},B1:{bg:"bg-blue-100",text:"text-blue-700",ring:"ring-blue-300/50"},B2:{bg:"bg-indigo-100",text:"text-indigo-700",ring:"ring-indigo-300/50"},C1:{bg:"bg-purple-100",text:"text-purple-700",ring:"ring-purple-300/50"},C2:{bg:"bg-rose-100",text:"text-rose-700",ring:"ring-rose-300/50"}};export function ExamInfoPanel({parts:d,duration:o,maxScore:c,passScore:g,examName:m,level:h}){const b=h?x[h]||{bg:"bg-gray-100",text:"text-gray-700",ring:"ring-gray-300/50"}:null;return t("div",{className:"overflow-hidden rounded-2xl bg-[#0473f9] ring-1 ring-white/25",children:[t("div",{className:"relative flex items-center justify-between border-b border-white/15 bg-[#002249]/45 px-5 py-3",children:[e(s,{className:"absolute left-3 top-2 h-3 w-3 text-yellow-300/45"}),e("h2",{className:"text-lg font-extrabold tracking-wide text-white drop-shadow-sm",children:"Chi tiết bài thi"}),h&&b&&e("span",{className:`rounded-full px-3.5 py-1 text-xs font-bold ring-2 ${b.bg} ${b.text} ${b.ring}`,children:h})]}),t("div",{className:"space-y-3 p-4",children:[t("div",{className:"grid grid-cols-3 gap-2.5",children:[t("div",{className:"rounded-xl bg-white/15 px-2 py-3 text-center ring-1 ring-white/20",children:[e(a,{className:"mx-auto mb-1.5 h-5 w-5 text-sky-100"}),e("span",{className:"block text-2xl font-extrabold leading-none text-white",children:d}),e("span",{className:"mt-1 block text-xs font-bold text-sky-100",children:"Phần thi"})]}),t("div",{className:"rounded-xl bg-white/15 px-2 py-3 text-center ring-1 ring-white/20",children:[e(l,{className:"mx-auto mb-1.5 h-5 w-5 text-cyan-100"}),e("span",{className:"block text-2xl font-extrabold leading-none text-white",children:o}),e("span",{className:"mt-1 block text-xs font-bold text-cyan-100",children:"Phút"})]}),t("div",{className:"rounded-xl bg-white/15 px-2 py-3 text-center ring-1 ring-white/20",children:[e(i,{className:"mx-auto mb-1.5 h-5 w-5 text-indigo-100"}),e("span",{className:"block text-2xl font-extrabold leading-none text-white",children:c}),e("span",{className:"mt-1 block text-xs font-bold text-indigo-100",children:"Thang điểm"})]})]}),t("div",{className:"overflow-hidden rounded-xl bg-[#002249]/18 ring-1 ring-white/12",children:[m&&t("div",{className:"flex items-center gap-3 px-3 py-2.5",children:[e(r,{className:"h-4 w-4 shrink-0 text-yellow-300"}),e("span",{className:"text-sm font-bold text-sky-100",children:"Đề thi"}),e("span",{className:"ml-auto text-right text-sm font-extrabold text-white",children:m})]}),m&&e("div",{className:"border-t border-white/10"}),t("div",{className:"flex items-center gap-3 px-3 py-2.5",children:[e(n,{className:"h-4 w-4 shrink-0 text-yellow-300"}),e("span",{className:"text-sm font-bold text-white",children:"Điểm tối thiểu cần đạt"}),t("span",{className:"ml-auto text-base font-extrabold text-yellow-300",children:[g,"/",c]})]})]})]})]})}
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { Clock, Trophy, Target, Layers, FileText, Sparkles } from 'lucide-react';
4
+ const LEVEL_COLORS = {
5
+ A1: { bg: 'bg-emerald-100', text: 'text-emerald-700', ring: 'ring-emerald-300/50' },
6
+ A2: { bg: 'bg-teal-100', text: 'text-teal-700', ring: 'ring-teal-300/50' },
7
+ B1: { bg: 'bg-blue-100', text: 'text-blue-700', ring: 'ring-blue-300/50' },
8
+ B2: { bg: 'bg-indigo-100', text: 'text-indigo-700', ring: 'ring-indigo-300/50' },
9
+ C1: { bg: 'bg-purple-100', text: 'text-purple-700', ring: 'ring-purple-300/50' },
10
+ C2: { bg: 'bg-rose-100', text: 'text-rose-700', ring: 'ring-rose-300/50' },
11
+ };
12
+ export function ExamInfoPanel({ parts, duration, maxScore, passScore, examName, level, }) {
13
+ const levelStyle = level
14
+ ? LEVEL_COLORS[level] || { bg: 'bg-gray-100', text: 'text-gray-700', ring: 'ring-gray-300/50' }
15
+ : null;
16
+ return (_jsxs("div", { className: "overflow-hidden rounded-2xl bg-[#0473f9] ring-1 ring-white/25", children: [_jsxs("div", { className: "relative flex items-center justify-between border-b border-white/15 bg-[#002249]/45 px-5 py-3", children: [_jsx(Sparkles, { className: "absolute left-3 top-2 h-3 w-3 text-yellow-300/45" }), _jsx("h2", { className: "text-lg font-extrabold tracking-wide text-white drop-shadow-sm", children: "Chi ti\u1EBFt b\u00E0i thi" }), level && levelStyle && (_jsx("span", { className: `rounded-full px-3.5 py-1 text-xs font-bold ring-2 ${levelStyle.bg} ${levelStyle.text} ${levelStyle.ring}`, children: level }))] }), _jsxs("div", { className: "space-y-3 p-4", children: [_jsxs("div", { className: "grid grid-cols-3 gap-2.5", children: [_jsxs("div", { className: "rounded-xl bg-white/15 px-2 py-3 text-center ring-1 ring-white/20", children: [_jsx(Layers, { className: "mx-auto mb-1.5 h-5 w-5 text-sky-100" }), _jsx("span", { className: "block text-2xl font-extrabold leading-none text-white", children: parts }), _jsx("span", { className: "mt-1 block text-xs font-bold text-sky-100", children: "Ph\u1EA7n thi" })] }), _jsxs("div", { className: "rounded-xl bg-white/15 px-2 py-3 text-center ring-1 ring-white/20", children: [_jsx(Clock, { className: "mx-auto mb-1.5 h-5 w-5 text-cyan-100" }), _jsx("span", { className: "block text-2xl font-extrabold leading-none text-white", children: duration }), _jsx("span", { className: "mt-1 block text-xs font-bold text-cyan-100", children: "Ph\u00FAt" })] }), _jsxs("div", { className: "rounded-xl bg-white/15 px-2 py-3 text-center ring-1 ring-white/20", children: [_jsx(Trophy, { className: "mx-auto mb-1.5 h-5 w-5 text-indigo-100" }), _jsx("span", { className: "block text-2xl font-extrabold leading-none text-white", children: maxScore }), _jsx("span", { className: "mt-1 block text-xs font-bold text-indigo-100", children: "Thang \u0111i\u1EC3m" })] })] }), _jsxs("div", { className: "overflow-hidden rounded-xl bg-[#002249]/18 ring-1 ring-white/12", children: [examName && (_jsxs("div", { className: "flex items-center gap-3 px-3 py-2.5", children: [_jsx(FileText, { className: "h-4 w-4 shrink-0 text-yellow-300" }), _jsx("span", { className: "text-sm font-bold text-sky-100", children: "\u0110\u1EC1 thi" }), _jsx("span", { className: "ml-auto text-right text-sm font-extrabold text-white", children: examName })] })), examName && _jsx("div", { className: "border-t border-white/10" }), _jsxs("div", { className: "flex items-center gap-3 px-3 py-2.5", children: [_jsx(Target, { className: "h-4 w-4 shrink-0 text-yellow-300" }), _jsx("span", { className: "text-sm font-bold text-white", children: "\u0110i\u1EC3m t\u1ED1i thi\u1EC3u c\u1EA7n \u0111\u1EA1t" }), _jsxs("span", { className: "ml-auto text-base font-extrabold text-yellow-300", children: [passScore, "/", maxScore] })] })] })] })] }));
17
+ }
@@ -1 +1,6 @@
1
- "use client";import{jsx as e,jsxs as t}from"react/jsx-runtime";import{User as r}from"lucide-react";export function ModeSelector({label:i}){return e("div",{className:"flex justify-center",children:t("div",{className:"flex items-center gap-3 rounded-2xl bg-white/10 px-6 py-3 ring-1 ring-white/15 backdrop-blur-sm",children:[e("div",{className:"flex h-8 w-8 items-center justify-center rounded-full bg-white/15",children:e(r,{className:"h-4 w-4 text-white/80"})}),e("p",{className:"text-center text-lg font-bold uppercase leading-5 tracking-wider text-white drop-shadow-sm",children:i})]})})}
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { User } from 'lucide-react';
4
+ export function ModeSelector({ label }) {
5
+ return (_jsx("div", { className: "flex justify-center", children: _jsxs("div", { className: "flex items-center gap-3 rounded-2xl bg-white/10 px-6 py-3 ring-1 ring-white/15 backdrop-blur-sm", children: [_jsx("div", { className: "flex h-8 w-8 items-center justify-center rounded-full bg-white/15", children: _jsx(User, { className: "h-4 w-4 text-white/80" }) }), _jsx("p", { className: "text-center text-lg font-bold uppercase leading-5 tracking-wider text-white drop-shadow-sm", children: label })] }) }));
6
+ }
@@ -1 +1,12 @@
1
- "use client";import{jsx as e,jsxs as t}from"react/jsx-runtime";import a from"next/image";import{Loader2 as s}from"lucide-react";export function StartButton({onClick:i,isLoading:l,showCountdown:r,countdown:n,rocketSrc:o}){return r?t("div",{className:"flex flex-col items-center gap-4",children:[t("div",{className:"relative flex h-24 w-24 items-center justify-center",children:[e("div",{className:"absolute inset-0 animate-ping rounded-full bg-sky-400/20"}),e("div",{className:"absolute inset-0 animate-pulse rounded-full bg-blue-500/10"}),e("div",{className:"relative flex h-20 w-20 items-center justify-center rounded-full bg-[#0473f9] shadow-[0_4px_0_0_#1d4ed8]",children:e("span",{className:"text-4xl font-extrabold text-white drop-shadow",children:n})})]}),t("p",{className:"text-sm font-medium text-white/90 drop-shadow",children:["Bài thi sẽ tự động bắt đầu sau ",e("strong",{className:"text-yellow-300",children:n})," giây"]}),l&&t("div",{className:"flex items-center gap-2 rounded-full bg-white/10 px-4 py-1.5 text-white/80 backdrop-blur-sm",children:[e(s,{className:"h-4 w-4 animate-spin"}),e("span",{className:"text-sm",children:"Đang bắt đầu bài thi..."})]})]}):e("div",{className:"relative flex flex-col items-center",children:t("button",{onClick:i,disabled:l,className:"group relative flex cursor-pointer items-center gap-4 rounded-full bg-[#0473f9] px-10 py-4 shadow-[0_5px_0_0_#1d4ed8] transition-all duration-150 hover:brightness-110 active:translate-y-[3px] active:shadow-[0_2px_0_0_#1d4ed8] disabled:cursor-not-allowed disabled:opacity-50",children:[e("div",{className:"relative h-11 w-11 transition-transform duration-300 group-hover:-translate-y-1 group-hover:rotate-[-8deg]",children:e(a,{src:o,alt:"",fill:!0,className:"object-contain drop-shadow",unoptimized:!0})}),e("span",{className:"text-xl font-extrabold tracking-wide text-white drop-shadow-sm",children:"Bắt đầu"}),l&&e(s,{className:"h-5 w-5 animate-spin text-white/80"})]})})}
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import Image from 'next/image';
4
+ import { Loader2 } from 'lucide-react';
5
+ export function StartButton({ onClick, isLoading, showCountdown, countdown, rocketSrc, }) {
6
+ // Show countdown state
7
+ if (showCountdown) {
8
+ return (_jsxs("div", { className: "flex flex-col items-center gap-4", children: [_jsxs("div", { className: "relative flex h-24 w-24 items-center justify-center", children: [_jsx("div", { className: "absolute inset-0 animate-ping rounded-full bg-sky-400/20" }), _jsx("div", { className: "absolute inset-0 animate-pulse rounded-full bg-blue-500/10" }), _jsx("div", { className: "relative flex h-20 w-20 items-center justify-center rounded-full bg-[#0473f9] shadow-[0_4px_0_0_#1d4ed8]", children: _jsx("span", { className: "text-4xl font-extrabold text-white drop-shadow", children: countdown }) })] }), _jsxs("p", { className: "text-sm font-medium text-white/90 drop-shadow", children: ["B\u00E0i thi s\u1EBD t\u1EF1 \u0111\u1ED9ng b\u1EAFt \u0111\u1EA7u sau ", _jsx("strong", { className: "text-yellow-300", children: countdown }), " gi\u00E2y"] }), isLoading && (_jsxs("div", { className: "flex items-center gap-2 rounded-full bg-white/10 px-4 py-1.5 text-white/80 backdrop-blur-sm", children: [_jsx(Loader2, { className: "h-4 w-4 animate-spin" }), _jsx("span", { className: "text-sm", children: "\u0110ang b\u1EAFt \u0111\u1EA7u b\u00E0i thi..." })] }))] }));
9
+ }
10
+ // Default start button — raised 3D style matching theme
11
+ return (_jsx("div", { className: "relative flex flex-col items-center", children: _jsxs("button", { onClick: onClick, disabled: isLoading, className: "group relative flex cursor-pointer items-center gap-4 rounded-full bg-[#0473f9] px-10 py-4 shadow-[0_5px_0_0_#1d4ed8] transition-all duration-150 hover:brightness-110 active:translate-y-[3px] active:shadow-[0_2px_0_0_#1d4ed8] disabled:cursor-not-allowed disabled:opacity-50", children: [_jsx("div", { className: "relative h-11 w-11 transition-transform duration-300 group-hover:-translate-y-1 group-hover:rotate-[-8deg]", children: _jsx(Image, { src: rocketSrc, alt: "", fill: true, className: "object-contain drop-shadow", unoptimized: true }) }), _jsx("span", { className: "text-xl font-extrabold tracking-wide text-white drop-shadow-sm", children: "B\u1EAFt \u0111\u1EA7u" }), isLoading && (_jsx(Loader2, { className: "h-5 w-5 animate-spin text-white/80" }))] }) }));
12
+ }
@@ -1 +1,4 @@
1
- export{CloseButton}from"./CloseButton";export{ModeSelector}from"./ModeSelector";export{ExamInfoPanel}from"./ExamInfoPanel";export{StartButton}from"./StartButton";
1
+ export { CloseButton } from './CloseButton';
2
+ export { ModeSelector } from './ModeSelector';
3
+ export { ExamInfoPanel } from './ExamInfoPanel';
4
+ export { StartButton } from './StartButton';
@@ -1 +1,3 @@
1
- export{ThemedWaitingRoom}from"./ThemedWaitingRoom";export{CambridgeYleWaitingRoom}from"./CambridgeYleWaitingRoom";export{PartRow,groupPartsByCategory}from"./cambridge-yle-waiting-parts";
1
+ export { ThemedWaitingRoom } from './ThemedWaitingRoom';
2
+ export { CambridgeYleWaitingRoom } from './CambridgeYleWaitingRoom';
3
+ export { PartRow, groupPartsByCategory } from './cambridge-yle-waiting-parts';
@@ -1,4 +1,5 @@
1
1
  export * from './CueCardEditor';
2
+ export * from './shared/RichTextEditor';
2
3
  export * from './exams';
3
4
  export * from './themes';
4
5
  export * from './results';
@@ -1 +1,43 @@
1
- export*from"./CueCardEditor";export*from"./exams";export*from"./themes";export*from"./results";export*from"./ui/alert-dialog";export*from"./ui/alert";export*from"./ui/avatar";export*from"./ui/badge";export*from"./ui/button";export*from"./ui/calendar";export*from"./ui/card";export*from"./ui/carousel";export*from"./ui/checkbox";export*from"./ui/collapsible";export*from"./ui/command";export*from"./ui/confirm-dialog";export*from"./ui/dialog";export*from"./ui/drawer";export*from"./ui/dropdown-menu";export*from"./ui/file-upload";export*from"./ui/form";export*from"./ui/hover-card";export*from"./ui/image-preview";export*from"./ui/input";export*from"./ui/label";export*from"./ui/language-switcher";export*from"./ui/multi-select";export*from"./ui/points-input";export*from"./ui/popover";export*from"./ui/progress";export*from"./ui/radio-group";export*from"./ui/scroll-area";export*from"./ui/select";export*from"./ui/separator";export*from"./ui/sheet";export*from"./ui/single-select";export*from"./ui/skeleton";export*from"./ui/switch";export*from"./ui/table";export*from"./ui/tabs";export*from"./ui/textarea";export*from"./ui/tooltip";
1
+ export * from './CueCardEditor';
2
+ export * from './shared/RichTextEditor';
3
+ export * from './exams';
4
+ export * from './themes';
5
+ export * from './results';
6
+ export * from './ui/alert-dialog';
7
+ export * from './ui/alert';
8
+ export * from './ui/avatar';
9
+ export * from './ui/badge';
10
+ export * from './ui/button';
11
+ export * from './ui/calendar';
12
+ export * from './ui/card';
13
+ export * from './ui/carousel';
14
+ export * from './ui/checkbox';
15
+ export * from './ui/collapsible';
16
+ export * from './ui/command';
17
+ export * from './ui/confirm-dialog';
18
+ export * from './ui/dialog';
19
+ export * from './ui/drawer';
20
+ export * from './ui/dropdown-menu';
21
+ export * from './ui/file-upload';
22
+ export * from './ui/form';
23
+ export * from './ui/hover-card';
24
+ export * from './ui/image-preview';
25
+ export * from './ui/input';
26
+ export * from './ui/label';
27
+ export * from './ui/language-switcher';
28
+ export * from './ui/multi-select';
29
+ export * from './ui/points-input';
30
+ export * from './ui/popover';
31
+ export * from './ui/progress';
32
+ export * from './ui/radio-group';
33
+ export * from './ui/scroll-area';
34
+ export * from './ui/select';
35
+ export * from './ui/separator';
36
+ export * from './ui/sheet';
37
+ export * from './ui/single-select';
38
+ export * from './ui/skeleton';
39
+ export * from './ui/switch';
40
+ export * from './ui/table';
41
+ export * from './ui/tabs';
42
+ export * from './ui/textarea';
43
+ export * from './ui/tooltip';