analytica-frontend-lib 1.7.21 → 1.7.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (384) hide show
  1. package/dist/AccessReportModal/index.js +3 -3
  2. package/dist/AccessReportModal/index.mjs +2 -2
  3. package/dist/ActivitiesHistory/index.js +49 -49
  4. package/dist/ActivitiesHistory/index.mjs +48 -48
  5. package/dist/ActivityCardQuestionBanks/index.js +49 -49
  6. package/dist/ActivityCardQuestionBanks/index.mjs +48 -48
  7. package/dist/ActivityCardQuestionPreview/index.js +49 -49
  8. package/dist/ActivityCardQuestionPreview/index.mjs +48 -48
  9. package/dist/ActivityCreate/ActivityCreateContent/index.js +49 -49
  10. package/dist/ActivityCreate/ActivityCreateContent/index.mjs +48 -48
  11. package/dist/ActivityCreate/index.js +49 -49
  12. package/dist/ActivityCreate/index.mjs +48 -48
  13. package/dist/ActivityDetails/index.js +49 -49
  14. package/dist/ActivityDetails/index.mjs +48 -48
  15. package/dist/ActivityFilters/index.js +49 -49
  16. package/dist/ActivityFilters/index.mjs +48 -48
  17. package/dist/ActivityPageLayout/index.js +49 -49
  18. package/dist/ActivityPageLayout/index.mjs +48 -48
  19. package/dist/ActivityPreview/index.js +49 -49
  20. package/dist/ActivityPreview/index.mjs +48 -48
  21. package/dist/AlertManager/index.js +49 -49
  22. package/dist/AlertManager/index.mjs +48 -48
  23. package/dist/AlertManagerView/index.js +3 -3
  24. package/dist/AlertManagerView/index.mjs +2 -2
  25. package/dist/AnnouncementModal/index.js +3 -3
  26. package/dist/AnnouncementModal/index.mjs +2 -2
  27. package/dist/AnnouncementsGate/index.js +4 -4
  28. package/dist/AnnouncementsGate/index.mjs +3 -3
  29. package/dist/AnswerKeyModal/index.js +3 -3
  30. package/dist/AnswerKeyModal/index.mjs +2 -2
  31. package/dist/AppHeader/index.js +6 -6
  32. package/dist/AppHeader/index.mjs +5 -5
  33. package/dist/CalendarCard/index.js +4 -4
  34. package/dist/CalendarCard/index.mjs +3 -3
  35. package/dist/Chat/index.js +3 -3
  36. package/dist/Chat/index.mjs +2 -2
  37. package/dist/CheckBox/index.d.ts.map +1 -1
  38. package/dist/CheckBox/index.js +2 -2
  39. package/dist/CheckBox/index.mjs +1 -1
  40. package/dist/CheckBoxGroup/index.js +49 -49
  41. package/dist/CheckBoxGroup/index.mjs +48 -48
  42. package/dist/ComparatorChart/ComparatorView/index.js +3 -3
  43. package/dist/ComparatorChart/ComparatorView/index.mjs +2 -2
  44. package/dist/CorrectActivityModal/index.js +7 -7
  45. package/dist/CorrectActivityModal/index.mjs +6 -6
  46. package/dist/DownloadButton/index.js +4 -4
  47. package/dist/DownloadButton/index.mjs +3 -3
  48. package/dist/DownloadModal/index.js +3 -3
  49. package/dist/DownloadModal/index.mjs +2 -2
  50. package/dist/DropdownMenu/index.js +3 -3
  51. package/dist/DropdownMenu/index.mjs +2 -2
  52. package/dist/EnemClassroomStartModal/index.d.ts.map +1 -1
  53. package/dist/EnemClassroomStartModal/index.js +7 -7
  54. package/dist/EnemClassroomStartModal/index.mjs +6 -6
  55. package/dist/EnemMoment/index.js +57 -57
  56. package/dist/EnemMoment/index.mjs +51 -51
  57. package/dist/EnemMomentStudentModal/index.js +50 -50
  58. package/dist/EnemMomentStudentModal/index.mjs +48 -48
  59. package/dist/ExamDetailsLayout/ExamDetailsPage/index.js +49 -49
  60. package/dist/ExamDetailsLayout/ExamDetailsPage/index.mjs +48 -48
  61. package/dist/ExamPageLayout/index.js +49 -49
  62. package/dist/ExamPageLayout/index.mjs +48 -48
  63. package/dist/Forum/index.js +5 -5
  64. package/dist/Forum/index.mjs +4 -4
  65. package/dist/KnowledgePerformanceCard/index.js +51 -51
  66. package/dist/KnowledgePerformanceCard/index.mjs +50 -50
  67. package/dist/LessonCardPreview/index.js +49 -49
  68. package/dist/LessonCardPreview/index.mjs +48 -48
  69. package/dist/LessonMediaSections/index.js +49 -49
  70. package/dist/LessonMediaSections/index.mjs +48 -48
  71. package/dist/LessonsCatalog/index.js +49 -49
  72. package/dist/LessonsCatalog/index.mjs +48 -48
  73. package/dist/Modal/index.d.ts.map +1 -1
  74. package/dist/Modal/index.js +2 -2
  75. package/dist/Modal/index.mjs +1 -1
  76. package/dist/MultiCheckSelect/index.js +5 -5
  77. package/dist/MultiCheckSelect/index.mjs +4 -4
  78. package/dist/MultiSearchSelect/index.js +3 -3
  79. package/dist/MultiSearchSelect/index.mjs +2 -2
  80. package/dist/MultipleChoice/index.js +3 -3
  81. package/dist/MultipleChoice/index.mjs +2 -2
  82. package/dist/NotificationCard/index.js +4 -4
  83. package/dist/NotificationCard/index.mjs +3 -3
  84. package/dist/PerformanceReportModal/index.js +3 -3
  85. package/dist/PerformanceReportModal/index.mjs +2 -2
  86. package/dist/PrintableUsersTable/index.js +49 -49
  87. package/dist/PrintableUsersTable/index.mjs +48 -48
  88. package/dist/ProgressModal/index.js +3 -3
  89. package/dist/ProgressModal/index.mjs +2 -2
  90. package/dist/QuestionsPerformanceCard/index.js +50 -50
  91. package/dist/QuestionsPerformanceCard/index.mjs +49 -49
  92. package/dist/Quiz/index.js +6 -6
  93. package/dist/Quiz/index.mjs +5 -5
  94. package/dist/RecommendedLessonCreate/index.js +49 -49
  95. package/dist/RecommendedLessonCreate/index.mjs +48 -48
  96. package/dist/RecommendedLessonDetails/index.js +7 -7
  97. package/dist/RecommendedLessonDetails/index.mjs +6 -6
  98. package/dist/RecommendedLessonsHistory/index.js +49 -49
  99. package/dist/RecommendedLessonsHistory/index.mjs +48 -48
  100. package/dist/ReportDetailModal/index.js +4 -4
  101. package/dist/ReportDetailModal/index.mjs +3 -3
  102. package/dist/RichEditor/index.js +5 -5
  103. package/dist/RichEditor/index.mjs +4 -4
  104. package/dist/{RichEditorCore-6MTYSSKS.mjs → RichEditorCore-2S5YUAOI.mjs} +5 -5
  105. package/dist/{RichEditorCore-KDARBEK4.js → RichEditorCore-N7A2445B.js} +16 -16
  106. package/dist/{RichEditorCore-KDARBEK4.js.map → RichEditorCore-N7A2445B.js.map} +1 -1
  107. package/dist/Search/index.js +4 -4
  108. package/dist/Search/index.mjs +3 -3
  109. package/dist/SendActivityModal/SendActivityModal.js +49 -49
  110. package/dist/SendActivityModal/SendActivityModal.mjs +48 -48
  111. package/dist/SendActivityModal/index.js +49 -49
  112. package/dist/SendActivityModal/index.mjs +48 -48
  113. package/dist/SendLessonModal/index.js +49 -49
  114. package/dist/SendLessonModal/index.mjs +48 -48
  115. package/dist/SimulatedPerformance/SimulatedPerformanceView/index.js +49 -49
  116. package/dist/SimulatedPerformance/SimulatedPerformanceView/index.mjs +48 -48
  117. package/dist/SimulatedPerformance/useSimulatedPerformance/index.js +5 -5
  118. package/dist/SimulatedPerformance/useSimulatedPerformance/index.mjs +4 -4
  119. package/dist/SimulatedStudentSimulationsModal/index.js +6 -6
  120. package/dist/SimulatedStudentSimulationsModal/index.mjs +5 -5
  121. package/dist/SimulationsPage/index.js +49 -49
  122. package/dist/SimulationsPage/index.mjs +48 -48
  123. package/dist/StudentLessonProgressModal/index.js +3 -3
  124. package/dist/StudentLessonProgressModal/index.mjs +2 -2
  125. package/dist/StudentPerformanceDetailsModal/index.js +5 -5
  126. package/dist/StudentPerformanceDetailsModal/index.mjs +4 -4
  127. package/dist/Support/TicketModal/index.js +3 -3
  128. package/dist/Support/TicketModal/index.mjs +2 -2
  129. package/dist/Support/index.js +4 -4
  130. package/dist/Support/index.mjs +3 -3
  131. package/dist/SupportChatComposer/index.js +3 -3
  132. package/dist/SupportChatComposer/index.mjs +2 -2
  133. package/dist/SupportChatEvent/index.js +3 -3
  134. package/dist/SupportChatEvent/index.mjs +2 -2
  135. package/dist/SupportChatMessage/index.js +3 -3
  136. package/dist/SupportChatMessage/index.mjs +2 -2
  137. package/dist/SupportChatWidget/index.js +3 -3
  138. package/dist/SupportChatWidget/index.mjs +2 -2
  139. package/dist/SupportConcludeModal/index.js +4 -4
  140. package/dist/SupportConcludeModal/index.mjs +3 -3
  141. package/dist/SupportConversationHeader/index.js +4 -4
  142. package/dist/SupportConversationHeader/index.mjs +3 -3
  143. package/dist/SupportConversationMessages/index.js +5 -5
  144. package/dist/SupportConversationMessages/index.mjs +4 -4
  145. package/dist/SupportTicketConversation/index.js +12 -12
  146. package/dist/SupportTicketConversation/index.mjs +11 -11
  147. package/dist/TableProvider/index.js +49 -49
  148. package/dist/TableProvider/index.mjs +48 -48
  149. package/dist/UnifiedDraftModelPage/index.js +49 -49
  150. package/dist/UnifiedDraftModelPage/index.mjs +48 -48
  151. package/dist/UnifiedHistoryPage/index.js +49 -49
  152. package/dist/UnifiedHistoryPage/index.mjs +48 -48
  153. package/dist/VideoPlayer/index.js +5 -5
  154. package/dist/VideoPlayer/index.mjs +4 -4
  155. package/dist/Whiteboard/index.js +3 -3
  156. package/dist/Whiteboard/index.mjs +2 -2
  157. package/dist/{chunk-B6QOBHZM.mjs → chunk-24BEZK43.mjs} +2 -2
  158. package/dist/{chunk-CYSODZGX.js → chunk-27Y6V3GM.js} +169 -66
  159. package/dist/chunk-27Y6V3GM.js.map +1 -0
  160. package/dist/{chunk-OQTXTDSK.mjs → chunk-2OJ3QSLU.mjs} +3 -3
  161. package/dist/{chunk-VDUO65VK.mjs → chunk-3EGJJDIM.mjs} +2 -2
  162. package/dist/{chunk-VDUO65VK.mjs.map → chunk-3EGJJDIM.mjs.map} +1 -1
  163. package/dist/{chunk-4OUBPEVS.mjs → chunk-3HKLGNUE.mjs} +3 -3
  164. package/dist/{chunk-YA7XLH7D.js → chunk-3MFACEZ2.js} +3 -3
  165. package/dist/{chunk-YA7XLH7D.js.map → chunk-3MFACEZ2.js.map} +1 -1
  166. package/dist/{chunk-IHBWJM4C.mjs → chunk-3Q7RJKUP.mjs} +2 -2
  167. package/dist/{chunk-PY6WD6SB.mjs → chunk-3WRB4WCD.mjs} +4 -4
  168. package/dist/{chunk-4RHCBMMP.js → chunk-46VHAL4S.js} +3 -3
  169. package/dist/{chunk-4RHCBMMP.js.map → chunk-46VHAL4S.js.map} +1 -1
  170. package/dist/{chunk-POT3ALY3.js → chunk-5DINXU6W.js} +1 -1
  171. package/dist/{chunk-POT3ALY3.js.map → chunk-5DINXU6W.js.map} +1 -1
  172. package/dist/{chunk-L52NFNFK.mjs → chunk-5VC4BK65.mjs} +3 -3
  173. package/dist/{chunk-B67RLIUM.js → chunk-72D7G6YQ.js} +3 -3
  174. package/dist/{chunk-B67RLIUM.js.map → chunk-72D7G6YQ.js.map} +1 -1
  175. package/dist/{chunk-C65DG2RI.mjs → chunk-7FSBWUOM.mjs} +2 -2
  176. package/dist/{chunk-QWMFWYII.js → chunk-7IZNLARX.js} +3 -3
  177. package/dist/{chunk-QWMFWYII.js.map → chunk-7IZNLARX.js.map} +1 -1
  178. package/dist/{chunk-ZCBT2BUZ.js → chunk-7RFHXFFV.js} +13 -13
  179. package/dist/{chunk-ZCBT2BUZ.js.map → chunk-7RFHXFFV.js.map} +1 -1
  180. package/dist/{chunk-EMWX6IKP.js → chunk-7VJP5D26.js} +13 -13
  181. package/dist/{chunk-EMWX6IKP.js.map → chunk-7VJP5D26.js.map} +1 -1
  182. package/dist/{chunk-HCQJR5CE.mjs → chunk-7ZWEBNFB.mjs} +2 -2
  183. package/dist/{chunk-3RHNJUXU.mjs → chunk-ACSEJOW6.mjs} +2 -2
  184. package/dist/{chunk-WQZHUW7C.mjs → chunk-ANFHLSDB.mjs} +3 -3
  185. package/dist/{chunk-H6NQOLQY.mjs → chunk-ANFLWCVD.mjs} +2 -2
  186. package/dist/{chunk-BKBDQXZX.js → chunk-AOYPUZRO.js} +3 -3
  187. package/dist/{chunk-BKBDQXZX.js.map → chunk-AOYPUZRO.js.map} +1 -1
  188. package/dist/{chunk-5WS6IENQ.mjs → chunk-AU2HLQDJ.mjs} +2 -2
  189. package/dist/{chunk-P6FX3NT6.mjs → chunk-AZGDHAP5.mjs} +2 -2
  190. package/dist/{chunk-NCGO7FPB.js → chunk-AZKNYREH.js} +8 -8
  191. package/dist/{chunk-NCGO7FPB.js.map → chunk-AZKNYREH.js.map} +1 -1
  192. package/dist/{chunk-R6MTPYYW.js → chunk-AZTBNERQ.js} +3 -3
  193. package/dist/{chunk-R6MTPYYW.js.map → chunk-AZTBNERQ.js.map} +1 -1
  194. package/dist/{chunk-NPB2JTYC.mjs → chunk-BO3QVQ37.mjs} +4 -4
  195. package/dist/{chunk-2WI4Q2I2.mjs → chunk-BPMWRFSI.mjs} +4 -4
  196. package/dist/{chunk-TEW33GLR.mjs → chunk-BXN3VO6I.mjs} +2 -2
  197. package/dist/{chunk-7ZB3YHF2.mjs → chunk-C6LC5LD5.mjs} +1 -1
  198. package/dist/{chunk-7ZB3YHF2.mjs.map → chunk-C6LC5LD5.mjs.map} +1 -1
  199. package/dist/{chunk-5HONWYQA.js → chunk-C7ILTLT5.js} +3 -3
  200. package/dist/{chunk-5HONWYQA.js.map → chunk-C7ILTLT5.js.map} +1 -1
  201. package/dist/{chunk-OES54VU6.mjs → chunk-CFV2OZ3P.mjs} +116 -13
  202. package/dist/chunk-CFV2OZ3P.mjs.map +1 -0
  203. package/dist/{chunk-4OVIHZ3I.js → chunk-CGXWWPEA.js} +6 -6
  204. package/dist/{chunk-4OVIHZ3I.js.map → chunk-CGXWWPEA.js.map} +1 -1
  205. package/dist/{chunk-MNU45FM3.js → chunk-COT4KW3H.js} +2 -2
  206. package/dist/{chunk-MNU45FM3.js.map → chunk-COT4KW3H.js.map} +1 -1
  207. package/dist/{chunk-JDQUXG75.js → chunk-CVDNCU6L.js} +3 -3
  208. package/dist/{chunk-JDQUXG75.js.map → chunk-CVDNCU6L.js.map} +1 -1
  209. package/dist/{chunk-HBZHWSMZ.mjs → chunk-D46PJSQ7.mjs} +13 -13
  210. package/dist/{chunk-ARYIJ4RU.js → chunk-DDORKDQO.js} +3 -3
  211. package/dist/{chunk-ARYIJ4RU.js.map → chunk-DDORKDQO.js.map} +1 -1
  212. package/dist/{chunk-7YQTDJFA.js → chunk-DKXSR2V3.js} +3 -3
  213. package/dist/{chunk-7YQTDJFA.js.map → chunk-DKXSR2V3.js.map} +1 -1
  214. package/dist/{chunk-I6EAPPBL.mjs → chunk-DZMYIOKZ.mjs} +5 -5
  215. package/dist/{chunk-SKM7NFPY.js → chunk-EPXAFJVW.js} +6 -6
  216. package/dist/{chunk-SKM7NFPY.js.map → chunk-EPXAFJVW.js.map} +1 -1
  217. package/dist/{chunk-AYYMS23L.js → chunk-ESIQ2GB4.js} +7 -7
  218. package/dist/{chunk-AYYMS23L.js.map → chunk-ESIQ2GB4.js.map} +1 -1
  219. package/dist/{chunk-NU2WNYOD.js → chunk-EW7HGUFV.js} +87 -87
  220. package/dist/{chunk-NU2WNYOD.js.map → chunk-EW7HGUFV.js.map} +1 -1
  221. package/dist/{chunk-I4QGQMXI.mjs → chunk-EXYXZFNK.mjs} +2 -2
  222. package/dist/{chunk-RBJAO57A.js → chunk-FAAR4XC5.js} +3 -3
  223. package/dist/{chunk-RBJAO57A.js.map → chunk-FAAR4XC5.js.map} +1 -1
  224. package/dist/{chunk-N2VNE3ON.js → chunk-FDTDJDZI.js} +13 -13
  225. package/dist/{chunk-N2VNE3ON.js.map → chunk-FDTDJDZI.js.map} +1 -1
  226. package/dist/{chunk-SU5Q64TW.mjs → chunk-FVCTKS33.mjs} +6 -5
  227. package/dist/chunk-FVCTKS33.mjs.map +1 -0
  228. package/dist/{chunk-AVHZHWI3.js → chunk-GBIFSFWJ.js} +15 -15
  229. package/dist/{chunk-AVHZHWI3.js.map → chunk-GBIFSFWJ.js.map} +1 -1
  230. package/dist/{chunk-KSUPPAKH.js → chunk-GIQSHTB5.js} +9 -9
  231. package/dist/{chunk-KSUPPAKH.js.map → chunk-GIQSHTB5.js.map} +1 -1
  232. package/dist/{chunk-4QBKD4JN.js → chunk-GUUJYGXF.js} +3 -3
  233. package/dist/{chunk-4QBKD4JN.js.map → chunk-GUUJYGXF.js.map} +1 -1
  234. package/dist/{chunk-M4O46VDY.mjs → chunk-GX2PKLN2.mjs} +2 -2
  235. package/dist/{chunk-5BUTINIM.mjs → chunk-HLVLSWKD.mjs} +3 -3
  236. package/dist/{chunk-FU23WOTY.js → chunk-HSV5VZ4Z.js} +6 -6
  237. package/dist/{chunk-FU23WOTY.js.map → chunk-HSV5VZ4Z.js.map} +1 -1
  238. package/dist/{chunk-MMS2ELDK.mjs → chunk-IIQCS3A2.mjs} +2 -2
  239. package/dist/{chunk-NKWLCZUZ.mjs → chunk-JGGUMHM6.mjs} +2 -2
  240. package/dist/{chunk-HT2GREFH.js → chunk-JLD46DL7.js} +11 -11
  241. package/dist/{chunk-HT2GREFH.js.map → chunk-JLD46DL7.js.map} +1 -1
  242. package/dist/{chunk-NVL5TKWD.mjs → chunk-JYFLOQYT.mjs} +2 -2
  243. package/dist/{chunk-DWGDEUEW.mjs → chunk-KG563P7F.mjs} +5 -5
  244. package/dist/{chunk-TCIC5556.mjs → chunk-KH4TEDGD.mjs} +2 -2
  245. package/dist/{chunk-23PAYKWB.js → chunk-KM27ZDHZ.js} +2 -2
  246. package/dist/{chunk-23PAYKWB.js.map → chunk-KM27ZDHZ.js.map} +1 -1
  247. package/dist/{chunk-XZUMD3CB.mjs → chunk-LODDYDTP.mjs} +2 -2
  248. package/dist/{chunk-XZUMD3CB.mjs.map → chunk-LODDYDTP.mjs.map} +1 -1
  249. package/dist/{chunk-E6CGJBID.mjs → chunk-LUHKMY56.mjs} +2 -2
  250. package/dist/{chunk-TVLEUNKE.mjs → chunk-LZP5VZCO.mjs} +2 -2
  251. package/dist/{chunk-EHNEBXS7.mjs → chunk-M6DXZ2FM.mjs} +2 -2
  252. package/dist/{chunk-B4C5DWAP.mjs → chunk-MMMJDO75.mjs} +2 -2
  253. package/dist/{chunk-AFCWMJQO.js → chunk-MOUPNP53.js} +3 -3
  254. package/dist/{chunk-AFCWMJQO.js.map → chunk-MOUPNP53.js.map} +1 -1
  255. package/dist/{chunk-36KFIZ43.js → chunk-MYPUZ6EG.js} +3 -3
  256. package/dist/{chunk-36KFIZ43.js.map → chunk-MYPUZ6EG.js.map} +1 -1
  257. package/dist/{chunk-6JHIKIPA.js → chunk-NUGLTWEA.js} +23 -23
  258. package/dist/{chunk-6JHIKIPA.js.map → chunk-NUGLTWEA.js.map} +1 -1
  259. package/dist/{chunk-KWXOYHYK.mjs → chunk-P7MORXSE.mjs} +2 -2
  260. package/dist/{chunk-YG4IZ5Q3.mjs → chunk-Q2OSEROT.mjs} +2 -2
  261. package/dist/{chunk-L5SXG6T6.mjs → chunk-QQKOHKO2.mjs} +3 -3
  262. package/dist/{chunk-SADSJ2MV.js → chunk-QVGUYPXO.js} +3 -3
  263. package/dist/{chunk-SADSJ2MV.js.map → chunk-QVGUYPXO.js.map} +1 -1
  264. package/dist/{chunk-K45PTE7F.mjs → chunk-RBKQXT73.mjs} +4 -4
  265. package/dist/{chunk-JZFISWTP.js → chunk-RIN2IN7E.js} +2 -2
  266. package/dist/{chunk-JZFISWTP.js.map → chunk-RIN2IN7E.js.map} +1 -1
  267. package/dist/{chunk-BXLAOYAG.mjs → chunk-RIUVPTG7.mjs} +2 -2
  268. package/dist/{chunk-QVB54LBS.mjs → chunk-RNZGX6MX.mjs} +3 -3
  269. package/dist/{chunk-VSVLIRO2.js → chunk-RXEU77VN.js} +15 -15
  270. package/dist/{chunk-VSVLIRO2.js.map → chunk-RXEU77VN.js.map} +1 -1
  271. package/dist/{chunk-ZRIYCU2V.js → chunk-S2BZPPAI.js} +5 -5
  272. package/dist/{chunk-ZRIYCU2V.js.map → chunk-S2BZPPAI.js.map} +1 -1
  273. package/dist/{chunk-MES2BP4T.mjs → chunk-SGL5IUCV.mjs} +2 -2
  274. package/dist/{chunk-7LS5UQCQ.mjs → chunk-STKUPDHG.mjs} +2 -2
  275. package/dist/{chunk-PPYCCT2K.js → chunk-SWDVSCQJ.js} +9 -8
  276. package/dist/chunk-SWDVSCQJ.js.map +1 -0
  277. package/dist/{chunk-JCA76TCX.mjs → chunk-SZKLJOTN.mjs} +2 -2
  278. package/dist/{chunk-F5WR6XZZ.js → chunk-T73HPYF2.js} +3 -3
  279. package/dist/{chunk-F5WR6XZZ.js.map → chunk-T73HPYF2.js.map} +1 -1
  280. package/dist/{chunk-ZB6HDDE4.js → chunk-TQO37PVW.js} +14 -14
  281. package/dist/{chunk-ZB6HDDE4.js.map → chunk-TQO37PVW.js.map} +1 -1
  282. package/dist/{chunk-VKQ5AJDT.mjs → chunk-UENZQF2Y.mjs} +2 -2
  283. package/dist/{chunk-DCG7EUBC.js → chunk-UWLW5YVB.js} +6 -6
  284. package/dist/{chunk-DCG7EUBC.js.map → chunk-UWLW5YVB.js.map} +1 -1
  285. package/dist/{chunk-37AJ2GVO.mjs → chunk-UXJIZDXQ.mjs} +2 -2
  286. package/dist/{chunk-PLLPFCN3.js → chunk-UXMDPRAI.js} +14 -14
  287. package/dist/{chunk-PLLPFCN3.js.map → chunk-UXMDPRAI.js.map} +1 -1
  288. package/dist/{chunk-7BOTKRY6.mjs → chunk-V55DG5B4.mjs} +2 -2
  289. package/dist/{chunk-YRTIDZTN.js → chunk-VHEDMUAW.js} +4 -4
  290. package/dist/{chunk-YRTIDZTN.js.map → chunk-VHEDMUAW.js.map} +1 -1
  291. package/dist/{chunk-4RD55E4R.js → chunk-VWLWSO4J.js} +3 -3
  292. package/dist/{chunk-4RD55E4R.js.map → chunk-VWLWSO4J.js.map} +1 -1
  293. package/dist/{chunk-VJQIKFMG.mjs → chunk-W3CWEZDB.mjs} +3 -3
  294. package/dist/{chunk-JM6SLU7D.js → chunk-W7NNH4VY.js} +6 -6
  295. package/dist/{chunk-JM6SLU7D.js.map → chunk-W7NNH4VY.js.map} +1 -1
  296. package/dist/{chunk-VQ7MSYIH.js → chunk-WUN5NHZE.js} +4 -4
  297. package/dist/{chunk-VQ7MSYIH.js.map → chunk-WUN5NHZE.js.map} +1 -1
  298. package/dist/{chunk-AAU7ABJN.js → chunk-WWTRSQ3X.js} +3 -3
  299. package/dist/{chunk-AAU7ABJN.js.map → chunk-WWTRSQ3X.js.map} +1 -1
  300. package/dist/{chunk-BR6D2TGF.js → chunk-WZOA2PVJ.js} +3 -3
  301. package/dist/{chunk-BR6D2TGF.js.map → chunk-WZOA2PVJ.js.map} +1 -1
  302. package/dist/{chunk-TZKR5Z4J.mjs → chunk-XJF2F36N.mjs} +2 -2
  303. package/dist/{chunk-P6ACVNQK.mjs → chunk-YD2XBEKO.mjs} +2 -2
  304. package/dist/{chunk-LMXWIPGR.js → chunk-YWPLHFAK.js} +3 -3
  305. package/dist/{chunk-LMXWIPGR.js.map → chunk-YWPLHFAK.js.map} +1 -1
  306. package/dist/{chunk-DCEWWHV5.mjs → chunk-Z3HGYPH7.mjs} +2 -2
  307. package/dist/{chunk-Q3PKW6TH.js → chunk-ZCV3HWI2.js} +6 -6
  308. package/dist/{chunk-Q3PKW6TH.js.map → chunk-ZCV3HWI2.js.map} +1 -1
  309. package/dist/{chunk-OSA3YVDZ.mjs → chunk-ZF46DCAC.mjs} +2 -2
  310. package/dist/{chunk-5T6IDXSB.js → chunk-ZO2GA23I.js} +3 -3
  311. package/dist/{chunk-5T6IDXSB.js.map → chunk-ZO2GA23I.js.map} +1 -1
  312. package/dist/{chunk-ZN3763VZ.js → chunk-ZQLW4EJB.js} +9 -9
  313. package/dist/{chunk-ZN3763VZ.js.map → chunk-ZQLW4EJB.js.map} +1 -1
  314. package/dist/{chunk-CM5R4SPF.js → chunk-ZQQJTO6T.js} +3 -3
  315. package/dist/{chunk-CM5R4SPF.js.map → chunk-ZQQJTO6T.js.map} +1 -1
  316. package/dist/{chunk-SEL4QDCO.js → chunk-ZSXSAE3D.js} +3 -3
  317. package/dist/{chunk-SEL4QDCO.js.map → chunk-ZSXSAE3D.js.map} +1 -1
  318. package/dist/components/SupportChatWidget/guestSupportChatAdapter.d.ts +6 -1
  319. package/dist/components/SupportChatWidget/guestSupportChatAdapter.d.ts.map +1 -1
  320. package/dist/hooks/useAppContent/index.js +49 -49
  321. package/dist/hooks/useAppContent/index.mjs +48 -48
  322. package/dist/hooks/useSupportChat.d.ts +2 -0
  323. package/dist/hooks/useSupportChat.d.ts.map +1 -1
  324. package/dist/index.js +49 -49
  325. package/dist/index.mjs +48 -48
  326. package/dist/types/supportChat/index.d.ts +14 -0
  327. package/dist/types/supportChat/index.d.ts.map +1 -1
  328. package/dist/types/supportChat/index.js +2 -2
  329. package/dist/types/supportChat/index.mjs +1 -1
  330. package/dist/types/supportChat.d.ts +14 -0
  331. package/dist/types/supportChat.d.ts.map +1 -1
  332. package/package.json +1 -1
  333. package/dist/chunk-CYSODZGX.js.map +0 -1
  334. package/dist/chunk-OES54VU6.mjs.map +0 -1
  335. package/dist/chunk-PPYCCT2K.js.map +0 -1
  336. package/dist/chunk-SU5Q64TW.mjs.map +0 -1
  337. /package/dist/{RichEditorCore-6MTYSSKS.mjs.map → RichEditorCore-2S5YUAOI.mjs.map} +0 -0
  338. /package/dist/{chunk-B6QOBHZM.mjs.map → chunk-24BEZK43.mjs.map} +0 -0
  339. /package/dist/{chunk-OQTXTDSK.mjs.map → chunk-2OJ3QSLU.mjs.map} +0 -0
  340. /package/dist/{chunk-4OUBPEVS.mjs.map → chunk-3HKLGNUE.mjs.map} +0 -0
  341. /package/dist/{chunk-IHBWJM4C.mjs.map → chunk-3Q7RJKUP.mjs.map} +0 -0
  342. /package/dist/{chunk-PY6WD6SB.mjs.map → chunk-3WRB4WCD.mjs.map} +0 -0
  343. /package/dist/{chunk-L52NFNFK.mjs.map → chunk-5VC4BK65.mjs.map} +0 -0
  344. /package/dist/{chunk-C65DG2RI.mjs.map → chunk-7FSBWUOM.mjs.map} +0 -0
  345. /package/dist/{chunk-HCQJR5CE.mjs.map → chunk-7ZWEBNFB.mjs.map} +0 -0
  346. /package/dist/{chunk-3RHNJUXU.mjs.map → chunk-ACSEJOW6.mjs.map} +0 -0
  347. /package/dist/{chunk-WQZHUW7C.mjs.map → chunk-ANFHLSDB.mjs.map} +0 -0
  348. /package/dist/{chunk-H6NQOLQY.mjs.map → chunk-ANFLWCVD.mjs.map} +0 -0
  349. /package/dist/{chunk-5WS6IENQ.mjs.map → chunk-AU2HLQDJ.mjs.map} +0 -0
  350. /package/dist/{chunk-P6FX3NT6.mjs.map → chunk-AZGDHAP5.mjs.map} +0 -0
  351. /package/dist/{chunk-NPB2JTYC.mjs.map → chunk-BO3QVQ37.mjs.map} +0 -0
  352. /package/dist/{chunk-2WI4Q2I2.mjs.map → chunk-BPMWRFSI.mjs.map} +0 -0
  353. /package/dist/{chunk-TEW33GLR.mjs.map → chunk-BXN3VO6I.mjs.map} +0 -0
  354. /package/dist/{chunk-HBZHWSMZ.mjs.map → chunk-D46PJSQ7.mjs.map} +0 -0
  355. /package/dist/{chunk-I6EAPPBL.mjs.map → chunk-DZMYIOKZ.mjs.map} +0 -0
  356. /package/dist/{chunk-I4QGQMXI.mjs.map → chunk-EXYXZFNK.mjs.map} +0 -0
  357. /package/dist/{chunk-M4O46VDY.mjs.map → chunk-GX2PKLN2.mjs.map} +0 -0
  358. /package/dist/{chunk-5BUTINIM.mjs.map → chunk-HLVLSWKD.mjs.map} +0 -0
  359. /package/dist/{chunk-MMS2ELDK.mjs.map → chunk-IIQCS3A2.mjs.map} +0 -0
  360. /package/dist/{chunk-NKWLCZUZ.mjs.map → chunk-JGGUMHM6.mjs.map} +0 -0
  361. /package/dist/{chunk-NVL5TKWD.mjs.map → chunk-JYFLOQYT.mjs.map} +0 -0
  362. /package/dist/{chunk-DWGDEUEW.mjs.map → chunk-KG563P7F.mjs.map} +0 -0
  363. /package/dist/{chunk-TCIC5556.mjs.map → chunk-KH4TEDGD.mjs.map} +0 -0
  364. /package/dist/{chunk-E6CGJBID.mjs.map → chunk-LUHKMY56.mjs.map} +0 -0
  365. /package/dist/{chunk-TVLEUNKE.mjs.map → chunk-LZP5VZCO.mjs.map} +0 -0
  366. /package/dist/{chunk-EHNEBXS7.mjs.map → chunk-M6DXZ2FM.mjs.map} +0 -0
  367. /package/dist/{chunk-B4C5DWAP.mjs.map → chunk-MMMJDO75.mjs.map} +0 -0
  368. /package/dist/{chunk-KWXOYHYK.mjs.map → chunk-P7MORXSE.mjs.map} +0 -0
  369. /package/dist/{chunk-YG4IZ5Q3.mjs.map → chunk-Q2OSEROT.mjs.map} +0 -0
  370. /package/dist/{chunk-L5SXG6T6.mjs.map → chunk-QQKOHKO2.mjs.map} +0 -0
  371. /package/dist/{chunk-K45PTE7F.mjs.map → chunk-RBKQXT73.mjs.map} +0 -0
  372. /package/dist/{chunk-BXLAOYAG.mjs.map → chunk-RIUVPTG7.mjs.map} +0 -0
  373. /package/dist/{chunk-QVB54LBS.mjs.map → chunk-RNZGX6MX.mjs.map} +0 -0
  374. /package/dist/{chunk-MES2BP4T.mjs.map → chunk-SGL5IUCV.mjs.map} +0 -0
  375. /package/dist/{chunk-7LS5UQCQ.mjs.map → chunk-STKUPDHG.mjs.map} +0 -0
  376. /package/dist/{chunk-JCA76TCX.mjs.map → chunk-SZKLJOTN.mjs.map} +0 -0
  377. /package/dist/{chunk-VKQ5AJDT.mjs.map → chunk-UENZQF2Y.mjs.map} +0 -0
  378. /package/dist/{chunk-37AJ2GVO.mjs.map → chunk-UXJIZDXQ.mjs.map} +0 -0
  379. /package/dist/{chunk-7BOTKRY6.mjs.map → chunk-V55DG5B4.mjs.map} +0 -0
  380. /package/dist/{chunk-VJQIKFMG.mjs.map → chunk-W3CWEZDB.mjs.map} +0 -0
  381. /package/dist/{chunk-TZKR5Z4J.mjs.map → chunk-XJF2F36N.mjs.map} +0 -0
  382. /package/dist/{chunk-P6ACVNQK.mjs.map → chunk-YD2XBEKO.mjs.map} +0 -0
  383. /package/dist/{chunk-DCEWWHV5.mjs.map → chunk-Z3HGYPH7.mjs.map} +0 -0
  384. /package/dist/{chunk-OSA3YVDZ.mjs.map → chunk-ZF46DCAC.mjs.map} +0 -0
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  SUPPORT_CHAT_REPLY_MODE
3
- } from "./chunk-7ZB3YHF2.mjs";
3
+ } from "./chunk-C6LC5LD5.mjs";
4
4
  import {
5
5
  TextArea_default
6
6
  } from "./chunk-6A2IK5NJ.mjs";
@@ -235,4 +235,4 @@ var SupportChatComposer_default = SupportChatComposer;
235
235
  export {
236
236
  SupportChatComposer_default
237
237
  };
238
- //# sourceMappingURL=chunk-I4QGQMXI.mjs.map
238
+ //# sourceMappingURL=chunk-EXYXZFNK.mjs.map
@@ -6,7 +6,7 @@ var _chunkSNUI54QSjs = require('./chunk-SNUI54QS.js');
6
6
  var _chunkIK5AMBEDjs = require('./chunk-IK5AMBED.js');
7
7
 
8
8
 
9
- var _chunk23PAYKWBjs = require('./chunk-23PAYKWB.js');
9
+ var _chunkKM27ZDHZjs = require('./chunk-KM27ZDHZ.js');
10
10
 
11
11
 
12
12
  var _chunkTWT3CSRQjs = require('./chunk-TWT3CSRQ.js');
@@ -768,7 +768,7 @@ var ProfileToggleTheme = ({
768
768
  }
769
769
  ),
770
770
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
771
- _chunk23PAYKWBjs.Modal_default,
771
+ _chunkKM27ZDHZjs.Modal_default,
772
772
  {
773
773
  isOpen: modalThemeToggle,
774
774
  onClose: handleCancel,
@@ -949,4 +949,4 @@ var DropdownMenu_default = DropdownMenu;
949
949
 
950
950
 
951
951
  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;
952
- //# sourceMappingURL=chunk-RBJAO57A.js.map
952
+ //# sourceMappingURL=chunk-FAAR4XC5.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-RBJAO57A.js","../src/components/DropdownMenu/DropdownMenu.tsx"],"names":[],"mappings":"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","file":"/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-RBJAO57A.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 useId,\n HTMLAttributes,\n MouseEvent,\n KeyboardEvent,\n isValidElement,\n Children,\n cloneElement,\n ReactElement,\n useState,\n Ref,\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 { profileImageLabel } from '../../utils/profileImageA11y';\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\n/** ARIA role of the popup; drives the trigger's `aria-haspopup`. */\ntype DropdownPopupRole = 'menu' | 'dialog';\n\ninterface DropdownStore {\n open: boolean;\n setOpen: (open: boolean) => void;\n /** Trigger element, so Escape/selection can hand focus back to it. */\n triggerElement: HTMLElement | null;\n /** Id of the rendered popup, referenced by the trigger's `aria-controls`. */\n popupId?: string;\n popupRole: DropdownPopupRole;\n /**\n * Set when the user opens the menu through the trigger. Only then the focus\n * moves into the popup — a menu opened programmatically (e.g. Search while\n * typing) must not steal focus from where the user is.\n */\n focusOnOpen: boolean;\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 triggerElement: null,\n popupId: undefined,\n popupRole: 'menu',\n focusOnOpen: false,\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\n/**\n * Merge two refs into one. Returns the single ref when only one is set (no\n * callback churn), or `undefined` when neither is — so a cloned child without a\n * ref stays refless.\n */\nconst mergeRefs = <T,>(\n a: Ref<T> | undefined,\n b: Ref<T> | undefined\n): Ref<T> | undefined => {\n if (!a) return b;\n if (!b) return a;\n return (node: T | null) => {\n for (const r of [a, b]) {\n if (typeof r === 'function') r(node);\n else (r as RefObject<T | null>).current = node;\n }\n };\n};\n\n/** Enabled menu items that can receive focus. */\nconst ENABLED_MENUITEM_SELECTOR =\n '[role^=\"menuitem\"]:not([aria-disabled=\"true\"])';\n\nconst getEnabledMenuItems = (container: Element): HTMLElement[] =>\n Array.from(container.querySelectorAll(ENABLED_MENUITEM_SELECTOR)).filter(\n (el): el is HTMLElement => el instanceof HTMLElement\n );\n\n/**\n * Where Tab can land inside a popup that keeps the focus. Items carry\n * tabindex=\"-1\" (roving tabindex), so they are listed on their own.\n */\nconst TAB_STOP_SELECTOR = [\n ENABLED_MENUITEM_SELECTOR,\n 'a[href]',\n 'button:not([disabled])',\n 'input:not([disabled]):not([type=\"hidden\"])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])',\n].join(', ');\n\n/**\n * Closest popup an element belongs to. A dialog opened from inside the menu\n * (Aparência) is rendered within the content but runs its own Tab cycle.\n */\nconst OWNING_POPUP_SELECTOR =\n 'dialog, [role=\"dialog\"], [data-dropdown-content=\"true\"]';\n\nconst getTabStops = (content: Element): HTMLElement[] =>\n Array.from(content.querySelectorAll(TAB_STOP_SELECTOR)).filter(\n (el): el is HTMLElement =>\n el instanceof HTMLElement && el.closest(OWNING_POPUP_SELECTOR) === content\n );\n\n/**\n * Cycle Tab/Shift+Tab through the stops of a popup that traps the focus, so\n * the keyboard only leaves it through Escape (or a click outside).\n */\nconst trapTabKey = (event: globalThis.KeyboardEvent, content: Element) => {\n const active = document.activeElement;\n if (active?.closest(OWNING_POPUP_SELECTOR) !== content) return;\n\n const stops = getTabStops(content);\n if (stops.length === 0) return;\n\n event.preventDefault();\n\n const currentIndex = stops.indexOf(active as HTMLElement);\n let nextIndex;\n if (currentIndex === -1) {\n nextIndex = event.shiftKey ? stops.length - 1 : 0;\n } else {\n const step = event.shiftKey ? -1 : 1;\n nextIndex = (currentIndex + step + stops.length) % stops.length;\n }\n\n stops[nextIndex]?.focus();\n};\n\n/** Input types where the arrow keys already mean something to the field. */\nconst TEXT_INPUT_TYPES = new Set(['text', 'search', 'email', 'tel', 'url']);\n\n/**\n * Whether the focused element uses the arrow keys itself (textarea, rich text,\n * time/number inputs...). Text-like inputs are excluded on purpose: ArrowDown\n * from a search field is how the keyboard reaches the items below it.\n */\nconst fieldOwnsArrowKeys = (el: Element | null): boolean => {\n if (!(el instanceof HTMLElement)) return false;\n if (el.isContentEditable || el instanceof HTMLTextAreaElement) return true;\n if (el instanceof HTMLInputElement) return !TEXT_INPUT_TYPES.has(el.type);\n return false;\n};\n\n/**\n * Ref callback that records the trigger element in the store. It ignores the\n * `null` detach and re-attaching the same node: merged refs are recreated on\n * every render, and writing the store on each detach/attach would re-render the\n * menu in a loop.\n */\nconst useRegisterTrigger = (store: DropdownStoreApi) =>\n useCallback(\n (element: HTMLElement | null) => {\n if (element && store.getState().triggerElement !== element) {\n store.setState({ triggerElement: element });\n }\n },\n [store]\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 getOpenContent = () =>\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 menuRef.current?.querySelector(\n '[data-dropdown-content=\"true\"][data-open=\"true\"]'\n ) ??\n document.querySelector('[data-dropdown-content=\"true\"][data-open=\"true\"]');\n\n const handleNavigationKey = (event: globalThis.KeyboardEvent) => {\n const menuContent = getOpenContent();\n if (!menuContent) return;\n\n const items = getEnabledMenuItems(menuContent);\n // Nothing to navigate (calendar, form...): leave the keys to the content.\n if (items.length === 0) return;\n\n const active = document.activeElement;\n const currentIndex = items.indexOf(active as HTMLElement);\n const isHomeOrEnd = event.key === 'Home' || event.key === 'End';\n // Home/End only jump between items; in a field they move the caret.\n if (isHomeOrEnd && currentIndex === -1) return;\n if (fieldOwnsArrowKeys(active)) return;\n\n event.preventDefault();\n\n let nextIndex;\n if (event.key === 'Home') {\n nextIndex = 0;\n } else if (event.key === 'End') {\n nextIndex = items.length - 1;\n } else if (event.key === 'ArrowDown') {\n nextIndex = currentIndex === -1 ? 0 : (currentIndex + 1) % items.length;\n } else {\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 const handleDownkey = (event: globalThis.KeyboardEvent) => {\n if (event.key === 'Escape') {\n // A nested open combobox/listbox (Select, SearchSelect) closes first;\n // this capture listener would otherwise close the whole menu before it\n const target = event.target;\n if (\n target instanceof Element &&\n target.closest(\n '[role=\"combobox\"][aria-expanded=\"true\"], [role=\"listbox\"]'\n )\n ) {\n return;\n }\n // preventDefault tells an enclosing Modal (useEscapeToClose) that this\n // Escape was already handled, so only the menu closes.\n event.preventDefault();\n setOpen(false);\n store.getState().triggerElement?.focus();\n } else if (event.key === 'Tab') {\n const content = getOpenContent();\n if (content?.matches('[data-trap-focus=\"true\"]')) {\n trapTabKey(event, content);\n return;\n }\n // Items use a roving tabindex, so Tab leaves the menu: close it and\n // continue the tab sequence from the trigger.\n const active = document.activeElement;\n if (\n active instanceof HTMLElement &&\n active.matches('[role^=\"menuitem\"]')\n ) {\n setOpen(false);\n store.getState().triggerElement?.focus();\n }\n } else if (['ArrowDown', 'ArrowUp', 'Home', 'End'].includes(event.key)) {\n handleNavigationKey(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 // Capture phase: runs before a Modal's Escape listener (bubble phase)\n document.addEventListener('keydown', handleDownkey, true);\n }\n\n return () => {\n document.removeEventListener('pointerdown', handleClickOutside);\n document.removeEventListener('keydown', handleDownkey, true);\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 * Render the single child as the trigger instead of wrapping it in a\n * `<button>`. Use when the child is itself a button/interactive element, so\n * the trigger doesn't nest one button inside another (invalid HTML). The\n * child keeps its own props; the toggle behaviour and `aria-expanded` are\n * merged in.\n */\n asChild?: boolean;\n }\n>(\n (\n { className, children, onClick, store: externalStore, asChild, ...props },\n ref\n ) => {\n const store = useDropdownStore(externalStore);\n\n const open = useStore(store, (s) => s.open);\n const popupId = useStore(store, (s) => s.popupId);\n const popupRole = useStore(store, (s) => s.popupRole);\n const toggleOpen = () =>\n store.setState({ open: !open, focusOnOpen: !open });\n const registerTrigger = useRegisterTrigger(store);\n const popupAria = {\n 'aria-expanded': open,\n 'aria-haspopup': popupRole,\n 'aria-controls': open ? popupId : undefined,\n } as const;\n\n const handleTriggerClick = (e: MouseEvent<HTMLElement>) => {\n e.stopPropagation();\n toggleOpen();\n onClick?.(e as MouseEvent<HTMLButtonElement>);\n };\n\n // `injectStore` re-wraps children through Children.map, so `children` may be\n // a single-element array rather than a bare element — unwrap it here.\n const asChildElement = asChild\n ? (Children.toArray(children).find(isValidElement) as\n | ReactElement<{\n className?: string;\n onClick?: (e: MouseEvent<HTMLElement>) => void;\n ref?: Ref<HTMLElement>;\n }>\n | undefined)\n : undefined;\n\n if (asChildElement) {\n const child = asChildElement;\n return cloneElement(child, {\n ...props,\n ref: mergeRefs(mergeRefs(ref, child.props.ref), registerTrigger),\n className: cn(child.props.className, className),\n ...popupAria,\n onClick: (e: MouseEvent<HTMLElement>) => {\n // Keep the child's own handler, then run the trigger's toggle — same\n // order as the previous nested-button version.\n child.props.onClick?.(e);\n handleTriggerClick(e);\n },\n } as Partial<HTMLAttributes<HTMLElement>> & { store?: DropdownStoreApi });\n }\n\n return (\n <button\n ref={mergeRefs<HTMLButtonElement>(ref, registerTrigger)}\n type=\"button\"\n onClick={handleTriggerClick}\n {...popupAria}\n className={cn(\n 'appearance-none bg-transparent border-none p-0',\n className\n )}\n {...props}\n >\n {children}\n </button>\n );\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\n/**\n * Um popup sem nome é anunciado como \"grupo\" pelo leitor de tela — genérico\n * demais para quem entra nele sem enxergar a tela. As duas variantes de perfil\n * são sempre o mesmo menu, então o nome cabe aqui. A variante `menu` aparece em\n * contextos diversos (filtros, ações de tabela) e o nome é do consumidor: um\n * rótulo fixo seria errado na maioria dos usos.\n */\nconst MENUCONTENT_VARIANT_LABELS: Record<\n keyof typeof MENUCONTENT_VARIANT_CLASSES,\n string | undefined\n> = {\n menu: undefined,\n profile: 'Menu de perfil',\n papole: 'Menu de perfil',\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 * ARIA role of the popup. Use `dialog` when the content is not a list of\n * actions (calendar, date/time picker): a `menu` without menu items is\n * announced as an empty menu.\n */\n role?: DropdownPopupRole;\n /**\n * Keep Tab/Shift+Tab cycling inside the popup; only Escape or a click\n * outside leaves it. On by default for the profile variants, whose mix of\n * items and buttons reads as one panel — the `menu` variant follows the\n * menu pattern, where Tab closes it.\n */\n trapFocus?: boolean;\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 role = 'menu',\n trapFocus = variant !== 'menu',\n id: idProp,\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 const generatedId = useId();\n const popupId = idProp ?? `dropdown-content-${generatedId}`;\n\n // The trigger reads these to fill aria-controls / aria-haspopup\n useEffect(() => {\n store.setState({ popupId, popupRole: role });\n }, [store, popupId, role]);\n\n // Opening through the trigger moves the focus into the popup: the first\n // enabled item or, with none (calendar, profile card), the popup itself.\n // Without it a screen reader stays on the trigger and never reaches a\n // portaled menu. The rAF waits for the content to mount/position.\n useEffect(() => {\n if (!open || !store.getState().focusOnOpen) return;\n store.setState({ focusOnOpen: false });\n const frame = requestAnimationFrame(() => {\n const content = contentRef.current;\n if (!content) return;\n (getEnabledMenuItems(content)[0] ?? content).focus();\n });\n return () => cancelAnimationFrame(frame);\n }, [open, store]);\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={mergeRefs<HTMLDivElement>(contentRef, ref)}\n id={popupId}\n role={role}\n tabIndex={-1}\n // While fading out the popup must not be read nor reachable by Tab\n inert={!open}\n // Antes de `{...props}`: é só o padrão da variante, o consumidor\n // sobrescreve passando o próprio aria-label.\n aria-label={MENUCONTENT_VARIANT_LABELS[variant]}\n data-dropdown-content=\"true\"\n data-open={open}\n data-trap-focus={trapFocus || undefined}\n className={`\n z-50 min-w-[210px] overflow-hidden outline-none\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 // The item unmounts with the menu; without handing focus back it\n // falls to <body> and the screen reader announces nothing.\n store.getState().triggerElement?.focus();\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 // Roving tabindex: arrows move between items, Tab leaves the menu\n tabIndex={-1}\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 popupId = useStore(store, (s) => s.popupId);\n const toggleOpen = () => store.setState({ open: !open, focusOnOpen: !open });\n const registerTrigger = useRegisterTrigger(store);\n\n return (\n <button\n ref={mergeRefs<HTMLButtonElement>(ref, registerTrigger)}\n type=\"button\"\n aria-label=\"Menu do perfil\"\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 aria-haspopup=\"menu\"\n aria-controls={open ? popupId : undefined}\n {...props}\n >\n <span\n aria-hidden=\"true\"\n className=\"size-6 rounded-full bg-primary-100 flex items-center justify-center\"\n >\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 const photoLabel = profileImageLabel({ src: photoUrl, name });\n\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\n className=\"w-16 h-16 bg-primary-100 rounded-full flex items-center justify-center overflow-hidden flex-shrink-0\"\n // Sem foto o avatar é um <svg> genérico, que o leitor de tela anunciava\n // apenas como \"imagem\". O nome vai no wrapper — e não no `alt` do\n // ícone, porque o Phosphor transforma `alt` num <title>, que o\n // navegador também mostra como tooltip no hover: efeito visual que o\n // design não pediu. Com foto, quem nomeia é o `alt` da <img>.\n {...(photoUrl ? {} : { role: 'img', 'aria-label': photoLabel })}\n >\n {photoUrl ? (\n <img\n src={photoUrl}\n alt={photoLabel}\n className=\"w-full h-full object-cover\"\n />\n ) : (\n <UserIcon size={34} className=\"text-primary-800\" aria-hidden />\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, isThemeLocked } = 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 // Tema travado pelo produto (ex.: Fluência Leitora): esconde a entrada do\n // menu inteira. Deixá-la visível daria um modal que salva e não muda nada.\n if (isThemeLocked) return null;\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 // O texto visível continua \"Sair\" (Figma), mas fora do contexto do menu\n // de perfil — no rotor do leitor de tela, no controle por voz — \"Sair\"\n // sozinho não diz de onde. O nome acessível contém o rótulo visível,\n // como exige o WCAG 2.5.3 (Label in Name), então quem fala \"clicar em\n // Sair\" continua acertando o botão. Antes de `{...props}` de propósito:\n // o consumidor ainda pode trocar o nome passando o próprio aria-label.\n aria-label=\"Sair do sistema\"\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 popupId = useStore(store, (s) => s.popupId);\n const toggleOpen = () => store.setState({ open: !open, focusOnOpen: !open });\n const registerTrigger = useRegisterTrigger(store);\n\n return (\n <button\n ref={mergeRefs<HTMLButtonElement>(ref, registerTrigger)}\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-haspopup=\"menu\"\n aria-controls={open ? popupId : undefined}\n aria-label=\"Abrir menu de perfil\"\n {...props}\n >\n {/* Decorative: the button's aria-label already names it */}\n <img\n src={photoUrl ?? readingFluencyBird}\n alt=\"\"\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 // Mesmo rótulo acessível do ProfileMenuFooter — é o mesmo \"Sair\" do\n // mesmo aluno, só na skin de fluência leitora.\n aria-label=\"Sair do sistema\"\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-FAAR4XC5.js","../src/components/DropdownMenu/DropdownMenu.tsx"],"names":[],"mappings":"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","file":"/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-FAAR4XC5.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 useId,\n HTMLAttributes,\n MouseEvent,\n KeyboardEvent,\n isValidElement,\n Children,\n cloneElement,\n ReactElement,\n useState,\n Ref,\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 { profileImageLabel } from '../../utils/profileImageA11y';\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\n/** ARIA role of the popup; drives the trigger's `aria-haspopup`. */\ntype DropdownPopupRole = 'menu' | 'dialog';\n\ninterface DropdownStore {\n open: boolean;\n setOpen: (open: boolean) => void;\n /** Trigger element, so Escape/selection can hand focus back to it. */\n triggerElement: HTMLElement | null;\n /** Id of the rendered popup, referenced by the trigger's `aria-controls`. */\n popupId?: string;\n popupRole: DropdownPopupRole;\n /**\n * Set when the user opens the menu through the trigger. Only then the focus\n * moves into the popup — a menu opened programmatically (e.g. Search while\n * typing) must not steal focus from where the user is.\n */\n focusOnOpen: boolean;\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 triggerElement: null,\n popupId: undefined,\n popupRole: 'menu',\n focusOnOpen: false,\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\n/**\n * Merge two refs into one. Returns the single ref when only one is set (no\n * callback churn), or `undefined` when neither is — so a cloned child without a\n * ref stays refless.\n */\nconst mergeRefs = <T,>(\n a: Ref<T> | undefined,\n b: Ref<T> | undefined\n): Ref<T> | undefined => {\n if (!a) return b;\n if (!b) return a;\n return (node: T | null) => {\n for (const r of [a, b]) {\n if (typeof r === 'function') r(node);\n else (r as RefObject<T | null>).current = node;\n }\n };\n};\n\n/** Enabled menu items that can receive focus. */\nconst ENABLED_MENUITEM_SELECTOR =\n '[role^=\"menuitem\"]:not([aria-disabled=\"true\"])';\n\nconst getEnabledMenuItems = (container: Element): HTMLElement[] =>\n Array.from(container.querySelectorAll(ENABLED_MENUITEM_SELECTOR)).filter(\n (el): el is HTMLElement => el instanceof HTMLElement\n );\n\n/**\n * Where Tab can land inside a popup that keeps the focus. Items carry\n * tabindex=\"-1\" (roving tabindex), so they are listed on their own.\n */\nconst TAB_STOP_SELECTOR = [\n ENABLED_MENUITEM_SELECTOR,\n 'a[href]',\n 'button:not([disabled])',\n 'input:not([disabled]):not([type=\"hidden\"])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])',\n].join(', ');\n\n/**\n * Closest popup an element belongs to. A dialog opened from inside the menu\n * (Aparência) is rendered within the content but runs its own Tab cycle.\n */\nconst OWNING_POPUP_SELECTOR =\n 'dialog, [role=\"dialog\"], [data-dropdown-content=\"true\"]';\n\nconst getTabStops = (content: Element): HTMLElement[] =>\n Array.from(content.querySelectorAll(TAB_STOP_SELECTOR)).filter(\n (el): el is HTMLElement =>\n el instanceof HTMLElement && el.closest(OWNING_POPUP_SELECTOR) === content\n );\n\n/**\n * Cycle Tab/Shift+Tab through the stops of a popup that traps the focus, so\n * the keyboard only leaves it through Escape (or a click outside).\n */\nconst trapTabKey = (event: globalThis.KeyboardEvent, content: Element) => {\n const active = document.activeElement;\n if (active?.closest(OWNING_POPUP_SELECTOR) !== content) return;\n\n const stops = getTabStops(content);\n if (stops.length === 0) return;\n\n event.preventDefault();\n\n const currentIndex = stops.indexOf(active as HTMLElement);\n let nextIndex;\n if (currentIndex === -1) {\n nextIndex = event.shiftKey ? stops.length - 1 : 0;\n } else {\n const step = event.shiftKey ? -1 : 1;\n nextIndex = (currentIndex + step + stops.length) % stops.length;\n }\n\n stops[nextIndex]?.focus();\n};\n\n/** Input types where the arrow keys already mean something to the field. */\nconst TEXT_INPUT_TYPES = new Set(['text', 'search', 'email', 'tel', 'url']);\n\n/**\n * Whether the focused element uses the arrow keys itself (textarea, rich text,\n * time/number inputs...). Text-like inputs are excluded on purpose: ArrowDown\n * from a search field is how the keyboard reaches the items below it.\n */\nconst fieldOwnsArrowKeys = (el: Element | null): boolean => {\n if (!(el instanceof HTMLElement)) return false;\n if (el.isContentEditable || el instanceof HTMLTextAreaElement) return true;\n if (el instanceof HTMLInputElement) return !TEXT_INPUT_TYPES.has(el.type);\n return false;\n};\n\n/**\n * Ref callback that records the trigger element in the store. It ignores the\n * `null` detach and re-attaching the same node: merged refs are recreated on\n * every render, and writing the store on each detach/attach would re-render the\n * menu in a loop.\n */\nconst useRegisterTrigger = (store: DropdownStoreApi) =>\n useCallback(\n (element: HTMLElement | null) => {\n if (element && store.getState().triggerElement !== element) {\n store.setState({ triggerElement: element });\n }\n },\n [store]\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 getOpenContent = () =>\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 menuRef.current?.querySelector(\n '[data-dropdown-content=\"true\"][data-open=\"true\"]'\n ) ??\n document.querySelector('[data-dropdown-content=\"true\"][data-open=\"true\"]');\n\n const handleNavigationKey = (event: globalThis.KeyboardEvent) => {\n const menuContent = getOpenContent();\n if (!menuContent) return;\n\n const items = getEnabledMenuItems(menuContent);\n // Nothing to navigate (calendar, form...): leave the keys to the content.\n if (items.length === 0) return;\n\n const active = document.activeElement;\n const currentIndex = items.indexOf(active as HTMLElement);\n const isHomeOrEnd = event.key === 'Home' || event.key === 'End';\n // Home/End only jump between items; in a field they move the caret.\n if (isHomeOrEnd && currentIndex === -1) return;\n if (fieldOwnsArrowKeys(active)) return;\n\n event.preventDefault();\n\n let nextIndex;\n if (event.key === 'Home') {\n nextIndex = 0;\n } else if (event.key === 'End') {\n nextIndex = items.length - 1;\n } else if (event.key === 'ArrowDown') {\n nextIndex = currentIndex === -1 ? 0 : (currentIndex + 1) % items.length;\n } else {\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 const handleDownkey = (event: globalThis.KeyboardEvent) => {\n if (event.key === 'Escape') {\n // A nested open combobox/listbox (Select, SearchSelect) closes first;\n // this capture listener would otherwise close the whole menu before it\n const target = event.target;\n if (\n target instanceof Element &&\n target.closest(\n '[role=\"combobox\"][aria-expanded=\"true\"], [role=\"listbox\"]'\n )\n ) {\n return;\n }\n // preventDefault tells an enclosing Modal (useEscapeToClose) that this\n // Escape was already handled, so only the menu closes.\n event.preventDefault();\n setOpen(false);\n store.getState().triggerElement?.focus();\n } else if (event.key === 'Tab') {\n const content = getOpenContent();\n if (content?.matches('[data-trap-focus=\"true\"]')) {\n trapTabKey(event, content);\n return;\n }\n // Items use a roving tabindex, so Tab leaves the menu: close it and\n // continue the tab sequence from the trigger.\n const active = document.activeElement;\n if (\n active instanceof HTMLElement &&\n active.matches('[role^=\"menuitem\"]')\n ) {\n setOpen(false);\n store.getState().triggerElement?.focus();\n }\n } else if (['ArrowDown', 'ArrowUp', 'Home', 'End'].includes(event.key)) {\n handleNavigationKey(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 // Capture phase: runs before a Modal's Escape listener (bubble phase)\n document.addEventListener('keydown', handleDownkey, true);\n }\n\n return () => {\n document.removeEventListener('pointerdown', handleClickOutside);\n document.removeEventListener('keydown', handleDownkey, true);\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 * Render the single child as the trigger instead of wrapping it in a\n * `<button>`. Use when the child is itself a button/interactive element, so\n * the trigger doesn't nest one button inside another (invalid HTML). The\n * child keeps its own props; the toggle behaviour and `aria-expanded` are\n * merged in.\n */\n asChild?: boolean;\n }\n>(\n (\n { className, children, onClick, store: externalStore, asChild, ...props },\n ref\n ) => {\n const store = useDropdownStore(externalStore);\n\n const open = useStore(store, (s) => s.open);\n const popupId = useStore(store, (s) => s.popupId);\n const popupRole = useStore(store, (s) => s.popupRole);\n const toggleOpen = () =>\n store.setState({ open: !open, focusOnOpen: !open });\n const registerTrigger = useRegisterTrigger(store);\n const popupAria = {\n 'aria-expanded': open,\n 'aria-haspopup': popupRole,\n 'aria-controls': open ? popupId : undefined,\n } as const;\n\n const handleTriggerClick = (e: MouseEvent<HTMLElement>) => {\n e.stopPropagation();\n toggleOpen();\n onClick?.(e as MouseEvent<HTMLButtonElement>);\n };\n\n // `injectStore` re-wraps children through Children.map, so `children` may be\n // a single-element array rather than a bare element — unwrap it here.\n const asChildElement = asChild\n ? (Children.toArray(children).find(isValidElement) as\n | ReactElement<{\n className?: string;\n onClick?: (e: MouseEvent<HTMLElement>) => void;\n ref?: Ref<HTMLElement>;\n }>\n | undefined)\n : undefined;\n\n if (asChildElement) {\n const child = asChildElement;\n return cloneElement(child, {\n ...props,\n ref: mergeRefs(mergeRefs(ref, child.props.ref), registerTrigger),\n className: cn(child.props.className, className),\n ...popupAria,\n onClick: (e: MouseEvent<HTMLElement>) => {\n // Keep the child's own handler, then run the trigger's toggle — same\n // order as the previous nested-button version.\n child.props.onClick?.(e);\n handleTriggerClick(e);\n },\n } as Partial<HTMLAttributes<HTMLElement>> & { store?: DropdownStoreApi });\n }\n\n return (\n <button\n ref={mergeRefs<HTMLButtonElement>(ref, registerTrigger)}\n type=\"button\"\n onClick={handleTriggerClick}\n {...popupAria}\n className={cn(\n 'appearance-none bg-transparent border-none p-0',\n className\n )}\n {...props}\n >\n {children}\n </button>\n );\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\n/**\n * Um popup sem nome é anunciado como \"grupo\" pelo leitor de tela — genérico\n * demais para quem entra nele sem enxergar a tela. As duas variantes de perfil\n * são sempre o mesmo menu, então o nome cabe aqui. A variante `menu` aparece em\n * contextos diversos (filtros, ações de tabela) e o nome é do consumidor: um\n * rótulo fixo seria errado na maioria dos usos.\n */\nconst MENUCONTENT_VARIANT_LABELS: Record<\n keyof typeof MENUCONTENT_VARIANT_CLASSES,\n string | undefined\n> = {\n menu: undefined,\n profile: 'Menu de perfil',\n papole: 'Menu de perfil',\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 * ARIA role of the popup. Use `dialog` when the content is not a list of\n * actions (calendar, date/time picker): a `menu` without menu items is\n * announced as an empty menu.\n */\n role?: DropdownPopupRole;\n /**\n * Keep Tab/Shift+Tab cycling inside the popup; only Escape or a click\n * outside leaves it. On by default for the profile variants, whose mix of\n * items and buttons reads as one panel — the `menu` variant follows the\n * menu pattern, where Tab closes it.\n */\n trapFocus?: boolean;\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 role = 'menu',\n trapFocus = variant !== 'menu',\n id: idProp,\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 const generatedId = useId();\n const popupId = idProp ?? `dropdown-content-${generatedId}`;\n\n // The trigger reads these to fill aria-controls / aria-haspopup\n useEffect(() => {\n store.setState({ popupId, popupRole: role });\n }, [store, popupId, role]);\n\n // Opening through the trigger moves the focus into the popup: the first\n // enabled item or, with none (calendar, profile card), the popup itself.\n // Without it a screen reader stays on the trigger and never reaches a\n // portaled menu. The rAF waits for the content to mount/position.\n useEffect(() => {\n if (!open || !store.getState().focusOnOpen) return;\n store.setState({ focusOnOpen: false });\n const frame = requestAnimationFrame(() => {\n const content = contentRef.current;\n if (!content) return;\n (getEnabledMenuItems(content)[0] ?? content).focus();\n });\n return () => cancelAnimationFrame(frame);\n }, [open, store]);\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={mergeRefs<HTMLDivElement>(contentRef, ref)}\n id={popupId}\n role={role}\n tabIndex={-1}\n // While fading out the popup must not be read nor reachable by Tab\n inert={!open}\n // Antes de `{...props}`: é só o padrão da variante, o consumidor\n // sobrescreve passando o próprio aria-label.\n aria-label={MENUCONTENT_VARIANT_LABELS[variant]}\n data-dropdown-content=\"true\"\n data-open={open}\n data-trap-focus={trapFocus || undefined}\n className={`\n z-50 min-w-[210px] overflow-hidden outline-none\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 // The item unmounts with the menu; without handing focus back it\n // falls to <body> and the screen reader announces nothing.\n store.getState().triggerElement?.focus();\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 // Roving tabindex: arrows move between items, Tab leaves the menu\n tabIndex={-1}\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 popupId = useStore(store, (s) => s.popupId);\n const toggleOpen = () => store.setState({ open: !open, focusOnOpen: !open });\n const registerTrigger = useRegisterTrigger(store);\n\n return (\n <button\n ref={mergeRefs<HTMLButtonElement>(ref, registerTrigger)}\n type=\"button\"\n aria-label=\"Menu do perfil\"\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 aria-haspopup=\"menu\"\n aria-controls={open ? popupId : undefined}\n {...props}\n >\n <span\n aria-hidden=\"true\"\n className=\"size-6 rounded-full bg-primary-100 flex items-center justify-center\"\n >\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 const photoLabel = profileImageLabel({ src: photoUrl, name });\n\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\n className=\"w-16 h-16 bg-primary-100 rounded-full flex items-center justify-center overflow-hidden flex-shrink-0\"\n // Sem foto o avatar é um <svg> genérico, que o leitor de tela anunciava\n // apenas como \"imagem\". O nome vai no wrapper — e não no `alt` do\n // ícone, porque o Phosphor transforma `alt` num <title>, que o\n // navegador também mostra como tooltip no hover: efeito visual que o\n // design não pediu. Com foto, quem nomeia é o `alt` da <img>.\n {...(photoUrl ? {} : { role: 'img', 'aria-label': photoLabel })}\n >\n {photoUrl ? (\n <img\n src={photoUrl}\n alt={photoLabel}\n className=\"w-full h-full object-cover\"\n />\n ) : (\n <UserIcon size={34} className=\"text-primary-800\" aria-hidden />\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, isThemeLocked } = 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 // Tema travado pelo produto (ex.: Fluência Leitora): esconde a entrada do\n // menu inteira. Deixá-la visível daria um modal que salva e não muda nada.\n if (isThemeLocked) return null;\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 // O texto visível continua \"Sair\" (Figma), mas fora do contexto do menu\n // de perfil — no rotor do leitor de tela, no controle por voz — \"Sair\"\n // sozinho não diz de onde. O nome acessível contém o rótulo visível,\n // como exige o WCAG 2.5.3 (Label in Name), então quem fala \"clicar em\n // Sair\" continua acertando o botão. Antes de `{...props}` de propósito:\n // o consumidor ainda pode trocar o nome passando o próprio aria-label.\n aria-label=\"Sair do sistema\"\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 popupId = useStore(store, (s) => s.popupId);\n const toggleOpen = () => store.setState({ open: !open, focusOnOpen: !open });\n const registerTrigger = useRegisterTrigger(store);\n\n return (\n <button\n ref={mergeRefs<HTMLButtonElement>(ref, registerTrigger)}\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-haspopup=\"menu\"\n aria-controls={open ? popupId : undefined}\n aria-label=\"Abrir menu de perfil\"\n {...props}\n >\n {/* Decorative: the button's aria-label already names it */}\n <img\n src={photoUrl ?? readingFluencyBird}\n alt=\"\"\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 // Mesmo rótulo acessível do ProfileMenuFooter — é o mesmo \"Sair\" do\n // mesmo aluno, só na skin de fluência leitora.\n aria-label=\"Sair do sistema\"\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"]}
@@ -3,7 +3,7 @@
3
3
  var _chunkXQL6H446js = require('./chunk-XQL6H446.js');
4
4
 
5
5
 
6
- var _chunkJZFISWTPjs = require('./chunk-JZFISWTP.js');
6
+ var _chunkRIN2IN7Ejs = require('./chunk-RIN2IN7E.js');
7
7
 
8
8
 
9
9
  var _chunkHMIMGXGBjs = require('./chunk-HMIMGXGB.js');
@@ -29,10 +29,10 @@ var _chunkVVO3W2SMjs = require('./chunk-VVO3W2SM.js');
29
29
 
30
30
 
31
31
 
32
- var _chunkRBJAO57Ajs = require('./chunk-RBJAO57A.js');
32
+ var _chunkFAAR4XC5js = require('./chunk-FAAR4XC5.js');
33
33
 
34
34
 
35
- var _chunk23PAYKWBjs = require('./chunk-23PAYKWB.js');
35
+ var _chunkKM27ZDHZjs = require('./chunk-KM27ZDHZ.js');
36
36
 
37
37
 
38
38
  var _chunkXN2HPVVHjs = require('./chunk-XN2HPVVH.js');
@@ -111,25 +111,25 @@ function AuthorMeta({ authorName, authorPhoto, createdAt }) {
111
111
  ] });
112
112
  }
113
113
  function PostActionsMenu({ onEdit, onDelete }) {
114
- return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkRBJAO57Ajs.DropdownMenu_default, { children: [
114
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkFAAR4XC5js.DropdownMenu_default, { children: [
115
115
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
116
- _chunkRBJAO57Ajs.DropdownMenuTrigger,
116
+ _chunkFAAR4XC5js.DropdownMenuTrigger,
117
117
  {
118
118
  "aria-label": "Abrir a\xE7\xF5es do post",
119
119
  className: "p-1 rounded hover:bg-background-100 transition-colors shrink-0",
120
120
  children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _react3.DotsThreeVerticalIcon, { size: 20, className: "text-text-600" })
121
121
  }
122
122
  ),
123
- /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkRBJAO57Ajs.DropdownMenuContent, { align: "end", children: [
123
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkFAAR4XC5js.DropdownMenuContent, { align: "end", children: [
124
124
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
125
- _chunkRBJAO57Ajs.DropdownMenuItem,
125
+ _chunkFAAR4XC5js.DropdownMenuItem,
126
126
  {
127
127
  iconLeft: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _react3.PencilSimpleIcon, { size: 16 }),
128
128
  onClick: onEdit,
129
129
  children: "Editar"
130
130
  }
131
131
  ),
132
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkRBJAO57Ajs.DropdownMenuItem, { iconLeft: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _react3.TrashIcon, { size: 16 }), onClick: onDelete, children: "Deletar" })
132
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkFAAR4XC5js.DropdownMenuItem, { iconLeft: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _react3.TrashIcon, { size: 16 }), onClick: onDelete, children: "Deletar" })
133
133
  ] })
134
134
  ] });
135
135
  }
@@ -166,7 +166,7 @@ function PostContentModal({
166
166
  const isContentEmpty = !plainTextContent.trim();
167
167
  const exceedsMaxLength = plainTextContent.trim().length > maxLength;
168
168
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
169
- _chunk23PAYKWBjs.Modal_default,
169
+ _chunkKM27ZDHZjs.Modal_default,
170
170
  {
171
171
  isOpen,
172
172
  onClose,
@@ -199,7 +199,7 @@ function PostContentModal({
199
199
  richText ? (
200
200
  // key forces remount (and thus reset) whenever the modal opens/closes
201
201
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
202
- _chunkJZFISWTPjs.RichEditor,
202
+ _chunkRIN2IN7Ejs.RichEditor,
203
203
  {
204
204
  content,
205
205
  onChange: (data) => onContentChange(data.html),
@@ -844,7 +844,7 @@ function Forum({
844
844
  }
845
845
  ),
846
846
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
847
- _chunk23PAYKWBjs.Modal_default,
847
+ _chunkKM27ZDHZjs.Modal_default,
848
848
  {
849
849
  isOpen: !!evaluatingReplyId,
850
850
  onClose: handleCloseEvaluateModal,
@@ -892,7 +892,7 @@ function Forum({
892
892
  }
893
893
  ),
894
894
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
895
- _chunk23PAYKWBjs.Modal_default,
895
+ _chunkKM27ZDHZjs.Modal_default,
896
896
  {
897
897
  isOpen: !!pendingDelete,
898
898
  onClose: () => setPendingDelete(null),
@@ -932,4 +932,4 @@ var Forum_default = Forum;
932
932
 
933
933
 
934
934
  exports.Forum = Forum; exports.Forum_default = Forum_default;
935
- //# sourceMappingURL=chunk-N2VNE3ON.js.map
935
+ //# sourceMappingURL=chunk-FDTDJDZI.js.map