analytica-frontend-lib 1.5.38 → 1.5.39

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 (318) hide show
  1. package/dist/AccessReportModal/index.js +4 -3
  2. package/dist/AccessReportModal/index.js.map +1 -1
  3. package/dist/AccessReportModal/index.mjs +3 -2
  4. package/dist/ActivitiesHistory/index.js +43 -41
  5. package/dist/ActivitiesHistory/index.js.map +1 -1
  6. package/dist/ActivitiesHistory/index.mjs +42 -40
  7. package/dist/ActivityCardQuestionBanks/index.js +43 -41
  8. package/dist/ActivityCardQuestionBanks/index.js.map +1 -1
  9. package/dist/ActivityCardQuestionBanks/index.mjs +42 -40
  10. package/dist/ActivityCardQuestionPreview/index.js +43 -41
  11. package/dist/ActivityCardQuestionPreview/index.js.map +1 -1
  12. package/dist/ActivityCardQuestionPreview/index.mjs +42 -40
  13. package/dist/ActivityCreate/index.js +43 -41
  14. package/dist/ActivityCreate/index.js.map +1 -1
  15. package/dist/ActivityCreate/index.mjs +42 -40
  16. package/dist/ActivityDetails/index.js +43 -41
  17. package/dist/ActivityDetails/index.js.map +1 -1
  18. package/dist/ActivityDetails/index.mjs +42 -40
  19. package/dist/ActivityFilters/index.js +43 -41
  20. package/dist/ActivityFilters/index.js.map +1 -1
  21. package/dist/ActivityFilters/index.mjs +42 -40
  22. package/dist/ActivityPageLayout/index.js +43 -41
  23. package/dist/ActivityPageLayout/index.js.map +1 -1
  24. package/dist/ActivityPageLayout/index.mjs +42 -40
  25. package/dist/ActivityPreview/index.js +43 -41
  26. package/dist/ActivityPreview/index.js.map +1 -1
  27. package/dist/ActivityPreview/index.mjs +42 -40
  28. package/dist/AlertManager/index.js +43 -41
  29. package/dist/AlertManager/index.js.map +1 -1
  30. package/dist/AlertManager/index.mjs +42 -40
  31. package/dist/AlertManagerView/index.js +4 -3
  32. package/dist/AlertManagerView/index.js.map +1 -1
  33. package/dist/AlertManagerView/index.mjs +3 -2
  34. package/dist/AppHeader/index.js +7 -6
  35. package/dist/AppHeader/index.js.map +1 -1
  36. package/dist/AppHeader/index.mjs +6 -5
  37. package/dist/CalendarCard/index.js +5 -4
  38. package/dist/CalendarCard/index.js.map +1 -1
  39. package/dist/CalendarCard/index.mjs +4 -3
  40. package/dist/Chat/index.js +4 -3
  41. package/dist/Chat/index.js.map +1 -1
  42. package/dist/Chat/index.mjs +3 -2
  43. package/dist/CheckBoxGroup/index.js +43 -41
  44. package/dist/CheckBoxGroup/index.js.map +1 -1
  45. package/dist/CheckBoxGroup/index.mjs +42 -40
  46. package/dist/ComparatorChart/ComparatorView/index.js +4 -3
  47. package/dist/ComparatorChart/ComparatorView/index.js.map +1 -1
  48. package/dist/ComparatorChart/ComparatorView/index.mjs +3 -2
  49. package/dist/CorrectActivityModal/index.js +4 -3
  50. package/dist/CorrectActivityModal/index.js.map +1 -1
  51. package/dist/CorrectActivityModal/index.mjs +3 -2
  52. package/dist/DownloadButton/index.js +5 -4
  53. package/dist/DownloadButton/index.js.map +1 -1
  54. package/dist/DownloadButton/index.mjs +4 -3
  55. package/dist/DownloadModal/index.js +4 -3
  56. package/dist/DownloadModal/index.js.map +1 -1
  57. package/dist/DownloadModal/index.mjs +3 -2
  58. package/dist/DropdownMenu/index.js +4 -3
  59. package/dist/DropdownMenu/index.js.map +1 -1
  60. package/dist/DropdownMenu/index.mjs +3 -2
  61. package/dist/ExamDetailsLayout/ExamDetailsPage/index.js +43 -41
  62. package/dist/ExamDetailsLayout/ExamDetailsPage/index.js.map +1 -1
  63. package/dist/ExamDetailsLayout/ExamDetailsPage/index.mjs +42 -40
  64. package/dist/ExamPageLayout/index.js +43 -41
  65. package/dist/ExamPageLayout/index.js.map +1 -1
  66. package/dist/ExamPageLayout/index.mjs +42 -40
  67. package/dist/Forum/index.js +6 -5
  68. package/dist/Forum/index.js.map +1 -1
  69. package/dist/Forum/index.mjs +5 -4
  70. package/dist/Modal/index.d.ts +3 -2
  71. package/dist/Modal/index.d.ts.map +1 -1
  72. package/dist/Modal/index.js +3 -2
  73. package/dist/Modal/index.js.map +1 -1
  74. package/dist/Modal/index.mjs +2 -1
  75. package/dist/NotificationCard/index.js +5 -4
  76. package/dist/NotificationCard/index.js.map +1 -1
  77. package/dist/NotificationCard/index.mjs +4 -3
  78. package/dist/PerformanceReportModal/index.js +4 -3
  79. package/dist/PerformanceReportModal/index.js.map +1 -1
  80. package/dist/PerformanceReportModal/index.mjs +3 -2
  81. package/dist/PrintableUsersTable/index.js +43 -41
  82. package/dist/PrintableUsersTable/index.js.map +1 -1
  83. package/dist/PrintableUsersTable/index.mjs +42 -40
  84. package/dist/ProgressModal/index.js +4 -3
  85. package/dist/ProgressModal/index.js.map +1 -1
  86. package/dist/ProgressModal/index.mjs +3 -2
  87. package/dist/Quiz/index.js +4 -3
  88. package/dist/Quiz/index.js.map +1 -1
  89. package/dist/Quiz/index.mjs +3 -2
  90. package/dist/RecommendedLessonCreate/index.js +43 -41
  91. package/dist/RecommendedLessonCreate/index.js.map +1 -1
  92. package/dist/RecommendedLessonCreate/index.mjs +42 -40
  93. package/dist/RecommendedLessonDetails/index.js +7 -6
  94. package/dist/RecommendedLessonDetails/index.js.map +1 -1
  95. package/dist/RecommendedLessonDetails/index.mjs +6 -5
  96. package/dist/RecommendedLessonsHistory/index.js +43 -41
  97. package/dist/RecommendedLessonsHistory/index.js.map +1 -1
  98. package/dist/RecommendedLessonsHistory/index.mjs +42 -40
  99. package/dist/RichEditor/index.js +6 -5
  100. package/dist/RichEditor/index.js.map +1 -1
  101. package/dist/RichEditor/index.mjs +5 -4
  102. package/dist/{RichEditorCore-4G4YBLZZ.js → RichEditorCore-C3MN2JQX.js} +8 -7
  103. package/dist/RichEditorCore-C3MN2JQX.js.map +1 -0
  104. package/dist/{RichEditorCore-X4RXDQ6M.mjs → RichEditorCore-KZFJVQXI.mjs} +5 -4
  105. package/dist/{RichEditorCore-X4RXDQ6M.mjs.map → RichEditorCore-KZFJVQXI.mjs.map} +1 -1
  106. package/dist/Search/index.js +5 -4
  107. package/dist/Search/index.js.map +1 -1
  108. package/dist/Search/index.mjs +4 -3
  109. package/dist/SendActivityModal/SendActivityModal.js +43 -41
  110. package/dist/SendActivityModal/SendActivityModal.js.map +1 -1
  111. package/dist/SendActivityModal/SendActivityModal.mjs +42 -40
  112. package/dist/SendActivityModal/index.js +43 -41
  113. package/dist/SendActivityModal/index.js.map +1 -1
  114. package/dist/SendActivityModal/index.mjs +42 -40
  115. package/dist/SendLessonModal/index.js +43 -41
  116. package/dist/SendLessonModal/index.js.map +1 -1
  117. package/dist/SendLessonModal/index.mjs +42 -40
  118. package/dist/SimulatedPerformance/SimulatedPerformanceView/index.js +43 -41
  119. package/dist/SimulatedPerformance/SimulatedPerformanceView/index.js.map +1 -1
  120. package/dist/SimulatedPerformance/SimulatedPerformanceView/index.mjs +42 -40
  121. package/dist/SimulatedPerformance/useSimulatedPerformance/index.js +4 -3
  122. package/dist/SimulatedPerformance/useSimulatedPerformance/index.js.map +1 -1
  123. package/dist/SimulatedPerformance/useSimulatedPerformance/index.mjs +3 -2
  124. package/dist/SimulationsPage/index.js +43 -41
  125. package/dist/SimulationsPage/index.js.map +1 -1
  126. package/dist/SimulationsPage/index.mjs +42 -40
  127. package/dist/StudentLessonProgressModal/index.js +4 -3
  128. package/dist/StudentLessonProgressModal/index.js.map +1 -1
  129. package/dist/StudentLessonProgressModal/index.mjs +3 -2
  130. package/dist/StudentPerformanceDetailsModal/index.js +4 -3
  131. package/dist/StudentPerformanceDetailsModal/index.js.map +1 -1
  132. package/dist/StudentPerformanceDetailsModal/index.mjs +3 -2
  133. package/dist/Support/TicketModal/index.js +4 -3
  134. package/dist/Support/TicketModal/index.js.map +1 -1
  135. package/dist/Support/TicketModal/index.mjs +3 -2
  136. package/dist/Support/index.js +5 -4
  137. package/dist/Support/index.js.map +1 -1
  138. package/dist/Support/index.mjs +4 -3
  139. package/dist/TableProvider/index.js +43 -41
  140. package/dist/TableProvider/index.js.map +1 -1
  141. package/dist/TableProvider/index.mjs +42 -40
  142. package/dist/UnifiedDraftModelPage/index.js +43 -41
  143. package/dist/UnifiedDraftModelPage/index.js.map +1 -1
  144. package/dist/UnifiedDraftModelPage/index.mjs +42 -40
  145. package/dist/UnifiedHistoryPage/index.js +43 -41
  146. package/dist/UnifiedHistoryPage/index.js.map +1 -1
  147. package/dist/UnifiedHistoryPage/index.mjs +42 -40
  148. package/dist/VideoPlayer/index.js +6 -5
  149. package/dist/VideoPlayer/index.js.map +1 -1
  150. package/dist/VideoPlayer/index.mjs +5 -4
  151. package/dist/assets/fallbacks/readingFluencyFallback.d.ts +5 -0
  152. package/dist/assets/fallbacks/readingFluencyFallback.d.ts.map +1 -0
  153. package/dist/{chunk-JWSOIXZE.js → chunk-2MDHKQ33.js} +6 -6
  154. package/dist/{chunk-JWSOIXZE.js.map → chunk-2MDHKQ33.js.map} +1 -1
  155. package/dist/{chunk-CV4JWMXG.js → chunk-2WZ3KRCK.js} +3 -3
  156. package/dist/{chunk-CV4JWMXG.js.map → chunk-2WZ3KRCK.js.map} +1 -1
  157. package/dist/{chunk-LWUDWAX4.mjs → chunk-2X5TJZ5Z.mjs} +2 -2
  158. package/dist/{chunk-ACZ54JIS.mjs → chunk-3I5QVUPZ.mjs} +2 -2
  159. package/dist/{chunk-O264R6U2.mjs → chunk-43CA6NQG.mjs} +2 -2
  160. package/dist/chunk-4L7P2FHP.js +34 -0
  161. package/dist/chunk-4L7P2FHP.js.map +1 -0
  162. package/dist/{chunk-34BR5MTL.mjs → chunk-5QPYIL4Z.mjs} +2 -2
  163. package/dist/{chunk-47ULTDOL.mjs → chunk-5RBZCQGH.mjs} +14 -14
  164. package/dist/chunk-5RBZCQGH.mjs.map +1 -0
  165. package/dist/chunk-624IUGB4.mjs +37 -0
  166. package/dist/chunk-624IUGB4.mjs.map +1 -0
  167. package/dist/{chunk-JBAIBARE.mjs → chunk-7LRIQOCS.mjs} +2 -2
  168. package/dist/chunk-A43TV76K.mjs +34 -0
  169. package/dist/chunk-A43TV76K.mjs.map +1 -0
  170. package/dist/{chunk-U452MQ5H.mjs → chunk-AFBTGILL.mjs} +4 -4
  171. package/dist/{chunk-55GOE74X.js → chunk-BN5AWOG5.js} +3 -3
  172. package/dist/{chunk-55GOE74X.js.map → chunk-BN5AWOG5.js.map} +1 -1
  173. package/dist/{chunk-X34ETWDM.mjs → chunk-C7MYCQPG.mjs} +2 -2
  174. package/dist/{chunk-MOJC5DFO.js → chunk-CFLFCBRM.js} +79 -79
  175. package/dist/chunk-CFLFCBRM.js.map +1 -0
  176. package/dist/{chunk-O2HZT75K.mjs → chunk-DGWMOIIX.mjs} +2 -2
  177. package/dist/chunk-EBA7URWC.js +37 -0
  178. package/dist/chunk-EBA7URWC.js.map +1 -0
  179. package/dist/{chunk-EBTFIQCC.mjs → chunk-EBGFR7IQ.mjs} +2 -2
  180. package/dist/{chunk-WP3UDWP3.js → chunk-EMW3LCGX.js} +4 -4
  181. package/dist/{chunk-WP3UDWP3.js.map → chunk-EMW3LCGX.js.map} +1 -1
  182. package/dist/{chunk-GKVKXIRZ.mjs → chunk-EWG6Q2QF.mjs} +3 -3
  183. package/dist/{chunk-MWRT7E6I.js → chunk-FA6GCOJW.js} +13 -13
  184. package/dist/{chunk-MWRT7E6I.js.map → chunk-FA6GCOJW.js.map} +1 -1
  185. package/dist/{chunk-6B5LQVGS.mjs → chunk-FZUPX44N.mjs} +3 -3
  186. package/dist/{chunk-HZW5JFXJ.mjs → chunk-GH5YUGDP.mjs} +2 -2
  187. package/dist/{chunk-ZJXK26XL.mjs → chunk-GNQHR4AT.mjs} +2 -2
  188. package/dist/{chunk-KKVMVQSS.js → chunk-GYMVSUMC.js} +3 -3
  189. package/dist/{chunk-KKVMVQSS.js.map → chunk-GYMVSUMC.js.map} +1 -1
  190. package/dist/{chunk-O4WBFFP4.js → chunk-GYYFSFYJ.js} +5 -5
  191. package/dist/{chunk-O4WBFFP4.js.map → chunk-GYYFSFYJ.js.map} +1 -1
  192. package/dist/{chunk-FJWD3LTG.js → chunk-GZMZ3GPE.js} +3 -3
  193. package/dist/{chunk-FJWD3LTG.js.map → chunk-GZMZ3GPE.js.map} +1 -1
  194. package/dist/chunk-HEP6VNLE.mjs +1058 -0
  195. package/dist/chunk-HEP6VNLE.mjs.map +1 -0
  196. package/dist/{chunk-GBLDSLMP.mjs → chunk-IM4VNWZ6.mjs} +2 -2
  197. package/dist/{chunk-B4JAFWHZ.mjs → chunk-JGBX7KPP.mjs} +4 -4
  198. package/dist/{chunk-EJ2YRD73.js → chunk-KC7CYS7L.js} +1 -1
  199. package/dist/chunk-KC7CYS7L.js.map +1 -0
  200. package/dist/{chunk-HSQNZKWF.js → chunk-KDBTSXBL.js} +3 -3
  201. package/dist/{chunk-HSQNZKWF.js.map → chunk-KDBTSXBL.js.map} +1 -1
  202. package/dist/{chunk-LEEYRM4P.mjs → chunk-LH4UP3H6.mjs} +4 -4
  203. package/dist/chunk-LS4EGCEJ.js +1058 -0
  204. package/dist/chunk-LS4EGCEJ.js.map +1 -0
  205. package/dist/{chunk-YHJRDM57.mjs → chunk-LS6UXIAI.mjs} +2 -2
  206. package/dist/{chunk-7C7USYXO.js → chunk-LX6VW2CL.js} +7 -7
  207. package/dist/{chunk-7C7USYXO.js.map → chunk-LX6VW2CL.js.map} +1 -1
  208. package/dist/{chunk-YKCI7H7F.js → chunk-MEILCZ46.js} +3 -3
  209. package/dist/{chunk-YKCI7H7F.js.map → chunk-MEILCZ46.js.map} +1 -1
  210. package/dist/{chunk-CQXEQZSS.mjs → chunk-MK7TLTKV.mjs} +2 -2
  211. package/dist/{chunk-IFQGD46O.js → chunk-MKY42S3T.js} +3 -3
  212. package/dist/{chunk-IFQGD46O.js.map → chunk-MKY42S3T.js.map} +1 -1
  213. package/dist/{chunk-YEA65ZGR.mjs → chunk-MQCTISBB.mjs} +2 -2
  214. package/dist/{chunk-XWLXTFO2.js → chunk-MVEXCJVJ.js} +15 -15
  215. package/dist/{chunk-XWLXTFO2.js.map → chunk-MVEXCJVJ.js.map} +1 -1
  216. package/dist/{chunk-6IPKPLZN.js → chunk-OCIBLTVL.js} +3 -3
  217. package/dist/{chunk-6IPKPLZN.js.map → chunk-OCIBLTVL.js.map} +1 -1
  218. package/dist/{chunk-6FFOZKJK.mjs → chunk-ORVASFAF.mjs} +2 -2
  219. package/dist/{chunk-BQNJAQLK.mjs → chunk-OVRINYGJ.mjs} +2 -2
  220. package/dist/{chunk-ALHW5TD7.js → chunk-PCVWLKJC.js} +3 -3
  221. package/dist/{chunk-ALHW5TD7.js.map → chunk-PCVWLKJC.js.map} +1 -1
  222. package/dist/{chunk-UBNUCCLP.mjs → chunk-PDHZEFFZ.mjs} +2 -2
  223. package/dist/{chunk-662EUCCE.js → chunk-Q5VRX5TR.js} +7 -7
  224. package/dist/{chunk-662EUCCE.js.map → chunk-Q5VRX5TR.js.map} +1 -1
  225. package/dist/{chunk-XJJ45AMO.mjs → chunk-QBXT4LMT.mjs} +2 -2
  226. package/dist/{chunk-J2HZHUNE.js → chunk-QETA3PTM.js} +2 -2
  227. package/dist/{chunk-J2HZHUNE.js.map → chunk-QETA3PTM.js.map} +1 -1
  228. package/dist/{chunk-WERY7RYX.js → chunk-QFCGNRJO.js} +3 -3
  229. package/dist/{chunk-WERY7RYX.js.map → chunk-QFCGNRJO.js.map} +1 -1
  230. package/dist/{chunk-JMFZKAVY.js → chunk-RZDAIAVY.js} +5 -5
  231. package/dist/{chunk-JMFZKAVY.js.map → chunk-RZDAIAVY.js.map} +1 -1
  232. package/dist/{chunk-E5L36NZ6.mjs → chunk-TASK776Q.mjs} +2 -2
  233. package/dist/{chunk-SBBVFGKY.js → chunk-TYQP2J4H.js} +15 -15
  234. package/dist/{chunk-SBBVFGKY.js.map → chunk-TYQP2J4H.js.map} +1 -1
  235. package/dist/{chunk-KBYOIBJP.js → chunk-U2N3N4I2.js} +3 -3
  236. package/dist/{chunk-KBYOIBJP.js.map → chunk-U2N3N4I2.js.map} +1 -1
  237. package/dist/{chunk-OVV4X6PY.js → chunk-UERZHJKL.js} +3 -3
  238. package/dist/{chunk-OVV4X6PY.js.map → chunk-UERZHJKL.js.map} +1 -1
  239. package/dist/{chunk-3TGMDZ6D.js → chunk-UJI7NDUF.js} +6 -6
  240. package/dist/{chunk-3TGMDZ6D.js.map → chunk-UJI7NDUF.js.map} +1 -1
  241. package/dist/{chunk-UH6EEW25.js → chunk-VBOK3A4Y.js} +3 -3
  242. package/dist/{chunk-UH6EEW25.js.map → chunk-VBOK3A4Y.js.map} +1 -1
  243. package/dist/{chunk-LNNDFTXT.mjs → chunk-WJXJUSXH.mjs} +3 -3
  244. package/dist/{chunk-KTAC2KIA.js → chunk-X2PEBXX6.js} +3 -3
  245. package/dist/{chunk-KTAC2KIA.js.map → chunk-X2PEBXX6.js.map} +1 -1
  246. package/dist/{chunk-NUJYEF2Z.js → chunk-X7MXRBUO.js} +3 -3
  247. package/dist/{chunk-NUJYEF2Z.js.map → chunk-X7MXRBUO.js.map} +1 -1
  248. package/dist/{chunk-OKY2MPLS.mjs → chunk-XH2PTWXI.mjs} +2 -2
  249. package/dist/{chunk-CXROMRAO.mjs → chunk-XNYWZYOS.mjs} +1 -1
  250. package/dist/chunk-XNYWZYOS.mjs.map +1 -0
  251. package/dist/{chunk-DRBCUJR5.js → chunk-Y5L5ACRX.js} +4 -4
  252. package/dist/{chunk-DRBCUJR5.js.map → chunk-Y5L5ACRX.js.map} +1 -1
  253. package/dist/{chunk-RAOX6UTA.mjs → chunk-ZLJZA3CF.mjs} +2 -2
  254. package/dist/components/ReadAloudPromptReadingFluency/ReadAloudPromptReadingFluency.d.ts +3 -2
  255. package/dist/components/ReadAloudPromptReadingFluency/ReadAloudPromptReadingFluency.d.ts.map +1 -1
  256. package/dist/hooks/useAppContent/index.js +43 -41
  257. package/dist/hooks/useAppContent/index.js.map +1 -1
  258. package/dist/hooks/useAppContent/index.mjs +42 -40
  259. package/dist/hooks/useAppInitialization/index.js +3 -3
  260. package/dist/hooks/useAppInitialization/index.mjs +2 -2
  261. package/dist/hooks/useInstitution/index.d.ts +4 -0
  262. package/dist/hooks/useInstitution/index.d.ts.map +1 -1
  263. package/dist/hooks/useInstitution/index.js +2 -2
  264. package/dist/hooks/useInstitution/index.mjs +1 -1
  265. package/dist/hooks/useInstitution.d.ts +4 -0
  266. package/dist/hooks/useInstitution.d.ts.map +1 -1
  267. package/dist/hooks/useProfileLabels/index.js +1 -1
  268. package/dist/hooks/useProfileLabels/index.mjs +1 -1
  269. package/dist/hooks/useReadingFluencyAsset/index.d.ts +54 -0
  270. package/dist/hooks/useReadingFluencyAsset/index.d.ts.map +1 -0
  271. package/dist/hooks/useReadingFluencyAsset/index.js +9 -0
  272. package/dist/hooks/useReadingFluencyAsset/index.js.map +1 -0
  273. package/dist/hooks/useReadingFluencyAsset/index.mjs +9 -0
  274. package/dist/hooks/useReadingFluencyAsset/index.mjs.map +1 -0
  275. package/dist/hooks/useReadingFluencyAsset.d.ts +54 -0
  276. package/dist/hooks/useReadingFluencyAsset.d.ts.map +1 -0
  277. package/dist/index.d.ts +2 -0
  278. package/dist/index.d.ts.map +1 -1
  279. package/dist/index.js +74 -69
  280. package/dist/index.js.map +1 -1
  281. package/dist/index.mjs +102 -97
  282. package/package.json +8 -1
  283. package/dist/RichEditorCore-4G4YBLZZ.js.map +0 -1
  284. package/dist/chunk-47ULTDOL.mjs.map +0 -1
  285. package/dist/chunk-5J2UT2FR.js +0 -1058
  286. package/dist/chunk-5J2UT2FR.js.map +0 -1
  287. package/dist/chunk-5Q6MZWPK.mjs +0 -1058
  288. package/dist/chunk-5Q6MZWPK.mjs.map +0 -1
  289. package/dist/chunk-CXROMRAO.mjs.map +0 -1
  290. package/dist/chunk-EJ2YRD73.js.map +0 -1
  291. package/dist/chunk-MOJC5DFO.js.map +0 -1
  292. /package/dist/{chunk-LWUDWAX4.mjs.map → chunk-2X5TJZ5Z.mjs.map} +0 -0
  293. /package/dist/{chunk-ACZ54JIS.mjs.map → chunk-3I5QVUPZ.mjs.map} +0 -0
  294. /package/dist/{chunk-O264R6U2.mjs.map → chunk-43CA6NQG.mjs.map} +0 -0
  295. /package/dist/{chunk-34BR5MTL.mjs.map → chunk-5QPYIL4Z.mjs.map} +0 -0
  296. /package/dist/{chunk-JBAIBARE.mjs.map → chunk-7LRIQOCS.mjs.map} +0 -0
  297. /package/dist/{chunk-U452MQ5H.mjs.map → chunk-AFBTGILL.mjs.map} +0 -0
  298. /package/dist/{chunk-X34ETWDM.mjs.map → chunk-C7MYCQPG.mjs.map} +0 -0
  299. /package/dist/{chunk-O2HZT75K.mjs.map → chunk-DGWMOIIX.mjs.map} +0 -0
  300. /package/dist/{chunk-EBTFIQCC.mjs.map → chunk-EBGFR7IQ.mjs.map} +0 -0
  301. /package/dist/{chunk-GKVKXIRZ.mjs.map → chunk-EWG6Q2QF.mjs.map} +0 -0
  302. /package/dist/{chunk-6B5LQVGS.mjs.map → chunk-FZUPX44N.mjs.map} +0 -0
  303. /package/dist/{chunk-HZW5JFXJ.mjs.map → chunk-GH5YUGDP.mjs.map} +0 -0
  304. /package/dist/{chunk-ZJXK26XL.mjs.map → chunk-GNQHR4AT.mjs.map} +0 -0
  305. /package/dist/{chunk-GBLDSLMP.mjs.map → chunk-IM4VNWZ6.mjs.map} +0 -0
  306. /package/dist/{chunk-B4JAFWHZ.mjs.map → chunk-JGBX7KPP.mjs.map} +0 -0
  307. /package/dist/{chunk-LEEYRM4P.mjs.map → chunk-LH4UP3H6.mjs.map} +0 -0
  308. /package/dist/{chunk-YHJRDM57.mjs.map → chunk-LS6UXIAI.mjs.map} +0 -0
  309. /package/dist/{chunk-CQXEQZSS.mjs.map → chunk-MK7TLTKV.mjs.map} +0 -0
  310. /package/dist/{chunk-YEA65ZGR.mjs.map → chunk-MQCTISBB.mjs.map} +0 -0
  311. /package/dist/{chunk-6FFOZKJK.mjs.map → chunk-ORVASFAF.mjs.map} +0 -0
  312. /package/dist/{chunk-BQNJAQLK.mjs.map → chunk-OVRINYGJ.mjs.map} +0 -0
  313. /package/dist/{chunk-UBNUCCLP.mjs.map → chunk-PDHZEFFZ.mjs.map} +0 -0
  314. /package/dist/{chunk-XJJ45AMO.mjs.map → chunk-QBXT4LMT.mjs.map} +0 -0
  315. /package/dist/{chunk-E5L36NZ6.mjs.map → chunk-TASK776Q.mjs.map} +0 -0
  316. /package/dist/{chunk-LNNDFTXT.mjs.map → chunk-WJXJUSXH.mjs.map} +0 -0
  317. /package/dist/{chunk-OKY2MPLS.mjs.map → chunk-XH2PTWXI.mjs.map} +0 -0
  318. /package/dist/{chunk-RAOX6UTA.mjs.map → chunk-ZLJZA3CF.mjs.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-XWLXTFO2.js","../src/components/NotificationCard/NotificationCard.tsx"],"names":[],"mappings":"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","file":"/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-XWLXTFO2.js","sourcesContent":[null,"import { DotsThreeVerticalIcon } from '@phosphor-icons/react/dist/csr/DotsThreeVertical';\nimport { BellIcon } from '@phosphor-icons/react/dist/csr/Bell';\nimport { MouseEvent, ReactNode, useState, useEffect } from 'react';\nimport { cn } from '../../utils/utils';\nimport DropdownMenu, {\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '../DropdownMenu/DropdownMenu';\nimport { SkeletonCard } from '../Skeleton/Skeleton';\nimport IconButton from '../IconButton/IconButton';\nimport Modal from '../Modal/Modal';\nimport Text from '../Text/Text';\nimport Badge from '../Badge/Badge';\nimport { useMobile } from '../../hooks/useMobile';\nimport type {\n Notification,\n NotificationGroup,\n NotificationEntityType,\n} from '../../types/notifications';\nimport { formatTimeAgo } from '../../store/notificationStore';\nimport mockContentImage from '../../assets/img/mock-content.png';\n\n/**\n * Default interval (in ms) to auto-refresh the notification center while it is\n * open, so newly received notifications appear without reopening it.\n */\nconst DEFAULT_REFRESH_INTERVAL_MS = 3000;\n\n// Extended notification item for component usage with time string\nexport interface NotificationItem extends Omit<Notification, 'createdAt'> {\n time: string;\n createdAt: string | Date;\n}\n\n// Base props shared across all modes\ninterface BaseNotificationProps {\n /**\n * Additional CSS classes\n */\n className?: string;\n /**\n * Empty state image path\n */\n emptyStateImage?: string;\n /**\n * Empty state title\n */\n emptyStateTitle?: string;\n /**\n * Empty state description\n */\n emptyStateDescription?: string;\n}\n\n// Single notification card mode\ninterface SingleNotificationCardMode extends BaseNotificationProps {\n /**\n * Component mode - single card\n */\n mode: 'single';\n /**\n * The notification title\n */\n title: string;\n /**\n * The notification message content\n */\n message: string;\n /**\n * Time displayed (e.g., \"Há 3h\", \"12 Fev\")\n */\n time: string;\n /**\n * Whether the notification has been read\n */\n isRead: boolean;\n /**\n * Callback when user marks notification as read\n */\n onMarkAsRead: () => void;\n /**\n * Callback when user deletes notification\n */\n onDelete: () => void;\n /**\n * Optional callback for navigation action\n */\n onNavigate?: () => void;\n /**\n * Label for the action button (only shown if onNavigate is provided)\n */\n actionLabel?: string;\n}\n\n// List mode\ninterface NotificationListMode extends BaseNotificationProps {\n /**\n * Component mode - list\n */\n mode: 'list';\n /**\n * Array of notifications for list mode\n */\n notifications?: NotificationItem[];\n /**\n * Array of grouped notifications\n */\n groupedNotifications?: NotificationGroup[];\n /**\n * Loading state for list mode\n */\n loading?: boolean;\n /**\n * Error state for list mode\n */\n error?: string | null;\n /**\n * Callback for retry when error occurs\n */\n onRetry?: () => void;\n /**\n * Callback when user marks a notification as read in list mode\n */\n onMarkAsReadById?: (id: string) => void;\n /**\n * Callback when user deletes a notification in list mode\n */\n onDeleteById?: (id: string) => void;\n /**\n * Callback when user navigates from a notification in list mode\n */\n onNavigateById?: (\n entityType?: NotificationEntityType,\n entityId?: string\n ) => void;\n /**\n * Callback when user clicks on a global notification\n */\n onGlobalNotificationClick?: (notification: Notification) => void;\n /**\n * Function to get action label for a notification\n */\n getActionLabel?: (entityType?: NotificationEntityType) => string | undefined;\n /**\n * Custom empty state component\n */\n renderEmpty?: () => ReactNode;\n}\n\n// NotificationCenter mode\ninterface NotificationCenterMode extends BaseNotificationProps {\n /**\n * Component mode - center\n */\n mode: 'center';\n /**\n * Array of grouped notifications\n */\n groupedNotifications?: NotificationGroup[];\n /**\n * Loading state for center mode\n */\n loading?: boolean;\n /**\n * Error state for center mode\n */\n error?: string | null;\n /**\n * Callback for retry when error occurs\n */\n onRetry?: () => void;\n /**\n * Whether center mode is currently active (controls dropdown/modal visibility)\n */\n isActive?: boolean;\n /**\n * Callback when center mode is toggled\n */\n onToggleActive?: () => void;\n /**\n * Number of unread notifications for badge display\n */\n unreadCount?: number;\n /**\n * Callback when all notifications should be marked as read\n */\n onMarkAllAsRead?: () => void;\n /**\n * Callback to fetch notifications (called when center opens)\n */\n onFetchNotifications?: () => void;\n /**\n * Callback when user marks a notification as read in center mode\n */\n onMarkAsReadById?: (id: string) => void;\n /**\n * Callback when user deletes a notification in center mode\n */\n onDeleteById?: (id: string) => void;\n /**\n * Callback when user navigates from a notification in center mode\n */\n onNavigateById?: (\n entityType?: NotificationEntityType,\n entityId?: string\n ) => void;\n /**\n * Function to get action label for a notification\n */\n getActionLabel?: (entityType?: NotificationEntityType) => string | undefined;\n /**\n * Callback when dropdown open state changes (for synchronization with parent)\n */\n onOpenChange?: (open: boolean) => void;\n /**\n * Interval (in ms) to auto-refresh the list while the center is open, so newly\n * received notifications appear without reopening it. Defaults to 3000 (3s).\n * Set to 0 to disable polling.\n */\n refreshIntervalMs?: number;\n}\n\n// Union type for all modes\nexport type NotificationCardProps =\n | SingleNotificationCardMode\n | NotificationListMode\n | NotificationCenterMode;\n\n// Legacy interface for backward compatibility\nexport interface LegacyNotificationCardProps extends BaseNotificationProps {\n // Single notification mode props\n title?: string;\n message?: string;\n time?: string;\n isRead?: boolean;\n onMarkAsRead?: () => void;\n onDelete?: () => void;\n onNavigate?: () => void;\n actionLabel?: string;\n\n // List mode props\n notifications?: NotificationItem[];\n groupedNotifications?: NotificationGroup[];\n loading?: boolean;\n error?: string | null;\n onRetry?: () => void;\n onMarkAsReadById?: (id: string) => void;\n onDeleteById?: (id: string) => void;\n onNavigateById?: (\n entityType?: NotificationEntityType,\n entityId?: string\n ) => void;\n onGlobalNotificationClick?: (notification: Notification) => void;\n getActionLabel?: (entityType?: NotificationEntityType) => string | undefined;\n renderEmpty?: () => ReactNode;\n\n // NotificationCenter mode props\n variant?: 'card' | 'center';\n isActive?: boolean;\n onToggleActive?: () => void;\n unreadCount?: number;\n onMarkAllAsRead?: () => void;\n onFetchNotifications?: () => void;\n onOpenChange?: (open: boolean) => void;\n}\n\n/**\n * Empty state component for notifications\n */\nconst NotificationEmpty = ({\n emptyStateImage,\n emptyStateTitle = 'Nenhuma notificação no momento',\n emptyStateDescription = 'Você está em dia com todas as novidades. Volte depois para conferir atualizações!',\n}: {\n emptyStateImage?: string;\n emptyStateTitle?: string;\n emptyStateDescription?: string;\n}) => {\n return (\n <div className=\"flex flex-col items-center justify-center gap-4 p-6 w-full\">\n {/* Notification Icon */}\n {emptyStateImage && (\n <div className=\"w-20 h-20 flex items-center justify-center\">\n <img\n src={emptyStateImage}\n alt=\"Sem notificações\"\n width={82}\n height={82}\n className=\"object-contain\"\n />\n </div>\n )}\n\n {/* Title */}\n <h3 className=\"text-xl font-semibold text-text-950 text-center leading-[23px]\">\n {emptyStateTitle}\n </h3>\n\n {/* Description */}\n <p className=\"text-sm font-normal text-text-400 text-center max-w-[316px] leading-[21px]\">\n {emptyStateDescription}\n </p>\n </div>\n );\n};\n\n/**\n * Notification header component\n */\nconst NotificationHeader = ({\n unreadCount,\n variant = 'modal',\n}: {\n unreadCount: number;\n variant?: 'modal' | 'dropdown';\n}) => {\n return (\n <div className=\"flex items-center justify-between gap-2\">\n {variant === 'modal' ? (\n <Text size=\"sm\" weight=\"bold\" className=\"text-text-950\">\n Notificações\n </Text>\n ) : (\n <h3 className=\"text-sm font-semibold text-text-950\">Notificações</h3>\n )}\n {unreadCount > 0 && (\n <Badge\n variant=\"solid\"\n action=\"info\"\n size=\"small\"\n iconLeft={<BellIcon size={12} aria-hidden=\"true\" focusable=\"false\" />}\n className=\"border-0\"\n >\n {unreadCount === 1 ? '1 não lida' : `${unreadCount} não lidas`}\n </Badge>\n )}\n </div>\n );\n};\n\n/**\n * Single notification card component\n */\nconst SingleNotificationCard = ({\n title,\n message,\n time,\n isRead,\n onMarkAsRead,\n onDelete,\n onNavigate,\n actionLabel,\n className,\n}: {\n title: string;\n message: string;\n time: string;\n isRead: boolean;\n onMarkAsRead: () => void;\n onDelete: () => void;\n onNavigate?: () => void;\n actionLabel?: string;\n className?: string;\n}) => {\n const handleMarkAsRead = (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (!isRead) {\n onMarkAsRead();\n }\n };\n\n const handleDelete = (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n onDelete();\n };\n\n const handleNavigate = (e: MouseEvent) => {\n e.stopPropagation();\n if (onNavigate) {\n onNavigate();\n }\n };\n\n return (\n <div\n className={cn(\n 'flex flex-col justify-center items-start p-4 gap-2 w-full bg-background border-b border-border-200',\n 'last:border-b-0',\n className\n )}\n >\n {/* Header with unread indicator and actions menu */}\n <div className=\"flex items-center gap-2 w-full\">\n {/* Unread indicator */}\n {!isRead && (\n <div className=\"w-[7px] h-[7px] bg-info-300 rounded-full flex-shrink-0\" />\n )}\n\n {/* Title */}\n <h3 className=\"font-bold text-sm leading-4 text-text-950 flex-grow\">\n {title}\n </h3>\n\n {/* Actions dropdown */}\n <DropdownMenu>\n <DropdownMenuTrigger\n className=\"flex-shrink-0 inline-flex items-center justify-center font-medium bg-transparent text-text-950 cursor-pointer hover:bg-info-50 w-6 h-6 rounded-lg\"\n aria-label=\"Menu de ações\"\n >\n <DotsThreeVerticalIcon size={24} />\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"min-w-[160px]\">\n {!isRead && (\n <DropdownMenuItem\n onClick={handleMarkAsRead}\n className=\"text-text-950\"\n >\n Marcar como lida\n </DropdownMenuItem>\n )}\n <DropdownMenuItem onClick={handleDelete} className=\"text-error-600\">\n Deletar\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n\n {/* Message */}\n <p className=\"text-sm leading-[21px] text-text-800 w-full\">{message}</p>\n\n {/* Time and action button */}\n <div className=\"flex items-center justify-between w-full\">\n <span className=\"text-sm font-medium text-text-400\">{time}</span>\n\n {onNavigate && actionLabel && (\n <button\n type=\"button\"\n onClick={handleNavigate}\n className=\"text-sm font-medium text-info-600 hover:text-info-700 cursor-pointer\"\n >\n {actionLabel}\n </button>\n )}\n </div>\n </div>\n );\n};\n\n/**\n * Notification list component for displaying grouped notifications\n */\nconst NotificationList = ({\n groupedNotifications = [],\n loading = false,\n error = null,\n onRetry,\n onMarkAsReadById,\n onDeleteById,\n onNavigateById,\n onGlobalNotificationClick,\n getActionLabel,\n renderEmpty,\n className,\n emptyStateImage,\n}: {\n groupedNotifications?: NotificationGroup[];\n loading?: boolean;\n error?: string | null;\n onRetry?: () => void;\n onMarkAsReadById?: (id: string) => void;\n onDeleteById?: (id: string) => void;\n onNavigateById?: (\n entityType?: NotificationEntityType,\n entityId?: string\n ) => void;\n onGlobalNotificationClick?: (notification: Notification) => void;\n getActionLabel?: (entityType?: NotificationEntityType) => string | undefined;\n renderEmpty?: () => ReactNode;\n className?: string;\n emptyStateImage?: string;\n}) => {\n // State for global notification modal when onGlobalNotificationClick is not provided\n const [globalNotificationModal, setGlobalNotificationModal] = useState<{\n isOpen: boolean;\n notification: Notification | null;\n }>({ isOpen: false, notification: null });\n\n // Default handler for global notifications when onGlobalNotificationClick is not provided\n const handleGlobalNotificationClick = (notification: Notification) => {\n if (onGlobalNotificationClick) {\n onGlobalNotificationClick(notification);\n } else {\n // Open modal as fallback\n setGlobalNotificationModal({\n isOpen: true,\n notification,\n });\n }\n };\n // Error state\n if (error) {\n return (\n <div className=\"flex flex-col items-center gap-4 p-6 w-full\">\n <p className=\"text-sm text-error-600\">{error}</p>\n {onRetry && (\n <button\n type=\"button\"\n onClick={onRetry}\n className=\"text-sm text-info-600 hover:text-info-700\"\n >\n Tentar novamente\n </button>\n )}\n </div>\n );\n }\n\n // Loading state — only show the skeleton on the initial load (empty list).\n // Background refreshes (e.g. while the center polls) keep the list visible.\n if (loading && groupedNotifications.length === 0) {\n return (\n <div className=\"flex flex-col gap-0 w-full\">\n {['skeleton-first', 'skeleton-second', 'skeleton-third'].map(\n (skeletonId) => (\n <SkeletonCard\n key={skeletonId}\n className=\"p-4 border-b border-border-200\"\n />\n )\n )}\n </div>\n );\n }\n\n // Empty state\n if (!groupedNotifications || groupedNotifications.length === 0) {\n return renderEmpty ? (\n <div className=\"w-full\">{renderEmpty()}</div>\n ) : (\n <NotificationEmpty />\n );\n }\n\n return (\n <div className={cn('flex flex-col gap-0 w-full', className)}>\n {groupedNotifications.map((group, idx) => (\n <div key={`${group.label}-${idx}`} className=\"flex flex-col\">\n {/* Group header */}\n <div className=\"flex items-end px-4 py-6 pb-4\">\n <h4 className=\"text-lg font-bold text-text-500 flex-grow\">\n {group.label}\n </h4>\n </div>\n\n {/* Notifications in group */}\n {group.notifications.map((notification) => {\n // Check if this is a global notification\n const isGlobalNotification =\n !notification.entityType &&\n !notification.entityId &&\n !notification.activity &&\n !notification.recommendedClass;\n\n // Determine navigation handler\n let navigationHandler: (() => void) | undefined;\n if (isGlobalNotification) {\n navigationHandler = () =>\n handleGlobalNotificationClick(notification);\n } else if (\n notification.entityType &&\n notification.entityId &&\n onNavigateById\n ) {\n navigationHandler = () =>\n onNavigateById(\n notification.entityType ?? undefined,\n notification.entityId ?? undefined\n );\n }\n\n // Determine action label\n let actionLabel: string | undefined;\n if (isGlobalNotification) {\n // For global notifications, call getActionLabel without parameters or with null\n actionLabel = getActionLabel?.(undefined);\n } else {\n // For entity-specific notifications, pass the entityType\n actionLabel = getActionLabel?.(\n notification.entityType ?? undefined\n );\n }\n\n return (\n <SingleNotificationCard\n key={notification.id}\n title={notification.title}\n message={notification.message}\n time={\n (notification as Partial<NotificationItem>).time ??\n formatTimeAgo(new Date(notification.createdAt))\n }\n isRead={notification.isRead}\n onMarkAsRead={() => onMarkAsReadById?.(notification.id)}\n onDelete={() => onDeleteById?.(notification.id)}\n onNavigate={navigationHandler}\n actionLabel={actionLabel}\n />\n );\n })}\n </div>\n ))}\n\n {/* Global notification modal for list mode */}\n <Modal\n isOpen={globalNotificationModal.isOpen}\n onClose={() =>\n setGlobalNotificationModal({ isOpen: false, notification: null })\n }\n title={globalNotificationModal.notification?.title || ''}\n description={globalNotificationModal.notification?.message || ''}\n variant=\"activity\"\n image={\n globalNotificationModal.notification?.linkImg ||\n emptyStateImage ||\n mockContentImage\n }\n actionLink={\n globalNotificationModal.notification?.actionLink || undefined\n }\n actionLabel=\"Ver mais\"\n size=\"lg\"\n />\n </div>\n );\n};\n\n// Internal props type for NotificationCenter (without mode)\ntype NotificationCenterProps = Omit<NotificationCenterMode, 'mode'>;\n\n/**\n * NotificationCenter component for modal/dropdown mode\n */\nconst NotificationCenter = ({\n isActive,\n onToggleActive,\n unreadCount = 0,\n groupedNotifications = [],\n loading = false,\n error = null,\n onRetry,\n onMarkAsReadById,\n onDeleteById,\n onNavigateById,\n getActionLabel,\n onFetchNotifications,\n onMarkAllAsRead,\n onOpenChange,\n emptyStateImage,\n emptyStateTitle,\n emptyStateDescription,\n className,\n refreshIntervalMs = DEFAULT_REFRESH_INTERVAL_MS,\n}: NotificationCenterProps) => {\n const { isMobile } = useMobile();\n const [isModalOpen, setIsModalOpen] = useState(false);\n const [globalNotificationModal, setGlobalNotificationModal] = useState<{\n isOpen: boolean;\n notification: Notification | null;\n }>({ isOpen: false, notification: null });\n\n // Handle mobile click\n const handleMobileClick = () => {\n setIsModalOpen(true);\n onFetchNotifications?.();\n };\n\n // Handle desktop click\n const handleDesktopClick = () => {\n onToggleActive?.();\n };\n\n // Handle dropdown open change\n const handleOpenChange = (open: boolean) => {\n const controlledByParent =\n typeof isActive === 'boolean' && typeof onToggleActive === 'function';\n\n // Always notify parent if they want the signal.\n onOpenChange?.(open);\n\n // If parent controls via toggle only (no onOpenChange), keep them in sync on close.\n if (controlledByParent && !onOpenChange && !open && isActive) {\n onToggleActive?.();\n }\n };\n\n // Fetch notifications when dropdown opens\n useEffect(() => {\n if (isActive) {\n onFetchNotifications?.();\n }\n }, [isActive, onFetchNotifications]);\n\n // While the center is open, poll periodically so newly received notifications\n // appear without the user having to reopen it. The list is not replaced by a\n // skeleton on these background refreshes (see NotificationList loading gate).\n const isCenterOpen = isMobile ? isModalOpen : Boolean(isActive);\n useEffect(() => {\n if (!isCenterOpen || !onFetchNotifications || refreshIntervalMs <= 0) {\n return;\n }\n const intervalId = setInterval(() => {\n onFetchNotifications();\n }, refreshIntervalMs);\n return () => clearInterval(intervalId);\n }, [isCenterOpen, onFetchNotifications, refreshIntervalMs]);\n\n const renderEmptyState = () => (\n <NotificationEmpty\n emptyStateImage={emptyStateImage}\n emptyStateTitle={emptyStateTitle}\n emptyStateDescription={emptyStateDescription}\n />\n );\n\n if (isMobile) {\n return (\n <>\n <IconButton\n active={isModalOpen}\n onClick={handleMobileClick}\n icon={\n <>\n <Badge\n variant=\"notification\"\n notificationActive={unreadCount > 0}\n className=\"p-0\"\n />\n {unreadCount > 0 && (\n <Text as=\"span\" className=\"sr-only\">\n {unreadCount} notificações não lidas\n </Text>\n )}\n </>\n }\n className={className}\n />\n <Modal\n isOpen={isModalOpen}\n onClose={() => setIsModalOpen(false)}\n title=\"Notificações\"\n size=\"md\"\n hideCloseButton={false}\n closeOnEscape={true}\n >\n <div className=\"flex flex-col h-full max-h-[80vh]\">\n <div className=\"px-0 pb-3 border-b border-border-200\">\n <NotificationHeader unreadCount={unreadCount} variant=\"modal\" />\n {unreadCount > 0 && onMarkAllAsRead && (\n <button\n type=\"button\"\n onClick={onMarkAllAsRead}\n className=\"text-sm font-medium text-info-600 hover:text-info-700 cursor-pointer mt-2\"\n >\n Marcar todas como lidas\n </button>\n )}\n </div>\n <div className=\"flex-1 overflow-y-auto\">\n <NotificationList\n groupedNotifications={groupedNotifications}\n loading={loading}\n error={error}\n onRetry={onRetry}\n onMarkAsReadById={onMarkAsReadById}\n onDeleteById={onDeleteById}\n onNavigateById={(entityType, entityId) => {\n setIsModalOpen(false);\n onNavigateById?.(entityType, entityId);\n }}\n onGlobalNotificationClick={(notification) => {\n setIsModalOpen(false);\n setGlobalNotificationModal({\n isOpen: true,\n notification,\n });\n }}\n getActionLabel={getActionLabel}\n renderEmpty={renderEmptyState}\n emptyStateImage={emptyStateImage}\n />\n </div>\n </div>\n </Modal>\n {/* Global Notification Modal (mobile) */}\n <Modal\n isOpen={globalNotificationModal.isOpen}\n onClose={() =>\n setGlobalNotificationModal({ isOpen: false, notification: null })\n }\n title={globalNotificationModal.notification?.title || ''}\n variant=\"activity\"\n description={globalNotificationModal.notification?.message}\n image={\n globalNotificationModal.notification?.linkImg ||\n emptyStateImage ||\n mockContentImage\n }\n actionLink={\n globalNotificationModal.notification?.actionLink || undefined\n }\n actionLabel=\"Ver mais\"\n size=\"lg\"\n />\n </>\n );\n }\n\n return (\n <>\n <DropdownMenu\n {...(typeof isActive === 'boolean'\n ? { open: isActive, onOpenChange: handleOpenChange }\n : { onOpenChange: handleOpenChange })}\n >\n <DropdownMenuTrigger className=\"text-primary cursor-pointer\">\n <IconButton\n active={isActive}\n onClick={handleDesktopClick}\n icon={\n <>\n <Badge\n variant=\"notification\"\n notificationActive={unreadCount > 0}\n className={cn('p-0', isActive && 'text-primary-950!')}\n />\n {unreadCount > 0 && (\n <Text as=\"span\" className=\"sr-only\">\n {unreadCount} notificações não lidas\n </Text>\n )}\n </>\n }\n className={className}\n />\n </DropdownMenuTrigger>\n <DropdownMenuContent\n className=\"min-w-[320px] max-w-[400px] max-h-[500px] overflow-hidden\"\n side=\"bottom\"\n align=\"end\"\n >\n <div className=\"flex flex-col\">\n <div className=\"px-4 py-3 border-b border-border-200\">\n <NotificationHeader\n unreadCount={unreadCount}\n variant=\"dropdown\"\n />\n {unreadCount > 0 && onMarkAllAsRead && (\n <button\n type=\"button\"\n onClick={onMarkAllAsRead}\n className=\"text-sm font-medium text-info-600 hover:text-info-700 cursor-pointer mt-2\"\n >\n Marcar todas como lidas\n </button>\n )}\n </div>\n <div className=\"max-h-[350px] overflow-y-auto\">\n <NotificationList\n groupedNotifications={groupedNotifications}\n loading={loading}\n error={error}\n onRetry={onRetry}\n onMarkAsReadById={onMarkAsReadById}\n onDeleteById={onDeleteById}\n onNavigateById={onNavigateById}\n onGlobalNotificationClick={(notification) => {\n setGlobalNotificationModal({\n isOpen: true,\n notification,\n });\n }}\n getActionLabel={getActionLabel}\n renderEmpty={renderEmptyState}\n emptyStateImage={emptyStateImage}\n />\n </div>\n </div>\n </DropdownMenuContent>\n </DropdownMenu>\n\n {/* Global Notification Modal */}\n <Modal\n isOpen={globalNotificationModal.isOpen}\n onClose={() =>\n setGlobalNotificationModal({ isOpen: false, notification: null })\n }\n title={globalNotificationModal.notification?.title || ''}\n variant=\"activity\"\n description={globalNotificationModal.notification?.message}\n image={\n globalNotificationModal.notification?.linkImg ||\n emptyStateImage ||\n mockContentImage\n }\n actionLink={\n globalNotificationModal.notification?.actionLink || undefined\n }\n actionLabel=\"Ver mais\"\n size=\"lg\"\n />\n </>\n );\n};\n\n/**\n * NotificationCard component - can display single notification, list of notifications, or center mode\n *\n * @param props - The notification card properties\n * @returns JSX element representing the notification card, list, or center\n */\nconst NotificationCard = (props: NotificationCardProps) => {\n // Use mode discriminator to determine which component to render\n switch (props.mode) {\n case 'single':\n return (\n <SingleNotificationCard\n title={props.title}\n message={props.message}\n time={props.time}\n isRead={props.isRead}\n onMarkAsRead={props.onMarkAsRead}\n onDelete={props.onDelete}\n onNavigate={props.onNavigate}\n actionLabel={props.actionLabel}\n className={props.className}\n />\n );\n\n case 'list':\n return (\n <NotificationList\n groupedNotifications={\n props.groupedNotifications ??\n (props.notifications\n ? [\n {\n label: 'Notificações',\n notifications: props.notifications as Notification[],\n },\n ]\n : [])\n }\n loading={props.loading}\n error={props.error}\n onRetry={props.onRetry}\n onMarkAsReadById={props.onMarkAsReadById}\n onDeleteById={props.onDeleteById}\n onNavigateById={props.onNavigateById}\n onGlobalNotificationClick={props.onGlobalNotificationClick}\n getActionLabel={props.getActionLabel}\n renderEmpty={props.renderEmpty}\n className={props.className}\n emptyStateImage={props.emptyStateImage}\n />\n );\n\n case 'center':\n return <NotificationCenter {...props} />;\n\n default:\n // This should never happen with proper typing, but provides a fallback\n return (\n <div className=\"flex flex-col items-center gap-4 p-6 w-full\">\n <p className=\"text-sm text-text-600\">\n Modo de notificação não reconhecido\n </p>\n </div>\n );\n }\n};\n\n/**\n * Legacy NotificationCard component for backward compatibility\n * Automatically detects mode based on provided props\n */\nexport const LegacyNotificationCard = (props: LegacyNotificationCardProps) => {\n // If variant is center, render NotificationCenter\n if (props.variant === 'center') {\n const centerProps: NotificationCenterMode = {\n mode: 'center',\n ...props,\n };\n return <NotificationCenter {...centerProps} />;\n }\n\n // If we have list-related props, render list mode\n if (\n props.groupedNotifications !== undefined ||\n props.notifications !== undefined ||\n props.loading ||\n props.error\n ) {\n return (\n <NotificationList\n groupedNotifications={\n props.groupedNotifications ??\n (props.notifications\n ? [\n {\n label: 'Notificações',\n notifications: props.notifications as Notification[],\n },\n ]\n : [])\n }\n loading={props.loading}\n error={props.error}\n onRetry={props.onRetry}\n onMarkAsReadById={props.onMarkAsReadById}\n onDeleteById={props.onDeleteById}\n onNavigateById={props.onNavigateById}\n onGlobalNotificationClick={props.onGlobalNotificationClick}\n getActionLabel={props.getActionLabel}\n renderEmpty={props.renderEmpty}\n className={props.className}\n emptyStateImage={props.emptyStateImage}\n />\n );\n }\n\n // If we have single notification props, render single card mode\n if (\n props.title !== undefined &&\n props.message !== undefined &&\n props.time !== undefined &&\n props.isRead !== undefined &&\n props.onMarkAsRead &&\n props.onDelete\n ) {\n const singleProps: SingleNotificationCardMode = {\n mode: 'single',\n title: props.title,\n message: props.message,\n time: props.time,\n isRead: props.isRead,\n onMarkAsRead: props.onMarkAsRead,\n onDelete: props.onDelete,\n onNavigate: props.onNavigate,\n actionLabel: props.actionLabel,\n className: props.className,\n emptyStateImage: props.emptyStateImage,\n emptyStateTitle: props.emptyStateTitle,\n emptyStateDescription: props.emptyStateDescription,\n };\n return (\n <SingleNotificationCard\n title={singleProps.title}\n message={singleProps.message}\n time={singleProps.time}\n isRead={singleProps.isRead}\n onMarkAsRead={singleProps.onMarkAsRead}\n onDelete={singleProps.onDelete}\n onNavigate={singleProps.onNavigate}\n actionLabel={singleProps.actionLabel}\n className={singleProps.className}\n />\n );\n }\n\n // Default empty state if no valid props provided\n return (\n <div className=\"flex flex-col items-center gap-4 p-6 w-full\">\n <p className=\"text-sm text-text-600\">Nenhuma notificação configurada</p>\n </div>\n );\n};\n\nexport default NotificationCard;\nexport type { NotificationGroup };\n"]}
1
+ {"version":3,"sources":["/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-MVEXCJVJ.js","../src/components/NotificationCard/NotificationCard.tsx"],"names":[],"mappings":"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","file":"/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-MVEXCJVJ.js","sourcesContent":[null,"import { DotsThreeVerticalIcon } from '@phosphor-icons/react/dist/csr/DotsThreeVertical';\nimport { BellIcon } from '@phosphor-icons/react/dist/csr/Bell';\nimport { MouseEvent, ReactNode, useState, useEffect } from 'react';\nimport { cn } from '../../utils/utils';\nimport DropdownMenu, {\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '../DropdownMenu/DropdownMenu';\nimport { SkeletonCard } from '../Skeleton/Skeleton';\nimport IconButton from '../IconButton/IconButton';\nimport Modal from '../Modal/Modal';\nimport Text from '../Text/Text';\nimport Badge from '../Badge/Badge';\nimport { useMobile } from '../../hooks/useMobile';\nimport type {\n Notification,\n NotificationGroup,\n NotificationEntityType,\n} from '../../types/notifications';\nimport { formatTimeAgo } from '../../store/notificationStore';\nimport mockContentImage from '../../assets/img/mock-content.png';\n\n/**\n * Default interval (in ms) to auto-refresh the notification center while it is\n * open, so newly received notifications appear without reopening it.\n */\nconst DEFAULT_REFRESH_INTERVAL_MS = 3000;\n\n// Extended notification item for component usage with time string\nexport interface NotificationItem extends Omit<Notification, 'createdAt'> {\n time: string;\n createdAt: string | Date;\n}\n\n// Base props shared across all modes\ninterface BaseNotificationProps {\n /**\n * Additional CSS classes\n */\n className?: string;\n /**\n * Empty state image path\n */\n emptyStateImage?: string;\n /**\n * Empty state title\n */\n emptyStateTitle?: string;\n /**\n * Empty state description\n */\n emptyStateDescription?: string;\n}\n\n// Single notification card mode\ninterface SingleNotificationCardMode extends BaseNotificationProps {\n /**\n * Component mode - single card\n */\n mode: 'single';\n /**\n * The notification title\n */\n title: string;\n /**\n * The notification message content\n */\n message: string;\n /**\n * Time displayed (e.g., \"Há 3h\", \"12 Fev\")\n */\n time: string;\n /**\n * Whether the notification has been read\n */\n isRead: boolean;\n /**\n * Callback when user marks notification as read\n */\n onMarkAsRead: () => void;\n /**\n * Callback when user deletes notification\n */\n onDelete: () => void;\n /**\n * Optional callback for navigation action\n */\n onNavigate?: () => void;\n /**\n * Label for the action button (only shown if onNavigate is provided)\n */\n actionLabel?: string;\n}\n\n// List mode\ninterface NotificationListMode extends BaseNotificationProps {\n /**\n * Component mode - list\n */\n mode: 'list';\n /**\n * Array of notifications for list mode\n */\n notifications?: NotificationItem[];\n /**\n * Array of grouped notifications\n */\n groupedNotifications?: NotificationGroup[];\n /**\n * Loading state for list mode\n */\n loading?: boolean;\n /**\n * Error state for list mode\n */\n error?: string | null;\n /**\n * Callback for retry when error occurs\n */\n onRetry?: () => void;\n /**\n * Callback when user marks a notification as read in list mode\n */\n onMarkAsReadById?: (id: string) => void;\n /**\n * Callback when user deletes a notification in list mode\n */\n onDeleteById?: (id: string) => void;\n /**\n * Callback when user navigates from a notification in list mode\n */\n onNavigateById?: (\n entityType?: NotificationEntityType,\n entityId?: string\n ) => void;\n /**\n * Callback when user clicks on a global notification\n */\n onGlobalNotificationClick?: (notification: Notification) => void;\n /**\n * Function to get action label for a notification\n */\n getActionLabel?: (entityType?: NotificationEntityType) => string | undefined;\n /**\n * Custom empty state component\n */\n renderEmpty?: () => ReactNode;\n}\n\n// NotificationCenter mode\ninterface NotificationCenterMode extends BaseNotificationProps {\n /**\n * Component mode - center\n */\n mode: 'center';\n /**\n * Array of grouped notifications\n */\n groupedNotifications?: NotificationGroup[];\n /**\n * Loading state for center mode\n */\n loading?: boolean;\n /**\n * Error state for center mode\n */\n error?: string | null;\n /**\n * Callback for retry when error occurs\n */\n onRetry?: () => void;\n /**\n * Whether center mode is currently active (controls dropdown/modal visibility)\n */\n isActive?: boolean;\n /**\n * Callback when center mode is toggled\n */\n onToggleActive?: () => void;\n /**\n * Number of unread notifications for badge display\n */\n unreadCount?: number;\n /**\n * Callback when all notifications should be marked as read\n */\n onMarkAllAsRead?: () => void;\n /**\n * Callback to fetch notifications (called when center opens)\n */\n onFetchNotifications?: () => void;\n /**\n * Callback when user marks a notification as read in center mode\n */\n onMarkAsReadById?: (id: string) => void;\n /**\n * Callback when user deletes a notification in center mode\n */\n onDeleteById?: (id: string) => void;\n /**\n * Callback when user navigates from a notification in center mode\n */\n onNavigateById?: (\n entityType?: NotificationEntityType,\n entityId?: string\n ) => void;\n /**\n * Function to get action label for a notification\n */\n getActionLabel?: (entityType?: NotificationEntityType) => string | undefined;\n /**\n * Callback when dropdown open state changes (for synchronization with parent)\n */\n onOpenChange?: (open: boolean) => void;\n /**\n * Interval (in ms) to auto-refresh the list while the center is open, so newly\n * received notifications appear without reopening it. Defaults to 3000 (3s).\n * Set to 0 to disable polling.\n */\n refreshIntervalMs?: number;\n}\n\n// Union type for all modes\nexport type NotificationCardProps =\n | SingleNotificationCardMode\n | NotificationListMode\n | NotificationCenterMode;\n\n// Legacy interface for backward compatibility\nexport interface LegacyNotificationCardProps extends BaseNotificationProps {\n // Single notification mode props\n title?: string;\n message?: string;\n time?: string;\n isRead?: boolean;\n onMarkAsRead?: () => void;\n onDelete?: () => void;\n onNavigate?: () => void;\n actionLabel?: string;\n\n // List mode props\n notifications?: NotificationItem[];\n groupedNotifications?: NotificationGroup[];\n loading?: boolean;\n error?: string | null;\n onRetry?: () => void;\n onMarkAsReadById?: (id: string) => void;\n onDeleteById?: (id: string) => void;\n onNavigateById?: (\n entityType?: NotificationEntityType,\n entityId?: string\n ) => void;\n onGlobalNotificationClick?: (notification: Notification) => void;\n getActionLabel?: (entityType?: NotificationEntityType) => string | undefined;\n renderEmpty?: () => ReactNode;\n\n // NotificationCenter mode props\n variant?: 'card' | 'center';\n isActive?: boolean;\n onToggleActive?: () => void;\n unreadCount?: number;\n onMarkAllAsRead?: () => void;\n onFetchNotifications?: () => void;\n onOpenChange?: (open: boolean) => void;\n}\n\n/**\n * Empty state component for notifications\n */\nconst NotificationEmpty = ({\n emptyStateImage,\n emptyStateTitle = 'Nenhuma notificação no momento',\n emptyStateDescription = 'Você está em dia com todas as novidades. Volte depois para conferir atualizações!',\n}: {\n emptyStateImage?: string;\n emptyStateTitle?: string;\n emptyStateDescription?: string;\n}) => {\n return (\n <div className=\"flex flex-col items-center justify-center gap-4 p-6 w-full\">\n {/* Notification Icon */}\n {emptyStateImage && (\n <div className=\"w-20 h-20 flex items-center justify-center\">\n <img\n src={emptyStateImage}\n alt=\"Sem notificações\"\n width={82}\n height={82}\n className=\"object-contain\"\n />\n </div>\n )}\n\n {/* Title */}\n <h3 className=\"text-xl font-semibold text-text-950 text-center leading-[23px]\">\n {emptyStateTitle}\n </h3>\n\n {/* Description */}\n <p className=\"text-sm font-normal text-text-400 text-center max-w-[316px] leading-[21px]\">\n {emptyStateDescription}\n </p>\n </div>\n );\n};\n\n/**\n * Notification header component\n */\nconst NotificationHeader = ({\n unreadCount,\n variant = 'modal',\n}: {\n unreadCount: number;\n variant?: 'modal' | 'dropdown';\n}) => {\n return (\n <div className=\"flex items-center justify-between gap-2\">\n {variant === 'modal' ? (\n <Text size=\"sm\" weight=\"bold\" className=\"text-text-950\">\n Notificações\n </Text>\n ) : (\n <h3 className=\"text-sm font-semibold text-text-950\">Notificações</h3>\n )}\n {unreadCount > 0 && (\n <Badge\n variant=\"solid\"\n action=\"info\"\n size=\"small\"\n iconLeft={<BellIcon size={12} aria-hidden=\"true\" focusable=\"false\" />}\n className=\"border-0\"\n >\n {unreadCount === 1 ? '1 não lida' : `${unreadCount} não lidas`}\n </Badge>\n )}\n </div>\n );\n};\n\n/**\n * Single notification card component\n */\nconst SingleNotificationCard = ({\n title,\n message,\n time,\n isRead,\n onMarkAsRead,\n onDelete,\n onNavigate,\n actionLabel,\n className,\n}: {\n title: string;\n message: string;\n time: string;\n isRead: boolean;\n onMarkAsRead: () => void;\n onDelete: () => void;\n onNavigate?: () => void;\n actionLabel?: string;\n className?: string;\n}) => {\n const handleMarkAsRead = (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (!isRead) {\n onMarkAsRead();\n }\n };\n\n const handleDelete = (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n onDelete();\n };\n\n const handleNavigate = (e: MouseEvent) => {\n e.stopPropagation();\n if (onNavigate) {\n onNavigate();\n }\n };\n\n return (\n <div\n className={cn(\n 'flex flex-col justify-center items-start p-4 gap-2 w-full bg-background border-b border-border-200',\n 'last:border-b-0',\n className\n )}\n >\n {/* Header with unread indicator and actions menu */}\n <div className=\"flex items-center gap-2 w-full\">\n {/* Unread indicator */}\n {!isRead && (\n <div className=\"w-[7px] h-[7px] bg-info-300 rounded-full flex-shrink-0\" />\n )}\n\n {/* Title */}\n <h3 className=\"font-bold text-sm leading-4 text-text-950 flex-grow\">\n {title}\n </h3>\n\n {/* Actions dropdown */}\n <DropdownMenu>\n <DropdownMenuTrigger\n className=\"flex-shrink-0 inline-flex items-center justify-center font-medium bg-transparent text-text-950 cursor-pointer hover:bg-info-50 w-6 h-6 rounded-lg\"\n aria-label=\"Menu de ações\"\n >\n <DotsThreeVerticalIcon size={24} />\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"min-w-[160px]\">\n {!isRead && (\n <DropdownMenuItem\n onClick={handleMarkAsRead}\n className=\"text-text-950\"\n >\n Marcar como lida\n </DropdownMenuItem>\n )}\n <DropdownMenuItem onClick={handleDelete} className=\"text-error-600\">\n Deletar\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n\n {/* Message */}\n <p className=\"text-sm leading-[21px] text-text-800 w-full\">{message}</p>\n\n {/* Time and action button */}\n <div className=\"flex items-center justify-between w-full\">\n <span className=\"text-sm font-medium text-text-400\">{time}</span>\n\n {onNavigate && actionLabel && (\n <button\n type=\"button\"\n onClick={handleNavigate}\n className=\"text-sm font-medium text-info-600 hover:text-info-700 cursor-pointer\"\n >\n {actionLabel}\n </button>\n )}\n </div>\n </div>\n );\n};\n\n/**\n * Notification list component for displaying grouped notifications\n */\nconst NotificationList = ({\n groupedNotifications = [],\n loading = false,\n error = null,\n onRetry,\n onMarkAsReadById,\n onDeleteById,\n onNavigateById,\n onGlobalNotificationClick,\n getActionLabel,\n renderEmpty,\n className,\n emptyStateImage,\n}: {\n groupedNotifications?: NotificationGroup[];\n loading?: boolean;\n error?: string | null;\n onRetry?: () => void;\n onMarkAsReadById?: (id: string) => void;\n onDeleteById?: (id: string) => void;\n onNavigateById?: (\n entityType?: NotificationEntityType,\n entityId?: string\n ) => void;\n onGlobalNotificationClick?: (notification: Notification) => void;\n getActionLabel?: (entityType?: NotificationEntityType) => string | undefined;\n renderEmpty?: () => ReactNode;\n className?: string;\n emptyStateImage?: string;\n}) => {\n // State for global notification modal when onGlobalNotificationClick is not provided\n const [globalNotificationModal, setGlobalNotificationModal] = useState<{\n isOpen: boolean;\n notification: Notification | null;\n }>({ isOpen: false, notification: null });\n\n // Default handler for global notifications when onGlobalNotificationClick is not provided\n const handleGlobalNotificationClick = (notification: Notification) => {\n if (onGlobalNotificationClick) {\n onGlobalNotificationClick(notification);\n } else {\n // Open modal as fallback\n setGlobalNotificationModal({\n isOpen: true,\n notification,\n });\n }\n };\n // Error state\n if (error) {\n return (\n <div className=\"flex flex-col items-center gap-4 p-6 w-full\">\n <p className=\"text-sm text-error-600\">{error}</p>\n {onRetry && (\n <button\n type=\"button\"\n onClick={onRetry}\n className=\"text-sm text-info-600 hover:text-info-700\"\n >\n Tentar novamente\n </button>\n )}\n </div>\n );\n }\n\n // Loading state — only show the skeleton on the initial load (empty list).\n // Background refreshes (e.g. while the center polls) keep the list visible.\n if (loading && groupedNotifications.length === 0) {\n return (\n <div className=\"flex flex-col gap-0 w-full\">\n {['skeleton-first', 'skeleton-second', 'skeleton-third'].map(\n (skeletonId) => (\n <SkeletonCard\n key={skeletonId}\n className=\"p-4 border-b border-border-200\"\n />\n )\n )}\n </div>\n );\n }\n\n // Empty state\n if (!groupedNotifications || groupedNotifications.length === 0) {\n return renderEmpty ? (\n <div className=\"w-full\">{renderEmpty()}</div>\n ) : (\n <NotificationEmpty />\n );\n }\n\n return (\n <div className={cn('flex flex-col gap-0 w-full', className)}>\n {groupedNotifications.map((group, idx) => (\n <div key={`${group.label}-${idx}`} className=\"flex flex-col\">\n {/* Group header */}\n <div className=\"flex items-end px-4 py-6 pb-4\">\n <h4 className=\"text-lg font-bold text-text-500 flex-grow\">\n {group.label}\n </h4>\n </div>\n\n {/* Notifications in group */}\n {group.notifications.map((notification) => {\n // Check if this is a global notification\n const isGlobalNotification =\n !notification.entityType &&\n !notification.entityId &&\n !notification.activity &&\n !notification.recommendedClass;\n\n // Determine navigation handler\n let navigationHandler: (() => void) | undefined;\n if (isGlobalNotification) {\n navigationHandler = () =>\n handleGlobalNotificationClick(notification);\n } else if (\n notification.entityType &&\n notification.entityId &&\n onNavigateById\n ) {\n navigationHandler = () =>\n onNavigateById(\n notification.entityType ?? undefined,\n notification.entityId ?? undefined\n );\n }\n\n // Determine action label\n let actionLabel: string | undefined;\n if (isGlobalNotification) {\n // For global notifications, call getActionLabel without parameters or with null\n actionLabel = getActionLabel?.(undefined);\n } else {\n // For entity-specific notifications, pass the entityType\n actionLabel = getActionLabel?.(\n notification.entityType ?? undefined\n );\n }\n\n return (\n <SingleNotificationCard\n key={notification.id}\n title={notification.title}\n message={notification.message}\n time={\n (notification as Partial<NotificationItem>).time ??\n formatTimeAgo(new Date(notification.createdAt))\n }\n isRead={notification.isRead}\n onMarkAsRead={() => onMarkAsReadById?.(notification.id)}\n onDelete={() => onDeleteById?.(notification.id)}\n onNavigate={navigationHandler}\n actionLabel={actionLabel}\n />\n );\n })}\n </div>\n ))}\n\n {/* Global notification modal for list mode */}\n <Modal\n isOpen={globalNotificationModal.isOpen}\n onClose={() =>\n setGlobalNotificationModal({ isOpen: false, notification: null })\n }\n title={globalNotificationModal.notification?.title || ''}\n description={globalNotificationModal.notification?.message || ''}\n variant=\"activity\"\n image={\n globalNotificationModal.notification?.linkImg ||\n emptyStateImage ||\n mockContentImage\n }\n actionLink={\n globalNotificationModal.notification?.actionLink || undefined\n }\n actionLabel=\"Ver mais\"\n size=\"lg\"\n />\n </div>\n );\n};\n\n// Internal props type for NotificationCenter (without mode)\ntype NotificationCenterProps = Omit<NotificationCenterMode, 'mode'>;\n\n/**\n * NotificationCenter component for modal/dropdown mode\n */\nconst NotificationCenter = ({\n isActive,\n onToggleActive,\n unreadCount = 0,\n groupedNotifications = [],\n loading = false,\n error = null,\n onRetry,\n onMarkAsReadById,\n onDeleteById,\n onNavigateById,\n getActionLabel,\n onFetchNotifications,\n onMarkAllAsRead,\n onOpenChange,\n emptyStateImage,\n emptyStateTitle,\n emptyStateDescription,\n className,\n refreshIntervalMs = DEFAULT_REFRESH_INTERVAL_MS,\n}: NotificationCenterProps) => {\n const { isMobile } = useMobile();\n const [isModalOpen, setIsModalOpen] = useState(false);\n const [globalNotificationModal, setGlobalNotificationModal] = useState<{\n isOpen: boolean;\n notification: Notification | null;\n }>({ isOpen: false, notification: null });\n\n // Handle mobile click\n const handleMobileClick = () => {\n setIsModalOpen(true);\n onFetchNotifications?.();\n };\n\n // Handle desktop click\n const handleDesktopClick = () => {\n onToggleActive?.();\n };\n\n // Handle dropdown open change\n const handleOpenChange = (open: boolean) => {\n const controlledByParent =\n typeof isActive === 'boolean' && typeof onToggleActive === 'function';\n\n // Always notify parent if they want the signal.\n onOpenChange?.(open);\n\n // If parent controls via toggle only (no onOpenChange), keep them in sync on close.\n if (controlledByParent && !onOpenChange && !open && isActive) {\n onToggleActive?.();\n }\n };\n\n // Fetch notifications when dropdown opens\n useEffect(() => {\n if (isActive) {\n onFetchNotifications?.();\n }\n }, [isActive, onFetchNotifications]);\n\n // While the center is open, poll periodically so newly received notifications\n // appear without the user having to reopen it. The list is not replaced by a\n // skeleton on these background refreshes (see NotificationList loading gate).\n const isCenterOpen = isMobile ? isModalOpen : Boolean(isActive);\n useEffect(() => {\n if (!isCenterOpen || !onFetchNotifications || refreshIntervalMs <= 0) {\n return;\n }\n const intervalId = setInterval(() => {\n onFetchNotifications();\n }, refreshIntervalMs);\n return () => clearInterval(intervalId);\n }, [isCenterOpen, onFetchNotifications, refreshIntervalMs]);\n\n const renderEmptyState = () => (\n <NotificationEmpty\n emptyStateImage={emptyStateImage}\n emptyStateTitle={emptyStateTitle}\n emptyStateDescription={emptyStateDescription}\n />\n );\n\n if (isMobile) {\n return (\n <>\n <IconButton\n active={isModalOpen}\n onClick={handleMobileClick}\n icon={\n <>\n <Badge\n variant=\"notification\"\n notificationActive={unreadCount > 0}\n className=\"p-0\"\n />\n {unreadCount > 0 && (\n <Text as=\"span\" className=\"sr-only\">\n {unreadCount} notificações não lidas\n </Text>\n )}\n </>\n }\n className={className}\n />\n <Modal\n isOpen={isModalOpen}\n onClose={() => setIsModalOpen(false)}\n title=\"Notificações\"\n size=\"md\"\n hideCloseButton={false}\n closeOnEscape={true}\n >\n <div className=\"flex flex-col h-full max-h-[80vh]\">\n <div className=\"px-0 pb-3 border-b border-border-200\">\n <NotificationHeader unreadCount={unreadCount} variant=\"modal\" />\n {unreadCount > 0 && onMarkAllAsRead && (\n <button\n type=\"button\"\n onClick={onMarkAllAsRead}\n className=\"text-sm font-medium text-info-600 hover:text-info-700 cursor-pointer mt-2\"\n >\n Marcar todas como lidas\n </button>\n )}\n </div>\n <div className=\"flex-1 overflow-y-auto\">\n <NotificationList\n groupedNotifications={groupedNotifications}\n loading={loading}\n error={error}\n onRetry={onRetry}\n onMarkAsReadById={onMarkAsReadById}\n onDeleteById={onDeleteById}\n onNavigateById={(entityType, entityId) => {\n setIsModalOpen(false);\n onNavigateById?.(entityType, entityId);\n }}\n onGlobalNotificationClick={(notification) => {\n setIsModalOpen(false);\n setGlobalNotificationModal({\n isOpen: true,\n notification,\n });\n }}\n getActionLabel={getActionLabel}\n renderEmpty={renderEmptyState}\n emptyStateImage={emptyStateImage}\n />\n </div>\n </div>\n </Modal>\n {/* Global Notification Modal (mobile) */}\n <Modal\n isOpen={globalNotificationModal.isOpen}\n onClose={() =>\n setGlobalNotificationModal({ isOpen: false, notification: null })\n }\n title={globalNotificationModal.notification?.title || ''}\n variant=\"activity\"\n description={globalNotificationModal.notification?.message}\n image={\n globalNotificationModal.notification?.linkImg ||\n emptyStateImage ||\n mockContentImage\n }\n actionLink={\n globalNotificationModal.notification?.actionLink || undefined\n }\n actionLabel=\"Ver mais\"\n size=\"lg\"\n />\n </>\n );\n }\n\n return (\n <>\n <DropdownMenu\n {...(typeof isActive === 'boolean'\n ? { open: isActive, onOpenChange: handleOpenChange }\n : { onOpenChange: handleOpenChange })}\n >\n <DropdownMenuTrigger className=\"text-primary cursor-pointer\">\n <IconButton\n active={isActive}\n onClick={handleDesktopClick}\n icon={\n <>\n <Badge\n variant=\"notification\"\n notificationActive={unreadCount > 0}\n className={cn('p-0', isActive && 'text-primary-950!')}\n />\n {unreadCount > 0 && (\n <Text as=\"span\" className=\"sr-only\">\n {unreadCount} notificações não lidas\n </Text>\n )}\n </>\n }\n className={className}\n />\n </DropdownMenuTrigger>\n <DropdownMenuContent\n className=\"min-w-[320px] max-w-[400px] max-h-[500px] overflow-hidden\"\n side=\"bottom\"\n align=\"end\"\n >\n <div className=\"flex flex-col\">\n <div className=\"px-4 py-3 border-b border-border-200\">\n <NotificationHeader\n unreadCount={unreadCount}\n variant=\"dropdown\"\n />\n {unreadCount > 0 && onMarkAllAsRead && (\n <button\n type=\"button\"\n onClick={onMarkAllAsRead}\n className=\"text-sm font-medium text-info-600 hover:text-info-700 cursor-pointer mt-2\"\n >\n Marcar todas como lidas\n </button>\n )}\n </div>\n <div className=\"max-h-[350px] overflow-y-auto\">\n <NotificationList\n groupedNotifications={groupedNotifications}\n loading={loading}\n error={error}\n onRetry={onRetry}\n onMarkAsReadById={onMarkAsReadById}\n onDeleteById={onDeleteById}\n onNavigateById={onNavigateById}\n onGlobalNotificationClick={(notification) => {\n setGlobalNotificationModal({\n isOpen: true,\n notification,\n });\n }}\n getActionLabel={getActionLabel}\n renderEmpty={renderEmptyState}\n emptyStateImage={emptyStateImage}\n />\n </div>\n </div>\n </DropdownMenuContent>\n </DropdownMenu>\n\n {/* Global Notification Modal */}\n <Modal\n isOpen={globalNotificationModal.isOpen}\n onClose={() =>\n setGlobalNotificationModal({ isOpen: false, notification: null })\n }\n title={globalNotificationModal.notification?.title || ''}\n variant=\"activity\"\n description={globalNotificationModal.notification?.message}\n image={\n globalNotificationModal.notification?.linkImg ||\n emptyStateImage ||\n mockContentImage\n }\n actionLink={\n globalNotificationModal.notification?.actionLink || undefined\n }\n actionLabel=\"Ver mais\"\n size=\"lg\"\n />\n </>\n );\n};\n\n/**\n * NotificationCard component - can display single notification, list of notifications, or center mode\n *\n * @param props - The notification card properties\n * @returns JSX element representing the notification card, list, or center\n */\nconst NotificationCard = (props: NotificationCardProps) => {\n // Use mode discriminator to determine which component to render\n switch (props.mode) {\n case 'single':\n return (\n <SingleNotificationCard\n title={props.title}\n message={props.message}\n time={props.time}\n isRead={props.isRead}\n onMarkAsRead={props.onMarkAsRead}\n onDelete={props.onDelete}\n onNavigate={props.onNavigate}\n actionLabel={props.actionLabel}\n className={props.className}\n />\n );\n\n case 'list':\n return (\n <NotificationList\n groupedNotifications={\n props.groupedNotifications ??\n (props.notifications\n ? [\n {\n label: 'Notificações',\n notifications: props.notifications as Notification[],\n },\n ]\n : [])\n }\n loading={props.loading}\n error={props.error}\n onRetry={props.onRetry}\n onMarkAsReadById={props.onMarkAsReadById}\n onDeleteById={props.onDeleteById}\n onNavigateById={props.onNavigateById}\n onGlobalNotificationClick={props.onGlobalNotificationClick}\n getActionLabel={props.getActionLabel}\n renderEmpty={props.renderEmpty}\n className={props.className}\n emptyStateImage={props.emptyStateImage}\n />\n );\n\n case 'center':\n return <NotificationCenter {...props} />;\n\n default:\n // This should never happen with proper typing, but provides a fallback\n return (\n <div className=\"flex flex-col items-center gap-4 p-6 w-full\">\n <p className=\"text-sm text-text-600\">\n Modo de notificação não reconhecido\n </p>\n </div>\n );\n }\n};\n\n/**\n * Legacy NotificationCard component for backward compatibility\n * Automatically detects mode based on provided props\n */\nexport const LegacyNotificationCard = (props: LegacyNotificationCardProps) => {\n // If variant is center, render NotificationCenter\n if (props.variant === 'center') {\n const centerProps: NotificationCenterMode = {\n mode: 'center',\n ...props,\n };\n return <NotificationCenter {...centerProps} />;\n }\n\n // If we have list-related props, render list mode\n if (\n props.groupedNotifications !== undefined ||\n props.notifications !== undefined ||\n props.loading ||\n props.error\n ) {\n return (\n <NotificationList\n groupedNotifications={\n props.groupedNotifications ??\n (props.notifications\n ? [\n {\n label: 'Notificações',\n notifications: props.notifications as Notification[],\n },\n ]\n : [])\n }\n loading={props.loading}\n error={props.error}\n onRetry={props.onRetry}\n onMarkAsReadById={props.onMarkAsReadById}\n onDeleteById={props.onDeleteById}\n onNavigateById={props.onNavigateById}\n onGlobalNotificationClick={props.onGlobalNotificationClick}\n getActionLabel={props.getActionLabel}\n renderEmpty={props.renderEmpty}\n className={props.className}\n emptyStateImage={props.emptyStateImage}\n />\n );\n }\n\n // If we have single notification props, render single card mode\n if (\n props.title !== undefined &&\n props.message !== undefined &&\n props.time !== undefined &&\n props.isRead !== undefined &&\n props.onMarkAsRead &&\n props.onDelete\n ) {\n const singleProps: SingleNotificationCardMode = {\n mode: 'single',\n title: props.title,\n message: props.message,\n time: props.time,\n isRead: props.isRead,\n onMarkAsRead: props.onMarkAsRead,\n onDelete: props.onDelete,\n onNavigate: props.onNavigate,\n actionLabel: props.actionLabel,\n className: props.className,\n emptyStateImage: props.emptyStateImage,\n emptyStateTitle: props.emptyStateTitle,\n emptyStateDescription: props.emptyStateDescription,\n };\n return (\n <SingleNotificationCard\n title={singleProps.title}\n message={singleProps.message}\n time={singleProps.time}\n isRead={singleProps.isRead}\n onMarkAsRead={singleProps.onMarkAsRead}\n onDelete={singleProps.onDelete}\n onNavigate={singleProps.onNavigate}\n actionLabel={singleProps.actionLabel}\n className={singleProps.className}\n />\n );\n }\n\n // Default empty state if no valid props provided\n return (\n <div className=\"flex flex-col items-center gap-4 p-6 w-full\">\n <p className=\"text-sm text-text-600\">Nenhuma notificação configurada</p>\n </div>\n );\n};\n\nexport default NotificationCard;\nexport type { NotificationGroup };\n"]}
@@ -6,7 +6,7 @@ var _chunkHVKHZMBSjs = require('./chunk-HVKHZMBS.js');
6
6
  var _chunkORRSVKFKjs = require('./chunk-ORRSVKFK.js');
7
7
 
8
8
 
9
- var _chunk5J2UT2FRjs = require('./chunk-5J2UT2FR.js');
9
+ var _chunkLS4EGCEJjs = require('./chunk-LS4EGCEJ.js');
10
10
 
11
11
 
12
12
  var _chunkTWT3CSRQjs = require('./chunk-TWT3CSRQ.js');
@@ -599,7 +599,7 @@ var ProfileToggleTheme = ({
599
599
  }
600
600
  ),
601
601
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
602
- _chunk5J2UT2FRjs.Modal_default,
602
+ _chunkLS4EGCEJjs.Modal_default,
603
603
  {
604
604
  isOpen: modalThemeToggle,
605
605
  onClose: handleCancel,
@@ -774,4 +774,4 @@ var DropdownMenu_default = DropdownMenu;
774
774
 
775
775
 
776
776
  exports.createDropdownStore = createDropdownStore; exports.useDropdownStore = useDropdownStore; exports.DropdownMenuTrigger = DropdownMenuTrigger; exports.MenuLabel = MenuLabel; exports.DropdownMenuContent = DropdownMenuContent; exports.DropdownMenuItem = DropdownMenuItem; exports.DropdownMenuSeparator = DropdownMenuSeparator; exports.ProfileMenuTrigger = ProfileMenuTrigger; exports.ProfileMenuHeader = ProfileMenuHeader; exports.ProfileMenuInfo = ProfileMenuInfo; exports.ProfileToggleTheme = ProfileToggleTheme; exports.ProfileMenuSection = ProfileMenuSection; exports.ProfileMenuFooter = ProfileMenuFooter; exports.ProfileMenuReadingFluencyTrigger = ProfileMenuReadingFluencyTrigger; exports.ProfileMenuReadingFluencyInfo = ProfileMenuReadingFluencyInfo; exports.ProfileMenuReadingFluencyFooter = ProfileMenuReadingFluencyFooter; exports.DropdownMenu_default = DropdownMenu_default;
777
- //# sourceMappingURL=chunk-6IPKPLZN.js.map
777
+ //# sourceMappingURL=chunk-OCIBLTVL.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-6IPKPLZN.js","../src/components/DropdownMenu/DropdownMenu.tsx"],"names":[],"mappings":"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","file":"/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-6IPKPLZN.js","sourcesContent":[null,"import { CaretRightIcon } from '@phosphor-icons/react/dist/csr/CaretRight';\nimport { SignOutIcon } from '@phosphor-icons/react/dist/csr/SignOut';\nimport { UserIcon } from '@phosphor-icons/react/dist/csr/User';\nimport {\n forwardRef,\n ReactNode,\n ButtonHTMLAttributes,\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n HTMLAttributes,\n MouseEvent,\n KeyboardEvent,\n isValidElement,\n Children,\n cloneElement,\n ReactElement,\n useState,\n RefObject,\n CSSProperties,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { create, StoreApi, useStore } from 'zustand';\nimport Button, { ButtonReadingFluency } from '../Button/Button';\nimport Text from '../Text/Text';\nimport { cn } from '../../utils/utils';\nimport readingFluencyBird from '../../assets/img/readingFluencyBird.png';\nimport Modal from '../Modal/Modal';\nimport { ThemeToggle } from '../ThemeToggle/ThemeToggle';\nimport type { ThemeMode } from '@/hooks/useTheme';\nimport { useTheme } from '../../hooks/useTheme';\n\ninterface DropdownStore {\n open: boolean;\n setOpen: (open: boolean) => void;\n}\n\ntype DropdownStoreApi = StoreApi<DropdownStore>;\n\nexport function createDropdownStore(): DropdownStoreApi {\n return create<DropdownStore>((set) => ({\n open: false,\n // Bail out when the value didn't change. Skipping `set` here prevents\n // zustand from creating a new state object, which in turn keeps\n // `useStore(store, (s) => s)` subscribers from re-rendering on no-op\n // syncs (e.g. the `useEffect [propOpen]` controlled-mode bridge).\n setOpen: (open) => set((state) => (state.open === open ? state : { open })),\n }));\n}\n\nexport const useDropdownStore = (externalStore?: DropdownStoreApi) => {\n if (!externalStore) {\n throw new Error(\n 'Component must be used within a DropdownMenu (store is missing)'\n );\n }\n\n return externalStore;\n};\n\n/**\n * Keep the same style object when nothing moved — a fresh object on every\n * scroll event would re-render the menu at 60fps for no reason.\n */\nconst PORTAL_STYLE_KEYS = [\n 'top',\n 'bottom',\n 'left',\n 'right',\n 'transform',\n 'maxHeight',\n] as const;\n\nconst isSamePortalStyle = (a: CSSProperties, b: CSSProperties): boolean =>\n PORTAL_STYLE_KEYS.every((key) => a[key] === b[key]);\n\n/** Tallest a portaled menu gets when there is room for it. */\nconst DEFAULT_PORTAL_MAX_HEIGHT = 320;\n\n/** Breathing room between the menu and the edge of the viewport. */\nconst VIEWPORT_MARGIN = 8;\n\n/**\n * Never shrink a menu below this, however cramped the trigger is: a 20px-tall\n * scroller is worse than one that overhangs a little.\n */\nconst MIN_PORTAL_MAX_HEIGHT = 120;\n\ntype PortalSide = 'top' | 'right' | 'bottom' | 'left';\ntype PortalAlign = 'start' | 'center' | 'end';\n\ninterface PortalPlacement {\n side: PortalSide;\n align: PortalAlign;\n sideOffset: number;\n maxHeight: number;\n}\n\n/**\n * Height cap for a portaled menu, given the room it has.\n *\n * The minimum is a floor on the *viewport-derived* room only — it keeps a menu\n * squeezed against an edge from collapsing into a sliver. A caller that asks\n * for a shorter menu than the minimum still gets what it asked for: its value\n * is the ceiling, never something to be raised.\n *\n * @param available - Room in px between the trigger and the viewport edge\n * @param maxHeight - Tallest the caller allows the menu to be\n * @returns The `max-height` to apply, in px\n */\nconst clampMenuHeight = (available: number, maxHeight: number): number =>\n Math.min(maxHeight, Math.max(available, MIN_PORTAL_MAX_HEIGHT));\n\n/**\n * Horizontal edge the menu lines up with, for the `top`/`bottom` sides.\n *\n * @param rect - Trigger bounding rect\n * @param align - Requested alignment\n * @returns The horizontal part of the portal style\n */\nconst alignPortalStyle = (rect: DOMRect, align: PortalAlign): CSSProperties => {\n if (align === 'end') return { right: window.innerWidth - rect.right };\n if (align === 'center') {\n return {\n left: rect.left + rect.width / 2,\n transform: 'translateX(-50%)',\n };\n }\n return { left: rect.left };\n};\n\n/**\n * Place a menu above or below its trigger, sized to the room that exists.\n *\n * A portaled menu is `position: fixed`, so whatever falls past the edge of the\n * viewport can never be scrolled to. The menu therefore takes the space it\n * actually has and scrolls inside it, and turns over to the other side when\n * clamping alone would still leave it overhanging.\n *\n * The flip threshold is the minimum height rather than the maximum: turning\n * over as soon as the menu could not open at full height would send it over the\n * content on any trigger past the middle of the screen, which reads as a\n * glitch. `side=\"top\"` always opens above — the caller asked for it.\n *\n * @param rect - Trigger bounding rect\n * @param placement - Requested side/alignment, offset and height ceiling\n * @returns Style for a fixed menu anchored to the trigger's top or bottom edge\n */\nconst verticalPortalStyle = (\n rect: DOMRect,\n { side, align, sideOffset, maxHeight }: PortalPlacement\n): CSSProperties => {\n const spaceBelow =\n window.innerHeight - rect.bottom - sideOffset - VIEWPORT_MARGIN;\n const spaceAbove = rect.top - sideOffset - VIEWPORT_MARGIN;\n const openAbove =\n side === 'top' ||\n (spaceBelow < Math.min(maxHeight, MIN_PORTAL_MAX_HEIGHT) &&\n spaceAbove > spaceBelow);\n\n return {\n maxHeight: clampMenuHeight(openAbove ? spaceAbove : spaceBelow, maxHeight),\n overflowY: 'auto',\n ...(openAbove\n ? { bottom: window.innerHeight - rect.top + sideOffset }\n : { top: rect.bottom + sideOffset }),\n ...alignPortalStyle(rect, align),\n };\n};\n\n/**\n * Place a menu beside its trigger, sized to the room below the trigger's top.\n *\n * Anchored by the edge that faces the trigger: a `left` for `side=\"left\"` would\n * grow the menu back over the trigger it was meant to sit outside of. It runs\n * downwards from the trigger's top, so it needs the same clamping as a menu\n * opening below — without it a long list disappears past the viewport bottom.\n *\n * @param rect - Trigger bounding rect\n * @param placement - Requested side, offset and height ceiling\n * @returns Style for a fixed menu anchored to the trigger's left or right edge\n */\nconst horizontalPortalStyle = (\n rect: DOMRect,\n { side, sideOffset, maxHeight }: PortalPlacement\n): CSSProperties => ({\n top: rect.top,\n maxHeight: clampMenuHeight(\n window.innerHeight - rect.top - VIEWPORT_MARGIN,\n maxHeight\n ),\n overflowY: 'auto',\n ...(side === 'left'\n ? { right: window.innerWidth - rect.left + sideOffset }\n : { left: rect.right + sideOffset }),\n});\n\nconst injectStore = (\n children: ReactNode,\n store: DropdownStoreApi\n): ReactNode => {\n return Children.map(children, (child) => {\n if (isValidElement(child)) {\n const typedChild = child as ReactElement<{\n store?: DropdownStoreApi;\n children?: ReactNode;\n }>;\n\n // Aqui tu checa o displayName do componente\n const displayName = (\n typedChild.type as unknown as { displayName: string }\n ).displayName;\n\n // Lista de componentes que devem receber o store\n const allowed = [\n 'DropdownMenuTrigger',\n 'DropdownContent',\n 'DropdownMenuContent',\n 'DropdownMenuSeparator',\n 'DropdownMenuItem',\n 'MenuLabel',\n 'ProfileMenuTrigger',\n 'ProfileMenuHeader',\n 'ProfileMenuFooter',\n 'ProfileToggleTheme',\n 'ProfileMenuReadingFluencyTrigger',\n 'ProfileMenuReadingFluencyFooter',\n ];\n\n let newProps: Partial<{\n store: DropdownStoreApi;\n children: ReactNode;\n }> = {};\n\n if (allowed.includes(displayName)) {\n newProps.store = store;\n }\n\n if (typedChild.props.children) {\n newProps.children = injectStore(typedChild.props.children, store);\n }\n\n return cloneElement(typedChild, newProps);\n }\n\n return child;\n });\n};\n\ninterface DropdownMenuProps {\n children: ReactNode;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}\n\nconst DropdownMenu = ({\n children,\n open: propOpen,\n onOpenChange,\n}: DropdownMenuProps) => {\n const storeRef = useRef<DropdownStoreApi | null>(null);\n storeRef.current ??= createDropdownStore();\n const store = storeRef.current;\n const { open, setOpen: storeSetOpen } = useStore(store, (s) => s);\n\n const setOpen = (newOpen: boolean) => {\n storeSetOpen(newOpen);\n };\n\n const menuRef = useRef<HTMLDivElement | null>(null);\n\n const handleArrowDownOrArrowUp = (event: globalThis.KeyboardEvent) => {\n // A portaled content lives in document.body, outside menuRef — look it up\n // globally in that case. Only the open menu carries data-open=\"true\"\n // (a closing one keeps rendering for the 200ms fade-out).\n const menuContent =\n menuRef.current?.querySelector('[role=\"menu\"]') ??\n document.querySelector(\n '[data-dropdown-content=\"true\"][data-open=\"true\"]'\n );\n if (menuContent) {\n event.preventDefault();\n\n const items = Array.from(\n menuContent.querySelectorAll(\n '[role=\"menuitem\"]:not([aria-disabled=\"true\"])'\n )\n ).filter((el): el is HTMLElement => el instanceof HTMLElement);\n\n if (items.length === 0) return;\n\n const focusedItem = document.activeElement as HTMLElement;\n const currentIndex = items.indexOf(focusedItem);\n\n let nextIndex;\n if (event.key === 'ArrowDown') {\n nextIndex = currentIndex === -1 ? 0 : (currentIndex + 1) % items.length;\n } else {\n // ArrowUp\n nextIndex =\n currentIndex === -1\n ? items.length - 1\n : (currentIndex - 1 + items.length) % items.length;\n }\n\n items[nextIndex]?.focus();\n }\n };\n\n const handleDownkey = (event: globalThis.KeyboardEvent) => {\n if (event.key === 'Escape') {\n setOpen(false);\n } else if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n handleArrowDownOrArrowUp(event);\n }\n };\n\n const handleClickOutside = (event: Event) => {\n const target = event.target as Node;\n\n if (menuRef.current?.contains(target)) {\n return;\n }\n\n if (\n target instanceof Element &&\n target.closest('[data-dropdown-content=\"true\"]')\n ) {\n return;\n }\n\n setOpen(false);\n };\n\n useEffect(() => {\n if (open) {\n document.addEventListener('pointerdown', handleClickOutside);\n document.addEventListener('keydown', handleDownkey);\n }\n\n return () => {\n document.removeEventListener('pointerdown', handleClickOutside);\n document.removeEventListener('keydown', handleDownkey);\n };\n }, [open]);\n\n useEffect(() => {\n onOpenChange?.(open);\n }, [open, onOpenChange]);\n\n useEffect(() => {\n if (propOpen !== undefined) {\n setOpen(propOpen);\n }\n }, [propOpen]);\n\n return (\n <div className=\"relative\" ref={menuRef}>\n {injectStore(children, store)}\n </div>\n );\n};\n\n// Componentes genéricos do DropdownMenu\nconst DropdownMenuTrigger = forwardRef<\n HTMLButtonElement,\n ButtonHTMLAttributes<HTMLButtonElement> & {\n disabled?: boolean;\n store?: DropdownStoreApi;\n }\n>(({ className, children, onClick, store: externalStore, ...props }, ref) => {\n const store = useDropdownStore(externalStore);\n\n const open = useStore(store, (s) => s.open);\n const toggleOpen = () => store.setState({ open: !open });\n\n return (\n <button\n ref={ref}\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n toggleOpen();\n onClick?.(e);\n }}\n aria-expanded={open}\n className={cn(\n 'appearance-none bg-transparent border-none p-0',\n className\n )}\n {...props}\n >\n {children}\n </button>\n );\n});\nDropdownMenuTrigger.displayName = 'DropdownMenuTrigger';\n\nconst ITEM_SIZE_CLASSES = {\n small: 'text-sm',\n medium: 'text-md',\n} as const;\n\nconst SIDE_CLASSES = {\n top: 'bottom-full',\n right: 'top-full',\n bottom: 'top-full',\n left: 'top-full',\n};\n\nconst ALIGN_CLASSES = {\n start: 'left-0',\n center: 'left-1/2 -translate-x-1/2',\n end: 'right-0',\n};\n\n// O \"chrome\" do card (bg/borda/rounded/shadow) fica por variante para que a\n// variante `papole` possa ter o seu próprio (fundo secondary-500, sem borda,\n// sombra das vars --sds-* do Figma traduzidas: 0 8px 8px -2px, preto 10% + 20%).\n// `menu`/`profile` mantêm exatamente o visual de antes.\nconst MENUCONTENT_VARIANT_CLASSES = {\n menu: 'bg-background rounded-md border bg-popover text-popover-foreground shadow-md border-border-100 p-1',\n profile:\n 'bg-background rounded-md border bg-popover text-popover-foreground shadow-md border-border-100 p-6',\n papole:\n 'flex flex-col gap-4 bg-secondary-500 rounded-[20px] pt-6 px-6 pb-8 [box-shadow:0px_8px_8px_-2px_#0000001a,0px_8px_8px_-2px_#00000033]',\n};\n\nconst MenuLabel = forwardRef<\n HTMLDivElement,\n HTMLAttributes<HTMLDivElement> & {\n inset?: boolean;\n store?: DropdownStoreApi;\n }\n>(({ className, inset, store: _store, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn('text-sm w-full', inset ? 'pl-8' : '', className)}\n {...props}\n />\n );\n});\nMenuLabel.displayName = 'MenuLabel';\n\nconst DropdownMenuContent = forwardRef<\n HTMLDivElement,\n HTMLAttributes<HTMLDivElement> & {\n align?: 'start' | 'center' | 'end';\n side?: 'top' | 'right' | 'bottom' | 'left';\n variant?: 'menu' | 'profile' | 'papole';\n sideOffset?: number;\n store?: DropdownStoreApi;\n portal?: boolean;\n triggerRef?: RefObject<HTMLElement | null>;\n /**\n * Tallest the menu gets, in px, when the viewport allows it. Portaled menus\n * only — it is capped by the space actually available around the trigger.\n */\n maxHeight?: number;\n }\n>(\n (\n {\n className,\n align = 'start',\n side = 'bottom',\n variant = 'menu',\n sideOffset = 4,\n children,\n store: externalStore,\n portal = false,\n triggerRef,\n maxHeight = DEFAULT_PORTAL_MAX_HEIGHT,\n ...props\n },\n ref\n ) => {\n const store = useDropdownStore(externalStore);\n const open = useStore(store, (s) => s.open);\n const [isVisible, setIsVisible] = useState(open);\n const [portalStyle, setPortalStyle] = useState<CSSProperties>({});\n const contentRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (open) {\n setIsVisible(true);\n } else {\n const timer = setTimeout(() => setIsVisible(false), 200);\n return () => clearTimeout(timer);\n }\n }, [open]);\n\n const updatePortalPosition = useCallback(() => {\n if (!portal || !triggerRef?.current) return;\n\n const rect = triggerRef.current.getBoundingClientRect();\n const placement = { side, align, sideOffset, maxHeight };\n const style =\n side === 'left' || side === 'right'\n ? horizontalPortalStyle(rect, placement)\n : verticalPortalStyle(rect, placement);\n\n setPortalStyle((prev) => (isSamePortalStyle(prev, style) ? prev : style));\n }, [portal, triggerRef, align, side, sideOffset, maxHeight]);\n\n useLayoutEffect(() => {\n if (open) updatePortalPosition();\n }, [open, updatePortalPosition]);\n\n // A portaled menu is position:fixed, so it doesn't follow the trigger when\n // an ancestor scrolls. Tables wrap their body in `overflow-x-auto`, so a\n // menu anchored to a column header would drift away from its <th> on any\n // horizontal scroll. Capture-phase catches scrolls on any ancestor, not\n // just the window.\n useEffect(() => {\n if (!portal || !open) return;\n\n const reposition = () => updatePortalPosition();\n window.addEventListener('scroll', reposition, true);\n window.addEventListener('resize', reposition);\n\n return () => {\n window.removeEventListener('scroll', reposition, true);\n window.removeEventListener('resize', reposition);\n };\n }, [portal, open, updatePortalPosition]);\n\n if (!isVisible) return null;\n\n const getPositionClasses = () => {\n if (portal) {\n return 'fixed';\n }\n const vertical = SIDE_CLASSES[side];\n const horizontal = ALIGN_CLASSES[align];\n\n return `absolute ${vertical} ${horizontal}`;\n };\n\n const variantClasses = MENUCONTENT_VARIANT_CLASSES[variant];\n\n const content = (\n <div\n ref={portal ? contentRef : ref}\n role=\"menu\"\n data-dropdown-content=\"true\"\n data-open={open}\n className={`\n z-50 min-w-[210px] overflow-hidden\n ${open ? 'animate-in fade-in-0 zoom-in-95' : 'animate-out fade-out-0 zoom-out-95'}\n ${getPositionClasses()}\n ${variantClasses}\n ${className}\n `}\n style={{\n ...(portal\n ? portalStyle\n : {\n marginTop: side === 'bottom' ? sideOffset : undefined,\n marginBottom: side === 'top' ? sideOffset : undefined,\n marginLeft: side === 'right' ? sideOffset : undefined,\n marginRight: side === 'left' ? sideOffset : undefined,\n }),\n }}\n {...props}\n >\n {children}\n </div>\n );\n\n if (portal && typeof document !== 'undefined') {\n return createPortal(content, document.body);\n }\n\n return content;\n }\n);\nDropdownMenuContent.displayName = 'DropdownMenuContent';\n\nconst DropdownMenuItem = forwardRef<\n HTMLDivElement,\n HTMLAttributes<HTMLDivElement> & {\n inset?: boolean;\n size?: 'small' | 'medium';\n iconLeft?: ReactNode;\n iconRight?: ReactNode;\n disabled?: boolean;\n variant?: 'profile' | 'menu';\n store?: DropdownStoreApi;\n preventClose?: boolean;\n }\n>(\n (\n {\n className,\n size = 'small',\n children,\n iconRight,\n iconLeft,\n disabled = false,\n onClick,\n variant = 'menu',\n store: externalStore,\n preventClose = false,\n ...props\n },\n ref\n ) => {\n const store = useDropdownStore(externalStore);\n const setOpen = useStore(store, (s) => s.setOpen);\n const sizeClasses = ITEM_SIZE_CLASSES[size];\n\n const handleClick = (\n e: MouseEvent<HTMLDivElement> | KeyboardEvent<HTMLDivElement>\n ) => {\n if (disabled) {\n e.preventDefault();\n e.stopPropagation();\n return;\n }\n if (e.type === 'click') {\n onClick?.(e as MouseEvent<HTMLDivElement>);\n } else if (e.type === 'keydown') {\n // For keyboard events, trigger click if Enter or Space was pressed\n const keyEvent = e as KeyboardEvent<HTMLDivElement>;\n if (keyEvent.key === 'Enter' || keyEvent.key === ' ') {\n (e.currentTarget as HTMLElement).click();\n }\n // honor any user-provided key handler\n props.onKeyDown?.(keyEvent);\n }\n if (!preventClose) {\n setOpen(false);\n }\n };\n\n const getVariantClasses = () => {\n if (variant === 'profile') {\n return 'relative flex flex-row justify-between select-none items-center gap-2 rounded-sm p-4 text-sm outline-none transition-colors [&>svg]:size-6 [&>svg]:shrink-0';\n }\n return 'relative flex select-none items-center gap-2 rounded-sm p-3 text-sm outline-none transition-colors [&>svg]:size-4 [&>svg]:shrink-0';\n };\n\n const getVariantProps = () => {\n return variant === 'profile' ? { 'data-variant': 'profile' } : {};\n };\n\n return (\n <div\n ref={ref}\n role=\"menuitem\"\n {...getVariantProps()}\n aria-disabled={disabled}\n className={`\n focus-visible:bg-background-50\n ${getVariantClasses()}\n ${sizeClasses}\n ${className}\n ${\n disabled\n ? 'cursor-not-allowed text-text-400'\n : 'cursor-pointer hover:bg-background-50 text-text-700 focus:bg-accent focus:text-accent-foreground hover:bg-accent hover:text-accent-foreground'\n }\n `}\n onClick={handleClick}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n e.stopPropagation();\n handleClick(e);\n }\n }}\n tabIndex={disabled ? -1 : 0}\n {...props}\n >\n {iconLeft}\n <div className=\"w-full\">{children}</div>\n {iconRight}\n </div>\n );\n }\n);\nDropdownMenuItem.displayName = 'DropdownMenuItem';\n\nconst DropdownMenuSeparator = forwardRef<\n HTMLDivElement,\n HTMLAttributes<HTMLDivElement> & { store?: DropdownStoreApi }\n>(({ className, store: _store, ...props }, ref) => (\n <div\n ref={ref}\n className={cn('my-1 h-px bg-border-200', className)}\n {...props}\n />\n));\nDropdownMenuSeparator.displayName = 'DropdownMenuSeparator';\n\n// Componentes específicos do ProfileMenu\nconst ProfileMenuTrigger = forwardRef<\n HTMLButtonElement,\n ButtonHTMLAttributes<HTMLButtonElement> & { store?: DropdownStoreApi }\n>(({ className, onClick, store: externalStore, ...props }, ref) => {\n const store = useDropdownStore(externalStore);\n const open = useStore(store, (s) => s.open);\n const toggleOpen = () => store.setState({ open: !open });\n\n return (\n <button\n ref={ref}\n className={cn(\n 'rounded-lg size-10 bg-primary-50 flex items-center justify-center cursor-pointer',\n className\n )}\n onClick={(e) => {\n e.stopPropagation();\n toggleOpen();\n onClick?.(e);\n }}\n aria-expanded={open}\n {...props}\n >\n <span className=\"size-6 rounded-full bg-primary-100 flex items-center justify-center\">\n <UserIcon className=\"text-primary-950\" size={18} />\n </span>\n </button>\n );\n});\nProfileMenuTrigger.displayName = 'ProfileMenuTrigger';\n\nconst ProfileMenuHeader = forwardRef<\n HTMLDivElement,\n HTMLAttributes<HTMLDivElement> & {\n name: string;\n email: string;\n photoUrl?: string | null;\n store?: DropdownStoreApi;\n }\n>(({ className, name, email, photoUrl, store: _store, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-component=\"ProfileMenuHeader\"\n className={cn(\n 'flex flex-row gap-4 items-center min-w-[280px]',\n className\n )}\n {...props}\n >\n <span className=\"w-16 h-16 bg-primary-100 rounded-full flex items-center justify-center overflow-hidden flex-shrink-0\">\n {photoUrl ? (\n <img\n src={photoUrl}\n alt=\"Foto de perfil\"\n className=\"w-full h-full object-cover\"\n />\n ) : (\n <UserIcon size={34} className=\"text-primary-800\" />\n )}\n </span>\n <div className=\"flex flex-col min-w-0\">\n <Text\n size=\"xl\"\n weight=\"bold\"\n color=\"text-text-950\"\n className=\"truncate\"\n >\n {name}\n </Text>\n <Text size=\"md\" color=\"text-text-600\" className=\"truncate\">\n {email}\n </Text>\n </div>\n </div>\n );\n});\nProfileMenuHeader.displayName = 'ProfileMenuHeader';\n\nconst ProfileMenuInfo = forwardRef<\n HTMLDivElement,\n HTMLAttributes<HTMLDivElement> & {\n schoolName: string;\n classYearName: string;\n schoolYearName: string;\n store?: DropdownStoreApi;\n }\n>(\n (\n {\n className,\n schoolName,\n classYearName,\n schoolYearName,\n store: _store,\n ...props\n },\n ref\n ) => {\n if (!schoolName && !classYearName && !schoolYearName) {\n return null;\n }\n\n return (\n <div\n ref={ref}\n data-component=\"ProfileMenuInfo\"\n className={cn('flex flex-row gap-4 items-center', className)}\n {...props}\n >\n <span className=\"w-16 h-16\" />\n <div className=\"flex flex-col \">\n {schoolName && (\n <Text size=\"md\" color=\"text-text-600\">\n {schoolName}\n </Text>\n )}\n\n {(classYearName || schoolYearName) && (\n <span className=\"flex flex-row items-center gap-2\">\n {classYearName && (\n <Text size=\"md\" color=\"text-text-600\">\n {classYearName}\n </Text>\n )}\n {classYearName && schoolYearName && (\n <Text size=\"md\" color=\"text-text-600\">\n ●\n </Text>\n )}\n {schoolYearName && (\n <Text size=\"md\" color=\"text-text-600\">\n {schoolYearName}\n </Text>\n )}\n </span>\n )}\n </div>\n </div>\n );\n }\n);\nProfileMenuInfo.displayName = 'ProfileMenuInfo';\n\nconst ProfileToggleTheme = ({\n store: externalStore,\n ...props\n}: HTMLAttributes<HTMLDivElement> & { store?: DropdownStoreApi }) => {\n const { themeMode, setTheme } = useTheme();\n const [modalThemeToggle, setModalThemeToggle] = useState(false);\n const [selectedTheme, setSelectedTheme] = useState<ThemeMode>(themeMode);\n\n const internalStoreRef = useRef<DropdownStoreApi | null>(null);\n internalStoreRef.current ??= createDropdownStore();\n const store = externalStore ?? internalStoreRef.current;\n const setOpen = useStore(store, (s) => s.setOpen);\n\n const handleClick = (e: MouseEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n setModalThemeToggle(true);\n };\n\n const handleSave = () => {\n setTheme(selectedTheme);\n setModalThemeToggle(false);\n setOpen(false); // Close dropdown after saving\n };\n\n const handleCancel = () => {\n setSelectedTheme(themeMode); // Reset to current theme\n setModalThemeToggle(false);\n setOpen(false); // Close dropdown after canceling\n };\n\n return (\n <>\n <DropdownMenuItem\n variant=\"profile\"\n preventClose={true}\n store={store}\n iconLeft={\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 25 25\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M12.5 2.75C15.085 2.75276 17.5637 3.78054 19.3916 5.6084C21.2195 7.43628 22.2473 9.915 22.25 12.5C22.25 14.4284 21.6778 16.3136 20.6064 17.917C19.5352 19.5201 18.0128 20.7699 16.2314 21.5078C14.4499 22.2458 12.489 22.4387 10.5977 22.0625C8.70642 21.6863 6.96899 20.758 5.60547 19.3945C4.24197 18.031 3.31374 16.2936 2.9375 14.4023C2.56129 12.511 2.75423 10.5501 3.49219 8.76855C4.23012 6.98718 5.47982 5.46483 7.08301 4.39355C8.68639 3.32221 10.5716 2.75 12.5 2.75ZM11.75 4.28516C9.70145 4.47452 7.7973 5.42115 6.41016 6.94043C5.02299 8.4599 4.25247 10.4426 4.25 12.5C4.25247 14.5574 5.02299 16.5401 6.41016 18.0596C7.7973 19.5789 9.70145 20.5255 11.75 20.7148V4.28516Z\"\n fill=\"currentColor\"\n />\n </svg>\n }\n iconRight={<CaretRightIcon />}\n onClick={handleClick}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n e.stopPropagation();\n setModalThemeToggle(true);\n }\n }}\n {...props}\n >\n <Text size=\"md\" color=\"text-text-700\">\n Aparência\n </Text>\n </DropdownMenuItem>\n\n <Modal\n isOpen={modalThemeToggle}\n onClose={handleCancel}\n title=\"Aparência\"\n size=\"md\"\n footer={\n <div className=\"flex gap-3\">\n <Button variant=\"outline\" onClick={handleCancel}>\n Cancelar\n </Button>\n <Button variant=\"solid\" onClick={handleSave}>\n Salvar\n </Button>\n </div>\n }\n >\n <div className=\"flex flex-col\">\n <p className=\"text-sm text-text-500\">Escolha o tema:</p>\n <ThemeToggle variant=\"with-save\" onToggle={setSelectedTheme} />\n </div>\n </Modal>\n </>\n );\n};\nProfileToggleTheme.displayName = 'ProfileToggleTheme';\n\nconst ProfileMenuSection = forwardRef<\n HTMLDivElement,\n HTMLAttributes<HTMLDivElement> & { store?: DropdownStoreApi }\n>(({ className, children, store: _store, ...props }, ref) => {\n return (\n <div ref={ref} className={cn('flex flex-col p-2', className)} {...props}>\n {children}\n </div>\n );\n});\nProfileMenuSection.displayName = 'ProfileMenuSection';\n\nconst ProfileMenuFooter = ({\n className,\n disabled = false,\n onClick,\n store: externalStore,\n ...props\n}: HTMLAttributes<HTMLButtonElement> & {\n disabled?: boolean;\n store?: DropdownStoreApi;\n}) => {\n const store = useDropdownStore(externalStore);\n const setOpen = useStore(store, (s) => s.setOpen);\n\n return (\n <Button\n variant=\"outline\"\n className={cn('w-full', className)}\n disabled={disabled}\n onClick={(e) => {\n setOpen(false);\n onClick?.(e);\n }}\n {...props}\n >\n <span className=\"mr-2 flex items-center\">\n <SignOutIcon className=\"text-inherit\" />\n </span>\n <Text color=\"inherit\">Sair</Text>\n </Button>\n );\n};\nProfileMenuFooter.displayName = 'ProfileMenuFooter';\n\n// ======================================================================\n// Componentes do ProfileMenu Reading Fluency (usados com variant=\"papole\")\n// ======================================================================\n\n// Trigger de perfil Reading Fluency: ícone circular de 42px. Mostra a foto do usuário\n// (`photoUrl`) e cai no passarinho quando não houver.\nconst ProfileMenuReadingFluencyTrigger = forwardRef<\n HTMLButtonElement,\n ButtonHTMLAttributes<HTMLButtonElement> & {\n photoUrl?: string | null;\n store?: DropdownStoreApi;\n }\n>(({ className, onClick, photoUrl, store: externalStore, ...props }, ref) => {\n const store = useDropdownStore(externalStore);\n const open = useStore(store, (s) => s.open);\n const toggleOpen = () => store.setState({ open: !open });\n\n return (\n <button\n ref={ref}\n type=\"button\"\n className={cn(\n 'size-[42px] rounded-full overflow-hidden cursor-pointer bg-secondary-600 flex items-center justify-center',\n className\n )}\n onClick={(e) => {\n e.stopPropagation();\n toggleOpen();\n onClick?.(e);\n }}\n aria-expanded={open}\n aria-label=\"Abrir menu de perfil\"\n {...props}\n >\n <img\n src={photoUrl ?? readingFluencyBird}\n alt=\"Foto de perfil\"\n className=\"w-full h-full object-cover\"\n />\n </button>\n );\n});\nProfileMenuReadingFluencyTrigger.displayName =\n 'ProfileMenuReadingFluencyTrigger';\n\n// Card de informações do aluno (fundo secondary-600). Dois blocos texto1/texto2:\n// nome/email (sempre) e escola/turma (quando houver).\nconst ProfileMenuReadingFluencyInfo = forwardRef<\n HTMLDivElement,\n HTMLAttributes<HTMLDivElement> & {\n name: string;\n email: string;\n schoolName?: string;\n classYearName?: string;\n schoolYearName?: string;\n store?: DropdownStoreApi;\n }\n>(\n (\n {\n className,\n name,\n email,\n schoolName,\n classYearName,\n schoolYearName,\n store: _store,\n ...props\n },\n ref\n ) => {\n const hasSchoolBlock = !!(schoolName || classYearName || schoolYearName);\n\n return (\n <div\n ref={ref}\n data-component=\"ProfileMenuReadingFluencyInfo\"\n className={cn(\n 'font-quicksand flex flex-col gap-4 rounded-[20px] bg-secondary-600 p-4',\n className\n )}\n {...props}\n >\n <div className=\"flex flex-col\">\n <Text size=\"md\" className=\"font-bold text-text-100 truncate\">\n {name}\n </Text>\n <Text size=\"sm\" className=\"font-medium text-secondary-300 truncate\">\n {email}\n </Text>\n </div>\n\n {hasSchoolBlock && (\n <div className=\"flex flex-col\">\n {schoolName && (\n <Text size=\"md\" className=\"font-bold text-text-100 truncate\">\n {schoolName}\n </Text>\n )}\n {(classYearName || schoolYearName) && (\n <Text\n size=\"sm\"\n className=\"font-medium text-secondary-300 truncate\"\n >\n {[classYearName, schoolYearName].filter(Boolean).join(' • ')}\n </Text>\n )}\n </div>\n )}\n </div>\n );\n }\n);\nProfileMenuReadingFluencyInfo.displayName = 'ProfileMenuReadingFluencyInfo';\n\n// Rodapé Reading Fluency: botão \"Sair\" (ButtonReadingFluency outline md). Fecha o menu e repassa\n// o onClick (logout).\nconst ProfileMenuReadingFluencyFooter = ({\n className,\n disabled = false,\n onClick,\n store: externalStore,\n ...props\n}: ButtonHTMLAttributes<HTMLButtonElement> & {\n disabled?: boolean;\n store?: DropdownStoreApi;\n}) => {\n const store = useDropdownStore(externalStore);\n const setOpen = useStore(store, (s) => s.setOpen);\n\n return (\n <ButtonReadingFluency\n variant=\"outline-inverse\"\n size=\"medium\"\n className={cn('w-full', className)}\n disabled={disabled}\n onClick={(e) => {\n setOpen(false);\n onClick?.(e);\n }}\n {...props}\n >\n Sair\n </ButtonReadingFluency>\n );\n};\nProfileMenuReadingFluencyFooter.displayName = 'ProfileMenuReadingFluencyFooter';\n\n// Exportações\nexport default DropdownMenu;\nexport {\n // Componentes genéricos\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n MenuLabel,\n DropdownMenuSeparator,\n\n // Componentes específicos do ProfileMenu\n ProfileMenuTrigger,\n ProfileMenuHeader,\n ProfileMenuSection,\n ProfileMenuFooter,\n ProfileToggleTheme,\n ProfileMenuInfo,\n\n // Componentes do ProfileMenu Reading Fluency\n ProfileMenuReadingFluencyTrigger,\n ProfileMenuReadingFluencyInfo,\n ProfileMenuReadingFluencyFooter,\n};\n"]}
1
+ {"version":3,"sources":["/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-OCIBLTVL.js","../src/components/DropdownMenu/DropdownMenu.tsx"],"names":[],"mappings":"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","file":"/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-OCIBLTVL.js","sourcesContent":[null,"import { CaretRightIcon } from '@phosphor-icons/react/dist/csr/CaretRight';\nimport { SignOutIcon } from '@phosphor-icons/react/dist/csr/SignOut';\nimport { UserIcon } from '@phosphor-icons/react/dist/csr/User';\nimport {\n forwardRef,\n ReactNode,\n ButtonHTMLAttributes,\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n HTMLAttributes,\n MouseEvent,\n KeyboardEvent,\n isValidElement,\n Children,\n cloneElement,\n ReactElement,\n useState,\n RefObject,\n CSSProperties,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { create, StoreApi, useStore } from 'zustand';\nimport Button, { ButtonReadingFluency } from '../Button/Button';\nimport Text from '../Text/Text';\nimport { cn } from '../../utils/utils';\nimport readingFluencyBird from '../../assets/img/readingFluencyBird.png';\nimport Modal from '../Modal/Modal';\nimport { ThemeToggle } from '../ThemeToggle/ThemeToggle';\nimport type { ThemeMode } from '@/hooks/useTheme';\nimport { useTheme } from '../../hooks/useTheme';\n\ninterface DropdownStore {\n open: boolean;\n setOpen: (open: boolean) => void;\n}\n\ntype DropdownStoreApi = StoreApi<DropdownStore>;\n\nexport function createDropdownStore(): DropdownStoreApi {\n return create<DropdownStore>((set) => ({\n open: false,\n // Bail out when the value didn't change. Skipping `set` here prevents\n // zustand from creating a new state object, which in turn keeps\n // `useStore(store, (s) => s)` subscribers from re-rendering on no-op\n // syncs (e.g. the `useEffect [propOpen]` controlled-mode bridge).\n setOpen: (open) => set((state) => (state.open === open ? state : { open })),\n }));\n}\n\nexport const useDropdownStore = (externalStore?: DropdownStoreApi) => {\n if (!externalStore) {\n throw new Error(\n 'Component must be used within a DropdownMenu (store is missing)'\n );\n }\n\n return externalStore;\n};\n\n/**\n * Keep the same style object when nothing moved — a fresh object on every\n * scroll event would re-render the menu at 60fps for no reason.\n */\nconst PORTAL_STYLE_KEYS = [\n 'top',\n 'bottom',\n 'left',\n 'right',\n 'transform',\n 'maxHeight',\n] as const;\n\nconst isSamePortalStyle = (a: CSSProperties, b: CSSProperties): boolean =>\n PORTAL_STYLE_KEYS.every((key) => a[key] === b[key]);\n\n/** Tallest a portaled menu gets when there is room for it. */\nconst DEFAULT_PORTAL_MAX_HEIGHT = 320;\n\n/** Breathing room between the menu and the edge of the viewport. */\nconst VIEWPORT_MARGIN = 8;\n\n/**\n * Never shrink a menu below this, however cramped the trigger is: a 20px-tall\n * scroller is worse than one that overhangs a little.\n */\nconst MIN_PORTAL_MAX_HEIGHT = 120;\n\ntype PortalSide = 'top' | 'right' | 'bottom' | 'left';\ntype PortalAlign = 'start' | 'center' | 'end';\n\ninterface PortalPlacement {\n side: PortalSide;\n align: PortalAlign;\n sideOffset: number;\n maxHeight: number;\n}\n\n/**\n * Height cap for a portaled menu, given the room it has.\n *\n * The minimum is a floor on the *viewport-derived* room only — it keeps a menu\n * squeezed against an edge from collapsing into a sliver. A caller that asks\n * for a shorter menu than the minimum still gets what it asked for: its value\n * is the ceiling, never something to be raised.\n *\n * @param available - Room in px between the trigger and the viewport edge\n * @param maxHeight - Tallest the caller allows the menu to be\n * @returns The `max-height` to apply, in px\n */\nconst clampMenuHeight = (available: number, maxHeight: number): number =>\n Math.min(maxHeight, Math.max(available, MIN_PORTAL_MAX_HEIGHT));\n\n/**\n * Horizontal edge the menu lines up with, for the `top`/`bottom` sides.\n *\n * @param rect - Trigger bounding rect\n * @param align - Requested alignment\n * @returns The horizontal part of the portal style\n */\nconst alignPortalStyle = (rect: DOMRect, align: PortalAlign): CSSProperties => {\n if (align === 'end') return { right: window.innerWidth - rect.right };\n if (align === 'center') {\n return {\n left: rect.left + rect.width / 2,\n transform: 'translateX(-50%)',\n };\n }\n return { left: rect.left };\n};\n\n/**\n * Place a menu above or below its trigger, sized to the room that exists.\n *\n * A portaled menu is `position: fixed`, so whatever falls past the edge of the\n * viewport can never be scrolled to. The menu therefore takes the space it\n * actually has and scrolls inside it, and turns over to the other side when\n * clamping alone would still leave it overhanging.\n *\n * The flip threshold is the minimum height rather than the maximum: turning\n * over as soon as the menu could not open at full height would send it over the\n * content on any trigger past the middle of the screen, which reads as a\n * glitch. `side=\"top\"` always opens above — the caller asked for it.\n *\n * @param rect - Trigger bounding rect\n * @param placement - Requested side/alignment, offset and height ceiling\n * @returns Style for a fixed menu anchored to the trigger's top or bottom edge\n */\nconst verticalPortalStyle = (\n rect: DOMRect,\n { side, align, sideOffset, maxHeight }: PortalPlacement\n): CSSProperties => {\n const spaceBelow =\n window.innerHeight - rect.bottom - sideOffset - VIEWPORT_MARGIN;\n const spaceAbove = rect.top - sideOffset - VIEWPORT_MARGIN;\n const openAbove =\n side === 'top' ||\n (spaceBelow < Math.min(maxHeight, MIN_PORTAL_MAX_HEIGHT) &&\n spaceAbove > spaceBelow);\n\n return {\n maxHeight: clampMenuHeight(openAbove ? spaceAbove : spaceBelow, maxHeight),\n overflowY: 'auto',\n ...(openAbove\n ? { bottom: window.innerHeight - rect.top + sideOffset }\n : { top: rect.bottom + sideOffset }),\n ...alignPortalStyle(rect, align),\n };\n};\n\n/**\n * Place a menu beside its trigger, sized to the room below the trigger's top.\n *\n * Anchored by the edge that faces the trigger: a `left` for `side=\"left\"` would\n * grow the menu back over the trigger it was meant to sit outside of. It runs\n * downwards from the trigger's top, so it needs the same clamping as a menu\n * opening below — without it a long list disappears past the viewport bottom.\n *\n * @param rect - Trigger bounding rect\n * @param placement - Requested side, offset and height ceiling\n * @returns Style for a fixed menu anchored to the trigger's left or right edge\n */\nconst horizontalPortalStyle = (\n rect: DOMRect,\n { side, sideOffset, maxHeight }: PortalPlacement\n): CSSProperties => ({\n top: rect.top,\n maxHeight: clampMenuHeight(\n window.innerHeight - rect.top - VIEWPORT_MARGIN,\n maxHeight\n ),\n overflowY: 'auto',\n ...(side === 'left'\n ? { right: window.innerWidth - rect.left + sideOffset }\n : { left: rect.right + sideOffset }),\n});\n\nconst injectStore = (\n children: ReactNode,\n store: DropdownStoreApi\n): ReactNode => {\n return Children.map(children, (child) => {\n if (isValidElement(child)) {\n const typedChild = child as ReactElement<{\n store?: DropdownStoreApi;\n children?: ReactNode;\n }>;\n\n // Aqui tu checa o displayName do componente\n const displayName = (\n typedChild.type as unknown as { displayName: string }\n ).displayName;\n\n // Lista de componentes que devem receber o store\n const allowed = [\n 'DropdownMenuTrigger',\n 'DropdownContent',\n 'DropdownMenuContent',\n 'DropdownMenuSeparator',\n 'DropdownMenuItem',\n 'MenuLabel',\n 'ProfileMenuTrigger',\n 'ProfileMenuHeader',\n 'ProfileMenuFooter',\n 'ProfileToggleTheme',\n 'ProfileMenuReadingFluencyTrigger',\n 'ProfileMenuReadingFluencyFooter',\n ];\n\n let newProps: Partial<{\n store: DropdownStoreApi;\n children: ReactNode;\n }> = {};\n\n if (allowed.includes(displayName)) {\n newProps.store = store;\n }\n\n if (typedChild.props.children) {\n newProps.children = injectStore(typedChild.props.children, store);\n }\n\n return cloneElement(typedChild, newProps);\n }\n\n return child;\n });\n};\n\ninterface DropdownMenuProps {\n children: ReactNode;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}\n\nconst DropdownMenu = ({\n children,\n open: propOpen,\n onOpenChange,\n}: DropdownMenuProps) => {\n const storeRef = useRef<DropdownStoreApi | null>(null);\n storeRef.current ??= createDropdownStore();\n const store = storeRef.current;\n const { open, setOpen: storeSetOpen } = useStore(store, (s) => s);\n\n const setOpen = (newOpen: boolean) => {\n storeSetOpen(newOpen);\n };\n\n const menuRef = useRef<HTMLDivElement | null>(null);\n\n const handleArrowDownOrArrowUp = (event: globalThis.KeyboardEvent) => {\n // A portaled content lives in document.body, outside menuRef — look it up\n // globally in that case. Only the open menu carries data-open=\"true\"\n // (a closing one keeps rendering for the 200ms fade-out).\n const menuContent =\n menuRef.current?.querySelector('[role=\"menu\"]') ??\n document.querySelector(\n '[data-dropdown-content=\"true\"][data-open=\"true\"]'\n );\n if (menuContent) {\n event.preventDefault();\n\n const items = Array.from(\n menuContent.querySelectorAll(\n '[role=\"menuitem\"]:not([aria-disabled=\"true\"])'\n )\n ).filter((el): el is HTMLElement => el instanceof HTMLElement);\n\n if (items.length === 0) return;\n\n const focusedItem = document.activeElement as HTMLElement;\n const currentIndex = items.indexOf(focusedItem);\n\n let nextIndex;\n if (event.key === 'ArrowDown') {\n nextIndex = currentIndex === -1 ? 0 : (currentIndex + 1) % items.length;\n } else {\n // ArrowUp\n nextIndex =\n currentIndex === -1\n ? items.length - 1\n : (currentIndex - 1 + items.length) % items.length;\n }\n\n items[nextIndex]?.focus();\n }\n };\n\n const handleDownkey = (event: globalThis.KeyboardEvent) => {\n if (event.key === 'Escape') {\n setOpen(false);\n } else if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n handleArrowDownOrArrowUp(event);\n }\n };\n\n const handleClickOutside = (event: Event) => {\n const target = event.target as Node;\n\n if (menuRef.current?.contains(target)) {\n return;\n }\n\n if (\n target instanceof Element &&\n target.closest('[data-dropdown-content=\"true\"]')\n ) {\n return;\n }\n\n setOpen(false);\n };\n\n useEffect(() => {\n if (open) {\n document.addEventListener('pointerdown', handleClickOutside);\n document.addEventListener('keydown', handleDownkey);\n }\n\n return () => {\n document.removeEventListener('pointerdown', handleClickOutside);\n document.removeEventListener('keydown', handleDownkey);\n };\n }, [open]);\n\n useEffect(() => {\n onOpenChange?.(open);\n }, [open, onOpenChange]);\n\n useEffect(() => {\n if (propOpen !== undefined) {\n setOpen(propOpen);\n }\n }, [propOpen]);\n\n return (\n <div className=\"relative\" ref={menuRef}>\n {injectStore(children, store)}\n </div>\n );\n};\n\n// Componentes genéricos do DropdownMenu\nconst DropdownMenuTrigger = forwardRef<\n HTMLButtonElement,\n ButtonHTMLAttributes<HTMLButtonElement> & {\n disabled?: boolean;\n store?: DropdownStoreApi;\n }\n>(({ className, children, onClick, store: externalStore, ...props }, ref) => {\n const store = useDropdownStore(externalStore);\n\n const open = useStore(store, (s) => s.open);\n const toggleOpen = () => store.setState({ open: !open });\n\n return (\n <button\n ref={ref}\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n toggleOpen();\n onClick?.(e);\n }}\n aria-expanded={open}\n className={cn(\n 'appearance-none bg-transparent border-none p-0',\n className\n )}\n {...props}\n >\n {children}\n </button>\n );\n});\nDropdownMenuTrigger.displayName = 'DropdownMenuTrigger';\n\nconst ITEM_SIZE_CLASSES = {\n small: 'text-sm',\n medium: 'text-md',\n} as const;\n\nconst SIDE_CLASSES = {\n top: 'bottom-full',\n right: 'top-full',\n bottom: 'top-full',\n left: 'top-full',\n};\n\nconst ALIGN_CLASSES = {\n start: 'left-0',\n center: 'left-1/2 -translate-x-1/2',\n end: 'right-0',\n};\n\n// O \"chrome\" do card (bg/borda/rounded/shadow) fica por variante para que a\n// variante `papole` possa ter o seu próprio (fundo secondary-500, sem borda,\n// sombra das vars --sds-* do Figma traduzidas: 0 8px 8px -2px, preto 10% + 20%).\n// `menu`/`profile` mantêm exatamente o visual de antes.\nconst MENUCONTENT_VARIANT_CLASSES = {\n menu: 'bg-background rounded-md border bg-popover text-popover-foreground shadow-md border-border-100 p-1',\n profile:\n 'bg-background rounded-md border bg-popover text-popover-foreground shadow-md border-border-100 p-6',\n papole:\n 'flex flex-col gap-4 bg-secondary-500 rounded-[20px] pt-6 px-6 pb-8 [box-shadow:0px_8px_8px_-2px_#0000001a,0px_8px_8px_-2px_#00000033]',\n};\n\nconst MenuLabel = forwardRef<\n HTMLDivElement,\n HTMLAttributes<HTMLDivElement> & {\n inset?: boolean;\n store?: DropdownStoreApi;\n }\n>(({ className, inset, store: _store, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn('text-sm w-full', inset ? 'pl-8' : '', className)}\n {...props}\n />\n );\n});\nMenuLabel.displayName = 'MenuLabel';\n\nconst DropdownMenuContent = forwardRef<\n HTMLDivElement,\n HTMLAttributes<HTMLDivElement> & {\n align?: 'start' | 'center' | 'end';\n side?: 'top' | 'right' | 'bottom' | 'left';\n variant?: 'menu' | 'profile' | 'papole';\n sideOffset?: number;\n store?: DropdownStoreApi;\n portal?: boolean;\n triggerRef?: RefObject<HTMLElement | null>;\n /**\n * Tallest the menu gets, in px, when the viewport allows it. Portaled menus\n * only — it is capped by the space actually available around the trigger.\n */\n maxHeight?: number;\n }\n>(\n (\n {\n className,\n align = 'start',\n side = 'bottom',\n variant = 'menu',\n sideOffset = 4,\n children,\n store: externalStore,\n portal = false,\n triggerRef,\n maxHeight = DEFAULT_PORTAL_MAX_HEIGHT,\n ...props\n },\n ref\n ) => {\n const store = useDropdownStore(externalStore);\n const open = useStore(store, (s) => s.open);\n const [isVisible, setIsVisible] = useState(open);\n const [portalStyle, setPortalStyle] = useState<CSSProperties>({});\n const contentRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (open) {\n setIsVisible(true);\n } else {\n const timer = setTimeout(() => setIsVisible(false), 200);\n return () => clearTimeout(timer);\n }\n }, [open]);\n\n const updatePortalPosition = useCallback(() => {\n if (!portal || !triggerRef?.current) return;\n\n const rect = triggerRef.current.getBoundingClientRect();\n const placement = { side, align, sideOffset, maxHeight };\n const style =\n side === 'left' || side === 'right'\n ? horizontalPortalStyle(rect, placement)\n : verticalPortalStyle(rect, placement);\n\n setPortalStyle((prev) => (isSamePortalStyle(prev, style) ? prev : style));\n }, [portal, triggerRef, align, side, sideOffset, maxHeight]);\n\n useLayoutEffect(() => {\n if (open) updatePortalPosition();\n }, [open, updatePortalPosition]);\n\n // A portaled menu is position:fixed, so it doesn't follow the trigger when\n // an ancestor scrolls. Tables wrap their body in `overflow-x-auto`, so a\n // menu anchored to a column header would drift away from its <th> on any\n // horizontal scroll. Capture-phase catches scrolls on any ancestor, not\n // just the window.\n useEffect(() => {\n if (!portal || !open) return;\n\n const reposition = () => updatePortalPosition();\n window.addEventListener('scroll', reposition, true);\n window.addEventListener('resize', reposition);\n\n return () => {\n window.removeEventListener('scroll', reposition, true);\n window.removeEventListener('resize', reposition);\n };\n }, [portal, open, updatePortalPosition]);\n\n if (!isVisible) return null;\n\n const getPositionClasses = () => {\n if (portal) {\n return 'fixed';\n }\n const vertical = SIDE_CLASSES[side];\n const horizontal = ALIGN_CLASSES[align];\n\n return `absolute ${vertical} ${horizontal}`;\n };\n\n const variantClasses = MENUCONTENT_VARIANT_CLASSES[variant];\n\n const content = (\n <div\n ref={portal ? contentRef : ref}\n role=\"menu\"\n data-dropdown-content=\"true\"\n data-open={open}\n className={`\n z-50 min-w-[210px] overflow-hidden\n ${open ? 'animate-in fade-in-0 zoom-in-95' : 'animate-out fade-out-0 zoom-out-95'}\n ${getPositionClasses()}\n ${variantClasses}\n ${className}\n `}\n style={{\n ...(portal\n ? portalStyle\n : {\n marginTop: side === 'bottom' ? sideOffset : undefined,\n marginBottom: side === 'top' ? sideOffset : undefined,\n marginLeft: side === 'right' ? sideOffset : undefined,\n marginRight: side === 'left' ? sideOffset : undefined,\n }),\n }}\n {...props}\n >\n {children}\n </div>\n );\n\n if (portal && typeof document !== 'undefined') {\n return createPortal(content, document.body);\n }\n\n return content;\n }\n);\nDropdownMenuContent.displayName = 'DropdownMenuContent';\n\nconst DropdownMenuItem = forwardRef<\n HTMLDivElement,\n HTMLAttributes<HTMLDivElement> & {\n inset?: boolean;\n size?: 'small' | 'medium';\n iconLeft?: ReactNode;\n iconRight?: ReactNode;\n disabled?: boolean;\n variant?: 'profile' | 'menu';\n store?: DropdownStoreApi;\n preventClose?: boolean;\n }\n>(\n (\n {\n className,\n size = 'small',\n children,\n iconRight,\n iconLeft,\n disabled = false,\n onClick,\n variant = 'menu',\n store: externalStore,\n preventClose = false,\n ...props\n },\n ref\n ) => {\n const store = useDropdownStore(externalStore);\n const setOpen = useStore(store, (s) => s.setOpen);\n const sizeClasses = ITEM_SIZE_CLASSES[size];\n\n const handleClick = (\n e: MouseEvent<HTMLDivElement> | KeyboardEvent<HTMLDivElement>\n ) => {\n if (disabled) {\n e.preventDefault();\n e.stopPropagation();\n return;\n }\n if (e.type === 'click') {\n onClick?.(e as MouseEvent<HTMLDivElement>);\n } else if (e.type === 'keydown') {\n // For keyboard events, trigger click if Enter or Space was pressed\n const keyEvent = e as KeyboardEvent<HTMLDivElement>;\n if (keyEvent.key === 'Enter' || keyEvent.key === ' ') {\n (e.currentTarget as HTMLElement).click();\n }\n // honor any user-provided key handler\n props.onKeyDown?.(keyEvent);\n }\n if (!preventClose) {\n setOpen(false);\n }\n };\n\n const getVariantClasses = () => {\n if (variant === 'profile') {\n return 'relative flex flex-row justify-between select-none items-center gap-2 rounded-sm p-4 text-sm outline-none transition-colors [&>svg]:size-6 [&>svg]:shrink-0';\n }\n return 'relative flex select-none items-center gap-2 rounded-sm p-3 text-sm outline-none transition-colors [&>svg]:size-4 [&>svg]:shrink-0';\n };\n\n const getVariantProps = () => {\n return variant === 'profile' ? { 'data-variant': 'profile' } : {};\n };\n\n return (\n <div\n ref={ref}\n role=\"menuitem\"\n {...getVariantProps()}\n aria-disabled={disabled}\n className={`\n focus-visible:bg-background-50\n ${getVariantClasses()}\n ${sizeClasses}\n ${className}\n ${\n disabled\n ? 'cursor-not-allowed text-text-400'\n : 'cursor-pointer hover:bg-background-50 text-text-700 focus:bg-accent focus:text-accent-foreground hover:bg-accent hover:text-accent-foreground'\n }\n `}\n onClick={handleClick}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n e.stopPropagation();\n handleClick(e);\n }\n }}\n tabIndex={disabled ? -1 : 0}\n {...props}\n >\n {iconLeft}\n <div className=\"w-full\">{children}</div>\n {iconRight}\n </div>\n );\n }\n);\nDropdownMenuItem.displayName = 'DropdownMenuItem';\n\nconst DropdownMenuSeparator = forwardRef<\n HTMLDivElement,\n HTMLAttributes<HTMLDivElement> & { store?: DropdownStoreApi }\n>(({ className, store: _store, ...props }, ref) => (\n <div\n ref={ref}\n className={cn('my-1 h-px bg-border-200', className)}\n {...props}\n />\n));\nDropdownMenuSeparator.displayName = 'DropdownMenuSeparator';\n\n// Componentes específicos do ProfileMenu\nconst ProfileMenuTrigger = forwardRef<\n HTMLButtonElement,\n ButtonHTMLAttributes<HTMLButtonElement> & { store?: DropdownStoreApi }\n>(({ className, onClick, store: externalStore, ...props }, ref) => {\n const store = useDropdownStore(externalStore);\n const open = useStore(store, (s) => s.open);\n const toggleOpen = () => store.setState({ open: !open });\n\n return (\n <button\n ref={ref}\n className={cn(\n 'rounded-lg size-10 bg-primary-50 flex items-center justify-center cursor-pointer',\n className\n )}\n onClick={(e) => {\n e.stopPropagation();\n toggleOpen();\n onClick?.(e);\n }}\n aria-expanded={open}\n {...props}\n >\n <span className=\"size-6 rounded-full bg-primary-100 flex items-center justify-center\">\n <UserIcon className=\"text-primary-950\" size={18} />\n </span>\n </button>\n );\n});\nProfileMenuTrigger.displayName = 'ProfileMenuTrigger';\n\nconst ProfileMenuHeader = forwardRef<\n HTMLDivElement,\n HTMLAttributes<HTMLDivElement> & {\n name: string;\n email: string;\n photoUrl?: string | null;\n store?: DropdownStoreApi;\n }\n>(({ className, name, email, photoUrl, store: _store, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-component=\"ProfileMenuHeader\"\n className={cn(\n 'flex flex-row gap-4 items-center min-w-[280px]',\n className\n )}\n {...props}\n >\n <span className=\"w-16 h-16 bg-primary-100 rounded-full flex items-center justify-center overflow-hidden flex-shrink-0\">\n {photoUrl ? (\n <img\n src={photoUrl}\n alt=\"Foto de perfil\"\n className=\"w-full h-full object-cover\"\n />\n ) : (\n <UserIcon size={34} className=\"text-primary-800\" />\n )}\n </span>\n <div className=\"flex flex-col min-w-0\">\n <Text\n size=\"xl\"\n weight=\"bold\"\n color=\"text-text-950\"\n className=\"truncate\"\n >\n {name}\n </Text>\n <Text size=\"md\" color=\"text-text-600\" className=\"truncate\">\n {email}\n </Text>\n </div>\n </div>\n );\n});\nProfileMenuHeader.displayName = 'ProfileMenuHeader';\n\nconst ProfileMenuInfo = forwardRef<\n HTMLDivElement,\n HTMLAttributes<HTMLDivElement> & {\n schoolName: string;\n classYearName: string;\n schoolYearName: string;\n store?: DropdownStoreApi;\n }\n>(\n (\n {\n className,\n schoolName,\n classYearName,\n schoolYearName,\n store: _store,\n ...props\n },\n ref\n ) => {\n if (!schoolName && !classYearName && !schoolYearName) {\n return null;\n }\n\n return (\n <div\n ref={ref}\n data-component=\"ProfileMenuInfo\"\n className={cn('flex flex-row gap-4 items-center', className)}\n {...props}\n >\n <span className=\"w-16 h-16\" />\n <div className=\"flex flex-col \">\n {schoolName && (\n <Text size=\"md\" color=\"text-text-600\">\n {schoolName}\n </Text>\n )}\n\n {(classYearName || schoolYearName) && (\n <span className=\"flex flex-row items-center gap-2\">\n {classYearName && (\n <Text size=\"md\" color=\"text-text-600\">\n {classYearName}\n </Text>\n )}\n {classYearName && schoolYearName && (\n <Text size=\"md\" color=\"text-text-600\">\n ●\n </Text>\n )}\n {schoolYearName && (\n <Text size=\"md\" color=\"text-text-600\">\n {schoolYearName}\n </Text>\n )}\n </span>\n )}\n </div>\n </div>\n );\n }\n);\nProfileMenuInfo.displayName = 'ProfileMenuInfo';\n\nconst ProfileToggleTheme = ({\n store: externalStore,\n ...props\n}: HTMLAttributes<HTMLDivElement> & { store?: DropdownStoreApi }) => {\n const { themeMode, setTheme } = useTheme();\n const [modalThemeToggle, setModalThemeToggle] = useState(false);\n const [selectedTheme, setSelectedTheme] = useState<ThemeMode>(themeMode);\n\n const internalStoreRef = useRef<DropdownStoreApi | null>(null);\n internalStoreRef.current ??= createDropdownStore();\n const store = externalStore ?? internalStoreRef.current;\n const setOpen = useStore(store, (s) => s.setOpen);\n\n const handleClick = (e: MouseEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n setModalThemeToggle(true);\n };\n\n const handleSave = () => {\n setTheme(selectedTheme);\n setModalThemeToggle(false);\n setOpen(false); // Close dropdown after saving\n };\n\n const handleCancel = () => {\n setSelectedTheme(themeMode); // Reset to current theme\n setModalThemeToggle(false);\n setOpen(false); // Close dropdown after canceling\n };\n\n return (\n <>\n <DropdownMenuItem\n variant=\"profile\"\n preventClose={true}\n store={store}\n iconLeft={\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 25 25\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M12.5 2.75C15.085 2.75276 17.5637 3.78054 19.3916 5.6084C21.2195 7.43628 22.2473 9.915 22.25 12.5C22.25 14.4284 21.6778 16.3136 20.6064 17.917C19.5352 19.5201 18.0128 20.7699 16.2314 21.5078C14.4499 22.2458 12.489 22.4387 10.5977 22.0625C8.70642 21.6863 6.96899 20.758 5.60547 19.3945C4.24197 18.031 3.31374 16.2936 2.9375 14.4023C2.56129 12.511 2.75423 10.5501 3.49219 8.76855C4.23012 6.98718 5.47982 5.46483 7.08301 4.39355C8.68639 3.32221 10.5716 2.75 12.5 2.75ZM11.75 4.28516C9.70145 4.47452 7.7973 5.42115 6.41016 6.94043C5.02299 8.4599 4.25247 10.4426 4.25 12.5C4.25247 14.5574 5.02299 16.5401 6.41016 18.0596C7.7973 19.5789 9.70145 20.5255 11.75 20.7148V4.28516Z\"\n fill=\"currentColor\"\n />\n </svg>\n }\n iconRight={<CaretRightIcon />}\n onClick={handleClick}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n e.stopPropagation();\n setModalThemeToggle(true);\n }\n }}\n {...props}\n >\n <Text size=\"md\" color=\"text-text-700\">\n Aparência\n </Text>\n </DropdownMenuItem>\n\n <Modal\n isOpen={modalThemeToggle}\n onClose={handleCancel}\n title=\"Aparência\"\n size=\"md\"\n footer={\n <div className=\"flex gap-3\">\n <Button variant=\"outline\" onClick={handleCancel}>\n Cancelar\n </Button>\n <Button variant=\"solid\" onClick={handleSave}>\n Salvar\n </Button>\n </div>\n }\n >\n <div className=\"flex flex-col\">\n <p className=\"text-sm text-text-500\">Escolha o tema:</p>\n <ThemeToggle variant=\"with-save\" onToggle={setSelectedTheme} />\n </div>\n </Modal>\n </>\n );\n};\nProfileToggleTheme.displayName = 'ProfileToggleTheme';\n\nconst ProfileMenuSection = forwardRef<\n HTMLDivElement,\n HTMLAttributes<HTMLDivElement> & { store?: DropdownStoreApi }\n>(({ className, children, store: _store, ...props }, ref) => {\n return (\n <div ref={ref} className={cn('flex flex-col p-2', className)} {...props}>\n {children}\n </div>\n );\n});\nProfileMenuSection.displayName = 'ProfileMenuSection';\n\nconst ProfileMenuFooter = ({\n className,\n disabled = false,\n onClick,\n store: externalStore,\n ...props\n}: HTMLAttributes<HTMLButtonElement> & {\n disabled?: boolean;\n store?: DropdownStoreApi;\n}) => {\n const store = useDropdownStore(externalStore);\n const setOpen = useStore(store, (s) => s.setOpen);\n\n return (\n <Button\n variant=\"outline\"\n className={cn('w-full', className)}\n disabled={disabled}\n onClick={(e) => {\n setOpen(false);\n onClick?.(e);\n }}\n {...props}\n >\n <span className=\"mr-2 flex items-center\">\n <SignOutIcon className=\"text-inherit\" />\n </span>\n <Text color=\"inherit\">Sair</Text>\n </Button>\n );\n};\nProfileMenuFooter.displayName = 'ProfileMenuFooter';\n\n// ======================================================================\n// Componentes do ProfileMenu Reading Fluency (usados com variant=\"papole\")\n// ======================================================================\n\n// Trigger de perfil Reading Fluency: ícone circular de 42px. Mostra a foto do usuário\n// (`photoUrl`) e cai no passarinho quando não houver.\nconst ProfileMenuReadingFluencyTrigger = forwardRef<\n HTMLButtonElement,\n ButtonHTMLAttributes<HTMLButtonElement> & {\n photoUrl?: string | null;\n store?: DropdownStoreApi;\n }\n>(({ className, onClick, photoUrl, store: externalStore, ...props }, ref) => {\n const store = useDropdownStore(externalStore);\n const open = useStore(store, (s) => s.open);\n const toggleOpen = () => store.setState({ open: !open });\n\n return (\n <button\n ref={ref}\n type=\"button\"\n className={cn(\n 'size-[42px] rounded-full overflow-hidden cursor-pointer bg-secondary-600 flex items-center justify-center',\n className\n )}\n onClick={(e) => {\n e.stopPropagation();\n toggleOpen();\n onClick?.(e);\n }}\n aria-expanded={open}\n aria-label=\"Abrir menu de perfil\"\n {...props}\n >\n <img\n src={photoUrl ?? readingFluencyBird}\n alt=\"Foto de perfil\"\n className=\"w-full h-full object-cover\"\n />\n </button>\n );\n});\nProfileMenuReadingFluencyTrigger.displayName =\n 'ProfileMenuReadingFluencyTrigger';\n\n// Card de informações do aluno (fundo secondary-600). Dois blocos texto1/texto2:\n// nome/email (sempre) e escola/turma (quando houver).\nconst ProfileMenuReadingFluencyInfo = forwardRef<\n HTMLDivElement,\n HTMLAttributes<HTMLDivElement> & {\n name: string;\n email: string;\n schoolName?: string;\n classYearName?: string;\n schoolYearName?: string;\n store?: DropdownStoreApi;\n }\n>(\n (\n {\n className,\n name,\n email,\n schoolName,\n classYearName,\n schoolYearName,\n store: _store,\n ...props\n },\n ref\n ) => {\n const hasSchoolBlock = !!(schoolName || classYearName || schoolYearName);\n\n return (\n <div\n ref={ref}\n data-component=\"ProfileMenuReadingFluencyInfo\"\n className={cn(\n 'font-quicksand flex flex-col gap-4 rounded-[20px] bg-secondary-600 p-4',\n className\n )}\n {...props}\n >\n <div className=\"flex flex-col\">\n <Text size=\"md\" className=\"font-bold text-text-100 truncate\">\n {name}\n </Text>\n <Text size=\"sm\" className=\"font-medium text-secondary-300 truncate\">\n {email}\n </Text>\n </div>\n\n {hasSchoolBlock && (\n <div className=\"flex flex-col\">\n {schoolName && (\n <Text size=\"md\" className=\"font-bold text-text-100 truncate\">\n {schoolName}\n </Text>\n )}\n {(classYearName || schoolYearName) && (\n <Text\n size=\"sm\"\n className=\"font-medium text-secondary-300 truncate\"\n >\n {[classYearName, schoolYearName].filter(Boolean).join(' • ')}\n </Text>\n )}\n </div>\n )}\n </div>\n );\n }\n);\nProfileMenuReadingFluencyInfo.displayName = 'ProfileMenuReadingFluencyInfo';\n\n// Rodapé Reading Fluency: botão \"Sair\" (ButtonReadingFluency outline md). Fecha o menu e repassa\n// o onClick (logout).\nconst ProfileMenuReadingFluencyFooter = ({\n className,\n disabled = false,\n onClick,\n store: externalStore,\n ...props\n}: ButtonHTMLAttributes<HTMLButtonElement> & {\n disabled?: boolean;\n store?: DropdownStoreApi;\n}) => {\n const store = useDropdownStore(externalStore);\n const setOpen = useStore(store, (s) => s.setOpen);\n\n return (\n <ButtonReadingFluency\n variant=\"outline-inverse\"\n size=\"medium\"\n className={cn('w-full', className)}\n disabled={disabled}\n onClick={(e) => {\n setOpen(false);\n onClick?.(e);\n }}\n {...props}\n >\n Sair\n </ButtonReadingFluency>\n );\n};\nProfileMenuReadingFluencyFooter.displayName = 'ProfileMenuReadingFluencyFooter';\n\n// Exportações\nexport default DropdownMenu;\nexport {\n // Componentes genéricos\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n MenuLabel,\n DropdownMenuSeparator,\n\n // Componentes específicos do ProfileMenu\n ProfileMenuTrigger,\n ProfileMenuHeader,\n ProfileMenuSection,\n ProfileMenuFooter,\n ProfileToggleTheme,\n ProfileMenuInfo,\n\n // Componentes do ProfileMenu Reading Fluency\n ProfileMenuReadingFluencyTrigger,\n ProfileMenuReadingFluencyInfo,\n ProfileMenuReadingFluencyFooter,\n};\n"]}
@@ -17,7 +17,7 @@ import {
17
17
  } from "./chunk-VN4ORBHU.mjs";
18
18
  import {
19
19
  Modal_default
20
- } from "./chunk-5Q6MZWPK.mjs";
20
+ } from "./chunk-HEP6VNLE.mjs";
21
21
  import {
22
22
  Button_default
23
23
  } from "./chunk-TLMMQCSW.mjs";
@@ -434,4 +434,4 @@ export {
434
434
  getCategoryIcon,
435
435
  TicketModal
436
436
  };
437
- //# sourceMappingURL=chunk-6FFOZKJK.mjs.map
437
+ //# sourceMappingURL=chunk-ORVASFAF.mjs.map
@@ -13,7 +13,7 @@ import {
13
13
  } from "./chunk-EXVVHZOO.mjs";
14
14
  import {
15
15
  Modal_default
16
- } from "./chunk-5Q6MZWPK.mjs";
16
+ } from "./chunk-HEP6VNLE.mjs";
17
17
  import {
18
18
  Button_default
19
19
  } from "./chunk-TLMMQCSW.mjs";
@@ -791,4 +791,4 @@ export {
791
791
  Chat,
792
792
  Chat_default
793
793
  };
794
- //# sourceMappingURL=chunk-BQNJAQLK.mjs.map
794
+ //# sourceMappingURL=chunk-OVRINYGJ.mjs.map
@@ -3,7 +3,7 @@
3
3
  var _chunkNEDUOGWUjs = require('./chunk-NEDUOGWU.js');
4
4
 
5
5
 
6
- var _chunk5J2UT2FRjs = require('./chunk-5J2UT2FR.js');
6
+ var _chunkLS4EGCEJjs = require('./chunk-LS4EGCEJ.js');
7
7
 
8
8
 
9
9
  var _chunkOJPQTOMNjs = require('./chunk-OJPQTOMN.js');
@@ -66,7 +66,7 @@ var DownloadModal = ({
66
66
  const cardDefault = "border-border-100 hover:border-primary-300";
67
67
  const cardSelected = "border-primary-300 bg-primary-50";
68
68
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
69
- _chunk5J2UT2FRjs.Modal_default,
69
+ _chunkLS4EGCEJjs.Modal_default,
70
70
  {
71
71
  isOpen,
72
72
  onClose: handleClose,
@@ -141,4 +141,4 @@ var DownloadModal_default = DownloadModal;
141
141
 
142
142
 
143
143
  exports.DOWNLOAD_FORMAT = DOWNLOAD_FORMAT; exports.DownloadModal_default = DownloadModal_default;
144
- //# sourceMappingURL=chunk-ALHW5TD7.js.map
144
+ //# sourceMappingURL=chunk-PCVWLKJC.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-ALHW5TD7.js","../src/components/DownloadModal/DownloadModal.tsx","../src/enums/DownloadFormat.ts"],"names":["DOWNLOAD_FORMAT"],"mappings":"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","file":"/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-ALHW5TD7.js","sourcesContent":[null,"import { useState, useCallback, useEffect, useRef } from 'react';\nimport {\n FilePdfIcon,\n FileXlsIcon,\n DownloadSimpleIcon,\n} from '@phosphor-icons/react';\nimport Modal from '../Modal/Modal';\nimport Button from '../Button/Button';\nimport Text from '../Text/Text';\nimport { Skeleton } from '../Skeleton/Skeleton';\nimport { DOWNLOAD_FORMAT } from '../../enums/DownloadFormat';\n\n/**\n * Download format type alias\n */\nexport type DownloadFormat = DOWNLOAD_FORMAT;\n\n/**\n * Props for the DownloadModal component\n */\nexport interface DownloadModalProps {\n readonly isOpen: boolean;\n readonly onClose: () => void;\n readonly isDownloading: boolean;\n readonly error: string | null;\n readonly onDownloadPdf: () => void;\n readonly onDownloadExcel: () => void;\n}\n\n/**\n * Modal with two selectable format cards (PDF and Excel) and action buttons.\n * Shows skeleton placeholders while generating files.\n */\nconst DownloadModal = ({\n isOpen,\n onClose,\n isDownloading,\n error,\n onDownloadPdf,\n onDownloadExcel,\n}: DownloadModalProps) => {\n const [selectedFormat, setSelectedFormat] = useState<DownloadFormat | null>(\n null\n );\n\n const handleClose = useCallback(() => {\n setSelectedFormat(null);\n onClose();\n }, [onClose]);\n\n // Auto-close the modal when an async download transitions from loading\n // to idle without an error. Consumers only need to toggle `isDownloading`\n // in their download hook — no extra parent-side logic required.\n const wasDownloadingRef = useRef(false);\n useEffect(() => {\n if (!isOpen) {\n wasDownloadingRef.current = isDownloading;\n return;\n }\n if (wasDownloadingRef.current && !isDownloading && !error) {\n handleClose();\n }\n wasDownloadingRef.current = isDownloading;\n }, [isOpen, isDownloading, error, handleClose]);\n\n const handleDownload = useCallback(() => {\n if (selectedFormat === DOWNLOAD_FORMAT.PDF) {\n onDownloadPdf();\n handleClose();\n } else if (selectedFormat === DOWNLOAD_FORMAT.EXCEL) {\n // Excel generation is async. The useEffect above auto-closes the modal\n // once `isDownloading` transitions back to false and there is no error.\n onDownloadExcel();\n }\n }, [selectedFormat, onDownloadPdf, onDownloadExcel, handleClose]);\n\n const cardBase =\n 'flex flex-1 items-center justify-center h-20 rounded-xl border bg-background shadow-soft-shadow-1 cursor-pointer transition-colors';\n const cardDefault = 'border-border-100 hover:border-primary-300';\n const cardSelected = 'border-primary-300 bg-primary-50';\n\n return (\n <Modal\n isOpen={isOpen}\n onClose={handleClose}\n title=\"Como deseja baixar o relatório?\"\n size=\"lg\"\n footer={\n <div className=\"flex justify-end gap-2\">\n <Button\n variant=\"outline\"\n action=\"primary\"\n size=\"small\"\n onClick={handleClose}\n data-testid=\"download-cancel-btn\"\n >\n Cancelar\n </Button>\n <Button\n variant=\"solid\"\n action=\"primary\"\n size=\"small\"\n disabled={!selectedFormat || isDownloading}\n iconLeft={<DownloadSimpleIcon size={16} />}\n onClick={handleDownload}\n data-testid=\"download-confirm-btn\"\n >\n Baixar\n </Button>\n </div>\n }\n >\n <div className=\"flex flex-col gap-3\">\n {error && (\n <Text size=\"sm\" className=\"text-indicator-error\">\n {error}\n </Text>\n )}\n\n {isDownloading ? (\n <div className=\"flex flex-row gap-4\" data-testid=\"download-skeleton\">\n <Skeleton variant=\"rounded\" width=\"100%\" height={80} />\n <Skeleton variant=\"rounded\" width=\"100%\" height={80} />\n </div>\n ) : (\n <div className=\"flex flex-row gap-4\">\n <Button\n data-testid=\"download-pdf-option\"\n aria-label=\"PDF\"\n aria-pressed={selectedFormat === DOWNLOAD_FORMAT.PDF}\n variant=\"outline\"\n action=\"secondary\"\n className={`${cardBase} ${selectedFormat === DOWNLOAD_FORMAT.PDF ? cardSelected : cardDefault}`}\n onClick={() => setSelectedFormat(DOWNLOAD_FORMAT.PDF)}\n >\n <FilePdfIcon size={24} className=\"text-text-700\" />\n </Button>\n\n <Button\n data-testid=\"download-excel-option\"\n aria-label=\"Excel\"\n aria-pressed={selectedFormat === DOWNLOAD_FORMAT.EXCEL}\n variant=\"outline\"\n action=\"secondary\"\n className={`${cardBase} ${selectedFormat === DOWNLOAD_FORMAT.EXCEL ? cardSelected : cardDefault}`}\n onClick={() => setSelectedFormat(DOWNLOAD_FORMAT.EXCEL)}\n >\n <FileXlsIcon size={24} className=\"text-text-700\" />\n </Button>\n </div>\n )}\n </div>\n </Modal>\n );\n};\n\nexport default DownloadModal;\n","/**\n * Supported download format options\n */\nexport enum DOWNLOAD_FORMAT {\n PDF = 'pdf',\n EXCEL = 'excel',\n}\n"]}
1
+ {"version":3,"sources":["/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-PCVWLKJC.js","../src/components/DownloadModal/DownloadModal.tsx","../src/enums/DownloadFormat.ts"],"names":["DOWNLOAD_FORMAT"],"mappings":"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","file":"/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-PCVWLKJC.js","sourcesContent":[null,"import { useState, useCallback, useEffect, useRef } from 'react';\nimport {\n FilePdfIcon,\n FileXlsIcon,\n DownloadSimpleIcon,\n} from '@phosphor-icons/react';\nimport Modal from '../Modal/Modal';\nimport Button from '../Button/Button';\nimport Text from '../Text/Text';\nimport { Skeleton } from '../Skeleton/Skeleton';\nimport { DOWNLOAD_FORMAT } from '../../enums/DownloadFormat';\n\n/**\n * Download format type alias\n */\nexport type DownloadFormat = DOWNLOAD_FORMAT;\n\n/**\n * Props for the DownloadModal component\n */\nexport interface DownloadModalProps {\n readonly isOpen: boolean;\n readonly onClose: () => void;\n readonly isDownloading: boolean;\n readonly error: string | null;\n readonly onDownloadPdf: () => void;\n readonly onDownloadExcel: () => void;\n}\n\n/**\n * Modal with two selectable format cards (PDF and Excel) and action buttons.\n * Shows skeleton placeholders while generating files.\n */\nconst DownloadModal = ({\n isOpen,\n onClose,\n isDownloading,\n error,\n onDownloadPdf,\n onDownloadExcel,\n}: DownloadModalProps) => {\n const [selectedFormat, setSelectedFormat] = useState<DownloadFormat | null>(\n null\n );\n\n const handleClose = useCallback(() => {\n setSelectedFormat(null);\n onClose();\n }, [onClose]);\n\n // Auto-close the modal when an async download transitions from loading\n // to idle without an error. Consumers only need to toggle `isDownloading`\n // in their download hook — no extra parent-side logic required.\n const wasDownloadingRef = useRef(false);\n useEffect(() => {\n if (!isOpen) {\n wasDownloadingRef.current = isDownloading;\n return;\n }\n if (wasDownloadingRef.current && !isDownloading && !error) {\n handleClose();\n }\n wasDownloadingRef.current = isDownloading;\n }, [isOpen, isDownloading, error, handleClose]);\n\n const handleDownload = useCallback(() => {\n if (selectedFormat === DOWNLOAD_FORMAT.PDF) {\n onDownloadPdf();\n handleClose();\n } else if (selectedFormat === DOWNLOAD_FORMAT.EXCEL) {\n // Excel generation is async. The useEffect above auto-closes the modal\n // once `isDownloading` transitions back to false and there is no error.\n onDownloadExcel();\n }\n }, [selectedFormat, onDownloadPdf, onDownloadExcel, handleClose]);\n\n const cardBase =\n 'flex flex-1 items-center justify-center h-20 rounded-xl border bg-background shadow-soft-shadow-1 cursor-pointer transition-colors';\n const cardDefault = 'border-border-100 hover:border-primary-300';\n const cardSelected = 'border-primary-300 bg-primary-50';\n\n return (\n <Modal\n isOpen={isOpen}\n onClose={handleClose}\n title=\"Como deseja baixar o relatório?\"\n size=\"lg\"\n footer={\n <div className=\"flex justify-end gap-2\">\n <Button\n variant=\"outline\"\n action=\"primary\"\n size=\"small\"\n onClick={handleClose}\n data-testid=\"download-cancel-btn\"\n >\n Cancelar\n </Button>\n <Button\n variant=\"solid\"\n action=\"primary\"\n size=\"small\"\n disabled={!selectedFormat || isDownloading}\n iconLeft={<DownloadSimpleIcon size={16} />}\n onClick={handleDownload}\n data-testid=\"download-confirm-btn\"\n >\n Baixar\n </Button>\n </div>\n }\n >\n <div className=\"flex flex-col gap-3\">\n {error && (\n <Text size=\"sm\" className=\"text-indicator-error\">\n {error}\n </Text>\n )}\n\n {isDownloading ? (\n <div className=\"flex flex-row gap-4\" data-testid=\"download-skeleton\">\n <Skeleton variant=\"rounded\" width=\"100%\" height={80} />\n <Skeleton variant=\"rounded\" width=\"100%\" height={80} />\n </div>\n ) : (\n <div className=\"flex flex-row gap-4\">\n <Button\n data-testid=\"download-pdf-option\"\n aria-label=\"PDF\"\n aria-pressed={selectedFormat === DOWNLOAD_FORMAT.PDF}\n variant=\"outline\"\n action=\"secondary\"\n className={`${cardBase} ${selectedFormat === DOWNLOAD_FORMAT.PDF ? cardSelected : cardDefault}`}\n onClick={() => setSelectedFormat(DOWNLOAD_FORMAT.PDF)}\n >\n <FilePdfIcon size={24} className=\"text-text-700\" />\n </Button>\n\n <Button\n data-testid=\"download-excel-option\"\n aria-label=\"Excel\"\n aria-pressed={selectedFormat === DOWNLOAD_FORMAT.EXCEL}\n variant=\"outline\"\n action=\"secondary\"\n className={`${cardBase} ${selectedFormat === DOWNLOAD_FORMAT.EXCEL ? cardSelected : cardDefault}`}\n onClick={() => setSelectedFormat(DOWNLOAD_FORMAT.EXCEL)}\n >\n <FileXlsIcon size={24} className=\"text-text-700\" />\n </Button>\n </div>\n )}\n </div>\n </Modal>\n );\n};\n\nexport default DownloadModal;\n","/**\n * Supported download format options\n */\nexport enum DOWNLOAD_FORMAT {\n PDF = 'pdf',\n EXCEL = 'excel',\n}\n"]}