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
@@ -1 +0,0 @@
1
- {"version":3,"sources":["/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-YQKAASWM.js","../src/components/Card/Card.tsx"],"names":["Fragment","EssayStatus","EssayReviewStatus"],"mappings":"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","file":"/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-YQKAASWM.js","sourcesContent":[null,"import {\n forwardRef,\n Fragment,\n HTMLAttributes,\n ReactNode,\n useState,\n useRef,\n MouseEvent,\n ChangeEvent,\n KeyboardEvent,\n Ref,\n useEffect,\n} from 'react';\nimport Button from '../Button/Button';\nimport IconButton from '../IconButton/IconButton';\nimport Badge from '../Badge/Badge';\nimport ProgressBar from '../ProgressBar/ProgressBar';\nimport { CaretRightIcon } from '@phosphor-icons/react/dist/csr/CaretRight';\nimport { ChatCircleTextIcon } from '@phosphor-icons/react/dist/csr/ChatCircleText';\nimport { CheckCircleIcon } from '@phosphor-icons/react/dist/csr/CheckCircle';\nimport { ClockIcon } from '@phosphor-icons/react/dist/csr/Clock';\nimport { DotsThreeVerticalIcon } from '@phosphor-icons/react/dist/csr/DotsThreeVertical';\nimport { PlayIcon } from '@phosphor-icons/react/dist/csr/Play';\nimport { SpeakerHighIcon } from '@phosphor-icons/react/dist/csr/SpeakerHigh';\nimport { SpeakerLowIcon } from '@phosphor-icons/react/dist/csr/SpeakerLow';\nimport { SpeakerSimpleXIcon } from '@phosphor-icons/react/dist/csr/SpeakerSimpleX';\nimport { TrashIcon } from '@phosphor-icons/react/dist/csr/Trash';\nimport { XCircleIcon } from '@phosphor-icons/react/dist/csr/XCircle';\nimport Text from '../Text/Text';\nimport { cn } from '../../utils/utils';\nimport { useMediaVolumePreference } from '../../store/mediaPreferencesStore';\nimport IconRender from '../IconRender/IconRender';\nimport readingFluencyBird from '../../assets/img/readingFluencyBird.png';\n\n// Componente base reutilizável para todos os cards\ninterface CardBaseProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n variant?: 'default' | 'compact' | 'minimal';\n layout?: 'horizontal' | 'vertical';\n padding?: 'none' | 'small' | 'medium' | 'large';\n minHeight?: 'none' | 'small' | 'medium' | 'large';\n cursor?: 'default' | 'pointer';\n}\n\nconst CARD_BASE_CLASSES = {\n default: 'w-full bg-background border border-border-50 rounded-xl',\n compact: 'w-full bg-background border border-border-50 rounded-lg',\n minimal: 'w-full bg-background border border-border-100 rounded-md',\n};\n\nconst CARD_PADDING_CLASSES = {\n none: '',\n small: 'p-2',\n medium: 'p-4',\n large: 'p-6',\n};\n\nconst CARD_MIN_HEIGHT_CLASSES = {\n none: '',\n small: 'min-h-16',\n medium: 'min-h-20',\n large: 'min-h-24',\n};\n\nconst CARD_LAYOUT_CLASSES = {\n horizontal: 'flex flex-row',\n vertical: 'flex flex-col',\n};\n\nconst CARD_CURSOR_CLASSES = {\n default: '',\n pointer: 'cursor-pointer',\n};\n\nconst CardBase = forwardRef<HTMLDivElement, CardBaseProps>(\n (\n {\n children,\n variant = 'default',\n layout = 'horizontal',\n padding = 'medium',\n minHeight = 'medium',\n cursor = 'default',\n className = '',\n onClick,\n onKeyDown,\n ...props\n },\n ref\n ) => {\n const baseClasses = CARD_BASE_CLASSES[variant];\n const paddingClasses = CARD_PADDING_CLASSES[padding];\n const minHeightClasses = CARD_MIN_HEIGHT_CLASSES[minHeight];\n const layoutClasses = CARD_LAYOUT_CLASSES[layout];\n const cursorClasses = CARD_CURSOR_CLASSES[cursor];\n\n // Make cards with onClick focusable and keyboard accessible\n const isInteractive = !!onClick;\n const handleKeyDown = (e: KeyboardEvent<HTMLDivElement>) => {\n if (isInteractive && ['Enter', ' '].includes(e.key)) {\n e.preventDefault();\n (e.currentTarget as HTMLElement).click();\n }\n onKeyDown?.(e);\n };\n\n /*\n * Note: Using div with role=\"button\" instead of native <button> element.\n * Rationale:\n * - Card is a complex container component with multiple child elements\n * - Native button has layout/styling constraints incompatible with card design\n * - Full WCAG/ARIA compliance implemented: role, tabIndex, keyboard support\n */\n return (\n <div\n ref={ref}\n className={cn(\n baseClasses,\n paddingClasses,\n minHeightClasses,\n layoutClasses,\n cursorClasses,\n className\n )}\n onClick={onClick}\n onKeyDown={handleKeyDown}\n tabIndex={isInteractive ? 0 : undefined}\n role={isInteractive ? 'button' : undefined}\n {...props}\n >\n {children}\n </div>\n );\n }\n);\n\ninterface CardActivitiesResultsProps extends HTMLAttributes<HTMLDivElement> {\n icon: ReactNode;\n title: string;\n subTitle: string;\n header: string;\n description?: string;\n extended?: boolean;\n action?: 'warning' | 'success' | 'error' | 'info';\n /** Extra classes of the value line, e.g. a larger size */\n subTitleClassName?: string;\n}\n\nconst ACTION_CARD_CLASSES = {\n warning: 'bg-warning-background',\n success: 'bg-success-200',\n error: 'bg-error-100',\n info: 'bg-info-background',\n};\n\nconst ACTION_ICON_CLASSES = {\n warning: 'bg-warning-300 text-text',\n success: 'bg-indicator-positive text-text-950',\n error: 'bg-indicator-negative text-text',\n info: 'bg-info-500 text-text',\n};\n\nconst ACTION_SUBTITLE_CLASSES = {\n warning: 'text-warning-600',\n success: 'text-success-700',\n error: 'text-error-700',\n info: 'text-info-700',\n};\n\nconst ACTION_HEADER_CLASSES = {\n warning: 'text-warning-300',\n success: 'text-success-300',\n error: 'text-error-300',\n info: 'text-info-300',\n};\n\nconst CardActivitiesResults = forwardRef<\n HTMLDivElement,\n CardActivitiesResultsProps\n>(\n (\n {\n icon,\n title,\n subTitle,\n header,\n extended = false,\n action = 'success',\n description,\n className,\n subTitleClassName,\n ...props\n },\n ref\n ) => {\n const actionCardClasses = ACTION_CARD_CLASSES[action];\n const actionIconClasses = ACTION_ICON_CLASSES[action];\n const actionSubTitleClasses = ACTION_SUBTITLE_CLASSES[action];\n const actionHeaderClasses = ACTION_HEADER_CLASSES[action];\n\n return (\n <div\n ref={ref}\n className={cn(\n // `min-w-0` lets the card shrink inside a grid/flex track, so the\n // truncated texts below get a width to truncate against instead of\n // stretching the card past its column.\n 'w-full min-w-0 flex flex-col rounded-xl',\n extended && 'border border-border-50 bg-background',\n className\n )}\n {...props}\n >\n <div\n className={cn(\n 'flex flex-col gap-1 items-center justify-center p-4',\n actionCardClasses,\n // Without a description below, the coloured block is the whole\n // card: let it fill the height a stretching grid/flex track gives\n // the wrapper, so siblings in the same row end up the same height.\n extended ? 'rounded-t-xl' : 'flex-1 rounded-xl'\n )}\n >\n <span\n className={cn(\n 'size-7.5 rounded-full flex items-center justify-center',\n actionIconClasses\n )}\n >\n {icon}\n </span>\n\n <Text\n size=\"2xs\"\n weight=\"medium\"\n className=\"max-w-full text-center text-text-800 uppercase truncate\"\n >\n {title}\n </Text>\n\n <p\n className={cn(\n 'max-w-full text-center text-lg font-bold truncate',\n actionSubTitleClasses,\n subTitleClassName\n )}\n >\n {subTitle}\n </p>\n </div>\n\n {extended && (\n <div className=\"flex flex-col items-center gap-2.5 pb-9.5 pt-2.5\">\n <p\n className={cn(\n 'text-2xs font-medium uppercase truncate',\n actionHeaderClasses\n )}\n >\n {header}\n </p>\n <Badge size=\"large\" action=\"info\">\n {description}\n </Badge>\n </div>\n )}\n </div>\n );\n }\n);\n\ninterface CardQuestionProps extends HTMLAttributes<HTMLDivElement> {\n header: string;\n state?: 'done' | 'undone' | 'pending';\n onClickButton?: (valueButton?: unknown) => void;\n valueButton?: unknown;\n /**\n * Disables the action button while still showing that the lesson has a\n * questionnaire. Used when the viewer may see the content but must not\n * answer it (e.g. a teacher previewing a lesson, where answering would\n * create a questionnaire attempt tied to their own user).\n */\n disabled?: boolean;\n}\n\nconst CardQuestions = forwardRef<HTMLDivElement, CardQuestionProps>(\n (\n {\n header,\n state = 'undone',\n className,\n onClickButton,\n valueButton,\n disabled = false,\n ...props\n },\n ref\n ) => {\n const getStateConfig = () => {\n switch (state) {\n case 'done':\n return {\n label: 'Realizado',\n buttonLabel: 'Ver Resultado',\n badgeAction: 'success' as const,\n };\n case 'pending':\n return {\n label: 'Aguardando correção',\n buttonLabel: 'Ver Resultado',\n badgeAction: 'info' as const,\n };\n default:\n return {\n label: 'Não Realizado',\n buttonLabel: 'Responder',\n badgeAction: 'error' as const,\n };\n }\n };\n\n const { label, buttonLabel, badgeAction } = getStateConfig();\n\n return (\n <CardBase\n ref={ref}\n layout=\"horizontal\"\n padding=\"medium\"\n minHeight=\"medium\"\n className={cn('justify-between gap-4', className)}\n {...props}\n >\n <section className=\"flex flex-col gap-1 flex-1 min-w-0\">\n <p className=\"font-bold text-xs text-text-950 truncate\">{header}</p>\n\n <div className=\"flex flex-row gap-6 items-center\">\n <Badge size=\"medium\" variant=\"solid\" action={badgeAction}>\n {label}\n </Badge>\n </div>\n </section>\n\n <span className=\"flex-shrink-0\">\n <Button\n size=\"extra-small\"\n onClick={() => onClickButton?.(valueButton)}\n disabled={disabled}\n className=\"min-w-fit\"\n >\n {buttonLabel}\n </Button>\n </span>\n </CardBase>\n );\n }\n);\n\ninterface CardProgressProps extends HTMLAttributes<HTMLDivElement> {\n header: string;\n subhead?: string;\n initialDate?: string;\n endDate?: string;\n progress?: number;\n direction?: 'horizontal' | 'vertical';\n icon: ReactNode;\n color?: string;\n progressVariant?: 'blue' | 'green';\n showDates?: boolean;\n /**\n * Renders the progress bar and its percentage. Set to `false` for audiences\n * that have no progress of their own (e.g. a teacher previewing a lesson\n * catalogue), where a bar stuck at 0% would read as \"nothing done\" rather\n * than \"not applicable\". Only affects `direction=\"horizontal\"`; the vertical\n * layout never had a bar.\n */\n showProgress?: boolean;\n}\n\nconst CardProgress = forwardRef<HTMLDivElement, CardProgressProps>(\n (\n {\n header,\n subhead,\n initialDate,\n endDate,\n progress = 0,\n direction = 'horizontal',\n icon,\n color = '#B7DFFF',\n progressVariant = 'blue',\n showDates = true,\n showProgress = true,\n className,\n ...props\n },\n ref\n ) => {\n const isHorizontal = direction === 'horizontal';\n const contentComponent = {\n horizontal: (\n <>\n {showDates && (\n <div className=\"flex flex-row gap-6 items-center\">\n {initialDate && (\n <span className=\"flex flex-row gap-1 items-center text-2xs\">\n <p className=\"text-text-800 font-semibold\">Início</p>\n <p className=\"text-text-600\">{initialDate}</p>\n </span>\n )}\n {endDate && (\n <span className=\"flex flex-row gap-1 items-center text-2xs\">\n <p className=\"text-text-800 font-semibold\">Fim</p>\n <p className=\"text-text-600\">{endDate}</p>\n </span>\n )}\n </div>\n )}\n {showProgress && (\n <span className=\"grid grid-cols-[1fr_auto] items-center gap-2\">\n <ProgressBar\n size=\"small\"\n value={progress}\n variant={progressVariant}\n data-testid=\"progress-bar\"\n />\n\n <Text\n size=\"xs\"\n weight=\"medium\"\n className={cn(\n 'text-text-950 leading-none tracking-normal text-center flex-none'\n )}\n >\n {Math.round(progress)}%\n </Text>\n </span>\n )}\n </>\n ),\n vertical: <p className=\"text-sm text-text-800\">{subhead}</p>,\n };\n\n return (\n <CardBase\n ref={ref}\n layout={isHorizontal ? 'horizontal' : 'vertical'}\n padding=\"none\"\n minHeight=\"medium\"\n cursor=\"pointer\"\n className={cn(isHorizontal ? 'h-20' : '', className)}\n {...props}\n >\n <div\n className={cn(\n 'flex justify-center items-center [&>svg]:size-6 text-text-950',\n isHorizontal\n ? 'min-w-[80px] min-h-[80px] rounded-l-xl'\n : 'min-h-[50px] w-full rounded-t-xl',\n !color.startsWith('#') ? `${color}` : ''\n )}\n style={color.startsWith('#') ? { backgroundColor: color } : undefined}\n data-testid=\"icon-container\"\n >\n {icon}\n </div>\n\n <div\n className={cn(\n 'p-4 flex flex-col justify-between w-full h-full',\n !isHorizontal && 'gap-4'\n )}\n >\n <Text size=\"sm\" weight=\"bold\" className=\"text-text-950 truncate\">\n {header}\n </Text>\n {contentComponent[direction]}\n </div>\n </CardBase>\n );\n }\n);\n\ninterface CardTopicProps extends HTMLAttributes<HTMLDivElement> {\n header: string;\n subHead?: string[];\n progress?: number;\n showPercentage?: boolean;\n progressVariant?: 'blue' | 'green';\n /**\n * Renders the progress bar. Set to `false` for audiences that have no\n * progress of their own (e.g. a teacher previewing a lesson catalogue),\n * where a bar stuck at 0% would read as \"nothing done\" rather than \"not\n * applicable\".\n */\n showProgress?: boolean;\n}\n\nconst CardTopic = forwardRef<HTMLDivElement, CardTopicProps>(\n (\n {\n header,\n subHead,\n progress = 0,\n showPercentage = false,\n progressVariant = 'blue',\n showProgress = true,\n className = '',\n ...props\n },\n ref\n ) => {\n return (\n <CardBase\n ref={ref}\n layout=\"vertical\"\n padding=\"small\"\n minHeight=\"medium\"\n cursor=\"pointer\"\n className={cn('justify-center gap-2 py-2 px-4', className)}\n {...props}\n >\n {subHead && (\n <span className=\"text-text-600 text-2xs flex flex-row gap-1\">\n {subHead.map((text, index) => (\n <Fragment key={`${text} - ${index}`}>\n <p>{text}</p>\n {index < subHead.length - 1 && <p>•</p>}\n </Fragment>\n ))}\n </span>\n )}\n\n <p className=\"text-sm text-text-950 font-bold truncate\">{header}</p>\n\n {showProgress && (\n <span className=\"grid grid-cols-[1fr_auto] items-center gap-2\">\n <ProgressBar\n size=\"small\"\n value={progress}\n variant={progressVariant}\n data-testid=\"progress-bar\"\n />\n {showPercentage && (\n <Text\n size=\"xs\"\n weight=\"medium\"\n className={cn(\n 'text-text-950 leading-none tracking-normal text-center flex-none'\n )}\n >\n {Math.round(progress)}%\n </Text>\n )}\n </span>\n )}\n </CardBase>\n );\n }\n);\n\ninterface CardPerformanceProps extends HTMLAttributes<HTMLDivElement> {\n header: string;\n description?: string;\n progress?: number;\n labelProgress?: string;\n actionVariant?: 'button' | 'caret';\n progressVariant?: 'blue' | 'green';\n onClickButton?: (valueButton?: unknown) => void;\n valueButton?: unknown;\n}\n\nconst CardPerformance = forwardRef<HTMLDivElement, CardPerformanceProps>(\n (\n {\n header,\n progress,\n description = 'Sem dados ainda! Você ainda não fez um questionário neste assunto.',\n actionVariant = 'button',\n progressVariant = 'blue',\n labelProgress = '',\n className = '',\n onClickButton,\n valueButton,\n ...props\n },\n ref\n ) => {\n const hasProgress = progress !== undefined;\n\n return (\n <CardBase\n ref={ref}\n layout=\"horizontal\"\n padding=\"medium\"\n minHeight=\"none\"\n className={cn(\n actionVariant == 'caret' ? 'cursor-pointer' : '',\n className\n )}\n onClick={() => actionVariant == 'caret' && onClickButton?.(valueButton)}\n {...props}\n >\n <div className=\"w-full flex flex-col justify-between gap-2\">\n <div className=\"flex flex-row justify-between items-center gap-2\">\n <p className=\"text-lg font-bold text-text-950 truncate flex-1 min-w-0\">\n {header}\n </p>\n {actionVariant === 'button' && (\n <Button\n variant=\"outline\"\n size=\"extra-small\"\n onClick={() => onClickButton?.(valueButton)}\n className=\"min-w-fit flex-shrink-0\"\n >\n Ver Aula\n </Button>\n )}\n </div>\n\n <div className=\"w-full\">\n {hasProgress ? (\n <ProgressBar\n value={progress}\n label={`${progress}% ${labelProgress}`}\n // O label visível já começa com o percentual, então o nome\n // padrão da barra (\"85% : 85%\") anunciava o número duas vezes.\n accessibleLabel={`${labelProgress.trim() || 'Progresso'}: ${progress}%`}\n variant={progressVariant}\n />\n ) : (\n <p className=\"text-xs text-text-600 truncate\">{description}</p>\n )}\n </div>\n </div>\n\n {actionVariant == 'caret' && (\n <CaretRightIcon\n className=\"size-4.5 text-text-800 cursor-pointer\"\n data-testid=\"caret-icon\"\n />\n )}\n </CardBase>\n );\n }\n);\n\ninterface CardResultsProps extends HTMLAttributes<HTMLDivElement> {\n header: string;\n icon: string;\n correct_answers: number;\n incorrect_answers: number;\n direction?: 'row' | 'col';\n color?: string;\n}\n\nconst CardResults = forwardRef<HTMLDivElement, CardResultsProps>(\n (\n {\n header,\n correct_answers,\n incorrect_answers,\n icon,\n direction = 'col',\n color = '#B7DFFF',\n className,\n ...props\n },\n ref\n ) => {\n const isRow = direction == 'row';\n\n return (\n <CardBase\n ref={ref}\n layout=\"horizontal\"\n padding=\"none\"\n minHeight=\"medium\"\n className={cn('items-stretch cursor-pointer pr-4', className)}\n {...props}\n >\n <div\n className={cn(\n 'flex justify-center items-center [&>svg]:size-8 text-text-950 min-w-20 max-w-20 min-h-full rounded-l-xl'\n )}\n style={{\n backgroundColor: color,\n }}\n >\n <IconRender iconName={icon} color=\"currentColor\" size={20} />\n </div>\n\n <div className=\"w-full flex flex-row justify-between items-center\">\n <div\n className={cn(\n 'p-4 flex flex-wrap justify-between w-full h-full',\n isRow ? 'flex-row items-center gap-2' : 'flex-col'\n )}\n >\n <p className=\"text-sm font-bold text-text-950 flex-1\">{header}</p>\n <span className=\"flex flex-wrap flex-row gap-1 items-center\">\n <Badge\n action=\"success\"\n variant=\"solid\"\n size=\"large\"\n iconLeft={<CheckCircleIcon />}\n >\n {correct_answers} Corretas\n </Badge>\n\n <Badge\n action=\"error\"\n variant=\"solid\"\n size=\"large\"\n iconLeft={<XCircleIcon />}\n >\n {incorrect_answers} Incorretas\n </Badge>\n </span>\n </div>\n\n <CaretRightIcon className=\"min-w-6 min-h-6 text-text-800\" />\n </div>\n </CardBase>\n );\n }\n);\n\ninterface CardStatusProps extends HTMLAttributes<HTMLDivElement> {\n header: string;\n status?: 'correct' | 'incorrect' | 'unanswered' | 'pending';\n label?: string;\n}\n\nconst CardStatus = forwardRef<HTMLDivElement, CardStatusProps>(\n ({ header, className, status, label, ...props }, ref) => {\n const getLabelBadge = (status: CardStatusProps['status']) => {\n switch (status) {\n case 'correct':\n return 'Correta';\n case 'incorrect':\n return 'Incorreta';\n case 'unanswered':\n return 'Em branco';\n case 'pending':\n return 'Avaliação pendente';\n default:\n return 'Em branco';\n }\n };\n\n const getIconBadge = (status: CardStatusProps['status']) => {\n switch (status) {\n case 'correct':\n return <CheckCircleIcon />;\n case 'incorrect':\n return <XCircleIcon />;\n case 'pending':\n return <ClockIcon />;\n default:\n return <XCircleIcon />;\n }\n };\n\n const getActionBadge = (status: CardStatusProps['status']) => {\n switch (status) {\n case 'correct':\n return 'success';\n case 'incorrect':\n return 'error';\n case 'pending':\n return 'info';\n default:\n return 'info';\n }\n };\n\n return (\n <CardBase\n ref={ref}\n layout=\"horizontal\"\n padding=\"medium\"\n minHeight=\"medium\"\n className={cn('items-center cursor-pointer', className)}\n {...props}\n >\n <div className=\"flex justify-between w-full h-full flex-row items-center gap-2\">\n <p className=\"text-sm font-bold text-text-950 truncate flex-1 min-w-0\">\n {header}\n </p>\n <span className=\"flex flex-row gap-1 items-center flex-shrink-0\">\n {status && (\n <Badge\n action={getActionBadge(status)}\n variant=\"solid\"\n size=\"medium\"\n iconLeft={getIconBadge(status)}\n >\n {getLabelBadge(status)}\n </Badge>\n )}\n {label && <p className=\"text-sm text-text-800\">{label}</p>}\n </span>\n <CaretRightIcon className=\"min-w-6 min-h-6 text-text-800 cursor-pointer flex-shrink-0 ml-2\" />\n </div>\n </CardBase>\n );\n }\n);\n\ninterface CardSettingsProps extends HTMLAttributes<HTMLDivElement> {\n icon: ReactNode;\n header: string;\n}\n\nconst CardSettings = forwardRef<HTMLDivElement, CardSettingsProps>(\n ({ header, className, icon, ...props }, ref) => {\n return (\n <CardBase\n ref={ref}\n layout=\"horizontal\"\n padding=\"small\"\n minHeight=\"none\"\n className={cn(\n 'border-none items-center gap-2 text-text-700',\n className\n )}\n {...props}\n >\n <span className=\"[&>svg]:size-6\">{icon}</span>\n\n <p className=\"w-full text-sm truncate\">{header}</p>\n\n <CaretRightIcon size={24} className=\"cursor-pointer\" />\n </CardBase>\n );\n }\n);\n\ninterface CardSupportProps extends HTMLAttributes<HTMLDivElement> {\n header: string;\n direction?: 'row' | 'col';\n children: ReactNode;\n}\n\nconst CardSupport = forwardRef<HTMLDivElement, CardSupportProps>(\n ({ header, className, direction = 'col', children, ...props }, ref) => {\n return (\n <CardBase\n ref={ref}\n layout=\"horizontal\"\n padding=\"medium\"\n minHeight=\"none\"\n className={cn(\n 'border-none items-center gap-2 text-text-700',\n className\n )}\n {...props}\n >\n <div\n className={cn(\n 'w-full flex',\n direction == 'col' ? 'flex-col' : 'flex-row items-center'\n )}\n >\n <span className=\"w-full min-w-0\">\n <p className=\"text-sm text-text-950 font-bold truncate\">{header}</p>\n </span>\n <span className=\"flex flex-row gap-1\">{children}</span>\n </div>\n\n <CaretRightIcon className=\"text-text-800 cursor-pointer\" size={24} />\n </CardBase>\n );\n }\n);\n\ninterface CardForumProps<T = unknown> extends HTMLAttributes<HTMLDivElement> {\n title: string;\n content: string;\n comments: number;\n date: string;\n hour: string;\n onClickComments?: (value?: T) => void;\n valueComments?: T;\n onClickProfile?: (profile?: T) => void;\n valueProfile?: T;\n}\n\nconst CardForum = forwardRef<HTMLDivElement, CardForumProps>(\n (\n {\n title,\n content,\n comments,\n onClickComments,\n valueComments,\n onClickProfile,\n valueProfile,\n className = '',\n date,\n hour,\n ...props\n },\n ref\n ) => {\n return (\n <CardBase\n ref={ref}\n layout=\"horizontal\"\n padding=\"medium\"\n minHeight=\"none\"\n variant=\"minimal\"\n className={cn('w-auto h-auto gap-3', className)}\n {...props}\n >\n <button\n type=\"button\"\n aria-label=\"Ver perfil\"\n onClick={() => onClickProfile?.(valueProfile)}\n className=\"min-w-8 h-8 rounded-full bg-background-950\"\n />\n\n <div className=\"flex flex-col gap-2 flex-1 min-w-0\">\n <div className=\"flex flex-row gap-1 items-center flex-wrap\">\n <p className=\"text-xs font-semibold text-primary-700 truncate\">\n {title}\n </p>\n <p className=\"text-xs text-text-600\">\n • {date} • {hour}\n </p>\n </div>\n\n <p className=\"text-text-950 text-sm line-clamp-2 truncate\">\n {content}\n </p>\n\n <button\n type=\"button\"\n aria-label=\"Ver comentários\"\n onClick={() => onClickComments?.(valueComments)}\n className=\"text-text-600 flex flex-row gap-2 items-center\"\n >\n <ChatCircleTextIcon aria-hidden=\"true\" size={16} />\n <p className=\"text-xs\">{comments} respostas</p>\n </button>\n </div>\n </CardBase>\n );\n }\n);\n\ninterface CardAudioProps extends HTMLAttributes<HTMLDivElement> {\n src?: string;\n title?: string;\n onPlay?: () => void;\n onPause?: () => void;\n onEnded?: () => void;\n onAudioTimeUpdate?: (currentTime: number, duration: number) => void;\n loop?: boolean;\n preload?: 'none' | 'metadata' | 'auto';\n tracks?: Array<{\n kind: 'subtitles' | 'captions' | 'descriptions' | 'chapters' | 'metadata';\n src: string;\n srcLang: string;\n label: string;\n default?: boolean;\n }>;\n}\n\n/** Salto do avanço/retrocesso da barra de progresso pelo teclado. */\nconst AUDIO_SEEK_STEP_SECONDS = 5;\n\nconst AUDIO_SPEED_OPTIONS = [\n { speed: 1, label: '1x' },\n { speed: 1.5, label: '1.5x' },\n { speed: 2, label: '2x' },\n];\n\nconst CardAudio = forwardRef<HTMLDivElement, CardAudioProps>(\n (\n {\n src,\n title,\n onPlay,\n onPause,\n onEnded,\n onAudioTimeUpdate,\n loop = false,\n preload = 'metadata',\n tracks,\n className,\n ...props\n },\n ref\n ) => {\n const [isPlaying, setIsPlaying] = useState(false);\n const [currentTime, setCurrentTime] = useState(0);\n const [duration, setDuration] = useState(0);\n // Mesmo store da videoaula: o volume escolhido em qualquer player vale\n // para o próximo, em vez de o podcast recomeçar sempre em 100%.\n const { volume, isMuted, setVolume, setIsMuted } =\n useMediaVolumePreference();\n const [showVolumeControl, setShowVolumeControl] = useState(false);\n const [showSpeedMenu, setShowSpeedMenu] = useState(false);\n const [playbackRate, setPlaybackRate] = useState(1);\n const audioRef = useRef<HTMLAudioElement>(null);\n const volumeControlRef = useRef<HTMLDivElement>(null);\n const speedMenuRef = useRef<HTMLDivElement>(null);\n // Gatilhos e conteúdo dos dois popups: o foco precisa entrar ao abrir e\n // voltar ao gatilho ao fechar, senão o teclado fica preso fora deles.\n const volumeButtonRef = useRef<HTMLButtonElement>(null);\n const volumeSliderRef = useRef<HTMLInputElement>(null);\n const speedButtonRef = useRef<HTMLButtonElement>(null);\n const speedMenuListRef = useRef<HTMLDivElement>(null);\n\n const formatTime = (time: number) => {\n // Transmissão ao vivo reporta duração `Infinity`, e antes dos metadados,\n // `NaN` — sem esta guarda a tela mostrava \"Infinity:NaN\".\n if (!Number.isFinite(time) || time < 0) return '0:00';\n\n const minutes = Math.floor(time / 60);\n const seconds = Math.floor(time % 60);\n return `${minutes}:${seconds.toString().padStart(2, '0')}`;\n };\n\n const handlePlayPause = () => {\n if (isPlaying) {\n audioRef.current?.pause();\n setIsPlaying(false);\n onPause?.();\n } else {\n // play() returns a promise that rejects (AbortError) when interrupted\n // by a pause() before playback starts; swallow it to avoid crashing.\n audioRef.current?.play()?.catch(() => {});\n setIsPlaying(true);\n onPlay?.();\n }\n };\n\n const handleTimeUpdate = () => {\n const current = audioRef.current?.currentTime ?? 0;\n const total = audioRef.current?.duration ?? 0;\n\n setCurrentTime(current);\n setDuration(total);\n onAudioTimeUpdate?.(current, total);\n };\n\n const handleLoadedMetadata = () => {\n setDuration(audioRef.current?.duration ?? 0);\n };\n\n const handleEnded = () => {\n setIsPlaying(false);\n setCurrentTime(0);\n onEnded?.();\n };\n\n /**\n * `audio.duration` vem `Infinity` em transmissão ao vivo e `NaN` antes dos\n * metadados — e o `?? 0` dos handlers não pega nenhum dos dois, porque só\n * trata `null`/`undefined`. O que é exibido e anunciado passa por aqui; o\n * valor cru segue indo para `seekTo`, senão saturar a duração em zero\n * prenderia o avanço de mídia ao vivo no início.\n */\n const hasKnownDuration = Number.isFinite(duration) && duration > 0;\n\n /** Move a reprodução para `time`, preso à faixa [0, duração]. */\n const seekTo = (time: number) => {\n const clamped = Math.min(Math.max(time, 0), duration);\n\n if (audioRef.current && Number.isFinite(clamped)) {\n audioRef.current.currentTime = clamped;\n setCurrentTime(clamped);\n }\n };\n\n const handleProgressClick = (e: MouseEvent<HTMLButtonElement>) => {\n const rect = e.currentTarget.getBoundingClientRect();\n const clickX = e.clientX - rect.left;\n\n seekTo((clickX / rect.width) * duration);\n };\n\n /**\n * Avanço e retrocesso pelo teclado. Antes, Enter e Espaço sintetizavam um\n * clique — que chega com `clientX` 0 e rebobinava o áudio para o início.\n */\n const handleProgressKeyDown = (e: KeyboardEvent<HTMLButtonElement>) => {\n const timeByKey: Record<string, number> = {\n ArrowRight: currentTime + AUDIO_SEEK_STEP_SECONDS,\n ArrowUp: currentTime + AUDIO_SEEK_STEP_SECONDS,\n ArrowLeft: currentTime - AUDIO_SEEK_STEP_SECONDS,\n ArrowDown: currentTime - AUDIO_SEEK_STEP_SECONDS,\n Home: 0,\n End: duration,\n };\n\n if (e.key in timeByKey) {\n e.preventDefault();\n seekTo(timeByKey[e.key]);\n }\n };\n\n // O card tem um único controle de áudio, então o mudo herdado da videoaula\n // aparece aqui como volume zero — em vez de um slider em 70% sem som.\n const displayVolume = isMuted ? 0 : volume;\n\n /**\n * Salva o volume escolhido. Como o slider é o único controle de áudio do\n * card, zerá-lo é o gesto de mudo, e sair do zero desfaz o mudo herdado.\n */\n const applyVolume = (newVolume: number) => {\n setVolume(newVolume);\n setIsMuted(newVolume === 0);\n };\n\n const handleVolumeChange = (e: ChangeEvent<HTMLInputElement>) => {\n applyVolume(Number.parseFloat(e.target.value));\n };\n\n const toggleVolumeControl = () => {\n setShowVolumeControl(!showVolumeControl);\n setShowSpeedMenu(false);\n };\n\n const toggleSpeedMenu = () => {\n setShowSpeedMenu(!showSpeedMenu);\n setShowVolumeControl(false);\n };\n\n const closeVolumeControl = () => {\n setShowVolumeControl(false);\n volumeButtonRef.current?.focus();\n };\n\n const closeSpeedMenu = () => {\n setShowSpeedMenu(false);\n speedButtonRef.current?.focus();\n };\n\n const handleVolumeKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n const stepUp = Math.min(1, Math.round((displayVolume + 0.1) * 10) / 10);\n const stepDown = Math.max(0, Math.round((displayVolume - 0.1) * 10) / 10);\n const volumeByKey: Record<string, number> = {\n ArrowUp: stepUp,\n ArrowRight: stepUp,\n ArrowDown: stepDown,\n ArrowLeft: stepDown,\n };\n\n if (e.key in volumeByKey) {\n e.preventDefault();\n applyVolume(volumeByKey[e.key]);\n } else if (e.key === 'Escape') {\n e.preventDefault();\n closeVolumeControl();\n }\n };\n\n /** Navegação do menu de velocidade, no mesmo padrão da videoaula. */\n const handleSpeedMenuKeyDown = (e: KeyboardEvent<HTMLDivElement>) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n closeSpeedMenu();\n return;\n }\n\n const items = [\n ...(speedMenuListRef.current?.querySelectorAll<HTMLButtonElement>(\n '[role=\"menuitemradio\"]'\n ) ?? []),\n ];\n if (items.length === 0) return;\n\n const currentIndex = items.indexOf(\n document.activeElement as HTMLButtonElement\n );\n const nextIndexByKey: Record<string, number> = {\n ArrowDown: (currentIndex + 1) % items.length,\n ArrowUp: (currentIndex - 1 + items.length) % items.length,\n Home: 0,\n End: items.length - 1,\n };\n\n if (e.key in nextIndexByKey) {\n e.preventDefault();\n items[nextIndexByKey[e.key]]?.focus();\n }\n };\n\n const handleSpeedChange = (speed: number) => {\n setPlaybackRate(speed);\n if (audioRef.current) {\n audioRef.current.playbackRate = speed;\n }\n closeSpeedMenu();\n };\n\n // Abrir um popup sem levar o foco deixa o conteúdo dele fora do alcance de\n // quem abriu pelo teclado — o Escape, inclusive, não teria onde ser ouvido.\n useEffect(() => {\n if (showVolumeControl) volumeSliderRef.current?.focus();\n }, [showVolumeControl]);\n\n useEffect(() => {\n if (!showSpeedMenu) return;\n\n const list = speedMenuListRef.current;\n const checked = list?.querySelector<HTMLButtonElement>(\n '[aria-checked=\"true\"]'\n );\n (\n checked ??\n list?.querySelector<HTMLButtonElement>('[role=\"menuitemradio\"]')\n )?.focus();\n }, [showSpeedMenu]);\n\n const getVolumeIcon = () => {\n if (displayVolume === 0) {\n return <SpeakerSimpleXIcon size={24} />;\n }\n if (displayVolume < 0.5) {\n return <SpeakerLowIcon size={24} />;\n }\n return <SpeakerHighIcon size={24} />;\n };\n\n // Aplica a preferência ao elemento no mount, ao trocar de faixa e quando\n // outro player altera o volume. Sem isso o `<audio>` sempre nasceria em 100%.\n useEffect(() => {\n const audio = audioRef.current;\n if (!audio) return;\n\n audio.volume = volume;\n audio.muted = isMuted;\n }, [volume, isMuted, src]);\n\n useEffect(() => {\n const handleClickOutside = (event: Event) => {\n if (\n volumeControlRef.current &&\n !volumeControlRef.current.contains(event.target as Node)\n ) {\n setShowVolumeControl(false);\n }\n if (\n speedMenuRef.current &&\n !speedMenuRef.current.contains(event.target as Node)\n ) {\n setShowSpeedMenu(false);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }, []);\n\n /**\n * Rótulo do play/pause. O título entra nele pro botão se descrever sozinho:\n * quem chega ali pela navegação do leitor de tela, sem ter passado pelo nome\n * do grupo, ouvia só \"Reproduzir\" sem saber o quê.\n */\n const playPauseAction = isPlaying ? 'Pausar' : 'Reproduzir';\n const playPauseLabel = title\n ? `${playPauseAction} ${title}`\n : playPauseAction;\n\n return (\n <CardBase\n ref={ref}\n layout=\"horizontal\"\n padding=\"medium\"\n minHeight=\"none\"\n className={cn(\n 'flex flex-row w-auto h-14 items-center gap-2',\n className\n )}\n {...props}\n >\n {/* Audio element */}\n <audio\n ref={audioRef}\n src={src}\n loop={loop}\n preload={preload}\n onTimeUpdate={handleTimeUpdate}\n onLoadedMetadata={handleLoadedMetadata}\n onEnded={handleEnded}\n data-testid=\"audio-element\"\n // Sem `aria-label`: este `<audio>` não tem `controls`, então não há\n // nada pro leitor de tela fazer com ele — e o rótulo repetia o título\n // que o container já anuncia, aparecendo duas vezes na árvore (o caso\n // do card de podcast). Quem nomeia o conjunto é o consumidor, com um\n // `<section>` nomeada em volta (ver `LessonPodcastSection`).\n >\n {tracks ? (\n tracks.map((track) => (\n <track\n key={track.src}\n kind={track.kind}\n src={track.src}\n srcLang={track.srcLang}\n label={track.label}\n default={track.default}\n />\n ))\n ) : (\n <track\n kind=\"captions\"\n src=\"data:text/vtt;base64,\"\n srcLang=\"pt\"\n label=\"Sem legendas disponíveis\"\n />\n )}\n </audio>\n\n {/* Play/Pause Button */}\n <button\n type=\"button\"\n onClick={handlePlayPause}\n disabled={!src}\n className=\"cursor-pointer text-text-950 hover:text-primary-600 disabled:text-text-400 disabled:cursor-not-allowed\"\n aria-label={playPauseLabel}\n >\n {isPlaying ? (\n <div className=\"w-6 h-6 flex items-center justify-center\">\n <div className=\"flex gap-0.5\">\n <div className=\"w-1 h-4 bg-current rounded-sm\"></div>\n <div className=\"w-1 h-4 bg-current rounded-sm\"></div>\n </div>\n </div>\n ) : (\n <PlayIcon size={24} />\n )}\n </button>\n\n {/* Current Time */}\n <p className=\"text-text-800 text-md font-medium min-w-[2.5rem]\">\n {formatTime(currentTime)}\n </p>\n\n {/* Progress Bar */}\n <div className=\"flex-1 relative\" data-testid=\"progress-bar\">\n <button\n type=\"button\"\n className=\"w-full h-2 bg-border-100 rounded-full cursor-pointer\"\n onClick={handleProgressClick}\n onKeyDown={handleProgressKeyDown}\n // O papel nativo de botão não carrega posição nem duração: o leitor\n // anunciava só o rótulo, sem dizer em que ponto do áudio se está.\n role=\"slider\"\n aria-label=\"Barra de progresso do áudio\"\n aria-valuemin={0}\n aria-valuemax={hasKnownDuration ? Math.round(duration) : 0}\n aria-valuenow={hasKnownDuration ? Math.round(currentTime) : 0}\n // Sem duração conhecida, anuncia só o decorrido: dizer \"de 0:00\"\n // afirmaria um total que não existe.\n aria-valuetext={\n hasKnownDuration\n ? `${formatTime(currentTime)} de ${formatTime(duration)}`\n : formatTime(currentTime)\n }\n >\n <div\n className=\"h-full bg-primary-600 rounded-full transition-all duration-100\"\n style={{\n width:\n duration > 0 ? `${(currentTime / duration) * 100}%` : '0%',\n }}\n />\n </button>\n </div>\n\n {/* Duration */}\n <p className=\"text-text-800 text-md font-medium min-w-[2.5rem]\">\n {formatTime(duration)}\n </p>\n\n {/* Volume Control */}\n <div className=\"relative h-6\" ref={volumeControlRef}>\n <button\n ref={volumeButtonRef}\n type=\"button\"\n onClick={toggleVolumeControl}\n className=\"cursor-pointer text-text-950 hover:text-primary-600\"\n aria-label=\"Controle de volume\"\n aria-expanded={showVolumeControl}\n >\n <div className=\"w-6 h-6 flex items-center justify-center\">\n {getVolumeIcon()}\n </div>\n </button>\n\n {showVolumeControl && (\n // Era um <button> envolvendo o slider: além de HTML inválido, o\n // papel de botão achata os filhos, e o slider não chegava ao leitor.\n <div className=\"absolute bottom-full right-0 mb-2 p-2 bg-background border border-border-100 rounded-lg shadow-lg\">\n <input\n ref={volumeSliderRef}\n type=\"range\"\n min=\"0\"\n max=\"1\"\n step=\"0.1\"\n value={displayVolume}\n onChange={handleVolumeChange}\n onKeyDown={handleVolumeKeyDown}\n className=\"w-20 h-2 bg-border-100 rounded-lg appearance-none cursor-pointer focus:outline-none focus:ring-2 focus:ring-primary-500\"\n style={{\n background: `linear-gradient(to right, #3b82f6 0%, #3b82f6 ${displayVolume * 100}%, #e5e7eb ${displayVolume * 100}%, #e5e7eb 100%)`,\n }}\n aria-label=\"Volume\"\n aria-valuenow={Math.round(displayVolume * 100)}\n aria-valuemin={0}\n aria-valuemax={100}\n // Sem isto o leitor fala o número cru — e aqui seria \"0,5\",\n // porque a faixa nativa vai de 0 a 1, não de 0 a 100.\n aria-valuetext={`${Math.round(displayVolume * 100)} por cento`}\n />\n </div>\n )}\n </div>\n\n {/* Menu Button */}\n <div className=\"relative h-6\" ref={speedMenuRef}>\n <button\n ref={speedButtonRef}\n type=\"button\"\n onClick={toggleSpeedMenu}\n className=\"cursor-pointer text-text-950 hover:text-primary-600\"\n aria-label=\"Opções de velocidade\"\n aria-haspopup=\"menu\"\n aria-expanded={showSpeedMenu}\n >\n <DotsThreeVerticalIcon size={24} />\n </button>\n\n {showSpeedMenu && (\n <div className=\"absolute bottom-full right-0 mb-2 p-2 bg-background border border-border-100 rounded-lg shadow-lg min-w-24 z-10\">\n <div\n ref={speedMenuListRef}\n role=\"menu\"\n aria-label=\"Velocidade de reprodução\"\n // Focável só por script: o foco vive nas velocidades\n tabIndex={-1}\n onKeyDown={handleSpeedMenuKeyDown}\n className=\"flex flex-col gap-1\"\n >\n {AUDIO_SPEED_OPTIONS.map(({ speed, label }) => (\n <button\n key={speed}\n type=\"button\"\n // A velocidade ativa só se distinguia pela cor de fundo:\n // `aria-checked` é o que a torna audível.\n role=\"menuitemradio\"\n aria-checked={playbackRate === speed}\n // Tabindex móvel: as setas andam entre as velocidades\n tabIndex={-1}\n onClick={() => handleSpeedChange(speed)}\n className={cn(\n 'px-3 py-1 text-sm text-left rounded hover:bg-border-50 transition-colors',\n playbackRate === speed\n ? 'bg-primary-950 text-secondary-100 font-medium'\n : 'text-text-950'\n )}\n >\n {label}\n </button>\n ))}\n </div>\n </div>\n )}\n </div>\n </CardBase>\n );\n }\n);\n\ninterface CardSimuladoProps extends HTMLAttributes<HTMLDivElement> {\n title: string;\n duration?: string;\n info: string;\n backgroundColor: 'enem' | 'prova' | 'simuladao' | 'vestibular';\n /**\n * Renders the card in a non-interactive \"coming soon\" state: greyed out,\n * not clickable, with an \"Em breve\" badge next to the title.\n */\n comingSoon?: boolean;\n /** Disables interaction (greyed out, not clickable) without a badge. */\n disabled?: boolean;\n}\n\nconst SIMULADO_BACKGROUND_CLASSES = {\n enem: 'bg-exam-1',\n prova: 'bg-exam-2',\n simuladao: 'bg-exam-3',\n vestibular: 'bg-exam-4',\n};\n\nconst CardSimulado = forwardRef<HTMLDivElement, CardSimuladoProps>(\n (\n {\n title,\n duration,\n info,\n backgroundColor,\n comingSoon = false,\n disabled = false,\n className,\n onClick,\n onKeyDown,\n ...props\n },\n ref\n ) => {\n const backgroundClass = SIMULADO_BACKGROUND_CLASSES[backgroundColor];\n const isInteractive = !comingSoon && !disabled;\n\n return (\n <CardBase\n ref={ref}\n layout=\"horizontal\"\n padding=\"medium\"\n minHeight=\"none\"\n cursor={isInteractive ? 'pointer' : 'default'}\n aria-disabled={isInteractive ? undefined : true}\n // Only forward handlers when interactive: CardBase derives tabIndex,\n // role=\"button\" and Enter/Space activation from the presence of onClick,\n // so a disabled/coming-soon card must not receive them.\n onClick={isInteractive ? onClick : undefined}\n onKeyDown={isInteractive ? onKeyDown : undefined}\n className={cn(\n backgroundClass,\n isInteractive\n ? 'hover:shadow-soft-shadow-2 transition-shadow duration-200'\n : 'opacity-60 pointer-events-none',\n className\n )}\n {...props}\n >\n <div className=\"flex justify-between items-center w-full gap-4\">\n <div className=\"flex flex-col gap-1 flex-1 min-w-0\">\n {comingSoon ? (\n <div className=\"flex items-center gap-2 min-w-0\">\n <Text\n size=\"lg\"\n weight=\"bold\"\n className=\"text-text-950 truncate\"\n >\n {title}\n </Text>\n <Badge\n size=\"small\"\n variant=\"solid\"\n action=\"info\"\n className=\"flex-shrink-0\"\n data-testid=\"badge-em-breve\"\n >\n Em breve\n </Badge>\n </div>\n ) : (\n <Text size=\"lg\" weight=\"bold\" className=\"text-text-950 truncate\">\n {title}\n </Text>\n )}\n\n <div className=\"flex items-center gap-4 text-text-700\">\n {duration && (\n <div className=\"flex items-center gap-1\">\n {/* Decorativo: a duração está no texto ao lado. O Phosphor não\n marca os ícones sozinho — sem `alt` ele nem emite\n `<title>`, então o leitor anunciava um gráfico sem nome. */}\n <ClockIcon\n size={16}\n className=\"flex-shrink-0\"\n aria-hidden=\"true\"\n />\n <Text size=\"sm\">{duration}</Text>\n </div>\n )}\n\n <Text size=\"sm\" className=\"truncate\">\n {info}\n </Text>\n </div>\n </div>\n\n {isInteractive && (\n <CaretRightIcon\n size={24}\n className=\"text-text-800 flex-shrink-0\"\n data-testid=\"caret-icon\"\n aria-hidden=\"true\"\n />\n )}\n </div>\n </CardBase>\n );\n }\n);\n\ninterface CardTestProps extends Omit<HTMLAttributes<HTMLElement>, 'onSelect'> {\n title: string;\n duration?: string;\n questionsCount?: number;\n additionalInfo?: string;\n selected?: boolean;\n onSelect?: (selected: boolean) => void;\n}\n\nconst CardTest = forwardRef<HTMLElement, CardTestProps>(\n (\n {\n title,\n duration,\n questionsCount,\n additionalInfo,\n selected = false,\n onSelect,\n className = '',\n ...props\n },\n ref\n ) => {\n const handleClick = () => {\n if (onSelect) {\n onSelect(!selected);\n }\n };\n\n const handleKeyDown = (event: KeyboardEvent<HTMLElement>) => {\n if ((event.key === 'Enter' || event.key === ' ') && onSelect) {\n event.preventDefault();\n onSelect(!selected);\n }\n };\n\n const isSelectable = !!onSelect;\n const getQuestionsText = (count: number) => {\n const singular = count === 1 ? 'questão' : 'questões';\n return `${count} ${singular}`;\n };\n\n const displayInfo = questionsCount\n ? getQuestionsText(questionsCount)\n : additionalInfo || '';\n const baseClasses =\n 'flex flex-row items-center p-4 gap-2 w-full max-w-full bg-background shadow-soft-shadow-1 rounded-xl isolate border-0 text-left';\n const interactiveClasses = isSelectable\n ? 'cursor-pointer focus:outline-none focus:ring-2 focus:ring-primary-950 focus:ring-offset-2'\n : '';\n const selectedClasses = selected\n ? 'ring-2 ring-primary-950 ring-offset-2'\n : '';\n\n if (isSelectable) {\n return (\n <button\n ref={ref as Ref<HTMLButtonElement>}\n type=\"button\"\n className={cn(\n `${baseClasses} ${interactiveClasses} ${selectedClasses} ${className}`.trim()\n )}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n aria-pressed={selected}\n {...(props as HTMLAttributes<HTMLButtonElement>)}\n >\n <div className=\"flex flex-col justify-between gap-[27px] flex-grow min-h-[67px] w-full min-w-0\">\n <Text\n size=\"md\"\n weight=\"bold\"\n className=\"text-text-950 tracking-[0.2px] leading-[19px] truncate\"\n >\n {title}\n </Text>\n\n <div className=\"flex flex-row justify-start items-end gap-4 w-full\">\n {duration && (\n <div className=\"flex flex-row items-center gap-1 flex-shrink-0\">\n <ClockIcon\n size={16}\n className=\"text-text-700\"\n aria-hidden=\"true\"\n />\n <Text\n size=\"sm\"\n className=\"text-text-700 leading-[21px] whitespace-nowrap\"\n >\n {duration}\n </Text>\n </div>\n )}\n\n <Text\n size=\"sm\"\n className=\"text-text-700 leading-[21px] flex-grow truncate\"\n >\n {displayInfo}\n </Text>\n </div>\n </div>\n </button>\n );\n }\n\n return (\n <div\n ref={ref as Ref<HTMLDivElement>}\n className={cn(`${baseClasses} ${className}`.trim())}\n {...(props as HTMLAttributes<HTMLDivElement>)}\n >\n <div className=\"flex flex-col justify-between gap-[27px] flex-grow min-h-[67px] w-full min-w-0\">\n <Text\n size=\"md\"\n weight=\"bold\"\n className=\"text-text-950 tracking-[0.2px] leading-[19px] truncate\"\n >\n {title}\n </Text>\n\n <div className=\"flex flex-row justify-start items-end gap-4 w-full\">\n {duration && (\n <div className=\"flex flex-row items-center gap-1 flex-shrink-0\">\n <ClockIcon\n size={16}\n className=\"text-text-700\"\n aria-hidden=\"true\"\n />\n <Text\n size=\"sm\"\n className=\"text-text-700 leading-[21px] whitespace-nowrap\"\n >\n {duration}\n </Text>\n </div>\n )}\n\n <Text\n size=\"sm\"\n className=\"text-text-700 leading-[21px] flex-grow truncate min-w-0\"\n >\n {displayInfo}\n </Text>\n </div>\n </div>\n </div>\n );\n }\n);\n\ninterface SimulationItem {\n id: string;\n title: string;\n type: 'enem' | 'prova' | 'simulado' | 'vestibular';\n info: string;\n /**\n * Optional status badge (e.g. \"Em andamento\" / \"Concluído\"). When provided it\n * is rendered next to the type badge. `action` maps to the Badge color action.\n */\n statusBadge?: {\n label: string;\n action: 'success' | 'warning' | 'info' | 'error';\n };\n /**\n * True when the current user authored this simulation and may remove it.\n * Only then is the delete action rendered — a simulation assigned by a\n * teacher never gets one.\n */\n canDelete?: boolean;\n}\n\ninterface SimulationHistoryData {\n date: string;\n simulations: SimulationItem[];\n}\n\ninterface CardSimulationHistoryProps extends HTMLAttributes<HTMLDivElement> {\n data: SimulationHistoryData[];\n onSimulationClick?: (simulation: SimulationItem) => void;\n /**\n * Called when the delete action is triggered for a simulation. The action is\n * only rendered for items flagged with `canDelete`. Confirmation is the\n * caller's responsibility.\n */\n onDeleteClick?: (simulation: SimulationItem) => void;\n}\n\nconst SIMULATION_TYPE_STYLES = {\n enem: {\n background: 'bg-exam-1',\n badge: 'exam1' as const,\n text: 'Enem',\n },\n prova: {\n background: 'bg-exam-2',\n badge: 'exam2' as const,\n text: 'Prova',\n },\n simulado: {\n background: 'bg-exam-3',\n badge: 'exam3' as const,\n text: 'Simuladão',\n },\n vestibular: {\n background: 'bg-exam-4',\n badge: 'exam4' as const,\n text: 'Vestibular',\n },\n};\n\nconst CardSimulationHistory = forwardRef<\n HTMLDivElement,\n CardSimulationHistoryProps\n>(({ data, onSimulationClick, onDeleteClick, className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn('w-full max-w-[992px] h-auto', className)}\n {...props}\n >\n {/* Content */}\n <div className=\"flex flex-col gap-0\">\n {data.map((section, sectionIndex) => (\n <div key={section.date} className=\"flex flex-col\">\n {/* Seção com data */}\n <div\n className={cn(\n 'flex flex-row justify-center items-start px-4 py-6 gap-2 w-full bg-background',\n sectionIndex === 0 ? 'rounded-t-3xl' : ''\n )}\n >\n <Text\n size=\"xs\"\n weight=\"bold\"\n className=\"text-text-800 w-11 flex-shrink-0\"\n >\n {section.date}\n </Text>\n\n <div className=\"flex flex-col gap-2 flex-1\">\n {section.simulations.map((simulation) => {\n const typeStyles = SIMULATION_TYPE_STYLES[simulation.type];\n\n return (\n <CardBase\n key={simulation.id}\n layout=\"horizontal\"\n padding=\"medium\"\n minHeight=\"none\"\n cursor=\"pointer\"\n className={cn(\n `${typeStyles.background} rounded-xl hover:shadow-soft-shadow-2 \n transition-shadow duration-200 h-auto min-h-[61px]`\n )}\n onClick={() => onSimulationClick?.(simulation)}\n >\n <div className=\"flex justify-between items-center w-full gap-2\">\n <div className=\"flex flex-wrap flex-col justify-between sm:flex-row gap-2 flex-1 min-w-0\">\n <Text\n size=\"lg\"\n weight=\"bold\"\n className=\"text-text-950 truncate\"\n >\n {simulation.title}\n </Text>\n\n <div className=\"flex items-center gap-2\">\n <Badge\n variant=\"examsOutlined\"\n action={typeStyles.badge}\n size=\"medium\"\n >\n {typeStyles.text}\n </Badge>\n\n {simulation.statusBadge && (\n <Badge\n variant=\"outlined\"\n action={simulation.statusBadge.action}\n size=\"medium\"\n >\n {simulation.statusBadge.label}\n </Badge>\n )}\n\n <Text size=\"sm\" className=\"text-text-800 truncate\">\n {simulation.info}\n </Text>\n </div>\n </div>\n\n <div className=\"flex items-center gap-1 flex-shrink-0\">\n {simulation.canDelete && onDeleteClick && (\n <IconButton\n size=\"sm\"\n icon={<TrashIcon size={20} />}\n aria-label={`Excluir simulado ${simulation.title}`}\n data-testid={`delete-simulation-${simulation.id}`}\n // The whole CardBase is clickable, so the click\n // must not bubble up into onSimulationClick.\n onClick={(event) => {\n event.stopPropagation();\n onDeleteClick(simulation);\n }}\n />\n )}\n\n <CaretRightIcon\n size={24}\n className=\"text-text-800\"\n data-testid=\"caret-icon\"\n />\n </div>\n </div>\n </CardBase>\n );\n })}\n </div>\n </div>\n </div>\n ))}\n\n {/* Footer rounded */}\n {data.length > 0 && (\n <div className=\"w-full h-6 bg-background rounded-b-3xl\" />\n )}\n </div>\n </div>\n );\n});\n\n// ======================================================================\n// CardEssayHistory — histórico de redações agrupado por data\n// ======================================================================\n\nexport enum EssayStatus {\n DRAFT = 'DRAFT',\n SUBMITTED = 'SUBMITTED',\n CORRECTING = 'CORRECTING',\n CORRECTED = 'CORRECTED',\n ERROR = 'ERROR',\n}\n\nexport enum EssayReviewStatus {\n PENDING = 'PENDING',\n APPROVED = 'APPROVED',\n MODIFIED = 'MODIFIED',\n}\n\nexport interface EssayHistoryItem {\n id: string;\n /** Título exibido. Se null/undefined, o componente cai no `fallbackTitle` */\n title: string | null;\n /** Título fallback (ex: título do tema) quando `title` está vazio */\n fallbackTitle?: string;\n status: EssayStatus;\n /** Nota total (0..maxScore). null quando ainda não pontuou */\n totalScore: number | null;\n /** Status da revisão do professor */\n reviewStatus?: EssayReviewStatus | null;\n}\n\nexport interface EssayHistoryData {\n /** Label da data do grupo (ex: \"12 Fev\") */\n date: string;\n essays: EssayHistoryItem[];\n}\n\ninterface CardEssayHistoryProps extends HTMLAttributes<HTMLDivElement> {\n data: EssayHistoryData[];\n /** Nota máxima pra compor o label \"X de {maxScore}\". Default: 1000 */\n maxScore?: number;\n /** Callback ao clicar num item clicável (CORRECTED com score, ou ERROR) */\n onEssayClick?: (essay: EssayHistoryItem) => void;\n}\n\ntype EssayVisualState = {\n background: string;\n text: string;\n clickable: boolean;\n};\n\nconst resolveEssayVisualState = (\n essay: EssayHistoryItem,\n maxScore: number\n): EssayVisualState => {\n // If essay has a score, show it (regardless of status - covers professor review cases)\n if (essay.totalScore != null) {\n return {\n background: 'bg-subject-12',\n text: `${essay.totalScore} de ${maxScore}`,\n clickable: true,\n };\n }\n if (essay.status === EssayStatus.ERROR) {\n return {\n background: 'bg-tertiary-100',\n text: 'Erro na correção',\n clickable: true,\n };\n }\n if (\n essay.status === EssayStatus.CORRECTING ||\n essay.status === EssayStatus.SUBMITTED\n ) {\n return {\n background: 'bg-secondary-200',\n text: 'Gerando resultado...',\n clickable: false,\n };\n }\n if (essay.status === EssayStatus.DRAFT) {\n return {\n background: 'bg-secondary-200',\n text: 'Rascunho',\n clickable: false,\n };\n }\n return {\n background: 'bg-secondary-200',\n text: 'Sem nota ainda',\n clickable: false,\n };\n};\n\ntype ReviewBadgeConfig = {\n label: string;\n action: 'success' | 'info';\n} | null;\n\nconst resolveReviewBadge = (essay: EssayHistoryItem): ReviewBadgeConfig => {\n if (\n essay.reviewStatus === EssayReviewStatus.APPROVED ||\n essay.reviewStatus === EssayReviewStatus.MODIFIED\n ) {\n return { label: 'Revisado', action: 'success' };\n }\n\n if (\n essay.status === EssayStatus.CORRECTED &&\n essay.reviewStatus === EssayReviewStatus.PENDING\n ) {\n return { label: 'Corrigido por IA', action: 'info' };\n }\n\n return null;\n};\n\nconst CardEssayHistory = forwardRef<HTMLDivElement, CardEssayHistoryProps>(\n ({ data, maxScore = 1000, onEssayClick, className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn('w-full max-w-248 bg-background rounded-3xl', className)}\n {...props}\n >\n <div className=\"flex flex-col\">\n {data.map((section, sectionIndex) => (\n <div\n key={`${section.date}-${sectionIndex}`}\n className=\"flex flex-row items-start px-4 py-6 gap-2 w-full\"\n >\n <Text\n size=\"xs\"\n weight=\"bold\"\n className=\"text-text-800 w-11 shrink-0 pt-3\"\n >\n {section.date}\n </Text>\n\n <div className=\"flex flex-col gap-2 flex-1 min-w-0\">\n {section.essays.map((essay) => {\n const visual = resolveEssayVisualState(essay, maxScore);\n const isClickable = visual.clickable && !!onEssayClick;\n const label =\n essay.title ?? essay.fallbackTitle ?? 'Sem título';\n const reviewBadge = resolveReviewBadge(essay);\n\n return (\n <button\n key={essay.id}\n type=\"button\"\n disabled={!isClickable}\n onClick={() => isClickable && onEssayClick?.(essay)}\n aria-label={`${label} — ${visual.text}`}\n className={cn(\n visual.background,\n 'rounded-xl p-4 flex flex-row items-center justify-between gap-2 w-full transition-shadow duration-200',\n isClickable\n ? 'cursor-pointer hover:shadow-soft-shadow-2'\n : 'cursor-default'\n )}\n >\n <Text\n size=\"md\"\n weight=\"bold\"\n className=\"text-text-950 truncate text-left\"\n >\n {label}\n </Text>\n\n <div className=\"flex items-center gap-2 shrink-0\">\n {reviewBadge && (\n <Badge\n variant=\"solid\"\n action={reviewBadge.action}\n size=\"small\"\n >\n {reviewBadge.label}\n </Badge>\n )}\n <Text\n size=\"sm\"\n className=\"text-text-800 whitespace-nowrap\"\n >\n {visual.text}\n </Text>\n {isClickable && (\n <CaretRightIcon\n size={20}\n className=\"text-text-800 shrink-0\"\n />\n )}\n </div>\n </button>\n );\n })}\n </div>\n </div>\n ))}\n </div>\n </div>\n );\n }\n);\n\n// ======================================================================\n// CardReadingFluency — card de atividade da variante Reading Fluency\n// ======================================================================\n\ntype CardReadingFluencyState = 'new' | 'coming-soon' | 'done';\n\ninterface CardReadingFluencyProps extends HTMLAttributes<HTMLDivElement> {\n /**\n * Estado do card:\n * - `new`: nova atividade (badge \"NOVA ATIVIDADE!\", clicável)\n * - `coming-soon`: em breve (opaco/desativado, borda tracejada, badge \"EM BREVE\")\n * - `done`: atividade concluída (check no canto, clicável)\n */\n state?: CardReadingFluencyState;\n /** Cor de fundo do card em hex (vinda do backend, igual aos subjects). */\n color?: string;\n /** Sobrescreve a imagem do passarinho (default: asset padrão do Reading Fluency). */\n image?: string;\n /** Texto alternativo/aria da imagem. */\n label?: string;\n /**\n * Legenda exibida abaixo do card (bold, xs, text-100). Omitida quando vazia.\n * Nome distinto de `title` para não colidir com o atributo HTML nativo\n * `title` (tooltip), que segue repassável via `...props`.\n */\n activityTitle?: string;\n}\n\n/**\n * Badge dos cards Reading Fluency. Dimensões e tipografia fixas da arte: 117×23,\n * radius 8px, px 8 / py 4, gap 8, texto Quicksand 700/12px. A cor de fundo\n * (preto com opacidade) varia por estado: 70% em \"nova atividade\", 30% em\n * \"em breve\".\n */\nconst PAPOLE_BADGE_CLASSES =\n 'flex items-center justify-center gap-2 w-[117px] h-[23px] rounded-lg px-2 py-1 text-[12px] font-bold text-white whitespace-nowrap';\n\nconst CardReadingFluency = forwardRef<HTMLDivElement, CardReadingFluencyProps>(\n (\n {\n state = 'new',\n // Scent color 2 (verde) do tema do aluno. Era o hex #a3d9b1 cravado, que\n // deixava o default do componente fora do tema.\n color = 'var(--color-scent-2)',\n image,\n label = 'Reading Fluency',\n activityTitle,\n className,\n onClick,\n onKeyDown,\n ...props\n },\n ref\n ) => {\n const isComingSoon = state === 'coming-soon';\n const isDone = state === 'done';\n const isInteractive = !isComingSoon;\n const isClickable = isInteractive && !!onClick;\n\n const handleKeyDown = (e: KeyboardEvent<HTMLDivElement>) => {\n if (isClickable && ['Enter', ' '].includes(e.key)) {\n e.preventDefault();\n (e.currentTarget as HTMLElement).click();\n }\n onKeyDown?.(e);\n };\n\n return (\n <div className=\"flex flex-col items-center gap-3\">\n <div\n ref={ref}\n className={cn(\n 'relative flex items-center justify-center w-[240px] h-[182px] rounded-2xl font-quicksand overflow-hidden',\n // Uma capa do banco preenche o card inteiro (full-bleed), então sem\n // padding. O asset padrão (passarinho) segue centralizado com respiro.\n image ? '' : 'px-[82px] py-[28px]',\n isClickable && 'cursor-pointer',\n isComingSoon &&\n 'pointer-events-none border-2 border-dashed border-border-300',\n className\n )}\n style={{ backgroundColor: color }}\n onClick={isInteractive ? onClick : undefined}\n onKeyDown={handleKeyDown}\n tabIndex={isClickable ? 0 : undefined}\n role={isClickable ? 'button' : undefined}\n aria-disabled={isComingSoon ? true : undefined}\n {...props}\n >\n <img\n src={image ?? readingFluencyBird}\n alt={label}\n draggable={false}\n className={cn(\n // Capa do banco de imagens: ocupa exatamente o tamanho do card\n // (240×182), recortando o excesso sem distorcer. O passarinho\n // padrão continua no tamanho original, centralizado.\n image\n ? 'absolute inset-0 w-full h-full object-cover select-none'\n : 'w-full h-auto select-none',\n isComingSoon && 'opacity-40'\n )}\n />\n\n {isDone && (\n <CheckCircleIcon\n weight=\"fill\"\n size={28}\n className=\"absolute top-3 right-3 text-background drop-shadow-sm\"\n data-testid=\"reading-fluency-check\"\n />\n )}\n\n {state === 'new' && (\n <span\n className={cn(\n 'absolute bottom-3 left-1/2 -translate-x-1/2 bg-black/70',\n PAPOLE_BADGE_CLASSES\n )}\n >\n NOVA ATIVIDADE!\n </span>\n )}\n\n {isComingSoon && (\n <span\n className={cn(\n 'absolute bottom-3 left-1/2 -translate-x-1/2 bg-black/30',\n PAPOLE_BADGE_CLASSES\n )}\n >\n EM BREVE\n </span>\n )}\n </div>\n\n {activityTitle && (\n <Text\n size=\"xs\"\n weight=\"bold\"\n color=\"text-text-100\"\n className=\"w-60 text-center font-quicksand uppercase\"\n >\n {activityTitle}\n </Text>\n )}\n </div>\n );\n }\n);\n\nexport {\n CardBase,\n CardActivitiesResults,\n CardQuestions,\n CardProgress,\n CardTopic,\n CardPerformance,\n CardResults,\n CardStatus,\n CardSettings,\n CardSupport,\n CardForum,\n CardAudio,\n CardSimulado,\n CardTest,\n CardSimulationHistory,\n CardEssayHistory,\n CardReadingFluency,\n};\n\nexport type { CardReadingFluencyProps, CardReadingFluencyState };\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-ZUPP7R2K.js","../src/hooks/useModalFocus.ts"],"names":[],"mappings":"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","file":"/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-ZUPP7R2K.js","sourcesContent":[null,"import { RefObject, useEffect } from 'react';\n\n/**\n * Elementos que entram no ciclo de Tab dentro do modal. O seletor já descarta\n * os desabilitados e quem tem `tabindex=\"-1\"`.\n */\nconst FOCUSABLE_SELECTOR = [\n 'a[href]',\n 'button:not([disabled])',\n 'input:not([disabled])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])',\n].join(',');\n\nconst getFocusableElements = (container: HTMLElement) =>\n Array.from(\n container.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR)\n ).filter((element) => element.getAttribute('aria-hidden') !== 'true');\n\n/**\n * Tags que não renderizam nada. Marcá-las como inertes não muda\n * comportamento nenhum, só sujaria o DOM de quem for inspecionar.\n */\nconst NON_RENDERED_TAGS = new Set([\n 'SCRIPT',\n 'STYLE',\n 'LINK',\n 'META',\n 'TEMPLATE',\n 'NOSCRIPT',\n 'TITLE',\n 'BASE',\n]);\n\ntype HiddenElement = {\n element: Element;\n previousAriaHidden: string | null;\n};\n\n/**\n * Tira do caminho tudo que não é o modal: sobe do diálogo até o `<body>` e, em\n * cada nível, marca os IRMÃOS do caminho com `inert` + `aria-hidden=\"true\"`.\n * Os ancestrais do diálogo nunca são marcados — fossem, o próprio modal (e o\n * backdrop, que precisa receber clique) iriam junto.\n *\n * `inert` tira do ciclo de Tab, do clique e da árvore de acessibilidade;\n * `aria-hidden` repete a última parte para os leitores de tela que ainda não\n * tratam `inert`. Juntos são o que faz a navegação ficar REALMENTE presa no\n * modal: o trap de Tab daqui só cobre o teclado, enquanto o cursor virtual do\n * VoiceOver (VO + setas) anda pelo DOM inteiro e ignora onde está o foco.\n * `aria-modal=\"true\"` sozinho não dá conta — é justamente o que o VoiceOver\n * costuma deixar passar.\n *\n * O que é montado DEPOIS da abertura não é marcado, de propósito: `Select`,\n * `DropdownMenu` e afins renderizam em portais no `document.body` e precisam\n * continuar utilizáveis dentro do modal (o trap de Tab também sai do caminho\n * nesse caso). Em troca, um portal que já estava aberto quando o modal abriu\n * fica inerte — o esperado, já que ele pertence à página de trás.\n *\n * @returns Função que devolve os atributos exatamente como estavam.\n */\nconst hideOutside = (container: HTMLElement) => {\n const hidden: HiddenElement[] = [];\n\n let node: HTMLElement | null = container;\n\n while (node && node !== document.body) {\n const parent: HTMLElement | null = node.parentElement;\n if (!parent) break;\n\n for (const sibling of Array.from(parent.children)) {\n if (sibling === node) continue;\n if (NON_RENDERED_TAGS.has(sibling.tagName)) continue;\n // Quem JÁ está inert foi marcado pela aplicação (ou por um modal de\n // baixo que ainda não fechou): não é nosso para mexer, e portanto nem\n // para devolver no fechamento.\n if (sibling.hasAttribute('inert')) continue;\n\n hidden.push({\n element: sibling,\n previousAriaHidden: sibling.getAttribute('aria-hidden'),\n });\n\n sibling.setAttribute('inert', '');\n sibling.setAttribute('aria-hidden', 'true');\n }\n\n node = parent;\n }\n\n return () => {\n for (const { element, previousAriaHidden } of hidden) {\n element.removeAttribute('inert');\n\n if (previousAriaHidden === null) {\n element.removeAttribute('aria-hidden');\n } else {\n element.setAttribute('aria-hidden', previousAriaHidden);\n }\n }\n };\n};\n\n/**\n * Pilha dos modais abertos, compartilhada por TODOS os modais da lib (mesma\n * ideia do contador do `useBodyScrollLock`).\n *\n * Só o modal do topo mantém o resto da página inerte. Sem isso, dois modais\n * irmãos abertos ao mesmo tempo marcariam um ao outro — cada um é \"o lado de\n * fora\" do outro — e a página inteira, modais inclusive, ficaria inerte.\n */\nconst openModals: HTMLElement[] = [];\nlet releaseInert: (() => void) | null = null;\n\n/**\n * Desfaz a marcação vigente e reaplica a partir do modal do topo. Chamado nas\n * duas pontas: ao abrir um modal (ele assume) e ao fechar (o de baixo retoma,\n * ou a página volta ao normal quando não sobra nenhum).\n */\nconst applyTopmostInert = () => {\n releaseInert?.();\n releaseInert = null;\n\n const topmost = openModals.at(-1);\n if (topmost) {\n releaseInert = hideOutside(topmost);\n }\n};\n\n/**\n * Dá conta do foco de um modal: leva o foco pra dentro quando ele abre, prende\n * a navegação lá dentro enquanto está aberto e devolve o foco pra quem o abriu\n * quando fecha.\n *\n * Os modais da lib usam `<dialog open>` em vez de `showModal()`, então o\n * navegador NÃO faz nada disso sozinho — não há top layer, e sem isto o leitor\n * de tela continua lendo a página atrás e o Tab escapa pro conteúdo que está\n * visualmente bloqueado pelo backdrop.\n *\n * O foco inicial vai pro próprio container (que precisa de `tabIndex={-1}`), e\n * não pro primeiro botão: como esses modais quase sempre são uma mensagem, cair\n * no \"Fechar modal\" faria o leitor anunciar só o botão e engolir o texto. No\n * container, ele anuncia título + papel de diálogo e o conteúdo fica legível a\n * partir do topo. Um `autoFocus` no conteúdo do modal tem prioridade e não é\n * sobrescrito.\n *\n * A navegação fica presa por duas vias complementares:\n *\n * 1. Tudo que está FORA do modal vira `inert` + `aria-hidden` (ver\n * `hideOutside`). É o que tranca também o cursor virtual do VoiceOver, e o\n * que impede o Tab de recomeçar do topo da página quando o foco cai no\n * `<body>` (um clique no backdrop, por exemplo).\n * 2. O Tab é interceptado nas bordas do ciclo, para fechar o anel em vez de\n * deixar o foco sair pela barra de endereços do navegador. Quando o foco\n * está num portal (Select, DropdownMenu e afins renderizam em\n * `document.body`, fora do container), o hook sai do caminho em vez de\n * arrastar o foco de volta.\n *\n * @param enabled - Liga o gerenciamento. Normalmente `isOpen`.\n * @param containerRef - Ref do elemento do diálogo.\n */\nexport const useModalFocus = (\n enabled: boolean,\n containerRef: RefObject<HTMLElement | null>\n) => {\n useEffect(() => {\n if (!enabled) return;\n\n const container = containerRef.current;\n if (!container) return;\n\n const activeOnOpen = document.activeElement as HTMLElement | null;\n\n // Se o foco JÁ está dentro do modal, quem mandou foi o consumidor (um\n // `autoFocus` num campo, por exemplo) e a escolha dele vale mais que o\n // padrão daqui. Nesse caso não há como saber quem abriu o modal, então\n // também não há o que devolver no fechamento.\n const focusWasOutside = !container.contains(activeOnOpen);\n const previouslyFocused = focusWasOutside ? activeOnOpen : null;\n\n // A ordem destes três passos importa, e cada um depende do anterior:\n //\n // 1. Guardar quem tinha o foco ACIMA, antes de qualquer `inert`. O\n // navegador desfoca na hora um elemento que vira inerte, então depois\n // disso `document.activeElement` já seria o `<body>` e não sobraria pra\n // quem devolver o foco no fechamento.\n // 2. Marcar a página, abaixo — é o que garante que este modal esteja fora\n // de qualquer região inerte. Um modal aberto sobre outro nasce DENTRO do\n // `inert` aplicado pelo de baixo; focá-lo antes desta linha não surtiria\n // efeito nenhum.\n // 3. Só então mover o foco.\n openModals.push(container);\n applyTopmostInert();\n\n if (focusWasOutside) {\n container.focus();\n }\n\n const handleKeyDown = (event: globalThis.KeyboardEvent) => {\n if (event.key !== 'Tab') return;\n\n const active = document.activeElement;\n if (!active || !container.contains(active)) return;\n\n const focusables = getFocusableElements(container);\n\n if (focusables.length === 0) {\n event.preventDefault();\n container.focus();\n return;\n }\n\n const first = focusables[0];\n // O guard de lista vazia acima garante que existe um último elemento;\n // `.at()` só não consegue expressar isso no tipo.\n const last = focusables.at(-1) as HTMLElement;\n\n if (event.shiftKey) {\n // O container entra no ciclo pra que voltar do topo caia no fim, em vez\n // de sair do modal.\n if (active === first || active === container) {\n event.preventDefault();\n last.focus();\n }\n return;\n }\n\n if (active === last) {\n event.preventDefault();\n first.focus();\n }\n };\n\n document.addEventListener('keydown', handleKeyDown, true);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown, true);\n\n // Devolver a página ANTES de devolver o foco: o gatilho que abriu o modal\n // mora lá fora, e `focus()` num elemento ainda inerte não faz nada.\n const index = openModals.indexOf(container);\n if (index !== -1) {\n openModals.splice(index, 1);\n }\n applyTopmostInert();\n\n // Só devolve o foco se quem abriu o modal ainda existe na página.\n if (previouslyFocused?.isConnected) {\n previouslyFocused.focus();\n }\n };\n }, [enabled, containerRef]);\n};\n"]}