analytica-frontend-lib 1.6.21 → 1.6.22

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 (405) hide show
  1. package/dist/AccessReportModal/index.js +1 -1
  2. package/dist/AccessReportModal/index.mjs +1 -1
  3. package/dist/AccessibilityWidget/index.js +1 -1
  4. package/dist/AccessibilityWidget/index.mjs +1 -1
  5. package/dist/Accordation/index.js +1 -1
  6. package/dist/Accordation/index.mjs +1 -1
  7. package/dist/ActivitiesHistory/index.js +19 -19
  8. package/dist/ActivitiesHistory/index.mjs +18 -18
  9. package/dist/ActivityCardQuestionBanks/index.js +19 -19
  10. package/dist/ActivityCardQuestionBanks/index.mjs +18 -18
  11. package/dist/ActivityCardQuestionPreview/index.js +19 -19
  12. package/dist/ActivityCardQuestionPreview/index.mjs +18 -18
  13. package/dist/ActivityCreate/ActivityCreate.utils/index.js +3 -3
  14. package/dist/ActivityCreate/ActivityCreate.utils/index.mjs +2 -2
  15. package/dist/ActivityCreate/ActivityCreateContent/index.js +19 -19
  16. package/dist/ActivityCreate/ActivityCreateContent/index.mjs +18 -18
  17. package/dist/ActivityCreate/index.js +19 -19
  18. package/dist/ActivityCreate/index.mjs +18 -18
  19. package/dist/ActivityDetails/index.js +19 -19
  20. package/dist/ActivityDetails/index.mjs +18 -18
  21. package/dist/ActivityFilters/index.js +19 -19
  22. package/dist/ActivityFilters/index.mjs +18 -18
  23. package/dist/ActivityPageLayout/index.js +19 -19
  24. package/dist/ActivityPageLayout/index.mjs +18 -18
  25. package/dist/ActivityPreview/index.js +19 -19
  26. package/dist/ActivityPreview/index.mjs +18 -18
  27. package/dist/Alert/index.js +1 -1
  28. package/dist/Alert/index.mjs +1 -1
  29. package/dist/AlertDialog/index.js +1 -1
  30. package/dist/AlertDialog/index.mjs +1 -1
  31. package/dist/AlertManager/index.js +19 -19
  32. package/dist/AlertManager/index.mjs +18 -18
  33. package/dist/AlertManagerView/index.js +1 -1
  34. package/dist/AlertManagerView/index.mjs +1 -1
  35. package/dist/Alternative/index.js +1 -1
  36. package/dist/Alternative/index.mjs +1 -1
  37. package/dist/AnnouncementModal/index.js +1 -1
  38. package/dist/AnnouncementModal/index.mjs +1 -1
  39. package/dist/AnnouncementsGate/index.js +1 -1
  40. package/dist/AnnouncementsGate/index.mjs +1 -1
  41. package/dist/AnswerKeyModal/index.js +1 -1
  42. package/dist/AnswerKeyModal/index.mjs +1 -1
  43. package/dist/AppHeader/index.js +1 -1
  44. package/dist/AppHeader/index.mjs +1 -1
  45. package/dist/AppLayout/index.js +1 -1
  46. package/dist/AppLayout/index.mjs +1 -1
  47. package/dist/Avatar/index.js +1 -1
  48. package/dist/Avatar/index.mjs +1 -1
  49. package/dist/Badge/index.js +1 -1
  50. package/dist/Badge/index.mjs +1 -1
  51. package/dist/BreadcrumbMenu/index.js +1 -1
  52. package/dist/BreadcrumbMenu/index.mjs +1 -1
  53. package/dist/Button/index.js +1 -1
  54. package/dist/Button/index.mjs +1 -1
  55. package/dist/Calendar/index.js +1 -1
  56. package/dist/Calendar/index.mjs +1 -1
  57. package/dist/CalendarCard/index.js +1 -1
  58. package/dist/CalendarCard/index.mjs +1 -1
  59. package/dist/Card/index.js +1 -1
  60. package/dist/Card/index.mjs +1 -1
  61. package/dist/ChartComponents/index.js +1 -1
  62. package/dist/ChartComponents/index.mjs +1 -1
  63. package/dist/Chat/index.js +1 -1
  64. package/dist/Chat/index.mjs +1 -1
  65. package/dist/Chatbot/index.js +1 -1
  66. package/dist/Chatbot/index.mjs +1 -1
  67. package/dist/CheckBox/index.js +1 -1
  68. package/dist/CheckBox/index.mjs +1 -1
  69. package/dist/CheckBoxGroup/index.js +19 -19
  70. package/dist/CheckBoxGroup/index.mjs +18 -18
  71. package/dist/Chips/index.js +1 -1
  72. package/dist/Chips/index.mjs +1 -1
  73. package/dist/ChoroplethMap/index.js +1 -1
  74. package/dist/ChoroplethMap/index.mjs +1 -1
  75. package/dist/ColorPicker/index.js +1 -1
  76. package/dist/ColorPicker/index.mjs +1 -1
  77. package/dist/ComparatorChart/ComparatorView/index.js +1 -1
  78. package/dist/ComparatorChart/ComparatorView/index.mjs +1 -1
  79. package/dist/CorrectActivityModal/index.js +6 -6
  80. package/dist/CorrectActivityModal/index.mjs +5 -5
  81. package/dist/Divider/index.js +1 -1
  82. package/dist/Divider/index.mjs +1 -1
  83. package/dist/DownloadButton/index.js +1 -1
  84. package/dist/DownloadButton/index.mjs +1 -1
  85. package/dist/DownloadModal/index.js +1 -1
  86. package/dist/DownloadModal/index.mjs +1 -1
  87. package/dist/DragHandleButton/index.js +1 -1
  88. package/dist/DragHandleButton/index.mjs +1 -1
  89. package/dist/DropdownMenu/index.js +1 -1
  90. package/dist/DropdownMenu/index.mjs +1 -1
  91. package/dist/EmptyState/index.js +1 -1
  92. package/dist/EmptyState/index.mjs +1 -1
  93. package/dist/EnemClassroomStartModal/index.d.ts +0 -2
  94. package/dist/EnemClassroomStartModal/index.d.ts.map +1 -1
  95. package/dist/EnemClassroomStartModal/index.js +4 -6
  96. package/dist/EnemClassroomStartModal/index.js.map +1 -1
  97. package/dist/EnemClassroomStartModal/index.mjs +3 -5
  98. package/dist/EssayThemePicker/index.js +1 -1
  99. package/dist/EssayThemePicker/index.mjs +1 -1
  100. package/dist/ExamDetailsLayout/ExamDetailsPage/index.js +19 -19
  101. package/dist/ExamDetailsLayout/ExamDetailsPage/index.mjs +18 -18
  102. package/dist/ExamPageLayout/examsTableConfig/index.js +1 -1
  103. package/dist/ExamPageLayout/examsTableConfig/index.mjs +1 -1
  104. package/dist/ExamPageLayout/index.js +19 -19
  105. package/dist/ExamPageLayout/index.mjs +18 -18
  106. package/dist/FileAttachment/index.js +1 -1
  107. package/dist/FileAttachment/index.mjs +1 -1
  108. package/dist/FileDropzone/index.js +1 -1
  109. package/dist/FileDropzone/index.mjs +1 -1
  110. package/dist/Forum/index.js +4 -4
  111. package/dist/Forum/index.mjs +3 -3
  112. package/dist/HtmlMathRenderer/index.js +1 -1
  113. package/dist/HtmlMathRenderer/index.mjs +1 -1
  114. package/dist/IconButton/index.js +1 -1
  115. package/dist/IconButton/index.mjs +1 -1
  116. package/dist/IconRoundedButton/index.js +1 -1
  117. package/dist/IconRoundedButton/index.mjs +1 -1
  118. package/dist/ImagePreviewCard/index.js +1 -1
  119. package/dist/ImagePreviewCard/index.mjs +1 -1
  120. package/dist/ImageUpload/index.js +1 -1
  121. package/dist/ImageUpload/index.mjs +1 -1
  122. package/dist/LatexRenderer/index.js +1 -1
  123. package/dist/LatexRenderer/index.mjs +1 -1
  124. package/dist/LevelBar/index.js +1 -1
  125. package/dist/LevelBar/index.mjs +1 -1
  126. package/dist/Menu/index.js +1 -1
  127. package/dist/Menu/index.mjs +1 -1
  128. package/dist/MetricBox/index.js +1 -1
  129. package/dist/MetricBox/index.mjs +1 -1
  130. package/dist/Modal/index.js +1 -1
  131. package/dist/Modal/index.mjs +1 -1
  132. package/dist/ModalComponents/index.js +1 -1
  133. package/dist/ModalComponents/index.mjs +1 -1
  134. package/dist/MultiSearchSelect/index.js +1 -1
  135. package/dist/MultiSearchSelect/index.mjs +1 -1
  136. package/dist/MultipleChoice/index.js +1 -1
  137. package/dist/MultipleChoice/index.mjs +1 -1
  138. package/dist/NavButton/index.js +1 -1
  139. package/dist/NavButton/index.mjs +1 -1
  140. package/dist/NoSearchResult/index.js +1 -1
  141. package/dist/NoSearchResult/index.mjs +1 -1
  142. package/dist/NotFound/index.js +1 -1
  143. package/dist/NotFound/index.mjs +1 -1
  144. package/dist/NotificationCard/index.js +1 -1
  145. package/dist/NotificationCard/index.mjs +1 -1
  146. package/dist/PerformanceDistributionChart/index.js +1 -1
  147. package/dist/PerformanceDistributionChart/index.mjs +1 -1
  148. package/dist/PerformanceQuestionsData/index.js +1 -1
  149. package/dist/PerformanceQuestionsData/index.mjs +1 -1
  150. package/dist/PerformanceRanking/index.js +1 -1
  151. package/dist/PerformanceRanking/index.mjs +1 -1
  152. package/dist/PerformanceReport/index.js +1 -1
  153. package/dist/PerformanceReport/index.mjs +1 -1
  154. package/dist/PerformanceReportModal/index.js +1 -1
  155. package/dist/PerformanceReportModal/index.mjs +1 -1
  156. package/dist/PeriodSelector/index.js +1 -1
  157. package/dist/PeriodSelector/index.mjs +1 -1
  158. package/dist/PrintableUsersTable/index.js +19 -19
  159. package/dist/PrintableUsersTable/index.mjs +18 -18
  160. package/dist/ProficiencyChart/index.js +1 -1
  161. package/dist/ProficiencyChart/index.mjs +1 -1
  162. package/dist/ProgressBar/index.js +1 -1
  163. package/dist/ProgressBar/index.mjs +1 -1
  164. package/dist/ProgressCircle/index.js +1 -1
  165. package/dist/ProgressCircle/index.mjs +1 -1
  166. package/dist/ProgressModal/index.js +1 -1
  167. package/dist/ProgressModal/index.mjs +1 -1
  168. package/dist/QuestionsData/index.js +1 -1
  169. package/dist/QuestionsData/index.mjs +1 -1
  170. package/dist/QuestionsPerformanceCard/index.js +19 -19
  171. package/dist/QuestionsPerformanceCard/index.mjs +18 -18
  172. package/dist/Quiz/QuizResult/index.d.ts.map +1 -1
  173. package/dist/Quiz/QuizResult/index.js +4 -4
  174. package/dist/Quiz/QuizResult/index.mjs +3 -3
  175. package/dist/Quiz/TeacherFeedbackSection/index.js +3 -3
  176. package/dist/Quiz/TeacherFeedbackSection/index.mjs +2 -2
  177. package/dist/Quiz/TeacherQuestionComment/index.js +3 -3
  178. package/dist/Quiz/TeacherQuestionComment/index.mjs +2 -2
  179. package/dist/Quiz/index.d.ts.map +1 -1
  180. package/dist/Quiz/index.js +6 -6
  181. package/dist/Quiz/index.mjs +5 -5
  182. package/dist/Quiz/useQuizStore/index.d.ts +6 -0
  183. package/dist/Quiz/useQuizStore/index.d.ts.map +1 -1
  184. package/dist/Quiz/useQuizStore/index.js +2 -2
  185. package/dist/Quiz/useQuizStore/index.mjs +1 -1
  186. package/dist/QuizTimer/index.js +3 -3
  187. package/dist/QuizTimer/index.mjs +2 -2
  188. package/dist/Radio/index.js +1 -1
  189. package/dist/Radio/index.mjs +1 -1
  190. package/dist/RangeGauge/index.js +1 -1
  191. package/dist/RangeGauge/index.mjs +1 -1
  192. package/dist/RecommendedLessonCreate/index.js +19 -19
  193. package/dist/RecommendedLessonCreate/index.mjs +18 -18
  194. package/dist/RecommendedLessonDetails/index.js +1 -1
  195. package/dist/RecommendedLessonDetails/index.mjs +1 -1
  196. package/dist/RecommendedLessonsHistory/index.js +19 -19
  197. package/dist/RecommendedLessonsHistory/index.mjs +18 -18
  198. package/dist/ReportDetailModal/index.js +1 -1
  199. package/dist/ReportDetailModal/index.mjs +1 -1
  200. package/dist/RestrictedAccess/index.js +1 -1
  201. package/dist/RestrictedAccess/index.mjs +1 -1
  202. package/dist/RichEditor/index.js +3 -3
  203. package/dist/RichEditor/index.mjs +2 -2
  204. package/dist/{RichEditorCore-F5QPQLEK.js → RichEditorCore-NEIZKFKE.js} +2 -2
  205. package/dist/{RichEditorCore-F5QPQLEK.js.map → RichEditorCore-NEIZKFKE.js.map} +1 -1
  206. package/dist/{RichEditorCore-QZYPHNRY.mjs → RichEditorCore-TLAFZ5XG.mjs} +2 -2
  207. package/dist/ScoreCircle/index.js +1 -1
  208. package/dist/ScoreCircle/index.mjs +1 -1
  209. package/dist/Search/index.js +1 -1
  210. package/dist/Search/index.mjs +1 -1
  211. package/dist/SearchSelect/index.js +1 -1
  212. package/dist/SearchSelect/index.mjs +1 -1
  213. package/dist/Select/index.js +1 -1
  214. package/dist/Select/index.mjs +1 -1
  215. package/dist/SelectionButton/index.js +1 -1
  216. package/dist/SelectionButton/index.mjs +1 -1
  217. package/dist/SendActivityModal/SendActivityModal.js +19 -19
  218. package/dist/SendActivityModal/SendActivityModal.mjs +18 -18
  219. package/dist/SendActivityModal/index.js +19 -19
  220. package/dist/SendActivityModal/index.mjs +18 -18
  221. package/dist/SendLessonModal/index.js +19 -19
  222. package/dist/SendLessonModal/index.mjs +18 -18
  223. package/dist/SimpleBarChart/index.js +1 -1
  224. package/dist/SimpleBarChart/index.mjs +1 -1
  225. package/dist/SimulatedPerformance/SimulatedPerformanceView/index.js +19 -19
  226. package/dist/SimulatedPerformance/SimulatedPerformanceView/index.mjs +18 -18
  227. package/dist/SimulatedPerformance/useSimulatedPerformance/index.js +1 -1
  228. package/dist/SimulatedPerformance/useSimulatedPerformance/index.mjs +1 -1
  229. package/dist/SimulatedStudentSimulationsModal/index.js +19 -19
  230. package/dist/SimulatedStudentSimulationsModal/index.mjs +5 -5
  231. package/dist/SimulationsPage/index.js +19 -19
  232. package/dist/SimulationsPage/index.mjs +18 -18
  233. package/dist/Skeleton/index.js +1 -1
  234. package/dist/Skeleton/index.mjs +1 -1
  235. package/dist/StatisticsCard/index.js +1 -1
  236. package/dist/StatisticsCard/index.mjs +1 -1
  237. package/dist/Stepper/index.js +1 -1
  238. package/dist/Stepper/index.mjs +1 -1
  239. package/dist/StudentLessonProgressModal/index.js +1 -1
  240. package/dist/StudentLessonProgressModal/index.mjs +1 -1
  241. package/dist/StudentPerformanceDetailsModal/index.js +1 -1
  242. package/dist/StudentPerformanceDetailsModal/index.mjs +1 -1
  243. package/dist/StudentRanking/index.js +1 -1
  244. package/dist/StudentRanking/index.mjs +1 -1
  245. package/dist/SubjectIcons/index.js +1 -1
  246. package/dist/SubjectIcons/index.mjs +1 -1
  247. package/dist/SubjectMenuOverflow/index.js +1 -1
  248. package/dist/SubjectMenuOverflow/index.mjs +1 -1
  249. package/dist/Support/TicketModal/index.js +1 -1
  250. package/dist/Support/TicketModal/index.mjs +1 -1
  251. package/dist/Support/index.js +1 -1
  252. package/dist/Support/index.mjs +1 -1
  253. package/dist/Table/TablePagination/index.js +1 -1
  254. package/dist/Table/TablePagination/index.mjs +1 -1
  255. package/dist/Table/index.js +1 -1
  256. package/dist/Table/index.mjs +1 -1
  257. package/dist/TableProvider/index.js +19 -19
  258. package/dist/TableProvider/index.mjs +18 -18
  259. package/dist/Text/index.js +1 -1
  260. package/dist/Text/index.mjs +1 -1
  261. package/dist/TextArea/index.js +1 -1
  262. package/dist/TextArea/index.mjs +1 -1
  263. package/dist/ThemeToggle/index.js +1 -1
  264. package/dist/ThemeToggle/index.mjs +1 -1
  265. package/dist/TimeChart/index.js +1 -1
  266. package/dist/TimeChart/index.mjs +1 -1
  267. package/dist/TimeReport/index.js +1 -1
  268. package/dist/TimeReport/index.mjs +1 -1
  269. package/dist/Toast/Toaster/index.js +1 -1
  270. package/dist/Toast/Toaster/index.mjs +1 -1
  271. package/dist/Toast/index.js +1 -1
  272. package/dist/Toast/index.mjs +1 -1
  273. package/dist/ToggleSwitch/index.js +1 -1
  274. package/dist/ToggleSwitch/index.mjs +1 -1
  275. package/dist/TokenValidation/index.js +1 -1
  276. package/dist/TokenValidation/index.mjs +1 -1
  277. package/dist/Tooltip/index.js +1 -1
  278. package/dist/Tooltip/index.mjs +1 -1
  279. package/dist/TruncatedText/index.js +1 -1
  280. package/dist/TruncatedText/index.mjs +1 -1
  281. package/dist/TypeSelector/index.js +1 -1
  282. package/dist/TypeSelector/index.mjs +1 -1
  283. package/dist/UnifiedDraftModelPage/index.js +19 -19
  284. package/dist/UnifiedDraftModelPage/index.mjs +18 -18
  285. package/dist/UnifiedHistoryPage/index.js +19 -19
  286. package/dist/UnifiedHistoryPage/index.mjs +18 -18
  287. package/dist/VerticalBarChart/index.js +1 -1
  288. package/dist/VerticalBarChart/index.mjs +1 -1
  289. package/dist/VideoPlayer/index.js +1 -1
  290. package/dist/VideoPlayer/index.mjs +1 -1
  291. package/dist/Whiteboard/index.js +1 -1
  292. package/dist/Whiteboard/index.mjs +1 -1
  293. package/dist/{chunk-JBAGQ7L5.js → chunk-3VG5MEMY.js} +14 -13
  294. package/dist/chunk-3VG5MEMY.js.map +1 -0
  295. package/dist/{chunk-ED23HOE6.mjs → chunk-5NIU4XJY.mjs} +7 -6
  296. package/dist/chunk-5NIU4XJY.mjs.map +1 -0
  297. package/dist/{chunk-DDZDNGBU.mjs → chunk-64WGFT5E.mjs} +3 -1
  298. package/dist/chunk-64WGFT5E.mjs.map +1 -0
  299. package/dist/{chunk-QN32O3J3.js → chunk-6MK23BTK.js} +62 -62
  300. package/dist/{chunk-QN32O3J3.js.map → chunk-6MK23BTK.js.map} +1 -1
  301. package/dist/{chunk-XX4WE4TL.js → chunk-726PIA5M.js} +1 -1
  302. package/dist/chunk-726PIA5M.js.map +1 -0
  303. package/dist/{chunk-VZJKHIHN.mjs → chunk-7KALNPIG.mjs} +4 -4
  304. package/dist/{chunk-NQNEG4KR.mjs → chunk-7VKFZHWP.mjs} +11 -10
  305. package/dist/chunk-7VKFZHWP.mjs.map +1 -0
  306. package/dist/{chunk-GYQUB3VW.js → chunk-BBFV3NDF.js} +8 -6
  307. package/dist/chunk-BBFV3NDF.js.map +1 -0
  308. package/dist/{chunk-I3Z2BHGN.js → chunk-BJHYT75K.js} +3 -3
  309. package/dist/{chunk-I3Z2BHGN.js.map → chunk-BJHYT75K.js.map} +1 -1
  310. package/dist/{chunk-CFTQ24UT.mjs → chunk-CMYBNZ74.mjs} +2 -2
  311. package/dist/{chunk-R7NS5KFE.mjs → chunk-CWUNF7U6.mjs} +3 -3
  312. package/dist/{chunk-NAOHJW6H.mjs → chunk-DLHV7CZN.mjs} +6 -6
  313. package/dist/{chunk-7EXSCXPK.mjs → chunk-DMYETMZG.mjs} +2 -2
  314. package/dist/{chunk-RQPSA4QV.js → chunk-GQUTHDV2.js} +3 -3
  315. package/dist/{chunk-RQPSA4QV.js.map → chunk-GQUTHDV2.js.map} +1 -1
  316. package/dist/{chunk-OZWPOXVU.mjs → chunk-GVGDUCVF.mjs} +2 -2
  317. package/dist/{chunk-QFWY46XU.js → chunk-IMDS5NQL.js} +16 -16
  318. package/dist/{chunk-QFWY46XU.js.map → chunk-IMDS5NQL.js.map} +1 -1
  319. package/dist/{chunk-KYGFYAU7.js → chunk-JHN35HPH.js} +3 -3
  320. package/dist/{chunk-KYGFYAU7.js.map → chunk-JHN35HPH.js.map} +1 -1
  321. package/dist/{chunk-DMZTDCUF.js → chunk-JPQI2RIV.js} +3 -3
  322. package/dist/{chunk-DMZTDCUF.js.map → chunk-JPQI2RIV.js.map} +1 -1
  323. package/dist/{chunk-LXX5KU3O.mjs → chunk-LMDAF6LA.mjs} +2 -2
  324. package/dist/{chunk-FL4W4S6J.mjs → chunk-MOSP7FR5.mjs} +1 -1
  325. package/dist/chunk-MOSP7FR5.mjs.map +1 -0
  326. package/dist/{chunk-HZXXADG4.js → chunk-NLPBW3SW.js} +44 -43
  327. package/dist/chunk-NLPBW3SW.js.map +1 -0
  328. package/dist/{chunk-TAABXGZL.mjs → chunk-O3JP6ZMQ.mjs} +2 -2
  329. package/dist/{chunk-MFO4S7T5.js → chunk-PJOBOBNJ.js} +3 -3
  330. package/dist/{chunk-MFO4S7T5.js.map → chunk-PJOBOBNJ.js.map} +1 -1
  331. package/dist/{chunk-CWGYVJTQ.mjs → chunk-PORNR2NU.mjs} +3 -3
  332. package/dist/chunk-QF3UKRIJ.js +33 -0
  333. package/dist/chunk-QF3UKRIJ.js.map +1 -0
  334. package/dist/chunk-RAHXO5YU.mjs +33 -0
  335. package/dist/chunk-RAHXO5YU.mjs.map +1 -0
  336. package/dist/{chunk-BTZANNVO.js → chunk-RQ65U5G2.js} +3 -3
  337. package/dist/{chunk-BTZANNVO.js.map → chunk-RQ65U5G2.js.map} +1 -1
  338. package/dist/{chunk-Q56I63FO.mjs → chunk-RVGLLMWG.mjs} +2 -2
  339. package/dist/{chunk-VVRRAF6H.js → chunk-S2S7TK3L.js} +49 -36
  340. package/dist/chunk-S2S7TK3L.js.map +1 -0
  341. package/dist/{chunk-INIH23HU.js → chunk-VF6QXUX3.js} +2 -2
  342. package/dist/{chunk-INIH23HU.js.map → chunk-VF6QXUX3.js.map} +1 -1
  343. package/dist/{chunk-QWC5GC2Q.mjs → chunk-WY7V5UJN.mjs} +2 -2
  344. package/dist/{chunk-OCKO7T7L.js → chunk-XQAYZBLL.js} +3 -3
  345. package/dist/{chunk-OCKO7T7L.js.map → chunk-XQAYZBLL.js.map} +1 -1
  346. package/dist/{chunk-ATGLKKXI.js → chunk-Y7ZBWTD7.js} +17 -17
  347. package/dist/{chunk-ATGLKKXI.js.map → chunk-Y7ZBWTD7.js.map} +1 -1
  348. package/dist/{chunk-7XWWI5EY.js → chunk-YFIB3YNQ.js} +11 -11
  349. package/dist/{chunk-7XWWI5EY.js.map → chunk-YFIB3YNQ.js.map} +1 -1
  350. package/dist/{chunk-UCWTF336.mjs → chunk-YWGJAB63.mjs} +2 -2
  351. package/dist/{chunk-4MPXVPBQ.mjs → chunk-YYHS2TM6.mjs} +43 -30
  352. package/dist/chunk-YYHS2TM6.mjs.map +1 -0
  353. package/dist/components/Quiz/Quiz.utils.d.ts +8 -0
  354. package/dist/components/Quiz/Quiz.utils.d.ts.map +1 -1
  355. package/dist/hooks/useAppContent/index.js +19 -19
  356. package/dist/hooks/useAppContent/index.mjs +18 -18
  357. package/dist/hooks/useComparator/index.js +1 -1
  358. package/dist/hooks/useComparator/index.mjs +1 -1
  359. package/dist/hooks/useDraftAutoSave/index.js +3 -3
  360. package/dist/hooks/useDraftAutoSave/index.mjs +2 -2
  361. package/dist/index.js +19 -19
  362. package/dist/index.mjs +18 -18
  363. package/dist/types/enemClassroom/index.d.ts +29 -2
  364. package/dist/types/enemClassroom/index.d.ts.map +1 -1
  365. package/dist/types/enemClassroom/index.js +4 -2
  366. package/dist/types/enemClassroom/index.js.map +1 -1
  367. package/dist/types/enemClassroom/index.mjs +3 -1
  368. package/dist/types/enemClassroom.d.ts +29 -2
  369. package/dist/types/enemClassroom.d.ts.map +1 -1
  370. package/dist/types/questionTypes/index.js +1 -1
  371. package/dist/types/questionTypes/index.mjs +1 -1
  372. package/dist/utils/index.js +1 -1
  373. package/dist/utils/index.mjs +1 -1
  374. package/dist/utils/renderSubjectCell/index.js +1 -1
  375. package/dist/utils/renderSubjectCell/index.mjs +1 -1
  376. package/dist/utils/renderTextCell/index.js +1 -1
  377. package/dist/utils/renderTextCell/index.mjs +1 -1
  378. package/package.json +1 -1
  379. package/dist/chunk-4MPXVPBQ.mjs.map +0 -1
  380. package/dist/chunk-DDZDNGBU.mjs.map +0 -1
  381. package/dist/chunk-ED23HOE6.mjs.map +0 -1
  382. package/dist/chunk-FL4W4S6J.mjs.map +0 -1
  383. package/dist/chunk-GYQUB3VW.js.map +0 -1
  384. package/dist/chunk-HZXXADG4.js.map +0 -1
  385. package/dist/chunk-JBAGQ7L5.js.map +0 -1
  386. package/dist/chunk-ND5M3DZA.mjs +0 -21
  387. package/dist/chunk-ND5M3DZA.mjs.map +0 -1
  388. package/dist/chunk-NQNEG4KR.mjs.map +0 -1
  389. package/dist/chunk-NYKBCQUO.js +0 -21
  390. package/dist/chunk-NYKBCQUO.js.map +0 -1
  391. package/dist/chunk-VVRRAF6H.js.map +0 -1
  392. package/dist/chunk-XX4WE4TL.js.map +0 -1
  393. /package/dist/{RichEditorCore-QZYPHNRY.mjs.map → RichEditorCore-TLAFZ5XG.mjs.map} +0 -0
  394. /package/dist/{chunk-VZJKHIHN.mjs.map → chunk-7KALNPIG.mjs.map} +0 -0
  395. /package/dist/{chunk-CFTQ24UT.mjs.map → chunk-CMYBNZ74.mjs.map} +0 -0
  396. /package/dist/{chunk-R7NS5KFE.mjs.map → chunk-CWUNF7U6.mjs.map} +0 -0
  397. /package/dist/{chunk-NAOHJW6H.mjs.map → chunk-DLHV7CZN.mjs.map} +0 -0
  398. /package/dist/{chunk-7EXSCXPK.mjs.map → chunk-DMYETMZG.mjs.map} +0 -0
  399. /package/dist/{chunk-OZWPOXVU.mjs.map → chunk-GVGDUCVF.mjs.map} +0 -0
  400. /package/dist/{chunk-LXX5KU3O.mjs.map → chunk-LMDAF6LA.mjs.map} +0 -0
  401. /package/dist/{chunk-TAABXGZL.mjs.map → chunk-O3JP6ZMQ.mjs.map} +0 -0
  402. /package/dist/{chunk-CWGYVJTQ.mjs.map → chunk-PORNR2NU.mjs.map} +0 -0
  403. /package/dist/{chunk-Q56I63FO.mjs.map → chunk-RVGLLMWG.mjs.map} +0 -0
  404. /package/dist/{chunk-QWC5GC2Q.mjs.map → chunk-WY7V5UJN.mjs.map} +0 -0
  405. /package/dist/{chunk-UCWTF336.mjs.map → chunk-YWGJAB63.mjs.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-BTZANNVO.js","../src/utils/studentActivityCorrection/constants.ts","../src/utils/studentActivityCorrection/utils.ts","../src/utils/studentActivityCorrection/converter.ts","../src/utils/questionRenderer/components/index.tsx","../src/components/shared/TrueFalseStatementList.tsx"],"names":[],"mappings":"AAAA;AACE;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACA;ACfO,IAAM,gBAAA,EAAkB;AAAA,EAC7B,OAAA,EAAS,SAAA;AAAA,EACT,SAAA,EAAW,WAAA;AAAA,EACX,SAAA,EAAW,WAAA;AAAA;AAAA,EAEX,QAAA,EAAU;AACZ,CAAA;ADiBA;AACA;AEfO,IAAM,aAAA,EAAe,CAAC,YAAA,EAAA,GAAgD;AAC3E,EAAA,GAAA,CAAI,aAAA,IAAA,yCAAA,EAAiD,OAAO,IAAA;AAC5D,EAAA,GAAA,CAAI,aAAA,IAAA,6CAAA,EAAmD,OAAO,KAAA;AAC9D,EAAA,OAAO,IAAA;AACT,CAAA;AAOO,IAAM,gCAAA,EAAkC,CAC7C,YAAA,EAAA,GACmB;AACnB,EAAA,OAAA,CAAQ,YAAA,EAAc;AAAA,IACpB,KAAA,yCAAA;AACE,MAAA,OAAO,eAAA,CAAgB,OAAA;AAAA,IACzB,KAAA,6CAAA;AACE,MAAA,OAAO,eAAA,CAAgB,SAAA;AAAA,IACzB,KAAA,qCAAA;AACE,MAAA,OAAO,eAAA,CAAgB,SAAA;AAAA,IACzB,KAAA,6CAAA;AACE,MAAA,OAAO,eAAA,CAAgB,QAAA;AAAA,IACzB,OAAA;AACE,MAAA,OAAO,eAAA,CAAgB,SAAA;AAAA,EAC3B;AACF,CAAA;AAOO,IAAM,6BAAA,EAA+B,CAAC,MAAA,EAAA,GAA2B;AACtE,EAAA,MAAM,QAAA,EAA8D;AAAA,IAClE,CAAC,eAAA,CAAgB,OAAO,CAAA,EAAG;AAAA,MACzB,KAAA,EAAO,SAAA;AAAA,MACP,OAAA,EAAS,uBAAA;AAAA,MACT,SAAA,EAAW;AAAA,IACb,CAAA;AAAA,IACA,CAAC,eAAA,CAAgB,SAAS,CAAA,EAAG;AAAA,MAC3B,KAAA,EAAO,WAAA;AAAA,MACP,OAAA,EAAS,qBAAA;AAAA,MACT,SAAA,EAAW;AAAA,IACb,CAAA;AAAA,IACA,CAAC,eAAA,CAAgB,SAAS,CAAA,EAAG;AAAA,MAC3B,KAAA,EAAO,WAAA;AAAA,MACP,OAAA,EAAS,aAAA;AAAA,MACT,SAAA,EAAW;AAAA,IACb,CAAA;AAAA,IACA,CAAC,eAAA,CAAgB,QAAQ,CAAA,EAAG;AAAA,MAC1B,KAAA,EAAO,UAAA;AAAA,MACP,OAAA,EAAS,uBAAA;AAAA,MACT,SAAA,EAAW;AAAA,IACb;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,cAAA,EAAgB;AAAA,IACpB,KAAA,EAAO,eAAA;AAAA,IACP,OAAA,EAAS,aAAA;AAAA,IACT,SAAA,EAAW;AAAA,EACb,CAAA;AAEA,EAAA,wBAAO,OAAA,CAAQ,MAAM,CAAA,UAAK,eAAA;AAC5B,CAAA;AAQO,IAAM,gBAAA,EAAkB,CAC7B,YAAA,EAAA,GACY;AACZ,EAAA,MAAM,EAAE,OAAO,EAAA,EAAI,YAAA;AAGnB,EAAA,GAAA,CAAI,MAAA,CAAO,aAAA,IAAA,iCAAA,EAA6C;AACtD,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAA;AACT,CAAA;AAWA,IAAM,aAAA,EAAe,CAAC,EAAA,EAAA,GAIF;AAClB,EAAA,OAAO,EAAA,CAAG,UAAA,GAAa,IAAA;AACzB,CAAA;AAMA,IAAM,oBAAA,EAAsB,CAC1B,QAAA,EACA,OAAA,EAAA,GACkB;AAClB,EAAA,GAAA,CAAI,QAAA,CAAS,KAAA,IAAS,CAAA,EAAG,OAAA,6CAAA;AAEzB,EAAA,MAAM,CAAC,UAAU,EAAA,EAAI,QAAA;AACrB,EAAA,uBAAO,OAAA,mBAAQ,IAAA,mBAAK,CAAC,CAAA,EAAA,GAAM,CAAA,CAAE,GAAA,IAAO,UAAU,CAAA,6BAAG,YAAA,EAAA,0CAAA,EAAA,6CAAA;AAGnD,CAAA;AAMA,IAAM,wBAAA,EAA0B,CAC9B,QAAA,EACA,OAAA,EAAA,GACkB;AAClB,EAAA,MAAM,SAAA,EAAW,OAAA,CAAQ,KAAA,CAAM,CAAC,EAAA,EAAA,GAAO,QAAA,CAAS,GAAA,CAAI,EAAA,CAAG,EAAE,EAAA,IAAM,EAAA,CAAG,SAAS,CAAA;AAE3E,EAAA,OAAO,SAAA,EAAA,0CAAA,EAAA,6CAAA;AAGT,CAAA;AAOA,IAAM,wBAAA,EAA0B,uBAAA;AAEhC,IAAM,WAAA,EAEF;AAAA,EACF,CAAA,+BAA0B,CAAA,EAAG,mBAAA;AAAA,EAC7B,CAAA,yCAA+B,CAAA,EAAG,uBAAA;AAAA,EAClC,CAAA,yCAA+B,CAAA,EAAG;AACpC,CAAA;AAOO,IAAM,qBAAA,EAAuB,CAClC,YAAA,EAAA,GACyB;AACzB,EAAA,MAAM,EAAE,OAAO,EAAA,EAAI,YAAA;AAEnB,EAAA,GAAA,CAAI,CAAC,eAAA,CAAgB,YAAY,EAAA,GAAK,CAAC,MAAA,CAAO,OAAA,EAAS,OAAO,IAAA;AAG9D,EAAA,MAAM,aAAA,EAAe,MAAA,CAAO,OAAA,CAAQ,MAAA,CAAO,YAAY,CAAA;AACvD,EAAA,GAAA,CAAI,YAAA,CAAa,OAAA,IAAW,CAAA,EAAG,OAAO,IAAA;AAEtC,EAAA,MAAM,SAAA,EAAW,IAAI,GAAA;AAAA,qCACnB,MAAA,qBAAO,eAAA,6BAAiB,GAAA,mBAAI,CAAC,CAAA,EAAA,GAAM,CAAA,CAAE,QAAQ,GAAA,UAAK,CAAC;AAAA,EACrD,CAAA;AAEA,EAAA,GAAA,CAAI,QAAA,CAAS,KAAA,IAAS,CAAA,EAAG,OAAA,qCAAA;AAEzB,EAAA,MAAM,UAAA,EAAY,UAAA,CAAW,MAAA,CAAO,YAAY,CAAA;AAChD,EAAA,GAAA,CAAI,CAAC,SAAA,EAAW,OAAO,IAAA;AAEvB,EAAA,OAAO,SAAA,CAAU,QAAA,EAAU,YAAY,CAAA;AACzC,CAAA;AASO,IAAM,0BAAA,EAA4B,CACvC,YAAA,EAAA,GACmB;AACnB,EAAA,MAAM,EAAE,OAAO,EAAA,EAAI,YAAA;AAGnB,EAAA,GAAA,CACE,MAAA,CAAO,aAAA,IAAA,8CAAA,GACP,eAAA,CAAgB,YAAY,CAAA,EAC5B;AACA,IAAA,MAAM,oBAAA,EAAsB,oBAAA,CAAqB,YAAY,CAAA;AAC7D,IAAA,GAAA,CAAI,oBAAA,IAAwB,IAAA,EAAM;AAChC,MAAA,OAAO,+BAAA,CAAgC,mBAAmB,CAAA;AAAA,IAC5D;AAAA,EACF;AAEA,EAAA,OAAO,+BAAA,CAAgC,MAAA,CAAO,YAAY,CAAA;AAC5D,CAAA;AFvFA;AACA;AGhHA,IAAM,wBAAA,EAA0B,CAC9B,MAAA,EAAA,GACa;AACb,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,MAAA,CAAO,UAAA;AAAA,IACX,SAAA,EAAW,MAAA,CAAO,SAAA;AAAA,IAClB,YAAA,EAAc,MAAA,CAAO,YAAA;AAAA,IACrB,eAAA,EAAiB,MAAA,CAAO,eAAA;AAAA,IACxB,WAAA,EAAa,EAAA;AAAA,IACb,SAAA,EAAW,IAAA;AAAA,IACX,QAAA,EAAU,IAAA;AAAA,IACV,mBAAA,EAAqB,MAAA,CAAO,oBAAA,GAAuB,IAAA;AAAA,IACnD,iBAAA,EAAmB,MAAA,CAAO,kBAAA,GAAqB,IAAA;AAAA,IAC/C,MAAA,EAAQ,IAAA;AAAA,IACR,YAAA,EAAc,MAAA,CAAO,YAAA;AAAA,IACrB,OAAA,EAAS,MAAA,CAAO,QAAA,GAAW,CAAC,CAAA;AAAA,IAC5B,eAAA,EAAiB,MAAA,CAAO,eAAA,CAAgB,GAAA,CAAI,CAAC,MAAA,EAAA,GAAA,CAAY;AAAA,MACvD,aAAA,EAAe,MAAA,CAAO,cAAA,GAAiB;AAAA,QACrC,EAAA,EAAI,EAAA;AAAA,QACJ,IAAA,EAAM;AAAA,MACR,CAAA;AAAA,MACA,OAAA,EAAS,MAAA,CAAO,QAAA,GAAW;AAAA,QACzB,EAAA,EAAI,EAAA;AAAA,QACJ,IAAA,EAAM,EAAA;AAAA,QACN,KAAA,EAAO,EAAA;AAAA,QACP,IAAA,EAAM;AAAA,MACR,CAAA;AAAA,MACA,KAAA,EAAO,MAAA,CAAO,MAAA,GAAS;AAAA,QACrB,EAAA,EAAI,EAAA;AAAA,QACJ,IAAA,EAAM;AAAA,MACR,CAAA;AAAA,MACA,QAAA,EAAU,MAAA,CAAO,SAAA,GAAY;AAAA,QAC3B,EAAA,EAAI,EAAA;AAAA,QACJ,IAAA,EAAM;AAAA,MACR,CAAA;AAAA,MACA,OAAA,EAAS,MAAA,CAAO,QAAA,GAAW;AAAA,QACzB,EAAA,EAAI,EAAA;AAAA,QACJ,IAAA,EAAM;AAAA,MACR;AAAA,IACF,CAAA,CAAE,CAAA;AAAA,IACF,gBAAA,kBACE,MAAA,qBAAO,OAAA,6BAAS,MAAA,mBAAO,CAAC,GAAA,EAAA,GAAQ,GAAA,CAAI,SAAS,CAAA,uBAAE,GAAA,qBAAI,CAAC,GAAA,EAAA,GAAQ,GAAA,CAAI,EAAE,IAAA,GAAK,CAAC;AAAA,EAC5E,CAAA;AACF,CAAA;AAiBA,IAAM,wBAAA,EAA0B,CAC9B,MAAA,EAAA,GAAA,CACwB;AAAA,EACxB,SAAA,EACE,MAAA,CAAO,aAAA,IAAA,kCAAA,EACH,YAAA,CAAa,MAAA,CAAO,YAAY,EAAA,EAChC,IAAA;AAAA,EACN,eAAA,EAAiB,MAAA,CAAO,gBAAA,GAAmB,EAAA;AAAA,EAC3C,UAAA,mBAAY,MAAA,CAAO,UAAA,UAAc,MAAA;AAAA,EACjC,WAAA,mBAAa,MAAA,CAAO,WAAA,UAAe,MAAA;AAAA,EACnC,kBAAA,mBAAoB,MAAA,CAAO,kBAAA,UAAsB,MAAA;AAAA,EACjD,gBAAA,mBAAkB,MAAA,CAAO,gBAAA,UAAoB;AAC/C,CAAA,CAAA;AAQA,IAAM,4BAAA,EAA8B,CAClC,MAAA,EACA,KAAA,EAAA,GAC2B;AAC3B,EAAA,MAAM,SAAA,EAAW,uBAAA,CAAwB,MAAM,CAAA;AAC/C,EAAA,MAAM,WAAA,EAAa,uBAAA,CAAwB,MAAM,CAAA;AAEjD,EAAA,OAAO;AAAA,IACL,QAAA;AAAA,IACA,MAAA,EAAQ,MAAA;AAAA,IACR,cAAA,EAAgB,MAAA,EAAQ,CAAA;AAAA,IACxB;AAAA,EACF,CAAA;AACF,CAAA;AAoBO,IAAM,mCAAA,EAAqC,CAChD,WAAA,EACA,SAAA,EACA,WAAA,EACA,WAAA,EACA,UAAA,EACA,KAAA,EAAA,GACkC;AAClC,EAAA,MAAM,EAAE,OAAA,EAAS,WAAW,EAAA,EAAI,WAAA,CAAY,IAAA;AAG5C,EAAA,MAAM,aAAA,EAAe,UAAA,CAAW,cAAA;AAChC,EAAA,MAAM,eAAA,EAAiB,UAAA,CAAW,gBAAA;AAClC,EAAA,MAAM,WAAA,EAAa,UAAA,CAAW,cAAA,EAAgB,aAAA,EAAe,cAAA;AAG7D,EAAA,MAAM,UAAA,EAAsC,OAAA,CAAQ,GAAA;AAAA,IAAI,CAAC,MAAA,EAAQ,KAAA,EAAA,GAC/D,2BAAA,CAA4B,MAAA,EAAQ,KAAK;AAAA,EAC3C,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,SAAA;AAAA,IACA,WAAA;AAAA,IACA,KAAA,EAAO,MAAA,IAAU,KAAA,EAAA,mBAAa,UAAA,CAAW,KAAA,UAAS,OAAA,EAAQ,KAAA;AAAA,IAC1D,YAAA;AAAA,IACA,cAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,EACF,CAAA;AACF,CAAA;AHgDA;AACA;AIhNA,8BAAgD;AAEhD,yEAAgC;AAChC,iEAA4B;AAc8B,+CAAA;AAJnD,IAAM,eAAA,EAAiB,CAAC,MAAA,EAAA,GAAqC;AAClE,EAAA,OAAA,CAAQ,MAAA,EAAQ;AAAA,IACd,KAAA,uBAAA;AACE,MAAA,uBACE,6BAAA,8BAAC,EAAA,EAAM,OAAA,EAAQ,OAAA,EAAQ,MAAA,EAAO,SAAA,EAAU,QAAA,kBAAU,6BAAA,4BAAC,EAAA,CAAA,CAAgB,CAAA,EAAI,QAAA,EAAA,mBAAA,CAEvE,CAAA;AAAA,IAEJ,KAAA,2BAAA;AACE,MAAA,uBACE,6BAAA,8BAAC,EAAA,EAAM,OAAA,EAAQ,OAAA,EAAQ,MAAA,EAAO,OAAA,EAAQ,QAAA,kBAAU,6BAAA,oBAAC,EAAA,CAAA,CAAY,CAAA,EAAI,QAAA,EAAA,qBAAA,CAEjE,CAAA;AAAA,IAEJ,OAAA;AACE,MAAA,OAAO,IAAA;AAAA,EACX;AACF,CAAA;AA+CO,IAAM,oBAAA,EAAsB,CAAC;AAAA,EAClC,QAAA;AAAA,EACA;AACF,CAAA,EAAA,GAA6B;AAC3B,EAAA,MAAM,OAAA,EAAS,0BAAA,CAAM;AAIrB,EAAA,MAAM,kBAAA,kBACJ,MAAA,+BAAQ,oBAAA,GACR,QAAA,CAAS,kBAAA,GACT,QAAA,CAAS,UAAA,GACT,EAAA;AAGF,EAAA,MAAM,UAAA,EAAY,4CAAA,iBAA+B,CAAA;AAGjD,EAAA,MAAM,QAAA,kBAEF,MAAA,+BAGC,UAAA,GACH,QAAA,CAAS,QAAA,GACT,CAAC,CAAA;AAGH,EAAA,MAAM,cAAA,EAAwC,CAAC,CAAA;AAC/C,EAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,GAAA,EAAA,GAAQ;AACvB,IAAA,aAAA,CAAc,GAAA,CAAI,EAAE,EAAA,EAAI,GAAA,CAAI,MAAA;AAAA,EAC9B,CAAC,CAAA;AAGD,EAAA,MAAM,YAAA,EAAsC,CAAC,CAAA;AAC7C,EAAA,IAAI;AACF,IAAA,MAAM,eAAA,EAAiB,MAAA;AAGvB,IAAA,GAAA,iBAAI,cAAA,+BAAgB,aAAA,EAAa;AAC/B,MAAA,MAAA,CAAO,MAAA,CAAO,WAAA,EAAa,cAAA,CAAe,WAAW,CAAA;AAAA,IACvD,EAAA,KAAA,GAAA,iBAAW,MAAA,+BAAQ,QAAA,EAAQ;AACzB,MAAA,MAAM,OAAA,EACJ,OAAO,MAAA,CAAO,OAAA,IAAW,SAAA,EACrB,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,MAAM,EAAA,EACxB,MAAA,CAAO,MAAA;AACb,MAAA,GAAA,CAAI,OAAO,OAAA,IAAW,QAAA,EAAU;AAC9B,QAAA,MAAA,CAAO,MAAA,CAAO,WAAA,EAAa,MAAM,CAAA;AAAA,MACnC;AAAA,IACF;AAAA,EACF,EAAA,UAAQ;AAAA,EAER;AAGA,EAAA,MAAM,kBAAA,EAAoB,CAAC,QAAA,EAAA,GAAoC;AAC7D,IAAA,GAAA,CAAI,CAAC,QAAA,EAAU,OAAO,IAAA;AACtB,IAAA,wBAAO,aAAA,CAAc,QAAQ,CAAA,UAAK,MAAA;AAAA,EACpC,CAAA;AAGA,EAAA,MAAM,gBAAA,EAAkB,CAAC,aAAA,EAAA,GAAmC;AAC1D,IAAA,MAAM,iBAAA,EAAmB,WAAA,CAAY,aAAa,CAAA;AAClD,IAAA,OAAO,iBAAA,IAAqB,aAAA;AAAA,EAC9B,CAAA;AAGA,EAAA,MAAM,mBAAA,EAAqB,CAAC,aAAA,EAAA,GAA0B;AACpD,IAAA,MAAM,iBAAA,EAAmB,WAAA,CAAY,aAAa,CAAA;AAClD,IAAA,MAAM,mBAAA,EAAqB,iBAAA,CAAkB,gBAAgB,CAAA;AAC7D,IAAA,MAAM,UAAA,EAAY,eAAA,CAAgB,aAAa,CAAA;AAE/C,IAAA,GAAA,CAAI,CAAC,gBAAA,EAAkB;AACrB,MAAA,uBACE,6BAAA,MAAC,EAAA,EAAK,SAAA,EAAU,qCAAA,EACd,QAAA,kBAAA,6BAAA;AAAA,QAAC,8BAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAQ,OAAA;AAAA,UACR,MAAA,EAAO,OAAA;AAAA,UACP,SAAA,kBAAW,6BAAA,oBAAC,EAAA,CAAA,CAAY,CAAA;AAAA,UACxB,IAAA,EAAK,OAAA;AAAA,UACL,SAAA,EAAU,WAAA;AAAA,UACX,QAAA,EAAA;AAAA,QAAA;AAAA,MAED,EAAA,CACF,CAAA;AAAA,IAEJ;AAGA,IAAA,MAAM,YAAA,mBAAc,kBAAA,UAAsB,iCAAA;AAE1C,IAAA,uBACE,6BAAA,MAAC,EAAA,EAAK,SAAA,EAAU,qCAAA,EACd,QAAA,kBAAA,6BAAA;AAAA,MAAC,8BAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAQ,OAAA;AAAA,QACR,MAAA,EAAQ,UAAA,EAAY,UAAA,EAAY,OAAA;AAAA,QAChC,SAAA,EAAW,UAAA,kBAAY,6BAAA,4BAAC,EAAA,CAAA,CAAgB,EAAA,kBAAK,6BAAA,oBAAC,EAAA,CAAA,CAAY,CAAA;AAAA,QAC1D,IAAA,EAAK,OAAA;AAAA,QACL,SAAA,EAAU,WAAA;AAAA,QAET,QAAA,EAAA;AAAA,MAAA;AAAA,IACH,EAAA,CACF,CAAA;AAAA,EAEJ,CAAA;AAGA,EAAA,MAAM,oBAAA,EAAsB,CAAC,aAAA,EAAA,GAA0B;AAErD,IAAA,MAAM,kBAAA,EAAoB,iBAAA,CAAkB,aAAa,CAAA;AACzD,IAAA,MAAM,YAAA,mBAAc,iBAAA,UAAqB,mCAAA;AACzC,IAAA,uBACE,6BAAA,MAAC,EAAA,EAAK,SAAA,EAAU,0EAAA,EACb,QAAA,EAAA,YAAA,CACH,CAAA;AAAA,EAEJ,CAAA;AAGA,EAAA,MAAM,uBAAA,EAAyB,CAAC,IAAA,EAAc,eAAA,EAAA,GAA6B;AACzE,IAAA,MAAM,SAAA,EAA+D,CAAC,CAAA;AACtE,IAAA,IAAI,UAAA,EAAY,CAAA;AAChB,IAAA,MAAM,OAAA,EAAS,CAAA,EAAA,GAAM,QAAA,CAAS,MAAA;AAE9B,IAAA,MAAM,MAAA,EAAQ,sBAAA;AACd,IAAA,IAAI,KAAA;AAEJ,IAAA,MAAA,CAAA,CAAQ,MAAA,EAAQ,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,EAAA,IAAO,IAAA,EAAM;AAC1C,MAAA,MAAM,CAAC,SAAA,EAAW,aAAa,EAAA,EAAI,KAAA;AACnC,MAAA,MAAM,WAAA,EAAa,KAAA,CAAM,KAAA;AAGzB,MAAA,GAAA,CAAI,WAAA,EAAa,SAAA,EAAW;AAC1B,QAAA,QAAA,CAAS,IAAA,CAAK;AAAA,UACZ,OAAA,EAAS,IAAA,CAAK,KAAA,CAAM,SAAA,EAAW,UAAU,CAAA;AAAA,UACzC,EAAA,EAAI,CAAA,EAAA;AACL,QAAA;AACH,MAAA;AAGI,MAAA;AACF,QAAA;AACE,UAAA;AACI,UAAA;AACL,QAAA;AACI,MAAA;AACL,QAAA;AACE,UAAA;AACI,UAAA;AACL,QAAA;AACH,MAAA;AAEA,MAAA;AACF,IAAA;AAGI,IAAA;AACO,MAAA;AACP,QAAA;AACO,QAAA;AACR,MAAA;AACH,IAAA;AAEO,IAAA;AACT,EAAA;AAEK,EAAA;AAED,IAAA;AAMJ,EAAA;AAGE,EAAA;AACE,oBAAA;AACE,sBAAA;AAGA,sBAAA;AACG,QAAA;AAAA,QAAA;AACI,UAAA;AACH,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AAEC,UAAA;AAEA,QAAA;AAEL,MAAA;AACF,IAAA;AAEA,oBAAA;AACE,sBAAA;AAGA,sBAAA;AACG,QAAA;AAAA,QAAA;AACI,UAAA;AACH,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AAEC,UAAA;AAEA,QAAA;AAEL,MAAA;AACF,IAAA;AACF,EAAA;AAEJ;AJmEe;AACA;AKjQK;AAzDP;AACX,EAAA;AACA,EAAA;AACiC;AAE3B,EAAA;AAGJ,EAAA;AAGY,IAAA;AACA,IAAA;AACA,IAAA;AAGA,IAAA;AAKA,IAAA;AACA,IAAA;AAGA,IAAA;AAKJ,IAAA;AAAC,MAAA;AAAA,MAAA;AAEC,QAAA;AAEA,QAAA;AAAA,0BAAA;AAAC,YAAA;AAAA,YAAA;AACC,cAAA;AAAW,gBAAA;AACT,gBAAA;AAIF,cAAA;AAEA,cAAA;AAAA,gCAAA;AACG,kBAAA;AAAmC,kCAAA;AACc,gBAAA;AACpD,gBAAA;AAKE,cAAA;AAAA,YAAA;AAEJ,UAAA;AAEC,UAAA;AAIO,4BAAA;AAAuD,cAAA;AAC9B,cAAA;AACzB,YAAA;AACE,YAAA;AACuD,cAAA;AAChC,cAAA;AACvB,YAAA;AAEJ,UAAA;AAEuD,YAAA;AACjB,YAAA;AACtC,UAAA;AAEJ,QAAA;AAAA,MAAA;AAzCQ,MAAA;AA2CZ,IAAA;AAIR,EAAA;AAEJ;ALiSe;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-BTZANNVO.js","sourcesContent":[null,"/**\n * Question status enum for student activity correction\n * Maps from ANSWER_STATUS to a simpler status for UI display\n */\nexport const QUESTION_STATUS = {\n CORRETA: 'CORRETA',\n INCORRETA: 'INCORRETA',\n EM_BRANCO: 'EM_BRANCO',\n /** Reserved for future use - pending teacher evaluation for essay questions */\n PENDENTE: 'PENDENTE',\n} as const;\n\nexport type QuestionStatus =\n (typeof QUESTION_STATUS)[keyof typeof QUESTION_STATUS];\n","import { StatusBadgeConfig } from '@/types/activityDetails';\nimport {\n ANSWER_STATUS,\n QUESTION_TYPE,\n} from '../../components/Quiz/useQuizStore';\nimport { QUESTION_STATUS, type QuestionStatus } from './constants';\nimport type { CorrectionQuestionData } from './types';\n\n/**\n * Returns whether the answer is correct, incorrect, or null based on the answer status.\n * @param answerStatus - Answer status from ANSWER_STATUS enum\n * @returns Returns true for correct, false for incorrect, or null if undefined.\n */\nexport const getIsCorrect = (answerStatus: ANSWER_STATUS): boolean | null => {\n if (answerStatus === ANSWER_STATUS.RESPOSTA_CORRETA) return true;\n if (answerStatus === ANSWER_STATUS.RESPOSTA_INCORRETA) return false;\n return null;\n};\n\n/**\n * Map ANSWER_STATUS from Quiz to QUESTION_STATUS for correction modal\n * @param answerStatus - Answer status from QuestionResult\n * @returns QuestionStatus for UI display\n */\nexport const mapAnswerStatusToQuestionStatus = (\n answerStatus: ANSWER_STATUS\n): QuestionStatus => {\n switch (answerStatus) {\n case ANSWER_STATUS.RESPOSTA_CORRETA:\n return QUESTION_STATUS.CORRETA;\n case ANSWER_STATUS.RESPOSTA_INCORRETA:\n return QUESTION_STATUS.INCORRETA;\n case ANSWER_STATUS.NAO_RESPONDIDO:\n return QUESTION_STATUS.EM_BRANCO;\n case ANSWER_STATUS.PENDENTE_AVALIACAO:\n return QUESTION_STATUS.PENDENTE;\n default:\n return QUESTION_STATUS.EM_BRANCO;\n }\n};\n\n/**\n * Get question status badge configuration\n * @param status - Question status\n * @returns Badge configuration with label and colors\n */\nexport const getQuestionStatusBadgeConfig = (status: QuestionStatus) => {\n const configs: Partial<Record<QuestionStatus, StatusBadgeConfig>> = {\n [QUESTION_STATUS.CORRETA]: {\n label: 'Correta',\n bgColor: 'bg-success-background',\n textColor: 'text-success-800',\n },\n [QUESTION_STATUS.INCORRETA]: {\n label: 'Incorreta',\n bgColor: 'bg-error-background',\n textColor: 'text-error-800',\n },\n [QUESTION_STATUS.EM_BRANCO]: {\n label: 'Em branco',\n bgColor: 'bg-gray-100',\n textColor: 'text-gray-600',\n },\n [QUESTION_STATUS.PENDENTE]: {\n label: 'Pendente',\n bgColor: 'bg-warning-background',\n textColor: 'text-warning-800',\n },\n };\n\n const defaultConfig = {\n label: 'Sem categoria',\n bgColor: 'bg-gray-100',\n textColor: 'text-gray-600',\n };\n\n return configs[status] ?? defaultConfig;\n};\n\n/**\n * Check if question can be auto-validated based on options\n * All question types can be auto-validated except DISSERTATIVA (essay questions)\n * @param questionData - Correction question data\n * @returns true if can auto-validate, false otherwise\n */\nexport const canAutoValidate = (\n questionData: CorrectionQuestionData\n): boolean => {\n const { result } = questionData;\n\n // Only dissertative questions require manual evaluation\n if (result.questionType === QUESTION_TYPE.DISSERTATIVA) {\n return false;\n }\n\n return true;\n};\n\ntype Option = {\n id: string;\n option: string;\n isCorrect: boolean;\n};\n\n/**\n * Type predicate to check if an option has isCorrect defined\n */\nconst hasIsCorrect = (op: {\n id: string;\n option: string;\n isCorrect?: boolean | null;\n}): op is Option => {\n return op.isCorrect != null;\n};\n\n/**\n * Validate alternativa (single choice) question\n * Must select exactly one correct option\n */\nconst validateAlternativa = (\n selected: Set<string>,\n options: Option[]\n): ANSWER_STATUS => {\n if (selected.size !== 1) return ANSWER_STATUS.RESPOSTA_INCORRETA;\n\n const [selectedId] = selected;\n return options.find((o) => o.id === selectedId)?.isCorrect\n ? ANSWER_STATUS.RESPOSTA_CORRETA\n : ANSWER_STATUS.RESPOSTA_INCORRETA;\n};\n\n/**\n * Validate multipla escolha (multiple choice) question\n * Each option must match its correct state: selected if correct, not selected if incorrect\n */\nconst validateMultiplaEscolha = (\n selected: Set<string>,\n options: Option[]\n): ANSWER_STATUS => {\n const allMatch = options.every((op) => selected.has(op.id) === op.isCorrect);\n\n return allMatch\n ? ANSWER_STATUS.RESPOSTA_CORRETA\n : ANSWER_STATUS.RESPOSTA_INCORRETA;\n};\n\n/**\n * Validate verdadeiro/falso (true/false) question\n * Each statement is evaluated individually: if statement is true, must be selected;\n * if statement is false, must not be selected\n */\nconst validateVerdadeiroFalso = validateMultiplaEscolha;\n\nconst validators: Partial<\n Record<QUESTION_TYPE, (s: Set<string>, o: Option[]) => ANSWER_STATUS>\n> = {\n [QUESTION_TYPE.ALTERNATIVA]: validateAlternativa,\n [QUESTION_TYPE.MULTIPLA_ESCOLHA]: validateMultiplaEscolha,\n [QUESTION_TYPE.VERDADEIRO_FALSO]: validateVerdadeiroFalso,\n};\n\n/**\n * Auto-validate question based on selected options vs correct options\n * @param questionData - Correction question data\n * @returns ANSWER_STATUS if can determine, null otherwise\n */\nexport const autoValidateQuestion = (\n questionData: CorrectionQuestionData\n): ANSWER_STATUS | null => {\n const { result } = questionData;\n\n if (!canAutoValidate(questionData) || !result.options) return null;\n\n // Filter options to only include those with isCorrect defined\n const validOptions = result.options.filter(hasIsCorrect);\n if (validOptions.length === 0) return null;\n\n const selected = new Set(\n result.selectedOptions?.map((o) => o.optionId) ?? []\n );\n\n if (selected.size === 0) return ANSWER_STATUS.NAO_RESPONDIDO;\n\n const validator = validators[result.questionType];\n if (!validator) return null;\n\n return validator(selected, validOptions);\n};\n\n/**\n * Get question status from CorrectionQuestionData\n * Maps the result's answerStatus to QuestionStatus\n * If status is PENDENTE_AVALIACAO but can auto-validate, calculates status automatically\n * @param questionData - Correction question data\n * @returns QuestionStatus for UI display\n */\nexport const getQuestionStatusFromData = (\n questionData: CorrectionQuestionData\n): QuestionStatus => {\n const { result } = questionData;\n\n // If pending evaluation, try to auto-validate\n if (\n result.answerStatus === ANSWER_STATUS.PENDENTE_AVALIACAO &&\n canAutoValidate(questionData)\n ) {\n const autoValidatedStatus = autoValidateQuestion(questionData);\n if (autoValidatedStatus !== null) {\n return mapAnswerStatusToQuestionStatus(autoValidatedStatus);\n }\n }\n\n return mapAnswerStatusToQuestionStatus(result.answerStatus);\n};\n","import type { Question } from '../../components/Quiz/useQuizStore';\nimport { QUESTION_TYPE } from '../../components/Quiz/useQuizStore';\nimport type {\n QuestionsAnswersByStudentResponse,\n StudentActivityCorrectionData,\n CorrectionQuestionData,\n QuestionCorrection,\n} from './types';\nimport { getIsCorrect } from './utils';\n\n/**\n * Build Question object from answer data\n * @param answer - Answer data from QuestionResult\n * @returns Question object in Quiz format\n */\nconst buildQuestionFromAnswer = (\n answer: QuestionsAnswersByStudentResponse['data']['answers'][number]\n): Question => {\n return {\n id: answer.questionId,\n statement: answer.statement,\n questionType: answer.questionType,\n difficultyLevel: answer.difficultyLevel,\n description: '',\n examBoard: null,\n examYear: null,\n solutionExplanation: answer.solutionExplanation || null,\n additionalContent: answer.additionalContent || null,\n answer: null,\n answerStatus: answer.answerStatus,\n options: answer.options || [],\n knowledgeMatrix: answer.knowledgeMatrix.map((matrix) => ({\n areaKnowledge: matrix.areaKnowledge || {\n id: '',\n name: '',\n },\n subject: matrix.subject || {\n id: '',\n name: '',\n color: '',\n icon: '',\n },\n topic: matrix.topic || {\n id: '',\n name: '',\n },\n subtopic: matrix.subtopic || {\n id: '',\n name: '',\n },\n content: matrix.content || {\n id: '',\n name: '',\n },\n })),\n correctOptionIds:\n answer.options?.filter((opt) => opt.isCorrect).map((opt) => opt.id) || [],\n };\n};\n\n/**\n * Build correction data for a question\n *\n * Built for every question type, not just DISSERTATIVA: a teacher can comment on\n * any question. `isCorrect` stays null outside DISSERTATIVA because objective\n * questions are graded automatically and must not be re-graded by hand.\n *\n * The AI fields are carried through untouched rather than folded into\n * `teacherFeedback`. The modal needs both to do its job: the AI's text to\n * prefill the field the teacher edits, and the source to decide which tag to\n * show and whether saving turns an `IA` correction into an `IA + PROFESSOR` one.\n *\n * @param answer - Answer data from QuestionResult\n * @returns QuestionCorrection with the teacher's grade and/or comment\n */\nconst buildQuestionCorrection = (\n answer: QuestionsAnswersByStudentResponse['data']['answers'][number]\n): QuestionCorrection => ({\n isCorrect:\n answer.questionType === QUESTION_TYPE.DISSERTATIVA\n ? getIsCorrect(answer.answerStatus)\n : null,\n teacherFeedback: answer.teacherFeedback || '',\n aiFeedback: answer.aiFeedback ?? null,\n aiIsCorrect: answer.aiIsCorrect ?? null,\n aiCorrectionStatus: answer.aiCorrectionStatus ?? null,\n correctionSource: answer.correctionSource ?? null,\n});\n\n/**\n * Convert a single answer to CorrectionQuestionData format\n * @param answer - Answer data from QuestionResult\n * @param index - Index of the answer (0-based)\n * @returns CorrectionQuestionData formatted for the modal\n */\nconst convertAnswerToQuestionData = (\n answer: QuestionsAnswersByStudentResponse['data']['answers'][number],\n index: number\n): CorrectionQuestionData => {\n const question = buildQuestionFromAnswer(answer);\n const correction = buildQuestionCorrection(answer);\n\n return {\n question,\n result: answer,\n questionNumber: index + 1,\n correction,\n };\n};\n\n/**\n * Convert QuestionResult from API to StudentActivityCorrectionData\n * This function transforms the API response into the format expected by CorrectActivityModal\n *\n * `statistics.score` from the answers endpoint is a 0-100 percentage recomputed\n * from the per-question rows, while the students table shows the stored 0-10\n * grade. Callers that already hold the stored grade pass it as `score` so the\n * modal and the table never disagree; `null` is an explicit \"no grade yet\".\n *\n * @param apiResponse - API response with answers and statistics\n * @param studentId - Student ID\n * @param studentName - Student name\n * @param observation - Optional teacher observation\n * @param attachment - Optional attachment URL\n * @param score - Optional stored grade (0-10) that takes precedence over\n * `statistics.score`; `null` means the student has no grade yet\n * @returns StudentActivityCorrectionData formatted for the modal\n */\nexport const convertApiResponseToCorrectionData = (\n apiResponse: QuestionsAnswersByStudentResponse,\n studentId: string,\n studentName: string,\n observation?: string,\n attachment?: string,\n score?: number | null\n): StudentActivityCorrectionData => {\n const { answers, statistics } = apiResponse.data;\n\n // Calculate counts from statistics\n const correctCount = statistics.correctAnswers;\n const incorrectCount = statistics.incorrectAnswers;\n const blankCount = statistics.totalAnswered - correctCount - incorrectCount;\n\n // Convert answers to CorrectionQuestionData format\n const questions: CorrectionQuestionData[] = answers.map((answer, index) =>\n convertAnswerToQuestionData(answer, index)\n );\n\n return {\n studentId,\n studentName,\n score: score === undefined ? (statistics.score ?? null) : score,\n correctCount,\n incorrectCount,\n blankCount,\n questions,\n observation,\n attachment,\n };\n};\n","import { Fragment, useId, type ReactNode } from 'react';\nimport Badge from '../../../components/Badge/Badge';\nimport { CheckCircleIcon } from '@phosphor-icons/react/dist/csr/CheckCircle';\nimport { XCircleIcon } from '@phosphor-icons/react/dist/csr/XCircle';\nimport { cn } from '../../utils';\nimport Text from '../../../components/Text/Text';\nimport type { QuestionRendererProps } from '../types';\nimport { stripHtmlTags } from '../../stringUtils';\nimport { OptionStatus } from '../../../enums/Options';\n\n/**\n * Get status badge component\n */\nexport const getStatusBadge = (status?: OptionStatus): ReactNode => {\n switch (status) {\n case OptionStatus.CORRECT:\n return (\n <Badge variant=\"solid\" action=\"success\" iconLeft={<CheckCircleIcon />}>\n Resposta correta\n </Badge>\n );\n case OptionStatus.INCORRECT:\n return (\n <Badge variant=\"solid\" action=\"error\" iconLeft={<XCircleIcon />}>\n Resposta incorreta\n </Badge>\n );\n default:\n return null;\n }\n};\n\n/**\n * Container component for question content\n */\nexport const QuestionContainer = ({\n children,\n className,\n}: {\n children: ReactNode;\n className?: string;\n}) => {\n return (\n <div\n className={cn(\n 'bg-background rounded-t-xl px-4 pt-4 pb-[80px] h-auto flex flex-col gap-4 mb-auto',\n className\n )}\n >\n {children}\n </div>\n );\n};\n\n/**\n * Subtitle component for question sections\n */\nexport const QuestionSubTitle = ({ subTitle }: { subTitle: string }) => {\n return (\n <div className=\"px-4 pb-2 pt-6\">\n <Text size=\"md\" weight=\"bold\" color=\"text-text-950\">\n {subTitle}\n </Text>\n </div>\n );\n};\n\n/**\n * Internal component for fill in the blanks question\n * Uses useId hook to generate unique IDs\n *\n * Data structure:\n * - additionalContent: HTML text with {placeholderId} placeholders\n * - fillAnswers: Record<placeholderId, selectedOptionId> (what student chose)\n * - options: Array<{ id, option }> where id is placeholderId AND correct optionId\n * - Correctness: selectedOptionId === placeholderId means correct\n */\nexport const FillQuestionContent = ({\n question,\n result,\n}: QuestionRendererProps) => {\n const baseId = useId();\n\n // Get additionalContent (contains HTML with {placeholderId} placeholders)\n // Falls back to question.statement for older questions that may not have additionalContent\n const additionalContent =\n result?.additionalContent ||\n question.additionalContent ||\n question.statement ||\n '';\n\n // Strip HTML tags for clean text rendering\n const cleanText = stripHtmlTags(additionalContent);\n\n // Get options array (id is placeholderId, option is the text)\n const options =\n (\n result as {\n options?: Array<{ id: string; option: string; isCorrect: boolean }>;\n }\n )?.options ||\n question.options ||\n [];\n\n // Build a map of optionId -> option text for quick lookup\n const optionTextMap: Record<string, string> = {};\n options.forEach((opt) => {\n optionTextMap[opt.id] = opt.option;\n });\n\n // Get fillAnswers: Record<placeholderId, selectedOptionId>\n const fillAnswers: Record<string, string> = {};\n try {\n const resultWithFill = result as {\n fillAnswers?: Record<string, string> | null;\n };\n if (resultWithFill?.fillAnswers) {\n Object.assign(fillAnswers, resultWithFill.fillAnswers);\n } else if (result?.answer) {\n const parsed =\n typeof result.answer === 'string'\n ? JSON.parse(result.answer)\n : result.answer;\n if (typeof parsed === 'object') {\n Object.assign(fillAnswers, parsed);\n }\n }\n } catch {\n // Ignore parse errors\n }\n\n // Helper to get option text by ID - returns null if not found\n const getOptionTextById = (optionId: string): string | null => {\n if (!optionId) return null;\n return optionTextMap[optionId] ?? null;\n };\n\n // Check if answer is correct (selectedOptionId === placeholderId)\n const isAnswerCorrect = (placeholderId: string): boolean => {\n const selectedOptionId = fillAnswers[placeholderId];\n return selectedOptionId === placeholderId;\n };\n\n // Render student answer badge\n const renderStudentBadge = (placeholderId: string) => {\n const selectedOptionId = fillAnswers[placeholderId];\n const selectedOptionText = getOptionTextById(selectedOptionId);\n const isCorrect = isAnswerCorrect(placeholderId);\n\n if (!selectedOptionId) {\n return (\n <span className=\"inline-block align-middle mx-1 my-1\">\n <Badge\n variant=\"solid\"\n action=\"error\"\n iconRight={<XCircleIcon />}\n size=\"large\"\n className=\"py-1 px-2\"\n >\n Não respondido\n </Badge>\n </span>\n );\n }\n\n // Handle case where option ID exists but text is not found\n const displayText = selectedOptionText ?? 'Opção não encontrada';\n\n return (\n <span className=\"inline-block align-middle mx-1 my-1\">\n <Badge\n variant=\"solid\"\n action={isCorrect ? 'success' : 'error'}\n iconRight={isCorrect ? <CheckCircleIcon /> : <XCircleIcon />}\n size=\"large\"\n className=\"py-1 px-2\"\n >\n {displayText}\n </Badge>\n </span>\n );\n };\n\n // Render correct answer\n const renderCorrectAnswer = (placeholderId: string) => {\n // The placeholderId IS the correct option ID\n const correctOptionText = getOptionTextById(placeholderId);\n const displayText = correctOptionText ?? '[Resposta não disponível]';\n return (\n <span className=\"inline mx-1 text-success-600 font-semibold border-b-2 border-success-600\">\n {displayText}\n </span>\n );\n };\n\n // Parse text and render with elements\n const renderTextWithElements = (text: string, isCorrectAnswer: boolean) => {\n const elements: Array<{ element: string | ReactNode; id: string }> = [];\n let lastIndex = 0;\n const nextId = () => elements.length;\n\n const regex = /\\{([a-zA-Z0-9-]+)\\}/g;\n let match;\n\n while ((match = regex.exec(text)) !== null) {\n const [fullMatch, placeholderId] = match;\n const startIndex = match.index;\n\n // Add text before placeholder\n if (startIndex > lastIndex) {\n elements.push({\n element: text.slice(lastIndex, startIndex),\n id: `${baseId}-text-${nextId()}`,\n });\n }\n\n // Add the appropriate element\n if (isCorrectAnswer) {\n elements.push({\n element: renderCorrectAnswer(placeholderId),\n id: `${baseId}-answer-sheet-${nextId()}`,\n });\n } else {\n elements.push({\n element: renderStudentBadge(placeholderId),\n id: `${baseId}-student-${nextId()}`,\n });\n }\n\n lastIndex = match.index + fullMatch.length;\n }\n\n // Add remaining text\n if (lastIndex < text.length) {\n elements.push({\n element: text.slice(lastIndex),\n id: `${baseId}-text-${nextId()}`,\n });\n }\n\n return elements;\n };\n\n if (!additionalContent) {\n return (\n <div className=\"pt-2\">\n <Text size=\"md\" color=\"text-text-600\" weight=\"normal\">\n Nenhum conteúdo disponível para esta questão.\n </Text>\n </div>\n );\n }\n\n return (\n <div className=\"pt-2 space-y-4\">\n <div className=\"space-y-2\">\n <Text size=\"xs\" weight=\"normal\" color=\"text-text-500\">\n Resposta do aluno:\n </Text>\n <div className=\"p-3 bg-background-50 rounded-lg border border-border-100\">\n <Text\n as=\"div\"\n size=\"md\"\n color=\"text-text-900\"\n weight=\"normal\"\n className=\"leading-[2.5] *:inline\"\n >\n {renderTextWithElements(cleanText, false).map((element) => (\n <Fragment key={element.id}>{element.element}</Fragment>\n ))}\n </Text>\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <Text size=\"xs\" weight=\"normal\" color=\"text-text-500\">\n Gabarito:\n </Text>\n <div className=\"p-3 bg-background-50 rounded-lg border border-border-100\">\n <Text\n as=\"div\"\n size=\"md\"\n color=\"text-text-900\"\n weight=\"normal\"\n className=\"leading-[2.5] *:inline\"\n >\n {renderTextWithElements(cleanText, true).map((element) => (\n <Fragment key={element.id}>{element.element}</Fragment>\n ))}\n </Text>\n </div>\n </div>\n </div>\n );\n};\n","import { getStatusStyles } from '../Quiz/QuizContent';\nimport Text from '../Text/Text';\nimport { cn } from '../../utils/utils';\nimport { getStatusBadge } from '../../utils/questionRenderer/components';\nimport { HtmlMathRenderer } from '../HtmlMathRenderer';\nimport { TrueFalseEnum } from '../../enums/Quiz';\nimport { OptionStatus } from '../../enums/Options';\n\n/** One statement of a true/false question, already normalized for rendering. */\nexport interface TrueFalseStatement {\n id: string;\n /** Statement text; may contain HTML and LaTeX */\n statement: string;\n /** What the student marked. Null when the statement was left blank. */\n studentMark: TrueFalseEnum | null;\n /** Answer key: whether the statement is true. Null when unknown. */\n isTrue: boolean | null;\n}\n\nexport interface TrueFalseStatementListProps {\n readonly statements: readonly TrueFalseStatement[];\n /**\n * Whether the answer key may be revealed. False while the answer is still\n * pending evaluation or was never submitted.\n */\n readonly showCorrectness?: boolean;\n}\n\n/**\n * Read-only list of true/false statements with the student's mark and the\n * answer key.\n *\n * Shared by the activity correction modal and the simulation detail modal so\n * both read the same way. The two callers reach this from different payload\n * shapes — `QuestionResult.selectedOptions` in one, an option's `selectedValue`\n * in the other — and normalize into {@link TrueFalseStatement} before calling.\n *\n * @param props - Component props\n * @returns JSX element\n *\n * @example\n * ```tsx\n * <TrueFalseStatementList\n * statements={[{ id: '1', statement: 'A água ferve a 100°C', studentMark: TrueFalseEnum.VERDADEIRO, isTrue: true }]}\n * showCorrectness\n * />\n * ```\n */\nexport const TrueFalseStatementList = ({\n statements,\n showCorrectness = true,\n}: TrueFalseStatementListProps) => {\n // 97 = 'a' in ASCII\n const getLetterByIndex = (index: number) => String.fromCodePoint(97 + index);\n\n return (\n <div className=\"pt-2\">\n <div className=\"flex flex-col gap-3.5\">\n {statements.map((item, index) => {\n const hasAnswerKey = item.isTrue !== null;\n const hasAnswered = item.studentMark !== null;\n const studentMarkedTrue =\n item.studentMark === TrueFalseEnum.VERDADEIRO;\n\n const isStudentCorrect =\n hasAnswerKey && hasAnswered && studentMarkedTrue === item.isTrue;\n\n // Correctness is only shown once the answer key is known AND the\n // answer is no longer pending.\n const canShowCorrectness = showCorrectness && hasAnswerKey;\n const variantCorrect = isStudentCorrect\n ? OptionStatus.CORRECT\n : OptionStatus.INCORRECT;\n const correctAnswer = item.isTrue\n ? TrueFalseEnum.VERDADEIRO\n : TrueFalseEnum.FALSO;\n\n return (\n <section\n key={item.id || `statement-${index}`}\n className=\"flex flex-col gap-2\"\n >\n <div\n className={cn(\n 'flex flex-row justify-between items-center gap-2 p-2 rounded-md border',\n canShowCorrectness && hasAnswered\n ? getStatusStyles(variantCorrect)\n : ''\n )}\n >\n <Text as=\"span\" size=\"sm\" weight=\"normal\" color=\"text-text-900\">\n {getLetterByIndex(index).concat(') ')}\n <HtmlMathRenderer content={item.statement} inline />\n </Text>\n\n {canShowCorrectness && hasAnswered && (\n <div className=\"flex-shrink-0\">\n {getStatusBadge(variantCorrect)}\n </div>\n )}\n </div>\n\n {canShowCorrectness && (\n <span className=\"flex flex-row gap-2 items-center flex-wrap\">\n {hasAnswered ? (\n <>\n <Text size=\"2xs\" weight=\"normal\" color=\"text-text-800\">\n Resposta selecionada: {item.studentMark}\n </Text>\n {!isStudentCorrect && (\n <Text size=\"2xs\" weight=\"normal\" color=\"text-text-800\">\n | Resposta correta: {correctAnswer}\n </Text>\n )}\n </>\n ) : (\n <Text size=\"2xs\" weight=\"normal\" color=\"text-text-800\">\n Não respondida | Resposta correta: {correctAnswer}\n </Text>\n )}\n </span>\n )}\n </section>\n );\n })}\n </div>\n </div>\n );\n};\n\nexport default TrueFalseStatementList;\n"]}
1
+ {"version":3,"sources":["/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-RQ65U5G2.js","../src/utils/studentActivityCorrection/constants.ts","../src/utils/studentActivityCorrection/utils.ts","../src/utils/studentActivityCorrection/converter.ts","../src/utils/questionRenderer/components/index.tsx","../src/components/shared/TrueFalseStatementList.tsx"],"names":[],"mappings":"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","file":"/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-RQ65U5G2.js","sourcesContent":[null,"/**\n * Question status enum for student activity correction\n * Maps from ANSWER_STATUS to a simpler status for UI display\n */\nexport const QUESTION_STATUS = {\n CORRETA: 'CORRETA',\n INCORRETA: 'INCORRETA',\n EM_BRANCO: 'EM_BRANCO',\n /** Reserved for future use - pending teacher evaluation for essay questions */\n PENDENTE: 'PENDENTE',\n} as const;\n\nexport type QuestionStatus =\n (typeof QUESTION_STATUS)[keyof typeof QUESTION_STATUS];\n","import { StatusBadgeConfig } from '@/types/activityDetails';\nimport {\n ANSWER_STATUS,\n QUESTION_TYPE,\n} from '../../components/Quiz/useQuizStore';\nimport { QUESTION_STATUS, type QuestionStatus } from './constants';\nimport type { CorrectionQuestionData } from './types';\n\n/**\n * Returns whether the answer is correct, incorrect, or null based on the answer status.\n * @param answerStatus - Answer status from ANSWER_STATUS enum\n * @returns Returns true for correct, false for incorrect, or null if undefined.\n */\nexport const getIsCorrect = (answerStatus: ANSWER_STATUS): boolean | null => {\n if (answerStatus === ANSWER_STATUS.RESPOSTA_CORRETA) return true;\n if (answerStatus === ANSWER_STATUS.RESPOSTA_INCORRETA) return false;\n return null;\n};\n\n/**\n * Map ANSWER_STATUS from Quiz to QUESTION_STATUS for correction modal\n * @param answerStatus - Answer status from QuestionResult\n * @returns QuestionStatus for UI display\n */\nexport const mapAnswerStatusToQuestionStatus = (\n answerStatus: ANSWER_STATUS\n): QuestionStatus => {\n switch (answerStatus) {\n case ANSWER_STATUS.RESPOSTA_CORRETA:\n return QUESTION_STATUS.CORRETA;\n case ANSWER_STATUS.RESPOSTA_INCORRETA:\n return QUESTION_STATUS.INCORRETA;\n case ANSWER_STATUS.NAO_RESPONDIDO:\n return QUESTION_STATUS.EM_BRANCO;\n case ANSWER_STATUS.PENDENTE_AVALIACAO:\n return QUESTION_STATUS.PENDENTE;\n default:\n return QUESTION_STATUS.EM_BRANCO;\n }\n};\n\n/**\n * Get question status badge configuration\n * @param status - Question status\n * @returns Badge configuration with label and colors\n */\nexport const getQuestionStatusBadgeConfig = (status: QuestionStatus) => {\n const configs: Partial<Record<QuestionStatus, StatusBadgeConfig>> = {\n [QUESTION_STATUS.CORRETA]: {\n label: 'Correta',\n bgColor: 'bg-success-background',\n textColor: 'text-success-800',\n },\n [QUESTION_STATUS.INCORRETA]: {\n label: 'Incorreta',\n bgColor: 'bg-error-background',\n textColor: 'text-error-800',\n },\n [QUESTION_STATUS.EM_BRANCO]: {\n label: 'Em branco',\n bgColor: 'bg-gray-100',\n textColor: 'text-gray-600',\n },\n [QUESTION_STATUS.PENDENTE]: {\n label: 'Pendente',\n bgColor: 'bg-warning-background',\n textColor: 'text-warning-800',\n },\n };\n\n const defaultConfig = {\n label: 'Sem categoria',\n bgColor: 'bg-gray-100',\n textColor: 'text-gray-600',\n };\n\n return configs[status] ?? defaultConfig;\n};\n\n/**\n * Check if question can be auto-validated based on options\n * All question types can be auto-validated except DISSERTATIVA (essay questions)\n * @param questionData - Correction question data\n * @returns true if can auto-validate, false otherwise\n */\nexport const canAutoValidate = (\n questionData: CorrectionQuestionData\n): boolean => {\n const { result } = questionData;\n\n // Only dissertative questions require manual evaluation\n if (result.questionType === QUESTION_TYPE.DISSERTATIVA) {\n return false;\n }\n\n return true;\n};\n\ntype Option = {\n id: string;\n option: string;\n isCorrect: boolean;\n};\n\n/**\n * Type predicate to check if an option has isCorrect defined\n */\nconst hasIsCorrect = (op: {\n id: string;\n option: string;\n isCorrect?: boolean | null;\n}): op is Option => {\n return op.isCorrect != null;\n};\n\n/**\n * Validate alternativa (single choice) question\n * Must select exactly one correct option\n */\nconst validateAlternativa = (\n selected: Set<string>,\n options: Option[]\n): ANSWER_STATUS => {\n if (selected.size !== 1) return ANSWER_STATUS.RESPOSTA_INCORRETA;\n\n const [selectedId] = selected;\n return options.find((o) => o.id === selectedId)?.isCorrect\n ? ANSWER_STATUS.RESPOSTA_CORRETA\n : ANSWER_STATUS.RESPOSTA_INCORRETA;\n};\n\n/**\n * Validate multipla escolha (multiple choice) question\n * Each option must match its correct state: selected if correct, not selected if incorrect\n */\nconst validateMultiplaEscolha = (\n selected: Set<string>,\n options: Option[]\n): ANSWER_STATUS => {\n const allMatch = options.every((op) => selected.has(op.id) === op.isCorrect);\n\n return allMatch\n ? ANSWER_STATUS.RESPOSTA_CORRETA\n : ANSWER_STATUS.RESPOSTA_INCORRETA;\n};\n\n/**\n * Validate verdadeiro/falso (true/false) question\n * Each statement is evaluated individually: if statement is true, must be selected;\n * if statement is false, must not be selected\n */\nconst validateVerdadeiroFalso = validateMultiplaEscolha;\n\nconst validators: Partial<\n Record<QUESTION_TYPE, (s: Set<string>, o: Option[]) => ANSWER_STATUS>\n> = {\n [QUESTION_TYPE.ALTERNATIVA]: validateAlternativa,\n [QUESTION_TYPE.MULTIPLA_ESCOLHA]: validateMultiplaEscolha,\n [QUESTION_TYPE.VERDADEIRO_FALSO]: validateVerdadeiroFalso,\n};\n\n/**\n * Auto-validate question based on selected options vs correct options\n * @param questionData - Correction question data\n * @returns ANSWER_STATUS if can determine, null otherwise\n */\nexport const autoValidateQuestion = (\n questionData: CorrectionQuestionData\n): ANSWER_STATUS | null => {\n const { result } = questionData;\n\n if (!canAutoValidate(questionData) || !result.options) return null;\n\n // Filter options to only include those with isCorrect defined\n const validOptions = result.options.filter(hasIsCorrect);\n if (validOptions.length === 0) return null;\n\n const selected = new Set(\n result.selectedOptions?.map((o) => o.optionId) ?? []\n );\n\n if (selected.size === 0) return ANSWER_STATUS.NAO_RESPONDIDO;\n\n const validator = validators[result.questionType];\n if (!validator) return null;\n\n return validator(selected, validOptions);\n};\n\n/**\n * Get question status from CorrectionQuestionData\n * Maps the result's answerStatus to QuestionStatus\n * If status is PENDENTE_AVALIACAO but can auto-validate, calculates status automatically\n * @param questionData - Correction question data\n * @returns QuestionStatus for UI display\n */\nexport const getQuestionStatusFromData = (\n questionData: CorrectionQuestionData\n): QuestionStatus => {\n const { result } = questionData;\n\n // If pending evaluation, try to auto-validate\n if (\n result.answerStatus === ANSWER_STATUS.PENDENTE_AVALIACAO &&\n canAutoValidate(questionData)\n ) {\n const autoValidatedStatus = autoValidateQuestion(questionData);\n if (autoValidatedStatus !== null) {\n return mapAnswerStatusToQuestionStatus(autoValidatedStatus);\n }\n }\n\n return mapAnswerStatusToQuestionStatus(result.answerStatus);\n};\n","import type { Question } from '../../components/Quiz/useQuizStore';\nimport { QUESTION_TYPE } from '../../components/Quiz/useQuizStore';\nimport type {\n QuestionsAnswersByStudentResponse,\n StudentActivityCorrectionData,\n CorrectionQuestionData,\n QuestionCorrection,\n} from './types';\nimport { getIsCorrect } from './utils';\n\n/**\n * Build Question object from answer data\n * @param answer - Answer data from QuestionResult\n * @returns Question object in Quiz format\n */\nconst buildQuestionFromAnswer = (\n answer: QuestionsAnswersByStudentResponse['data']['answers'][number]\n): Question => {\n return {\n id: answer.questionId,\n statement: answer.statement,\n questionType: answer.questionType,\n difficultyLevel: answer.difficultyLevel,\n description: '',\n examBoard: null,\n examYear: null,\n solutionExplanation: answer.solutionExplanation || null,\n additionalContent: answer.additionalContent || null,\n answer: null,\n answerStatus: answer.answerStatus,\n options: answer.options || [],\n knowledgeMatrix: answer.knowledgeMatrix.map((matrix) => ({\n areaKnowledge: matrix.areaKnowledge || {\n id: '',\n name: '',\n },\n subject: matrix.subject || {\n id: '',\n name: '',\n color: '',\n icon: '',\n },\n topic: matrix.topic || {\n id: '',\n name: '',\n },\n subtopic: matrix.subtopic || {\n id: '',\n name: '',\n },\n content: matrix.content || {\n id: '',\n name: '',\n },\n })),\n correctOptionIds:\n answer.options?.filter((opt) => opt.isCorrect).map((opt) => opt.id) || [],\n };\n};\n\n/**\n * Build correction data for a question\n *\n * Built for every question type, not just DISSERTATIVA: a teacher can comment on\n * any question. `isCorrect` stays null outside DISSERTATIVA because objective\n * questions are graded automatically and must not be re-graded by hand.\n *\n * The AI fields are carried through untouched rather than folded into\n * `teacherFeedback`. The modal needs both to do its job: the AI's text to\n * prefill the field the teacher edits, and the source to decide which tag to\n * show and whether saving turns an `IA` correction into an `IA + PROFESSOR` one.\n *\n * @param answer - Answer data from QuestionResult\n * @returns QuestionCorrection with the teacher's grade and/or comment\n */\nconst buildQuestionCorrection = (\n answer: QuestionsAnswersByStudentResponse['data']['answers'][number]\n): QuestionCorrection => ({\n isCorrect:\n answer.questionType === QUESTION_TYPE.DISSERTATIVA\n ? getIsCorrect(answer.answerStatus)\n : null,\n teacherFeedback: answer.teacherFeedback || '',\n aiFeedback: answer.aiFeedback ?? null,\n aiIsCorrect: answer.aiIsCorrect ?? null,\n aiCorrectionStatus: answer.aiCorrectionStatus ?? null,\n correctionSource: answer.correctionSource ?? null,\n});\n\n/**\n * Convert a single answer to CorrectionQuestionData format\n * @param answer - Answer data from QuestionResult\n * @param index - Index of the answer (0-based)\n * @returns CorrectionQuestionData formatted for the modal\n */\nconst convertAnswerToQuestionData = (\n answer: QuestionsAnswersByStudentResponse['data']['answers'][number],\n index: number\n): CorrectionQuestionData => {\n const question = buildQuestionFromAnswer(answer);\n const correction = buildQuestionCorrection(answer);\n\n return {\n question,\n result: answer,\n questionNumber: index + 1,\n correction,\n };\n};\n\n/**\n * Convert QuestionResult from API to StudentActivityCorrectionData\n * This function transforms the API response into the format expected by CorrectActivityModal\n *\n * `statistics.score` from the answers endpoint is a 0-100 percentage recomputed\n * from the per-question rows, while the students table shows the stored 0-10\n * grade. Callers that already hold the stored grade pass it as `score` so the\n * modal and the table never disagree; `null` is an explicit \"no grade yet\".\n *\n * @param apiResponse - API response with answers and statistics\n * @param studentId - Student ID\n * @param studentName - Student name\n * @param observation - Optional teacher observation\n * @param attachment - Optional attachment URL\n * @param score - Optional stored grade (0-10) that takes precedence over\n * `statistics.score`; `null` means the student has no grade yet\n * @returns StudentActivityCorrectionData formatted for the modal\n */\nexport const convertApiResponseToCorrectionData = (\n apiResponse: QuestionsAnswersByStudentResponse,\n studentId: string,\n studentName: string,\n observation?: string,\n attachment?: string,\n score?: number | null\n): StudentActivityCorrectionData => {\n const { answers, statistics } = apiResponse.data;\n\n // Calculate counts from statistics\n const correctCount = statistics.correctAnswers;\n const incorrectCount = statistics.incorrectAnswers;\n const blankCount = statistics.totalAnswered - correctCount - incorrectCount;\n\n // Convert answers to CorrectionQuestionData format\n const questions: CorrectionQuestionData[] = answers.map((answer, index) =>\n convertAnswerToQuestionData(answer, index)\n );\n\n return {\n studentId,\n studentName,\n score: score === undefined ? (statistics.score ?? null) : score,\n correctCount,\n incorrectCount,\n blankCount,\n questions,\n observation,\n attachment,\n };\n};\n","import { Fragment, useId, type ReactNode } from 'react';\nimport Badge from '../../../components/Badge/Badge';\nimport { CheckCircleIcon } from '@phosphor-icons/react/dist/csr/CheckCircle';\nimport { XCircleIcon } from '@phosphor-icons/react/dist/csr/XCircle';\nimport { cn } from '../../utils';\nimport Text from '../../../components/Text/Text';\nimport type { QuestionRendererProps } from '../types';\nimport { stripHtmlTags } from '../../stringUtils';\nimport { OptionStatus } from '../../../enums/Options';\n\n/**\n * Get status badge component\n */\nexport const getStatusBadge = (status?: OptionStatus): ReactNode => {\n switch (status) {\n case OptionStatus.CORRECT:\n return (\n <Badge variant=\"solid\" action=\"success\" iconLeft={<CheckCircleIcon />}>\n Resposta correta\n </Badge>\n );\n case OptionStatus.INCORRECT:\n return (\n <Badge variant=\"solid\" action=\"error\" iconLeft={<XCircleIcon />}>\n Resposta incorreta\n </Badge>\n );\n default:\n return null;\n }\n};\n\n/**\n * Container component for question content\n */\nexport const QuestionContainer = ({\n children,\n className,\n}: {\n children: ReactNode;\n className?: string;\n}) => {\n return (\n <div\n className={cn(\n 'bg-background rounded-t-xl px-4 pt-4 pb-[80px] h-auto flex flex-col gap-4 mb-auto',\n className\n )}\n >\n {children}\n </div>\n );\n};\n\n/**\n * Subtitle component for question sections\n */\nexport const QuestionSubTitle = ({ subTitle }: { subTitle: string }) => {\n return (\n <div className=\"px-4 pb-2 pt-6\">\n <Text size=\"md\" weight=\"bold\" color=\"text-text-950\">\n {subTitle}\n </Text>\n </div>\n );\n};\n\n/**\n * Internal component for fill in the blanks question\n * Uses useId hook to generate unique IDs\n *\n * Data structure:\n * - additionalContent: HTML text with {placeholderId} placeholders\n * - fillAnswers: Record<placeholderId, selectedOptionId> (what student chose)\n * - options: Array<{ id, option }> where id is placeholderId AND correct optionId\n * - Correctness: selectedOptionId === placeholderId means correct\n */\nexport const FillQuestionContent = ({\n question,\n result,\n}: QuestionRendererProps) => {\n const baseId = useId();\n\n // Get additionalContent (contains HTML with {placeholderId} placeholders)\n // Falls back to question.statement for older questions that may not have additionalContent\n const additionalContent =\n result?.additionalContent ||\n question.additionalContent ||\n question.statement ||\n '';\n\n // Strip HTML tags for clean text rendering\n const cleanText = stripHtmlTags(additionalContent);\n\n // Get options array (id is placeholderId, option is the text)\n const options =\n (\n result as {\n options?: Array<{ id: string; option: string; isCorrect: boolean }>;\n }\n )?.options ||\n question.options ||\n [];\n\n // Build a map of optionId -> option text for quick lookup\n const optionTextMap: Record<string, string> = {};\n options.forEach((opt) => {\n optionTextMap[opt.id] = opt.option;\n });\n\n // Get fillAnswers: Record<placeholderId, selectedOptionId>\n const fillAnswers: Record<string, string> = {};\n try {\n const resultWithFill = result as {\n fillAnswers?: Record<string, string> | null;\n };\n if (resultWithFill?.fillAnswers) {\n Object.assign(fillAnswers, resultWithFill.fillAnswers);\n } else if (result?.answer) {\n const parsed =\n typeof result.answer === 'string'\n ? JSON.parse(result.answer)\n : result.answer;\n if (typeof parsed === 'object') {\n Object.assign(fillAnswers, parsed);\n }\n }\n } catch {\n // Ignore parse errors\n }\n\n // Helper to get option text by ID - returns null if not found\n const getOptionTextById = (optionId: string): string | null => {\n if (!optionId) return null;\n return optionTextMap[optionId] ?? null;\n };\n\n // Check if answer is correct (selectedOptionId === placeholderId)\n const isAnswerCorrect = (placeholderId: string): boolean => {\n const selectedOptionId = fillAnswers[placeholderId];\n return selectedOptionId === placeholderId;\n };\n\n // Render student answer badge\n const renderStudentBadge = (placeholderId: string) => {\n const selectedOptionId = fillAnswers[placeholderId];\n const selectedOptionText = getOptionTextById(selectedOptionId);\n const isCorrect = isAnswerCorrect(placeholderId);\n\n if (!selectedOptionId) {\n return (\n <span className=\"inline-block align-middle mx-1 my-1\">\n <Badge\n variant=\"solid\"\n action=\"error\"\n iconRight={<XCircleIcon />}\n size=\"large\"\n className=\"py-1 px-2\"\n >\n Não respondido\n </Badge>\n </span>\n );\n }\n\n // Handle case where option ID exists but text is not found\n const displayText = selectedOptionText ?? 'Opção não encontrada';\n\n return (\n <span className=\"inline-block align-middle mx-1 my-1\">\n <Badge\n variant=\"solid\"\n action={isCorrect ? 'success' : 'error'}\n iconRight={isCorrect ? <CheckCircleIcon /> : <XCircleIcon />}\n size=\"large\"\n className=\"py-1 px-2\"\n >\n {displayText}\n </Badge>\n </span>\n );\n };\n\n // Render correct answer\n const renderCorrectAnswer = (placeholderId: string) => {\n // The placeholderId IS the correct option ID\n const correctOptionText = getOptionTextById(placeholderId);\n const displayText = correctOptionText ?? '[Resposta não disponível]';\n return (\n <span className=\"inline mx-1 text-success-600 font-semibold border-b-2 border-success-600\">\n {displayText}\n </span>\n );\n };\n\n // Parse text and render with elements\n const renderTextWithElements = (text: string, isCorrectAnswer: boolean) => {\n const elements: Array<{ element: string | ReactNode; id: string }> = [];\n let lastIndex = 0;\n const nextId = () => elements.length;\n\n const regex = /\\{([a-zA-Z0-9-]+)\\}/g;\n let match;\n\n while ((match = regex.exec(text)) !== null) {\n const [fullMatch, placeholderId] = match;\n const startIndex = match.index;\n\n // Add text before placeholder\n if (startIndex > lastIndex) {\n elements.push({\n element: text.slice(lastIndex, startIndex),\n id: `${baseId}-text-${nextId()}`,\n });\n }\n\n // Add the appropriate element\n if (isCorrectAnswer) {\n elements.push({\n element: renderCorrectAnswer(placeholderId),\n id: `${baseId}-answer-sheet-${nextId()}`,\n });\n } else {\n elements.push({\n element: renderStudentBadge(placeholderId),\n id: `${baseId}-student-${nextId()}`,\n });\n }\n\n lastIndex = match.index + fullMatch.length;\n }\n\n // Add remaining text\n if (lastIndex < text.length) {\n elements.push({\n element: text.slice(lastIndex),\n id: `${baseId}-text-${nextId()}`,\n });\n }\n\n return elements;\n };\n\n if (!additionalContent) {\n return (\n <div className=\"pt-2\">\n <Text size=\"md\" color=\"text-text-600\" weight=\"normal\">\n Nenhum conteúdo disponível para esta questão.\n </Text>\n </div>\n );\n }\n\n return (\n <div className=\"pt-2 space-y-4\">\n <div className=\"space-y-2\">\n <Text size=\"xs\" weight=\"normal\" color=\"text-text-500\">\n Resposta do aluno:\n </Text>\n <div className=\"p-3 bg-background-50 rounded-lg border border-border-100\">\n <Text\n as=\"div\"\n size=\"md\"\n color=\"text-text-900\"\n weight=\"normal\"\n className=\"leading-[2.5] *:inline\"\n >\n {renderTextWithElements(cleanText, false).map((element) => (\n <Fragment key={element.id}>{element.element}</Fragment>\n ))}\n </Text>\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <Text size=\"xs\" weight=\"normal\" color=\"text-text-500\">\n Gabarito:\n </Text>\n <div className=\"p-3 bg-background-50 rounded-lg border border-border-100\">\n <Text\n as=\"div\"\n size=\"md\"\n color=\"text-text-900\"\n weight=\"normal\"\n className=\"leading-[2.5] *:inline\"\n >\n {renderTextWithElements(cleanText, true).map((element) => (\n <Fragment key={element.id}>{element.element}</Fragment>\n ))}\n </Text>\n </div>\n </div>\n </div>\n );\n};\n","import { getStatusStyles } from '../Quiz/QuizContent';\nimport Text from '../Text/Text';\nimport { cn } from '../../utils/utils';\nimport { getStatusBadge } from '../../utils/questionRenderer/components';\nimport { HtmlMathRenderer } from '../HtmlMathRenderer';\nimport { TrueFalseEnum } from '../../enums/Quiz';\nimport { OptionStatus } from '../../enums/Options';\n\n/** One statement of a true/false question, already normalized for rendering. */\nexport interface TrueFalseStatement {\n id: string;\n /** Statement text; may contain HTML and LaTeX */\n statement: string;\n /** What the student marked. Null when the statement was left blank. */\n studentMark: TrueFalseEnum | null;\n /** Answer key: whether the statement is true. Null when unknown. */\n isTrue: boolean | null;\n}\n\nexport interface TrueFalseStatementListProps {\n readonly statements: readonly TrueFalseStatement[];\n /**\n * Whether the answer key may be revealed. False while the answer is still\n * pending evaluation or was never submitted.\n */\n readonly showCorrectness?: boolean;\n}\n\n/**\n * Read-only list of true/false statements with the student's mark and the\n * answer key.\n *\n * Shared by the activity correction modal and the simulation detail modal so\n * both read the same way. The two callers reach this from different payload\n * shapes — `QuestionResult.selectedOptions` in one, an option's `selectedValue`\n * in the other — and normalize into {@link TrueFalseStatement} before calling.\n *\n * @param props - Component props\n * @returns JSX element\n *\n * @example\n * ```tsx\n * <TrueFalseStatementList\n * statements={[{ id: '1', statement: 'A água ferve a 100°C', studentMark: TrueFalseEnum.VERDADEIRO, isTrue: true }]}\n * showCorrectness\n * />\n * ```\n */\nexport const TrueFalseStatementList = ({\n statements,\n showCorrectness = true,\n}: TrueFalseStatementListProps) => {\n // 97 = 'a' in ASCII\n const getLetterByIndex = (index: number) => String.fromCodePoint(97 + index);\n\n return (\n <div className=\"pt-2\">\n <div className=\"flex flex-col gap-3.5\">\n {statements.map((item, index) => {\n const hasAnswerKey = item.isTrue !== null;\n const hasAnswered = item.studentMark !== null;\n const studentMarkedTrue =\n item.studentMark === TrueFalseEnum.VERDADEIRO;\n\n const isStudentCorrect =\n hasAnswerKey && hasAnswered && studentMarkedTrue === item.isTrue;\n\n // Correctness is only shown once the answer key is known AND the\n // answer is no longer pending.\n const canShowCorrectness = showCorrectness && hasAnswerKey;\n const variantCorrect = isStudentCorrect\n ? OptionStatus.CORRECT\n : OptionStatus.INCORRECT;\n const correctAnswer = item.isTrue\n ? TrueFalseEnum.VERDADEIRO\n : TrueFalseEnum.FALSO;\n\n return (\n <section\n key={item.id || `statement-${index}`}\n className=\"flex flex-col gap-2\"\n >\n <div\n className={cn(\n 'flex flex-row justify-between items-center gap-2 p-2 rounded-md border',\n canShowCorrectness && hasAnswered\n ? getStatusStyles(variantCorrect)\n : ''\n )}\n >\n <Text as=\"span\" size=\"sm\" weight=\"normal\" color=\"text-text-900\">\n {getLetterByIndex(index).concat(') ')}\n <HtmlMathRenderer content={item.statement} inline />\n </Text>\n\n {canShowCorrectness && hasAnswered && (\n <div className=\"flex-shrink-0\">\n {getStatusBadge(variantCorrect)}\n </div>\n )}\n </div>\n\n {canShowCorrectness && (\n <span className=\"flex flex-row gap-2 items-center flex-wrap\">\n {hasAnswered ? (\n <>\n <Text size=\"2xs\" weight=\"normal\" color=\"text-text-800\">\n Resposta selecionada: {item.studentMark}\n </Text>\n {!isStudentCorrect && (\n <Text size=\"2xs\" weight=\"normal\" color=\"text-text-800\">\n | Resposta correta: {correctAnswer}\n </Text>\n )}\n </>\n ) : (\n <Text size=\"2xs\" weight=\"normal\" color=\"text-text-800\">\n Não respondida | Resposta correta: {correctAnswer}\n </Text>\n )}\n </span>\n )}\n </section>\n );\n })}\n </div>\n </div>\n );\n};\n\nexport default TrueFalseStatementList;\n"]}
@@ -12,7 +12,7 @@ import {
12
12
  } from "./chunk-53ICLDGS.mjs";
13
13
  import {
14
14
  useQuizStore
15
- } from "./chunk-FL4W4S6J.mjs";
15
+ } from "./chunk-MOSP7FR5.mjs";
16
16
 
17
17
  // src/components/Quiz/TeacherQuestionComment.tsx
18
18
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -79,4 +79,4 @@ export {
79
79
  TeacherQuestionComment,
80
80
  TeacherQuestionComment_default
81
81
  };
82
- //# sourceMappingURL=chunk-Q56I63FO.mjs.map
82
+ //# sourceMappingURL=chunk-RVGLLMWG.mjs.map
@@ -1,7 +1,7 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
2
2
 
3
3
 
4
- var _chunkNYKBCQUOjs = require('./chunk-NYKBCQUO.js');
4
+ var _chunkQF3UKRIJjs = require('./chunk-QF3UKRIJ.js');
5
5
 
6
6
 
7
7
  var _chunk75S5O4SLjs = require('./chunk-75S5O4SL.js');
@@ -56,12 +56,11 @@ var survey_university_default = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA
56
56
 
57
57
  // src/components/EnemClassroomStartModal/EnemClassroomStartModal.tsx
58
58
  var _jsxruntime = require('react/jsx-runtime');
59
- var ENEM_CLASSROOM_MODAL_TITLE = "Simula\xE7\xE3o do ENEM em sala de aula!";
60
- var INTRO_WARNINGS = [
59
+ var buildIntroWarnings = (texts) => [
61
60
  {
62
61
  icon: warning_classroom_default,
63
- title: "S\xF3 vale em sala de aula",
64
- description: "Essa simula\xE7\xE3o precisa ser feita com seu professor presente. N\xE3o vale fazer em casa!"
62
+ title: texts.introWarningTitle,
63
+ description: texts.introWarningText
65
64
  },
66
65
  {
67
66
  icon: warning_timer_default,
@@ -75,8 +74,8 @@ var INTRO_WARNINGS = [
75
74
  }
76
75
  ];
77
76
  var LANGUAGE_FLAGS = {
78
- [_chunkNYKBCQUOjs.ENEM_CLASSROOM_LANGUAGE.INGLES]: flag_english_default,
79
- [_chunkNYKBCQUOjs.ENEM_CLASSROOM_LANGUAGE.ESPANHOL]: flag_spanish_default
77
+ [_chunkQF3UKRIJjs.ENEM_CLASSROOM_LANGUAGE.INGLES]: flag_english_default,
78
+ [_chunkQF3UKRIJjs.ENEM_CLASSROOM_LANGUAGE.ESPANHOL]: flag_spanish_default
80
79
  };
81
80
  var SURVEY_ILLUSTRATIONS = [
82
81
  survey_course_default,
@@ -211,6 +210,16 @@ var EnemClassroomStartModal = ({
211
210
  });
212
211
  }, [exam.languageChoice, language, surveyQuestions, answers, onStart]);
213
212
  const renderIntroStep = () => /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-col gap-6", "data-testid": "enem-classroom-intro", children: [
213
+ exam.videoUrl && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
214
+ _chunkANT66KVKjs.Text_default,
215
+ {
216
+ size: "md",
217
+ weight: "semibold",
218
+ className: "text-text-950",
219
+ "data-testid": "enem-classroom-intro-video-text",
220
+ children: exam.studentTexts.introVideoText
221
+ }
222
+ ),
214
223
  exam.videoUrl && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
215
224
  _chunk75S5O4SLjs.VideoPlayer_default,
216
225
  {
@@ -222,29 +231,34 @@ var EnemClassroomStartModal = ({
222
231
  }
223
232
  ),
224
233
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-col gap-4", children: [
225
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkANT66KVKjs.Text_default, { size: "lg", weight: "bold", className: "text-text-950", children: "Ei, l\xEA isso antes de come\xE7ar!" }),
226
- INTRO_WARNINGS.map(({ icon, title, description }) => /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
227
- "div",
228
- {
229
- className: _chunkTN3AYOMVjs.cn.call(void 0, CARD_CLASSES, "flex flex-row gap-4 items-start p-4"),
230
- children: [
231
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
232
- "img",
233
- {
234
- src: icon,
235
- alt: "",
236
- "aria-hidden": true,
237
- className: "flex-shrink-0 w-10 h-10"
238
- }
234
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkANT66KVKjs.Text_default, { size: "lg", weight: "bold", className: "text-text-950", children: exam.studentTexts.introHeading }),
235
+ buildIntroWarnings(exam.studentTexts).map(
236
+ ({ icon, title, description }) => /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
237
+ "div",
238
+ {
239
+ className: _chunkTN3AYOMVjs.cn.call(void 0,
240
+ CARD_CLASSES,
241
+ "flex flex-row gap-4 items-start p-4"
239
242
  ),
240
- /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-col gap-1", children: [
241
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkANT66KVKjs.Text_default, { size: "md", weight: "bold", className: "text-text-950", children: title }),
242
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkANT66KVKjs.Text_default, { size: "sm", className: "text-text-600", children: description })
243
- ] })
244
- ]
245
- },
246
- title
247
- ))
243
+ children: [
244
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
245
+ "img",
246
+ {
247
+ src: icon,
248
+ alt: "",
249
+ "aria-hidden": true,
250
+ className: "flex-shrink-0 w-10 h-10"
251
+ }
252
+ ),
253
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-col gap-1", children: [
254
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkANT66KVKjs.Text_default, { size: "md", weight: "bold", className: "text-text-950", children: title }),
255
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkANT66KVKjs.Text_default, { size: "sm", className: "text-text-600", children: description })
256
+ ] })
257
+ ]
258
+ },
259
+ title
260
+ )
261
+ )
248
262
  ] }),
249
263
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
250
264
  _chunkXN2HPVVHjs.Button_default,
@@ -276,12 +290,12 @@ var EnemClassroomStartModal = ({
276
290
  role: "radiogroup",
277
291
  "aria-labelledby": "enem-classroom-language-prompt",
278
292
  className: "flex flex-col gap-4",
279
- children: Object.values(_chunkNYKBCQUOjs.ENEM_CLASSROOM_LANGUAGE).map((value) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
293
+ children: Object.values(_chunkQF3UKRIJjs.ENEM_CLASSROOM_LANGUAGE).map((value) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
280
294
  OptionCard,
281
295
  {
282
296
  name: "enem-classroom-language",
283
297
  value,
284
- label: _chunkNYKBCQUOjs.ENEM_CLASSROOM_LANGUAGE_LABELS[value],
298
+ label: _chunkQF3UKRIJjs.ENEM_CLASSROOM_LANGUAGE_LABELS[value],
285
299
  iconSrc: LANGUAGE_FLAGS[value],
286
300
  checked: language === value,
287
301
  onSelect: () => setLanguage(value),
@@ -384,7 +398,7 @@ var EnemClassroomStartModal = ({
384
398
  SummaryRow,
385
399
  {
386
400
  label: "Idioma",
387
- value: language ? _chunkNYKBCQUOjs.ENEM_CLASSROOM_LANGUAGE_LABELS[language] : "\u2014"
401
+ value: language ? _chunkQF3UKRIJjs.ENEM_CLASSROOM_LANGUAGE_LABELS[language] : "\u2014"
388
402
  }
389
403
  ),
390
404
  surveyQuestions.map((question) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
@@ -469,7 +483,7 @@ var EnemClassroomStartModal = ({
469
483
  {
470
484
  isOpen,
471
485
  onClose,
472
- title: showStepper ? ENEM_CLASSROOM_MODAL_TITLE : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "sr-only", children: ENEM_CLASSROOM_MODAL_TITLE }),
486
+ title: showStepper ? exam.title : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "sr-only", children: exam.title }),
473
487
  size: "lg",
474
488
  footer,
475
489
  contentClassName: "flex flex-col gap-6",
@@ -484,6 +498,5 @@ var EnemClassroomStartModal_default = EnemClassroomStartModal;
484
498
 
485
499
 
486
500
 
487
-
488
- exports.ENEM_CLASSROOM_MODAL_TITLE = ENEM_CLASSROOM_MODAL_TITLE; exports.EnemClassroomStartModal_default = EnemClassroomStartModal_default;
489
- //# sourceMappingURL=chunk-VVRRAF6H.js.map
501
+ exports.EnemClassroomStartModal_default = EnemClassroomStartModal_default;
502
+ //# sourceMappingURL=chunk-S2S7TK3L.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-S2S7TK3L.js","../src/components/EnemClassroomStartModal/EnemClassroomStartModal.tsx"],"names":[],"mappings":"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","file":"/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-S2S7TK3L.js","sourcesContent":[null,"import { useCallback, useEffect, useMemo, useState, ChangeEvent } from 'react';\nimport Modal from '../Modal/Modal';\nimport Stepper from '../Stepper/Stepper';\nimport Button from '../Button/Button';\nimport Input from '../Input/Input';\nimport CheckBox from '../CheckBox/CheckBox';\nimport Text from '../Text/Text';\nimport VideoPlayer from '../VideoPlayer/VideoPlayer';\nimport { CaretLeftIcon } from '@phosphor-icons/react/dist/csr/CaretLeft';\nimport { CaretRightIcon } from '@phosphor-icons/react/dist/csr/CaretRight';\nimport { CheckIcon } from '@phosphor-icons/react/dist/csr/Check';\nimport { cn } from '../../utils/utils';\nimport warningClassroomIcon from '../../assets/img/enemClassroom/warning-classroom.png';\nimport warningTimerIcon from '../../assets/img/enemClassroom/warning-timer.png';\nimport warningIrreversibleIcon from '../../assets/img/enemClassroom/warning-irreversible.png';\nimport flagEnglish from '../../assets/img/enemClassroom/flag-english.png';\nimport flagSpanish from '../../assets/img/enemClassroom/flag-spanish.png';\nimport surveyCourseIllustration from '../../assets/img/enemClassroom/survey-course.svg';\nimport surveyUniversityIllustration from '../../assets/img/enemClassroom/survey-university.png';\nimport {\n ENEM_CLASSROOM_LANGUAGE,\n ENEM_CLASSROOM_LANGUAGE_LABELS,\n type EnemClassroomExam,\n type EnemClassroomLanguage,\n type EnemClassroomStartPayload,\n type EnemClassroomStudentTexts,\n type EnemClassroomSurveyQuestion,\n} from '../../types/enemClassroom';\n\n/** Title shared by every step, as in the design. */\n/**\n * The three warnings of the introduction step. The exam only counts when\n * taken in class, so they are shown before anything else. The first one is\n * the backoffice's to write (`studentTexts`); the other two are fixed.\n *\n * @param texts - The exam's texts\n * @returns The warnings in order\n */\nconst buildIntroWarnings = (texts: EnemClassroomStudentTexts) => [\n {\n icon: warningClassroomIcon,\n title: texts.introWarningTitle,\n description: texts.introWarningText,\n },\n {\n icon: warningTimerIcon,\n title: 'O cronômetro liga na hora',\n description:\n 'Assim que clicar em começar, o tempo já corre e não para, mesmo se fechar o navegador.',\n },\n {\n icon: warningIrreversibleIcon,\n title: 'Não tem como desfazer',\n description:\n 'Iniciar fora do horário estabelecido pelo seu professor em sala de aula pode atrapalhar seu resultado!',\n },\n];\n\n/** Flag shown next to each language, as in the design. */\nconst LANGUAGE_FLAGS: Record<EnemClassroomLanguage, string> = {\n [ENEM_CLASSROOM_LANGUAGE.INGLES]: flagEnglish,\n [ENEM_CLASSROOM_LANGUAGE.ESPANHOL]: flagSpanish,\n};\n\n/**\n * Illustration of each survey step, in the order the steps are asked: the\n * course question, then the university one.\n *\n * Fixed here rather than sent by the backoffice, so it is keyed by position —\n * reordering the questions there moves the illustration with the position,\n * not with the question. A question past the end simply gets none.\n */\nconst SURVEY_ILLUSTRATIONS = [\n surveyCourseIllustration,\n surveyUniversityIllustration,\n] as const;\n\n/**\n * The white card the warnings and the options sit on. Same vocabulary as\n * SelectionButton, so the modal reads like the rest of the design system\n * against the modal's `secondary-50` background.\n */\nconst CARD_CLASSES =\n 'rounded-xl border border-border-50 bg-background shadow-soft-shadow-1';\n\n/**\n * Gradiente da identidade da simulação em sala de aula — os mesmos tons do\n * card do painel do aluno. Não sai dos tokens de tema porque é a marca da\n * prova, não a da instituição.\n */\n/*\n * Gradiente literal, e não `bg-gradient-to-r from-… to-…`: o Tailwind v4\n * interpola `in oklab`, o que muda os tons do meio em relação ao sRGB do CSS\n * que veio do design.\n */\nconst GRADIENT_CTA_CLASSES =\n 'bg-[linear-gradient(270deg,#B21FF6_0%,#F95493_100%)] hover:opacity-90 transition-opacity';\n\n/**\n * One selectable option: a card carrying an optional icon and a label.\n *\n * The radio control itself is visually hidden — in the design the card's own\n * border carries the selection. The native input stays in the tree so the\n * options remain a real radio group: arrow keys move between them and screen\n * readers announce \"1 of 2\", which a set of toggle buttons would not.\n */\nconst OptionCard = ({\n name,\n value,\n label,\n iconSrc,\n checked,\n onSelect,\n testId,\n}: {\n name: string;\n value: string;\n label: string;\n iconSrc?: string;\n checked: boolean;\n onSelect: () => void;\n testId?: string;\n}) => (\n <label\n className={cn(\n CARD_CLASSES,\n 'flex flex-row items-center gap-3 px-4 py-3.5',\n 'cursor-pointer transition-colors hover:bg-background-100',\n 'focus-within:ring-2 focus-within:ring-indicator-info',\n checked && 'border-primary-700 ring-1 ring-primary-700'\n )}\n >\n <input\n type=\"radio\"\n name={name}\n value={value}\n checked={checked}\n onChange={onSelect}\n className=\"sr-only\"\n data-testid={testId}\n />\n {iconSrc && (\n <img src={iconSrc} alt=\"\" aria-hidden className=\"w-6 h-6 flex-shrink-0\" />\n )}\n <Text size=\"sm\" weight=\"semibold\" className=\"text-text-900\">\n {label}\n </Text>\n </label>\n);\n\n/**\n * How a survey question was answered. The student either writes an answer or\n * ticks \"ainda estou pensando\" — the tick clears and disables the field, so\n * the two never disagree.\n */\ninterface SurveyAnswerDraft {\n skipped: boolean;\n text: string;\n}\n\n/**\n * One line of the summary: the step's name over what the student answered.\n */\nconst SummaryRow = ({ label, value }: { label: string; value: string }) => (\n <div className=\"flex flex-col rounded-lg bg-primary-50 px-3 py-2\">\n <Text as=\"dt\" size=\"sm\" weight=\"bold\" className=\"text-primary-800\">\n {label}\n </Text>\n <Text as=\"dd\" size=\"sm\" className=\"text-text-600\">\n {value}\n </Text>\n </div>\n);\n\n/** The introduction is always first; the first choice comes right after it. */\nconst INTRO_STEP = 0;\nconst FIRST_CHOICE_STEP = 1;\n\n/** One screen of the flow. Which ones exist depends on the exam. */\ntype FlowStep =\n | { kind: 'intro' }\n | { kind: 'language' }\n | { kind: 'survey'; question: EnemClassroomSurveyQuestion; index: number }\n | { kind: 'summary' };\n\nexport interface EnemClassroomStartModalProps {\n isOpen: boolean;\n onClose: () => void;\n exam: EnemClassroomExam;\n /** Called with everything the start endpoint needs. */\n onStart: (payload: EnemClassroomStartPayload) => void;\n /** Disables the final button while the start request is in flight. */\n isStarting?: boolean;\n}\n\n/**\n * Whether a survey draft is complete: skipped, or answered with some text.\n */\nconst isSurveyAnswerComplete = (draft: SurveyAnswerDraft | undefined) =>\n draft?.skipped === true || (draft?.text.trim().length ?? 0) > 0;\n\n/**\n * The text shown for a survey answer on the summary screen.\n */\nconst describeSurveyAnswer = (\n question: EnemClassroomSurveyQuestion,\n draft: SurveyAnswerDraft | undefined\n) => (draft && !draft.skipped ? draft.text.trim() : question.skipLabel);\n\n/**\n * Start flow of the in-classroom ENEM simulation.\n *\n * Steps, in order: introduction (video + warnings), foreign language — only\n * when the exam offers the choice —, one step per survey question, and a\n * summary the student confirms before the exam opens. The stepper only lists\n * the steps that carry a choice; the summary is a screen of its own, as in\n * the design.\n *\n * Presentational: it collects the choices and hands them to `onStart`; the\n * caller talks to the API.\n *\n * @example\n * ```tsx\n * <EnemClassroomStartModal\n * isOpen={open}\n * onClose={() => setOpen(false)}\n * exam={exam}\n * onStart={(payload) => start(exam.id, payload)}\n * />\n * ```\n */\nconst EnemClassroomStartModal = ({\n isOpen,\n onClose,\n exam,\n onStart,\n isStarting = false,\n}: EnemClassroomStartModalProps) => {\n const surveyQuestions = useMemo(\n () => [...exam.surveyQuestions].sort((a, b) => a.position - b.position),\n [exam.surveyQuestions]\n );\n // The screens this exam has: no language step on an exam without the\n // choice, so the student goes from the warnings straight to the survey.\n const steps = useMemo<FlowStep[]>(\n () => [\n { kind: 'intro' },\n ...(exam.languageChoice ? [{ kind: 'language' } as const] : []),\n ...surveyQuestions.map((question, index) => ({\n kind: 'survey' as const,\n question,\n index,\n })),\n { kind: 'summary' },\n ],\n [exam.languageChoice, surveyQuestions]\n );\n const summaryStep = steps.length - 1;\n\n const [step, setStep] = useState(INTRO_STEP);\n const [language, setLanguage] = useState<EnemClassroomLanguage | null>(null);\n const [answers, setAnswers] = useState<Record<string, SurveyAnswerDraft>>({});\n\n // Every opening starts from the introduction with nothing filled in — and\n // so does a different exam handed in while the modal is open, whose steps\n // and questions are not the ones the answers were given to.\n useEffect(() => {\n if (isOpen) {\n setStep(INTRO_STEP);\n setLanguage(null);\n setAnswers({});\n }\n }, [isOpen, exam.id]);\n\n const stepperSteps = useMemo(\n () =>\n steps\n .filter((flowStep) => flowStep.kind !== 'summary')\n .map((flowStep) => {\n if (flowStep.kind === 'intro') {\n return {\n id: 'intro',\n label: 'Introdução',\n state: 'pending' as const,\n };\n }\n if (flowStep.kind === 'language') {\n return {\n id: 'language',\n label: 'Língua estrangeira',\n state: 'pending' as const,\n };\n }\n return {\n id: flowStep.question.id,\n label: flowStep.question.stepLabel,\n state: 'pending' as const,\n };\n }),\n [steps]\n );\n\n const currentStep = steps[step] ?? steps[INTRO_STEP];\n const currentQuestion =\n currentStep.kind === 'survey' ? currentStep.question : null;\n\n const canGoNext =\n currentStep.kind === 'language'\n ? language !== null\n : currentQuestion !== null &&\n isSurveyAnswerComplete(answers[currentQuestion.id]);\n\n const updateAnswer = useCallback(\n (questionId: string, patch: Partial<SurveyAnswerDraft>) => {\n setAnswers((prev) => {\n const current = prev[questionId] ?? { skipped: false, text: '' };\n return { ...prev, [questionId]: { ...current, ...patch } };\n });\n },\n []\n );\n\n const handleStart = useCallback(() => {\n // The language is only a choice on an exam that offers one.\n if (exam.languageChoice && !language) return;\n onStart({\n language: exam.languageChoice ? language : null,\n surveyAnswers: surveyQuestions.map((question) => {\n const draft = answers[question.id];\n const text = draft && !draft.skipped ? draft.text.trim() : '';\n return { questionId: question.id, answer: text || null };\n }),\n });\n }, [exam.languageChoice, language, surveyQuestions, answers, onStart]);\n\n const renderIntroStep = () => (\n <div className=\"flex flex-col gap-6\" data-testid=\"enem-classroom-intro\">\n {exam.videoUrl && (\n <Text\n size=\"md\"\n weight=\"semibold\"\n className=\"text-text-950\"\n data-testid=\"enem-classroom-intro-video-text\"\n >\n {exam.studentTexts.introVideoText}\n </Text>\n )}\n {exam.videoUrl && (\n <VideoPlayer\n src={exam.videoUrl}\n title={exam.title}\n // O desenho mostra só o vídeo: o nome da prova já está no título do\n // modal. O `title` fica para rotular o player nos leitores de tela.\n hideHeader\n className=\"w-full rounded-xl overflow-hidden\"\n autoSave={false}\n />\n )}\n\n <div className=\"flex flex-col gap-4\">\n <Text size=\"lg\" weight=\"bold\" className=\"text-text-950\">\n {exam.studentTexts.introHeading}\n </Text>\n {buildIntroWarnings(exam.studentTexts).map(\n ({ icon, title, description }) => (\n <div\n key={title}\n className={cn(\n CARD_CLASSES,\n 'flex flex-row gap-4 items-start p-4'\n )}\n >\n <img\n src={icon}\n alt=\"\"\n aria-hidden\n className=\"flex-shrink-0 w-10 h-10\"\n />\n <div className=\"flex flex-col gap-1\">\n <Text size=\"md\" weight=\"bold\" className=\"text-text-950\">\n {title}\n </Text>\n <Text size=\"sm\" className=\"text-text-600\">\n {description}\n </Text>\n </div>\n </div>\n )\n )}\n </div>\n\n <Button\n size=\"large\"\n variant=\"solid\"\n action=\"primary\"\n className={cn('w-full', GRADIENT_CTA_CLASSES)}\n onClick={() => setStep(FIRST_CHOICE_STEP)}\n data-testid=\"enem-classroom-intro-continue\"\n >\n Estou em sala. Quero começar!\n </Button>\n </div>\n );\n\n const renderLanguageStep = () => (\n <div className=\"flex flex-col gap-4\" data-testid=\"enem-classroom-language\">\n <Text\n id=\"enem-classroom-language-prompt\"\n size=\"lg\"\n weight=\"bold\"\n className=\"text-text-950\"\n >\n Qual língua estrangeira você vai usar na simulação?\n </Text>\n <div\n role=\"radiogroup\"\n aria-labelledby=\"enem-classroom-language-prompt\"\n className=\"flex flex-col gap-4\"\n >\n {Object.values(ENEM_CLASSROOM_LANGUAGE).map((value) => (\n <OptionCard\n key={value}\n name=\"enem-classroom-language\"\n value={value}\n label={ENEM_CLASSROOM_LANGUAGE_LABELS[value]}\n iconSrc={LANGUAGE_FLAGS[value]}\n checked={language === value}\n onSelect={() => setLanguage(value)}\n testId={`enem-classroom-language-${value.toLowerCase()}`}\n />\n ))}\n </div>\n </div>\n );\n\n const renderSurveyStep = (\n question: EnemClassroomSurveyQuestion,\n index: number\n ) => {\n const draft = answers[question.id];\n const illustration = SURVEY_ILLUSTRATIONS[index];\n // The two ways of answering disable each other, so they can never\n // contradict — and either one on its own releases the step.\n const hasText = (draft?.text.trim().length ?? 0) > 0;\n const isSkipped = draft?.skipped === true;\n return (\n <div\n className=\"flex flex-col gap-4\"\n data-testid={`enem-classroom-survey-${question.id}`}\n >\n {illustration && (\n <img\n src={illustration}\n alt=\"\"\n aria-hidden\n className=\"w-[220px] max-w-full self-center\"\n data-testid=\"enem-classroom-survey-illustration\"\n />\n )}\n <Text\n id={`enem-classroom-survey-prompt-${question.id}`}\n size=\"lg\"\n weight=\"bold\"\n className=\"text-text-950\"\n >\n {question.prompt}\n </Text>\n <div className=\"flex flex-col gap-2\">\n <Text\n as=\"label\"\n htmlFor={`enem-classroom-survey-input-${question.id}`}\n size=\"sm\"\n className=\"text-text-600\"\n >\n {question.inputLabel}\n </Text>\n <Input\n id={`enem-classroom-survey-input-${question.id}`}\n variant=\"rounded\"\n placeholder={question.inputPlaceholder}\n value={draft?.text ?? ''}\n maxLength={255}\n disabled={isSkipped}\n onChange={(event: ChangeEvent<HTMLInputElement>) =>\n updateAnswer(question.id, { text: event.target.value })\n }\n data-testid=\"enem-classroom-survey-input\"\n />\n </div>\n\n <CheckBox\n label={question.skipLabel}\n checked={isSkipped}\n disabled={hasText}\n onChange={(event: ChangeEvent<HTMLInputElement>) =>\n updateAnswer(question.id, { skipped: event.target.checked })\n }\n data-testid=\"enem-classroom-survey-skip\"\n />\n </div>\n );\n };\n\n const renderSummaryStep = () => (\n <div\n className=\"flex flex-col items-center gap-6 text-center\"\n data-testid=\"enem-classroom-summary\"\n >\n <span className=\"flex items-center justify-center w-14 h-14 rounded-full bg-success-200 text-success-950\">\n <CheckIcon size={24} aria-hidden />\n </span>\n <div className=\"flex flex-col gap-2\">\n <Text size=\"xl\" weight=\"bold\" className=\"text-text-950\">\n Boa sorte!\n </Text>\n <Text size=\"sm\" className=\"text-text-600\">\n Sua simulação do ENEM já está para começar e o cronômetro vai iniciar.\n Respira fundo e dá o seu melhor!\n </Text>\n </div>\n\n <div\n className={cn(CARD_CLASSES, 'flex flex-col gap-3 w-full text-left p-4')}\n >\n <Text size=\"sm\" weight=\"bold\" className=\"text-text-950\">\n Suas respostas\n </Text>\n <dl className=\"flex flex-col gap-2\">\n {exam.languageChoice && (\n <SummaryRow\n label=\"Idioma\"\n value={language ? ENEM_CLASSROOM_LANGUAGE_LABELS[language] : '—'}\n />\n )}\n {surveyQuestions.map((question) => (\n <SummaryRow\n key={question.id}\n label={question.stepLabel}\n value={describeSurveyAnswer(question, answers[question.id])}\n />\n ))}\n </dl>\n <Button\n size=\"medium\"\n variant=\"outline\"\n action=\"primary\"\n className=\"self-center\"\n disabled={isStarting}\n onClick={() => setStep(FIRST_CHOICE_STEP)}\n data-testid=\"enem-classroom-review\"\n >\n Revisar minhas respostas\n </Button>\n </div>\n\n <Button\n size=\"large\"\n variant=\"solid\"\n action=\"primary\"\n className={cn('w-full', GRADIENT_CTA_CLASSES)}\n disabled={isStarting}\n onClick={handleStart}\n data-testid=\"enem-classroom-start\"\n >\n Iniciar a prova!\n </Button>\n </div>\n );\n\n const renderStepContent = () => {\n if (currentStep.kind === 'intro') return renderIntroStep();\n if (currentStep.kind === 'language') return renderLanguageStep();\n if (currentStep.kind === 'survey')\n return renderSurveyStep(currentStep.question, currentStep.index);\n return renderSummaryStep();\n };\n\n const showNavigation = step >= FIRST_CHOICE_STEP && step < summaryStep;\n const showStepper = step < summaryStep;\n\n const footer = showNavigation ? (\n <div className=\"flex flex-row justify-end gap-2 w-full\">\n <Button\n size=\"medium\"\n variant=\"outline\"\n action=\"primary\"\n iconLeft={<CaretLeftIcon size={16} aria-hidden />}\n onClick={() => setStep((current) => current - 1)}\n data-testid=\"enem-classroom-previous\"\n >\n Anterior\n </Button>\n <Button\n size=\"medium\"\n variant=\"solid\"\n action=\"primary\"\n iconRight={<CaretRightIcon size={16} aria-hidden />}\n disabled={!canGoNext}\n onClick={() => setStep((current) => current + 1)}\n data-testid=\"enem-classroom-next\"\n >\n Próximo\n </Button>\n </div>\n ) : undefined;\n\n return (\n <Modal\n isOpen={isOpen}\n onClose={onClose}\n /*\n * A tela de resumo abre com o header vazio, só o X — quem dá o título\n * ali é o \"Boa sorte!\". O texto continua no <h2>, apenas oculto: o\n * `aria-labelledby` do Modal aponta pra ele, e um h2 vazio deixaria o\n * dialog sem nome acessível.\n */\n title={\n showStepper ? exam.title : <span className=\"sr-only\">{exam.title}</span>\n }\n size=\"lg\"\n footer={footer}\n contentClassName=\"flex flex-col gap-6\"\n >\n {showStepper && (\n <Stepper steps={stepperSteps} currentStep={step} size=\"small\" />\n )}\n {renderStepContent()}\n </Modal>\n );\n};\n\nexport default EnemClassroomStartModal;\n"]}
@@ -2,7 +2,7 @@
2
2
  var _react = require('react');
3
3
  var _jsxruntime = require('react/jsx-runtime');
4
4
  var RichEditorCore = _react.lazy.call(void 0,
5
- () => Promise.resolve().then(() => _interopRequireWildcard(require("./RichEditorCore-F5QPQLEK.js"))).then((module) => ({
5
+ () => Promise.resolve().then(() => _interopRequireWildcard(require("./RichEditorCore-NEIZKFKE.js"))).then((module) => ({
6
6
  default: module.RichEditor
7
7
  }))
8
8
  );
@@ -93,4 +93,4 @@ function MissingDependenciesErrorFallback(error) {
93
93
 
94
94
 
95
95
  exports.RichEditor = RichEditor;
96
- //# sourceMappingURL=chunk-INIH23HU.js.map
96
+ //# sourceMappingURL=chunk-VF6QXUX3.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-INIH23HU.js","../src/components/RichEditor/RichEditor.tsx"],"names":[],"mappings":"AAAA;ACAA,8BAAqD;AAuGzC,+CAAA;AApGZ,IAAM,eAAA,EAAiB,yBAAA;AAAA,EAAK,CAAA,EAAA,GAC1B,4DAAA,CAAO,8BAAkB,GAAA,CAAE,IAAA,CAAK,CAAC,MAAA,EAAA,GAAA,CAAY;AAAA,IAC3C,OAAA,EAAS,MAAA,CAAO;AAAA,EAClB,CAAA,CAAE;AACJ,CAAA;AAwCA,IAAM,wBAAA,EAAN,MAAA,QAAsC,iBAGpC;AAAA,EACA,WAAA,CAAY,KAAA,EAA2B;AACrC,IAAA,KAAA,CAAM,KAAK,CAAA;AACX,IAAA,IAAA,CAAK,MAAA,EAAQ,EAAE,QAAA,EAAU,KAAA,EAAO,KAAA,EAAO,KAAK,CAAA;AAAA,EAC9C;AAAA,EAEA,OAAO,wBAAA,CAAyB,KAAA,EAAkC;AAChE,IAAA,OAAO,EAAE,QAAA,EAAU,IAAA,EAAM,MAAM,CAAA;AAAA,EACjC;AAAA,EAEA,MAAA,CAAA,EAAS;AACP,IAAA,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO;AAC3C,MAAA,OAAO,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAAA,IAC7C;AACA,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,QAAA;AAAA,EACpB;AACF,CAAA;AAEA,IAAM,oBAAA,EAAsB;AAAA,EAC1B,eAAA;AAAA,EACA,cAAA;AAAA,EACA,qBAAA;AAAA,EACA,6BAAA;AAAA,EACA,8BAAA;AAAA,EACA,yBAAA;AAAA,EACA,8BAAA;AAAA,EACA,6BAAA;AAAA,EACA,6BAAA;AAAA,EACA,+BAAA;AAAA,EACA,wBAAA;AAAA,EACA,+BAAA;AAAA,EACA,yBAAA;AAAA,EACA;AACF,CAAA;AAEA,SAAS,wBAAA,CAAyB,EAAE,MAAM,CAAA,EAA8B;AACtE,EAAA,MAAM,cAAA,EACJ,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,SAAS,EAAA,GAChC,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,6BAA6B,CAAA;AAEtD,EAAA,MAAM,eAAA,EAAiB,CAAA,SAAA,EAAY,mBAAA,CAAoB,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AACD,EAAA;AAG9C,EAAA;AAEI,oBAAA;AACZ,MAAA;AAAA,MAAA;AACW,QAAA;AACL,QAAA;AACG,QAAA;AACD,QAAA;AAEP,QAAA;AAAC,UAAA;AAAA,UAAA;AACe,YAAA;AACC,YAAA;AACF,YAAA;AACX,YAAA;AAAA,UAAA;AACJ,QAAA;AAAA,MAAA;AAEJ,IAAA;AAEE,oBAAA;AAAc,sBAAA;AAKD,sBAAA;AAMI,MAAA;AAEX,wBAAA;AAAa,0BAAA;AAGG,0BAAA;AAGlB,QAAA;AAEE,wBAAA;AAAa,0BAAA;AAGG,0BAAA;AAGlB,QAAA;AACF,MAAA;AAEJ,IAAA;AAEJ,EAAA;AAEJ;AAE2B;AAER,EAAA;AACE,oBAAA;AACA,oBAAA;AACA,oBAAA;AACjB,EAAA;AAEJ;AAEmD;AAEZ,EAAA;AAMvC;AAEkE;AACjB,EAAA;AACjD;AD/EmE;AACA;AACA;AACA","file":"/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-INIH23HU.js","sourcesContent":[null,"import { lazy, Suspense, Component, ReactNode } from 'react';\n\n// Lazy load the editor core to catch missing dependencies\nconst RichEditorCore = lazy(() =>\n import('./RichEditorCore').then((module) => ({\n default: module.RichEditor,\n }))\n);\n\ninterface RichEditorProps {\n readonly content?: string;\n readonly onChange?: (data: { json: object; html: string }) => void;\n readonly placeholder?: string;\n /**\n * Optional callback to generate LaTeX using AI\n * If provided, the AI generation feature will be enabled in the formula dialog\n * @param description - Natural language description of the formula\n * @returns Promise resolving to the LaTeX string\n */\n readonly onGenerateLatexWithAI?: (description: string) => Promise<string>;\n /**\n * Optional callback to upload an image file and get back its public URL.\n * If provided, the file upload tab is enabled in the image dialog; otherwise\n * images can still be inserted by URL.\n * @param file - The image file selected by the user\n * @returns Promise resolving to the public URL of the uploaded image\n */\n readonly onUploadImage?: (file: File) => Promise<string>;\n /**\n * Enables pasting an image straight from the clipboard (Ctrl+V), uploading it\n * through `onUploadImage` and inserting the resulting URL. Off by default and\n * ignored without `onUploadImage`, since there would be nowhere to put the\n * file — the editor schema rejects base64 sources.\n */\n readonly allowImagePaste?: boolean;\n}\n\ninterface ErrorBoundaryState {\n hasError: boolean;\n error: Error | null;\n}\n\ninterface ErrorBoundaryProps {\n children: ReactNode;\n fallback: (error: Error) => ReactNode;\n}\n\nclass RichEditorErrorBoundary extends Component<\n ErrorBoundaryProps,\n ErrorBoundaryState\n> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false, error: null };\n }\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { hasError: true, error };\n }\n\n render() {\n if (this.state.hasError && this.state.error) {\n return this.props.fallback(this.state.error);\n }\n return this.props.children;\n }\n}\n\nconst TIPTAP_DEPENDENCIES = [\n '@tiptap/react',\n '@tiptap/core',\n '@tiptap/starter-kit',\n '@tiptap/extension-underline',\n '@tiptap/extension-text-align',\n '@tiptap/extension-color',\n '@tiptap/extension-text-style',\n '@tiptap/extension-highlight',\n '@tiptap/extension-subscript',\n '@tiptap/extension-superscript',\n '@tiptap/extension-link',\n '@tiptap/extension-placeholder',\n '@tiptap/extension-image',\n '@tiptap/extension-table',\n];\n\nfunction MissingDependenciesError({ error }: { readonly error: Error }) {\n const isTiptapError =\n error.message.includes('@tiptap') ||\n error.message.includes(\"Cannot find module '@tiptap\");\n\n const installCommand = `yarn add ${TIPTAP_DEPENDENCIES.join(' ')}`;\n const npmCommand = `npm install ${TIPTAP_DEPENDENCIES.join(' ')}`;\n\n return (\n <div className=\"border border-red-200 rounded-xl overflow-hidden bg-red-50 p-6\">\n <div className=\"flex items-start gap-3\">\n <div className=\"shrink-0 w-10 h-10 bg-red-100 rounded-full flex items-center justify-center\">\n <svg\n className=\"w-5 h-5 text-red-600\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\"\n />\n </svg>\n </div>\n <div className=\"flex-1\">\n <h3 className=\"text-lg font-semibold text-red-800 mb-2\">\n {isTiptapError\n ? 'Dependências do TipTap não encontradas'\n : 'Erro ao carregar o RichEditor'}\n </h3>\n <p className=\"text-red-700 text-sm mb-4\">\n {isTiptapError\n ? 'O componente RichEditor requer as dependências do TipTap para funcionar. Instale-as executando um dos comandos abaixo:'\n : error.message}\n </p>\n {isTiptapError && (\n <div className=\"space-y-3\">\n <div>\n <p className=\"text-xs text-red-600 font-medium mb-1\">\n Usando Yarn:\n </p>\n <code className=\"block bg-red-100 text-red-800 px-3 py-2 rounded text-xs font-mono overflow-x-auto\">\n {installCommand}\n </code>\n </div>\n <div>\n <p className=\"text-xs text-red-600 font-medium mb-1\">\n Usando NPM:\n </p>\n <code className=\"block bg-red-100 text-red-800 px-3 py-2 rounded text-xs font-mono overflow-x-auto\">\n {npmCommand}\n </code>\n </div>\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n\nfunction LoadingFallback() {\n return (\n <div className=\"border border-border-200 rounded-xl overflow-hidden bg-background-0 animate-pulse\">\n <div className=\"h-10 bg-background-100 border-b border-border-200\" />\n <div className=\"h-32 bg-background-50\" />\n <div className=\"h-8 bg-background-100 border-t border-border-200\" />\n </div>\n );\n}\n\nexport function RichEditor(props: RichEditorProps) {\n return (\n <RichEditorErrorBoundary fallback={MissingDependenciesErrorFallback}>\n <Suspense fallback={<LoadingFallback />}>\n <RichEditorCore {...props} />\n </Suspense>\n </RichEditorErrorBoundary>\n );\n}\n\nfunction MissingDependenciesErrorFallback(error: Readonly<Error>) {\n return <MissingDependenciesError error={error} />;\n}\n"]}
1
+ {"version":3,"sources":["/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-VF6QXUX3.js","../src/components/RichEditor/RichEditor.tsx"],"names":[],"mappings":"AAAA;ACAA,8BAAqD;AAuGzC,+CAAA;AApGZ,IAAM,eAAA,EAAiB,yBAAA;AAAA,EAAK,CAAA,EAAA,GAC1B,4DAAA,CAAO,8BAAkB,GAAA,CAAE,IAAA,CAAK,CAAC,MAAA,EAAA,GAAA,CAAY;AAAA,IAC3C,OAAA,EAAS,MAAA,CAAO;AAAA,EAClB,CAAA,CAAE;AACJ,CAAA;AAwCA,IAAM,wBAAA,EAAN,MAAA,QAAsC,iBAGpC;AAAA,EACA,WAAA,CAAY,KAAA,EAA2B;AACrC,IAAA,KAAA,CAAM,KAAK,CAAA;AACX,IAAA,IAAA,CAAK,MAAA,EAAQ,EAAE,QAAA,EAAU,KAAA,EAAO,KAAA,EAAO,KAAK,CAAA;AAAA,EAC9C;AAAA,EAEA,OAAO,wBAAA,CAAyB,KAAA,EAAkC;AAChE,IAAA,OAAO,EAAE,QAAA,EAAU,IAAA,EAAM,MAAM,CAAA;AAAA,EACjC;AAAA,EAEA,MAAA,CAAA,EAAS;AACP,IAAA,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO;AAC3C,MAAA,OAAO,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAAA,IAC7C;AACA,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,QAAA;AAAA,EACpB;AACF,CAAA;AAEA,IAAM,oBAAA,EAAsB;AAAA,EAC1B,eAAA;AAAA,EACA,cAAA;AAAA,EACA,qBAAA;AAAA,EACA,6BAAA;AAAA,EACA,8BAAA;AAAA,EACA,yBAAA;AAAA,EACA,8BAAA;AAAA,EACA,6BAAA;AAAA,EACA,6BAAA;AAAA,EACA,+BAAA;AAAA,EACA,wBAAA;AAAA,EACA,+BAAA;AAAA,EACA,yBAAA;AAAA,EACA;AACF,CAAA;AAEA,SAAS,wBAAA,CAAyB,EAAE,MAAM,CAAA,EAA8B;AACtE,EAAA,MAAM,cAAA,EACJ,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,SAAS,EAAA,GAChC,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,6BAA6B,CAAA;AAEtD,EAAA,MAAM,eAAA,EAAiB,CAAA,SAAA,EAAY,mBAAA,CAAoB,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AACD,EAAA;AAG9C,EAAA;AAEI,oBAAA;AACZ,MAAA;AAAA,MAAA;AACW,QAAA;AACL,QAAA;AACG,QAAA;AACD,QAAA;AAEP,QAAA;AAAC,UAAA;AAAA,UAAA;AACe,YAAA;AACC,YAAA;AACF,YAAA;AACX,YAAA;AAAA,UAAA;AACJ,QAAA;AAAA,MAAA;AAEJ,IAAA;AAEE,oBAAA;AAAc,sBAAA;AAKD,sBAAA;AAMI,MAAA;AAEX,wBAAA;AAAa,0BAAA;AAGG,0BAAA;AAGlB,QAAA;AAEE,wBAAA;AAAa,0BAAA;AAGG,0BAAA;AAGlB,QAAA;AACF,MAAA;AAEJ,IAAA;AAEJ,EAAA;AAEJ;AAE2B;AAER,EAAA;AACE,oBAAA;AACA,oBAAA;AACA,oBAAA;AACjB,EAAA;AAEJ;AAEmD;AAEZ,EAAA;AAMvC;AAEkE;AACjB,EAAA;AACjD;AD/EmE;AACA;AACA;AACA","file":"/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-VF6QXUX3.js","sourcesContent":[null,"import { lazy, Suspense, Component, ReactNode } from 'react';\n\n// Lazy load the editor core to catch missing dependencies\nconst RichEditorCore = lazy(() =>\n import('./RichEditorCore').then((module) => ({\n default: module.RichEditor,\n }))\n);\n\ninterface RichEditorProps {\n readonly content?: string;\n readonly onChange?: (data: { json: object; html: string }) => void;\n readonly placeholder?: string;\n /**\n * Optional callback to generate LaTeX using AI\n * If provided, the AI generation feature will be enabled in the formula dialog\n * @param description - Natural language description of the formula\n * @returns Promise resolving to the LaTeX string\n */\n readonly onGenerateLatexWithAI?: (description: string) => Promise<string>;\n /**\n * Optional callback to upload an image file and get back its public URL.\n * If provided, the file upload tab is enabled in the image dialog; otherwise\n * images can still be inserted by URL.\n * @param file - The image file selected by the user\n * @returns Promise resolving to the public URL of the uploaded image\n */\n readonly onUploadImage?: (file: File) => Promise<string>;\n /**\n * Enables pasting an image straight from the clipboard (Ctrl+V), uploading it\n * through `onUploadImage` and inserting the resulting URL. Off by default and\n * ignored without `onUploadImage`, since there would be nowhere to put the\n * file — the editor schema rejects base64 sources.\n */\n readonly allowImagePaste?: boolean;\n}\n\ninterface ErrorBoundaryState {\n hasError: boolean;\n error: Error | null;\n}\n\ninterface ErrorBoundaryProps {\n children: ReactNode;\n fallback: (error: Error) => ReactNode;\n}\n\nclass RichEditorErrorBoundary extends Component<\n ErrorBoundaryProps,\n ErrorBoundaryState\n> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false, error: null };\n }\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { hasError: true, error };\n }\n\n render() {\n if (this.state.hasError && this.state.error) {\n return this.props.fallback(this.state.error);\n }\n return this.props.children;\n }\n}\n\nconst TIPTAP_DEPENDENCIES = [\n '@tiptap/react',\n '@tiptap/core',\n '@tiptap/starter-kit',\n '@tiptap/extension-underline',\n '@tiptap/extension-text-align',\n '@tiptap/extension-color',\n '@tiptap/extension-text-style',\n '@tiptap/extension-highlight',\n '@tiptap/extension-subscript',\n '@tiptap/extension-superscript',\n '@tiptap/extension-link',\n '@tiptap/extension-placeholder',\n '@tiptap/extension-image',\n '@tiptap/extension-table',\n];\n\nfunction MissingDependenciesError({ error }: { readonly error: Error }) {\n const isTiptapError =\n error.message.includes('@tiptap') ||\n error.message.includes(\"Cannot find module '@tiptap\");\n\n const installCommand = `yarn add ${TIPTAP_DEPENDENCIES.join(' ')}`;\n const npmCommand = `npm install ${TIPTAP_DEPENDENCIES.join(' ')}`;\n\n return (\n <div className=\"border border-red-200 rounded-xl overflow-hidden bg-red-50 p-6\">\n <div className=\"flex items-start gap-3\">\n <div className=\"shrink-0 w-10 h-10 bg-red-100 rounded-full flex items-center justify-center\">\n <svg\n className=\"w-5 h-5 text-red-600\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\"\n />\n </svg>\n </div>\n <div className=\"flex-1\">\n <h3 className=\"text-lg font-semibold text-red-800 mb-2\">\n {isTiptapError\n ? 'Dependências do TipTap não encontradas'\n : 'Erro ao carregar o RichEditor'}\n </h3>\n <p className=\"text-red-700 text-sm mb-4\">\n {isTiptapError\n ? 'O componente RichEditor requer as dependências do TipTap para funcionar. Instale-as executando um dos comandos abaixo:'\n : error.message}\n </p>\n {isTiptapError && (\n <div className=\"space-y-3\">\n <div>\n <p className=\"text-xs text-red-600 font-medium mb-1\">\n Usando Yarn:\n </p>\n <code className=\"block bg-red-100 text-red-800 px-3 py-2 rounded text-xs font-mono overflow-x-auto\">\n {installCommand}\n </code>\n </div>\n <div>\n <p className=\"text-xs text-red-600 font-medium mb-1\">\n Usando NPM:\n </p>\n <code className=\"block bg-red-100 text-red-800 px-3 py-2 rounded text-xs font-mono overflow-x-auto\">\n {npmCommand}\n </code>\n </div>\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n\nfunction LoadingFallback() {\n return (\n <div className=\"border border-border-200 rounded-xl overflow-hidden bg-background-0 animate-pulse\">\n <div className=\"h-10 bg-background-100 border-b border-border-200\" />\n <div className=\"h-32 bg-background-50\" />\n <div className=\"h-8 bg-background-100 border-t border-border-200\" />\n </div>\n );\n}\n\nexport function RichEditor(props: RichEditorProps) {\n return (\n <RichEditorErrorBoundary fallback={MissingDependenciesErrorFallback}>\n <Suspense fallback={<LoadingFallback />}>\n <RichEditorCore {...props} />\n </Suspense>\n </RichEditorErrorBoundary>\n );\n}\n\nfunction MissingDependenciesErrorFallback(error: Readonly<Error>) {\n return <MissingDependenciesError error={error} />;\n}\n"]}
@@ -6,7 +6,7 @@ import {
6
6
  } from "./chunk-53ICLDGS.mjs";
7
7
  import {
8
8
  useQuizStore
9
- } from "./chunk-FL4W4S6J.mjs";
9
+ } from "./chunk-MOSP7FR5.mjs";
10
10
 
11
11
  // src/components/Quiz/TeacherFeedbackSection.tsx
12
12
  import { forwardRef } from "react";
@@ -51,4 +51,4 @@ TeacherFeedbackSection.displayName = "TeacherFeedbackSection";
51
51
  export {
52
52
  TeacherFeedbackSection
53
53
  };
54
- //# sourceMappingURL=chunk-QWC5GC2Q.mjs.map
54
+ //# sourceMappingURL=chunk-WY7V5UJN.mjs.map
@@ -1,6 +1,6 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
2
2
 
3
- var _chunkXX4WE4TLjs = require('./chunk-XX4WE4TL.js');
3
+ var _chunk726PIA5Mjs = require('./chunk-726PIA5M.js');
4
4
 
5
5
  // src/components/ActivityCreate/ActivityCreate.utils.ts
6
6
  function extractLessonsFromResponse(responseData) {
@@ -29,7 +29,7 @@ function extractLessonsFromResponse(responseData) {
29
29
  }
30
30
  return [];
31
31
  }
32
- var VALID_QUESTION_TYPES = new Set(Object.values(_chunkXX4WE4TLjs.QUESTION_TYPE));
32
+ var VALID_QUESTION_TYPES = new Set(Object.values(_chunk726PIA5Mjs.QUESTION_TYPE));
33
33
  var isValidQuestionType = (type) => {
34
34
  return VALID_QUESTION_TYPES.has(type);
35
35
  };
@@ -437,4 +437,4 @@ function shouldAddActivityToLessonDraft(activityDraftId, recommendedLessonDraftI
437
437
 
438
438
 
439
439
  exports.extractLessonsFromResponse = extractLessonsFromResponse; exports.convertFiltersToBackendFormat = convertFiltersToBackendFormat; exports.convertBackendFiltersToActivityFiltersData = convertBackendFiltersToActivityFiltersData; exports.getSubjectName = getSubjectName; exports.getActivityTypeLabel = getActivityTypeLabel; exports.generateTitle = generateTitle; exports.generateMultiSubjectTitle = generateMultiSubjectTitle; exports.resolveActivitySubjectId = resolveActivitySubjectId; exports.getTypeFromUrl = getTypeFromUrl; exports.getTypeFromUrlString = getTypeFromUrlString; exports.convertQuestionToPreview = convertQuestionToPreview; exports.buildISODateTime = buildISODateTime; exports.buildFinalDateTime = buildFinalDateTime; exports.buildSendActivityPayload = buildSendActivityPayload; exports.hasQuestionsChanged = hasQuestionsChanged; exports.buildUrlWithParams = buildUrlWithParams; exports.shouldSkipAutoSave = shouldSkipAutoSave; exports.extractDraftFromResponse = extractDraftFromResponse; exports.getRecommendedClassEndpoint = getRecommendedClassEndpoint; exports.buildActivityDraftIds = buildActivityDraftIds; exports.buildLessonIds = buildLessonIds; exports.buildLessonDraftUpdatePayload = buildLessonDraftUpdatePayload; exports.formatNavigatePath = formatNavigatePath; exports.extractActivityIdFromResponse = extractActivityIdFromResponse; exports.buildSendToStudentsPayload = buildSendToStudentsPayload; exports.validateSendActivityResponses = validateSendActivityResponses; exports.formatErrorMessage = formatErrorMessage; exports.buildActivityDataFromDraft = buildActivityDataFromDraft; exports.buildPartialActivityUpdate = buildPartialActivityUpdate; exports.buildPayloadWithTypeOverride = buildPayloadWithTypeOverride; exports.shouldUpdateUrl = shouldUpdateUrl; exports.resolvePreFilters = resolvePreFilters; exports.getInitialFiltersData = getInitialFiltersData; exports.shouldTriggerSaveOnReorder = shouldTriggerSaveOnReorder; exports.hasRequiredSubjectIds = hasRequiredSubjectIds; exports.shouldSaveDraftBeforeAddingToLesson = shouldSaveDraftBeforeAddingToLesson; exports.shouldUseCustomAddActivityCallback = shouldUseCustomAddActivityCallback; exports.shouldAddActivityToLessonDraft = shouldAddActivityToLessonDraft;
440
- //# sourceMappingURL=chunk-OCKO7T7L.js.map
440
+ //# sourceMappingURL=chunk-XQAYZBLL.js.map