analytica-frontend-lib 1.6.76 → 1.6.78

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 (473) hide show
  1. package/dist/AccessReportModal/index.js +4 -5
  2. package/dist/AccessReportModal/index.js.map +1 -1
  3. package/dist/AccessReportModal/index.mjs +3 -4
  4. package/dist/AccessibilityWidget/index.js +4 -5
  5. package/dist/AccessibilityWidget/index.js.map +1 -1
  6. package/dist/AccessibilityWidget/index.mjs +3 -4
  7. package/dist/Accordation/index.js +4 -4
  8. package/dist/Accordation/index.mjs +3 -3
  9. package/dist/ActivitiesHistory/index.js +48 -49
  10. package/dist/ActivitiesHistory/index.js.map +1 -1
  11. package/dist/ActivitiesHistory/index.mjs +47 -48
  12. package/dist/ActivityCardQuestionBanks/index.d.ts.map +1 -1
  13. package/dist/ActivityCardQuestionBanks/index.js +48 -49
  14. package/dist/ActivityCardQuestionBanks/index.js.map +1 -1
  15. package/dist/ActivityCardQuestionBanks/index.mjs +47 -48
  16. package/dist/ActivityCardQuestionPreview/index.js +48 -49
  17. package/dist/ActivityCardQuestionPreview/index.js.map +1 -1
  18. package/dist/ActivityCardQuestionPreview/index.mjs +47 -48
  19. package/dist/ActivityCreate/ActivityCreateContent/index.js +48 -49
  20. package/dist/ActivityCreate/ActivityCreateContent/index.js.map +1 -1
  21. package/dist/ActivityCreate/ActivityCreateContent/index.mjs +47 -48
  22. package/dist/ActivityCreate/index.js +48 -49
  23. package/dist/ActivityCreate/index.js.map +1 -1
  24. package/dist/ActivityCreate/index.mjs +47 -48
  25. package/dist/ActivityDetails/index.js +48 -49
  26. package/dist/ActivityDetails/index.js.map +1 -1
  27. package/dist/ActivityDetails/index.mjs +47 -48
  28. package/dist/ActivityFilters/index.js +48 -49
  29. package/dist/ActivityFilters/index.js.map +1 -1
  30. package/dist/ActivityFilters/index.mjs +47 -48
  31. package/dist/ActivityPageLayout/index.js +48 -49
  32. package/dist/ActivityPageLayout/index.js.map +1 -1
  33. package/dist/ActivityPageLayout/index.mjs +47 -48
  34. package/dist/ActivityPreview/index.js +48 -49
  35. package/dist/ActivityPreview/index.js.map +1 -1
  36. package/dist/ActivityPreview/index.mjs +47 -48
  37. package/dist/AlertDialog/index.d.ts.map +1 -1
  38. package/dist/AlertDialog/index.js +3 -3
  39. package/dist/AlertDialog/index.mjs +2 -2
  40. package/dist/AlertManager/index.js +48 -49
  41. package/dist/AlertManager/index.js.map +1 -1
  42. package/dist/AlertManager/index.mjs +47 -48
  43. package/dist/AlertManagerView/index.js +4 -5
  44. package/dist/AlertManagerView/index.js.map +1 -1
  45. package/dist/AlertManagerView/index.mjs +3 -4
  46. package/dist/AnnouncementModal/index.js +4 -5
  47. package/dist/AnnouncementModal/index.js.map +1 -1
  48. package/dist/AnnouncementModal/index.mjs +3 -4
  49. package/dist/AnnouncementsGate/index.js +5 -6
  50. package/dist/AnnouncementsGate/index.js.map +1 -1
  51. package/dist/AnnouncementsGate/index.mjs +4 -5
  52. package/dist/AnswerKeyModal/index.js +4 -5
  53. package/dist/AnswerKeyModal/index.js.map +1 -1
  54. package/dist/AnswerKeyModal/index.mjs +3 -4
  55. package/dist/AppHeader/index.js +8 -9
  56. package/dist/AppHeader/index.js.map +1 -1
  57. package/dist/AppHeader/index.mjs +7 -8
  58. package/dist/CalendarCard/index.js +6 -7
  59. package/dist/CalendarCard/index.js.map +1 -1
  60. package/dist/CalendarCard/index.mjs +5 -6
  61. package/dist/Card/index.d.ts.map +1 -1
  62. package/dist/Card/index.js +3 -3
  63. package/dist/Card/index.mjs +2 -2
  64. package/dist/Chat/index.js +4 -5
  65. package/dist/Chat/index.js.map +1 -1
  66. package/dist/Chat/index.mjs +3 -4
  67. package/dist/Chatbot/index.js +4 -5
  68. package/dist/Chatbot/index.js.map +1 -1
  69. package/dist/Chatbot/index.mjs +3 -4
  70. package/dist/CheckBoxGroup/index.js +48 -49
  71. package/dist/CheckBoxGroup/index.js.map +1 -1
  72. package/dist/CheckBoxGroup/index.mjs +47 -48
  73. package/dist/ComparatorChart/ComparatorView/index.js +4 -5
  74. package/dist/ComparatorChart/ComparatorView/index.js.map +1 -1
  75. package/dist/ComparatorChart/ComparatorView/index.mjs +3 -4
  76. package/dist/CorrectActivityModal/index.js +9 -10
  77. package/dist/CorrectActivityModal/index.js.map +1 -1
  78. package/dist/CorrectActivityModal/index.mjs +8 -9
  79. package/dist/DownloadButton/index.js +6 -7
  80. package/dist/DownloadButton/index.js.map +1 -1
  81. package/dist/DownloadButton/index.mjs +5 -6
  82. package/dist/DownloadModal/index.js +4 -5
  83. package/dist/DownloadModal/index.js.map +1 -1
  84. package/dist/DownloadModal/index.mjs +3 -4
  85. package/dist/DropdownMenu/index.js +4 -5
  86. package/dist/DropdownMenu/index.js.map +1 -1
  87. package/dist/DropdownMenu/index.mjs +3 -4
  88. package/dist/EnemClassroomStartModal/index.js +8 -9
  89. package/dist/EnemClassroomStartModal/index.js.map +1 -1
  90. package/dist/EnemClassroomStartModal/index.mjs +7 -8
  91. package/dist/EnemMoment/index.js +110 -94
  92. package/dist/EnemMoment/index.js.map +1 -1
  93. package/dist/EnemMoment/index.mjs +74 -58
  94. package/dist/EnemMoment/index.mjs.map +1 -1
  95. package/dist/EnemMomentStudentModal/index.js +62 -63
  96. package/dist/EnemMomentStudentModal/index.js.map +1 -1
  97. package/dist/EnemMomentStudentModal/index.mjs +48 -49
  98. package/dist/EnemMomentStudentModal/index.mjs.map +1 -1
  99. package/dist/EssayThemePicker/index.js +3 -3
  100. package/dist/EssayThemePicker/index.mjs +2 -2
  101. package/dist/ExamDetailsLayout/ExamDetailsPage/index.js +48 -49
  102. package/dist/ExamDetailsLayout/ExamDetailsPage/index.js.map +1 -1
  103. package/dist/ExamDetailsLayout/ExamDetailsPage/index.mjs +47 -48
  104. package/dist/ExamPageLayout/index.js +48 -49
  105. package/dist/ExamPageLayout/index.js.map +1 -1
  106. package/dist/ExamPageLayout/index.mjs +47 -48
  107. package/dist/Forum/index.js +6 -7
  108. package/dist/Forum/index.js.map +1 -1
  109. package/dist/Forum/index.mjs +5 -6
  110. package/dist/IconButton/index.js +2 -2
  111. package/dist/IconButton/index.mjs +1 -1
  112. package/dist/LessonCardPreview/index.js +48 -49
  113. package/dist/LessonCardPreview/index.js.map +1 -1
  114. package/dist/LessonCardPreview/index.mjs +47 -48
  115. package/dist/LessonMediaSections/index.js +48 -49
  116. package/dist/LessonMediaSections/index.js.map +1 -1
  117. package/dist/LessonMediaSections/index.mjs +47 -48
  118. package/dist/LessonsCatalog/index.js +48 -49
  119. package/dist/LessonsCatalog/index.js.map +1 -1
  120. package/dist/LessonsCatalog/index.mjs +47 -48
  121. package/dist/Modal/index.d.ts +11 -1
  122. package/dist/Modal/index.d.ts.map +1 -1
  123. package/dist/Modal/index.js +3 -4
  124. package/dist/Modal/index.js.map +1 -1
  125. package/dist/Modal/index.mjs +2 -3
  126. package/dist/MultiCheckSelect/index.js +5 -6
  127. package/dist/MultiCheckSelect/index.js.map +1 -1
  128. package/dist/MultiCheckSelect/index.mjs +4 -5
  129. package/dist/NotificationCard/index.js +6 -7
  130. package/dist/NotificationCard/index.js.map +1 -1
  131. package/dist/NotificationCard/index.mjs +5 -6
  132. package/dist/PerformanceReportModal/index.js +4 -5
  133. package/dist/PerformanceReportModal/index.js.map +1 -1
  134. package/dist/PerformanceReportModal/index.mjs +3 -4
  135. package/dist/PrintableUsersTable/index.js +48 -49
  136. package/dist/PrintableUsersTable/index.js.map +1 -1
  137. package/dist/PrintableUsersTable/index.mjs +47 -48
  138. package/dist/ProgressModal/index.js +4 -5
  139. package/dist/ProgressModal/index.js.map +1 -1
  140. package/dist/ProgressModal/index.mjs +3 -4
  141. package/dist/QuestionsPerformanceCard/index.js +49 -50
  142. package/dist/QuestionsPerformanceCard/index.js.map +1 -1
  143. package/dist/QuestionsPerformanceCard/index.mjs +48 -49
  144. package/dist/Quiz/QuizResult/index.js +4 -4
  145. package/dist/Quiz/QuizResult/index.mjs +3 -3
  146. package/dist/Quiz/index.d.ts.map +1 -1
  147. package/dist/Quiz/index.js +8 -9
  148. package/dist/Quiz/index.js.map +1 -1
  149. package/dist/Quiz/index.mjs +7 -8
  150. package/dist/QuizTimer/index.d.ts +12 -0
  151. package/dist/QuizTimer/index.d.ts.map +1 -1
  152. package/dist/QuizTimer/index.js +4 -2
  153. package/dist/QuizTimer/index.js.map +1 -1
  154. package/dist/QuizTimer/index.mjs +4 -2
  155. package/dist/RecommendedLessonCreate/index.js +48 -49
  156. package/dist/RecommendedLessonCreate/index.js.map +1 -1
  157. package/dist/RecommendedLessonCreate/index.mjs +47 -48
  158. package/dist/RecommendedLessonDetails/index.js +11 -12
  159. package/dist/RecommendedLessonDetails/index.js.map +1 -1
  160. package/dist/RecommendedLessonDetails/index.mjs +10 -11
  161. package/dist/RecommendedLessonsHistory/index.js +48 -49
  162. package/dist/RecommendedLessonsHistory/index.js.map +1 -1
  163. package/dist/RecommendedLessonsHistory/index.mjs +47 -48
  164. package/dist/ReportDetailModal/index.js +5 -6
  165. package/dist/ReportDetailModal/index.js.map +1 -1
  166. package/dist/ReportDetailModal/index.mjs +4 -5
  167. package/dist/RichEditor/index.js +6 -7
  168. package/dist/RichEditor/index.js.map +1 -1
  169. package/dist/RichEditor/index.mjs +5 -6
  170. package/dist/{RichEditorCore-62NIM7PC.js → RichEditorCore-6OT3VNJR.js} +15 -16
  171. package/dist/RichEditorCore-6OT3VNJR.js.map +1 -0
  172. package/dist/{RichEditorCore-CCO3SSSU.mjs → RichEditorCore-IF6JQHEO.mjs} +6 -7
  173. package/dist/{RichEditorCore-CCO3SSSU.mjs.map → RichEditorCore-IF6JQHEO.mjs.map} +1 -1
  174. package/dist/Search/index.js +5 -6
  175. package/dist/Search/index.js.map +1 -1
  176. package/dist/Search/index.mjs +4 -5
  177. package/dist/SendActivityModal/SendActivityModal.js +48 -49
  178. package/dist/SendActivityModal/SendActivityModal.js.map +1 -1
  179. package/dist/SendActivityModal/SendActivityModal.mjs +47 -48
  180. package/dist/SendActivityModal/index.js +48 -49
  181. package/dist/SendActivityModal/index.js.map +1 -1
  182. package/dist/SendActivityModal/index.mjs +47 -48
  183. package/dist/SendLessonModal/index.js +48 -49
  184. package/dist/SendLessonModal/index.js.map +1 -1
  185. package/dist/SendLessonModal/index.mjs +47 -48
  186. package/dist/SimulatedPerformance/SimulatedPerformanceView/index.js +48 -49
  187. package/dist/SimulatedPerformance/SimulatedPerformanceView/index.js.map +1 -1
  188. package/dist/SimulatedPerformance/SimulatedPerformanceView/index.mjs +47 -48
  189. package/dist/SimulatedPerformance/useSimulatedPerformance/index.js +6 -7
  190. package/dist/SimulatedPerformance/useSimulatedPerformance/index.js.map +1 -1
  191. package/dist/SimulatedPerformance/useSimulatedPerformance/index.mjs +5 -6
  192. package/dist/SimulatedStudentSimulationsModal/index.js +8 -9
  193. package/dist/SimulatedStudentSimulationsModal/index.js.map +1 -1
  194. package/dist/SimulatedStudentSimulationsModal/index.mjs +7 -8
  195. package/dist/SimulationSummaryCards/index.js +5 -5
  196. package/dist/SimulationSummaryCards/index.mjs +4 -4
  197. package/dist/SimulationsPage/index.js +48 -49
  198. package/dist/SimulationsPage/index.js.map +1 -1
  199. package/dist/SimulationsPage/index.mjs +47 -48
  200. package/dist/StudentLessonProgressModal/index.js +6 -7
  201. package/dist/StudentLessonProgressModal/index.js.map +1 -1
  202. package/dist/StudentLessonProgressModal/index.mjs +5 -6
  203. package/dist/StudentPerformanceDetailsModal/index.js +9 -10
  204. package/dist/StudentPerformanceDetailsModal/index.js.map +1 -1
  205. package/dist/StudentPerformanceDetailsModal/index.mjs +8 -9
  206. package/dist/Support/TicketModal/index.js +4 -5
  207. package/dist/Support/TicketModal/index.js.map +1 -1
  208. package/dist/Support/TicketModal/index.mjs +3 -4
  209. package/dist/Support/index.js +5 -6
  210. package/dist/Support/index.js.map +1 -1
  211. package/dist/Support/index.mjs +4 -5
  212. package/dist/TableProvider/index.js +48 -49
  213. package/dist/TableProvider/index.js.map +1 -1
  214. package/dist/TableProvider/index.mjs +47 -48
  215. package/dist/UnifiedDraftModelPage/index.js +48 -49
  216. package/dist/UnifiedDraftModelPage/index.js.map +1 -1
  217. package/dist/UnifiedDraftModelPage/index.mjs +47 -48
  218. package/dist/UnifiedHistoryPage/index.js +48 -49
  219. package/dist/UnifiedHistoryPage/index.js.map +1 -1
  220. package/dist/UnifiedHistoryPage/index.mjs +47 -48
  221. package/dist/VideoPlayer/index.js +7 -8
  222. package/dist/VideoPlayer/index.js.map +1 -1
  223. package/dist/VideoPlayer/index.mjs +6 -7
  224. package/dist/Whiteboard/index.js +4 -5
  225. package/dist/Whiteboard/index.js.map +1 -1
  226. package/dist/Whiteboard/index.mjs +3 -4
  227. package/dist/{chunk-EVBQNVQW.mjs → chunk-233FSBU7.mjs} +5 -5
  228. package/dist/{chunk-JU63EMZM.js → chunk-24DQFREC.js} +3 -3
  229. package/dist/{chunk-JU63EMZM.js.map → chunk-24DQFREC.js.map} +1 -1
  230. package/dist/{chunk-QFXSQKW3.mjs → chunk-254EBPMW.mjs} +22 -22
  231. package/dist/{chunk-QFXSQKW3.mjs.map → chunk-254EBPMW.mjs.map} +1 -1
  232. package/dist/{chunk-SFQVZ4KQ.js → chunk-2ETPIOCD.js} +3 -3
  233. package/dist/{chunk-SFQVZ4KQ.js.map → chunk-2ETPIOCD.js.map} +1 -1
  234. package/dist/{chunk-RCNIBRZY.js → chunk-2VTJ2PKF.js} +10 -10
  235. package/dist/{chunk-RCNIBRZY.js.map → chunk-2VTJ2PKF.js.map} +1 -1
  236. package/dist/{chunk-B35D5S4G.js → chunk-2ZMGNCMI.js} +6 -6
  237. package/dist/{chunk-B35D5S4G.js.map → chunk-2ZMGNCMI.js.map} +1 -1
  238. package/dist/{chunk-QEPKR6ZF.js → chunk-3KSRDIS2.js} +20 -20
  239. package/dist/{chunk-QEPKR6ZF.js.map → chunk-3KSRDIS2.js.map} +1 -1
  240. package/dist/{chunk-MUCV5ZWZ.mjs → chunk-3YF7H577.mjs} +15 -9
  241. package/dist/chunk-3YF7H577.mjs.map +1 -0
  242. package/dist/{chunk-MADPP2PW.mjs → chunk-3ZSI2KI5.mjs} +2 -2
  243. package/dist/{chunk-2W7PTFXS.mjs → chunk-42XKJV56.mjs} +2 -2
  244. package/dist/{chunk-M6TC6XRQ.mjs → chunk-55ESXRRM.mjs} +2 -2
  245. package/dist/{chunk-4MURAKPC.mjs → chunk-5DJVOLVX.mjs} +3 -3
  246. package/dist/{chunk-YVT7CT3G.mjs → chunk-5P6CBDZ6.mjs} +2 -2
  247. package/dist/{chunk-BHKTJCFD.js → chunk-5QUP5HKB.js} +3 -3
  248. package/dist/{chunk-BHKTJCFD.js.map → chunk-5QUP5HKB.js.map} +1 -1
  249. package/dist/{chunk-SFEU7BMY.mjs → chunk-5SFNRXZB.mjs} +2 -2
  250. package/dist/{chunk-6ALEXGAN.js → chunk-6U4AI5SE.js} +6 -6
  251. package/dist/{chunk-6ALEXGAN.js.map → chunk-6U4AI5SE.js.map} +1 -1
  252. package/dist/{chunk-KYY4U5SN.mjs → chunk-6Z5W5J44.mjs} +3 -3
  253. package/dist/{chunk-XOKBMLW3.js → chunk-7IGUYLSF.js} +3 -3
  254. package/dist/{chunk-XOKBMLW3.js.map → chunk-7IGUYLSF.js.map} +1 -1
  255. package/dist/{chunk-GVYGPJH3.mjs → chunk-AU5M2766.mjs} +2 -2
  256. package/dist/{chunk-2VODGC76.js → chunk-AVEMHDN2.js} +66 -44
  257. package/dist/chunk-AVEMHDN2.js.map +1 -0
  258. package/dist/{chunk-HIIOADV4.js → chunk-AZSRKBYS.js} +63 -71
  259. package/dist/chunk-AZSRKBYS.js.map +1 -0
  260. package/dist/{chunk-CY2VKNCB.js → chunk-BQIBVC6X.js} +5 -5
  261. package/dist/{chunk-CY2VKNCB.js.map → chunk-BQIBVC6X.js.map} +1 -1
  262. package/dist/{chunk-M77TQ5JJ.mjs → chunk-BU32E6BR.mjs} +4 -6
  263. package/dist/{chunk-M77TQ5JJ.mjs.map → chunk-BU32E6BR.mjs.map} +1 -1
  264. package/dist/{chunk-5CQVDUDO.js → chunk-BUNF5POU.js} +5 -5
  265. package/dist/{chunk-5CQVDUDO.js.map → chunk-BUNF5POU.js.map} +1 -1
  266. package/dist/{chunk-Z6UN4ZPW.mjs → chunk-BVHVYC7Q.mjs} +4 -4
  267. package/dist/{chunk-WJENEFDG.js → chunk-CAFVLHDV.js} +3 -3
  268. package/dist/{chunk-WJENEFDG.js.map → chunk-CAFVLHDV.js.map} +1 -1
  269. package/dist/{chunk-BVUPM6EY.js → chunk-CAQ2Q3ON.js} +2 -2
  270. package/dist/chunk-CAQ2Q3ON.js.map +1 -0
  271. package/dist/{chunk-QMPOGLAR.js → chunk-CIASXVWX.js} +3 -3
  272. package/dist/{chunk-QMPOGLAR.js.map → chunk-CIASXVWX.js.map} +1 -1
  273. package/dist/{chunk-APKEYUJ3.js → chunk-CIQLC2ZZ.js} +3 -3
  274. package/dist/{chunk-APKEYUJ3.js.map → chunk-CIQLC2ZZ.js.map} +1 -1
  275. package/dist/{chunk-36XPNLGQ.js → chunk-CW3FCWR4.js} +16 -16
  276. package/dist/{chunk-36XPNLGQ.js.map → chunk-CW3FCWR4.js.map} +1 -1
  277. package/dist/{chunk-J5VEAJN5.mjs → chunk-CWVUGZNK.mjs} +2 -2
  278. package/dist/{chunk-BCMDP6GK.mjs → chunk-DV3N2K3Y.mjs} +4 -4
  279. package/dist/{chunk-PP7SEERV.mjs → chunk-DXYSEBK3.mjs} +9 -3
  280. package/dist/chunk-DXYSEBK3.mjs.map +1 -0
  281. package/dist/{chunk-754M6HQ5.js → chunk-EJN4OP3D.js} +5 -5
  282. package/dist/{chunk-754M6HQ5.js.map → chunk-EJN4OP3D.js.map} +1 -1
  283. package/dist/{chunk-3IM2SBPO.js → chunk-F5K3HMKT.js} +4 -4
  284. package/dist/{chunk-3IM2SBPO.js.map → chunk-F5K3HMKT.js.map} +1 -1
  285. package/dist/{chunk-WMDSGVZ7.mjs → chunk-GCGSAS2Z.mjs} +48 -63
  286. package/dist/chunk-GCGSAS2Z.mjs.map +1 -0
  287. package/dist/{chunk-EXHGEJ4P.mjs → chunk-GKARHTZ2.mjs} +2 -2
  288. package/dist/{chunk-2VDCEEXB.js → chunk-GNKFBVW4.js} +3 -3
  289. package/dist/{chunk-2VDCEEXB.js.map → chunk-GNKFBVW4.js.map} +1 -1
  290. package/dist/{chunk-CDLOMECB.js → chunk-GTBPMNTJ.js} +3 -3
  291. package/dist/{chunk-CDLOMECB.js.map → chunk-GTBPMNTJ.js.map} +1 -1
  292. package/dist/{chunk-YQKAASWM.js → chunk-GXXDSBN2.js} +10 -4
  293. package/dist/chunk-GXXDSBN2.js.map +1 -0
  294. package/dist/{chunk-FASVPU6N.js → chunk-H3F4OCXC.js} +10 -10
  295. package/dist/{chunk-FASVPU6N.js.map → chunk-H3F4OCXC.js.map} +1 -1
  296. package/dist/{chunk-JCFN6KRS.mjs → chunk-HGWDB73S.mjs} +2 -2
  297. package/dist/{chunk-JXXMO7PY.mjs → chunk-HN5RW4C3.mjs} +3 -3
  298. package/dist/{chunk-I2A4EQPH.mjs → chunk-HQ2GXFK5.mjs} +6 -6
  299. package/dist/{chunk-BIPC6F6D.js → chunk-IDJ37MOU.js} +115 -115
  300. package/dist/{chunk-BIPC6F6D.js.map → chunk-IDJ37MOU.js.map} +1 -1
  301. package/dist/{chunk-TBJLNIOY.mjs → chunk-JBLYYTHN.mjs} +2 -2
  302. package/dist/{chunk-G4NK66PM.js → chunk-JTWXQ267.js} +24 -18
  303. package/dist/chunk-JTWXQ267.js.map +1 -0
  304. package/dist/{chunk-V6IC74KH.js → chunk-JXGLDRDC.js} +34 -34
  305. package/dist/{chunk-V6IC74KH.js.map → chunk-JXGLDRDC.js.map} +1 -1
  306. package/dist/{chunk-DDFIRQI5.mjs → chunk-K3E5VEBF.mjs} +56 -34
  307. package/dist/chunk-K3E5VEBF.mjs.map +1 -0
  308. package/dist/{chunk-MSBEWG26.js → chunk-K5O2IOI4.js} +8 -8
  309. package/dist/{chunk-MSBEWG26.js.map → chunk-K5O2IOI4.js.map} +1 -1
  310. package/dist/{chunk-SB5YGKXR.js → chunk-KBMLGQ5J.js} +49 -64
  311. package/dist/chunk-KBMLGQ5J.js.map +1 -0
  312. package/dist/chunk-KCZEKV7M.mjs +81 -0
  313. package/dist/chunk-KCZEKV7M.mjs.map +1 -0
  314. package/dist/{chunk-GRSN76BV.mjs → chunk-KH2R4STU.mjs} +3 -3
  315. package/dist/{chunk-7DQM34JT.js → chunk-KHYSXYPO.js} +23 -23
  316. package/dist/{chunk-7DQM34JT.js.map → chunk-KHYSXYPO.js.map} +1 -1
  317. package/dist/{chunk-V2YHMPRR.js → chunk-KJHBQQYJ.js} +5 -5
  318. package/dist/{chunk-V2YHMPRR.js.map → chunk-KJHBQQYJ.js.map} +1 -1
  319. package/dist/{chunk-ZF5NMQJZ.mjs → chunk-KUKLN3CK.mjs} +4 -4
  320. package/dist/{chunk-6AYB7CZH.js → chunk-KZQVGSR2.js} +2 -2
  321. package/dist/{chunk-6AYB7CZH.js.map → chunk-KZQVGSR2.js.map} +1 -1
  322. package/dist/{chunk-UAKRBNW2.mjs → chunk-L4T76OKM.mjs} +2 -2
  323. package/dist/{chunk-AUCXJ7LG.js → chunk-M3LQH7Y7.js} +3 -3
  324. package/dist/{chunk-AUCXJ7LG.js.map → chunk-M3LQH7Y7.js.map} +1 -1
  325. package/dist/{chunk-FQNJJH7F.js → chunk-MCXRKD56.js} +13 -13
  326. package/dist/{chunk-FQNJJH7F.js.map → chunk-MCXRKD56.js.map} +1 -1
  327. package/dist/{chunk-PY5WCBKN.mjs → chunk-MERKXOSI.mjs} +4 -4
  328. package/dist/{chunk-D3YDZF2G.js → chunk-N472HQPZ.js} +3 -3
  329. package/dist/{chunk-D3YDZF2G.js.map → chunk-N472HQPZ.js.map} +1 -1
  330. package/dist/{chunk-UPMYCGXR.js → chunk-N4K4X34Z.js} +4 -4
  331. package/dist/{chunk-UPMYCGXR.js.map → chunk-N4K4X34Z.js.map} +1 -1
  332. package/dist/{chunk-RU43UMEH.js → chunk-NFCNAFUK.js} +3 -3
  333. package/dist/{chunk-RU43UMEH.js.map → chunk-NFCNAFUK.js.map} +1 -1
  334. package/dist/{chunk-APCB5HWT.mjs → chunk-NLSDZJRR.mjs} +3 -3
  335. package/dist/{chunk-EWYIXCNF.mjs → chunk-NLUTNCLH.mjs} +5 -5
  336. package/dist/{chunk-OP4Q2KDS.mjs → chunk-NMKKMY5P.mjs} +2 -2
  337. package/dist/{chunk-WDPFO4II.mjs → chunk-NMPK336K.mjs} +2 -2
  338. package/dist/{chunk-X6BZ5IEV.mjs → chunk-NU7O6YKR.mjs} +2 -2
  339. package/dist/{chunk-ZABDSRX3.js → chunk-NUZ5K3CB.js} +4 -4
  340. package/dist/{chunk-ZABDSRX3.js.map → chunk-NUZ5K3CB.js.map} +1 -1
  341. package/dist/{chunk-N5ZGFYLA.js → chunk-NZX3BA62.js} +3 -3
  342. package/dist/{chunk-N5ZGFYLA.js.map → chunk-NZX3BA62.js.map} +1 -1
  343. package/dist/{chunk-2TLSEAL2.js → chunk-O4TRDWXJ.js} +3 -3
  344. package/dist/{chunk-2TLSEAL2.js.map → chunk-O4TRDWXJ.js.map} +1 -1
  345. package/dist/{chunk-CBI5F4ME.mjs → chunk-OMSSA4NO.mjs} +2 -2
  346. package/dist/{chunk-YGEEWLGJ.js → chunk-PKKXCX5B.js} +3 -3
  347. package/dist/{chunk-YGEEWLGJ.js.map → chunk-PKKXCX5B.js.map} +1 -1
  348. package/dist/{chunk-GYHD6QEA.mjs → chunk-PQGQ3EH5.mjs} +2 -2
  349. package/dist/{chunk-3LN5GQAC.js → chunk-Q6UIUYNF.js} +6 -8
  350. package/dist/chunk-Q6UIUYNF.js.map +1 -0
  351. package/dist/chunk-QLWBGM7H.js +81 -0
  352. package/dist/chunk-QLWBGM7H.js.map +1 -0
  353. package/dist/{chunk-IF5GW6ID.js → chunk-QZ5DCDZ2.js} +6 -6
  354. package/dist/{chunk-IF5GW6ID.js.map → chunk-QZ5DCDZ2.js.map} +1 -1
  355. package/dist/{chunk-LSUCENYD.mjs → chunk-RBKGHUSR.mjs} +2 -2
  356. package/dist/{chunk-PIZTI5SJ.js → chunk-RMCZ7C2C.js} +3 -3
  357. package/dist/{chunk-PIZTI5SJ.js.map → chunk-RMCZ7C2C.js.map} +1 -1
  358. package/dist/{chunk-LGQNMQOT.mjs → chunk-ROS5XGTQ.mjs} +2 -2
  359. package/dist/chunk-ROS5XGTQ.mjs.map +1 -0
  360. package/dist/{chunk-TEUERRDG.mjs → chunk-RV45XVXE.mjs} +2 -2
  361. package/dist/{chunk-FW6ZI2MC.mjs → chunk-UAFSWXN5.mjs} +2 -2
  362. package/dist/{chunk-QUGKQYAJ.mjs → chunk-ULVFVLFE.mjs} +4 -6
  363. package/dist/{chunk-QUGKQYAJ.mjs.map → chunk-ULVFVLFE.mjs.map} +1 -1
  364. package/dist/{chunk-ANLL2EIX.mjs → chunk-UWCGTH3U.mjs} +2 -2
  365. package/dist/{chunk-6R2LEEEP.mjs → chunk-UZF2D2GG.mjs} +2 -2
  366. package/dist/{chunk-62L3PMYE.mjs → chunk-V3OVMHZD.mjs} +2 -2
  367. package/dist/{chunk-UDITT3N3.mjs → chunk-V6ELDZ2B.mjs} +2 -2
  368. package/dist/{chunk-G7NUCBD3.js → chunk-VDPV24JJ.js} +3 -3
  369. package/dist/{chunk-G7NUCBD3.js.map → chunk-VDPV24JJ.js.map} +1 -1
  370. package/dist/{chunk-IJQOTS5O.mjs → chunk-VJUS3GC4.mjs} +2 -2
  371. package/dist/{chunk-ZUPP7R2K.js → chunk-W7BBVDBI.js} +17 -3
  372. package/dist/chunk-W7BBVDBI.js.map +1 -0
  373. package/dist/{chunk-EHQDQ5RV.js → chunk-XARMPXRN.js} +10 -12
  374. package/dist/chunk-XARMPXRN.js.map +1 -0
  375. package/dist/{chunk-MQEAEU6G.mjs → chunk-XGMRYNER.mjs} +2 -2
  376. package/dist/{chunk-MMQMVVD6.mjs → chunk-XLTD5J74.mjs} +3 -3
  377. package/dist/{chunk-L3ST5GUJ.js → chunk-XQUK7R7L.js} +17 -17
  378. package/dist/{chunk-L3ST5GUJ.js.map → chunk-XQUK7R7L.js.map} +1 -1
  379. package/dist/{chunk-OMBUOOMD.mjs → chunk-XYT542WD.mjs} +2 -2
  380. package/dist/{chunk-IZNABVXE.js → chunk-Y4IGIWP4.js} +3 -3
  381. package/dist/{chunk-IZNABVXE.js.map → chunk-Y4IGIWP4.js.map} +1 -1
  382. package/dist/{chunk-COWOGT7U.mjs → chunk-YZWFDSTC.mjs} +2 -2
  383. package/dist/{chunk-M2FN7CNS.mjs → chunk-Z4L2DWMX.mjs} +17 -3
  384. package/dist/chunk-Z4L2DWMX.mjs.map +1 -0
  385. package/dist/chunk-Z75J66LL.mjs +149 -0
  386. package/dist/chunk-Z75J66LL.mjs.map +1 -0
  387. package/dist/{chunk-CWIJ7RXR.js → chunk-ZHUFICW3.js} +3 -3
  388. package/dist/{chunk-CWIJ7RXR.js.map → chunk-ZHUFICW3.js.map} +1 -1
  389. package/dist/{chunk-Q5XGBTOY.js → chunk-ZNITTMV5.js} +3 -3
  390. package/dist/{chunk-Q5XGBTOY.js.map → chunk-ZNITTMV5.js.map} +1 -1
  391. package/dist/components/EnemMoment/HeaderFilters.d.ts +12 -1
  392. package/dist/components/EnemMoment/HeaderFilters.d.ts.map +1 -1
  393. package/dist/components/EnemMoment/types.d.ts +10 -1
  394. package/dist/components/EnemMoment/types.d.ts.map +1 -1
  395. package/dist/hooks/useAppContent/index.js +48 -49
  396. package/dist/hooks/useAppContent/index.js.map +1 -1
  397. package/dist/hooks/useAppContent/index.mjs +47 -48
  398. package/dist/hooks/useResizableColumns.d.ts +20 -9
  399. package/dist/hooks/useResizableColumns.d.ts.map +1 -1
  400. package/dist/hooks/useScreen/index.js +2 -2
  401. package/dist/hooks/useScreen/index.mjs +1 -1
  402. package/dist/index.js +48 -49
  403. package/dist/index.js.map +1 -1
  404. package/dist/index.mjs +47 -48
  405. package/dist/store/layoutPreferencesStore.d.ts +12 -24
  406. package/dist/store/layoutPreferencesStore.d.ts.map +1 -1
  407. package/package.json +1 -1
  408. package/dist/RichEditorCore-62NIM7PC.js.map +0 -1
  409. package/dist/chunk-2EDRPEYL.mjs +0 -157
  410. package/dist/chunk-2EDRPEYL.mjs.map +0 -1
  411. package/dist/chunk-2VODGC76.js.map +0 -1
  412. package/dist/chunk-3LN5GQAC.js.map +0 -1
  413. package/dist/chunk-BVUPM6EY.js.map +0 -1
  414. package/dist/chunk-CH6BWMSQ.js +0 -17
  415. package/dist/chunk-CH6BWMSQ.js.map +0 -1
  416. package/dist/chunk-DDFIRQI5.mjs.map +0 -1
  417. package/dist/chunk-EHQDQ5RV.js.map +0 -1
  418. package/dist/chunk-G4NK66PM.js.map +0 -1
  419. package/dist/chunk-HIIOADV4.js.map +0 -1
  420. package/dist/chunk-JSH3BQZ7.mjs +0 -17
  421. package/dist/chunk-JSH3BQZ7.mjs.map +0 -1
  422. package/dist/chunk-LGQNMQOT.mjs.map +0 -1
  423. package/dist/chunk-LMDAF6LA.mjs +0 -51
  424. package/dist/chunk-LMDAF6LA.mjs.map +0 -1
  425. package/dist/chunk-M2FN7CNS.mjs.map +0 -1
  426. package/dist/chunk-MUCV5ZWZ.mjs.map +0 -1
  427. package/dist/chunk-PJOBOBNJ.js +0 -51
  428. package/dist/chunk-PJOBOBNJ.js.map +0 -1
  429. package/dist/chunk-PP7SEERV.mjs.map +0 -1
  430. package/dist/chunk-SB5YGKXR.js.map +0 -1
  431. package/dist/chunk-WMDSGVZ7.mjs.map +0 -1
  432. package/dist/chunk-YQKAASWM.js.map +0 -1
  433. package/dist/chunk-ZUPP7R2K.js.map +0 -1
  434. /package/dist/{chunk-EVBQNVQW.mjs.map → chunk-233FSBU7.mjs.map} +0 -0
  435. /package/dist/{chunk-MADPP2PW.mjs.map → chunk-3ZSI2KI5.mjs.map} +0 -0
  436. /package/dist/{chunk-2W7PTFXS.mjs.map → chunk-42XKJV56.mjs.map} +0 -0
  437. /package/dist/{chunk-M6TC6XRQ.mjs.map → chunk-55ESXRRM.mjs.map} +0 -0
  438. /package/dist/{chunk-4MURAKPC.mjs.map → chunk-5DJVOLVX.mjs.map} +0 -0
  439. /package/dist/{chunk-YVT7CT3G.mjs.map → chunk-5P6CBDZ6.mjs.map} +0 -0
  440. /package/dist/{chunk-SFEU7BMY.mjs.map → chunk-5SFNRXZB.mjs.map} +0 -0
  441. /package/dist/{chunk-KYY4U5SN.mjs.map → chunk-6Z5W5J44.mjs.map} +0 -0
  442. /package/dist/{chunk-GVYGPJH3.mjs.map → chunk-AU5M2766.mjs.map} +0 -0
  443. /package/dist/{chunk-Z6UN4ZPW.mjs.map → chunk-BVHVYC7Q.mjs.map} +0 -0
  444. /package/dist/{chunk-J5VEAJN5.mjs.map → chunk-CWVUGZNK.mjs.map} +0 -0
  445. /package/dist/{chunk-BCMDP6GK.mjs.map → chunk-DV3N2K3Y.mjs.map} +0 -0
  446. /package/dist/{chunk-EXHGEJ4P.mjs.map → chunk-GKARHTZ2.mjs.map} +0 -0
  447. /package/dist/{chunk-JCFN6KRS.mjs.map → chunk-HGWDB73S.mjs.map} +0 -0
  448. /package/dist/{chunk-JXXMO7PY.mjs.map → chunk-HN5RW4C3.mjs.map} +0 -0
  449. /package/dist/{chunk-I2A4EQPH.mjs.map → chunk-HQ2GXFK5.mjs.map} +0 -0
  450. /package/dist/{chunk-TBJLNIOY.mjs.map → chunk-JBLYYTHN.mjs.map} +0 -0
  451. /package/dist/{chunk-GRSN76BV.mjs.map → chunk-KH2R4STU.mjs.map} +0 -0
  452. /package/dist/{chunk-ZF5NMQJZ.mjs.map → chunk-KUKLN3CK.mjs.map} +0 -0
  453. /package/dist/{chunk-UAKRBNW2.mjs.map → chunk-L4T76OKM.mjs.map} +0 -0
  454. /package/dist/{chunk-PY5WCBKN.mjs.map → chunk-MERKXOSI.mjs.map} +0 -0
  455. /package/dist/{chunk-APCB5HWT.mjs.map → chunk-NLSDZJRR.mjs.map} +0 -0
  456. /package/dist/{chunk-EWYIXCNF.mjs.map → chunk-NLUTNCLH.mjs.map} +0 -0
  457. /package/dist/{chunk-OP4Q2KDS.mjs.map → chunk-NMKKMY5P.mjs.map} +0 -0
  458. /package/dist/{chunk-WDPFO4II.mjs.map → chunk-NMPK336K.mjs.map} +0 -0
  459. /package/dist/{chunk-X6BZ5IEV.mjs.map → chunk-NU7O6YKR.mjs.map} +0 -0
  460. /package/dist/{chunk-CBI5F4ME.mjs.map → chunk-OMSSA4NO.mjs.map} +0 -0
  461. /package/dist/{chunk-GYHD6QEA.mjs.map → chunk-PQGQ3EH5.mjs.map} +0 -0
  462. /package/dist/{chunk-LSUCENYD.mjs.map → chunk-RBKGHUSR.mjs.map} +0 -0
  463. /package/dist/{chunk-TEUERRDG.mjs.map → chunk-RV45XVXE.mjs.map} +0 -0
  464. /package/dist/{chunk-FW6ZI2MC.mjs.map → chunk-UAFSWXN5.mjs.map} +0 -0
  465. /package/dist/{chunk-ANLL2EIX.mjs.map → chunk-UWCGTH3U.mjs.map} +0 -0
  466. /package/dist/{chunk-6R2LEEEP.mjs.map → chunk-UZF2D2GG.mjs.map} +0 -0
  467. /package/dist/{chunk-62L3PMYE.mjs.map → chunk-V3OVMHZD.mjs.map} +0 -0
  468. /package/dist/{chunk-UDITT3N3.mjs.map → chunk-V6ELDZ2B.mjs.map} +0 -0
  469. /package/dist/{chunk-IJQOTS5O.mjs.map → chunk-VJUS3GC4.mjs.map} +0 -0
  470. /package/dist/{chunk-MQEAEU6G.mjs.map → chunk-XGMRYNER.mjs.map} +0 -0
  471. /package/dist/{chunk-MMQMVVD6.mjs.map → chunk-XLTD5J74.mjs.map} +0 -0
  472. /package/dist/{chunk-OMBUOOMD.mjs.map → chunk-XYT542WD.mjs.map} +0 -0
  473. /package/dist/{chunk-COWOGT7U.mjs.map → chunk-YZWFDSTC.mjs.map} +0 -0
package/dist/index.mjs CHANGED
@@ -102,10 +102,10 @@ import {
102
102
  useSimulatedSubjects,
103
103
  useStudentsFilter,
104
104
  useUserAccessData
105
- } from "./chunk-QFXSQKW3.mjs";
105
+ } from "./chunk-254EBPMW.mjs";
106
106
  import {
107
107
  MathNode
108
- } from "./chunk-FW6ZI2MC.mjs";
108
+ } from "./chunk-UAFSWXN5.mjs";
109
109
  import {
110
110
  buildExamPackagePages
111
111
  } from "./chunk-RRID37Y3.mjs";
@@ -262,7 +262,7 @@ import {
262
262
  useSimulatedOverview,
263
263
  useSimulatedPerformance,
264
264
  useSimulatedStudentDetails
265
- } from "./chunk-CBI5F4ME.mjs";
265
+ } from "./chunk-OMSSA4NO.mjs";
266
266
  import {
267
267
  DEFAULT_CATEGORIES,
268
268
  STUDENT_CATEGORIES,
@@ -283,7 +283,7 @@ import {
283
283
  import {
284
284
  RecommendedLessonDetails_default,
285
285
  StudentPerformanceModal
286
- } from "./chunk-I2A4EQPH.mjs";
286
+ } from "./chunk-HQ2GXFK5.mjs";
287
287
  import "./chunk-UAT7LJVY.mjs";
288
288
  import {
289
289
  RestrictedAccess_default
@@ -298,7 +298,7 @@ import {
298
298
  import "./chunk-F747OBGX.mjs";
299
299
  import {
300
300
  PerformanceReportModal
301
- } from "./chunk-EXHGEJ4P.mjs";
301
+ } from "./chunk-GKARHTZ2.mjs";
302
302
  import {
303
303
  PERFORMANCE_TAG_CONFIG,
304
304
  PerformanceTag,
@@ -317,7 +317,7 @@ import {
317
317
  QuizResultHeaderTitle,
318
318
  QuizResultPerformance,
319
319
  QuizResultTitle
320
- } from "./chunk-SFEU7BMY.mjs";
320
+ } from "./chunk-5SFNRXZB.mjs";
321
321
  import {
322
322
  TeacherFeedbackSection
323
323
  } from "./chunk-WY7V5UJN.mjs";
@@ -332,7 +332,7 @@ import {
332
332
  } from "./chunk-DZMWZNQK.mjs";
333
333
  import {
334
334
  Forum
335
- } from "./chunk-PY5WCBKN.mjs";
335
+ } from "./chunk-MERKXOSI.mjs";
336
336
  import {
337
337
  MaskedInput_default
338
338
  } from "./chunk-6IOJEDYE.mjs";
@@ -392,7 +392,7 @@ import {
392
392
  NationalAverageCard,
393
393
  NationalAveragesContent,
394
394
  PercentageScale
395
- } from "./chunk-YVT7CT3G.mjs";
395
+ } from "./chunk-5P6CBDZ6.mjs";
396
396
  import {
397
397
  COMPARATOR_CHART_COLORS,
398
398
  ComparatorTabValue,
@@ -423,7 +423,7 @@ import {
423
423
  } from "./chunk-WKIDESGP.mjs";
424
424
  import {
425
425
  EnemClassroomStartModal_default
426
- } from "./chunk-GRSN76BV.mjs";
426
+ } from "./chunk-KH2R4STU.mjs";
427
427
  import "./chunk-YWGJAB63.mjs";
428
428
  import {
429
429
  useQuestionFiltersStore
@@ -440,7 +440,7 @@ import {
440
440
  useLayoutPreferencesStore,
441
441
  usePanelWidthPreference,
442
442
  useResizableColumns
443
- } from "./chunk-WMDSGVZ7.mjs";
443
+ } from "./chunk-GCGSAS2Z.mjs";
444
444
  import {
445
445
  ENEM_CLASSROOM_LANGUAGE,
446
446
  ENEM_CLASSROOM_LANGUAGE_LABELS,
@@ -456,7 +456,7 @@ import {
456
456
  createUseChatRooms,
457
457
  useChat,
458
458
  useChatRooms
459
- } from "./chunk-GYHD6QEA.mjs";
459
+ } from "./chunk-PQGQ3EH5.mjs";
460
460
  import {
461
461
  useProfileLabels
462
462
  } from "./chunk-TD4TCHHR.mjs";
@@ -466,8 +466,8 @@ import {
466
466
  } from "./chunk-AL66UXRT.mjs";
467
467
  import {
468
468
  AccessReportModal
469
- } from "./chunk-62L3PMYE.mjs";
470
- import "./chunk-UAKRBNW2.mjs";
469
+ } from "./chunk-V3OVMHZD.mjs";
470
+ import "./chunk-L4T76OKM.mjs";
471
471
  import {
472
472
  DIFFICULTY_LEVEL_ENUM,
473
473
  QUESTION_STATUS_ENUM
@@ -507,7 +507,7 @@ import {
507
507
  ChatbotMessageList,
508
508
  ChatbotPanel,
509
509
  ChatbotTypingIndicator
510
- } from "./chunk-M77TQ5JJ.mjs";
510
+ } from "./chunk-BU32E6BR.mjs";
511
511
  import {
512
512
  createUseChatbot
513
513
  } from "./chunk-L57VCDNM.mjs";
@@ -523,7 +523,7 @@ import {
523
523
  ReadingAid,
524
524
  TTSController,
525
525
  VLibrasLoader
526
- } from "./chunk-QUGKQYAJ.mjs";
526
+ } from "./chunk-ULVFVLFE.mjs";
527
527
  import {
528
528
  useA11yPreferences
529
529
  } from "./chunk-XNZR6CNJ.mjs";
@@ -543,7 +543,7 @@ import {
543
543
  } from "./chunk-7CD5FIDV.mjs";
544
544
  import {
545
545
  StudentLessonProgressModal
546
- } from "./chunk-KYY4U5SN.mjs";
546
+ } from "./chunk-6Z5W5J44.mjs";
547
547
  import {
548
548
  DEFAULT_LESSON_PROGRESS_LABELS
549
549
  } from "./chunk-IVPVR5IM.mjs";
@@ -595,12 +595,12 @@ import {
595
595
  } from "./chunk-RKP4UAN7.mjs";
596
596
  import {
597
597
  StudentPerformanceDetailsModal
598
- } from "./chunk-APCB5HWT.mjs";
598
+ } from "./chunk-NLSDZJRR.mjs";
599
599
  import "./chunk-ILQ33JG4.mjs";
600
600
  import "./chunk-RV6HA5CB.mjs";
601
601
  import {
602
602
  ReportDetailModal
603
- } from "./chunk-JXXMO7PY.mjs";
603
+ } from "./chunk-HN5RW4C3.mjs";
604
604
  import {
605
605
  useReportPrint
606
606
  } from "./chunk-4D3QCMQO.mjs";
@@ -610,7 +610,7 @@ import {
610
610
  import {
611
611
  DOWNLOAD_FORMAT,
612
612
  DownloadModal_default
613
- } from "./chunk-TBJLNIOY.mjs";
613
+ } from "./chunk-JBLYYTHN.mjs";
614
614
  import {
615
615
  downloadExcel
616
616
  } from "./chunk-MG352MKB.mjs";
@@ -707,11 +707,11 @@ import {
707
707
  import {
708
708
  Support_default,
709
709
  supportSchema
710
- } from "./chunk-IJQOTS5O.mjs";
710
+ } from "./chunk-VJUS3GC4.mjs";
711
711
  import {
712
712
  TicketModal,
713
713
  getCategoryIcon
714
- } from "./chunk-UDITT3N3.mjs";
714
+ } from "./chunk-V6ELDZ2B.mjs";
715
715
  import {
716
716
  SupportCategory,
717
717
  SupportStatus,
@@ -756,10 +756,10 @@ import {
756
756
  } from "./chunk-EHORXGFK.mjs";
757
757
  import {
758
758
  AlertsManagerView
759
- } from "./chunk-ANLL2EIX.mjs";
759
+ } from "./chunk-UWCGTH3U.mjs";
760
760
  import {
761
761
  AppHeader
762
- } from "./chunk-EWYIXCNF.mjs";
762
+ } from "./chunk-NLUTNCLH.mjs";
763
763
  import {
764
764
  BrandingLogo
765
765
  } from "./chunk-A66YU5RO.mjs";
@@ -774,15 +774,15 @@ import {
774
774
  } from "./chunk-VJUNDVQM.mjs";
775
775
  import {
776
776
  Whiteboard_default
777
- } from "./chunk-LSUCENYD.mjs";
777
+ } from "./chunk-RBKGHUSR.mjs";
778
778
  import {
779
779
  FormulaDialog,
780
780
  processLatexInHtml,
781
781
  unprocessLatexInHtml
782
- } from "./chunk-X6BZ5IEV.mjs";
782
+ } from "./chunk-NU7O6YKR.mjs";
783
783
  import {
784
784
  RichEditor
785
- } from "./chunk-MQEAEU6G.mjs";
785
+ } from "./chunk-XGMRYNER.mjs";
786
786
  import {
787
787
  ImageUpload
788
788
  } from "./chunk-LXP6LRHO.mjs";
@@ -807,16 +807,16 @@ import {
807
807
  QuizHeader,
808
808
  QuizQuestionList,
809
809
  QuizTitle
810
- } from "./chunk-DDFIRQI5.mjs";
810
+ } from "./chunk-K3E5VEBF.mjs";
811
811
  import {
812
812
  QuizTimer_default
813
- } from "./chunk-LMDAF6LA.mjs";
813
+ } from "./chunk-KCZEKV7M.mjs";
814
814
  import {
815
815
  AlertDialog
816
- } from "./chunk-2EDRPEYL.mjs";
816
+ } from "./chunk-Z75J66LL.mjs";
817
817
  import {
818
818
  NotificationCard_default
819
- } from "./chunk-BCMDP6GK.mjs";
819
+ } from "./chunk-DV3N2K3Y.mjs";
820
820
  import {
821
821
  createNotificationStore,
822
822
  formatTimeAgo
@@ -826,14 +826,14 @@ import {
826
826
  } from "./chunk-FTNZFPQR.mjs";
827
827
  import {
828
828
  AnnouncementsGate_default
829
- } from "./chunk-JCFN6KRS.mjs";
829
+ } from "./chunk-HGWDB73S.mjs";
830
830
  import {
831
831
  createUseAnnouncements
832
832
  } from "./chunk-CIWVKSO7.mjs";
833
833
  import {
834
834
  AnnouncementMessage,
835
835
  AnnouncementModal_default
836
- } from "./chunk-MADPP2PW.mjs";
836
+ } from "./chunk-3ZSI2KI5.mjs";
837
837
  import {
838
838
  SEEN_ANNOUNCEMENTS_STORAGE_PREFIX,
839
839
  getSeenAnnouncementIds,
@@ -843,16 +843,16 @@ import {
843
843
  } from "./chunk-TBX2ZHCS.mjs";
844
844
  import {
845
845
  CalendarCard_default
846
- } from "./chunk-Z6UN4ZPW.mjs";
846
+ } from "./chunk-BVHVYC7Q.mjs";
847
847
  import {
848
848
  NotFound_default
849
849
  } from "./chunk-6NB6QH76.mjs";
850
850
  import {
851
851
  VideoPlayer_default
852
- } from "./chunk-MMQMVVD6.mjs";
852
+ } from "./chunk-XLTD5J74.mjs";
853
853
  import {
854
854
  DownloadButton_default
855
- } from "./chunk-4MURAKPC.mjs";
855
+ } from "./chunk-5DJVOLVX.mjs";
856
856
  import "./chunk-E3UVFK72.mjs";
857
857
  import {
858
858
  VerticalBarChart
@@ -890,14 +890,14 @@ import {
890
890
  } from "./chunk-YGF3KVWG.mjs";
891
891
  import {
892
892
  CorrectActivityModal_default
893
- } from "./chunk-EVBQNVQW.mjs";
893
+ } from "./chunk-233FSBU7.mjs";
894
894
  import {
895
895
  QUESTION_STATUS as QUESTION_STATUS2,
896
896
  SimulationsDetailModal,
897
897
  TrueFalseStatementList,
898
898
  convertApiResponseToCorrectionData,
899
899
  getQuestionStatusBadgeConfig
900
- } from "./chunk-ZF5NMQJZ.mjs";
900
+ } from "./chunk-KUKLN3CK.mjs";
901
901
  import {
902
902
  QuestionCommentField
903
903
  } from "./chunk-KUB46JZT.mjs";
@@ -954,14 +954,14 @@ import "./chunk-ZWMOGGGE.mjs";
954
954
  import {
955
955
  looksLikeMath
956
956
  } from "./chunk-YITR4BIQ.mjs";
957
- import "./chunk-COWOGT7U.mjs";
957
+ import "./chunk-YZWFDSTC.mjs";
958
958
  import "./chunk-SK6FJ5XU.mjs";
959
959
  import {
960
960
  AccordionGroup
961
961
  } from "./chunk-ILCBSWZF.mjs";
962
962
  import {
963
963
  CardAccordation
964
- } from "./chunk-OMBUOOMD.mjs";
964
+ } from "./chunk-XYT542WD.mjs";
965
965
  import {
966
966
  CardActivitiesResults,
967
967
  CardAudio,
@@ -978,7 +978,7 @@ import {
978
978
  CardTopic,
979
979
  EssayReviewStatus,
980
980
  EssayStatus
981
- } from "./chunk-PP7SEERV.mjs";
981
+ } from "./chunk-DXYSEBK3.mjs";
982
982
  import {
983
983
  DEFAULT_MEDIA_VOLUME,
984
984
  UNMUTE_FALLBACK_VOLUME,
@@ -1060,10 +1060,10 @@ import {
1060
1060
  } from "./chunk-QYL72E7Q.mjs";
1061
1061
  import {
1062
1062
  AnswerKeyModal_default
1063
- } from "./chunk-M6TC6XRQ.mjs";
1063
+ } from "./chunk-55ESXRRM.mjs";
1064
1064
  import {
1065
1065
  ProgressModal_default
1066
- } from "./chunk-J5VEAJN5.mjs";
1066
+ } from "./chunk-CWVUGZNK.mjs";
1067
1067
  import {
1068
1068
  ScoreCircle_default
1069
1069
  } from "./chunk-CAQLUBBE.mjs";
@@ -1090,7 +1090,7 @@ import {
1090
1090
  } from "./chunk-QZHSY53O.mjs";
1091
1091
  import {
1092
1092
  Search_default
1093
- } from "./chunk-GVYGPJH3.mjs";
1093
+ } from "./chunk-AU5M2766.mjs";
1094
1094
  import {
1095
1095
  ProgressBar_default
1096
1096
  } from "./chunk-RU26377I.mjs";
@@ -1117,7 +1117,7 @@ import {
1117
1117
  } from "./chunk-5ZWG3GNU.mjs";
1118
1118
  import {
1119
1119
  IconButton_default
1120
- } from "./chunk-LGQNMQOT.mjs";
1120
+ } from "./chunk-ROS5XGTQ.mjs";
1121
1121
  import {
1122
1122
  IconRoundedButton_default
1123
1123
  } from "./chunk-R6MGG44J.mjs";
@@ -1173,7 +1173,7 @@ import {
1173
1173
  ProfileMenuSection,
1174
1174
  ProfileMenuTrigger,
1175
1175
  ProfileToggleTheme
1176
- } from "./chunk-WDPFO4II.mjs";
1176
+ } from "./chunk-NMPK336K.mjs";
1177
1177
  import {
1178
1178
  ThemeToggle
1179
1179
  } from "./chunk-JWTNOKCG.mjs";
@@ -1198,9 +1198,8 @@ import {
1198
1198
  SuccessModalReadingFluency,
1199
1199
  VoiceIconReadingFluency,
1200
1200
  useMicrophonePermission
1201
- } from "./chunk-MUCV5ZWZ.mjs";
1202
- import "./chunk-JSH3BQZ7.mjs";
1203
- import "./chunk-M2FN7CNS.mjs";
1201
+ } from "./chunk-3YF7H577.mjs";
1202
+ import "./chunk-Z4L2DWMX.mjs";
1204
1203
  import "./chunk-624IUGB4.mjs";
1205
1204
  import "./chunk-MEUREWL3.mjs";
1206
1205
  import "./chunk-Z2G5TBXF.mjs";
@@ -14,18 +14,17 @@ export interface PanelWidths {
14
14
  preview: number;
15
15
  }
16
16
  export interface LayoutPreferencesState {
17
- /** Larguras salvas por tela */
17
+ /** Larguras atuais por tela */
18
18
  widths: Record<LayoutScope, PanelWidths>;
19
19
  setPanelWidth: (scope: LayoutScope, panel: LayoutPanel, width: number) => void;
20
20
  resetPanelWidth: (scope: LayoutScope, panel: LayoutPanel) => void;
21
21
  }
22
22
  /**
23
- * Mantém a largura acima do mínimo e descarta valores inválidos vindos de um
24
- * storage corrompido (`NaN`, negativo, string) — um `width` inválido no style
25
- * inline colapsaria a coluna.
23
+ * Mantém a largura acima do mínimo e descarta valores inválidos (`NaN`,
24
+ * negativo, string) — um `width` inválido no style inline colapsaria a coluna.
26
25
  *
27
26
  * Não há teto aqui de propósito: o limite superior depende da largura da tela
28
- * em runtime e é aplicado por `useResizableColumns`, não pelo storage.
27
+ * em runtime e é aplicado por `useResizableColumns`, não pelo store.
29
28
  *
30
29
  * @param value - Largura candidata
31
30
  * @returns Largura válida, nunca menor que `SIDE_PANEL_DEFAULT_WIDTH`
@@ -34,31 +33,20 @@ export declare const clampPanelWidth: (value: unknown) => number;
34
33
  /**
35
34
  * Store das larguras das colunas redimensionáveis das telas de criação.
36
35
  *
37
- * É uma preferência do aparelho (como o zoom do navegador), não da conta: a
38
- * largura que serve num monitor ultrawide não serve num notebook, então a
39
- * chave não é escopada por usuário e o valor nunca viaja junto do conteúdo
40
- * salvo. `activity` e `lesson` são independentes — o professor pode querer a
41
- * prévia larga ao montar uma atividade e estreita ao montar uma aula.
36
+ * As larguras valem só enquanto a tela está aberta: nada é persistido, e
37
+ * `useResizableColumns` devolve as duas colunas ao padrão ao desmontar. Toda
38
+ * visita começa no layout de 400px, independente de como a anterior terminou.
39
+ *
40
+ * `activity` e `lesson` continuam independentes — o professor pode alargar a
41
+ * prévia ao montar uma atividade sem mexer na tela de aula da mesma sessão.
42
42
  */
43
- export declare const useLayoutPreferencesStore: import("zustand").UseBoundStore<Omit<import("zustand").StoreApi<LayoutPreferencesState>, "setState" | "persist"> & {
44
- setState(partial: LayoutPreferencesState | Partial<LayoutPreferencesState> | ((state: LayoutPreferencesState) => LayoutPreferencesState | Partial<LayoutPreferencesState>), replace?: false | undefined): unknown;
45
- setState(state: LayoutPreferencesState | ((state: LayoutPreferencesState) => LayoutPreferencesState), replace: true): unknown;
46
- persist: {
47
- setOptions: (options: Partial<import("zustand/middleware").PersistOptions<LayoutPreferencesState, unknown, unknown>>) => void;
48
- clearStorage: () => void;
49
- rehydrate: () => Promise<void> | void;
50
- hasHydrated: () => boolean;
51
- onHydrate: (fn: (state: LayoutPreferencesState) => void) => () => void;
52
- onFinishHydration: (fn: (state: LayoutPreferencesState) => void) => () => void;
53
- getOptions: () => Partial<import("zustand/middleware").PersistOptions<LayoutPreferencesState, unknown, unknown>>;
54
- };
55
- }>;
43
+ export declare const useLayoutPreferencesStore: import("zustand").UseBoundStore<import("zustand").StoreApi<LayoutPreferencesState>>;
56
44
  /**
57
45
  * Lê as larguras de uma tela com seletores primitivos, evitando o re-render
58
46
  * extra que um seletor de objeto causaria a cada `set` do store.
59
47
  *
60
48
  * @param scope - Tela cujas larguras devem ser lidas
61
- * @returns Larguras salvas e os setters
49
+ * @returns Larguras atuais e os setters
62
50
  */
63
51
  export declare const usePanelWidthPreference: (scope: LayoutScope) => {
64
52
  filtersWidth: number;
@@ -1 +1 @@
1
- {"version":3,"file":"layoutPreferencesStore.d.ts","sourceRoot":"","sources":["../../src/store/layoutPreferencesStore.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAE5C,gDAAgD;AAChD,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,QAAQ,CAAC;AAEhD,gDAAgD;AAChD,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC;AAEhD,kDAAkD;AAClD,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,sBAAsB;IACrC,+BAA+B;IAC/B,MAAM,EAAE,MAAM,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IACzC,aAAa,EAAE,CACb,KAAK,EAAE,WAAW,EAClB,KAAK,EAAE,WAAW,EAClB,KAAK,EAAE,MAAM,KACV,IAAI,CAAC;IACV,eAAe,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;CACnE;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,eAAe,GAAI,OAAO,OAAO,KAAG,MAIhD,CAAC;AAmDF;;;;;;;;GAQG;AACH,eAAO,MAAM,yBAAyB;;;;;;;;;;;;EA+DrC,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,uBAAuB,GAAI,OAAO,WAAW;;;2BA1J/C,WAAW,SACX,WAAW,SACX,MAAM,KACV,IAAI;6BACgB,WAAW,SAAS,WAAW,KAAK,IAAI;CAqKlE,CAAC"}
1
+ {"version":3,"file":"layoutPreferencesStore.d.ts","sourceRoot":"","sources":["../../src/store/layoutPreferencesStore.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAE5C,gDAAgD;AAChD,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,QAAQ,CAAC;AAEhD,gDAAgD;AAChD,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC;AAEhD,kDAAkD;AAClD,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,sBAAsB;IACrC,+BAA+B;IAC/B,MAAM,EAAE,MAAM,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IACzC,aAAa,EAAE,CACb,KAAK,EAAE,WAAW,EAClB,KAAK,EAAE,WAAW,EAClB,KAAK,EAAE,MAAM,KACV,IAAI,CAAC;IACV,eAAe,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;CACnE;AAiBD;;;;;;;;;GASG;AACH,eAAO,MAAM,eAAe,GAAI,OAAO,OAAO,KAAG,MAIhD,CAAC;AAqCF;;;;;;;;;GASG;AACH,eAAO,MAAM,yBAAyB,qFA2CrC,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,uBAAuB,GAAI,OAAO,WAAW;;;2BAvI/C,WAAW,SACX,WAAW,SACX,MAAM,KACV,IAAI;6BACgB,WAAW,SAAS,WAAW,KAAK,IAAI;CAkJlE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "analytica-frontend-lib",
3
- "version": "1.6.76",
3
+ "version": "1.6.78",
4
4
  "description": "Repositório público dos componentes utilizados nas plataformas da Analytica Ensino",
5
5
  "main": "dist/index.js",
6
6
  "module": "./dist/index.mjs",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/RichEditorCore-62NIM7PC.js","../src/components/RichEditor/RichEditorCore.tsx","../src/components/RichEditor/components/extensions.ts","../src/components/RichEditor/components/pastedImage.ts","../src/utils/htmlColors.ts"],"names":["editor"],"mappings":"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","file":"/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/RichEditorCore-62NIM7PC.js","sourcesContent":[null,"import { EditorContent, useEditor, useEditorState } from '@tiptap/react';\nimport { createRichEditorExtensions } from './components/extensions';\nimport {\n normalizeLineBreaksInHtml,\n processLatexInHtml,\n} from './components/utils';\nimport 'katex/dist/katex.min.css';\nimport { TextBolderIcon } from '@phosphor-icons/react/dist/csr/TextB';\nimport { TextItalicIcon } from '@phosphor-icons/react/dist/csr/TextItalic';\nimport { TextUnderlineIcon } from '@phosphor-icons/react/dist/csr/TextUnderline';\nimport { TextStrikethroughIcon } from '@phosphor-icons/react/dist/csr/TextStrikethrough';\nimport { TextAlignLeftIcon } from '@phosphor-icons/react/dist/csr/TextAlignLeft';\nimport { TextAlignCenterIcon } from '@phosphor-icons/react/dist/csr/TextAlignCenter';\nimport { TextAlignRightIcon } from '@phosphor-icons/react/dist/csr/TextAlignRight';\nimport { TextAlignJustifyIcon } from '@phosphor-icons/react/dist/csr/TextAlignJustify';\nimport { LinkIcon } from '@phosphor-icons/react/dist/csr/Link';\nimport { ListBulletsIcon } from '@phosphor-icons/react/dist/csr/ListBullets';\nimport { ListNumbersIcon } from '@phosphor-icons/react/dist/csr/ListNumbers';\nimport { QuotesIcon } from '@phosphor-icons/react/dist/csr/Quotes';\nimport { MinusIcon } from '@phosphor-icons/react/dist/csr/Minus';\nimport { CodeIcon } from '@phosphor-icons/react/dist/csr/Code';\nimport { TextHOneIcon } from '@phosphor-icons/react/dist/csr/TextHOne';\nimport { TextHTwoIcon } from '@phosphor-icons/react/dist/csr/TextHTwo';\nimport { TextHThreeIcon } from '@phosphor-icons/react/dist/csr/TextHThree';\nimport { MathOperationsIcon } from '@phosphor-icons/react/dist/csr/MathOperations';\nimport { ImageIcon } from '@phosphor-icons/react/dist/csr/Image';\nimport { TableIcon } from '@phosphor-icons/react/dist/csr/Table';\nimport { RowsPlusTopIcon } from '@phosphor-icons/react/dist/csr/RowsPlusTop';\nimport { RowsPlusBottomIcon } from '@phosphor-icons/react/dist/csr/RowsPlusBottom';\nimport { ColumnsPlusLeftIcon } from '@phosphor-icons/react/dist/csr/ColumnsPlusLeft';\nimport { ColumnsPlusRightIcon } from '@phosphor-icons/react/dist/csr/ColumnsPlusRight';\nimport { RowsIcon } from '@phosphor-icons/react/dist/csr/Rows';\nimport { ColumnsIcon } from '@phosphor-icons/react/dist/csr/Columns';\nimport { TrashIcon } from '@phosphor-icons/react/dist/csr/Trash';\nimport { useState, useRef, useEffect, ReactNode } from 'react';\nimport { FormulaDialog } from './components/FormulaDialog';\nimport { ImageDialog } from './components/ImageDialog';\nimport { createPastedImageHandler } from './components/pastedImage';\nimport { resolveInsertWidth } from './components/imageSize';\nimport { hasColorMarkup } from '../../utils/htmlColors';\nimport Button from '../Button/Button';\nimport Text from '../Text/Text';\n\ninterface ToolbarBtnProps {\n onClick: () => void;\n active?: boolean;\n title: string;\n children: ReactNode;\n}\n\nconst ToolbarBtn = ({ onClick, active, title, children }: ToolbarBtnProps) => (\n <Button\n type=\"button\"\n onClick={onClick}\n title={title}\n size=\"small\"\n className={`bg-transparent border-transparent h-7 w-7 p-0 flex items-center justify-center rounded hover:bg-background-100 ${\n active ? 'bg-background-200 text-primary-700' : 'text-text-700'\n }`}\n >\n {children}\n </Button>\n);\n\nconst Divider = () => <div className=\"w-px h-5 bg-border-200 mx-0.5\" />;\n\ninterface TableActionBtnProps {\n onClick: () => void;\n label: string;\n danger?: boolean;\n children: ReactNode;\n}\n\n/**\n * Ação da barra de tabela. Leva rótulo escrito, e não só ícone: \"linha acima\"\n * e \"coluna à esquerda\" são indistinguíveis em 16px para quem não usa o editor\n * com frequência, e esta barra só aparece de vez em quando — há espaço de sobra.\n */\nconst TableActionBtn = ({\n onClick,\n label,\n danger,\n children,\n}: TableActionBtnProps) => (\n <Button\n type=\"button\"\n onClick={onClick}\n title={label}\n size=\"small\"\n className={`bg-transparent border-transparent h-7 px-2 flex items-center gap-1 rounded text-xs whitespace-nowrap hover:bg-background-100 ${\n danger ? 'text-error-600' : 'text-text-700'\n }`}\n >\n {children}\n {label}\n </Button>\n);\n\n/** Tabela padrão de quem está montando um enunciado: cabeçalho + 2 linhas. */\nconst NEW_TABLE = { rows: 3, cols: 3, withHeaderRow: true };\n\n/**\n * Prepares stored content for the TipTap parser. Line breaks are restored first\n * so that LaTeX spans are injected into already-structured markup.\n */\nconst prepareContent = (content?: string) =>\n processLatexInHtml(normalizeLineBreaksInHtml(content || ''));\n\n/** Shown when a pasted image is bigger than the storage backend accepts. */\nconst OVERSIZED_PASTE_MESSAGE = 'A imagem deve ter no máximo 5MB.';\n\n/** Shown when the upload rejects with something that is not an `Error`. */\nconst GENERIC_PASTE_ERROR = 'Erro ao enviar a imagem.';\n\ninterface RichEditorProps {\n readonly content?: string;\n /**\n * Notificado a cada edição do autor e, na carga, quando o `content` recebido\n * trazia cor: o editor descarta a cor ao parsear e devolve aqui o HTML limpo,\n * para que salvar sem editar nada não regrave a cor. Carregar conteúdo sem cor\n * não dispara nada.\n */\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\nexport function RichEditor({\n content,\n onChange,\n placeholder = 'Digite aqui...',\n onGenerateLatexWithAI,\n onUploadImage,\n allowImagePaste = false,\n}: RichEditorProps) {\n const [formulaOpen, setFormulaOpen] = useState(false);\n const [imageOpen, setImageOpen] = useState(false);\n const [isPastingImage, setIsPastingImage] = useState(false);\n const [pasteError, setPasteError] = useState('');\n const lastContentRef = useRef(content);\n /**\n * Último `content` recebido cuja cor já foi verificada.\n *\n * Separado do `lastContentRef` — que guarda o HTML que o consumidor tem em\n * mãos, e por isso muda quando devolvemos a versão limpa — para que uma nova\n * execução do efeito com o mesmo conteúdo (o editor sendo recriado, ou um\n * consumidor que ignore o `onChange` e siga mandando o HTML colorido) não\n * notifique a mesma limpeza duas vezes.\n */\n const colorCheckedRef = useRef<string | undefined>(undefined);\n /**\n * `editorProps` is captured once, when `useEditor` runs, so a handler reading\n * the props directly would keep serving the first render's values. The editor\n * calls through this ref, which the effect below repoints whenever the paste\n * configuration changes.\n */\n const pasteHandlerRef = useRef<(event: ClipboardEvent) => boolean>(\n () => false\n );\n /** Bumped on unmount so an upload still in flight knows not to insert. */\n const pasteTokenRef = useRef(0);\n\n const editor = useEditor({\n extensions: createRichEditorExtensions(placeholder),\n content: prepareContent(content),\n // External updates do not reach this callback: the sync effect below calls\n // setContent with `emitUpdate: false`.\n onUpdate: ({ editor }) => {\n const html = editor.getHTML();\n lastContentRef.current = html;\n onChange?.({\n json: editor.getJSON(),\n html,\n });\n },\n editorProps: {\n attributes: {\n class:\n 'min-h-[120px] outline-none prose prose-sm max-w-none px-4 py-3 focus:outline-none',\n },\n handlePaste: (_view, event) => pasteHandlerRef.current(event),\n },\n });\n\n /**\n * Estado reativo da toolbar.\n *\n * No Tiptap 3 o `useEditor` deixou de re-renderizar a cada transação, então\n * ler `editor.isActive(...)` direto no corpo do componente devolve o valor\n * congelado do último render: os botões não acendiam ao mover o cursor e a\n * barra de tabela nunca apareceria ao entrar numa célula. `useEditorState`\n * assina as transações e só re-renderiza quando um destes flags muda — bem\n * mais barato que re-renderizar a toolbar inteira a cada tecla digitada.\n */\n const toolbar = useEditorState({\n editor,\n selector: ({ editor }) => ({\n heading1: editor.isActive('heading', { level: 1 }),\n heading2: editor.isActive('heading', { level: 2 }),\n heading3: editor.isActive('heading', { level: 3 }),\n bold: editor.isActive('bold'),\n italic: editor.isActive('italic'),\n underline: editor.isActive('underline'),\n strike: editor.isActive('strike'),\n subscript: editor.isActive('subscript'),\n superscript: editor.isActive('superscript'),\n code: editor.isActive('code'),\n alignLeft: editor.isActive({ textAlign: 'left' }),\n alignCenter: editor.isActive({ textAlign: 'center' }),\n alignRight: editor.isActive({ textAlign: 'right' }),\n alignJustify: editor.isActive({ textAlign: 'justify' }),\n bulletList: editor.isActive('bulletList'),\n orderedList: editor.isActive('orderedList'),\n blockquote: editor.isActive('blockquote'),\n link: editor.isActive('link'),\n image: editor.isActive('image'),\n table: editor.isActive('table'),\n }),\n });\n\n /**\n * Devolve ao consumidor o HTML já sem cor quando o conteúdo carregado vinha\n * colorido.\n *\n * O schema descarta a cor ao parsear, então a tela aparece limpa sozinha — mas\n * o valor que o consumidor guarda continuaria sendo o HTML colorido que veio\n * da API, e salvar sem editar nada regravaria o vermelho no banco. Emitir aqui\n * alinha os dois: o próximo salvamento persiste a questão sem cor, mesmo que o\n * autor só tenha aberto e clicado em salvar.\n *\n * `emitUpdate: false` na sincronização abaixo é justamente o que torna este\n * passo necessário, e o `onChange` só dispara quando havia cor de fato —\n * qualquer outro conteúdo continua sendo carregado em silêncio, sem reescrever\n * o que já está salvo.\n * @param loaded - O HTML como chegou na prop `content`\n */\n const emitColorlessContent = (loaded: string) => {\n if (!editor || !hasColorMarkup(loaded)) return;\n\n const html = editor.getHTML();\n lastContentRef.current = html;\n onChange?.({ json: editor.getJSON(), html });\n };\n\n // Update editor content when prop changes externally (e.g., from loadQuestion)\n useEffect(() => {\n if (!editor || content === undefined) return;\n\n // Na primeira renderização o conteúdo já entrou pelo `useEditor`, então só\n // o que chega depois precisa ser reaplicado.\n if (content !== lastContentRef.current) {\n editor.commands.setContent(prepareContent(content), {\n emitUpdate: false,\n });\n lastContentRef.current = content;\n }\n\n // Uma vez por conteúdo recebido, e não a cada execução do efeito.\n if (content !== colorCheckedRef.current) {\n colorCheckedRef.current = content;\n emitColorlessContent(content);\n }\n // `emitColorlessContent` é recriada a cada render e fica fora das\n // dependências de propósito: só fecha sobre o editor e o `onChange` do\n // consumidor, e reagir a eles reemitiria o mesmo conteúdo.\n }, [content, editor]);\n\n const insertFormula = (latex: string, display: boolean) => {\n if (!latex || !editor) return;\n editor\n .chain()\n .focus()\n .insertContent({\n type: 'mathInline',\n attrs: { latex, display },\n })\n .run();\n setFormulaOpen(false);\n };\n\n const applyImage = (src: string, alt: string, width?: number) => {\n if (!src || !editor) return;\n editor\n .chain()\n .focus()\n .setImage({ src, alt, ...(width ? { width } : {}) })\n .run();\n };\n\n const insertImage = (src: string, alt: string, width?: number) => {\n applyImage(src, alt, width);\n setImageOpen(false);\n };\n\n /**\n * Uploads the images taken from the clipboard and inserts them in order.\n *\n * The upload has to finish before anything reaches the document: a `blob:`\n * source would survive into the saved HTML and break as soon as the page\n * unloads, and base64 is rejected by the schema.\n * @param files - Images already named and within the size limit\n * @param upload - The consumer's upload callback\n */\n const uploadPastedImages = async (\n files: File[],\n upload: (file: File) => Promise<string>\n ) => {\n const token = pasteTokenRef.current;\n setPasteError('');\n setIsPastingImage(true);\n\n try {\n for (const file of files) {\n const src = await upload(file);\n const width = await resolveInsertWidth(src);\n // The editor may be gone by now — the user can navigate away mid-upload.\n if (token !== pasteTokenRef.current) return;\n applyImage(src, '', width);\n }\n } catch (error) {\n if (token !== pasteTokenRef.current) return;\n setPasteError(\n error instanceof Error ? error.message : GENERIC_PASTE_ERROR\n );\n } finally {\n setIsPastingImage(false);\n }\n };\n\n useEffect(() => {\n pasteHandlerRef.current = createPastedImageHandler({\n enabled: allowImagePaste,\n upload: onUploadImage,\n onImages: uploadPastedImages,\n onOversized: () => setPasteError(OVERSIZED_PASTE_MESSAGE),\n });\n // `uploadPastedImages` is rebuilt on every render and is deliberately left\n // out of the dependencies: it only closes over the editor instance and the\n // state setters, all stable once mounted.\n }, [allowImagePaste, onUploadImage, editor]);\n\n useEffect(() => {\n // Invalidates uploads still in flight, so a late resolution cannot insert\n // into an editor that no longer exists.\n return () => {\n pasteTokenRef.current += 1;\n };\n }, []);\n\n const setLink = () => {\n const url = globalThis.window.prompt('URL do link:');\n if (url === null || !editor) return;\n if (url === '') {\n editor.chain().focus().extendMarkRange('link').unsetLink().run();\n return;\n }\n editor.chain().focus().extendMarkRange('link').setLink({ href: url }).run();\n };\n\n // `toolbar` só é nulo junto com o editor, mas o TypeScript não sabe disso.\n if (!editor || !toolbar) return null;\n\n // `data-analytica-rich-editor` scopes the image resize handle styles shipped\n // in the library's global stylesheet, so they cannot leak into another Tiptap\n // instance living in the consumer app.\n return (\n <div\n data-analytica-rich-editor\n className=\"border border-border-200 rounded-xl overflow-hidden bg-background-0\"\n >\n {/* Toolbar */}\n <div className=\"flex items-center gap-0.5 border-b border-border-200 bg-background-50 px-2 py-1.5 flex-wrap\">\n {/* Headings */}\n <ToolbarBtn\n onClick={() =>\n editor.chain().focus().toggleHeading({ level: 1 }).run()\n }\n active={toolbar.heading1}\n title=\"Título 1\"\n >\n <TextHOneIcon size={16} weight=\"bold\" />\n </ToolbarBtn>\n <ToolbarBtn\n onClick={() =>\n editor.chain().focus().toggleHeading({ level: 2 }).run()\n }\n active={toolbar.heading2}\n title=\"Título 2\"\n >\n <TextHTwoIcon size={16} weight=\"bold\" />\n </ToolbarBtn>\n <ToolbarBtn\n onClick={() =>\n editor.chain().focus().toggleHeading({ level: 3 }).run()\n }\n active={toolbar.heading3}\n title=\"Título 3\"\n >\n <TextHThreeIcon size={16} weight=\"bold\" />\n </ToolbarBtn>\n\n <Divider />\n\n {/* Text formatting */}\n <ToolbarBtn\n onClick={() => editor.chain().focus().toggleBold().run()}\n active={toolbar.bold}\n title=\"Negrito (Ctrl+B)\"\n >\n <TextBolderIcon size={16} weight=\"bold\" />\n </ToolbarBtn>\n <ToolbarBtn\n onClick={() => editor.chain().focus().toggleItalic().run()}\n active={toolbar.italic}\n title=\"Itálico (Ctrl+I)\"\n >\n <TextItalicIcon size={16} />\n </ToolbarBtn>\n <ToolbarBtn\n onClick={() => editor.chain().focus().toggleUnderline().run()}\n active={toolbar.underline}\n title=\"Sublinhado (Ctrl+U)\"\n >\n <TextUnderlineIcon size={16} />\n </ToolbarBtn>\n <ToolbarBtn\n onClick={() => editor.chain().focus().toggleStrike().run()}\n active={toolbar.strike}\n title=\"Tachado\"\n >\n <TextStrikethroughIcon size={16} />\n </ToolbarBtn>\n <ToolbarBtn\n onClick={() => editor.chain().focus().toggleSubscript().run()}\n active={toolbar.subscript}\n title=\"Subscrito\"\n >\n <span className=\"text-xs font-medium\">\n X<sub className=\"text-[8px]\">2</sub>\n </span>\n </ToolbarBtn>\n <ToolbarBtn\n onClick={() => editor.chain().focus().toggleSuperscript().run()}\n active={toolbar.superscript}\n title=\"Sobrescrito\"\n >\n <span className=\"text-xs font-medium\">\n X<sup className=\"text-[8px]\">2</sup>\n </span>\n </ToolbarBtn>\n <ToolbarBtn\n onClick={() => editor.chain().focus().toggleCode().run()}\n active={toolbar.code}\n title=\"Código inline\"\n >\n <CodeIcon size={16} />\n </ToolbarBtn>\n\n <Divider />\n\n {/* Alignment */}\n <ToolbarBtn\n onClick={() => editor.chain().focus().setTextAlign('left').run()}\n active={toolbar.alignLeft}\n title=\"Alinhar à esquerda\"\n >\n <TextAlignLeftIcon size={16} />\n </ToolbarBtn>\n <ToolbarBtn\n onClick={() => editor.chain().focus().setTextAlign('center').run()}\n active={toolbar.alignCenter}\n title=\"Centralizar\"\n >\n <TextAlignCenterIcon size={16} />\n </ToolbarBtn>\n <ToolbarBtn\n onClick={() => editor.chain().focus().setTextAlign('right').run()}\n active={toolbar.alignRight}\n title=\"Alinhar à direita\"\n >\n <TextAlignRightIcon size={16} />\n </ToolbarBtn>\n <ToolbarBtn\n onClick={() => editor.chain().focus().setTextAlign('justify').run()}\n active={toolbar.alignJustify}\n title=\"Justificar\"\n >\n <TextAlignJustifyIcon size={16} />\n </ToolbarBtn>\n\n <Divider />\n\n {/* Lists */}\n <ToolbarBtn\n onClick={() => editor.chain().focus().toggleBulletList().run()}\n active={toolbar.bulletList}\n title=\"Lista com marcadores\"\n >\n <ListBulletsIcon size={16} />\n </ToolbarBtn>\n <ToolbarBtn\n onClick={() => editor.chain().focus().toggleOrderedList().run()}\n active={toolbar.orderedList}\n title=\"Lista numerada\"\n >\n <ListNumbersIcon size={16} />\n </ToolbarBtn>\n <ToolbarBtn\n onClick={() => editor.chain().focus().toggleBlockquote().run()}\n active={toolbar.blockquote}\n title=\"Citação\"\n >\n <QuotesIcon size={16} />\n </ToolbarBtn>\n <ToolbarBtn\n onClick={() => editor.chain().focus().setHorizontalRule().run()}\n active={false}\n title=\"Linha horizontal\"\n >\n <MinusIcon size={16} />\n </ToolbarBtn>\n\n <Divider />\n\n {/* Link */}\n <ToolbarBtn\n onClick={setLink}\n active={toolbar.link}\n title=\"Inserir link\"\n >\n <LinkIcon size={16} />\n </ToolbarBtn>\n\n {/* Image */}\n <ToolbarBtn\n onClick={() => setImageOpen(true)}\n active={toolbar.image}\n title=\"Inserir imagem\"\n >\n <ImageIcon size={16} />\n </ToolbarBtn>\n\n {/* Table */}\n <ToolbarBtn\n onClick={() => editor.chain().focus().insertTable(NEW_TABLE).run()}\n active={toolbar.table}\n title=\"Inserir tabela\"\n >\n <TableIcon size={16} />\n </ToolbarBtn>\n\n {/* Formula */}\n <Button\n type=\"button\"\n onClick={() => setFormulaOpen(true)}\n title=\"Inserir fórmula LaTeX\"\n size=\"extra-small\"\n variant=\"link\"\n >\n <MathOperationsIcon size={16} />\n LaTeX\n </Button>\n </div>\n\n {/*\n Ações de linha/coluna só existem quando o cursor está dentro de uma\n tabela, então ficam numa barra própria em vez de ocuparem a toolbar\n principal — que já quebra em duas linhas no tablet.\n */}\n {toolbar.table && (\n <div\n data-testid=\"table-toolbar\"\n className=\"flex items-center gap-0.5 border-b border-border-200 bg-background-50 px-2 py-1.5 flex-wrap\"\n >\n <TableActionBtn\n onClick={() => editor.chain().focus().addRowBefore().run()}\n label=\"Linha acima\"\n >\n <RowsPlusTopIcon size={16} />\n </TableActionBtn>\n <TableActionBtn\n onClick={() => editor.chain().focus().addRowAfter().run()}\n label=\"Linha abaixo\"\n >\n <RowsPlusBottomIcon size={16} />\n </TableActionBtn>\n <TableActionBtn\n onClick={() => editor.chain().focus().addColumnBefore().run()}\n label=\"Coluna à esquerda\"\n >\n <ColumnsPlusLeftIcon size={16} />\n </TableActionBtn>\n <TableActionBtn\n onClick={() => editor.chain().focus().addColumnAfter().run()}\n label=\"Coluna à direita\"\n >\n <ColumnsPlusRightIcon size={16} />\n </TableActionBtn>\n\n <Divider />\n\n <TableActionBtn\n onClick={() => editor.chain().focus().toggleHeaderRow().run()}\n label=\"Cabeçalho\"\n >\n <TableIcon size={16} />\n </TableActionBtn>\n\n <Divider />\n\n <TableActionBtn\n onClick={() => editor.chain().focus().deleteRow().run()}\n label=\"Excluir linha\"\n danger\n >\n <RowsIcon size={16} />\n </TableActionBtn>\n <TableActionBtn\n onClick={() => editor.chain().focus().deleteColumn().run()}\n label=\"Excluir coluna\"\n danger\n >\n <ColumnsIcon size={16} />\n </TableActionBtn>\n <TableActionBtn\n onClick={() => editor.chain().focus().deleteTable().run()}\n label=\"Excluir tabela\"\n danger\n >\n <TrashIcon size={16} />\n </TableActionBtn>\n </div>\n )}\n\n {/* Editor */}\n <EditorContent editor={editor} />\n\n {/* Estado do envio de imagem colada e dica de LaTeX */}\n <div className=\"border-t border-border-200 px-4 py-2 bg-background-50\">\n {isPastingImage && (\n <Text size=\"xs\" color=\"text-text-600\" className=\"block mb-1\">\n Enviando imagem...\n </Text>\n )}\n {pasteError && (\n <Text size=\"xs\" color=\"text-error-600\" className=\"block mb-1\">\n {pasteError}\n </Text>\n )}\n <Text size=\"xs\" color=\"text-text-400\">\n Dica: use{' '}\n <code className=\"bg-background-200 px-1 rounded\">$fórmula$</code> para\n LaTeX inline e{' '}\n <code className=\"bg-background-200 px-1 rounded\">$$fórmula$$</code>{' '}\n para fórmula em bloco. A conversão acontece assim que você fecha os\n cifrões.\n </Text>\n </div>\n\n <FormulaDialog\n open={formulaOpen}\n onClose={() => setFormulaOpen(false)}\n onInsert={insertFormula}\n onGenerateWithAI={onGenerateLatexWithAI}\n />\n\n <ImageDialog\n open={imageOpen}\n onClose={() => setImageOpen(false)}\n onInsert={insertImage}\n onUploadImage={onUploadImage}\n />\n </div>\n );\n}\n","import StarterKit from '@tiptap/starter-kit';\nimport Underline from '@tiptap/extension-underline';\nimport TextAlign from '@tiptap/extension-text-align';\nimport Subscript from '@tiptap/extension-subscript';\nimport Superscript from '@tiptap/extension-superscript';\nimport Link from '@tiptap/extension-link';\nimport Placeholder from '@tiptap/extension-placeholder';\nimport Image from '@tiptap/extension-image';\nimport { TableKit } from '@tiptap/extension-table';\nimport { MathNode } from './MathNode';\nimport {\n MIN_IMAGE_HEIGHT,\n MIN_IMAGE_WIDTH,\n parseImageWidth,\n} from './imageSize';\n\n/**\n * Image node with drag-to-resize handles.\n *\n * The stock extension already declares `width`/`height` attributes, but their\n * default parser keeps the raw HTML value. That breaks the resizable node view,\n * which appends `px` to whatever is stored — a legacy `width=\"400px\"` would\n * become `400pxpx`. Parsing to a number up front keeps every source consistent.\n *\n * `height` is deliberately never persisted: the editor stylesheet and\n * HtmlMathRenderer both force `height: auto`, so a stored height exists only to\n * be overridden. Worse, when `max-width` clips a too-wide image while an inline\n * height survives, the node view measures the clipped box and commits a\n * distorted aspect ratio on the next drag.\n */\nconst ResizableImage = Image.extend({\n addAttributes() {\n return {\n ...this.parent?.(),\n width: {\n default: null,\n parseHTML: (element: HTMLElement) => parseImageWidth(element),\n renderHTML: (attributes: Record<string, unknown>) =>\n typeof attributes.width === 'number'\n ? { width: attributes.width }\n : {},\n },\n height: {\n default: null,\n parseHTML: () => null,\n rendered: false,\n },\n };\n },\n\n addNodeView() {\n const parentNodeView = this.parent?.();\n if (!parentNodeView) return null;\n\n return (props) => {\n const nodeView = parentNodeView(props);\n const container = nodeView.dom;\n\n if (container instanceof HTMLElement) {\n // The upstream node view hides the container until `load` fires. An\n // expired storage URL therefore leaves an invisible, unselectable node —\n // worse than the browser's broken-image icon. Reveal it on failure.\n const image = container.querySelector('img');\n image?.addEventListener('error', () => {\n container.style.visibility = '';\n container.style.pointerEvents = '';\n });\n }\n\n return nodeView;\n };\n },\n});\n\n/**\n * Extension list backing the RichEditor.\n *\n * Tiptap validates incoming HTML against the schema these extensions build and\n * silently discards any node it cannot match. Anything the editor must be able\n * to *load* has to be registered here, not only what it can create — omitting\n * Image is what made `<img>` tags disappear from existing content.\n *\n * That same rule is what keeps colour out of the content, and it is why\n * TextStyle/Color/Highlight are deliberately absent. The toolbar has never\n * offered a colour control, so every coloured run in the question bank arrived\n * pasted from Word, a PDF or an old ENEM export (`<span style=\"color: red\">`,\n * `<mark style=\"background-color: yellow\">`) and then survived into the saved\n * HTML, where it fights the app's own typography. Without a schema attribute\n * to land in, the declaration is dropped on the way in — on paste, on\n * drag-and-drop and when an existing question is loaded for editing — while\n * the text itself is kept. Bold, italic, alignment and the rest are unaffected:\n * they are separate marks.\n */\nexport function createRichEditorExtensions(placeholder: string) {\n return [\n StarterKit,\n Underline,\n Subscript,\n Superscript,\n TextAlign.configure({ types: ['heading', 'paragraph'] }),\n Link.configure({ openOnClick: false }),\n Placeholder.configure({ placeholder }),\n ResizableImage.configure({\n inline: false,\n allowBase64: false,\n resize: {\n enabled: true,\n // Corner handles only: edge handles span the whole side and read as a\n // border rather than a grip.\n directions: ['top-left', 'top-right', 'bottom-left', 'bottom-right'],\n minWidth: MIN_IMAGE_WIDTH,\n minHeight: MIN_IMAGE_HEIGHT,\n alwaysPreserveAspectRatio: true,\n },\n }),\n // Registering these nodes is what makes a table survive at all: without\n // them the schema has no match for `<table>`, so every cell collapsed into\n // a single run-on paragraph — and the next save persisted that flattened\n // text over the original table. The toolbar commands (insert, add/remove\n // row and column) come from the same kit.\n TableKit.configure({\n // Resizing is off on purpose: dragging a column persists a `colwidth`\n // measured against the editor viewport, and the student's viewport is a\n // different width. Column layout stays with the display stylesheet.\n table: { resizable: false },\n }),\n MathNode,\n ];\n}\n","/**\n * Clipboard handling for images pasted straight into the RichEditor.\n *\n * A screenshot on the clipboard arrives as a `File` on the paste event, but the\n * editor schema rejects base64 sources, so the file has to be uploaded before\n * it can be inserted. These helpers isolate the clipboard reading from the\n * upload flow in `RichEditorCore`, which keeps them testable without a real\n * ProseMirror view.\n */\n\nimport { MAX_IMAGE_SIZE } from './imageSize';\n\n/** Base name given to a clipboard image that arrives without a filename. */\nconst PASTED_IMAGE_BASENAME = 'imagem-colada';\n\n/**\n * Extension per MIME type accepted by the storage backend. Keyed by the types a\n * browser actually puts on the clipboard when copying an image.\n */\nconst EXTENSION_BY_MIME: Record<string, string> = {\n 'image/png': 'png',\n 'image/jpeg': 'jpg',\n 'image/gif': 'gif',\n 'image/webp': 'webp',\n 'image/bmp': 'bmp',\n 'image/svg+xml': 'svg',\n};\n\n/** Extension used when the clipboard reports an image type we do not map. */\nconst FALLBACK_EXTENSION = 'png';\n\n/**\n * Reads the image files carried by a paste event.\n * Anything that is not an image is left alone so the default paste behaviour\n * still handles it.\n * @param clipboardData - The `clipboardData` of the paste event\n * @returns The image files found, in clipboard order\n */\nexport const extractPastedImageFiles = (\n clipboardData: DataTransfer | null | undefined\n): File[] => {\n if (!clipboardData?.files) return [];\n\n return Array.from(clipboardData.files).filter((file) =>\n file.type.startsWith('image/')\n );\n};\n\n/**\n * Guarantees the file has a name before it reaches the upload.\n * Some browsers hand over a nameless blob for a screenshot, and the pre-signed\n * URL request sends `file.name` to the backend — an empty name would be\n * rejected there.\n * @param file - The image file taken from the clipboard\n * @returns The original file when it is already named, a renamed copy otherwise\n */\nexport const namePastedImage = (file: File): File => {\n if (file.name) return file;\n\n const extension = EXTENSION_BY_MIME[file.type] ?? FALLBACK_EXTENSION;\n return new File([file], `${PASTED_IMAGE_BASENAME}.${extension}`, {\n type: file.type,\n });\n};\n\nconst isOversized = (file: File) => file.size > MAX_IMAGE_SIZE;\n\n/**\n * Whether the clipboard markup should win over the image file it came with.\n *\n * Copying a range from Excel or Google Sheets puts both an HTML table and a\n * picture of it on the clipboard; taking the picture would silently turn a\n * pasteable table into a figure. Markup that carries its own `<img>` is the\n * opposite case — copying a picture from Word sends `<img src=\"file:///...\">`,\n * which would paste as a broken image, so there the file is the good source.\n * @param clipboardData - The `clipboardData` of the paste event\n * @returns True when the default paste handling should keep the markup\n */\nconst prefersMarkup = (clipboardData: DataTransfer) => {\n const html = clipboardData.getData('text/html');\n return html !== '' && !/<img\\b/i.test(html);\n};\n\ninterface PastedImageHandlerOptions {\n /** Whether the consumer opted into pasting images. */\n readonly enabled: boolean;\n /** Upload callback. Without one there is nowhere to put the file. */\n readonly upload?: (file: File) => Promise<string>;\n /** Receives the named images to upload, once the clipboard is accepted. */\n readonly onImages: (\n files: File[],\n upload: (file: File) => Promise<string>\n ) => void;\n /** Called instead of `onImages` when any image is over the size limit. */\n readonly onOversized: () => void;\n}\n\n/**\n * Builds the handler Tiptap calls on every paste.\n *\n * Returning false leaves the paste to the default handling, so text, HTML and\n * anything else keep behaving exactly as before — only a clipboard carrying\n * image files is taken over.\n * @param options - Upload wiring and the callbacks used to report the outcome\n * @returns A handler that reports whether it consumed the paste\n */\nexport const createPastedImageHandler =\n ({ enabled, upload, onImages, onOversized }: PastedImageHandlerOptions) =>\n (event: ClipboardEvent): boolean => {\n if (!enabled || !upload) return false;\n\n const clipboard = event.clipboardData;\n if (!clipboard) return false;\n\n const files = extractPastedImageFiles(clipboard);\n if (files.length === 0 || prefersMarkup(clipboard)) return false;\n\n // From here on the paste belongs to us: the default handler would drop the\n // file anyway, since the editor schema rejects base64 image sources.\n event.preventDefault();\n\n if (files.some(isOversized)) {\n onOversized();\n return true;\n }\n\n onImages(files.map(namePastedImage), upload);\n return true;\n };\n","/**\n * Detecção de cor no HTML das questões.\n *\n * O schema do RichEditor não tem atributo onde guardar cor (ver\n * `components/RichEditor/components/extensions.ts`), então toda declaração de\n * cor é descartada na leitura — o autor abre a questão e ela já aparece sem o\n * vermelho que veio da API. O que o schema não faz é avisar que descartou algo:\n * o valor em memória do formulário continua sendo o HTML colorido, e salvar sem\n * editar nada regravaria a cor no banco.\n *\n * Este módulo é o gatilho que fecha esse buraco. É deliberadamente uma\n * heurística sobre a string: basta reconhecer que havia cor para que o editor\n * devolva ao consumidor o HTML já limpo. Um falso positivo custa um\n * `onChange` extra na carga; um falso negativo só deixa a cor no valor salvo até\n * a próxima edição de verdade.\n */\n\n/** Valores de atributos `style` (aspas duplas ou simples) presentes no HTML. */\nconst STYLE_ATTRIBUTE = /style\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)')/gi;\n\n/**\n * Propriedades CSS que pintam texto ou fundo, ancoradas no início de uma\n * declaração para não casar com `border-color` e afins. A forma abreviada\n * `background` entra na lista porque é o que Word e Google Docs escrevem com\n * frequência no lugar de `background-color`.\n */\nconst COLOR_DECLARATION =\n /(?:^|;)\\s*(?:color|background|background-color)\\s*:/i;\n\n/**\n * Cor que vive fora do `style`: `<font color>` e `bgcolor` vêm dos exports\n * antigos do ENEM e do que se cola de um PDF; `<mark>` e `data-color` são o\n * grifo que o Highlight do Tiptap gravava junto com a cor de fundo.\n */\nconst COLOR_MARKUP = [\n /<font\\b[^>]*\\bcolor\\s*=/i,\n /<[a-z][^>]*\\bbgcolor\\s*=/i,\n /<mark\\b/i,\n /\\bdata-color\\s*=/i,\n];\n\n/**\n * Se `html` carrega alguma cor que o editor vai descartar ao carregá-lo.\n * @param html - HTML como veio da API, da geração por IA ou de um export antigo\n * @returns True quando há cor de fonte, de fundo ou grifo no conteúdo\n */\nexport function hasColorMarkup(html?: string | null): boolean {\n if (!html) return false;\n\n if (COLOR_MARKUP.some((pattern) => pattern.test(html))) return true;\n\n for (const match of html.matchAll(STYLE_ATTRIBUTE)) {\n if (COLOR_DECLARATION.test(match[1] ?? match[2] ?? '')) return true;\n }\n\n return false;\n}\n"]}