analytica-frontend-lib 1.7.21 → 1.7.23

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 (384) hide show
  1. package/dist/AccessReportModal/index.js +3 -3
  2. package/dist/AccessReportModal/index.mjs +2 -2
  3. package/dist/ActivitiesHistory/index.js +49 -49
  4. package/dist/ActivitiesHistory/index.mjs +48 -48
  5. package/dist/ActivityCardQuestionBanks/index.js +49 -49
  6. package/dist/ActivityCardQuestionBanks/index.mjs +48 -48
  7. package/dist/ActivityCardQuestionPreview/index.js +49 -49
  8. package/dist/ActivityCardQuestionPreview/index.mjs +48 -48
  9. package/dist/ActivityCreate/ActivityCreateContent/index.js +49 -49
  10. package/dist/ActivityCreate/ActivityCreateContent/index.mjs +48 -48
  11. package/dist/ActivityCreate/index.js +49 -49
  12. package/dist/ActivityCreate/index.mjs +48 -48
  13. package/dist/ActivityDetails/index.js +49 -49
  14. package/dist/ActivityDetails/index.mjs +48 -48
  15. package/dist/ActivityFilters/index.js +49 -49
  16. package/dist/ActivityFilters/index.mjs +48 -48
  17. package/dist/ActivityPageLayout/index.js +49 -49
  18. package/dist/ActivityPageLayout/index.mjs +48 -48
  19. package/dist/ActivityPreview/index.js +49 -49
  20. package/dist/ActivityPreview/index.mjs +48 -48
  21. package/dist/AlertManager/index.js +49 -49
  22. package/dist/AlertManager/index.mjs +48 -48
  23. package/dist/AlertManagerView/index.js +3 -3
  24. package/dist/AlertManagerView/index.mjs +2 -2
  25. package/dist/AnnouncementModal/index.js +3 -3
  26. package/dist/AnnouncementModal/index.mjs +2 -2
  27. package/dist/AnnouncementsGate/index.js +4 -4
  28. package/dist/AnnouncementsGate/index.mjs +3 -3
  29. package/dist/AnswerKeyModal/index.js +3 -3
  30. package/dist/AnswerKeyModal/index.mjs +2 -2
  31. package/dist/AppHeader/index.js +6 -6
  32. package/dist/AppHeader/index.mjs +5 -5
  33. package/dist/CalendarCard/index.js +4 -4
  34. package/dist/CalendarCard/index.mjs +3 -3
  35. package/dist/Chat/index.js +3 -3
  36. package/dist/Chat/index.mjs +2 -2
  37. package/dist/CheckBox/index.d.ts.map +1 -1
  38. package/dist/CheckBox/index.js +2 -2
  39. package/dist/CheckBox/index.mjs +1 -1
  40. package/dist/CheckBoxGroup/index.js +49 -49
  41. package/dist/CheckBoxGroup/index.mjs +48 -48
  42. package/dist/ComparatorChart/ComparatorView/index.js +3 -3
  43. package/dist/ComparatorChart/ComparatorView/index.mjs +2 -2
  44. package/dist/CorrectActivityModal/index.js +7 -7
  45. package/dist/CorrectActivityModal/index.mjs +6 -6
  46. package/dist/DownloadButton/index.js +4 -4
  47. package/dist/DownloadButton/index.mjs +3 -3
  48. package/dist/DownloadModal/index.js +3 -3
  49. package/dist/DownloadModal/index.mjs +2 -2
  50. package/dist/DropdownMenu/index.js +3 -3
  51. package/dist/DropdownMenu/index.mjs +2 -2
  52. package/dist/EnemClassroomStartModal/index.d.ts.map +1 -1
  53. package/dist/EnemClassroomStartModal/index.js +7 -7
  54. package/dist/EnemClassroomStartModal/index.mjs +6 -6
  55. package/dist/EnemMoment/index.js +57 -57
  56. package/dist/EnemMoment/index.mjs +51 -51
  57. package/dist/EnemMomentStudentModal/index.js +50 -50
  58. package/dist/EnemMomentStudentModal/index.mjs +48 -48
  59. package/dist/ExamDetailsLayout/ExamDetailsPage/index.js +49 -49
  60. package/dist/ExamDetailsLayout/ExamDetailsPage/index.mjs +48 -48
  61. package/dist/ExamPageLayout/index.js +49 -49
  62. package/dist/ExamPageLayout/index.mjs +48 -48
  63. package/dist/Forum/index.js +5 -5
  64. package/dist/Forum/index.mjs +4 -4
  65. package/dist/KnowledgePerformanceCard/index.js +51 -51
  66. package/dist/KnowledgePerformanceCard/index.mjs +50 -50
  67. package/dist/LessonCardPreview/index.js +49 -49
  68. package/dist/LessonCardPreview/index.mjs +48 -48
  69. package/dist/LessonMediaSections/index.js +49 -49
  70. package/dist/LessonMediaSections/index.mjs +48 -48
  71. package/dist/LessonsCatalog/index.js +49 -49
  72. package/dist/LessonsCatalog/index.mjs +48 -48
  73. package/dist/Modal/index.d.ts.map +1 -1
  74. package/dist/Modal/index.js +2 -2
  75. package/dist/Modal/index.mjs +1 -1
  76. package/dist/MultiCheckSelect/index.js +5 -5
  77. package/dist/MultiCheckSelect/index.mjs +4 -4
  78. package/dist/MultiSearchSelect/index.js +3 -3
  79. package/dist/MultiSearchSelect/index.mjs +2 -2
  80. package/dist/MultipleChoice/index.js +3 -3
  81. package/dist/MultipleChoice/index.mjs +2 -2
  82. package/dist/NotificationCard/index.js +4 -4
  83. package/dist/NotificationCard/index.mjs +3 -3
  84. package/dist/PerformanceReportModal/index.js +3 -3
  85. package/dist/PerformanceReportModal/index.mjs +2 -2
  86. package/dist/PrintableUsersTable/index.js +49 -49
  87. package/dist/PrintableUsersTable/index.mjs +48 -48
  88. package/dist/ProgressModal/index.js +3 -3
  89. package/dist/ProgressModal/index.mjs +2 -2
  90. package/dist/QuestionsPerformanceCard/index.js +50 -50
  91. package/dist/QuestionsPerformanceCard/index.mjs +49 -49
  92. package/dist/Quiz/index.js +6 -6
  93. package/dist/Quiz/index.mjs +5 -5
  94. package/dist/RecommendedLessonCreate/index.js +49 -49
  95. package/dist/RecommendedLessonCreate/index.mjs +48 -48
  96. package/dist/RecommendedLessonDetails/index.js +7 -7
  97. package/dist/RecommendedLessonDetails/index.mjs +6 -6
  98. package/dist/RecommendedLessonsHistory/index.js +49 -49
  99. package/dist/RecommendedLessonsHistory/index.mjs +48 -48
  100. package/dist/ReportDetailModal/index.js +4 -4
  101. package/dist/ReportDetailModal/index.mjs +3 -3
  102. package/dist/RichEditor/index.js +5 -5
  103. package/dist/RichEditor/index.mjs +4 -4
  104. package/dist/{RichEditorCore-6MTYSSKS.mjs → RichEditorCore-2S5YUAOI.mjs} +5 -5
  105. package/dist/{RichEditorCore-KDARBEK4.js → RichEditorCore-N7A2445B.js} +16 -16
  106. package/dist/{RichEditorCore-KDARBEK4.js.map → RichEditorCore-N7A2445B.js.map} +1 -1
  107. package/dist/Search/index.js +4 -4
  108. package/dist/Search/index.mjs +3 -3
  109. package/dist/SendActivityModal/SendActivityModal.js +49 -49
  110. package/dist/SendActivityModal/SendActivityModal.mjs +48 -48
  111. package/dist/SendActivityModal/index.js +49 -49
  112. package/dist/SendActivityModal/index.mjs +48 -48
  113. package/dist/SendLessonModal/index.js +49 -49
  114. package/dist/SendLessonModal/index.mjs +48 -48
  115. package/dist/SimulatedPerformance/SimulatedPerformanceView/index.js +49 -49
  116. package/dist/SimulatedPerformance/SimulatedPerformanceView/index.mjs +48 -48
  117. package/dist/SimulatedPerformance/useSimulatedPerformance/index.js +5 -5
  118. package/dist/SimulatedPerformance/useSimulatedPerformance/index.mjs +4 -4
  119. package/dist/SimulatedStudentSimulationsModal/index.js +6 -6
  120. package/dist/SimulatedStudentSimulationsModal/index.mjs +5 -5
  121. package/dist/SimulationsPage/index.js +49 -49
  122. package/dist/SimulationsPage/index.mjs +48 -48
  123. package/dist/StudentLessonProgressModal/index.js +3 -3
  124. package/dist/StudentLessonProgressModal/index.mjs +2 -2
  125. package/dist/StudentPerformanceDetailsModal/index.js +5 -5
  126. package/dist/StudentPerformanceDetailsModal/index.mjs +4 -4
  127. package/dist/Support/TicketModal/index.js +3 -3
  128. package/dist/Support/TicketModal/index.mjs +2 -2
  129. package/dist/Support/index.js +4 -4
  130. package/dist/Support/index.mjs +3 -3
  131. package/dist/SupportChatComposer/index.js +3 -3
  132. package/dist/SupportChatComposer/index.mjs +2 -2
  133. package/dist/SupportChatEvent/index.js +3 -3
  134. package/dist/SupportChatEvent/index.mjs +2 -2
  135. package/dist/SupportChatMessage/index.js +3 -3
  136. package/dist/SupportChatMessage/index.mjs +2 -2
  137. package/dist/SupportChatWidget/index.js +3 -3
  138. package/dist/SupportChatWidget/index.mjs +2 -2
  139. package/dist/SupportConcludeModal/index.js +4 -4
  140. package/dist/SupportConcludeModal/index.mjs +3 -3
  141. package/dist/SupportConversationHeader/index.js +4 -4
  142. package/dist/SupportConversationHeader/index.mjs +3 -3
  143. package/dist/SupportConversationMessages/index.js +5 -5
  144. package/dist/SupportConversationMessages/index.mjs +4 -4
  145. package/dist/SupportTicketConversation/index.js +12 -12
  146. package/dist/SupportTicketConversation/index.mjs +11 -11
  147. package/dist/TableProvider/index.js +49 -49
  148. package/dist/TableProvider/index.mjs +48 -48
  149. package/dist/UnifiedDraftModelPage/index.js +49 -49
  150. package/dist/UnifiedDraftModelPage/index.mjs +48 -48
  151. package/dist/UnifiedHistoryPage/index.js +49 -49
  152. package/dist/UnifiedHistoryPage/index.mjs +48 -48
  153. package/dist/VideoPlayer/index.js +5 -5
  154. package/dist/VideoPlayer/index.mjs +4 -4
  155. package/dist/Whiteboard/index.js +3 -3
  156. package/dist/Whiteboard/index.mjs +2 -2
  157. package/dist/{chunk-B6QOBHZM.mjs → chunk-24BEZK43.mjs} +2 -2
  158. package/dist/{chunk-CYSODZGX.js → chunk-27Y6V3GM.js} +169 -66
  159. package/dist/chunk-27Y6V3GM.js.map +1 -0
  160. package/dist/{chunk-OQTXTDSK.mjs → chunk-2OJ3QSLU.mjs} +3 -3
  161. package/dist/{chunk-VDUO65VK.mjs → chunk-3EGJJDIM.mjs} +2 -2
  162. package/dist/{chunk-VDUO65VK.mjs.map → chunk-3EGJJDIM.mjs.map} +1 -1
  163. package/dist/{chunk-4OUBPEVS.mjs → chunk-3HKLGNUE.mjs} +3 -3
  164. package/dist/{chunk-YA7XLH7D.js → chunk-3MFACEZ2.js} +3 -3
  165. package/dist/{chunk-YA7XLH7D.js.map → chunk-3MFACEZ2.js.map} +1 -1
  166. package/dist/{chunk-IHBWJM4C.mjs → chunk-3Q7RJKUP.mjs} +2 -2
  167. package/dist/{chunk-PY6WD6SB.mjs → chunk-3WRB4WCD.mjs} +4 -4
  168. package/dist/{chunk-4RHCBMMP.js → chunk-46VHAL4S.js} +3 -3
  169. package/dist/{chunk-4RHCBMMP.js.map → chunk-46VHAL4S.js.map} +1 -1
  170. package/dist/{chunk-POT3ALY3.js → chunk-5DINXU6W.js} +1 -1
  171. package/dist/{chunk-POT3ALY3.js.map → chunk-5DINXU6W.js.map} +1 -1
  172. package/dist/{chunk-L52NFNFK.mjs → chunk-5VC4BK65.mjs} +3 -3
  173. package/dist/{chunk-B67RLIUM.js → chunk-72D7G6YQ.js} +3 -3
  174. package/dist/{chunk-B67RLIUM.js.map → chunk-72D7G6YQ.js.map} +1 -1
  175. package/dist/{chunk-C65DG2RI.mjs → chunk-7FSBWUOM.mjs} +2 -2
  176. package/dist/{chunk-QWMFWYII.js → chunk-7IZNLARX.js} +3 -3
  177. package/dist/{chunk-QWMFWYII.js.map → chunk-7IZNLARX.js.map} +1 -1
  178. package/dist/{chunk-ZCBT2BUZ.js → chunk-7RFHXFFV.js} +13 -13
  179. package/dist/{chunk-ZCBT2BUZ.js.map → chunk-7RFHXFFV.js.map} +1 -1
  180. package/dist/{chunk-EMWX6IKP.js → chunk-7VJP5D26.js} +13 -13
  181. package/dist/{chunk-EMWX6IKP.js.map → chunk-7VJP5D26.js.map} +1 -1
  182. package/dist/{chunk-HCQJR5CE.mjs → chunk-7ZWEBNFB.mjs} +2 -2
  183. package/dist/{chunk-3RHNJUXU.mjs → chunk-ACSEJOW6.mjs} +2 -2
  184. package/dist/{chunk-WQZHUW7C.mjs → chunk-ANFHLSDB.mjs} +3 -3
  185. package/dist/{chunk-H6NQOLQY.mjs → chunk-ANFLWCVD.mjs} +2 -2
  186. package/dist/{chunk-BKBDQXZX.js → chunk-AOYPUZRO.js} +3 -3
  187. package/dist/{chunk-BKBDQXZX.js.map → chunk-AOYPUZRO.js.map} +1 -1
  188. package/dist/{chunk-5WS6IENQ.mjs → chunk-AU2HLQDJ.mjs} +2 -2
  189. package/dist/{chunk-P6FX3NT6.mjs → chunk-AZGDHAP5.mjs} +2 -2
  190. package/dist/{chunk-NCGO7FPB.js → chunk-AZKNYREH.js} +8 -8
  191. package/dist/{chunk-NCGO7FPB.js.map → chunk-AZKNYREH.js.map} +1 -1
  192. package/dist/{chunk-R6MTPYYW.js → chunk-AZTBNERQ.js} +3 -3
  193. package/dist/{chunk-R6MTPYYW.js.map → chunk-AZTBNERQ.js.map} +1 -1
  194. package/dist/{chunk-NPB2JTYC.mjs → chunk-BO3QVQ37.mjs} +4 -4
  195. package/dist/{chunk-2WI4Q2I2.mjs → chunk-BPMWRFSI.mjs} +4 -4
  196. package/dist/{chunk-TEW33GLR.mjs → chunk-BXN3VO6I.mjs} +2 -2
  197. package/dist/{chunk-7ZB3YHF2.mjs → chunk-C6LC5LD5.mjs} +1 -1
  198. package/dist/{chunk-7ZB3YHF2.mjs.map → chunk-C6LC5LD5.mjs.map} +1 -1
  199. package/dist/{chunk-5HONWYQA.js → chunk-C7ILTLT5.js} +3 -3
  200. package/dist/{chunk-5HONWYQA.js.map → chunk-C7ILTLT5.js.map} +1 -1
  201. package/dist/{chunk-OES54VU6.mjs → chunk-CFV2OZ3P.mjs} +116 -13
  202. package/dist/chunk-CFV2OZ3P.mjs.map +1 -0
  203. package/dist/{chunk-4OVIHZ3I.js → chunk-CGXWWPEA.js} +6 -6
  204. package/dist/{chunk-4OVIHZ3I.js.map → chunk-CGXWWPEA.js.map} +1 -1
  205. package/dist/{chunk-MNU45FM3.js → chunk-COT4KW3H.js} +2 -2
  206. package/dist/{chunk-MNU45FM3.js.map → chunk-COT4KW3H.js.map} +1 -1
  207. package/dist/{chunk-JDQUXG75.js → chunk-CVDNCU6L.js} +3 -3
  208. package/dist/{chunk-JDQUXG75.js.map → chunk-CVDNCU6L.js.map} +1 -1
  209. package/dist/{chunk-HBZHWSMZ.mjs → chunk-D46PJSQ7.mjs} +13 -13
  210. package/dist/{chunk-ARYIJ4RU.js → chunk-DDORKDQO.js} +3 -3
  211. package/dist/{chunk-ARYIJ4RU.js.map → chunk-DDORKDQO.js.map} +1 -1
  212. package/dist/{chunk-7YQTDJFA.js → chunk-DKXSR2V3.js} +3 -3
  213. package/dist/{chunk-7YQTDJFA.js.map → chunk-DKXSR2V3.js.map} +1 -1
  214. package/dist/{chunk-I6EAPPBL.mjs → chunk-DZMYIOKZ.mjs} +5 -5
  215. package/dist/{chunk-SKM7NFPY.js → chunk-EPXAFJVW.js} +6 -6
  216. package/dist/{chunk-SKM7NFPY.js.map → chunk-EPXAFJVW.js.map} +1 -1
  217. package/dist/{chunk-AYYMS23L.js → chunk-ESIQ2GB4.js} +7 -7
  218. package/dist/{chunk-AYYMS23L.js.map → chunk-ESIQ2GB4.js.map} +1 -1
  219. package/dist/{chunk-NU2WNYOD.js → chunk-EW7HGUFV.js} +87 -87
  220. package/dist/{chunk-NU2WNYOD.js.map → chunk-EW7HGUFV.js.map} +1 -1
  221. package/dist/{chunk-I4QGQMXI.mjs → chunk-EXYXZFNK.mjs} +2 -2
  222. package/dist/{chunk-RBJAO57A.js → chunk-FAAR4XC5.js} +3 -3
  223. package/dist/{chunk-RBJAO57A.js.map → chunk-FAAR4XC5.js.map} +1 -1
  224. package/dist/{chunk-N2VNE3ON.js → chunk-FDTDJDZI.js} +13 -13
  225. package/dist/{chunk-N2VNE3ON.js.map → chunk-FDTDJDZI.js.map} +1 -1
  226. package/dist/{chunk-SU5Q64TW.mjs → chunk-FVCTKS33.mjs} +6 -5
  227. package/dist/chunk-FVCTKS33.mjs.map +1 -0
  228. package/dist/{chunk-AVHZHWI3.js → chunk-GBIFSFWJ.js} +15 -15
  229. package/dist/{chunk-AVHZHWI3.js.map → chunk-GBIFSFWJ.js.map} +1 -1
  230. package/dist/{chunk-KSUPPAKH.js → chunk-GIQSHTB5.js} +9 -9
  231. package/dist/{chunk-KSUPPAKH.js.map → chunk-GIQSHTB5.js.map} +1 -1
  232. package/dist/{chunk-4QBKD4JN.js → chunk-GUUJYGXF.js} +3 -3
  233. package/dist/{chunk-4QBKD4JN.js.map → chunk-GUUJYGXF.js.map} +1 -1
  234. package/dist/{chunk-M4O46VDY.mjs → chunk-GX2PKLN2.mjs} +2 -2
  235. package/dist/{chunk-5BUTINIM.mjs → chunk-HLVLSWKD.mjs} +3 -3
  236. package/dist/{chunk-FU23WOTY.js → chunk-HSV5VZ4Z.js} +6 -6
  237. package/dist/{chunk-FU23WOTY.js.map → chunk-HSV5VZ4Z.js.map} +1 -1
  238. package/dist/{chunk-MMS2ELDK.mjs → chunk-IIQCS3A2.mjs} +2 -2
  239. package/dist/{chunk-NKWLCZUZ.mjs → chunk-JGGUMHM6.mjs} +2 -2
  240. package/dist/{chunk-HT2GREFH.js → chunk-JLD46DL7.js} +11 -11
  241. package/dist/{chunk-HT2GREFH.js.map → chunk-JLD46DL7.js.map} +1 -1
  242. package/dist/{chunk-NVL5TKWD.mjs → chunk-JYFLOQYT.mjs} +2 -2
  243. package/dist/{chunk-DWGDEUEW.mjs → chunk-KG563P7F.mjs} +5 -5
  244. package/dist/{chunk-TCIC5556.mjs → chunk-KH4TEDGD.mjs} +2 -2
  245. package/dist/{chunk-23PAYKWB.js → chunk-KM27ZDHZ.js} +2 -2
  246. package/dist/{chunk-23PAYKWB.js.map → chunk-KM27ZDHZ.js.map} +1 -1
  247. package/dist/{chunk-XZUMD3CB.mjs → chunk-LODDYDTP.mjs} +2 -2
  248. package/dist/{chunk-XZUMD3CB.mjs.map → chunk-LODDYDTP.mjs.map} +1 -1
  249. package/dist/{chunk-E6CGJBID.mjs → chunk-LUHKMY56.mjs} +2 -2
  250. package/dist/{chunk-TVLEUNKE.mjs → chunk-LZP5VZCO.mjs} +2 -2
  251. package/dist/{chunk-EHNEBXS7.mjs → chunk-M6DXZ2FM.mjs} +2 -2
  252. package/dist/{chunk-B4C5DWAP.mjs → chunk-MMMJDO75.mjs} +2 -2
  253. package/dist/{chunk-AFCWMJQO.js → chunk-MOUPNP53.js} +3 -3
  254. package/dist/{chunk-AFCWMJQO.js.map → chunk-MOUPNP53.js.map} +1 -1
  255. package/dist/{chunk-36KFIZ43.js → chunk-MYPUZ6EG.js} +3 -3
  256. package/dist/{chunk-36KFIZ43.js.map → chunk-MYPUZ6EG.js.map} +1 -1
  257. package/dist/{chunk-6JHIKIPA.js → chunk-NUGLTWEA.js} +23 -23
  258. package/dist/{chunk-6JHIKIPA.js.map → chunk-NUGLTWEA.js.map} +1 -1
  259. package/dist/{chunk-KWXOYHYK.mjs → chunk-P7MORXSE.mjs} +2 -2
  260. package/dist/{chunk-YG4IZ5Q3.mjs → chunk-Q2OSEROT.mjs} +2 -2
  261. package/dist/{chunk-L5SXG6T6.mjs → chunk-QQKOHKO2.mjs} +3 -3
  262. package/dist/{chunk-SADSJ2MV.js → chunk-QVGUYPXO.js} +3 -3
  263. package/dist/{chunk-SADSJ2MV.js.map → chunk-QVGUYPXO.js.map} +1 -1
  264. package/dist/{chunk-K45PTE7F.mjs → chunk-RBKQXT73.mjs} +4 -4
  265. package/dist/{chunk-JZFISWTP.js → chunk-RIN2IN7E.js} +2 -2
  266. package/dist/{chunk-JZFISWTP.js.map → chunk-RIN2IN7E.js.map} +1 -1
  267. package/dist/{chunk-BXLAOYAG.mjs → chunk-RIUVPTG7.mjs} +2 -2
  268. package/dist/{chunk-QVB54LBS.mjs → chunk-RNZGX6MX.mjs} +3 -3
  269. package/dist/{chunk-VSVLIRO2.js → chunk-RXEU77VN.js} +15 -15
  270. package/dist/{chunk-VSVLIRO2.js.map → chunk-RXEU77VN.js.map} +1 -1
  271. package/dist/{chunk-ZRIYCU2V.js → chunk-S2BZPPAI.js} +5 -5
  272. package/dist/{chunk-ZRIYCU2V.js.map → chunk-S2BZPPAI.js.map} +1 -1
  273. package/dist/{chunk-MES2BP4T.mjs → chunk-SGL5IUCV.mjs} +2 -2
  274. package/dist/{chunk-7LS5UQCQ.mjs → chunk-STKUPDHG.mjs} +2 -2
  275. package/dist/{chunk-PPYCCT2K.js → chunk-SWDVSCQJ.js} +9 -8
  276. package/dist/chunk-SWDVSCQJ.js.map +1 -0
  277. package/dist/{chunk-JCA76TCX.mjs → chunk-SZKLJOTN.mjs} +2 -2
  278. package/dist/{chunk-F5WR6XZZ.js → chunk-T73HPYF2.js} +3 -3
  279. package/dist/{chunk-F5WR6XZZ.js.map → chunk-T73HPYF2.js.map} +1 -1
  280. package/dist/{chunk-ZB6HDDE4.js → chunk-TQO37PVW.js} +14 -14
  281. package/dist/{chunk-ZB6HDDE4.js.map → chunk-TQO37PVW.js.map} +1 -1
  282. package/dist/{chunk-VKQ5AJDT.mjs → chunk-UENZQF2Y.mjs} +2 -2
  283. package/dist/{chunk-DCG7EUBC.js → chunk-UWLW5YVB.js} +6 -6
  284. package/dist/{chunk-DCG7EUBC.js.map → chunk-UWLW5YVB.js.map} +1 -1
  285. package/dist/{chunk-37AJ2GVO.mjs → chunk-UXJIZDXQ.mjs} +2 -2
  286. package/dist/{chunk-PLLPFCN3.js → chunk-UXMDPRAI.js} +14 -14
  287. package/dist/{chunk-PLLPFCN3.js.map → chunk-UXMDPRAI.js.map} +1 -1
  288. package/dist/{chunk-7BOTKRY6.mjs → chunk-V55DG5B4.mjs} +2 -2
  289. package/dist/{chunk-YRTIDZTN.js → chunk-VHEDMUAW.js} +4 -4
  290. package/dist/{chunk-YRTIDZTN.js.map → chunk-VHEDMUAW.js.map} +1 -1
  291. package/dist/{chunk-4RD55E4R.js → chunk-VWLWSO4J.js} +3 -3
  292. package/dist/{chunk-4RD55E4R.js.map → chunk-VWLWSO4J.js.map} +1 -1
  293. package/dist/{chunk-VJQIKFMG.mjs → chunk-W3CWEZDB.mjs} +3 -3
  294. package/dist/{chunk-JM6SLU7D.js → chunk-W7NNH4VY.js} +6 -6
  295. package/dist/{chunk-JM6SLU7D.js.map → chunk-W7NNH4VY.js.map} +1 -1
  296. package/dist/{chunk-VQ7MSYIH.js → chunk-WUN5NHZE.js} +4 -4
  297. package/dist/{chunk-VQ7MSYIH.js.map → chunk-WUN5NHZE.js.map} +1 -1
  298. package/dist/{chunk-AAU7ABJN.js → chunk-WWTRSQ3X.js} +3 -3
  299. package/dist/{chunk-AAU7ABJN.js.map → chunk-WWTRSQ3X.js.map} +1 -1
  300. package/dist/{chunk-BR6D2TGF.js → chunk-WZOA2PVJ.js} +3 -3
  301. package/dist/{chunk-BR6D2TGF.js.map → chunk-WZOA2PVJ.js.map} +1 -1
  302. package/dist/{chunk-TZKR5Z4J.mjs → chunk-XJF2F36N.mjs} +2 -2
  303. package/dist/{chunk-P6ACVNQK.mjs → chunk-YD2XBEKO.mjs} +2 -2
  304. package/dist/{chunk-LMXWIPGR.js → chunk-YWPLHFAK.js} +3 -3
  305. package/dist/{chunk-LMXWIPGR.js.map → chunk-YWPLHFAK.js.map} +1 -1
  306. package/dist/{chunk-DCEWWHV5.mjs → chunk-Z3HGYPH7.mjs} +2 -2
  307. package/dist/{chunk-Q3PKW6TH.js → chunk-ZCV3HWI2.js} +6 -6
  308. package/dist/{chunk-Q3PKW6TH.js.map → chunk-ZCV3HWI2.js.map} +1 -1
  309. package/dist/{chunk-OSA3YVDZ.mjs → chunk-ZF46DCAC.mjs} +2 -2
  310. package/dist/{chunk-5T6IDXSB.js → chunk-ZO2GA23I.js} +3 -3
  311. package/dist/{chunk-5T6IDXSB.js.map → chunk-ZO2GA23I.js.map} +1 -1
  312. package/dist/{chunk-ZN3763VZ.js → chunk-ZQLW4EJB.js} +9 -9
  313. package/dist/{chunk-ZN3763VZ.js.map → chunk-ZQLW4EJB.js.map} +1 -1
  314. package/dist/{chunk-CM5R4SPF.js → chunk-ZQQJTO6T.js} +3 -3
  315. package/dist/{chunk-CM5R4SPF.js.map → chunk-ZQQJTO6T.js.map} +1 -1
  316. package/dist/{chunk-SEL4QDCO.js → chunk-ZSXSAE3D.js} +3 -3
  317. package/dist/{chunk-SEL4QDCO.js.map → chunk-ZSXSAE3D.js.map} +1 -1
  318. package/dist/components/SupportChatWidget/guestSupportChatAdapter.d.ts +6 -1
  319. package/dist/components/SupportChatWidget/guestSupportChatAdapter.d.ts.map +1 -1
  320. package/dist/hooks/useAppContent/index.js +49 -49
  321. package/dist/hooks/useAppContent/index.mjs +48 -48
  322. package/dist/hooks/useSupportChat.d.ts +2 -0
  323. package/dist/hooks/useSupportChat.d.ts.map +1 -1
  324. package/dist/index.js +49 -49
  325. package/dist/index.mjs +48 -48
  326. package/dist/types/supportChat/index.d.ts +14 -0
  327. package/dist/types/supportChat/index.d.ts.map +1 -1
  328. package/dist/types/supportChat/index.js +2 -2
  329. package/dist/types/supportChat/index.mjs +1 -1
  330. package/dist/types/supportChat.d.ts +14 -0
  331. package/dist/types/supportChat.d.ts.map +1 -1
  332. package/package.json +1 -1
  333. package/dist/chunk-CYSODZGX.js.map +0 -1
  334. package/dist/chunk-OES54VU6.mjs.map +0 -1
  335. package/dist/chunk-PPYCCT2K.js.map +0 -1
  336. package/dist/chunk-SU5Q64TW.mjs.map +0 -1
  337. /package/dist/{RichEditorCore-6MTYSSKS.mjs.map → RichEditorCore-2S5YUAOI.mjs.map} +0 -0
  338. /package/dist/{chunk-B6QOBHZM.mjs.map → chunk-24BEZK43.mjs.map} +0 -0
  339. /package/dist/{chunk-OQTXTDSK.mjs.map → chunk-2OJ3QSLU.mjs.map} +0 -0
  340. /package/dist/{chunk-4OUBPEVS.mjs.map → chunk-3HKLGNUE.mjs.map} +0 -0
  341. /package/dist/{chunk-IHBWJM4C.mjs.map → chunk-3Q7RJKUP.mjs.map} +0 -0
  342. /package/dist/{chunk-PY6WD6SB.mjs.map → chunk-3WRB4WCD.mjs.map} +0 -0
  343. /package/dist/{chunk-L52NFNFK.mjs.map → chunk-5VC4BK65.mjs.map} +0 -0
  344. /package/dist/{chunk-C65DG2RI.mjs.map → chunk-7FSBWUOM.mjs.map} +0 -0
  345. /package/dist/{chunk-HCQJR5CE.mjs.map → chunk-7ZWEBNFB.mjs.map} +0 -0
  346. /package/dist/{chunk-3RHNJUXU.mjs.map → chunk-ACSEJOW6.mjs.map} +0 -0
  347. /package/dist/{chunk-WQZHUW7C.mjs.map → chunk-ANFHLSDB.mjs.map} +0 -0
  348. /package/dist/{chunk-H6NQOLQY.mjs.map → chunk-ANFLWCVD.mjs.map} +0 -0
  349. /package/dist/{chunk-5WS6IENQ.mjs.map → chunk-AU2HLQDJ.mjs.map} +0 -0
  350. /package/dist/{chunk-P6FX3NT6.mjs.map → chunk-AZGDHAP5.mjs.map} +0 -0
  351. /package/dist/{chunk-NPB2JTYC.mjs.map → chunk-BO3QVQ37.mjs.map} +0 -0
  352. /package/dist/{chunk-2WI4Q2I2.mjs.map → chunk-BPMWRFSI.mjs.map} +0 -0
  353. /package/dist/{chunk-TEW33GLR.mjs.map → chunk-BXN3VO6I.mjs.map} +0 -0
  354. /package/dist/{chunk-HBZHWSMZ.mjs.map → chunk-D46PJSQ7.mjs.map} +0 -0
  355. /package/dist/{chunk-I6EAPPBL.mjs.map → chunk-DZMYIOKZ.mjs.map} +0 -0
  356. /package/dist/{chunk-I4QGQMXI.mjs.map → chunk-EXYXZFNK.mjs.map} +0 -0
  357. /package/dist/{chunk-M4O46VDY.mjs.map → chunk-GX2PKLN2.mjs.map} +0 -0
  358. /package/dist/{chunk-5BUTINIM.mjs.map → chunk-HLVLSWKD.mjs.map} +0 -0
  359. /package/dist/{chunk-MMS2ELDK.mjs.map → chunk-IIQCS3A2.mjs.map} +0 -0
  360. /package/dist/{chunk-NKWLCZUZ.mjs.map → chunk-JGGUMHM6.mjs.map} +0 -0
  361. /package/dist/{chunk-NVL5TKWD.mjs.map → chunk-JYFLOQYT.mjs.map} +0 -0
  362. /package/dist/{chunk-DWGDEUEW.mjs.map → chunk-KG563P7F.mjs.map} +0 -0
  363. /package/dist/{chunk-TCIC5556.mjs.map → chunk-KH4TEDGD.mjs.map} +0 -0
  364. /package/dist/{chunk-E6CGJBID.mjs.map → chunk-LUHKMY56.mjs.map} +0 -0
  365. /package/dist/{chunk-TVLEUNKE.mjs.map → chunk-LZP5VZCO.mjs.map} +0 -0
  366. /package/dist/{chunk-EHNEBXS7.mjs.map → chunk-M6DXZ2FM.mjs.map} +0 -0
  367. /package/dist/{chunk-B4C5DWAP.mjs.map → chunk-MMMJDO75.mjs.map} +0 -0
  368. /package/dist/{chunk-KWXOYHYK.mjs.map → chunk-P7MORXSE.mjs.map} +0 -0
  369. /package/dist/{chunk-YG4IZ5Q3.mjs.map → chunk-Q2OSEROT.mjs.map} +0 -0
  370. /package/dist/{chunk-L5SXG6T6.mjs.map → chunk-QQKOHKO2.mjs.map} +0 -0
  371. /package/dist/{chunk-K45PTE7F.mjs.map → chunk-RBKQXT73.mjs.map} +0 -0
  372. /package/dist/{chunk-BXLAOYAG.mjs.map → chunk-RIUVPTG7.mjs.map} +0 -0
  373. /package/dist/{chunk-QVB54LBS.mjs.map → chunk-RNZGX6MX.mjs.map} +0 -0
  374. /package/dist/{chunk-MES2BP4T.mjs.map → chunk-SGL5IUCV.mjs.map} +0 -0
  375. /package/dist/{chunk-7LS5UQCQ.mjs.map → chunk-STKUPDHG.mjs.map} +0 -0
  376. /package/dist/{chunk-JCA76TCX.mjs.map → chunk-SZKLJOTN.mjs.map} +0 -0
  377. /package/dist/{chunk-VKQ5AJDT.mjs.map → chunk-UENZQF2Y.mjs.map} +0 -0
  378. /package/dist/{chunk-37AJ2GVO.mjs.map → chunk-UXJIZDXQ.mjs.map} +0 -0
  379. /package/dist/{chunk-7BOTKRY6.mjs.map → chunk-V55DG5B4.mjs.map} +0 -0
  380. /package/dist/{chunk-VJQIKFMG.mjs.map → chunk-W3CWEZDB.mjs.map} +0 -0
  381. /package/dist/{chunk-TZKR5Z4J.mjs.map → chunk-XJF2F36N.mjs.map} +0 -0
  382. /package/dist/{chunk-P6ACVNQK.mjs.map → chunk-YD2XBEKO.mjs.map} +0 -0
  383. /package/dist/{chunk-DCEWWHV5.mjs.map → chunk-Z3HGYPH7.mjs.map} +0 -0
  384. /package/dist/{chunk-OSA3YVDZ.mjs.map → chunk-ZF46DCAC.mjs.map} +0 -0
@@ -3,10 +3,10 @@
3
3
  var _chunkPQH6A3JHjs = require('./chunk-PQH6A3JH.js');
4
4
 
5
5
 
6
- var _chunk36KFIZ43js = require('./chunk-36KFIZ43.js');
6
+ var _chunkMYPUZ6EGjs = require('./chunk-MYPUZ6EG.js');
7
7
 
8
8
 
9
- var _chunk23PAYKWBjs = require('./chunk-23PAYKWB.js');
9
+ var _chunkKM27ZDHZjs = require('./chunk-KM27ZDHZ.js');
10
10
 
11
11
 
12
12
  var _chunkXN2HPVVHjs = require('./chunk-XN2HPVVH.js');
@@ -46,7 +46,7 @@ var ReportDetailModal = ({
46
46
  print({ fileName, bodyClass: PRINT_MODAL_BODY_CLASS });
47
47
  }, [onDownloadPdf, fileName, print]);
48
48
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
49
- _chunk23PAYKWBjs.Modal_default,
49
+ _chunkKM27ZDHZjs.Modal_default,
50
50
  {
51
51
  isOpen,
52
52
  onClose,
@@ -70,7 +70,7 @@ var ReportDetailModal = ({
70
70
  children
71
71
  ] }),
72
72
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
73
- _chunk36KFIZ43js.DownloadModal_default,
73
+ _chunkMYPUZ6EGjs.DownloadModal_default,
74
74
  {
75
75
  isOpen: isDownloadModalOpen,
76
76
  onClose: closeDownloadModal,
@@ -90,4 +90,4 @@ var ReportDetailModal_default = ReportDetailModal;
90
90
 
91
91
 
92
92
  exports.ReportDetailModal = ReportDetailModal; exports.ReportDetailModal_default = ReportDetailModal_default;
93
- //# sourceMappingURL=chunk-ZRIYCU2V.js.map
93
+ //# sourceMappingURL=chunk-S2BZPPAI.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-ZRIYCU2V.js","../src/components/ReportDetailModal/ReportDetailModal.tsx"],"names":[],"mappings":"AAAA;AACE;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACA;AChBA,8BAAsC;AAEtC,+CAAmC;AA0L7B,+CAAA;AA5KN,IAAM,mBAAA,EAAqB,iBAAA;AAQ3B,IAAM,uBAAA,EAAyB,gBAAA;AA8H/B,IAAM,kBAAA,EAAoB,CAAC;AAAA,EACzB,MAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA,EAAO,IAAA;AAAA,EACP,SAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA;AAAA,EACA,eAAA;AAAA,EACA,cAAA,EAAgB,KAAA;AAAA,EAChB,MAAA,EAAQ;AACV,CAAA,EAAA,GAA8B;AAC5B,EAAA,MAAM,CAAC,mBAAA,EAAqB,sBAAsB,EAAA,EAAI,6BAAA,KAAc,CAAA;AACpE,EAAA,MAAM,MAAA,EAAQ,6CAAA,CAAe;AAE7B,EAAA,MAAM,mBAAA,EAAqB,gCAAA,CAAY,EAAA,GAAM;AAC3C,IAAA,sBAAA,CAAuB,KAAK,CAAA;AAAA,EAC9B,CAAA,EAAG,CAAC,CAAC,CAAA;AAEL,EAAA,MAAM,kBAAA,EAAoB,gCAAA,CAAY,EAAA,GAAM;AAG1C,IAAA,GAAA,CAAI,aAAA,EAAe;AACjB,MAAA,aAAA,CAAc,CAAA;AACd,MAAA,MAAA;AAAA,IACF;AACA,IAAA,KAAA,CAAM,EAAE,QAAA,EAAU,SAAA,EAAW,uBAAuB,CAAC,CAAA;AAAA,EACvD,CAAA,EAAG,CAAC,aAAA,EAAe,QAAA,EAAU,KAAK,CAAC,CAAA;AAEnC,EAAA,uBACE,8BAAA;AAAA,IAAC,8BAAA;AAAA,IAAA;AAAA,MACC,MAAA;AAAA,MACA,OAAA;AAAA,MACA,KAAA;AAAA,MACA,IAAA;AAAA,MACA,SAAA,EAAW,iCAAA,kBAAG,EAAoB,SAAS,CAAA;AAAA,MAE3C,QAAA,EAAA;AAAA,wBAAA,8BAAA,KAAC,EAAA,EAAI,SAAA,EAAU,qBAAA,EAMb,QAAA,EAAA;AAAA,0BAAA,6BAAA,KAAC,EAAA,EAAI,SAAA,EAAU,wCAAA,EAAyC,iBAAA,EAAe,IAAA,EACrE,QAAA,kBAAA,6BAAA;AAAA,YAAC,+BAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAQ,OAAA;AAAA,cACR,MAAA,EAAO,SAAA;AAAA,cACP,IAAA,EAAK,QAAA;AAAA,cACL,QAAA,kBAAU,6BAAA,0BAAC,EAAA,EAAmB,IAAA,EAAM,GAAA,CAAI,CAAA;AAAA,cACxC,OAAA,EAAS,CAAA,EAAA,GAAM,sBAAA,CAAuB,IAAI,CAAA;AAAA,cAC1C,aAAA,EAAY,4BAAA;AAAA,cACb,QAAA,EAAA;AAAA,YAAA;AAAA,UAED,EAAA,CACF,CAAA;AAAA,UAEC;AAAA,QAAA,EAAA,CACH,CAAA;AAAA,wBAEA,6BAAA;AAAA,UAAC,sCAAA;AAAA,UAAA;AAAA,YACC,MAAA,EAAQ,mBAAA;AAAA,YACR,OAAA,EAAS,kBAAA;AAAA,YACT,aAAA;AAAA,YACA,KAAA;AAAA,YACA,aAAA,EAAe,iBAAA;AAAA,YACf;AAAA,UAAA;AAAA,QACF;AAAA,MAAA;AAAA,IAAA;AAAA,EACF,CAAA;AAEJ,CAAA;AAEA,IAAO,0BAAA,EAAQ,iBAAA;ADvIf;AACA;AACE;AACA;AACF,6GAAC","file":"/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-ZRIYCU2V.js","sourcesContent":[null,"import { useCallback, useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { DownloadSimpleIcon } from '@phosphor-icons/react';\nimport Modal from '../Modal/Modal';\nimport Button from '../Button/Button';\nimport DownloadModal from '../DownloadModal/DownloadModal';\nimport { useReportPrint } from '../../hooks/useReportPrint';\nimport { cn } from '../../utils/utils';\n\n/**\n * Marca o `<dialog>` que a impressão de modal isolado deve deixar passar.\n *\n * O nome é contrato com o CSS: as regras de `body.printing-modal` em\n * `src/print.css` (bloco a partir da linha 214) revelam exatamente\n * `dialog.js-print-region` e escondem o resto da página.\n */\nconst PRINT_REGION_CLASS = 'js-print-region';\n\n/**\n * Classe posta no `<body>` durante a impressão deste modal.\n *\n * É a chave que liga o `useReportPrint` ao bloco `body.printing-modal` do\n * `print.css`. Os dois nomes são os que o frontend-gestor-web já usava.\n */\nconst PRINT_MODAL_BODY_CLASS = 'printing-modal';\n\n/** Tamanhos aceitos pelo `Modal` base da lib. */\nexport type ReportDetailModalSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\n/** Props do {@link ReportDetailModal}. */\nexport interface ReportDetailModalProps {\n readonly isOpen: boolean;\n readonly onClose: () => void;\n /**\n * Título do modal. Renderizado dentro do `<h2>` do `Modal` base, então\n * quando for ReactNode use apenas phrasing content.\n */\n readonly title: ReactNode;\n /** Tamanho do `Modal` base. Padrão `xl`, o usado pelos modais de detalhe. */\n readonly size?: ReportDetailModalSize;\n /**\n * Classes extras para o `<dialog>`, somadas à marca de impressão.\n *\n * Existe porque `size` não cobre larguras fora da tabela de tamanhos do\n * `Modal` (o maior, `xl`, é `max-w-[970px]`) e os modais de drill-down do\n * gestor usam `max-w-[1150px]`. Vem depois de `js-print-region` no `cn`, e o\n * `Modal` já a coloca por último no seu próprio `cn`, então classes\n * conflitantes do consumidor vencem no tailwind-merge.\n */\n readonly className?: string;\n /** Conteúdo do relatório: cards de resumo, tabelas, gráficos. */\n readonly children?: ReactNode;\n /**\n * SUBSTITUI a impressão embutida no caminho PDF.\n *\n * ESCAPE HATCH, não o caminho normal. O caso comum — imprimir este modal com\n * um nome de arquivo — já está pronto e se resolve com `fileName`. Passe esta\n * prop só quando a impressão precisar ser outra coisa (gerar o PDF por\n * biblioteca, imprimir um documento montado à parte, etc).\n *\n * PRECEDÊNCIA: quando ela vem, ela VENCE — o componente não imprime nada e\n * `fileName` é ignorado, porque quem imprime passa a ser o callback e só ele\n * sabe como nomear o resultado. Deixei como precedência de runtime, e não\n * como erro de tipo, por dois motivos: um consumidor que monta as props em\n * um objeto (spread condicional) não conseguiria satisfazer uma união\n * exclusiva sem cast, e o teste que fixa esta regra precisaria de\n * `@ts-expect-error` para existir.\n *\n * Substitui, não soma: quem passa esta prop fica responsável por imprimir.\n * Um callback que só registra telemetria deixa o botão de PDF sem efeito.\n */\n readonly onDownloadPdf?: () => void;\n /**\n * Nome do arquivo oferecido no caminho PDF padrão, sem extensão.\n *\n * Repassado a `useReportPrint`, que renomeia a aba pela duração da impressão\n * — o \"PDF\" É a página impressa, então o nome do arquivo sai do\n * `document.title` (veja a premissa registrada em `useReportPrint.ts`). Sem\n * ele o PDF sai com o título do app, e o nome por relatório que o resto da\n * feature construiu se perde.\n *\n * É prop, e não um callback que o consumidor liga à mão, para não vazar\n * detalhe que este componente já conhece: com callback todo consumidor\n * precisaria importar `useReportPrint` e saber o valor de `bodyClass`.\n *\n * ```tsx\n * <ReportDetailModal fileName=\"participacao-20-08-2026\" ... />\n * ```\n *\n * Ignorado quando `onDownloadPdf` é fornecido — veja a precedência lá.\n */\n readonly fileName?: string;\n /**\n * Geração do Excel. Ausente, o `DownloadModal` oferece só o cartão de PDF.\n */\n readonly onDownloadExcel?: () => void;\n /** Repassada ao `DownloadModal`: troca os cartões por skeletons. */\n readonly isDownloading?: boolean;\n /** Repassada ao `DownloadModal`: mensagem de erro exibida acima dos cartões. */\n readonly error?: string | null;\n}\n\n/**\n * Modal de detalhe de relatório com exportação do PRÓPRIO modal.\n *\n * Casca em cima do `Modal` base: acrescenta o botão \"Baixar relatório\", o\n * `DownloadModal` de escolha de formato e, no caminho PDF, a impressão de\n * apenas este modal — `useReportPrint({ bodyClass: 'printing-modal' })` mais a\n * marca `js-print-region` no `<dialog>`. O conteúdo do relatório é inteiramente\n * do consumidor, via `children`.\n *\n * PDF sai de graça; Excel é do consumidor. Sem `onDownloadExcel` o seletor de\n * formato mostra só o cartão de PDF, em vez de oferecer uma opção morta.\n *\n * O botão \"Baixar relatório\" NÃO sai no PDF: o container dele leva\n * `data-print-hide`, e o atributo não é resíduo — não remova. A impressão de\n * modal isolado revela o `dialog.js-print-region` inteiro, e o botão mora\n * dentro dele, então nada mais o esconderia. O gestor não via o problema\n * porque tinha uma regra local cega (`button:not([aria-pressed])`) que apagava\n * qualquer botão da página; ela está sendo aposentada em favor deste marcador\n * explícito. O que o consumidor puser em `children` é dele: controle de tela\n * que não deva sair no papel — busca, paginação, filtros — precisa do mesmo\n * `data-print-hide`.\n *\n * O consumidor precisa importar `analytica-frontend-lib/print.css`: sem as\n * regras `@media print` a marca no `<dialog>` não significa nada e o PDF sai\n * com a página inteira.\n *\n * Sobre a composição: usa o `Modal` BASE porque só ele aceita `className` no\n * `<dialog>` (`Modal.tsx:172` e `:276` montam `cn(..., className)`). As quatro\n * variantes especializadas — `Modal.tsx:422`, `:553`, `:729` e `:880` — têm\n * `className` hardcoded no `<dialog>` e não teriam como receber a marca de\n * impressão.\n *\n * ```tsx\n * <ReportDetailModal\n * isOpen={isOpen}\n * onClose={close}\n * title={`Região ${region.name}`}\n * className=\"max-w-[1150px]\"\n * fileName={`participacao-${formatDateForFileName(new Date())}`}\n * onDownloadExcel={handleExcel}\n * isDownloading={excel.loading}\n * error={excel.error}\n * >\n * <StatisticsCard title=\"Geral\" data={cards} />\n * <DataTable ... />\n * </ReportDetailModal>\n * ```\n */\nconst ReportDetailModal = ({\n isOpen,\n onClose,\n title,\n size = 'xl',\n className,\n children,\n onDownloadPdf,\n fileName,\n onDownloadExcel,\n isDownloading = false,\n error = null,\n}: ReportDetailModalProps) => {\n const [isDownloadModalOpen, setIsDownloadModalOpen] = useState(false);\n const print = useReportPrint();\n\n const closeDownloadModal = useCallback(() => {\n setIsDownloadModalOpen(false);\n }, []);\n\n const handleDownloadPdf = useCallback(() => {\n // O escape hatch vence e `fileName` fica de fora de propósito: quem imprime\n // é o callback, e nomear o resultado passa a ser problema dele.\n if (onDownloadPdf) {\n onDownloadPdf();\n return;\n }\n print({ fileName, bodyClass: PRINT_MODAL_BODY_CLASS });\n }, [onDownloadPdf, fileName, print]);\n\n return (\n <Modal\n isOpen={isOpen}\n onClose={onClose}\n title={title}\n size={size}\n className={cn(PRINT_REGION_CLASS, className)}\n >\n <div className=\"flex flex-col gap-6\">\n {/* Ação de download acima do conteúdo, alinhada à direita.\n `data-print-hide` no CONTAINER, não no <Button>: no caminho PDF este\n botão está DENTRO da região impressa, e sem o marcador ele sairia no\n papel. No container o `gap-6` do flex-col pai colapsa junto — é o\n contrato que o print.css documenta (linhas 105-122). */}\n <div className=\"flex flex-row items-center justify-end\" data-print-hide>\n <Button\n variant=\"solid\"\n action=\"primary\"\n size=\"medium\"\n iconLeft={<DownloadSimpleIcon size={18} />}\n onClick={() => setIsDownloadModalOpen(true)}\n data-testid=\"report-detail-download-btn\"\n >\n Baixar relatório\n </Button>\n </div>\n\n {children}\n </div>\n\n <DownloadModal\n isOpen={isDownloadModalOpen}\n onClose={closeDownloadModal}\n isDownloading={isDownloading}\n error={error}\n onDownloadPdf={handleDownloadPdf}\n onDownloadExcel={onDownloadExcel}\n />\n </Modal>\n );\n};\n\nexport default ReportDetailModal;\nexport { ReportDetailModal };\n"]}
1
+ {"version":3,"sources":["/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-S2BZPPAI.js","../src/components/ReportDetailModal/ReportDetailModal.tsx"],"names":[],"mappings":"AAAA;AACE;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACA;AChBA,8BAAsC;AAEtC,+CAAmC;AA0L7B,+CAAA;AA5KN,IAAM,mBAAA,EAAqB,iBAAA;AAQ3B,IAAM,uBAAA,EAAyB,gBAAA;AA8H/B,IAAM,kBAAA,EAAoB,CAAC;AAAA,EACzB,MAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA,EAAO,IAAA;AAAA,EACP,SAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA;AAAA,EACA,eAAA;AAAA,EACA,cAAA,EAAgB,KAAA;AAAA,EAChB,MAAA,EAAQ;AACV,CAAA,EAAA,GAA8B;AAC5B,EAAA,MAAM,CAAC,mBAAA,EAAqB,sBAAsB,EAAA,EAAI,6BAAA,KAAc,CAAA;AACpE,EAAA,MAAM,MAAA,EAAQ,6CAAA,CAAe;AAE7B,EAAA,MAAM,mBAAA,EAAqB,gCAAA,CAAY,EAAA,GAAM;AAC3C,IAAA,sBAAA,CAAuB,KAAK,CAAA;AAAA,EAC9B,CAAA,EAAG,CAAC,CAAC,CAAA;AAEL,EAAA,MAAM,kBAAA,EAAoB,gCAAA,CAAY,EAAA,GAAM;AAG1C,IAAA,GAAA,CAAI,aAAA,EAAe;AACjB,MAAA,aAAA,CAAc,CAAA;AACd,MAAA,MAAA;AAAA,IACF;AACA,IAAA,KAAA,CAAM,EAAE,QAAA,EAAU,SAAA,EAAW,uBAAuB,CAAC,CAAA;AAAA,EACvD,CAAA,EAAG,CAAC,aAAA,EAAe,QAAA,EAAU,KAAK,CAAC,CAAA;AAEnC,EAAA,uBACE,8BAAA;AAAA,IAAC,8BAAA;AAAA,IAAA;AAAA,MACC,MAAA;AAAA,MACA,OAAA;AAAA,MACA,KAAA;AAAA,MACA,IAAA;AAAA,MACA,SAAA,EAAW,iCAAA,kBAAG,EAAoB,SAAS,CAAA;AAAA,MAE3C,QAAA,EAAA;AAAA,wBAAA,8BAAA,KAAC,EAAA,EAAI,SAAA,EAAU,qBAAA,EAMb,QAAA,EAAA;AAAA,0BAAA,6BAAA,KAAC,EAAA,EAAI,SAAA,EAAU,wCAAA,EAAyC,iBAAA,EAAe,IAAA,EACrE,QAAA,kBAAA,6BAAA;AAAA,YAAC,+BAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAQ,OAAA;AAAA,cACR,MAAA,EAAO,SAAA;AAAA,cACP,IAAA,EAAK,QAAA;AAAA,cACL,QAAA,kBAAU,6BAAA,0BAAC,EAAA,EAAmB,IAAA,EAAM,GAAA,CAAI,CAAA;AAAA,cACxC,OAAA,EAAS,CAAA,EAAA,GAAM,sBAAA,CAAuB,IAAI,CAAA;AAAA,cAC1C,aAAA,EAAY,4BAAA;AAAA,cACb,QAAA,EAAA;AAAA,YAAA;AAAA,UAED,EAAA,CACF,CAAA;AAAA,UAEC;AAAA,QAAA,EAAA,CACH,CAAA;AAAA,wBAEA,6BAAA;AAAA,UAAC,sCAAA;AAAA,UAAA;AAAA,YACC,MAAA,EAAQ,mBAAA;AAAA,YACR,OAAA,EAAS,kBAAA;AAAA,YACT,aAAA;AAAA,YACA,KAAA;AAAA,YACA,aAAA,EAAe,iBAAA;AAAA,YACf;AAAA,UAAA;AAAA,QACF;AAAA,MAAA;AAAA,IAAA;AAAA,EACF,CAAA;AAEJ,CAAA;AAEA,IAAO,0BAAA,EAAQ,iBAAA;ADvIf;AACA;AACE;AACA;AACF,6GAAC","file":"/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-S2BZPPAI.js","sourcesContent":[null,"import { useCallback, useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { DownloadSimpleIcon } from '@phosphor-icons/react';\nimport Modal from '../Modal/Modal';\nimport Button from '../Button/Button';\nimport DownloadModal from '../DownloadModal/DownloadModal';\nimport { useReportPrint } from '../../hooks/useReportPrint';\nimport { cn } from '../../utils/utils';\n\n/**\n * Marca o `<dialog>` que a impressão de modal isolado deve deixar passar.\n *\n * O nome é contrato com o CSS: as regras de `body.printing-modal` em\n * `src/print.css` (bloco a partir da linha 214) revelam exatamente\n * `dialog.js-print-region` e escondem o resto da página.\n */\nconst PRINT_REGION_CLASS = 'js-print-region';\n\n/**\n * Classe posta no `<body>` durante a impressão deste modal.\n *\n * É a chave que liga o `useReportPrint` ao bloco `body.printing-modal` do\n * `print.css`. Os dois nomes são os que o frontend-gestor-web já usava.\n */\nconst PRINT_MODAL_BODY_CLASS = 'printing-modal';\n\n/** Tamanhos aceitos pelo `Modal` base da lib. */\nexport type ReportDetailModalSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\n/** Props do {@link ReportDetailModal}. */\nexport interface ReportDetailModalProps {\n readonly isOpen: boolean;\n readonly onClose: () => void;\n /**\n * Título do modal. Renderizado dentro do `<h2>` do `Modal` base, então\n * quando for ReactNode use apenas phrasing content.\n */\n readonly title: ReactNode;\n /** Tamanho do `Modal` base. Padrão `xl`, o usado pelos modais de detalhe. */\n readonly size?: ReportDetailModalSize;\n /**\n * Classes extras para o `<dialog>`, somadas à marca de impressão.\n *\n * Existe porque `size` não cobre larguras fora da tabela de tamanhos do\n * `Modal` (o maior, `xl`, é `max-w-[970px]`) e os modais de drill-down do\n * gestor usam `max-w-[1150px]`. Vem depois de `js-print-region` no `cn`, e o\n * `Modal` já a coloca por último no seu próprio `cn`, então classes\n * conflitantes do consumidor vencem no tailwind-merge.\n */\n readonly className?: string;\n /** Conteúdo do relatório: cards de resumo, tabelas, gráficos. */\n readonly children?: ReactNode;\n /**\n * SUBSTITUI a impressão embutida no caminho PDF.\n *\n * ESCAPE HATCH, não o caminho normal. O caso comum — imprimir este modal com\n * um nome de arquivo — já está pronto e se resolve com `fileName`. Passe esta\n * prop só quando a impressão precisar ser outra coisa (gerar o PDF por\n * biblioteca, imprimir um documento montado à parte, etc).\n *\n * PRECEDÊNCIA: quando ela vem, ela VENCE — o componente não imprime nada e\n * `fileName` é ignorado, porque quem imprime passa a ser o callback e só ele\n * sabe como nomear o resultado. Deixei como precedência de runtime, e não\n * como erro de tipo, por dois motivos: um consumidor que monta as props em\n * um objeto (spread condicional) não conseguiria satisfazer uma união\n * exclusiva sem cast, e o teste que fixa esta regra precisaria de\n * `@ts-expect-error` para existir.\n *\n * Substitui, não soma: quem passa esta prop fica responsável por imprimir.\n * Um callback que só registra telemetria deixa o botão de PDF sem efeito.\n */\n readonly onDownloadPdf?: () => void;\n /**\n * Nome do arquivo oferecido no caminho PDF padrão, sem extensão.\n *\n * Repassado a `useReportPrint`, que renomeia a aba pela duração da impressão\n * — o \"PDF\" É a página impressa, então o nome do arquivo sai do\n * `document.title` (veja a premissa registrada em `useReportPrint.ts`). Sem\n * ele o PDF sai com o título do app, e o nome por relatório que o resto da\n * feature construiu se perde.\n *\n * É prop, e não um callback que o consumidor liga à mão, para não vazar\n * detalhe que este componente já conhece: com callback todo consumidor\n * precisaria importar `useReportPrint` e saber o valor de `bodyClass`.\n *\n * ```tsx\n * <ReportDetailModal fileName=\"participacao-20-08-2026\" ... />\n * ```\n *\n * Ignorado quando `onDownloadPdf` é fornecido — veja a precedência lá.\n */\n readonly fileName?: string;\n /**\n * Geração do Excel. Ausente, o `DownloadModal` oferece só o cartão de PDF.\n */\n readonly onDownloadExcel?: () => void;\n /** Repassada ao `DownloadModal`: troca os cartões por skeletons. */\n readonly isDownloading?: boolean;\n /** Repassada ao `DownloadModal`: mensagem de erro exibida acima dos cartões. */\n readonly error?: string | null;\n}\n\n/**\n * Modal de detalhe de relatório com exportação do PRÓPRIO modal.\n *\n * Casca em cima do `Modal` base: acrescenta o botão \"Baixar relatório\", o\n * `DownloadModal` de escolha de formato e, no caminho PDF, a impressão de\n * apenas este modal — `useReportPrint({ bodyClass: 'printing-modal' })` mais a\n * marca `js-print-region` no `<dialog>`. O conteúdo do relatório é inteiramente\n * do consumidor, via `children`.\n *\n * PDF sai de graça; Excel é do consumidor. Sem `onDownloadExcel` o seletor de\n * formato mostra só o cartão de PDF, em vez de oferecer uma opção morta.\n *\n * O botão \"Baixar relatório\" NÃO sai no PDF: o container dele leva\n * `data-print-hide`, e o atributo não é resíduo — não remova. A impressão de\n * modal isolado revela o `dialog.js-print-region` inteiro, e o botão mora\n * dentro dele, então nada mais o esconderia. O gestor não via o problema\n * porque tinha uma regra local cega (`button:not([aria-pressed])`) que apagava\n * qualquer botão da página; ela está sendo aposentada em favor deste marcador\n * explícito. O que o consumidor puser em `children` é dele: controle de tela\n * que não deva sair no papel — busca, paginação, filtros — precisa do mesmo\n * `data-print-hide`.\n *\n * O consumidor precisa importar `analytica-frontend-lib/print.css`: sem as\n * regras `@media print` a marca no `<dialog>` não significa nada e o PDF sai\n * com a página inteira.\n *\n * Sobre a composição: usa o `Modal` BASE porque só ele aceita `className` no\n * `<dialog>` (`Modal.tsx:172` e `:276` montam `cn(..., className)`). As quatro\n * variantes especializadas — `Modal.tsx:422`, `:553`, `:729` e `:880` — têm\n * `className` hardcoded no `<dialog>` e não teriam como receber a marca de\n * impressão.\n *\n * ```tsx\n * <ReportDetailModal\n * isOpen={isOpen}\n * onClose={close}\n * title={`Região ${region.name}`}\n * className=\"max-w-[1150px]\"\n * fileName={`participacao-${formatDateForFileName(new Date())}`}\n * onDownloadExcel={handleExcel}\n * isDownloading={excel.loading}\n * error={excel.error}\n * >\n * <StatisticsCard title=\"Geral\" data={cards} />\n * <DataTable ... />\n * </ReportDetailModal>\n * ```\n */\nconst ReportDetailModal = ({\n isOpen,\n onClose,\n title,\n size = 'xl',\n className,\n children,\n onDownloadPdf,\n fileName,\n onDownloadExcel,\n isDownloading = false,\n error = null,\n}: ReportDetailModalProps) => {\n const [isDownloadModalOpen, setIsDownloadModalOpen] = useState(false);\n const print = useReportPrint();\n\n const closeDownloadModal = useCallback(() => {\n setIsDownloadModalOpen(false);\n }, []);\n\n const handleDownloadPdf = useCallback(() => {\n // O escape hatch vence e `fileName` fica de fora de propósito: quem imprime\n // é o callback, e nomear o resultado passa a ser problema dele.\n if (onDownloadPdf) {\n onDownloadPdf();\n return;\n }\n print({ fileName, bodyClass: PRINT_MODAL_BODY_CLASS });\n }, [onDownloadPdf, fileName, print]);\n\n return (\n <Modal\n isOpen={isOpen}\n onClose={onClose}\n title={title}\n size={size}\n className={cn(PRINT_REGION_CLASS, className)}\n >\n <div className=\"flex flex-col gap-6\">\n {/* Ação de download acima do conteúdo, alinhada à direita.\n `data-print-hide` no CONTAINER, não no <Button>: no caminho PDF este\n botão está DENTRO da região impressa, e sem o marcador ele sairia no\n papel. No container o `gap-6` do flex-col pai colapsa junto — é o\n contrato que o print.css documenta (linhas 105-122). */}\n <div className=\"flex flex-row items-center justify-end\" data-print-hide>\n <Button\n variant=\"solid\"\n action=\"primary\"\n size=\"medium\"\n iconLeft={<DownloadSimpleIcon size={18} />}\n onClick={() => setIsDownloadModalOpen(true)}\n data-testid=\"report-detail-download-btn\"\n >\n Baixar relatório\n </Button>\n </div>\n\n {children}\n </div>\n\n <DownloadModal\n isOpen={isDownloadModalOpen}\n onClose={closeDownloadModal}\n isDownloading={isDownloading}\n error={error}\n onDownloadPdf={handleDownloadPdf}\n onDownloadExcel={onDownloadExcel}\n />\n </Modal>\n );\n};\n\nexport default ReportDetailModal;\nexport { ReportDetailModal };\n"]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  Modal_default
3
- } from "./chunk-XZUMD3CB.mjs";
3
+ } from "./chunk-LODDYDTP.mjs";
4
4
  import {
5
5
  cn
6
6
  } from "./chunk-53ICLDGS.mjs";
@@ -172,4 +172,4 @@ var Whiteboard_default = Whiteboard;
172
172
  export {
173
173
  Whiteboard_default
174
174
  };
175
- //# sourceMappingURL=chunk-MES2BP4T.mjs.map
175
+ //# sourceMappingURL=chunk-SGL5IUCV.mjs.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  TicketModal,
3
3
  getCategoryIcon
4
- } from "./chunk-VKQ5AJDT.mjs";
4
+ } from "./chunk-UENZQF2Y.mjs";
5
5
  import {
6
6
  getCategoryText,
7
7
  getStatusBadgeAction,
@@ -1100,4 +1100,4 @@ export {
1100
1100
  useInfiniteScrollSentinel,
1101
1101
  TicketList
1102
1102
  };
1103
- //# sourceMappingURL=chunk-7LS5UQCQ.mjs.map
1103
+ //# sourceMappingURL=chunk-STKUPDHG.mjs.map
@@ -4,7 +4,7 @@
4
4
  var _chunkFQUCZKT5js = require('./chunk-FQUCZKT5.js');
5
5
 
6
6
 
7
- var _chunkSADSJ2MVjs = require('./chunk-SADSJ2MV.js');
7
+ var _chunkQVGUYPXOjs = require('./chunk-QVGUYPXO.js');
8
8
 
9
9
 
10
10
  var _chunkHOVTCEHKjs = require('./chunk-HOVTCEHK.js');
@@ -13,10 +13,10 @@ var _chunkHOVTCEHKjs = require('./chunk-HOVTCEHK.js');
13
13
  var _chunkVVO3W2SMjs = require('./chunk-VVO3W2SM.js');
14
14
 
15
15
 
16
- var _chunkMNU45FM3js = require('./chunk-MNU45FM3.js');
16
+ var _chunkCOT4KW3Hjs = require('./chunk-COT4KW3H.js');
17
17
 
18
18
 
19
- var _chunk23PAYKWBjs = require('./chunk-23PAYKWB.js');
19
+ var _chunkKM27ZDHZjs = require('./chunk-KM27ZDHZ.js');
20
20
 
21
21
 
22
22
  var _chunkXN2HPVVHjs = require('./chunk-XN2HPVVH.js');
@@ -96,7 +96,8 @@ var OptionCard = ({
96
96
  {
97
97
  className: _chunkTN3AYOMVjs.cn.call(void 0,
98
98
  CARD_CLASSES,
99
- "flex flex-row items-center gap-3 px-4 py-3.5",
99
+ // `relative` keeps the `sr-only` radio inside the card; see CheckBox
100
+ "relative flex flex-row items-center gap-3 px-4 py-3.5",
100
101
  "cursor-pointer transition-colors hover:bg-background-100",
101
102
  "focus-within:ring-2 focus-within:ring-indicator-info",
102
103
  checked && "border-primary-700 ring-1 ring-primary-700"
@@ -221,7 +222,7 @@ var EnemClassroomStartModal = ({
221
222
  }
222
223
  ),
223
224
  exam.videoUrl && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
224
- _chunkSADSJ2MVjs.VideoPlayer_default,
225
+ _chunkQVGUYPXOjs.VideoPlayer_default,
225
226
  {
226
227
  src: exam.videoUrl,
227
228
  title: exam.title,
@@ -351,7 +352,7 @@ var EnemClassroomStartModal = ({
351
352
  )
352
353
  ] }),
353
354
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
354
- _chunkMNU45FM3js.CheckBox_default,
355
+ _chunkCOT4KW3Hjs.CheckBox_default,
355
356
  {
356
357
  label: question.skipLabel,
357
358
  checked: isSkipped,
@@ -485,7 +486,7 @@ var EnemClassroomStartModal = ({
485
486
  ] }) : void 0;
486
487
  };
487
488
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
488
- _chunk23PAYKWBjs.Modal_default,
489
+ _chunkKM27ZDHZjs.Modal_default,
489
490
  {
490
491
  isOpen,
491
492
  onClose,
@@ -513,4 +514,4 @@ var EnemClassroomStartModal_default = EnemClassroomStartModal;
513
514
 
514
515
 
515
516
  exports.EnemClassroomStartModal_default = EnemClassroomStartModal_default;
516
- //# sourceMappingURL=chunk-PPYCCT2K.js.map
517
+ //# sourceMappingURL=chunk-SWDVSCQJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-SWDVSCQJ.js","../src/components/EnemClassroomStartModal/EnemClassroomStartModal.tsx"],"names":[],"mappings":"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","file":"/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-SWDVSCQJ.js","sourcesContent":[null,"import { useCallback, useEffect, useMemo, useState, ChangeEvent } from 'react';\nimport Modal from '../Modal/Modal';\nimport Stepper from '../Stepper/Stepper';\nimport Button from '../Button/Button';\nimport Input from '../Input/Input';\nimport CheckBox from '../CheckBox/CheckBox';\nimport Text from '../Text/Text';\nimport VideoPlayer from '../VideoPlayer/VideoPlayer';\nimport { CaretLeftIcon } from '@phosphor-icons/react/dist/csr/CaretLeft';\nimport { CaretRightIcon } from '@phosphor-icons/react/dist/csr/CaretRight';\nimport { CheckIcon } from '@phosphor-icons/react/dist/csr/Check';\nimport { cn } from '../../utils/utils';\nimport warningClassroomIcon from '../../assets/img/enemClassroom/warning-classroom.png';\nimport warningTimerIcon from '../../assets/img/enemClassroom/warning-timer.png';\nimport warningIrreversibleIcon from '../../assets/img/enemClassroom/warning-irreversible.png';\nimport flagEnglish from '../../assets/img/enemClassroom/flag-english.png';\nimport flagSpanish from '../../assets/img/enemClassroom/flag-spanish.png';\nimport surveyCourseIllustration from '../../assets/img/enemClassroom/survey-course.svg';\nimport surveyUniversityIllustration from '../../assets/img/enemClassroom/survey-university.png';\nimport {\n ENEM_CLASSROOM_LANGUAGE,\n ENEM_CLASSROOM_LANGUAGE_LABELS,\n type EnemClassroomExam,\n type EnemClassroomLanguage,\n type EnemClassroomStartPayload,\n type EnemClassroomStudentTexts,\n type EnemClassroomSurveyQuestion,\n} from '../../types/enemClassroom';\n\n/** Title shared by every step, as in the design. */\n/**\n * The three warnings of the introduction step. The exam only counts when\n * taken in class, so they are shown before anything else. The first one is\n * the backoffice's to write (`studentTexts`); the other two are fixed.\n *\n * @param texts - The exam's texts\n * @returns The warnings in order\n */\nconst buildIntroWarnings = (texts: EnemClassroomStudentTexts) => [\n {\n icon: warningClassroomIcon,\n title: texts.introWarningTitle,\n description: texts.introWarningText,\n },\n {\n icon: warningTimerIcon,\n title: 'O cronômetro liga na hora',\n description:\n 'Assim que clicar em começar, o tempo já corre e não para, mesmo se fechar o navegador.',\n },\n {\n icon: warningIrreversibleIcon,\n title: 'Não tem como desfazer',\n description:\n 'Iniciar fora do horário estabelecido pelo seu professor em sala de aula pode atrapalhar seu resultado!',\n },\n];\n\n/** Flag shown next to each language, as in the design. */\nconst LANGUAGE_FLAGS: Record<EnemClassroomLanguage, string> = {\n [ENEM_CLASSROOM_LANGUAGE.INGLES]: flagEnglish,\n [ENEM_CLASSROOM_LANGUAGE.ESPANHOL]: flagSpanish,\n};\n\n/**\n * Illustration of each survey step, in the order the steps are asked: the\n * course question, then the university one.\n *\n * Fixed here rather than sent by the backoffice, so it is keyed by position —\n * reordering the questions there moves the illustration with the position,\n * not with the question. A question past the end simply gets none.\n */\nconst SURVEY_ILLUSTRATIONS = [\n surveyCourseIllustration,\n surveyUniversityIllustration,\n] as const;\n\n/**\n * The white card the warnings and the options sit on. Same vocabulary as\n * SelectionButton, so the modal reads like the rest of the design system\n * against the modal's `secondary-50` background.\n */\nconst CARD_CLASSES =\n 'rounded-xl border border-border-50 bg-background shadow-soft-shadow-1';\n\n/**\n * Gradiente da identidade da simulação em sala de aula — os mesmos tons do\n * card do painel do aluno. Não sai dos tokens de tema porque é a marca da\n * prova, não a da instituição.\n *\n * Literal, e não `bg-gradient-to-r from-… to-…`: o Tailwind v4 interpola\n * `in oklab`, o que muda os tons do meio em relação ao sRGB do design.\n *\n * `border-0` porque o `solid/primary` do Button traz `border-primary-950`, que\n * o gradiente não cobre — ele só troca o fundo. Zerar a largura, em vez de\n * pintar a borda de transparente, também neutraliza as cores de hover e\n * active, que voltariam a aparecer.\n */\nconst GRADIENT_CTA_CLASSES =\n 'bg-[linear-gradient(270deg,#B21FF6_0%,#F95493_100%)] border-0 hover:opacity-90 transition-opacity';\n\n/**\n * One selectable option: a card carrying an optional icon and a label.\n *\n * The radio control itself is visually hidden — in the design the card's own\n * border carries the selection. The native input stays in the tree so the\n * options remain a real radio group: arrow keys move between them and screen\n * readers announce \"1 of 2\", which a set of toggle buttons would not.\n */\nconst OptionCard = ({\n name,\n value,\n label,\n iconSrc,\n checked,\n onSelect,\n testId,\n}: {\n name: string;\n value: string;\n label: string;\n iconSrc?: string;\n checked: boolean;\n onSelect: () => void;\n testId?: string;\n}) => (\n <label\n className={cn(\n CARD_CLASSES,\n // `relative` keeps the `sr-only` radio inside the card; see CheckBox\n 'relative flex flex-row items-center gap-3 px-4 py-3.5',\n 'cursor-pointer transition-colors hover:bg-background-100',\n 'focus-within:ring-2 focus-within:ring-indicator-info',\n checked && 'border-primary-700 ring-1 ring-primary-700'\n )}\n >\n <input\n type=\"radio\"\n name={name}\n value={value}\n checked={checked}\n onChange={onSelect}\n className=\"sr-only\"\n data-testid={testId}\n />\n {iconSrc && (\n <img src={iconSrc} alt=\"\" aria-hidden className=\"w-6 h-6 flex-shrink-0\" />\n )}\n <Text size=\"sm\" weight=\"semibold\" className=\"text-text-900\">\n {label}\n </Text>\n </label>\n);\n\n/**\n * How a survey question was answered. The student either writes an answer or\n * ticks \"ainda estou pensando\" — the tick clears and disables the field, so\n * the two never disagree.\n */\ninterface SurveyAnswerDraft {\n skipped: boolean;\n text: string;\n}\n\n/**\n * One line of the summary: the step's name over what the student answered.\n */\nconst SummaryRow = ({ label, value }: { label: string; value: string }) => (\n <div className=\"flex flex-col rounded-lg bg-primary-50 px-3 py-2\">\n <Text as=\"dt\" size=\"sm\" weight=\"bold\" className=\"text-primary-800\">\n {label}\n </Text>\n <Text as=\"dd\" size=\"sm\" className=\"text-text-600\">\n {value}\n </Text>\n </div>\n);\n\n/** The introduction is always first; the first choice comes right after it. */\nconst INTRO_STEP = 0;\nconst FIRST_CHOICE_STEP = 1;\n\n/** One screen of the flow. Which ones exist depends on the exam. */\ntype FlowStep =\n | { kind: 'intro' }\n | { kind: 'language' }\n | { kind: 'survey'; question: EnemClassroomSurveyQuestion; index: number }\n | { kind: 'summary' };\n\nexport interface EnemClassroomStartModalProps {\n isOpen: boolean;\n onClose: () => void;\n exam: EnemClassroomExam;\n /** Called with everything the start endpoint needs. */\n onStart: (payload: EnemClassroomStartPayload) => void;\n /** Disables the final button while the start request is in flight. */\n isStarting?: boolean;\n}\n\n/**\n * Whether a survey draft is complete: skipped, or answered with some text.\n */\nconst isSurveyAnswerComplete = (draft: SurveyAnswerDraft | undefined) =>\n draft?.skipped === true || (draft?.text.trim().length ?? 0) > 0;\n\n/**\n * The text shown for a survey answer on the summary screen.\n */\nconst describeSurveyAnswer = (\n question: EnemClassroomSurveyQuestion,\n draft: SurveyAnswerDraft | undefined\n) => (draft && !draft.skipped ? draft.text.trim() : question.skipLabel);\n\n/**\n * Start flow of the in-classroom ENEM simulation.\n *\n * Steps, in order: introduction (video + warnings), foreign language — only\n * when the exam offers the choice —, one step per survey question, and a\n * summary the student confirms before the exam opens. The stepper only lists\n * the steps that carry a choice; the summary is a screen of its own, as in\n * the design.\n *\n * Presentational: it collects the choices and hands them to `onStart`; the\n * caller talks to the API.\n *\n * @example\n * ```tsx\n * <EnemClassroomStartModal\n * isOpen={open}\n * onClose={() => setOpen(false)}\n * exam={exam}\n * onStart={(payload) => start(exam.id, payload)}\n * />\n * ```\n */\nconst EnemClassroomStartModal = ({\n isOpen,\n onClose,\n exam,\n onStart,\n isStarting = false,\n}: EnemClassroomStartModalProps) => {\n const surveyQuestions = useMemo(\n () => [...exam.surveyQuestions].sort((a, b) => a.position - b.position),\n [exam.surveyQuestions]\n );\n // The screens this exam has: no language step on an exam without the\n // choice, so the student goes from the warnings straight to the survey.\n const steps = useMemo<FlowStep[]>(\n () => [\n { kind: 'intro' },\n ...(exam.languageChoice ? [{ kind: 'language' } as const] : []),\n ...surveyQuestions.map((question, index) => ({\n kind: 'survey' as const,\n question,\n index,\n })),\n { kind: 'summary' },\n ],\n [exam.languageChoice, surveyQuestions]\n );\n const summaryStep = steps.length - 1;\n\n const [step, setStep] = useState(INTRO_STEP);\n const [language, setLanguage] = useState<EnemClassroomLanguage | null>(null);\n const [answers, setAnswers] = useState<Record<string, SurveyAnswerDraft>>({});\n\n // Every opening starts from the introduction with nothing filled in — and\n // so does a different exam handed in while the modal is open, whose steps\n // and questions are not the ones the answers were given to.\n useEffect(() => {\n if (isOpen) {\n setStep(INTRO_STEP);\n setLanguage(null);\n setAnswers({});\n }\n }, [isOpen, exam.id]);\n\n const stepperSteps = useMemo(\n () =>\n steps\n .filter((flowStep) => flowStep.kind !== 'summary')\n .map((flowStep) => {\n if (flowStep.kind === 'intro') {\n return {\n id: 'intro',\n label: 'Introdução',\n state: 'pending' as const,\n };\n }\n if (flowStep.kind === 'language') {\n return {\n id: 'language',\n label: 'Língua estrangeira',\n state: 'pending' as const,\n };\n }\n return {\n id: flowStep.question.id,\n label: flowStep.question.stepLabel,\n state: 'pending' as const,\n };\n }),\n [steps]\n );\n\n const currentStep = steps[step] ?? steps[INTRO_STEP];\n const currentQuestion =\n currentStep.kind === 'survey' ? currentStep.question : null;\n\n const canGoNext =\n currentStep.kind === 'language'\n ? language !== null\n : currentQuestion !== null &&\n isSurveyAnswerComplete(answers[currentQuestion.id]);\n\n const updateAnswer = useCallback(\n (questionId: string, patch: Partial<SurveyAnswerDraft>) => {\n setAnswers((prev) => {\n const current = prev[questionId] ?? { skipped: false, text: '' };\n return { ...prev, [questionId]: { ...current, ...patch } };\n });\n },\n []\n );\n\n const handleStart = useCallback(() => {\n // The language is only a choice on an exam that offers one.\n if (exam.languageChoice && !language) return;\n onStart({\n language: exam.languageChoice ? language : null,\n surveyAnswers: surveyQuestions.map((question) => {\n const draft = answers[question.id];\n const text = draft && !draft.skipped ? draft.text.trim() : '';\n return { questionId: question.id, answer: text || null };\n }),\n });\n }, [exam.languageChoice, language, surveyQuestions, answers, onStart]);\n\n const renderIntroStep = () => (\n <div className=\"flex flex-col gap-6\" data-testid=\"enem-classroom-intro\">\n {exam.videoUrl && (\n <Text\n size=\"md\"\n weight=\"semibold\"\n className=\"text-text-950\"\n data-testid=\"enem-classroom-intro-video-text\"\n >\n {exam.studentTexts.introVideoText}\n </Text>\n )}\n {exam.videoUrl && (\n <VideoPlayer\n src={exam.videoUrl}\n title={exam.title}\n // O desenho mostra só o vídeo: o nome da prova já está no título do\n // modal. O `title` fica para rotular o player nos leitores de tela.\n hideHeader\n className=\"w-full rounded-xl overflow-hidden\"\n autoSave={false}\n />\n )}\n\n <div className=\"flex flex-col gap-4\">\n <Text size=\"lg\" weight=\"bold\" className=\"text-text-950\">\n {exam.studentTexts.introHeading}\n </Text>\n {buildIntroWarnings(exam.studentTexts).map(\n ({ icon, title, description }) => (\n <div\n key={title}\n className={cn(\n CARD_CLASSES,\n 'flex flex-row gap-4 items-start p-4'\n )}\n >\n <img\n src={icon}\n alt=\"\"\n aria-hidden\n className=\"flex-shrink-0 w-10 h-10\"\n />\n <div className=\"flex flex-col gap-1\">\n <Text size=\"md\" weight=\"bold\" className=\"text-text-950\">\n {title}\n </Text>\n <Text size=\"sm\" className=\"text-text-600\">\n {description}\n </Text>\n </div>\n </div>\n )\n )}\n </div>\n </div>\n );\n\n const renderLanguageStep = () => (\n <div className=\"flex flex-col gap-4\" data-testid=\"enem-classroom-language\">\n <Text\n id=\"enem-classroom-language-prompt\"\n size=\"lg\"\n weight=\"bold\"\n className=\"text-text-950\"\n >\n Qual língua estrangeira você vai usar na simulação?\n </Text>\n <div\n role=\"radiogroup\"\n aria-labelledby=\"enem-classroom-language-prompt\"\n className=\"flex flex-col gap-4\"\n >\n {Object.values(ENEM_CLASSROOM_LANGUAGE).map((value) => (\n <OptionCard\n key={value}\n name=\"enem-classroom-language\"\n value={value}\n label={ENEM_CLASSROOM_LANGUAGE_LABELS[value]}\n iconSrc={LANGUAGE_FLAGS[value]}\n checked={language === value}\n onSelect={() => setLanguage(value)}\n testId={`enem-classroom-language-${value.toLowerCase()}`}\n />\n ))}\n </div>\n </div>\n );\n\n const renderSurveyStep = (\n question: EnemClassroomSurveyQuestion,\n index: number\n ) => {\n const draft = answers[question.id];\n const illustration = SURVEY_ILLUSTRATIONS[index];\n // The two ways of answering disable each other, so they can never\n // contradict — and either one on its own releases the step.\n const hasText = (draft?.text.trim().length ?? 0) > 0;\n const isSkipped = draft?.skipped === true;\n return (\n <div\n className=\"flex flex-col gap-4\"\n data-testid={`enem-classroom-survey-${question.id}`}\n >\n {illustration && (\n <img\n src={illustration}\n alt=\"\"\n aria-hidden\n className=\"w-[220px] max-w-full self-center\"\n data-testid=\"enem-classroom-survey-illustration\"\n />\n )}\n <Text\n id={`enem-classroom-survey-prompt-${question.id}`}\n size=\"lg\"\n weight=\"bold\"\n className=\"text-text-950\"\n >\n {question.prompt}\n </Text>\n <div className=\"flex flex-col gap-2\">\n <Text\n as=\"label\"\n htmlFor={`enem-classroom-survey-input-${question.id}`}\n size=\"sm\"\n className=\"text-text-600\"\n >\n {question.inputLabel}\n </Text>\n <Input\n id={`enem-classroom-survey-input-${question.id}`}\n variant=\"rounded\"\n placeholder={question.inputPlaceholder}\n value={draft?.text ?? ''}\n maxLength={255}\n disabled={isSkipped}\n onChange={(event: ChangeEvent<HTMLInputElement>) =>\n updateAnswer(question.id, { text: event.target.value })\n }\n data-testid=\"enem-classroom-survey-input\"\n />\n </div>\n\n <CheckBox\n label={question.skipLabel}\n checked={isSkipped}\n disabled={hasText}\n onChange={(event: ChangeEvent<HTMLInputElement>) =>\n updateAnswer(question.id, { skipped: event.target.checked })\n }\n data-testid=\"enem-classroom-survey-skip\"\n />\n </div>\n );\n };\n\n const renderSummaryStep = () => (\n <div\n className=\"flex flex-col items-center gap-6 text-center\"\n data-testid=\"enem-classroom-summary\"\n >\n <span className=\"flex items-center justify-center w-14 h-14 rounded-full bg-success-200 text-success-950\">\n <CheckIcon size={24} aria-hidden />\n </span>\n <div className=\"flex flex-col gap-2\">\n <Text size=\"xl\" weight=\"bold\" className=\"text-text-950\">\n Boa sorte!\n </Text>\n <Text size=\"sm\" className=\"text-text-600\">\n O seu simulado ENEM já vai começar e o cronômetro vai iniciar. Respire\n fundo e dê o seu melhor!\n </Text>\n </div>\n\n <div\n className={cn(CARD_CLASSES, 'flex flex-col gap-3 w-full text-left p-4')}\n >\n <Text size=\"sm\" weight=\"bold\" className=\"text-text-950\">\n Suas respostas\n </Text>\n <dl className=\"flex flex-col gap-2\">\n {exam.languageChoice && (\n <SummaryRow\n label=\"Idioma\"\n value={language ? ENEM_CLASSROOM_LANGUAGE_LABELS[language] : '—'}\n />\n )}\n {surveyQuestions.map((question) => (\n <SummaryRow\n key={question.id}\n label={question.stepLabel}\n value={describeSurveyAnswer(question, answers[question.id])}\n />\n ))}\n </dl>\n <Button\n size=\"medium\"\n variant=\"outline\"\n action=\"primary\"\n className=\"self-center\"\n disabled={isStarting}\n onClick={() => setStep(FIRST_CHOICE_STEP)}\n data-testid=\"enem-classroom-review\"\n >\n Revisar minhas respostas\n </Button>\n </div>\n </div>\n );\n\n const renderStepContent = () => {\n if (currentStep.kind === 'intro') return renderIntroStep();\n if (currentStep.kind === 'language') return renderLanguageStep();\n if (currentStep.kind === 'survey')\n return renderSurveyStep(currentStep.question, currentStep.index);\n return renderSummaryStep();\n };\n\n const showNavigation = step >= FIRST_CHOICE_STEP && step < summaryStep;\n const showStepper = step < summaryStep;\n\n /*\n * O rodapé do Modal não rola, e é lá que o desenho quer o botão: na\n * introdução ele leva o CTA; nos passos de escolha, a navegação.\n */\n /**\n * O rodapé do Modal não rola, e é onde o desenho quer o botão de cada passo:\n * o CTA na introdução, a navegação nos passos de escolha e o de iniciar no\n * resumo. O \"Revisar minhas respostas\" fica de fora de propósito — ele mora\n * dentro do card de respostas.\n * @returns O rodapé do passo atual, ou nada quando ele não tem botão\n */\n const renderFooter = () => {\n if (currentStep.kind === 'intro') {\n return (\n <Button\n size=\"large\"\n variant=\"solid\"\n action=\"primary\"\n className={cn('w-full', GRADIENT_CTA_CLASSES)}\n onClick={() => setStep(FIRST_CHOICE_STEP)}\n data-testid=\"enem-classroom-intro-continue\"\n >\n Estou em sala. Quero começar!\n </Button>\n );\n }\n\n if (currentStep.kind === 'summary') {\n return (\n <Button\n size=\"large\"\n variant=\"solid\"\n action=\"primary\"\n className={cn('w-full', GRADIENT_CTA_CLASSES)}\n disabled={isStarting}\n onClick={handleStart}\n data-testid=\"enem-classroom-start\"\n >\n Iniciar a prova!\n </Button>\n );\n }\n\n return showNavigation ? (\n <div className=\"flex flex-row justify-end gap-2 w-full\">\n <Button\n size=\"medium\"\n variant=\"outline\"\n action=\"primary\"\n iconLeft={<CaretLeftIcon size={16} aria-hidden />}\n onClick={() => setStep((current) => current - 1)}\n data-testid=\"enem-classroom-previous\"\n >\n Anterior\n </Button>\n <Button\n size=\"medium\"\n variant=\"solid\"\n action=\"primary\"\n iconRight={<CaretRightIcon size={16} aria-hidden />}\n disabled={!canGoNext}\n onClick={() => setStep((current) => current + 1)}\n data-testid=\"enem-classroom-next\"\n >\n Próximo\n </Button>\n </div>\n ) : undefined;\n };\n\n return (\n <Modal\n isOpen={isOpen}\n onClose={onClose}\n /*\n * A tela de resumo abre com o header vazio, só o X — quem dá o título\n * ali é o \"Boa sorte!\". O texto continua no <h2>, apenas oculto: o\n * `aria-labelledby` do Modal aponta pra ele, e um h2 vazio deixaria o\n * dialog sem nome acessível.\n */\n title={\n showStepper ? exam.title : <span className=\"sr-only\">{exam.title}</span>\n }\n size=\"lg\"\n footer={renderFooter()}\n /*\n * A rolagem sai do Modal e vai para o miolo: título e stepper ficam\n * parados em cima, o rodapé embaixo, e só o conteúdo entre eles corre.\n */\n contentClassName=\"flex flex-col overflow-hidden\"\n >\n <div className=\"flex flex-col gap-6 flex-1 min-h-0\">\n {showStepper && (\n <Stepper\n steps={stepperSteps}\n currentStep={step}\n size=\"small\"\n className=\"flex-none\"\n />\n )}\n <div className=\"flex-1 min-h-0 overflow-y-auto\">\n {renderStepContent()}\n </div>\n </div>\n </Modal>\n );\n};\n\nexport default EnemClassroomStartModal;\n"]}
@@ -3,7 +3,7 @@ import {
3
3
  DropdownMenuItem,
4
4
  DropdownMenu_default,
5
5
  createDropdownStore
6
- } from "./chunk-HCQJR5CE.mjs";
6
+ } from "./chunk-7ZWEBNFB.mjs";
7
7
  import {
8
8
  cn
9
9
  } from "./chunk-53ICLDGS.mjs";
@@ -318,4 +318,4 @@ export {
318
318
  getResultsMessage,
319
319
  Search_default
320
320
  };
321
- //# sourceMappingURL=chunk-JCA76TCX.mjs.map
321
+ //# sourceMappingURL=chunk-SZKLJOTN.mjs.map
@@ -20,7 +20,7 @@ var _chunkGGSJH7MZjs = require('./chunk-GGSJH7MZ.js');
20
20
  var _chunkVRXURXVMjs = require('./chunk-VRXURXVM.js');
21
21
 
22
22
 
23
- var _chunk23PAYKWBjs = require('./chunk-23PAYKWB.js');
23
+ var _chunkKM27ZDHZjs = require('./chunk-KM27ZDHZ.js');
24
24
 
25
25
 
26
26
  var _chunkXN2HPVVHjs = require('./chunk-XN2HPVVH.js');
@@ -393,7 +393,7 @@ var StudentLessonProgressModal = ({
393
393
  return null;
394
394
  }
395
395
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
396
- _chunk23PAYKWBjs.Modal_default,
396
+ _chunkKM27ZDHZjs.Modal_default,
397
397
  {
398
398
  isOpen,
399
399
  onClose,
@@ -410,4 +410,4 @@ var StudentLessonProgressModal_default = StudentLessonProgressModal;
410
410
 
411
411
 
412
412
  exports.StudentLessonProgressModal = StudentLessonProgressModal; exports.StudentLessonProgressModal_default = StudentLessonProgressModal_default;
413
- //# sourceMappingURL=chunk-F5WR6XZZ.js.map
413
+ //# sourceMappingURL=chunk-T73HPYF2.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-F5WR6XZZ.js","../src/components/StudentLessonProgressModal/StudentLessonProgressModal.tsx","../src/components/StudentLessonProgressModal/lessonProgress.ts"],"names":[],"mappings":"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","file":"/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-F5WR6XZZ.js","sourcesContent":[null,"import { useMemo, useState, type ReactNode } from 'react';\nimport { XCircleIcon } from '@phosphor-icons/react/dist/csr/XCircle';\nimport { MedalIcon } from '@phosphor-icons/react/dist/csr/Medal';\nimport { SealWarningIcon } from '@phosphor-icons/react/dist/csr/SealWarning';\nimport { CaretRightIcon } from '@phosphor-icons/react/dist/csr/CaretRight';\nimport Modal from '../Modal/Modal';\nimport Text from '../Text/Text';\nimport Button from '../Button/Button';\nimport ProgressBar from '../ProgressBar/ProgressBar';\nimport ProgressCircle from '../ProgressCircle/ProgressCircle';\nimport { CardActivitiesResults } from '../Card/Card';\nimport { UserIcon } from '../UserIcon/UserIcon';\nimport {\n Skeleton,\n SkeletonCircle,\n SkeletonRounded,\n} from '../Skeleton/Skeleton';\nimport type {\n StudentLessonProgressModalProps,\n StudentLessonProgressData,\n StudentLessonProgressLabels,\n TopicProgressItem,\n SubtopicProgressItem,\n ContentProgressItem,\n} from './types';\nimport { DEFAULT_LESSON_PROGRESS_LABELS } from './types';\nimport { hasContentData, roundProgress } from './lessonProgress';\nimport { cn } from '../../utils/utils';\n\n/**\n * Value line of the two highlight cards: 20px as designed, wrapping onto a\n * second line instead of being cut — a topic name is what the teacher came\n * to read, so an ellipsis would hide the point of the card.\n */\nconst HIGHLIGHT_VALUE_CLASS =\n 'text-xl leading-6 whitespace-normal text-clip line-clamp-2';\n\n/**\n * Body of an expandable row.\n *\n * Animates through `grid-template-rows` (0fr → 1fr), so the open height is the\n * content's own — a `max-h` cap would clip a long list of lessons behind\n * `overflow-hidden` with no way to reach the rest. While collapsed it is both\n * hidden from assistive technology and `inert`: the subtopic buttons inside a\n * topic stay mounted, and `aria-hidden` alone would leave them focusable.\n */\nconst Collapsible = ({\n expanded,\n testId,\n children,\n}: {\n expanded: boolean;\n testId: string;\n children: ReactNode;\n}) => (\n <div\n data-testid={testId}\n data-expanded={expanded}\n aria-hidden={!expanded}\n inert={!expanded}\n className={cn(\n 'grid transition-[grid-template-rows,opacity] duration-300 ease-in-out',\n expanded ? 'grid-rows-[1fr] opacity-100' : 'grid-rows-[0fr] opacity-0'\n )}\n >\n <div className=\"min-h-0 overflow-hidden\">{children}</div>\n </div>\n);\n\n/** Caret of an expandable row, turned down while it is open. */\nconst Caret = ({ expanded }: { expanded: boolean }) => (\n <CaretRightIcon\n size={18}\n className={cn(\n 'shrink-0 text-text-950 transition-transform duration-200',\n expanded ? 'rotate-90' : 'rotate-0'\n )}\n // Decorativo: o estado aberto/fechado já sai em `aria-expanded`.\n aria-hidden=\"true\"\n />\n);\n\n/**\n * Header of a row that may or may not expand. With children it is a toggle\n * `Button` exposing `aria-expanded`; without them it is a plain `div`.\n *\n * Um botão desabilitado sem filhos aparecia ao leitor de tela como controle\n * indisponível, sem nada a fazer — e saía da ordem de Tab de um jeito que\n * parecia defeito. Uma linha que não abre não é controle.\n */\nconst RowHeader = ({\n hasChildren,\n expanded,\n onToggle,\n className,\n children,\n}: {\n hasChildren: boolean;\n expanded: boolean;\n onToggle: () => void;\n className: string;\n children: ReactNode;\n}) => {\n if (!hasChildren) {\n return <div className={cn(className, 'cursor-default')}>{children}</div>;\n }\n\n return (\n <Button\n variant=\"raw\"\n type=\"button\"\n onClick={onToggle}\n className={cn(\n className,\n 'cursor-pointer focus:outline-none focus:ring-2 focus:ring-inset focus:ring-primary-950'\n )}\n aria-expanded={expanded}\n >\n {children}\n </Button>\n );\n};\n\n/** Percentage at the end of a row, rounded as every level draws it. */\nconst ProgressPercent = ({\n progress,\n className,\n}: {\n progress: number;\n className: string;\n}) => (\n <Text\n as=\"span\"\n size=\"xs\"\n weight=\"semibold\"\n className={cn('shrink-0 text-center', className)}\n >\n {roundProgress(progress)}%\n </Text>\n);\n\n/** Row of one lesson (content), the deepest level of the list. */\nconst ContentRow = ({\n item,\n noDataMessage,\n}: {\n item: ContentProgressItem;\n noDataMessage: string;\n}) => (\n <div className=\"flex items-center gap-4 border-t border-border-200 px-4 py-3\">\n <Text size=\"sm\" weight=\"medium\" className=\"min-w-0 flex-1 text-text-950\">\n {item.content.name}\n </Text>\n {hasContentData(item) ? (\n <ProgressPercent progress={item.progress} className=\"text-text-600\" />\n ) : (\n <Text size=\"xs\" className=\"shrink-0 text-text-500\">\n {noDataMessage}\n </Text>\n )}\n </div>\n);\n\n/**\n * Bordered card of one subtopic; its lessons list inside it, one row each,\n * once it is expanded.\n */\nconst SubtopicCard = ({\n item,\n noDataMessage,\n}: {\n item: SubtopicProgressItem;\n noDataMessage: string;\n}) => {\n const [isExpanded, setIsExpanded] = useState(false);\n const hasChildren = item.contents.length > 0;\n const hasNoData = item.status === 'no_data';\n\n return (\n <div className=\"flex flex-col rounded-xl border border-border-200 bg-background\">\n <RowHeader\n hasChildren={hasChildren}\n expanded={isExpanded}\n onToggle={() => setIsExpanded(!isExpanded)}\n className=\"flex w-full items-center gap-4 rounded-xl p-4 text-left\"\n >\n {/* `Text as=\"span\"` e não `p`: dentro de um botão só cabe conteúdo\n de frase. */}\n <Text\n as=\"span\"\n size=\"sm\"\n weight=\"bold\"\n className=\"block min-w-0 flex-1 text-text-950\"\n >\n {item.subtopic.name}\n </Text>\n {hasNoData ? (\n <Text as=\"span\" size=\"xs\" className=\"block shrink-0 text-text-500\">\n {noDataMessage}\n </Text>\n ) : (\n <ProgressPercent progress={item.progress} className=\"text-text-600\" />\n )}\n {hasChildren && <Caret expanded={isExpanded} />}\n </RowHeader>\n\n {hasChildren && (\n <Collapsible\n expanded={isExpanded}\n testId={`accordion-content-subtopic-${item.subtopic.id}`}\n >\n {item.contents.map((content) => (\n <ContentRow\n key={content.content.id}\n item={content}\n noDataMessage={noDataMessage}\n />\n ))}\n </Collapsible>\n )}\n </div>\n );\n};\n\n/**\n * Card of one topic: bold name, then a green bar with its percentage — or the\n * no-data message when nothing was measured yet. Its subtopic cards render\n * inside the card, under the header, once it is expanded.\n */\nconst TopicCard = ({\n item,\n noDataMessage,\n}: {\n item: TopicProgressItem;\n noDataMessage: string;\n}) => {\n const [isExpanded, setIsExpanded] = useState(false);\n const hasChildren = item.subtopics.length > 0;\n const hasNoData = item.status === 'no_data';\n\n return (\n <div\n data-testid={`lesson-item-${item.topic.id}`}\n className=\"flex flex-col rounded-xl bg-background\"\n >\n <RowHeader\n hasChildren={hasChildren}\n expanded={isExpanded}\n onToggle={() => setIsExpanded(!isExpanded)}\n className=\"flex w-full items-center gap-2 rounded-xl p-4 text-left\"\n >\n <div className=\"flex min-w-0 flex-1 flex-col gap-2\">\n <Text\n as=\"span\"\n size=\"lg\"\n weight=\"bold\"\n className=\"block text-text-950\"\n >\n {item.topic.name}\n </Text>\n {hasNoData ? (\n <Text as=\"span\" size=\"xs\" className=\"block text-text-500\">\n {noDataMessage}\n </Text>\n ) : (\n <div className=\"flex items-center gap-2\">\n {/* Barra só visual: dentro do botão o `<progress>` vira ruído no\n nome acessível, e o percentual ao lado já diz o valor. */}\n <div className=\"flex-1\" aria-hidden=\"true\">\n <ProgressBar\n value={item.progress}\n variant=\"green\"\n size=\"medium\"\n />\n </div>\n <ProgressPercent\n progress={item.progress}\n className=\"text-text-950\"\n />\n </div>\n )}\n </div>\n {hasChildren && <Caret expanded={isExpanded} />}\n </RowHeader>\n\n {hasChildren && (\n <Collapsible\n expanded={isExpanded}\n testId={`accordion-content-${item.topic.id}`}\n >\n <div className=\"flex flex-col gap-2 px-4 pb-4\">\n {item.subtopics.map((subtopic) => (\n <SubtopicCard\n key={subtopic.subtopic.id}\n item={subtopic}\n noDataMessage={noDataMessage}\n />\n ))}\n </div>\n </Collapsible>\n )}\n </div>\n );\n};\n\n/**\n * Loading skeleton for the modal content\n */\nconst LoadingSkeleton = () => (\n // `<output>` (região viva nativa) com texto `sr-only`: os skeletons são só\n // visuais.\n <div data-testid=\"lesson-progress-skeleton\" className=\"flex flex-col gap-4\">\n <output className=\"sr-only\">Carregando progresso do estudante...</output>\n <Skeleton variant=\"text\" width=\"12rem\" height={24} />\n <div className=\"flex flex-row gap-3\">\n <SkeletonCircle width={107} height={107} />\n <SkeletonRounded className=\"flex-1\" height={107} />\n <SkeletonRounded className=\"flex-1\" height={107} />\n </div>\n <Skeleton variant=\"text\" width=\"9rem\" height={24} className=\"mt-4\" />\n <div className=\"flex flex-col gap-2\">\n <SkeletonRounded height={80} />\n <SkeletonRounded height={80} />\n <SkeletonRounded height={80} />\n </div>\n </div>\n);\n\n/**\n * Error state component\n */\nconst ErrorContent = ({\n message,\n prefix,\n}: {\n message: string;\n prefix?: string;\n}) => (\n // `role=\"alert\"`: a falha substitui o conteúdo e precisa ser anunciada.\n <div\n className=\"flex flex-col items-center justify-center py-8 gap-3\"\n role=\"alert\"\n >\n <Text\n as=\"span\"\n className=\"size-12 rounded-full bg-error-100 flex items-center justify-center\"\n >\n <XCircleIcon\n size={24}\n className=\"text-error-700\"\n weight=\"fill\"\n aria-hidden=\"true\"\n />\n </Text>\n <Text size=\"md\" className=\"text-error-700 text-center\">\n {prefix ? `${prefix}: ${message}` : message}\n </Text>\n </div>\n);\n\n/**\n * Progress content when data is available\n */\nconst ProgressContent = ({\n data,\n labels,\n}: {\n data: StudentLessonProgressData;\n labels: StudentLessonProgressLabels;\n}) => (\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex items-center gap-2 pt-2\">\n <UserIcon size={24} className=\"shrink-0\" />\n <Text size=\"md\" className=\"text-text-950\">\n {data.name}\n </Text>\n </div>\n\n <div className=\"grid grid-cols-3 gap-2\">\n <div className=\"flex items-center justify-center rounded-xl border border-border-100 bg-background p-2\">\n <ProgressCircle\n value={data.overallCompletionRate}\n variant=\"green\"\n size=\"small\"\n label={labels.completionRateLabel}\n showPercentage\n />\n </div>\n\n <CardActivitiesResults\n icon={\n <MedalIcon\n size={16}\n weight=\"regular\"\n className=\"text-text-950\"\n aria-hidden=\"true\"\n />\n }\n title={labels.bestResultLabel}\n subTitle={data.bestResult || '-'}\n subTitleClassName={HIGHLIGHT_VALUE_CLASS}\n header=\"\"\n action=\"success\"\n />\n\n <CardActivitiesResults\n icon={\n <SealWarningIcon\n size={16}\n weight=\"regular\"\n className=\"text-white\"\n aria-hidden=\"true\"\n />\n }\n title={labels.biggestDifficultyLabel}\n subTitle={data.biggestDifficulty || '-'}\n subTitleClassName={HIGHLIGHT_VALUE_CLASS}\n header=\"\"\n action=\"error\"\n />\n </div>\n\n {data.lessonProgress.length > 0 && (\n <div className=\"flex flex-col gap-4 pt-4\">\n {/* Título de seção dentro do modal: `h3`, abaixo do `h2` do título. */}\n <Text as=\"h3\" size=\"lg\" weight=\"bold\" className=\"text-text-950\">\n {labels.lessonProgressTitle}\n </Text>\n <div className=\"flex flex-col gap-2\">\n {data.lessonProgress.map((topic) => (\n <TopicCard\n key={topic.topic.id}\n item={topic}\n noDataMessage={labels.noDataMessage}\n />\n ))}\n </div>\n </div>\n )}\n </div>\n);\n\n/**\n * Renders the modal content based on loading, error, and data state\n */\nconst renderModalContent = (\n loading: boolean,\n error: string | null | undefined,\n data: StudentLessonProgressData | null,\n labels: StudentLessonProgressLabels\n): ReactNode => {\n if (loading) {\n return <LoadingSkeleton />;\n }\n\n if (error) {\n return <ErrorContent message={error} prefix={labels.errorMessagePrefix} />;\n }\n\n if (data) {\n return <ProgressContent data={data} labels={labels} />;\n }\n\n return null;\n};\n\n/**\n * StudentLessonProgressModal component\n *\n * Displays a modal with student lesson progress information including:\n * - Student name with profile icon\n * - Completion rate circle\n * - Best result and biggest difficulty highlight cards\n * - Expandable nested list of lesson progress: topic → subtopic → lesson,\n * with the topics of every requested subject in one trail-ordered list\n *\n * Without data, loading or error the component renders nothing.\n */\nexport const StudentLessonProgressModal = ({\n isOpen,\n onClose,\n data,\n loading = false,\n error = null,\n labels: customLabels,\n}: StudentLessonProgressModalProps) => {\n const labels = useMemo(\n () => ({ ...DEFAULT_LESSON_PROGRESS_LABELS, ...customLabels }),\n [customLabels]\n );\n\n const content = renderModalContent(loading, error, data, labels);\n\n if (!content) {\n return null;\n }\n\n return (\n <Modal\n isOpen={isOpen}\n onClose={onClose}\n title={labels.title}\n size=\"lg\"\n contentClassName=\"max-h-[80vh] overflow-y-auto\"\n >\n {content}\n </Modal>\n );\n};\n\nexport default StudentLessonProgressModal;\n","import type { ContentProgressItem } from './types';\n\n/**\n * Reading rules of the accordion rows. Pure, no React.\n */\n\n/**\n * Whether a lesson has progress to show.\n *\n * The deepest level decides differently from the two above it: topic and\n * subtopic carry a `status`, while `ContentProgressItem` only has `progress`\n * and `isCompleted`, so \"no data\" is inferred from zero progress on a lesson\n * not completed. `isCompleted` matters because a completed lesson with zero\n * progress exists in the type, and for it the row shows \"0%\", not the\n * no-data message.\n */\nexport const hasContentData = (item: ContentProgressItem): boolean =>\n item.progress !== 0 || item.isCompleted;\n\n/**\n * Rounding of the percentage, as every level of the accordion draws it.\n */\nexport const roundProgress = (progress: number): number => Math.round(progress);\n"]}
1
+ {"version":3,"sources":["/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-T73HPYF2.js","../src/components/StudentLessonProgressModal/StudentLessonProgressModal.tsx","../src/components/StudentLessonProgressModal/lessonProgress.ts"],"names":[],"mappings":"AAAA;AACE;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACE;AACA;AACA;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACA;ACjCA,8BAAkD;AAClD,iEAA4B;AAC5B,6DAA0B;AAC1B,yEAAgC;AAChC,uEAA+B;ADmC/B;AACA;AExBO,IAAM,eAAA,EAAiB,CAAC,IAAA,EAAA,GAC7B,IAAA,CAAK,SAAA,IAAa,EAAA,GAAK,IAAA,CAAK,WAAA;AAKvB,IAAM,cAAA,EAAgB,CAAC,QAAA,EAAA,GAA6B,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AFqB9E;AACA;ACqBI,+CAAA;AA/BJ,IAAM,sBAAA,EACJ,4DAAA;AAWF,IAAM,YAAA,EAAc,CAAC;AAAA,EACnB,QAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EAAA,mBAKE,6BAAA;AAAA,EAAC,KAAA;AAAA,EAAA;AAAA,IACC,aAAA,EAAa,MAAA;AAAA,IACb,eAAA,EAAe,QAAA;AAAA,IACf,aAAA,EAAa,CAAC,QAAA;AAAA,IACd,KAAA,EAAO,CAAC,QAAA;AAAA,IACR,SAAA,EAAW,iCAAA;AAAA,MACT,uEAAA;AAAA,MACA,SAAA,EAAW,8BAAA,EAAgC;AAAA,IAC7C,CAAA;AAAA,IAEA,QAAA,kBAAA,6BAAA,KAAC,EAAA,EAAI,SAAA,EAAU,yBAAA,EAA2B,SAAA,CAAS;AAAA,EAAA;AACrD,CAAA;AAIF,IAAM,MAAA,EAAQ,CAAC,EAAE,SAAS,CAAA,EAAA,mBACxB,6BAAA;AAAA,EAAC,0BAAA;AAAA,EAAA;AAAA,IACC,IAAA,EAAM,EAAA;AAAA,IACN,SAAA,EAAW,iCAAA;AAAA,MACT,0DAAA;AAAA,MACA,SAAA,EAAW,YAAA,EAAc;AAAA,IAC3B,CAAA;AAAA,IAEA,aAAA,EAAY;AAAA,EAAA;AACd,CAAA;AAWF,IAAM,UAAA,EAAY,CAAC;AAAA,EACjB,WAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAAA,GAMM;AACJ,EAAA,GAAA,CAAI,CAAC,WAAA,EAAa;AAChB,IAAA,uBAAO,6BAAA,KAAC,EAAA,EAAI,SAAA,EAAW,iCAAA,SAAG,EAAW,gBAAgB,CAAA,EAAI,SAAA,CAAS,CAAA;AAAA,EACpE;AAEA,EAAA,uBACE,6BAAA;AAAA,IAAC,+BAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAK,QAAA;AAAA,MACL,OAAA,EAAS,QAAA;AAAA,MACT,SAAA,EAAW,iCAAA;AAAA,QACT,SAAA;AAAA,QACA;AAAA,MACF,CAAA;AAAA,MACA,eAAA,EAAe,QAAA;AAAA,MAEd;AAAA,IAAA;AAAA,EACH,CAAA;AAEJ,CAAA;AAGA,IAAM,gBAAA,EAAkB,CAAC;AAAA,EACvB,QAAA;AAAA,EACA;AACF,CAAA,EAAA,mBAIE,8BAAA;AAAA,EAAC,6BAAA;AAAA,EAAA;AAAA,IACC,EAAA,EAAG,MAAA;AAAA,IACH,IAAA,EAAK,IAAA;AAAA,IACL,MAAA,EAAO,UAAA;AAAA,IACP,SAAA,EAAW,iCAAA,sBAAG,EAAwB,SAAS,CAAA;AAAA,IAE9C,QAAA,EAAA;AAAA,MAAA,aAAA,CAAc,QAAQ,CAAA;AAAA,MAAE;AAAA,IAAA;AAAA,EAAA;AAC3B,CAAA;AAIF,IAAM,WAAA,EAAa,CAAC;AAAA,EAClB,IAAA;AAAA,EACA;AACF,CAAA,EAAA,mBAIE,8BAAA,KAAC,EAAA,EAAI,SAAA,EAAU,8DAAA,EACb,QAAA,EAAA;AAAA,kBAAA,6BAAA,6BAAC,EAAA,EAAK,IAAA,EAAK,IAAA,EAAK,MAAA,EAAO,QAAA,EAAS,SAAA,EAAU,8BAAA,EACvC,QAAA,EAAA,IAAA,CAAK,OAAA,CAAQ,KAAA,CAChB,CAAA;AAAA,EACC,cAAA,CAAe,IAAI,EAAA,kBAClB,6BAAA,eAAC,EAAA,EAAgB,QAAA,EAAU,IAAA,CAAK,QAAA,EAAU,SAAA,EAAU,gBAAA,CAAgB,EAAA,kBAEpE,6BAAA,6BAAC,EAAA,EAAK,IAAA,EAAK,IAAA,EAAK,SAAA,EAAU,wBAAA,EACvB,QAAA,EAAA,cAAA,CACH;AAAA,EAAA,CAEJ,CAAA;AAOF,IAAM,aAAA,EAAe,CAAC;AAAA,EACpB,IAAA;AAAA,EACA;AACF,CAAA,EAAA,GAGM;AACJ,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,EAAA,EAAI,6BAAA,KAAc,CAAA;AAClD,EAAA,MAAM,YAAA,EAAc,IAAA,CAAK,QAAA,CAAS,OAAA,EAAS,CAAA;AAC3C,EAAA,MAAM,UAAA,EAAY,IAAA,CAAK,OAAA,IAAW,SAAA;AAElC,EAAA,uBACE,8BAAA,KAAC,EAAA,EAAI,SAAA,EAAU,iEAAA,EACb,QAAA,EAAA;AAAA,oBAAA,8BAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,WAAA;AAAA,QACA,QAAA,EAAU,UAAA;AAAA,QACV,QAAA,EAAU,CAAA,EAAA,GAAM,aAAA,CAAc,CAAC,UAAU,CAAA;AAAA,QACzC,SAAA,EAAU,yDAAA;AAAA,QAIV,QAAA,EAAA;AAAA,0BAAA,6BAAA;AAAA,YAAC,6BAAA;AAAA,YAAA;AAAA,cACC,EAAA,EAAG,MAAA;AAAA,cACH,IAAA,EAAK,IAAA;AAAA,cACL,MAAA,EAAO,MAAA;AAAA,cACP,SAAA,EAAU,oCAAA;AAAA,cAET,QAAA,EAAA,IAAA,CAAK,QAAA,CAAS;AAAA,YAAA;AAAA,UACjB,CAAA;AAAA,UACC,UAAA,kBACC,6BAAA,6BAAC,EAAA,EAAK,EAAA,EAAG,MAAA,EAAO,IAAA,EAAK,IAAA,EAAK,SAAA,EAAU,8BAAA,EACjC,QAAA,EAAA,cAAA,CACH,EAAA,kBAEA,6BAAA,eAAC,EAAA,EAAgB,QAAA,EAAU,IAAA,CAAK,QAAA,EAAU,SAAA,EAAU,gBAAA,CAAgB,CAAA;AAAA,UAErE,YAAA,mBAAe,6BAAA,KAAC,EAAA,EAAM,QAAA,EAAU,WAAA,CAAY;AAAA,QAAA;AAAA,MAAA;AAAA,IAC/C,CAAA;AAAA,IAEC,YAAA,mBACC,6BAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,QAAA,EAAU,UAAA;AAAA,QACV,MAAA,EAAQ,CAAA,2BAAA,EAA8B,IAAA,CAAK,QAAA,CAAS,EAAE,CAAA,CAAA;AAGpD,QAAA;AAAC,UAAA;AAAA,UAAA;AAEO,YAAA;AACN,YAAA;AAAA,UAAA;AAFqB,UAAA;AAIxB,QAAA;AAAA,MAAA;AACH,IAAA;AAEJ,EAAA;AAEJ;AAOmB;AACjB,EAAA;AACA,EAAA;AAII;AAC8C,EAAA;AACN,EAAA;AACV,EAAA;AAGhC,EAAA;AAAC,IAAA;AAAA,IAAA;AAC0C,MAAA;AAC/B,MAAA;AAEV,MAAA;AAAA,wBAAA;AAAC,UAAA;AAAA,UAAA;AACC,YAAA;AACU,YAAA;AAC+B,YAAA;AAC/B,YAAA;AAEV,YAAA;AAAe,8BAAA;AACb,gCAAA;AAAC,kBAAA;AAAA,kBAAA;AACI,oBAAA;AACE,oBAAA;AACE,oBAAA;AACG,oBAAA;AAEE,oBAAA;AAAA,kBAAA;AACd,gBAAA;AAEG,gBAAA;AAOgB,kCAAA;AACZ,oBAAA;AAAA,oBAAA;AACa,sBAAA;AACJ,sBAAA;AACH,sBAAA;AAAA,oBAAA;AAET,kBAAA;AACA,kCAAA;AAAC,oBAAA;AAAA,oBAAA;AACgB,sBAAA;AACL,sBAAA;AAAA,oBAAA;AACZ,kBAAA;AACF,gBAAA;AAEJ,cAAA;AACuB,cAAA;AAAsB,YAAA;AAAA,UAAA;AAC/C,QAAA;AAGE,QAAA;AAAC,UAAA;AAAA,UAAA;AACW,YAAA;AACgC,YAAA;AAE3B,YAAA;AAEV,cAAA;AAAA,cAAA;AAEO,gBAAA;AACN,gBAAA;AAAA,cAAA;AAFuB,cAAA;AAK7B,YAAA;AAAA,UAAA;AACF,QAAA;AAAA,MAAA;AAAA,IAAA;AAEJ,EAAA;AAEJ;AAKwB;AAAA;AAAA;AAGL,kBAAA;AACa,oBAAA;AACG,oBAAA;AAChB,oBAAA;AACe,sBAAA;AACD,sBAAA;AACA,sBAAA;AAC7B,IAAA;AAC+B,oBAAA;AAChB,oBAAA;AACgB,sBAAA;AACA,sBAAA;AACA,sBAAA;AAC/B,IAAA;AACF,EAAA;AAAA;AAMoB;AACpB,EAAA;AACA,EAAA;AACF;AAAA;AAKE,kBAAA;AAAC,IAAA;AAAA,IAAA;AACW,MAAA;AACL,MAAA;AAEL,MAAA;AAAA,wBAAA;AAAC,UAAA;AAAA,UAAA;AACI,YAAA;AACO,YAAA;AAEV,YAAA;AAAC,cAAA;AAAA,cAAA;AACO,gBAAA;AACI,gBAAA;AACH,gBAAA;AACK,gBAAA;AAAA,cAAA;AACd,YAAA;AAAA,UAAA;AACF,QAAA;AACgB,wBAAA;AAEhB,MAAA;AAAA,IAAA;AACF,EAAA;AAAA;AAMuB;AACvB,EAAA;AACA,EAAA;AAKe;AACE,kBAAA;AACiB,oBAAA;AACJ,oBAAA;AAG5B,EAAA;AAEe,kBAAA;AACE,oBAAA;AACZ,MAAA;AAAA,MAAA;AACa,QAAA;AACJ,QAAA;AACH,QAAA;AACS,QAAA;AACA,QAAA;AAAA,MAAA;AAElB,IAAA;AAEA,oBAAA;AAAC,MAAA;AAAA,MAAA;AAEG,QAAA;AAAC,UAAA;AAAA,UAAA;AACO,YAAA;AACC,YAAA;AACG,YAAA;AACE,YAAA;AAAA,UAAA;AACd,QAAA;AAEY,QAAA;AACe,QAAA;AACV,QAAA;AACZ,QAAA;AACA,QAAA;AAAA,MAAA;AACT,IAAA;AAEA,oBAAA;AAAC,MAAA;AAAA,MAAA;AAEG,QAAA;AAAC,UAAA;AAAA,UAAA;AACO,YAAA;AACC,YAAA;AACG,YAAA;AACE,YAAA;AAAA,UAAA;AACd,QAAA;AAEY,QAAA;AACsB,QAAA;AACjB,QAAA;AACZ,QAAA;AACA,QAAA;AAAA,MAAA;AACT,IAAA;AACF,EAAA;AAGG,EAAA;AAEyB,oBAAA;AAGT,oBAAA;AAEV,MAAA;AAAA,MAAA;AAEO,QAAA;AACgB,QAAA;AAAA,MAAA;AAFL,MAAA;AAKvB,IAAA;AACF,EAAA;AAEJ;AAWc;AACD,EAAA;AACa,IAAA;AAC1B,EAAA;AAEW,EAAA;AAC4B,IAAA;AACvC,EAAA;AAEU,EAAA;AAC4B,IAAA;AACtC,EAAA;AAEO,EAAA;AACT;AAc2C;AACzC,EAAA;AACA,EAAA;AACA,EAAA;AACU,EAAA;AACF,EAAA;AACA,EAAA;AAC6B;AACtB,EAAA;AACkC,IAAA;AAClC,IAAA;AACf,EAAA;AAEyD,EAAA;AAE3C,EAAA;AACL,IAAA;AACT,EAAA;AAGE,EAAA;AAAC,IAAA;AAAA,IAAA;AACC,MAAA;AACA,MAAA;AACc,MAAA;AACT,MAAA;AACY,MAAA;AAEhB,MAAA;AAAA,IAAA;AACH,EAAA;AAEJ;AAEe;ADvGgD;AACA;AACA;AACA;AACA","file":"/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-T73HPYF2.js","sourcesContent":[null,"import { useMemo, useState, type ReactNode } from 'react';\nimport { XCircleIcon } from '@phosphor-icons/react/dist/csr/XCircle';\nimport { MedalIcon } from '@phosphor-icons/react/dist/csr/Medal';\nimport { SealWarningIcon } from '@phosphor-icons/react/dist/csr/SealWarning';\nimport { CaretRightIcon } from '@phosphor-icons/react/dist/csr/CaretRight';\nimport Modal from '../Modal/Modal';\nimport Text from '../Text/Text';\nimport Button from '../Button/Button';\nimport ProgressBar from '../ProgressBar/ProgressBar';\nimport ProgressCircle from '../ProgressCircle/ProgressCircle';\nimport { CardActivitiesResults } from '../Card/Card';\nimport { UserIcon } from '../UserIcon/UserIcon';\nimport {\n Skeleton,\n SkeletonCircle,\n SkeletonRounded,\n} from '../Skeleton/Skeleton';\nimport type {\n StudentLessonProgressModalProps,\n StudentLessonProgressData,\n StudentLessonProgressLabels,\n TopicProgressItem,\n SubtopicProgressItem,\n ContentProgressItem,\n} from './types';\nimport { DEFAULT_LESSON_PROGRESS_LABELS } from './types';\nimport { hasContentData, roundProgress } from './lessonProgress';\nimport { cn } from '../../utils/utils';\n\n/**\n * Value line of the two highlight cards: 20px as designed, wrapping onto a\n * second line instead of being cut — a topic name is what the teacher came\n * to read, so an ellipsis would hide the point of the card.\n */\nconst HIGHLIGHT_VALUE_CLASS =\n 'text-xl leading-6 whitespace-normal text-clip line-clamp-2';\n\n/**\n * Body of an expandable row.\n *\n * Animates through `grid-template-rows` (0fr → 1fr), so the open height is the\n * content's own — a `max-h` cap would clip a long list of lessons behind\n * `overflow-hidden` with no way to reach the rest. While collapsed it is both\n * hidden from assistive technology and `inert`: the subtopic buttons inside a\n * topic stay mounted, and `aria-hidden` alone would leave them focusable.\n */\nconst Collapsible = ({\n expanded,\n testId,\n children,\n}: {\n expanded: boolean;\n testId: string;\n children: ReactNode;\n}) => (\n <div\n data-testid={testId}\n data-expanded={expanded}\n aria-hidden={!expanded}\n inert={!expanded}\n className={cn(\n 'grid transition-[grid-template-rows,opacity] duration-300 ease-in-out',\n expanded ? 'grid-rows-[1fr] opacity-100' : 'grid-rows-[0fr] opacity-0'\n )}\n >\n <div className=\"min-h-0 overflow-hidden\">{children}</div>\n </div>\n);\n\n/** Caret of an expandable row, turned down while it is open. */\nconst Caret = ({ expanded }: { expanded: boolean }) => (\n <CaretRightIcon\n size={18}\n className={cn(\n 'shrink-0 text-text-950 transition-transform duration-200',\n expanded ? 'rotate-90' : 'rotate-0'\n )}\n // Decorativo: o estado aberto/fechado já sai em `aria-expanded`.\n aria-hidden=\"true\"\n />\n);\n\n/**\n * Header of a row that may or may not expand. With children it is a toggle\n * `Button` exposing `aria-expanded`; without them it is a plain `div`.\n *\n * Um botão desabilitado sem filhos aparecia ao leitor de tela como controle\n * indisponível, sem nada a fazer — e saía da ordem de Tab de um jeito que\n * parecia defeito. Uma linha que não abre não é controle.\n */\nconst RowHeader = ({\n hasChildren,\n expanded,\n onToggle,\n className,\n children,\n}: {\n hasChildren: boolean;\n expanded: boolean;\n onToggle: () => void;\n className: string;\n children: ReactNode;\n}) => {\n if (!hasChildren) {\n return <div className={cn(className, 'cursor-default')}>{children}</div>;\n }\n\n return (\n <Button\n variant=\"raw\"\n type=\"button\"\n onClick={onToggle}\n className={cn(\n className,\n 'cursor-pointer focus:outline-none focus:ring-2 focus:ring-inset focus:ring-primary-950'\n )}\n aria-expanded={expanded}\n >\n {children}\n </Button>\n );\n};\n\n/** Percentage at the end of a row, rounded as every level draws it. */\nconst ProgressPercent = ({\n progress,\n className,\n}: {\n progress: number;\n className: string;\n}) => (\n <Text\n as=\"span\"\n size=\"xs\"\n weight=\"semibold\"\n className={cn('shrink-0 text-center', className)}\n >\n {roundProgress(progress)}%\n </Text>\n);\n\n/** Row of one lesson (content), the deepest level of the list. */\nconst ContentRow = ({\n item,\n noDataMessage,\n}: {\n item: ContentProgressItem;\n noDataMessage: string;\n}) => (\n <div className=\"flex items-center gap-4 border-t border-border-200 px-4 py-3\">\n <Text size=\"sm\" weight=\"medium\" className=\"min-w-0 flex-1 text-text-950\">\n {item.content.name}\n </Text>\n {hasContentData(item) ? (\n <ProgressPercent progress={item.progress} className=\"text-text-600\" />\n ) : (\n <Text size=\"xs\" className=\"shrink-0 text-text-500\">\n {noDataMessage}\n </Text>\n )}\n </div>\n);\n\n/**\n * Bordered card of one subtopic; its lessons list inside it, one row each,\n * once it is expanded.\n */\nconst SubtopicCard = ({\n item,\n noDataMessage,\n}: {\n item: SubtopicProgressItem;\n noDataMessage: string;\n}) => {\n const [isExpanded, setIsExpanded] = useState(false);\n const hasChildren = item.contents.length > 0;\n const hasNoData = item.status === 'no_data';\n\n return (\n <div className=\"flex flex-col rounded-xl border border-border-200 bg-background\">\n <RowHeader\n hasChildren={hasChildren}\n expanded={isExpanded}\n onToggle={() => setIsExpanded(!isExpanded)}\n className=\"flex w-full items-center gap-4 rounded-xl p-4 text-left\"\n >\n {/* `Text as=\"span\"` e não `p`: dentro de um botão só cabe conteúdo\n de frase. */}\n <Text\n as=\"span\"\n size=\"sm\"\n weight=\"bold\"\n className=\"block min-w-0 flex-1 text-text-950\"\n >\n {item.subtopic.name}\n </Text>\n {hasNoData ? (\n <Text as=\"span\" size=\"xs\" className=\"block shrink-0 text-text-500\">\n {noDataMessage}\n </Text>\n ) : (\n <ProgressPercent progress={item.progress} className=\"text-text-600\" />\n )}\n {hasChildren && <Caret expanded={isExpanded} />}\n </RowHeader>\n\n {hasChildren && (\n <Collapsible\n expanded={isExpanded}\n testId={`accordion-content-subtopic-${item.subtopic.id}`}\n >\n {item.contents.map((content) => (\n <ContentRow\n key={content.content.id}\n item={content}\n noDataMessage={noDataMessage}\n />\n ))}\n </Collapsible>\n )}\n </div>\n );\n};\n\n/**\n * Card of one topic: bold name, then a green bar with its percentage — or the\n * no-data message when nothing was measured yet. Its subtopic cards render\n * inside the card, under the header, once it is expanded.\n */\nconst TopicCard = ({\n item,\n noDataMessage,\n}: {\n item: TopicProgressItem;\n noDataMessage: string;\n}) => {\n const [isExpanded, setIsExpanded] = useState(false);\n const hasChildren = item.subtopics.length > 0;\n const hasNoData = item.status === 'no_data';\n\n return (\n <div\n data-testid={`lesson-item-${item.topic.id}`}\n className=\"flex flex-col rounded-xl bg-background\"\n >\n <RowHeader\n hasChildren={hasChildren}\n expanded={isExpanded}\n onToggle={() => setIsExpanded(!isExpanded)}\n className=\"flex w-full items-center gap-2 rounded-xl p-4 text-left\"\n >\n <div className=\"flex min-w-0 flex-1 flex-col gap-2\">\n <Text\n as=\"span\"\n size=\"lg\"\n weight=\"bold\"\n className=\"block text-text-950\"\n >\n {item.topic.name}\n </Text>\n {hasNoData ? (\n <Text as=\"span\" size=\"xs\" className=\"block text-text-500\">\n {noDataMessage}\n </Text>\n ) : (\n <div className=\"flex items-center gap-2\">\n {/* Barra só visual: dentro do botão o `<progress>` vira ruído no\n nome acessível, e o percentual ao lado já diz o valor. */}\n <div className=\"flex-1\" aria-hidden=\"true\">\n <ProgressBar\n value={item.progress}\n variant=\"green\"\n size=\"medium\"\n />\n </div>\n <ProgressPercent\n progress={item.progress}\n className=\"text-text-950\"\n />\n </div>\n )}\n </div>\n {hasChildren && <Caret expanded={isExpanded} />}\n </RowHeader>\n\n {hasChildren && (\n <Collapsible\n expanded={isExpanded}\n testId={`accordion-content-${item.topic.id}`}\n >\n <div className=\"flex flex-col gap-2 px-4 pb-4\">\n {item.subtopics.map((subtopic) => (\n <SubtopicCard\n key={subtopic.subtopic.id}\n item={subtopic}\n noDataMessage={noDataMessage}\n />\n ))}\n </div>\n </Collapsible>\n )}\n </div>\n );\n};\n\n/**\n * Loading skeleton for the modal content\n */\nconst LoadingSkeleton = () => (\n // `<output>` (região viva nativa) com texto `sr-only`: os skeletons são só\n // visuais.\n <div data-testid=\"lesson-progress-skeleton\" className=\"flex flex-col gap-4\">\n <output className=\"sr-only\">Carregando progresso do estudante...</output>\n <Skeleton variant=\"text\" width=\"12rem\" height={24} />\n <div className=\"flex flex-row gap-3\">\n <SkeletonCircle width={107} height={107} />\n <SkeletonRounded className=\"flex-1\" height={107} />\n <SkeletonRounded className=\"flex-1\" height={107} />\n </div>\n <Skeleton variant=\"text\" width=\"9rem\" height={24} className=\"mt-4\" />\n <div className=\"flex flex-col gap-2\">\n <SkeletonRounded height={80} />\n <SkeletonRounded height={80} />\n <SkeletonRounded height={80} />\n </div>\n </div>\n);\n\n/**\n * Error state component\n */\nconst ErrorContent = ({\n message,\n prefix,\n}: {\n message: string;\n prefix?: string;\n}) => (\n // `role=\"alert\"`: a falha substitui o conteúdo e precisa ser anunciada.\n <div\n className=\"flex flex-col items-center justify-center py-8 gap-3\"\n role=\"alert\"\n >\n <Text\n as=\"span\"\n className=\"size-12 rounded-full bg-error-100 flex items-center justify-center\"\n >\n <XCircleIcon\n size={24}\n className=\"text-error-700\"\n weight=\"fill\"\n aria-hidden=\"true\"\n />\n </Text>\n <Text size=\"md\" className=\"text-error-700 text-center\">\n {prefix ? `${prefix}: ${message}` : message}\n </Text>\n </div>\n);\n\n/**\n * Progress content when data is available\n */\nconst ProgressContent = ({\n data,\n labels,\n}: {\n data: StudentLessonProgressData;\n labels: StudentLessonProgressLabels;\n}) => (\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex items-center gap-2 pt-2\">\n <UserIcon size={24} className=\"shrink-0\" />\n <Text size=\"md\" className=\"text-text-950\">\n {data.name}\n </Text>\n </div>\n\n <div className=\"grid grid-cols-3 gap-2\">\n <div className=\"flex items-center justify-center rounded-xl border border-border-100 bg-background p-2\">\n <ProgressCircle\n value={data.overallCompletionRate}\n variant=\"green\"\n size=\"small\"\n label={labels.completionRateLabel}\n showPercentage\n />\n </div>\n\n <CardActivitiesResults\n icon={\n <MedalIcon\n size={16}\n weight=\"regular\"\n className=\"text-text-950\"\n aria-hidden=\"true\"\n />\n }\n title={labels.bestResultLabel}\n subTitle={data.bestResult || '-'}\n subTitleClassName={HIGHLIGHT_VALUE_CLASS}\n header=\"\"\n action=\"success\"\n />\n\n <CardActivitiesResults\n icon={\n <SealWarningIcon\n size={16}\n weight=\"regular\"\n className=\"text-white\"\n aria-hidden=\"true\"\n />\n }\n title={labels.biggestDifficultyLabel}\n subTitle={data.biggestDifficulty || '-'}\n subTitleClassName={HIGHLIGHT_VALUE_CLASS}\n header=\"\"\n action=\"error\"\n />\n </div>\n\n {data.lessonProgress.length > 0 && (\n <div className=\"flex flex-col gap-4 pt-4\">\n {/* Título de seção dentro do modal: `h3`, abaixo do `h2` do título. */}\n <Text as=\"h3\" size=\"lg\" weight=\"bold\" className=\"text-text-950\">\n {labels.lessonProgressTitle}\n </Text>\n <div className=\"flex flex-col gap-2\">\n {data.lessonProgress.map((topic) => (\n <TopicCard\n key={topic.topic.id}\n item={topic}\n noDataMessage={labels.noDataMessage}\n />\n ))}\n </div>\n </div>\n )}\n </div>\n);\n\n/**\n * Renders the modal content based on loading, error, and data state\n */\nconst renderModalContent = (\n loading: boolean,\n error: string | null | undefined,\n data: StudentLessonProgressData | null,\n labels: StudentLessonProgressLabels\n): ReactNode => {\n if (loading) {\n return <LoadingSkeleton />;\n }\n\n if (error) {\n return <ErrorContent message={error} prefix={labels.errorMessagePrefix} />;\n }\n\n if (data) {\n return <ProgressContent data={data} labels={labels} />;\n }\n\n return null;\n};\n\n/**\n * StudentLessonProgressModal component\n *\n * Displays a modal with student lesson progress information including:\n * - Student name with profile icon\n * - Completion rate circle\n * - Best result and biggest difficulty highlight cards\n * - Expandable nested list of lesson progress: topic → subtopic → lesson,\n * with the topics of every requested subject in one trail-ordered list\n *\n * Without data, loading or error the component renders nothing.\n */\nexport const StudentLessonProgressModal = ({\n isOpen,\n onClose,\n data,\n loading = false,\n error = null,\n labels: customLabels,\n}: StudentLessonProgressModalProps) => {\n const labels = useMemo(\n () => ({ ...DEFAULT_LESSON_PROGRESS_LABELS, ...customLabels }),\n [customLabels]\n );\n\n const content = renderModalContent(loading, error, data, labels);\n\n if (!content) {\n return null;\n }\n\n return (\n <Modal\n isOpen={isOpen}\n onClose={onClose}\n title={labels.title}\n size=\"lg\"\n contentClassName=\"max-h-[80vh] overflow-y-auto\"\n >\n {content}\n </Modal>\n );\n};\n\nexport default StudentLessonProgressModal;\n","import type { ContentProgressItem } from './types';\n\n/**\n * Reading rules of the accordion rows. Pure, no React.\n */\n\n/**\n * Whether a lesson has progress to show.\n *\n * The deepest level decides differently from the two above it: topic and\n * subtopic carry a `status`, while `ContentProgressItem` only has `progress`\n * and `isCompleted`, so \"no data\" is inferred from zero progress on a lesson\n * not completed. `isCompleted` matters because a completed lesson with zero\n * progress exists in the type, and for it the row shows \"0%\", not the\n * no-data message.\n */\nexport const hasContentData = (item: ContentProgressItem): boolean =>\n item.progress !== 0 || item.isCompleted;\n\n/**\n * Rounding of the percentage, as every level of the accordion draws it.\n */\nexport const roundProgress = (progress: number): number => Math.round(progress);\n"]}
@@ -1,6 +1,6 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
2
 
3
- var _chunkPOT3ALY3js = require('./chunk-POT3ALY3.js');
3
+ var _chunk5DINXU6Wjs = require('./chunk-5DINXU6W.js');
4
4
 
5
5
 
6
6
  var _chunkANT66KVKjs = require('./chunk-ANT66KVK.js');
@@ -11,26 +11,26 @@ var _chunkTN3AYOMVjs = require('./chunk-TN3AYOMV.js');
11
11
  // src/components/SupportChat/SupportChatEvent.tsx
12
12
  var _jsxruntime = require('react/jsx-runtime');
13
13
  var PILL_CLASSES = {
14
- [_chunkPOT3ALY3js.SUPPORT_CHAT_EVENT_TYPE.NEUTRAL]: "bg-background-100",
15
- [_chunkPOT3ALY3js.SUPPORT_CHAT_EVENT_TYPE.TRANSFER]: "bg-warning-50",
16
- [_chunkPOT3ALY3js.SUPPORT_CHAT_EVENT_TYPE.AI]: "bg-primary-50",
17
- [_chunkPOT3ALY3js.SUPPORT_CHAT_EVENT_TYPE.SUCCESS]: "bg-success-50",
18
- [_chunkPOT3ALY3js.SUPPORT_CHAT_EVENT_TYPE.DATE]: "bg-background-100"
14
+ [_chunk5DINXU6Wjs.SUPPORT_CHAT_EVENT_TYPE.NEUTRAL]: "bg-background-100",
15
+ [_chunk5DINXU6Wjs.SUPPORT_CHAT_EVENT_TYPE.TRANSFER]: "bg-warning-50",
16
+ [_chunk5DINXU6Wjs.SUPPORT_CHAT_EVENT_TYPE.AI]: "bg-primary-50",
17
+ [_chunk5DINXU6Wjs.SUPPORT_CHAT_EVENT_TYPE.SUCCESS]: "bg-success-50",
18
+ [_chunk5DINXU6Wjs.SUPPORT_CHAT_EVENT_TYPE.DATE]: "bg-background-100"
19
19
  };
20
20
  var TEXT_COLORS = {
21
- [_chunkPOT3ALY3js.SUPPORT_CHAT_EVENT_TYPE.NEUTRAL]: "text-text-600",
22
- [_chunkPOT3ALY3js.SUPPORT_CHAT_EVENT_TYPE.TRANSFER]: "text-warning-700",
23
- [_chunkPOT3ALY3js.SUPPORT_CHAT_EVENT_TYPE.AI]: "text-primary-700",
24
- [_chunkPOT3ALY3js.SUPPORT_CHAT_EVENT_TYPE.SUCCESS]: "text-success-700",
25
- [_chunkPOT3ALY3js.SUPPORT_CHAT_EVENT_TYPE.DATE]: "text-text-600"
21
+ [_chunk5DINXU6Wjs.SUPPORT_CHAT_EVENT_TYPE.NEUTRAL]: "text-text-600",
22
+ [_chunk5DINXU6Wjs.SUPPORT_CHAT_EVENT_TYPE.TRANSFER]: "text-warning-700",
23
+ [_chunk5DINXU6Wjs.SUPPORT_CHAT_EVENT_TYPE.AI]: "text-primary-700",
24
+ [_chunk5DINXU6Wjs.SUPPORT_CHAT_EVENT_TYPE.SUCCESS]: "text-success-700",
25
+ [_chunk5DINXU6Wjs.SUPPORT_CHAT_EVENT_TYPE.DATE]: "text-text-600"
26
26
  };
27
27
  function SupportChatEvent({
28
- type = _chunkPOT3ALY3js.SUPPORT_CHAT_EVENT_TYPE.NEUTRAL,
28
+ type = _chunk5DINXU6Wjs.SUPPORT_CHAT_EVENT_TYPE.NEUTRAL,
29
29
  text,
30
30
  time,
31
31
  className
32
32
  }) {
33
- const isDate = type === _chunkPOT3ALY3js.SUPPORT_CHAT_EVENT_TYPE.DATE;
33
+ const isDate = type === _chunk5DINXU6Wjs.SUPPORT_CHAT_EVENT_TYPE.DATE;
34
34
  const content = time ? `${text} \xB7 ${time}` : text;
35
35
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
36
36
  "div",
@@ -80,4 +80,4 @@ function SupportChatEvent({
80
80
 
81
81
 
82
82
  exports.SupportChatEvent = SupportChatEvent;
83
- //# sourceMappingURL=chunk-ZB6HDDE4.js.map
83
+ //# sourceMappingURL=chunk-TQO37PVW.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-ZB6HDDE4.js","../src/components/SupportChat/SupportChatEvent.tsx"],"names":[],"mappings":"AAAA;AACE;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACA;ACoDI,+CAAA;AAxCJ,IAAM,aAAA,EAAqD;AAAA,EACzD,CAAC,wCAAA,CAAwB,OAAO,CAAA,EAAG,mBAAA;AAAA,EACnC,CAAC,wCAAA,CAAwB,QAAQ,CAAA,EAAG,eAAA;AAAA,EACpC,CAAC,wCAAA,CAAwB,EAAE,CAAA,EAAG,eAAA;AAAA,EAC9B,CAAC,wCAAA,CAAwB,OAAO,CAAA,EAAG,eAAA;AAAA,EACnC,CAAC,wCAAA,CAAwB,IAAI,CAAA,EAAG;AAClC,CAAA;AAEA,IAAM,YAAA,EAAoD;AAAA,EACxD,CAAC,wCAAA,CAAwB,OAAO,CAAA,EAAG,eAAA;AAAA,EACnC,CAAC,wCAAA,CAAwB,QAAQ,CAAA,EAAG,kBAAA;AAAA,EACpC,CAAC,wCAAA,CAAwB,EAAE,CAAA,EAAG,kBAAA;AAAA,EAC9B,CAAC,wCAAA,CAAwB,OAAO,CAAA,EAAG,kBAAA;AAAA,EACnC,CAAC,wCAAA,CAAwB,IAAI,CAAA,EAAG;AAClC,CAAA;AAgBe,SAAR,gBAAA,CAAkC;AAAA,EACvC,KAAA,EAAO,wCAAA,CAAwB,OAAA;AAAA,EAC/B,IAAA;AAAA,EACA,IAAA;AAAA,EACA;AACF,CAAA,EAAoC;AAClC,EAAA,MAAM,OAAA,EAAS,KAAA,IAAS,wCAAA,CAAwB,IAAA;AAChD,EAAA,MAAM,QAAA,EAAU,KAAA,EAAO,CAAA,EAAA;AAGrB,EAAA;AAAC,IAAA;AAAA,IAAA;AACgB,MAAA;AACH,MAAA;AACE,MAAA;AAEb,MAAA;AACC,QAAA;AAAC,UAAA;AAAA,UAAA;AACC,YAAA;AACA,YAAA;AACU,YAAA;AAAA,UAAA;AACZ,QAAA;AAEF,wBAAA;AAAC,UAAA;AAAA,UAAA;AACC,YAAA;AACc,YAAA;AAEd,YAAA;AAAC,cAAA;AAAA,cAAA;AACM,gBAAA;AACG,gBAAA;AACD,gBAAA;AACP,gBAAA;AAEC,gBAAA;AAAA,cAAA;AACH,YAAA;AAAA,UAAA;AACF,QAAA;AAEE,QAAA;AAAC,UAAA;AAAA,UAAA;AACC,YAAA;AACA,YAAA;AACU,YAAA;AAAA,UAAA;AACZ,QAAA;AAAA,MAAA;AAAA,IAAA;AAEJ,EAAA;AAEJ;ADlB0B;AACA;AACA;AACA","file":"/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-ZB6HDDE4.js","sourcesContent":[null,"import Text from '../Text/Text';\nimport { cn } from '../../utils/utils';\nimport {\n SUPPORT_CHAT_EVENT_TYPE,\n type SupportChatEventType,\n} from '../../types/supportChat';\n\n/**\n * Props for an event shown between support chat messages\n */\nexport interface SupportChatEventProps {\n /** Event kind; defaults to NEUTRAL */\n type?: SupportChatEventType;\n /** Event description, e.g. \"Atendimento passou para humano\" */\n text: string;\n /** Already formatted time appended as \"text · time\" */\n time?: string;\n /** Extra classes for the root element */\n className?: string;\n}\n\n/** Pill background and text color for each event type */\nconst PILL_CLASSES: Record<SupportChatEventType, string> = {\n [SUPPORT_CHAT_EVENT_TYPE.NEUTRAL]: 'bg-background-100',\n [SUPPORT_CHAT_EVENT_TYPE.TRANSFER]: 'bg-warning-50',\n [SUPPORT_CHAT_EVENT_TYPE.AI]: 'bg-primary-50',\n [SUPPORT_CHAT_EVENT_TYPE.SUCCESS]: 'bg-success-50',\n [SUPPORT_CHAT_EVENT_TYPE.DATE]: 'bg-background-100',\n};\n\nconst TEXT_COLORS: Record<SupportChatEventType, string> = {\n [SUPPORT_CHAT_EVENT_TYPE.NEUTRAL]: 'text-text-600',\n [SUPPORT_CHAT_EVENT_TYPE.TRANSFER]: 'text-warning-700',\n [SUPPORT_CHAT_EVENT_TYPE.AI]: 'text-primary-700',\n [SUPPORT_CHAT_EVENT_TYPE.SUCCESS]: 'text-success-700',\n [SUPPORT_CHAT_EVENT_TYPE.DATE]: 'text-text-600',\n};\n\n/**\n * Centered pill describing a chat event.\n *\n * - NEUTRAL: gray pill, e.g. \"Atendimento iniciado via Web\",\n * \"Atendimento passou para humano\" or \"Concluído automaticamente pela IA\"\n * - TRANSFER: orange pill, e.g. \"IA transferiu para humano — motivo: …\"\n * - AI: blue pill, e.g. \"IA assumiu o atendimento\"\n * - SUCCESS: green pill, e.g. \"Atendimento concluído — motivo: Login\"\n * - DATE: gray pill between two horizontal lines, used as a date separator\n * (e.g. \"Hoje\")\n *\n * Handoffs are described by who handles the ticket (AI or human), not by\n * agent names: there is no \"Passou de Agente A para Agente B\" event.\n */\nexport default function SupportChatEvent({\n type = SUPPORT_CHAT_EVENT_TYPE.NEUTRAL,\n text,\n time,\n className,\n}: Readonly<SupportChatEventProps>) {\n const isDate = type === SUPPORT_CHAT_EVENT_TYPE.DATE;\n const content = time ? `${text} · ${time}` : text;\n\n return (\n <div\n role={isDate ? 'separator' : undefined}\n aria-label={isDate ? content : undefined}\n className={cn('flex w-full items-center justify-center gap-3', className)}\n >\n {isDate && (\n <div\n aria-hidden=\"true\"\n data-testid=\"support-chat-event-line\"\n className=\"h-px flex-1 bg-border-100\"\n />\n )}\n <div\n data-testid=\"support-chat-event-pill\"\n className={cn('max-w-full rounded-xl px-2.5 py-1', PILL_CLASSES[type])}\n >\n <Text\n size=\"xs\"\n weight={isDate ? 'medium' : 'normal'}\n color={TEXT_COLORS[type]}\n className=\"break-words text-center\"\n >\n {content}\n </Text>\n </div>\n {isDate && (\n <div\n aria-hidden=\"true\"\n data-testid=\"support-chat-event-line\"\n className=\"h-px flex-1 bg-border-100\"\n />\n )}\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-TQO37PVW.js","../src/components/SupportChat/SupportChatEvent.tsx"],"names":[],"mappings":"AAAA;AACE;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACA;ACoDI,+CAAA;AAxCJ,IAAM,aAAA,EAAqD;AAAA,EACzD,CAAC,wCAAA,CAAwB,OAAO,CAAA,EAAG,mBAAA;AAAA,EACnC,CAAC,wCAAA,CAAwB,QAAQ,CAAA,EAAG,eAAA;AAAA,EACpC,CAAC,wCAAA,CAAwB,EAAE,CAAA,EAAG,eAAA;AAAA,EAC9B,CAAC,wCAAA,CAAwB,OAAO,CAAA,EAAG,eAAA;AAAA,EACnC,CAAC,wCAAA,CAAwB,IAAI,CAAA,EAAG;AAClC,CAAA;AAEA,IAAM,YAAA,EAAoD;AAAA,EACxD,CAAC,wCAAA,CAAwB,OAAO,CAAA,EAAG,eAAA;AAAA,EACnC,CAAC,wCAAA,CAAwB,QAAQ,CAAA,EAAG,kBAAA;AAAA,EACpC,CAAC,wCAAA,CAAwB,EAAE,CAAA,EAAG,kBAAA;AAAA,EAC9B,CAAC,wCAAA,CAAwB,OAAO,CAAA,EAAG,kBAAA;AAAA,EACnC,CAAC,wCAAA,CAAwB,IAAI,CAAA,EAAG;AAClC,CAAA;AAgBe,SAAR,gBAAA,CAAkC;AAAA,EACvC,KAAA,EAAO,wCAAA,CAAwB,OAAA;AAAA,EAC/B,IAAA;AAAA,EACA,IAAA;AAAA,EACA;AACF,CAAA,EAAoC;AAClC,EAAA,MAAM,OAAA,EAAS,KAAA,IAAS,wCAAA,CAAwB,IAAA;AAChD,EAAA,MAAM,QAAA,EAAU,KAAA,EAAO,CAAA,EAAA;AAGrB,EAAA;AAAC,IAAA;AAAA,IAAA;AACgB,MAAA;AACH,MAAA;AACE,MAAA;AAEb,MAAA;AACC,QAAA;AAAC,UAAA;AAAA,UAAA;AACC,YAAA;AACA,YAAA;AACU,YAAA;AAAA,UAAA;AACZ,QAAA;AAEF,wBAAA;AAAC,UAAA;AAAA,UAAA;AACC,YAAA;AACc,YAAA;AAEd,YAAA;AAAC,cAAA;AAAA,cAAA;AACM,gBAAA;AACG,gBAAA;AACD,gBAAA;AACP,gBAAA;AAEC,gBAAA;AAAA,cAAA;AACH,YAAA;AAAA,UAAA;AACF,QAAA;AAEE,QAAA;AAAC,UAAA;AAAA,UAAA;AACC,YAAA;AACA,YAAA;AACU,YAAA;AAAA,UAAA;AACZ,QAAA;AAAA,MAAA;AAAA,IAAA;AAEJ,EAAA;AAEJ;ADlB0B;AACA;AACA;AACA","file":"/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-TQO37PVW.js","sourcesContent":[null,"import Text from '../Text/Text';\nimport { cn } from '../../utils/utils';\nimport {\n SUPPORT_CHAT_EVENT_TYPE,\n type SupportChatEventType,\n} from '../../types/supportChat';\n\n/**\n * Props for an event shown between support chat messages\n */\nexport interface SupportChatEventProps {\n /** Event kind; defaults to NEUTRAL */\n type?: SupportChatEventType;\n /** Event description, e.g. \"Atendimento passou para humano\" */\n text: string;\n /** Already formatted time appended as \"text · time\" */\n time?: string;\n /** Extra classes for the root element */\n className?: string;\n}\n\n/** Pill background and text color for each event type */\nconst PILL_CLASSES: Record<SupportChatEventType, string> = {\n [SUPPORT_CHAT_EVENT_TYPE.NEUTRAL]: 'bg-background-100',\n [SUPPORT_CHAT_EVENT_TYPE.TRANSFER]: 'bg-warning-50',\n [SUPPORT_CHAT_EVENT_TYPE.AI]: 'bg-primary-50',\n [SUPPORT_CHAT_EVENT_TYPE.SUCCESS]: 'bg-success-50',\n [SUPPORT_CHAT_EVENT_TYPE.DATE]: 'bg-background-100',\n};\n\nconst TEXT_COLORS: Record<SupportChatEventType, string> = {\n [SUPPORT_CHAT_EVENT_TYPE.NEUTRAL]: 'text-text-600',\n [SUPPORT_CHAT_EVENT_TYPE.TRANSFER]: 'text-warning-700',\n [SUPPORT_CHAT_EVENT_TYPE.AI]: 'text-primary-700',\n [SUPPORT_CHAT_EVENT_TYPE.SUCCESS]: 'text-success-700',\n [SUPPORT_CHAT_EVENT_TYPE.DATE]: 'text-text-600',\n};\n\n/**\n * Centered pill describing a chat event.\n *\n * - NEUTRAL: gray pill, e.g. \"Atendimento iniciado via Web\",\n * \"Atendimento passou para humano\" or \"Concluído automaticamente pela IA\"\n * - TRANSFER: orange pill, e.g. \"IA transferiu para humano — motivo: …\"\n * - AI: blue pill, e.g. \"IA assumiu o atendimento\"\n * - SUCCESS: green pill, e.g. \"Atendimento concluído — motivo: Login\"\n * - DATE: gray pill between two horizontal lines, used as a date separator\n * (e.g. \"Hoje\")\n *\n * Handoffs are described by who handles the ticket (AI or human), not by\n * agent names: there is no \"Passou de Agente A para Agente B\" event.\n */\nexport default function SupportChatEvent({\n type = SUPPORT_CHAT_EVENT_TYPE.NEUTRAL,\n text,\n time,\n className,\n}: Readonly<SupportChatEventProps>) {\n const isDate = type === SUPPORT_CHAT_EVENT_TYPE.DATE;\n const content = time ? `${text} · ${time}` : text;\n\n return (\n <div\n role={isDate ? 'separator' : undefined}\n aria-label={isDate ? content : undefined}\n className={cn('flex w-full items-center justify-center gap-3', className)}\n >\n {isDate && (\n <div\n aria-hidden=\"true\"\n data-testid=\"support-chat-event-line\"\n className=\"h-px flex-1 bg-border-100\"\n />\n )}\n <div\n data-testid=\"support-chat-event-pill\"\n className={cn('max-w-full rounded-xl px-2.5 py-1', PILL_CLASSES[type])}\n >\n <Text\n size=\"xs\"\n weight={isDate ? 'medium' : 'normal'}\n color={TEXT_COLORS[type]}\n className=\"break-words text-center\"\n >\n {content}\n </Text>\n </div>\n {isDate && (\n <div\n aria-hidden=\"true\"\n data-testid=\"support-chat-event-line\"\n className=\"h-px flex-1 bg-border-100\"\n />\n )}\n </div>\n );\n}\n"]}
@@ -17,7 +17,7 @@ import {
17
17
  } from "./chunk-VN4ORBHU.mjs";
18
18
  import {
19
19
  Modal_default
20
- } from "./chunk-XZUMD3CB.mjs";
20
+ } from "./chunk-LODDYDTP.mjs";
21
21
  import {
22
22
  Button_default
23
23
  } from "./chunk-ZQZBOTZJ.mjs";
@@ -434,4 +434,4 @@ export {
434
434
  getCategoryIcon,
435
435
  TicketModal
436
436
  };
437
- //# sourceMappingURL=chunk-VKQ5AJDT.mjs.map
437
+ //# sourceMappingURL=chunk-UENZQF2Y.mjs.map
@@ -3,7 +3,7 @@
3
3
 
4
4
 
5
5
 
6
- var _chunkRBJAO57Ajs = require('./chunk-RBJAO57A.js');
6
+ var _chunkFAAR4XC5js = require('./chunk-FAAR4XC5.js');
7
7
 
8
8
 
9
9
  var _chunkTN3AYOMVjs = require('./chunk-TN3AYOMV.js');
@@ -78,7 +78,7 @@ var Search = _react.forwardRef.call(void 0,
78
78
  const [dropdownOpen, setDropdownOpen] = _react.useState.call(void 0, false);
79
79
  const [forceClose, setForceClose] = _react.useState.call(void 0, false);
80
80
  const justSelectedRef = _react.useRef.call(void 0, false);
81
- const dropdownStore = _react.useRef.call(void 0, _chunkRBJAO57Ajs.createDropdownStore.call(void 0, )).current;
81
+ const dropdownStore = _react.useRef.call(void 0, _chunkFAAR4XC5js.createDropdownStore.call(void 0, )).current;
82
82
  const dropdownRef = _react.useRef.call(void 0, null);
83
83
  const inputElRef = _react.useRef.call(void 0, null);
84
84
  const debounceTimer = _react.useRef.call(void 0, null);
@@ -273,15 +273,15 @@ var Search = _react.forwardRef.call(void 0,
273
273
  }
274
274
  ) })
275
275
  ] }),
276
- showDropdown && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkRBJAO57Ajs.DropdownMenu_default, { open: showDropdown, onOpenChange: setDropdownOpen, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
277
- _chunkRBJAO57Ajs.DropdownMenuContent,
276
+ showDropdown && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkFAAR4XC5js.DropdownMenu_default, { open: showDropdown, onOpenChange: setDropdownOpen, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
277
+ _chunkFAAR4XC5js.DropdownMenuContent,
278
278
  {
279
279
  id: dropdownId,
280
280
  className: "w-full mt-1",
281
281
  style: { maxHeight: dropdownMaxHeight },
282
282
  align: "start",
283
283
  children: hasSuggestions ? filteredOptions.map((option) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
284
- _chunkRBJAO57Ajs.DropdownMenuItem,
284
+ _chunkFAAR4XC5js.DropdownMenuItem,
285
285
  {
286
286
  onClick: () => handleSelectOption(option),
287
287
  className: "text-text-700 text-base leading-6 cursor-pointer",
@@ -318,4 +318,4 @@ var Search_default = Search;
318
318
 
319
319
 
320
320
  exports.getResultsMessage = getResultsMessage; exports.Search_default = Search_default;
321
- //# sourceMappingURL=chunk-DCG7EUBC.js.map
321
+ //# sourceMappingURL=chunk-UWLW5YVB.js.map