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
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-XARMPXRN.js","../src/components/Chatbot/Chatbot.tsx","../src/components/Chatbot/ChatbotFab.tsx","../src/components/Chatbot/ChatbotPanel.tsx","../src/components/Chatbot/ChatbotMessageList.tsx","../src/components/Chatbot/ChatbotMessage.tsx","../src/components/Chatbot/ChatbotContentRenderer.tsx","../src/components/Chatbot/ChatbotTypingIndicator.tsx","../src/components/Chatbot/ChatbotInput.tsx","../src/components/Chatbot/ChatbotConversationList.tsx"],"names":["jsx","useRef"],"mappings":"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","file":"/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-XARMPXRN.js","sourcesContent":[null,"import { useEffect, useRef } from 'react';\nimport ChatbotFab from './ChatbotFab';\nimport ChatbotPanel from './ChatbotPanel';\nimport ChatbotMessageList from './ChatbotMessageList';\nimport ChatbotInput from './ChatbotInput';\nimport ChatbotConversationList from './ChatbotConversationList';\nimport { createUseChatbot } from '../../hooks/useChatbot';\nimport type {\n ChatbotApiClient,\n ChatbotCurrentContext,\n ChatbotUser,\n} from '../../types/chatbot';\n\n/**\n * Props for the root Chatbot component\n */\nexport interface ChatbotProps {\n /** API client that wraps REST calls — produced by the host app */\n apiClient: ChatbotApiClient;\n /** Authenticated user (used only for UI decoration today) */\n user: ChatbotUser;\n /** Optional context sent with every outgoing message */\n currentContext?: ChatbotCurrentContext;\n /** Extra tailwind classes on the FAB */\n fabClassName?: string;\n /** Extra tailwind classes on the panel */\n panelClassName?: string;\n}\n\n/**\n * Analytica student chatbot — floating assistant available in the\n * authenticated area. Composes the Fab + Panel and owns no state of its\n * own: the `useChatbot` hook (bound to the provided `apiClient`) keeps\n * everything in one place.\n *\n * Host apps should render this inside the layout so the FAB is reachable\n * from every page. `currentContext` is a hint (activityId, questionId,\n * lessonId) produced by the host to enrich the AI prompt — it flows\n * untouched to the backend.\n */\nexport default function Chatbot({\n apiClient,\n user,\n currentContext,\n fabClassName,\n panelClassName,\n}: Readonly<ChatbotProps>) {\n // Keep the latest apiClient in a ref — any `apiClient` prop swap (e.g.,\n // after re-auth with a new token-bound client) is seen by the hook on\n // its next call without tearing down internal state.\n const apiClientRef = useRef(apiClient);\n apiClientRef.current = apiClient;\n\n // Bind the factory exactly once, passing a getter so the hook resolves\n // `apiClientRef.current` fresh on every call instead of snapshotting\n // whatever client we saw on first mount.\n const boundHookRef = useRef<ReturnType<typeof createUseChatbot> | null>(null);\n boundHookRef.current ??= createUseChatbot(() => apiClientRef.current);\n const useBoundChatbot = boundHookRef.current;\n const {\n isOpen,\n isSending,\n isLoadingHistory,\n isLoadingMessages,\n errorMessage,\n conversations,\n activeConversationId,\n messages,\n togglePanel,\n closePanel,\n selectConversation,\n startNewConversation,\n sendMessage,\n deleteConversation,\n } = useBoundChatbot();\n\n const firstName = user.name?.trim().split(/\\s+/)[0];\n const emptyHint = firstName\n ? `Olá, ${firstName}! Como posso ajudar nos seus estudos?`\n : 'Comece a conversa enviando uma pergunta.';\n\n const handleSend = (text: string): void => {\n sendMessage(text, currentContext).catch(() => undefined);\n };\n\n const fabRef = useRef<HTMLButtonElement>(null);\n const wasOpenRef = useRef(false);\n\n /**\n * Returns focus to the FAB when the panel closes.\n *\n * The panel restores focus on its own (`useModalFocus` remembers whoever\n * opened it), but when that was the FAB the remembered node is gone — the FAB\n * is unmounted while the panel is open, and the hook only restores focus to an\n * element still on the page, so focus would be left on the `<body>`.\n *\n * The `<body>` guard keeps any other opener intact: if something else still\n * holds the focus the hook already handled it, and this effect stays out of\n * the way.\n */\n useEffect(() => {\n if (isOpen) {\n wasOpenRef.current = true;\n return;\n }\n\n if (!wasOpenRef.current) return;\n wasOpenRef.current = false;\n\n const active = document.activeElement;\n if (!active || active === document.body) {\n fabRef.current?.focus();\n }\n }, [isOpen]);\n\n return (\n <>\n {!isOpen && (\n <ChatbotFab\n ref={fabRef}\n onClick={togglePanel}\n isOpen={isOpen}\n className={fabClassName}\n />\n )}\n <ChatbotPanel\n isOpen={isOpen}\n onClose={closePanel}\n onStartNew={startNewConversation}\n className={panelClassName}\n errorMessage={errorMessage}\n historySlot={\n <ChatbotConversationList\n conversations={conversations}\n activeConversationId={activeConversationId}\n isLoading={isLoadingHistory}\n onSelect={selectConversation}\n onDelete={deleteConversation}\n onStartNew={startNewConversation}\n />\n }\n messagesSlot={\n <ChatbotMessageList\n messages={messages}\n isSending={isSending}\n isLoading={isLoadingMessages}\n emptyHint={emptyHint}\n />\n }\n inputSlot={<ChatbotInput onSend={handleSend} disabled={isSending} />}\n />\n </>\n );\n}\n","import { forwardRef } from 'react';\nimport { ChatCircleDotsIcon } from '@phosphor-icons/react';\nimport Button from '../Button/Button';\nimport Text from '../Text/Text';\nimport { cn } from '../../utils/utils';\n\n/**\n * Props for the floating action button that opens the chatbot panel\n */\nexport interface ChatbotFabProps {\n /** Click handler — opens or toggles the panel */\n onClick: () => void;\n /** Whether the panel is currently open (drives aria + styling) */\n isOpen?: boolean;\n /** Optional unread count badge */\n unreadCount?: number;\n /** Extra tailwind classes */\n className?: string;\n}\n\n/**\n * Circular floating action button anchored bottom-right of the viewport.\n * Uses `fixed` so it sits on top of page scroll.\n *\n * The ref lands on the `<button>`: the FAB is unmounted while the panel is\n * open, so `Chatbot` is the one that returns focus to it on close and needs to\n * reach the freshly remounted node.\n */\nconst ChatbotFab = forwardRef<HTMLButtonElement, ChatbotFabProps>(\n ({ onClick, isOpen = false, unreadCount = 0, className }, ref) => {\n const noun =\n unreadCount === 1 ? 'mensagem não lida' : 'mensagens não lidas';\n let badgeLabel: string;\n if (unreadCount > 9) {\n badgeLabel = 'Mais de 9 mensagens não lidas';\n } else {\n badgeLabel = `${unreadCount} ${noun}`;\n }\n\n const baseAriaLabel = isOpen\n ? 'Fechar assistente'\n : 'Abrir assistente de estudos';\n const ariaLabel =\n unreadCount > 0 ? `${baseAriaLabel} (${badgeLabel})` : baseAriaLabel;\n\n return (\n <Button\n ref={ref}\n variant=\"raw\"\n onClick={onClick}\n aria-label={ariaLabel}\n aria-expanded={isOpen}\n className={cn(\n 'fixed bottom-6 right-6 z-40',\n 'flex h-14 w-14 items-center justify-center rounded-full',\n 'bg-primary-500 text-white shadow-lg',\n 'transition-all hover:bg-primary-600 active:scale-95',\n 'focus:outline-none focus:ring-2 focus:ring-primary-300',\n className\n )}\n >\n <ChatCircleDotsIcon size={26} weight=\"fill\" />\n {unreadCount > 0 && (\n <Text\n as=\"span\"\n size=\"xs\"\n weight=\"bold\"\n color=\"text-white\"\n data-testid=\"chatbot-fab-badge\"\n aria-live=\"polite\"\n aria-label={badgeLabel}\n className=\"absolute -top-1 -right-1 flex h-5 min-w-5 items-center justify-center rounded-full bg-error-500 px-1\"\n >\n {unreadCount > 9 ? '9+' : unreadCount}\n </Text>\n )}\n </Button>\n );\n }\n);\n\nChatbotFab.displayName = 'ChatbotFab';\n\nexport default ChatbotFab;\n","import { useEffect, useRef, useState, type ReactNode } from 'react';\nimport {\n CaretUpIcon,\n ListIcon,\n MinusIcon,\n PlusIcon,\n RobotIcon,\n XIcon,\n} from '@phosphor-icons/react';\nimport Text from '../Text/Text';\nimport IconButton from '../IconButton/IconButton';\nimport { cn } from '../../utils/utils';\nimport { useModalFocus } from '../../hooks/useModalFocus';\nimport { useEscapeToClose } from '../../hooks/useEscapeToClose';\n\nconst HEADER_ICON_BUTTON_CLASSES =\n '!text-white hover:!bg-white/15 hover:!text-white focus-visible:!ring-white/60';\n\n/**\n * Props for the chatbot panel shell\n */\nexport interface ChatbotPanelProps {\n isOpen: boolean;\n onClose: () => void;\n onStartNew: () => void;\n /** Conversation list passed as a node so the panel stays layout-only */\n historySlot: ReactNode;\n /** Messages list passed as a node (allows easy swap during tests) */\n messagesSlot: ReactNode;\n /** Input area slot (auto-resize textarea + send button) */\n inputSlot: ReactNode;\n /** Optional error banner (string shown above the input) */\n errorMessage?: string | null;\n className?: string;\n}\n\n/**\n * Fixed drawer-like panel anchored to the bottom-right of the screen.\n * Splits into optional history sidebar + main conversation area. The\n * panel is purely presentational — state lives in the `useChatbot` hook.\n */\nexport default function ChatbotPanel({\n isOpen,\n onClose,\n onStartNew,\n historySlot,\n messagesSlot,\n inputSlot,\n errorMessage,\n className,\n}: Readonly<ChatbotPanelProps>) {\n const [showHistory, setShowHistory] = useState(false);\n const [isMinimized, setIsMinimized] = useState(false);\n const dialogRef = useRef<HTMLDialogElement>(null);\n const previousErrorRef = useRef<string | null | undefined>(errorMessage);\n\n // Reset the minimized state every time the panel is reopened so the\n // user always lands on the full conversation view.\n useEffect(() => {\n if (isOpen) {\n setIsMinimized(false);\n }\n }, [isOpen]);\n\n // Auto-expand on new errors so the role=\"alert\" banner is mounted and\n // announced by screen readers. Without this, a failed send while\n // minimized would be silent — the body (including the alert node) is\n // unmounted in the minimized state. Compare against the previous value\n // (not just truthy/falsy) so a distinct truthy error arriving after the\n // user minimized also re-expands and re-announces.\n useEffect(() => {\n const previous = previousErrorRef.current;\n if (errorMessage && errorMessage !== previous) {\n setIsMinimized(false);\n }\n previousErrorRef.current = errorMessage;\n }, [errorMessage]);\n\n /**\n * Foco e navegação pelos hooks compartilhados, os mesmos do `Modal` e do\n * `AlertDialog`: `useModalFocus` leva o foco pro diálogo ao abrir, prende Tab\n * e Shift+Tab lá dentro, torna o resto da página `inert` (um `<dialog open>`\n * sem `showModal()` não tem top layer, então nada impedia o cursor virtual do\n * leitor de tela de passear pela página atrás) e devolve o foco a quem abriu.\n *\n * `useEscapeToClose` respeita um Escape já tratado, então fechar um popover\n * de dentro do painel não fecha o painel junto.\n */\n useModalFocus(isOpen, dialogRef);\n useEscapeToClose(isOpen, onClose);\n\n if (!isOpen) return null;\n\n return (\n <dialog\n ref={dialogRef}\n open\n // Requisito do `useModalFocus`: o foco inicial vai pro próprio diálogo,\n // pro leitor anunciar \"Assistente de estudos, diálogo\" antes dos\n // controles do header.\n tabIndex={-1}\n // `open` sem `showModal()` não marca o diálogo como modal; quem prende a\n // navegação é o `inert` do hook, e este atributo é o que conta isso ao\n // leitor de tela. Mesmo par usado no `Modal` e no `AlertDialog`.\n aria-modal=\"true\"\n aria-label=\"Assistente de estudos\"\n // Height uses an inline style instead of a Tailwind arbitrary\n // class so host apps don't need to add an `@source` directive\n // for Tailwind v4 to pick up an otherwise uncommon utility.\n style={\n isMinimized ? undefined : { height: 'min(720px, calc(100vh - 3rem))' }\n }\n className={cn(\n // `<dialog open>` comes with `margin: auto` by default; `m-0`\n // resets that so the `fixed` positioning below pins the panel\n // to the bottom-right as intended. The panel sits at the same\n // bottom-right corner as the FAB (the FAB is hidden while the\n // panel is open to avoid stacking).\n 'fixed bottom-6 right-6 z-40 m-0',\n // Responsive sizing: fills small viewports without overflowing,\n // yet caps at the intended desktop footprint on larger screens.\n // The panel widens when the history sidebar is visible so the\n // main chat column keeps enough horizontal room for messages.\n 'flex w-[calc(100vw-3rem)] flex-col overflow-hidden rounded-2xl p-0',\n showHistory\n ? 'max-w-[620px] sm:max-w-[640px]'\n : 'max-w-[400px] sm:max-w-[420px]',\n 'border border-background-200 bg-background shadow-2xl',\n className\n )}\n >\n <div className=\"flex items-center justify-between gap-2 bg-primary-500 px-4 py-3 text-white\">\n <div className=\"flex min-w-0 items-center gap-3\">\n <div\n aria-hidden=\"true\"\n className=\"flex h-9 w-9 flex-shrink-0 items-center justify-center rounded-full bg-white/15 text-white\"\n >\n <RobotIcon size={20} weight=\"fill\" />\n </div>\n <div className=\"flex min-w-0 flex-col\">\n <Text\n size=\"md\"\n weight=\"semibold\"\n className=\"truncate leading-tight text-white\"\n >\n Assistente de estudos\n </Text>\n <Text size=\"2xs\" className=\"truncate leading-tight text-white/80\">\n Tire dúvidas enquanto estuda\n </Text>\n </div>\n </div>\n <div className=\"flex items-center gap-1\">\n {!isMinimized && (\n <>\n <IconButton\n size=\"sm\"\n aria-label={\n showHistory ? 'Ocultar histórico' : 'Mostrar histórico'\n }\n onClick={() => setShowHistory((v) => !v)}\n icon={<ListIcon size={18} />}\n className={HEADER_ICON_BUTTON_CLASSES}\n />\n <IconButton\n size=\"sm\"\n aria-label=\"Nova conversa\"\n onClick={onStartNew}\n icon={<PlusIcon size={18} />}\n className={HEADER_ICON_BUTTON_CLASSES}\n />\n </>\n )}\n <IconButton\n size=\"sm\"\n aria-label={\n isMinimized ? 'Expandir assistente' : 'Minimizar assistente'\n }\n aria-expanded={!isMinimized}\n onClick={() => setIsMinimized((v) => !v)}\n icon={\n isMinimized ? <CaretUpIcon size={18} /> : <MinusIcon size={18} />\n }\n className={HEADER_ICON_BUTTON_CLASSES}\n />\n <IconButton\n size=\"sm\"\n aria-label=\"Fechar assistente\"\n onClick={onClose}\n icon={<XIcon size={18} />}\n className={HEADER_ICON_BUTTON_CLASSES}\n />\n </div>\n </div>\n\n {!isMinimized && (\n <div className=\"flex flex-1 overflow-hidden border-t border-background-200\">\n {showHistory && (\n <div className=\"w-44 shrink-0 border-r border-background-200\">\n {historySlot}\n </div>\n )}\n <div className=\"flex flex-1 flex-col\">\n {messagesSlot}\n {errorMessage && (\n <div\n role=\"alert\"\n aria-live=\"assertive\"\n className=\"border-t border-error-200 bg-error-50 px-3 py-2\"\n >\n <Text size=\"xs\" className=\"text-error-700\">\n {errorMessage}\n </Text>\n </div>\n )}\n {inputSlot}\n </div>\n </div>\n )}\n </dialog>\n );\n}\n","import { useEffect, useRef } from 'react';\nimport Text from '../Text/Text';\nimport { cn } from '../../utils/utils';\nimport ChatbotMessage from './ChatbotMessage';\nimport ChatbotTypingIndicator from './ChatbotTypingIndicator';\nimport type { ChatbotMessage as ChatbotMessageType } from '../../types/chatbot';\n\n/**\n * Props for the scrollable list of messages\n */\nexport interface ChatbotMessageListProps {\n messages: ChatbotMessageType[];\n isSending?: boolean;\n isLoading?: boolean;\n emptyHint?: string;\n className?: string;\n}\n\n/**\n * Vertical list of messages with auto-scroll to bottom on new items.\n */\nexport default function ChatbotMessageList({\n messages,\n isSending = false,\n isLoading = false,\n emptyHint = 'Comece a conversa enviando uma pergunta.',\n className,\n}: Readonly<ChatbotMessageListProps>) {\n const bottomRef = useRef<HTMLDivElement>(null);\n const didMountRef = useRef(false);\n\n useEffect(() => {\n // Skip the scroll on initial render — otherwise scrollIntoView could\n // yank the page viewport before the panel is visible. Only auto-scroll\n // on subsequent updates (new message, typing indicator changes).\n if (!didMountRef.current) {\n didMountRef.current = true;\n return;\n }\n if (bottomRef.current) {\n bottomRef.current.scrollIntoView({ behavior: 'smooth', block: 'end' });\n }\n }, [messages.length, isSending]);\n\n const showEmpty = !isLoading && messages.length === 0 && !isSending;\n\n return (\n <div\n role=\"log\"\n aria-live=\"polite\"\n aria-relevant=\"additions\"\n className={cn(\n 'flex-1 overflow-y-auto p-4 space-y-3',\n 'bg-background-50',\n className\n )}\n >\n {showEmpty && (\n <div className=\"flex h-full items-center justify-center\">\n <Text size=\"sm\" className=\"text-center text-text-400\">\n {emptyHint}\n </Text>\n </div>\n )}\n {messages.map((msg) => (\n <ChatbotMessage key={msg.id} message={msg} />\n ))}\n {isSending && (\n <div className=\"flex justify-start\">\n <ChatbotTypingIndicator />\n </div>\n )}\n <div ref={bottomRef} />\n </div>\n );\n}\n","import { RobotIcon, UserIcon } from '@phosphor-icons/react';\nimport Text from '../Text/Text';\nimport { cn } from '../../utils/utils';\nimport ChatbotContentRenderer from './ChatbotContentRenderer';\nimport {\n CHATBOT_MESSAGE_ROLES,\n type ChatbotMessage as ChatbotMessageType,\n} from '../../types/chatbot';\n\n/**\n * Props for a single message bubble\n */\nexport interface ChatbotMessageProps {\n message: ChatbotMessageType;\n className?: string;\n /** Optional classes forwarded to the assistant markdown renderer. */\n contentClassName?: string;\n}\n\n/**\n * Format a timestamp using pt-BR locale (hour and minute only)\n */\nfunction formatTimestamp(value: Date | string): string {\n const date = value instanceof Date ? value : new Date(value);\n if (Number.isNaN(date.getTime())) return '';\n return date.toLocaleTimeString('pt-BR', {\n hour: '2-digit',\n minute: '2-digit',\n });\n}\n\n/**\n * Individual chat bubble. User messages are aligned to the right with a\n * primary background; assistant messages sit on the left in a neutral\n * background and pass through markdown / LaTeX renderers.\n */\nexport default function ChatbotMessage({\n message,\n className,\n contentClassName,\n}: Readonly<ChatbotMessageProps>) {\n const isUser = message.role === CHATBOT_MESSAGE_ROLES.USER;\n return (\n <div\n className={cn(\n 'flex w-full gap-2',\n isUser ? 'justify-end' : 'justify-start',\n className\n )}\n >\n {!isUser && (\n <div\n role=\"img\"\n aria-label=\"Mensagem do assistente\"\n className=\"flex h-8 w-8 flex-shrink-0 items-center justify-center rounded-full bg-primary-100 text-primary-600\"\n >\n <RobotIcon size={18} weight=\"fill\" aria-hidden=\"true\" />\n </div>\n )}\n <div\n className={cn(\n 'max-w-[80%] px-4 py-2',\n isUser\n ? 'rounded-2xl rounded-br-md bg-background-200 text-text-900'\n : 'rounded-2xl rounded-bl-md bg-background-100 text-text-900'\n )}\n >\n {isUser ? (\n <Text size=\"sm\" className=\"whitespace-pre-wrap break-words\">\n {message.content}\n </Text>\n ) : (\n <ChatbotContentRenderer\n content={message.content}\n className={contentClassName}\n />\n )}\n <Text size=\"2xs\" className=\"mt-1 block text-right text-text-700\">\n {formatTimestamp(message.createdAt)}\n </Text>\n </div>\n {isUser && (\n <div\n role=\"img\"\n aria-label=\"Sua mensagem\"\n className=\"flex h-8 w-8 flex-shrink-0 items-center justify-center rounded-full bg-primary-500 text-white\"\n >\n <UserIcon size={18} weight=\"fill\" aria-hidden=\"true\" />\n </div>\n )}\n </div>\n );\n}\n","import ReactMarkdown from 'react-markdown';\nimport remarkGfm from 'remark-gfm';\nimport HtmlMathRenderer from '../HtmlMathRenderer/HtmlMathRenderer';\nimport { containsMath } from '../HtmlMathRenderer/utils';\nimport { cn } from '../../utils/utils';\n\n/**\n * Props for the assistant content renderer\n */\nexport interface ChatbotContentRendererProps {\n content: string;\n className?: string;\n}\n\n/**\n * Unambiguous math detection: only treats content as math when there is a\n * `$$...$$` display block, an explicit LaTeX block\n * (`\\begin{...}...\\end{...}`), or an inline `$...$` whose inner content\n * contains an unmistakably mathematical character (backslash / caret /\n * underscore / curly brace). This avoids false positives on prose that\n * contains currency like \"R$ 20\" or \"por $20 e o livro $ 5\".\n *\n * Instead of `matchAll` with a lazy regex (which would greedily consume\n * adjacent `$`s left-to-right and could miss a valid formula following a\n * currency span on the same line, e.g. \"Preço R$ 20 e a fórmula $x^2+1$\"),\n * we collect every `$` index and probe all pairs — detection is O(N²) in\n * the worst case but N here is the count of `$` on a single line, so in\n * practice it remains linear on realistic input.\n */\nconst MATH_CHAR_PATTERN = /[\\\\^_{}]/;\n\n/**\n * Collect every unescaped `$` index in the content.\n */\nfunction collectDollarIndices(content: string): number[] {\n const result: number[] = [];\n for (let i = 0; i < content.length; i++) {\n if (content[i] === '$' && content[i - 1] !== '\\\\') {\n result.push(i);\n }\n }\n return result;\n}\n\n/**\n * Return true if any `$...$` pair spanning a single line contains a\n * math-only character.\n */\nfunction hasInlineMathSpan(content: string, indices: number[]): boolean {\n for (let i = 0; i < indices.length; i++) {\n for (let j = i + 1; j < indices.length; j++) {\n const inner = content.slice(indices[i] + 1, indices[j]);\n if (inner.includes('\\n')) break;\n if (MATH_CHAR_PATTERN.test(inner)) return true;\n }\n }\n return false;\n}\n\nfunction looksLikeMath(content: string): boolean {\n if (!containsMath(content)) return false;\n if (/\\$\\$[\\s\\S]+?\\$\\$/.test(content)) return true;\n if (/\\\\begin\\{[^}]+\\}[\\s\\S]+?\\\\end\\{[^}]+\\}/.test(content)) return true;\n return hasInlineMathSpan(content, collectDollarIndices(content));\n}\n\n/**\n * Renders a markdown string safely. When the content contains inline LaTeX\n * ($...$ or $$...$$) we fallback to `HtmlMathRenderer`, which already\n * supports math. For plain markdown we use `react-markdown` with GFM\n * (tables, task lists, strikethrough) and no raw HTML — escape by default.\n */\nexport default function ChatbotContentRenderer({\n content,\n className,\n}: Readonly<ChatbotContentRendererProps>) {\n if (looksLikeMath(content)) {\n return (\n <HtmlMathRenderer\n content={content}\n className={cn('whitespace-pre-wrap break-words', className)}\n />\n );\n }\n\n return (\n <div\n className={cn(\n 'prose prose-sm max-w-none break-words',\n // tighten prose defaults so the bubble feels compact\n '[&>*:first-child]:mt-0 [&>*:last-child]:mb-0',\n className\n )}\n >\n {/*\n SECURITY: do NOT add `rehype-raw` or any raw-HTML plugin to\n `rehypePlugins` here. Chatbot content is untrusted (LLM output) and\n must be escaped by react-markdown's default sanitization. Enabling\n raw HTML would reintroduce an XSS vector — any change requires an\n explicit security review and a dedicated sanitization pipeline.\n */}\n <ReactMarkdown remarkPlugins={[remarkGfm]}>{content}</ReactMarkdown>\n </div>\n );\n}\n","import Text from '../Text/Text';\nimport { cn } from '../../utils/utils';\n\n/**\n * Props for the typing indicator shown while the assistant is generating\n * a reply.\n */\nexport interface ChatbotTypingIndicatorProps {\n className?: string;\n}\n\n/**\n * Three animated dots signalling \"assistant is typing\".\n * Implemented in pure Tailwind — no additional dependencies.\n */\nexport default function ChatbotTypingIndicator({\n className,\n}: Readonly<ChatbotTypingIndicatorProps>) {\n return (\n <output\n aria-label=\"Assistente digitando\"\n className={cn(\n 'inline-flex items-center gap-1 rounded-2xl rounded-bl-md bg-background-100 px-4 py-3',\n className\n )}\n >\n <Text\n as=\"span\"\n className=\"h-2 w-2 animate-bounce rounded-full bg-text-400 [animation-delay:-0.3s]\"\n />\n <Text\n as=\"span\"\n className=\"h-2 w-2 animate-bounce rounded-full bg-text-400 [animation-delay:-0.15s]\"\n />\n <Text\n as=\"span\"\n className=\"h-2 w-2 animate-bounce rounded-full bg-text-400\"\n />\n </output>\n );\n}\n","import { useCallback, useState, type KeyboardEvent } from 'react';\nimport { PaperPlaneTiltIcon } from '@phosphor-icons/react';\nimport Button from '../Button/Button';\nimport TextArea from '../TextArea/TextArea';\nimport { cn } from '../../utils/utils';\n\nconst MIN_HEIGHT = 40;\nconst MAX_HEIGHT = 120;\n\n/**\n * Props for the chatbot text input\n */\nexport interface ChatbotInputProps {\n onSend: (text: string) => void;\n disabled?: boolean;\n placeholder?: string;\n className?: string;\n}\n\n/**\n * Auto-resizing textarea + send button. Enter sends, Shift+Enter creates a\n * new line, as is standard for chat UIs.\n *\n * Uses the library's `<TextArea>` component (design-system compliant)\n * with its built-in `autoResize` — no manual DOM height manipulation.\n */\nexport default function ChatbotInput({\n onSend,\n disabled = false,\n placeholder = 'Pergunte ao assistente...',\n className,\n}: Readonly<ChatbotInputProps>) {\n const [value, setValue] = useState('');\n\n const submit = useCallback(() => {\n const trimmed = value.trim();\n if (!trimmed || disabled) return;\n onSend(trimmed);\n setValue('');\n }, [disabled, onSend, value]);\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLTextAreaElement>) => {\n // Ignore Enter while an IME composition is in progress (e.g. typing\n // Japanese/Chinese), otherwise confirming the composition would\n // submit the message prematurely.\n if (e.nativeEvent.isComposing) return;\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n submit();\n }\n },\n [submit]\n );\n\n const isSendDisabled = disabled || value.trim().length === 0;\n\n return (\n <div\n className={cn(\n 'flex items-center gap-2 border-t border-background-200 bg-background p-3',\n className\n )}\n >\n {/* `TextArea` wraps its <textarea> in a flex column, so `flex-1`\n needs to live on this outer wrapper — passing it via\n `className` would only affect the inner element. */}\n <div className=\"flex-1 min-w-0\">\n <TextArea\n value={value}\n onChange={(e) => setValue(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n disabled={disabled}\n autoResize\n minHeight={MIN_HEIGHT}\n aria-label=\"Mensagem para o assistente\"\n className=\"w-full\"\n style={{ maxHeight: MAX_HEIGHT, overflowY: 'auto' }}\n />\n </div>\n {/* Use the library's `<Button>` with `variant=\"raw\"` (same pattern\n as `ChatbotFab`) so the send action goes through the shared\n component. `raw` keeps custom sizing/shape without inheriting\n the default solid/outline/link classes. */}\n <Button\n variant=\"raw\"\n type=\"button\"\n onClick={submit}\n disabled={isSendDisabled}\n aria-label=\"Enviar mensagem\"\n className={cn(\n 'flex h-10 w-10 flex-shrink-0 items-center justify-center rounded-full',\n 'bg-primary-500 text-white transition-colors',\n 'hover:bg-primary-600',\n 'disabled:bg-background-200 disabled:text-text-500 disabled:cursor-not-allowed',\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-primary-300'\n )}\n >\n <PaperPlaneTiltIcon size={20} weight=\"fill\" />\n </Button>\n </div>\n );\n}\n","import { TrashIcon, PlusIcon } from '@phosphor-icons/react';\nimport Text from '../Text/Text';\nimport Button from '../Button/Button';\nimport IconButton from '../IconButton/IconButton';\nimport EmptyState from '../EmptyState/EmptyState';\nimport { SkeletonText } from '../Skeleton/Skeleton';\nimport { cn } from '../../utils/utils';\nimport type { ChatbotConversation } from '../../types/chatbot';\n\n/**\n * Props for the list of past chatbot conversations\n */\nexport interface ChatbotConversationListProps {\n conversations: ChatbotConversation[];\n activeConversationId: string | null;\n isLoading?: boolean;\n onSelect: (id: string) => void;\n onDelete: (id: string) => void;\n onStartNew: () => void;\n className?: string;\n}\n\n/**\n * Format the conversation timestamp in pt-BR using the short day/month\n * form (e.g. \"17/04\"), which is enough to disambiguate conversations in\n * the sidebar without overflowing the row.\n */\nfunction formatDate(value: Date | string): string {\n const d = value instanceof Date ? value : new Date(value);\n if (Number.isNaN(d.getTime())) return '';\n return d.toLocaleDateString('pt-BR', {\n day: '2-digit',\n month: '2-digit',\n });\n}\n\n/**\n * Sidebar-like drawer listing the student's past conversations. Clicking\n * a row activates it; the trash icon calls `onDelete` — the actual\n * confirmation flow (modal, toast-undo, etc.) is delegated to the\n * consumer so behaviour can be customized per host app.\n */\nexport default function ChatbotConversationList({\n conversations,\n activeConversationId,\n isLoading = false,\n onSelect,\n onDelete,\n onStartNew,\n className,\n}: Readonly<ChatbotConversationListProps>) {\n return (\n <div\n className={cn(\n 'flex h-full flex-col border-r border-background-200 bg-background',\n className\n )}\n >\n <div className=\"p-3\">\n <Button\n variant=\"solid\"\n action=\"primary\"\n size=\"small\"\n onClick={onStartNew}\n iconLeft={<PlusIcon size={14} />}\n className=\"w-full\"\n >\n Nova conversa\n </Button>\n </div>\n\n <div className=\"flex-1 overflow-y-auto px-2 pb-2\">{renderBody()}</div>\n </div>\n );\n\n function renderBody() {\n if (isLoading) {\n return (\n <div className=\"space-y-2 px-2\">\n <SkeletonText />\n <SkeletonText />\n <SkeletonText />\n </div>\n );\n }\n\n if (conversations.length === 0) {\n return (\n <div className=\"mt-4\">\n <EmptyState\n title=\"Sem conversas ainda\"\n description=\"Comece sua primeira conversa com o assistente.\"\n />\n </div>\n );\n }\n\n return (\n <ul className=\"space-y-1\">\n {conversations.map((c) => {\n const isActive = c.id === activeConversationId;\n return (\n <li key={c.id}>\n <div\n className={cn(\n 'group flex items-start gap-2 rounded-md px-2 py-2 transition-colors',\n isActive ? 'bg-primary-50' : 'hover:bg-background-100'\n )}\n >\n <Button\n variant=\"raw\"\n onClick={() => onSelect(c.id)}\n className=\"flex-1 text-left\"\n >\n <Text\n size=\"sm\"\n weight=\"semibold\"\n className=\"truncate text-text-900\"\n >\n {c.title || 'Conversa sem título'}\n </Text>\n <Text size=\"2xs\" className=\"text-text-400\">\n {formatDate(c.lastMessageAt)}\n </Text>\n </Button>\n <IconButton\n size=\"sm\"\n aria-label={`Excluir conversa ${c.title || ''}`.trim()}\n onClick={() => onDelete(c.id)}\n icon={<TrashIcon size={14} />}\n />\n </div>\n </li>\n );\n })}\n </ul>\n );\n }\n}\n"]}
@@ -2,7 +2,7 @@
2
2
  import { lazy, Suspense, Component } from "react";
3
3
  import { jsx, jsxs } from "react/jsx-runtime";
4
4
  var RichEditorCore = lazy(
5
- () => import("./RichEditorCore-CCO3SSSU.mjs").then((module) => ({
5
+ () => import("./RichEditorCore-IF6JQHEO.mjs").then((module) => ({
6
6
  default: module.RichEditor
7
7
  }))
8
8
  );
@@ -90,4 +90,4 @@ function MissingDependenciesErrorFallback(error) {
90
90
  export {
91
91
  RichEditor
92
92
  };
93
- //# sourceMappingURL=chunk-MQEAEU6G.mjs.map
93
+ //# sourceMappingURL=chunk-XGMRYNER.mjs.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  DownloadButton_default
3
- } from "./chunk-4MURAKPC.mjs";
3
+ } from "./chunk-5DJVOLVX.mjs";
4
4
  import {
5
5
  UNMUTE_FALLBACK_VOLUME,
6
6
  useMediaVolumePreference
@@ -10,7 +10,7 @@ import {
10
10
  } from "./chunk-IG4GK7ME.mjs";
11
11
  import {
12
12
  IconButton_default
13
- } from "./chunk-LGQNMQOT.mjs";
13
+ } from "./chunk-ROS5XGTQ.mjs";
14
14
  import {
15
15
  Text_default
16
16
  } from "./chunk-IMCIR6TJ.mjs";
@@ -1018,4 +1018,4 @@ var VideoPlayer_default = VideoPlayer;
1018
1018
  export {
1019
1019
  VideoPlayer_default
1020
1020
  };
1021
- //# sourceMappingURL=chunk-MMQMVVD6.mjs.map
1021
+ //# sourceMappingURL=chunk-XLTD5J74.mjs.map
@@ -6,10 +6,10 @@ var _chunkQYQTHJC2js = require('./chunk-QYQTHJC2.js');
6
6
  var _chunkZPUXEJOQjs = require('./chunk-ZPUXEJOQ.js');
7
7
 
8
8
 
9
- var _chunk36XPNLGQjs = require('./chunk-36XPNLGQ.js');
9
+ var _chunkCW3FCWR4js = require('./chunk-CW3FCWR4.js');
10
10
 
11
11
 
12
- var _chunkRCNIBRZYjs = require('./chunk-RCNIBRZY.js');
12
+ var _chunk2VTJ2PKFjs = require('./chunk-2VTJ2PKF.js');
13
13
 
14
14
 
15
15
  var _chunkAN62GXF5js = require('./chunk-AN62GXF5.js');
@@ -18,7 +18,7 @@ var _chunkAN62GXF5js = require('./chunk-AN62GXF5.js');
18
18
  var _chunkVHS3DYH3js = require('./chunk-VHS3DYH3.js');
19
19
 
20
20
 
21
- var _chunkBVUPM6EYjs = require('./chunk-BVUPM6EY.js');
21
+ var _chunkCAQ2Q3ONjs = require('./chunk-CAQ2Q3ON.js');
22
22
 
23
23
 
24
24
 
@@ -29,7 +29,7 @@ var _chunkBVUPM6EYjs = require('./chunk-BVUPM6EY.js');
29
29
 
30
30
 
31
31
 
32
- var _chunk2TLSEAL2js = require('./chunk-2TLSEAL2.js');
32
+ var _chunkO4TRDWXJjs = require('./chunk-O4TRDWXJ.js');
33
33
 
34
34
 
35
35
  var _chunkANT66KVKjs = require('./chunk-ANT66KVK.js');
@@ -163,7 +163,7 @@ var AppHeader = ({
163
163
  }
164
164
  ),
165
165
  showCalendar && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "lg:hidden", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
166
- _chunkRCNIBRZYjs.CalendarCard_default,
166
+ _chunk2VTJ2PKFjs.CalendarCard_default,
167
167
  {
168
168
  content: calendarContent,
169
169
  isOpen: _nullishCoalesce(_nullishCoalesce(calendarOpen, () => ( activeStates.calendar)), () => ( false)),
@@ -171,7 +171,7 @@ var AppHeader = ({
171
171
  }
172
172
  ) }),
173
173
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
174
- _chunk36XPNLGQjs.NotificationCard_default,
174
+ _chunkCW3FCWR4js.NotificationCard_default,
175
175
  {
176
176
  mode: "center",
177
177
  isActive: activeStates.notifications,
@@ -214,7 +214,7 @@ var AppHeader = ({
214
214
  }
215
215
  ),
216
216
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
217
- _chunk2TLSEAL2js.DropdownMenu_default,
217
+ _chunkO4TRDWXJjs.DropdownMenu_default,
218
218
  {
219
219
  onOpenChange: (open) => {
220
220
  _chunkTN3AYOMVjs.syncDropdownState.call(void 0,
@@ -226,12 +226,12 @@ var AppHeader = ({
226
226
  },
227
227
  children: [
228
228
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
229
- _chunk2TLSEAL2js.DropdownMenuTrigger,
229
+ _chunkO4TRDWXJjs.DropdownMenuTrigger,
230
230
  {
231
231
  className: "text-primary cursor-pointer",
232
232
  asChild: true,
233
233
  children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
234
- _chunkBVUPM6EYjs.IconButton_default,
234
+ _chunkCAQ2Q3ONjs.IconButton_default,
235
235
  {
236
236
  active: activeStates.profile,
237
237
  "aria-label": "Perfil do usu\xE1rio",
@@ -248,7 +248,7 @@ var AppHeader = ({
248
248
  }
249
249
  ),
250
250
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
251
- _chunk2TLSEAL2js.DropdownMenuContent,
251
+ _chunkO4TRDWXJjs.DropdownMenuContent,
252
252
  {
253
253
  className: profileDropdownWidth,
254
254
  side: "bottom",
@@ -256,7 +256,7 @@ var AppHeader = ({
256
256
  align: "end",
257
257
  children: [
258
258
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
259
- _chunk2TLSEAL2js.ProfileMenuHeader,
259
+ _chunkO4TRDWXJjs.ProfileMenuHeader,
260
260
  {
261
261
  className: isMobile ? "min-w-0" : void 0,
262
262
  name: displayName,
@@ -265,16 +265,16 @@ var AppHeader = ({
265
265
  }
266
266
  ),
267
267
  showProfileInfo && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
268
- _chunk2TLSEAL2js.ProfileMenuInfo,
268
+ _chunkO4TRDWXJjs.ProfileMenuInfo,
269
269
  {
270
270
  schoolName: _nullishCoalesce(_optionalChain([sessionInfo, 'optionalAccess', _11 => _11.schoolName]), () => ( "")),
271
271
  classYearName: _nullishCoalesce(_optionalChain([sessionInfo, 'optionalAccess', _12 => _12.className]), () => ( "")),
272
272
  schoolYearName: _nullishCoalesce(_optionalChain([sessionInfo, 'optionalAccess', _13 => _13.schoolYearName]), () => ( ""))
273
273
  }
274
274
  ),
275
- /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunk2TLSEAL2js.ProfileMenuSection, { children: [
275
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkO4TRDWXJjs.ProfileMenuSection, { children: [
276
276
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
277
- _chunk2TLSEAL2js.DropdownMenuItem,
277
+ _chunkO4TRDWXJjs.DropdownMenuItem,
278
278
  {
279
279
  variant: "profile",
280
280
  iconLeft: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _User.UserIcon, {}),
@@ -283,9 +283,9 @@ var AppHeader = ({
283
283
  children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkANT66KVKjs.Text_default, { size: "md", color: "text-text-700", children: "Meus dados" })
284
284
  }
285
285
  ),
286
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2TLSEAL2js.ProfileToggleTheme, {})
286
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkO4TRDWXJjs.ProfileToggleTheme, {})
287
287
  ] }),
288
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2TLSEAL2js.ProfileMenuFooter, { onClick: onLogout })
288
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkO4TRDWXJjs.ProfileMenuFooter, { onClick: onLogout })
289
289
  ]
290
290
  }
291
291
  )
@@ -307,4 +307,4 @@ var AppHeader_default = AppHeader;
307
307
 
308
308
 
309
309
  exports.AppHeader = AppHeader; exports.AppHeader_default = AppHeader_default;
310
- //# sourceMappingURL=chunk-L3ST5GUJ.js.map
310
+ //# sourceMappingURL=chunk-XQUK7R7L.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-L3ST5GUJ.js","../src/components/AppHeader/AppHeader.tsx"],"names":[],"mappings":"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","file":"/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-L3ST5GUJ.js","sourcesContent":[null,"import type { ReactNode } from 'react';\nimport { useCallback, useEffect, useState } from 'react';\nimport { CaretRightIcon } from '@phosphor-icons/react/dist/csr/CaretRight';\nimport { UserIcon as UserPhosphorIcon } from '@phosphor-icons/react/dist/csr/User';\n\nimport { BrandingLogo } from '../BrandingLogo/BrandingLogo';\nimport CalendarCard from '../CalendarCard/CalendarCard';\nimport IconButton from '../IconButton/IconButton';\nimport DropdownMenu, {\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n ProfileMenuFooter,\n ProfileMenuHeader,\n ProfileMenuInfo,\n ProfileMenuSection,\n ProfileToggleTheme,\n} from '../DropdownMenu/DropdownMenu';\nimport NotificationCard, {\n type NotificationGroup,\n} from '../NotificationCard/NotificationCard';\nimport { PageContainer } from '../PageContainer/PageContainer';\nimport Text from '../Text/Text';\nimport { UserIcon } from '../UserIcon/UserIcon';\nimport { useMobile } from '../../hooks/useMobile';\nimport { syncDropdownState } from '../../utils/dropdown';\nimport {\n NotificationEntityType,\n NotificationEntityStatus,\n} from '../../types/notifications';\n\n/**\n * Subset of session info consumed by the application header.\n * Each property is optional so the consumer can pass whatever it has.\n */\nexport interface AppHeaderSessionInfo {\n userName?: string;\n email?: string;\n urlProfilePicture?: string;\n schoolName?: string;\n className?: string;\n schoolYearName?: string;\n}\n\n/**\n * Minimal user shape needed to fill the profile dropdown header.\n */\nexport interface AppHeaderUser {\n name?: string;\n email?: string;\n}\n\n/**\n * Tutorial action rendered as a pill button in the header (left of the\n * notifications bell). The consumer owns the click behavior (usually opening\n * the configured tutorial URL in a new tab).\n */\nexport interface AppHeaderTutorial {\n /** Show the tutorial button. */\n visible?: boolean;\n /** Button label. Defaults to \"Tutoriais\". */\n label?: string;\n /** Fired when the tutorial button is clicked. */\n onClick: () => void;\n}\n\n/**\n * Notifications data + callbacks the AppHeader forwards to NotificationCard.\n * Built by the consumer (usually via `createNotificationsHook(api)`).\n */\nexport interface AppHeaderNotifications {\n unreadCount: number;\n loading: boolean;\n error: string | null;\n groupedNotifications: NotificationGroup[];\n refreshNotifications: () => void;\n markAsRead: (id: string) => void;\n deleteNotification: (id: string) => void;\n fetchNotifications: () => void;\n fetchUnreadCount?: () => void;\n /**\n * Optional bulk action. When provided, the \"Marcar todas como lidas\" button\n * renders in the notification center; when omitted, it stays hidden, which is\n * the behaviour every consumer had before this prop existed.\n */\n markAllAsRead?: () => void;\n getActionLabel: (entityType?: NotificationEntityType) => string | undefined;\n}\n\nexport interface AppHeaderProps {\n /** Authenticated user (fallback when sessionInfo doesn't carry name/email). */\n user?: AppHeaderUser;\n /** Session metadata used to render profile name, email, photo and school info. */\n sessionInfo?: AppHeaderSessionInfo;\n /** Notifications wiring (state + callbacks). */\n notifications: AppHeaderNotifications;\n /** Tutorial pill button shown before the notifications bell. */\n tutorial?: AppHeaderTutorial;\n /** Show the calendar widget in the header. */\n showCalendar?: boolean;\n /** Content rendered inside the calendar (dropdown on tablet/desktop, modal on mobile). */\n calendarContent?: ReactNode;\n /**\n * Optional controlled open state for the calendar.\n * When provided, the consumer is the source of truth; useful for closing\n * the calendar programmatically (e.g. on route change).\n */\n calendarOpen?: boolean;\n /** Fired whenever the calendar open state changes. */\n onCalendarOpenChange?: (open: boolean) => void;\n /** Show school/class/year inside the profile dropdown. */\n showProfileInfo?: boolean;\n /** Optional fallback image for the notifications empty state. */\n emptyNotificationsImage?: string;\n /** Empty-state title for notifications dropdown. */\n emptyNotificationsTitle?: string;\n /** Empty-state description for notifications dropdown. */\n emptyNotificationsDescription?: string;\n /** Callback fired when the user activates logout. */\n onLogout: () => void;\n /** Callback fired when the user activates the \"My data\" menu item. */\n onNavigateToMyData: () => void;\n /** Callback fired when the user clicks on a notification with entity info. */\n onNavigateByNotification?: (\n entityType?: NotificationEntityType,\n entityId?: string,\n entityStatus?: NotificationEntityStatus | null,\n questionId?: string | null\n ) => void;\n /**\n * Tailwind class overriding the default `max-w-[1000px]` of the header\n * content (forwarded to the internal `PageContainer`'s `innerClassName`).\n * Pass e.g. `max-w-[1350px]` to align the header with a widened page\n * content. When omitted, the default `max-w-[1000px]` is kept, so other\n * consumers are unaffected.\n */\n contentMaxWidth?: string;\n}\n\nconst DEFAULT_EMPTY_TITLE = 'Nenhuma notificação no momento';\nconst DEFAULT_EMPTY_DESCRIPTION =\n 'Você está em dia com todas as novidades. Volte depois para conferir atualizações!';\n\n/**\n * Application header shared across the analytica frontends.\n *\n * Renders the institution logo, optional calendar dropdown (mobile/tablet),\n * notifications center and a profile menu. Width is constrained by\n * `<PageContainer>` so it always aligns with the rest of the page content.\n */\nexport const AppHeader = ({\n user,\n sessionInfo,\n notifications,\n tutorial,\n showCalendar = false,\n calendarContent,\n calendarOpen,\n onCalendarOpenChange,\n showProfileInfo = false,\n emptyNotificationsImage,\n emptyNotificationsTitle = DEFAULT_EMPTY_TITLE,\n emptyNotificationsDescription = DEFAULT_EMPTY_DESCRIPTION,\n onLogout,\n onNavigateToMyData,\n onNavigateByNotification,\n contentMaxWidth,\n}: AppHeaderProps) => {\n const { isMobile, isExtraSmallMobile } = useMobile();\n const [activeStates, setActiveStates] = useState<Record<string, boolean>>({});\n\n useEffect(() => {\n notifications.fetchUnreadCount?.();\n }, []);\n\n const toggleActive = (buttonId: string) => {\n setActiveStates((prev) => {\n if (prev[buttonId]) {\n return { ...prev, [buttonId]: false };\n }\n return {\n calendar: false,\n notifications: false,\n profile: false,\n [buttonId]: true,\n };\n });\n };\n\n // Stable callback so `DropdownMenu`'s `useEffect [open, onOpenChange]`\n // doesn't re-fire on every parent re-render, which would cascade into a\n // Maximum-update-depth loop (same root cause class as PR #435).\n const handleCalendarOpenChange = useCallback(\n (open: boolean) => {\n setActiveStates((prev) => {\n const current = prev.calendar ?? false;\n if (current === open) {\n return prev;\n }\n if (open) {\n return {\n calendar: true,\n notifications: false,\n profile: false,\n };\n }\n return { ...prev, calendar: false };\n });\n onCalendarOpenChange?.(open);\n },\n [onCalendarOpenChange]\n );\n\n useEffect(() => {\n const handleEscapeKey = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n setActiveStates({});\n }\n };\n document.addEventListener('keydown', handleEscapeKey);\n return () => document.removeEventListener('keydown', handleEscapeKey);\n }, []);\n\n const handleMyDataClick = () => {\n setActiveStates({});\n onNavigateToMyData();\n };\n\n const displayName = sessionInfo?.userName ?? user?.name ?? 'Usuário';\n const displayEmail = sessionInfo?.email ?? user?.email ?? '';\n\n const pickResponsiveClass = (\n extraSmall: string,\n mobile: string,\n desktop: string\n ): string => {\n if (isExtraSmallMobile) return extraSmall;\n if (isMobile) return mobile;\n return desktop;\n };\n // On mobile the menu is anchored to the right of the trigger, so a min-width\n // alone lets it overflow the left edge of narrow viewports. Cap it to the\n // viewport minus a 16px gutter on each side.\n const profileDropdownWidth = isMobile\n ? 'w-[calc(100vw-2rem)] max-w-[320px]'\n : 'min-w-[320px]';\n const sectionGap = pickResponsiveClass('gap-1', 'gap-2', 'gap-3');\n const logoHeight = pickResponsiveClass('h-6', 'h-8', 'h-10');\n const tutorialPadding = pickResponsiveClass(\n 'px-3 py-1.5 text-xs',\n 'px-3.5 py-2 text-sm',\n 'px-4 py-2 text-sm'\n );\n\n return (\n <header\n data-component=\"AppHeader\"\n className=\"bg-primary-800 w-full h-[70px] flex justify-center items-center\"\n >\n <PageContainer\n className=\"pb-0 justify-center\"\n innerClassName={contentMaxWidth}\n >\n <div className=\"w-full flex flex-row justify-between items-center gap-3\">\n {/* `min-w-0 shrink` lets the logo compress instead of overflowing:\n an <img> resolves `min-width:auto` to its intrinsic width, which\n would otherwise block flex-shrink and push the actions off-screen\n on narrow viewports. `object-left` keeps it left-aligned as it\n scales down. The actions never shrink. */}\n <BrandingLogo\n variant=\"main\"\n alt=\"Logo\"\n className={`${logoHeight} object-contain object-left min-w-0 shrink`}\n />\n <section\n className={`flex flex-row items-center shrink-0 ${sectionGap}`}\n >\n {tutorial?.visible && (\n <button\n type=\"button\"\n data-testid=\"app-header-tutorial\"\n onClick={tutorial.onClick}\n /* `primary` (não `text`) é o foreground de `primary-800` em\n todos os temas — os dois formam um par contrastante mesmo\n onde o dark inverte o header (paraiba/analytica). Usar\n `text-*` aqui inverteria com o modo enquanto o fundo do\n header não inverte, apagando o botão no dark. */\n className={`rounded-full border border-primary text-primary font-medium whitespace-nowrap cursor-pointer transition-colors hover:bg-primary-700 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary ${tutorialPadding}`}\n >\n {tutorial.label ?? 'Tutoriais'}\n </button>\n )}\n\n {showCalendar && (\n <div className=\"lg:hidden\">\n <CalendarCard\n content={calendarContent}\n isOpen={calendarOpen ?? activeStates.calendar ?? false}\n onOpenChange={handleCalendarOpenChange}\n />\n </div>\n )}\n\n <NotificationCard\n mode=\"center\"\n isActive={activeStates.notifications}\n onToggleActive={() => toggleActive('notifications')}\n onOpenChange={(open: boolean) => {\n syncDropdownState(\n open,\n activeStates.notifications,\n setActiveStates,\n 'notifications'\n );\n }}\n unreadCount={notifications.unreadCount}\n groupedNotifications={notifications.groupedNotifications}\n loading={notifications.loading}\n error={notifications.error}\n onRetry={notifications.refreshNotifications}\n onMarkAsReadById={notifications.markAsRead}\n onMarkAllAsRead={notifications.markAllAsRead}\n onDeleteById={notifications.deleteNotification}\n onNavigateById={(\n entityType,\n entityId,\n entityStatus,\n questionId\n ) => {\n if (entityType && entityId) {\n // Fecha o painel antes de navegar. Sem isso, quando o destino\n // é a própria página em que o usuário já está (ex.: ele\n // termina a atividade, cai no resultado, abre o sino e clica\n // em \"Ver resultado\" da notificação dessa mesma atividade),\n // o navigate para a rota atual não muda nada na tela, o\n // painel segue aberto e ele clica de novo — rage click\n // FRONTEND-ALUNO-WEB-F3, 91 ocorrências / 36 usuários em seis\n // semanas. Fechar o painel é o feedback visível que faltava,\n // e vale para qualquer destino.\n //\n // É um setState em handler de clique, não em render/efeito:\n // não reabre o loop do PR #435. E o onOpenChange que o\n // DropdownMenu dispara ao fechar vira no-op no\n // syncDropdownState, porque isActive já estará false.\n setActiveStates((prev) => ({\n ...prev,\n notifications: false,\n }));\n onNavigateByNotification?.(\n entityType,\n entityId,\n entityStatus,\n questionId\n );\n }\n }}\n getActionLabel={notifications.getActionLabel}\n onFetchNotifications={notifications.fetchNotifications}\n emptyStateImage={emptyNotificationsImage}\n emptyStateTitle={emptyNotificationsTitle}\n emptyStateDescription={emptyNotificationsDescription}\n />\n\n <DropdownMenu\n onOpenChange={(open: boolean) => {\n syncDropdownState(\n open,\n activeStates.profile,\n setActiveStates,\n 'profile'\n );\n }}\n >\n <DropdownMenuTrigger\n className=\"text-primary cursor-pointer\"\n asChild\n >\n <IconButton\n active={activeStates.profile}\n // O IconButton só tem ícone: sem rótulo próprio ele cai no\n // padrão \"Botão de ação\", que não diz o que abre.\n aria-label=\"Perfil do usuário\"\n onClick={() => toggleActive('profile')}\n icon={\n <UserIcon\n size={24}\n className={activeStates.profile ? 'opacity-80' : ''}\n />\n }\n />\n </DropdownMenuTrigger>\n <DropdownMenuContent\n className={profileDropdownWidth}\n side=\"bottom\"\n variant=\"profile\"\n align=\"end\"\n >\n <ProfileMenuHeader\n className={isMobile ? 'min-w-0' : undefined}\n name={displayName}\n email={displayEmail}\n photoUrl={sessionInfo?.urlProfilePicture}\n />\n\n {showProfileInfo && (\n <ProfileMenuInfo\n schoolName={sessionInfo?.schoolName ?? ''}\n classYearName={sessionInfo?.className ?? ''}\n schoolYearName={sessionInfo?.schoolYearName ?? ''}\n />\n )}\n\n <ProfileMenuSection>\n <DropdownMenuItem\n variant=\"profile\"\n iconLeft={<UserPhosphorIcon />}\n iconRight={<CaretRightIcon />}\n onClick={handleMyDataClick}\n >\n <Text size=\"md\" color=\"text-text-700\">\n Meus dados\n </Text>\n </DropdownMenuItem>\n\n <ProfileToggleTheme />\n </ProfileMenuSection>\n\n <ProfileMenuFooter onClick={onLogout} />\n </DropdownMenuContent>\n </DropdownMenu>\n </section>\n </div>\n </PageContainer>\n </header>\n );\n};\n\nexport default AppHeader;\n"]}
1
+ {"version":3,"sources":["/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-XQUK7R7L.js","../src/components/AppHeader/AppHeader.tsx"],"names":[],"mappings":"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","file":"/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-XQUK7R7L.js","sourcesContent":[null,"import type { ReactNode } from 'react';\nimport { useCallback, useEffect, useState } from 'react';\nimport { CaretRightIcon } from '@phosphor-icons/react/dist/csr/CaretRight';\nimport { UserIcon as UserPhosphorIcon } from '@phosphor-icons/react/dist/csr/User';\n\nimport { BrandingLogo } from '../BrandingLogo/BrandingLogo';\nimport CalendarCard from '../CalendarCard/CalendarCard';\nimport IconButton from '../IconButton/IconButton';\nimport DropdownMenu, {\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n ProfileMenuFooter,\n ProfileMenuHeader,\n ProfileMenuInfo,\n ProfileMenuSection,\n ProfileToggleTheme,\n} from '../DropdownMenu/DropdownMenu';\nimport NotificationCard, {\n type NotificationGroup,\n} from '../NotificationCard/NotificationCard';\nimport { PageContainer } from '../PageContainer/PageContainer';\nimport Text from '../Text/Text';\nimport { UserIcon } from '../UserIcon/UserIcon';\nimport { useMobile } from '../../hooks/useMobile';\nimport { syncDropdownState } from '../../utils/dropdown';\nimport {\n NotificationEntityType,\n NotificationEntityStatus,\n} from '../../types/notifications';\n\n/**\n * Subset of session info consumed by the application header.\n * Each property is optional so the consumer can pass whatever it has.\n */\nexport interface AppHeaderSessionInfo {\n userName?: string;\n email?: string;\n urlProfilePicture?: string;\n schoolName?: string;\n className?: string;\n schoolYearName?: string;\n}\n\n/**\n * Minimal user shape needed to fill the profile dropdown header.\n */\nexport interface AppHeaderUser {\n name?: string;\n email?: string;\n}\n\n/**\n * Tutorial action rendered as a pill button in the header (left of the\n * notifications bell). The consumer owns the click behavior (usually opening\n * the configured tutorial URL in a new tab).\n */\nexport interface AppHeaderTutorial {\n /** Show the tutorial button. */\n visible?: boolean;\n /** Button label. Defaults to \"Tutoriais\". */\n label?: string;\n /** Fired when the tutorial button is clicked. */\n onClick: () => void;\n}\n\n/**\n * Notifications data + callbacks the AppHeader forwards to NotificationCard.\n * Built by the consumer (usually via `createNotificationsHook(api)`).\n */\nexport interface AppHeaderNotifications {\n unreadCount: number;\n loading: boolean;\n error: string | null;\n groupedNotifications: NotificationGroup[];\n refreshNotifications: () => void;\n markAsRead: (id: string) => void;\n deleteNotification: (id: string) => void;\n fetchNotifications: () => void;\n fetchUnreadCount?: () => void;\n /**\n * Optional bulk action. When provided, the \"Marcar todas como lidas\" button\n * renders in the notification center; when omitted, it stays hidden, which is\n * the behaviour every consumer had before this prop existed.\n */\n markAllAsRead?: () => void;\n getActionLabel: (entityType?: NotificationEntityType) => string | undefined;\n}\n\nexport interface AppHeaderProps {\n /** Authenticated user (fallback when sessionInfo doesn't carry name/email). */\n user?: AppHeaderUser;\n /** Session metadata used to render profile name, email, photo and school info. */\n sessionInfo?: AppHeaderSessionInfo;\n /** Notifications wiring (state + callbacks). */\n notifications: AppHeaderNotifications;\n /** Tutorial pill button shown before the notifications bell. */\n tutorial?: AppHeaderTutorial;\n /** Show the calendar widget in the header. */\n showCalendar?: boolean;\n /** Content rendered inside the calendar (dropdown on tablet/desktop, modal on mobile). */\n calendarContent?: ReactNode;\n /**\n * Optional controlled open state for the calendar.\n * When provided, the consumer is the source of truth; useful for closing\n * the calendar programmatically (e.g. on route change).\n */\n calendarOpen?: boolean;\n /** Fired whenever the calendar open state changes. */\n onCalendarOpenChange?: (open: boolean) => void;\n /** Show school/class/year inside the profile dropdown. */\n showProfileInfo?: boolean;\n /** Optional fallback image for the notifications empty state. */\n emptyNotificationsImage?: string;\n /** Empty-state title for notifications dropdown. */\n emptyNotificationsTitle?: string;\n /** Empty-state description for notifications dropdown. */\n emptyNotificationsDescription?: string;\n /** Callback fired when the user activates logout. */\n onLogout: () => void;\n /** Callback fired when the user activates the \"My data\" menu item. */\n onNavigateToMyData: () => void;\n /** Callback fired when the user clicks on a notification with entity info. */\n onNavigateByNotification?: (\n entityType?: NotificationEntityType,\n entityId?: string,\n entityStatus?: NotificationEntityStatus | null,\n questionId?: string | null\n ) => void;\n /**\n * Tailwind class overriding the default `max-w-[1000px]` of the header\n * content (forwarded to the internal `PageContainer`'s `innerClassName`).\n * Pass e.g. `max-w-[1350px]` to align the header with a widened page\n * content. When omitted, the default `max-w-[1000px]` is kept, so other\n * consumers are unaffected.\n */\n contentMaxWidth?: string;\n}\n\nconst DEFAULT_EMPTY_TITLE = 'Nenhuma notificação no momento';\nconst DEFAULT_EMPTY_DESCRIPTION =\n 'Você está em dia com todas as novidades. Volte depois para conferir atualizações!';\n\n/**\n * Application header shared across the analytica frontends.\n *\n * Renders the institution logo, optional calendar dropdown (mobile/tablet),\n * notifications center and a profile menu. Width is constrained by\n * `<PageContainer>` so it always aligns with the rest of the page content.\n */\nexport const AppHeader = ({\n user,\n sessionInfo,\n notifications,\n tutorial,\n showCalendar = false,\n calendarContent,\n calendarOpen,\n onCalendarOpenChange,\n showProfileInfo = false,\n emptyNotificationsImage,\n emptyNotificationsTitle = DEFAULT_EMPTY_TITLE,\n emptyNotificationsDescription = DEFAULT_EMPTY_DESCRIPTION,\n onLogout,\n onNavigateToMyData,\n onNavigateByNotification,\n contentMaxWidth,\n}: AppHeaderProps) => {\n const { isMobile, isExtraSmallMobile } = useMobile();\n const [activeStates, setActiveStates] = useState<Record<string, boolean>>({});\n\n useEffect(() => {\n notifications.fetchUnreadCount?.();\n }, []);\n\n const toggleActive = (buttonId: string) => {\n setActiveStates((prev) => {\n if (prev[buttonId]) {\n return { ...prev, [buttonId]: false };\n }\n return {\n calendar: false,\n notifications: false,\n profile: false,\n [buttonId]: true,\n };\n });\n };\n\n // Stable callback so `DropdownMenu`'s `useEffect [open, onOpenChange]`\n // doesn't re-fire on every parent re-render, which would cascade into a\n // Maximum-update-depth loop (same root cause class as PR #435).\n const handleCalendarOpenChange = useCallback(\n (open: boolean) => {\n setActiveStates((prev) => {\n const current = prev.calendar ?? false;\n if (current === open) {\n return prev;\n }\n if (open) {\n return {\n calendar: true,\n notifications: false,\n profile: false,\n };\n }\n return { ...prev, calendar: false };\n });\n onCalendarOpenChange?.(open);\n },\n [onCalendarOpenChange]\n );\n\n useEffect(() => {\n const handleEscapeKey = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n setActiveStates({});\n }\n };\n document.addEventListener('keydown', handleEscapeKey);\n return () => document.removeEventListener('keydown', handleEscapeKey);\n }, []);\n\n const handleMyDataClick = () => {\n setActiveStates({});\n onNavigateToMyData();\n };\n\n const displayName = sessionInfo?.userName ?? user?.name ?? 'Usuário';\n const displayEmail = sessionInfo?.email ?? user?.email ?? '';\n\n const pickResponsiveClass = (\n extraSmall: string,\n mobile: string,\n desktop: string\n ): string => {\n if (isExtraSmallMobile) return extraSmall;\n if (isMobile) return mobile;\n return desktop;\n };\n // On mobile the menu is anchored to the right of the trigger, so a min-width\n // alone lets it overflow the left edge of narrow viewports. Cap it to the\n // viewport minus a 16px gutter on each side.\n const profileDropdownWidth = isMobile\n ? 'w-[calc(100vw-2rem)] max-w-[320px]'\n : 'min-w-[320px]';\n const sectionGap = pickResponsiveClass('gap-1', 'gap-2', 'gap-3');\n const logoHeight = pickResponsiveClass('h-6', 'h-8', 'h-10');\n const tutorialPadding = pickResponsiveClass(\n 'px-3 py-1.5 text-xs',\n 'px-3.5 py-2 text-sm',\n 'px-4 py-2 text-sm'\n );\n\n return (\n <header\n data-component=\"AppHeader\"\n className=\"bg-primary-800 w-full h-[70px] flex justify-center items-center\"\n >\n <PageContainer\n className=\"pb-0 justify-center\"\n innerClassName={contentMaxWidth}\n >\n <div className=\"w-full flex flex-row justify-between items-center gap-3\">\n {/* `min-w-0 shrink` lets the logo compress instead of overflowing:\n an <img> resolves `min-width:auto` to its intrinsic width, which\n would otherwise block flex-shrink and push the actions off-screen\n on narrow viewports. `object-left` keeps it left-aligned as it\n scales down. The actions never shrink. */}\n <BrandingLogo\n variant=\"main\"\n alt=\"Logo\"\n className={`${logoHeight} object-contain object-left min-w-0 shrink`}\n />\n <section\n className={`flex flex-row items-center shrink-0 ${sectionGap}`}\n >\n {tutorial?.visible && (\n <button\n type=\"button\"\n data-testid=\"app-header-tutorial\"\n onClick={tutorial.onClick}\n /* `primary` (não `text`) é o foreground de `primary-800` em\n todos os temas — os dois formam um par contrastante mesmo\n onde o dark inverte o header (paraiba/analytica). Usar\n `text-*` aqui inverteria com o modo enquanto o fundo do\n header não inverte, apagando o botão no dark. */\n className={`rounded-full border border-primary text-primary font-medium whitespace-nowrap cursor-pointer transition-colors hover:bg-primary-700 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary ${tutorialPadding}`}\n >\n {tutorial.label ?? 'Tutoriais'}\n </button>\n )}\n\n {showCalendar && (\n <div className=\"lg:hidden\">\n <CalendarCard\n content={calendarContent}\n isOpen={calendarOpen ?? activeStates.calendar ?? false}\n onOpenChange={handleCalendarOpenChange}\n />\n </div>\n )}\n\n <NotificationCard\n mode=\"center\"\n isActive={activeStates.notifications}\n onToggleActive={() => toggleActive('notifications')}\n onOpenChange={(open: boolean) => {\n syncDropdownState(\n open,\n activeStates.notifications,\n setActiveStates,\n 'notifications'\n );\n }}\n unreadCount={notifications.unreadCount}\n groupedNotifications={notifications.groupedNotifications}\n loading={notifications.loading}\n error={notifications.error}\n onRetry={notifications.refreshNotifications}\n onMarkAsReadById={notifications.markAsRead}\n onMarkAllAsRead={notifications.markAllAsRead}\n onDeleteById={notifications.deleteNotification}\n onNavigateById={(\n entityType,\n entityId,\n entityStatus,\n questionId\n ) => {\n if (entityType && entityId) {\n // Fecha o painel antes de navegar. Sem isso, quando o destino\n // é a própria página em que o usuário já está (ex.: ele\n // termina a atividade, cai no resultado, abre o sino e clica\n // em \"Ver resultado\" da notificação dessa mesma atividade),\n // o navigate para a rota atual não muda nada na tela, o\n // painel segue aberto e ele clica de novo — rage click\n // FRONTEND-ALUNO-WEB-F3, 91 ocorrências / 36 usuários em seis\n // semanas. Fechar o painel é o feedback visível que faltava,\n // e vale para qualquer destino.\n //\n // É um setState em handler de clique, não em render/efeito:\n // não reabre o loop do PR #435. E o onOpenChange que o\n // DropdownMenu dispara ao fechar vira no-op no\n // syncDropdownState, porque isActive já estará false.\n setActiveStates((prev) => ({\n ...prev,\n notifications: false,\n }));\n onNavigateByNotification?.(\n entityType,\n entityId,\n entityStatus,\n questionId\n );\n }\n }}\n getActionLabel={notifications.getActionLabel}\n onFetchNotifications={notifications.fetchNotifications}\n emptyStateImage={emptyNotificationsImage}\n emptyStateTitle={emptyNotificationsTitle}\n emptyStateDescription={emptyNotificationsDescription}\n />\n\n <DropdownMenu\n onOpenChange={(open: boolean) => {\n syncDropdownState(\n open,\n activeStates.profile,\n setActiveStates,\n 'profile'\n );\n }}\n >\n <DropdownMenuTrigger\n className=\"text-primary cursor-pointer\"\n asChild\n >\n <IconButton\n active={activeStates.profile}\n // O IconButton só tem ícone: sem rótulo próprio ele cai no\n // padrão \"Botão de ação\", que não diz o que abre.\n aria-label=\"Perfil do usuário\"\n onClick={() => toggleActive('profile')}\n icon={\n <UserIcon\n size={24}\n className={activeStates.profile ? 'opacity-80' : ''}\n />\n }\n />\n </DropdownMenuTrigger>\n <DropdownMenuContent\n className={profileDropdownWidth}\n side=\"bottom\"\n variant=\"profile\"\n align=\"end\"\n >\n <ProfileMenuHeader\n className={isMobile ? 'min-w-0' : undefined}\n name={displayName}\n email={displayEmail}\n photoUrl={sessionInfo?.urlProfilePicture}\n />\n\n {showProfileInfo && (\n <ProfileMenuInfo\n schoolName={sessionInfo?.schoolName ?? ''}\n classYearName={sessionInfo?.className ?? ''}\n schoolYearName={sessionInfo?.schoolYearName ?? ''}\n />\n )}\n\n <ProfileMenuSection>\n <DropdownMenuItem\n variant=\"profile\"\n iconLeft={<UserPhosphorIcon />}\n iconRight={<CaretRightIcon />}\n onClick={handleMyDataClick}\n >\n <Text size=\"md\" color=\"text-text-700\">\n Meus dados\n </Text>\n </DropdownMenuItem>\n\n <ProfileToggleTheme />\n </ProfileMenuSection>\n\n <ProfileMenuFooter onClick={onLogout} />\n </DropdownMenuContent>\n </DropdownMenu>\n </section>\n </div>\n </PageContainer>\n </header>\n );\n};\n\nexport default AppHeader;\n"]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  CardBase
3
- } from "./chunk-PP7SEERV.mjs";
3
+ } from "./chunk-DXYSEBK3.mjs";
4
4
  import {
5
5
  cn
6
6
  } from "./chunk-53ICLDGS.mjs";
@@ -123,4 +123,4 @@ CardAccordation.displayName = "CardAccordation";
123
123
  export {
124
124
  CardAccordation
125
125
  };
126
- //# sourceMappingURL=chunk-OMBUOOMD.mjs.map
126
+ //# sourceMappingURL=chunk-XYT542WD.mjs.map
@@ -3,7 +3,7 @@
3
3
  var _chunkK74NP7Q7js = require('./chunk-K74NP7Q7.js');
4
4
 
5
5
 
6
- var _chunkV2YHMPRRjs = require('./chunk-V2YHMPRR.js');
6
+ var _chunkKJHBQQYJjs = require('./chunk-KJHBQQYJ.js');
7
7
 
8
8
 
9
9
  var _chunk5DY2JMMJjs = require('./chunk-5DY2JMMJ.js');
@@ -1035,7 +1035,7 @@ function SimulatedStudentDetailsModal({
1035
1035
  ] });
1036
1036
  };
1037
1037
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1038
- _chunkV2YHMPRRjs.ReportDetailModal_default,
1038
+ _chunkKJHBQQYJjs.ReportDetailModal_default,
1039
1039
  {
1040
1040
  isOpen,
1041
1041
  onClose,
@@ -1950,4 +1950,4 @@ function useSimulatedPerformance({
1950
1950
 
1951
1951
 
1952
1952
  exports.GeneralOverviewSection = GeneralOverviewSection; exports.useGeneralOverview = useGeneralOverview; exports.ESSAY_AREA_ID = ESSAY_AREA_ID; exports.AreaKnowledgeSelector = AreaKnowledgeSelector; exports.SIMULATED_PERFORMANCE_TAG_CONFIG = SIMULATED_PERFORMANCE_TAG_CONFIG; exports.PerformanceBadgeAction = PerformanceBadgeAction; exports.PERFORMANCE_TAG_TO_BADGE_ACTION = PERFORMANCE_TAG_TO_BADGE_ACTION; exports.ReportSimulationType = ReportSimulationType; exports.isStudentSubjectsData = isStudentSubjectsData; exports.isStudentContentsData = isStudentContentsData; exports.simulationTypeToActivityFilters = simulationTypeToActivityFilters; exports.useSimulatedStudentDetails = useSimulatedStudentDetails; exports.SimulatedStudentDetailsModal = SimulatedStudentDetailsModal; exports.useSimulatedContents = useSimulatedContents; exports.isStudentsData = isStudentsData; exports.isClassesData = isClassesData; exports.isMunicipalitiesData = isMunicipalitiesData; exports.useSimulatedOverview = useSimulatedOverview; exports.useAggregatedOverview = useAggregatedOverview; exports.getAggregationTypeByProfile = getAggregationTypeByProfile; exports.shouldUseAggregatedOverview = shouldUseAggregatedOverview; exports.SimulatedViewTab = SimulatedViewTab; exports.useSimulatedPerformance = useSimulatedPerformance;
1953
- //# sourceMappingURL=chunk-IZNABVXE.js.map
1953
+ //# sourceMappingURL=chunk-Y4IGIWP4.js.map