analytica-frontend-lib 1.6.76 → 1.6.78
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AccessReportModal/index.js +4 -5
- package/dist/AccessReportModal/index.js.map +1 -1
- package/dist/AccessReportModal/index.mjs +3 -4
- package/dist/AccessibilityWidget/index.js +4 -5
- package/dist/AccessibilityWidget/index.js.map +1 -1
- package/dist/AccessibilityWidget/index.mjs +3 -4
- package/dist/Accordation/index.js +4 -4
- package/dist/Accordation/index.mjs +3 -3
- package/dist/ActivitiesHistory/index.js +48 -49
- package/dist/ActivitiesHistory/index.js.map +1 -1
- package/dist/ActivitiesHistory/index.mjs +47 -48
- package/dist/ActivityCardQuestionBanks/index.d.ts.map +1 -1
- package/dist/ActivityCardQuestionBanks/index.js +48 -49
- package/dist/ActivityCardQuestionBanks/index.js.map +1 -1
- package/dist/ActivityCardQuestionBanks/index.mjs +47 -48
- package/dist/ActivityCardQuestionPreview/index.js +48 -49
- package/dist/ActivityCardQuestionPreview/index.js.map +1 -1
- package/dist/ActivityCardQuestionPreview/index.mjs +47 -48
- package/dist/ActivityCreate/ActivityCreateContent/index.js +48 -49
- package/dist/ActivityCreate/ActivityCreateContent/index.js.map +1 -1
- package/dist/ActivityCreate/ActivityCreateContent/index.mjs +47 -48
- package/dist/ActivityCreate/index.js +48 -49
- package/dist/ActivityCreate/index.js.map +1 -1
- package/dist/ActivityCreate/index.mjs +47 -48
- package/dist/ActivityDetails/index.js +48 -49
- package/dist/ActivityDetails/index.js.map +1 -1
- package/dist/ActivityDetails/index.mjs +47 -48
- package/dist/ActivityFilters/index.js +48 -49
- package/dist/ActivityFilters/index.js.map +1 -1
- package/dist/ActivityFilters/index.mjs +47 -48
- package/dist/ActivityPageLayout/index.js +48 -49
- package/dist/ActivityPageLayout/index.js.map +1 -1
- package/dist/ActivityPageLayout/index.mjs +47 -48
- package/dist/ActivityPreview/index.js +48 -49
- package/dist/ActivityPreview/index.js.map +1 -1
- package/dist/ActivityPreview/index.mjs +47 -48
- package/dist/AlertDialog/index.d.ts.map +1 -1
- package/dist/AlertDialog/index.js +3 -3
- package/dist/AlertDialog/index.mjs +2 -2
- package/dist/AlertManager/index.js +48 -49
- package/dist/AlertManager/index.js.map +1 -1
- package/dist/AlertManager/index.mjs +47 -48
- package/dist/AlertManagerView/index.js +4 -5
- package/dist/AlertManagerView/index.js.map +1 -1
- package/dist/AlertManagerView/index.mjs +3 -4
- package/dist/AnnouncementModal/index.js +4 -5
- package/dist/AnnouncementModal/index.js.map +1 -1
- package/dist/AnnouncementModal/index.mjs +3 -4
- package/dist/AnnouncementsGate/index.js +5 -6
- package/dist/AnnouncementsGate/index.js.map +1 -1
- package/dist/AnnouncementsGate/index.mjs +4 -5
- package/dist/AnswerKeyModal/index.js +4 -5
- package/dist/AnswerKeyModal/index.js.map +1 -1
- package/dist/AnswerKeyModal/index.mjs +3 -4
- package/dist/AppHeader/index.js +8 -9
- package/dist/AppHeader/index.js.map +1 -1
- package/dist/AppHeader/index.mjs +7 -8
- package/dist/CalendarCard/index.js +6 -7
- package/dist/CalendarCard/index.js.map +1 -1
- package/dist/CalendarCard/index.mjs +5 -6
- package/dist/Card/index.d.ts.map +1 -1
- package/dist/Card/index.js +3 -3
- package/dist/Card/index.mjs +2 -2
- package/dist/Chat/index.js +4 -5
- package/dist/Chat/index.js.map +1 -1
- package/dist/Chat/index.mjs +3 -4
- package/dist/Chatbot/index.js +4 -5
- package/dist/Chatbot/index.js.map +1 -1
- package/dist/Chatbot/index.mjs +3 -4
- package/dist/CheckBoxGroup/index.js +48 -49
- package/dist/CheckBoxGroup/index.js.map +1 -1
- package/dist/CheckBoxGroup/index.mjs +47 -48
- package/dist/ComparatorChart/ComparatorView/index.js +4 -5
- package/dist/ComparatorChart/ComparatorView/index.js.map +1 -1
- package/dist/ComparatorChart/ComparatorView/index.mjs +3 -4
- package/dist/CorrectActivityModal/index.js +9 -10
- package/dist/CorrectActivityModal/index.js.map +1 -1
- package/dist/CorrectActivityModal/index.mjs +8 -9
- package/dist/DownloadButton/index.js +6 -7
- package/dist/DownloadButton/index.js.map +1 -1
- package/dist/DownloadButton/index.mjs +5 -6
- package/dist/DownloadModal/index.js +4 -5
- package/dist/DownloadModal/index.js.map +1 -1
- package/dist/DownloadModal/index.mjs +3 -4
- package/dist/DropdownMenu/index.js +4 -5
- package/dist/DropdownMenu/index.js.map +1 -1
- package/dist/DropdownMenu/index.mjs +3 -4
- package/dist/EnemClassroomStartModal/index.js +8 -9
- package/dist/EnemClassroomStartModal/index.js.map +1 -1
- package/dist/EnemClassroomStartModal/index.mjs +7 -8
- package/dist/EnemMoment/index.js +110 -94
- package/dist/EnemMoment/index.js.map +1 -1
- package/dist/EnemMoment/index.mjs +74 -58
- package/dist/EnemMoment/index.mjs.map +1 -1
- package/dist/EnemMomentStudentModal/index.js +62 -63
- package/dist/EnemMomentStudentModal/index.js.map +1 -1
- package/dist/EnemMomentStudentModal/index.mjs +48 -49
- package/dist/EnemMomentStudentModal/index.mjs.map +1 -1
- package/dist/EssayThemePicker/index.js +3 -3
- package/dist/EssayThemePicker/index.mjs +2 -2
- package/dist/ExamDetailsLayout/ExamDetailsPage/index.js +48 -49
- package/dist/ExamDetailsLayout/ExamDetailsPage/index.js.map +1 -1
- package/dist/ExamDetailsLayout/ExamDetailsPage/index.mjs +47 -48
- package/dist/ExamPageLayout/index.js +48 -49
- package/dist/ExamPageLayout/index.js.map +1 -1
- package/dist/ExamPageLayout/index.mjs +47 -48
- package/dist/Forum/index.js +6 -7
- package/dist/Forum/index.js.map +1 -1
- package/dist/Forum/index.mjs +5 -6
- package/dist/IconButton/index.js +2 -2
- package/dist/IconButton/index.mjs +1 -1
- package/dist/LessonCardPreview/index.js +48 -49
- package/dist/LessonCardPreview/index.js.map +1 -1
- package/dist/LessonCardPreview/index.mjs +47 -48
- package/dist/LessonMediaSections/index.js +48 -49
- package/dist/LessonMediaSections/index.js.map +1 -1
- package/dist/LessonMediaSections/index.mjs +47 -48
- package/dist/LessonsCatalog/index.js +48 -49
- package/dist/LessonsCatalog/index.js.map +1 -1
- package/dist/LessonsCatalog/index.mjs +47 -48
- package/dist/Modal/index.d.ts +11 -1
- package/dist/Modal/index.d.ts.map +1 -1
- package/dist/Modal/index.js +3 -4
- package/dist/Modal/index.js.map +1 -1
- package/dist/Modal/index.mjs +2 -3
- package/dist/MultiCheckSelect/index.js +5 -6
- package/dist/MultiCheckSelect/index.js.map +1 -1
- package/dist/MultiCheckSelect/index.mjs +4 -5
- package/dist/NotificationCard/index.js +6 -7
- package/dist/NotificationCard/index.js.map +1 -1
- package/dist/NotificationCard/index.mjs +5 -6
- package/dist/PerformanceReportModal/index.js +4 -5
- package/dist/PerformanceReportModal/index.js.map +1 -1
- package/dist/PerformanceReportModal/index.mjs +3 -4
- package/dist/PrintableUsersTable/index.js +48 -49
- package/dist/PrintableUsersTable/index.js.map +1 -1
- package/dist/PrintableUsersTable/index.mjs +47 -48
- package/dist/ProgressModal/index.js +4 -5
- package/dist/ProgressModal/index.js.map +1 -1
- package/dist/ProgressModal/index.mjs +3 -4
- package/dist/QuestionsPerformanceCard/index.js +49 -50
- package/dist/QuestionsPerformanceCard/index.js.map +1 -1
- package/dist/QuestionsPerformanceCard/index.mjs +48 -49
- package/dist/Quiz/QuizResult/index.js +4 -4
- package/dist/Quiz/QuizResult/index.mjs +3 -3
- package/dist/Quiz/index.d.ts.map +1 -1
- package/dist/Quiz/index.js +8 -9
- package/dist/Quiz/index.js.map +1 -1
- package/dist/Quiz/index.mjs +7 -8
- package/dist/QuizTimer/index.d.ts +12 -0
- package/dist/QuizTimer/index.d.ts.map +1 -1
- package/dist/QuizTimer/index.js +4 -2
- package/dist/QuizTimer/index.js.map +1 -1
- package/dist/QuizTimer/index.mjs +4 -2
- package/dist/RecommendedLessonCreate/index.js +48 -49
- package/dist/RecommendedLessonCreate/index.js.map +1 -1
- package/dist/RecommendedLessonCreate/index.mjs +47 -48
- package/dist/RecommendedLessonDetails/index.js +11 -12
- package/dist/RecommendedLessonDetails/index.js.map +1 -1
- package/dist/RecommendedLessonDetails/index.mjs +10 -11
- package/dist/RecommendedLessonsHistory/index.js +48 -49
- package/dist/RecommendedLessonsHistory/index.js.map +1 -1
- package/dist/RecommendedLessonsHistory/index.mjs +47 -48
- package/dist/ReportDetailModal/index.js +5 -6
- package/dist/ReportDetailModal/index.js.map +1 -1
- package/dist/ReportDetailModal/index.mjs +4 -5
- package/dist/RichEditor/index.js +6 -7
- package/dist/RichEditor/index.js.map +1 -1
- package/dist/RichEditor/index.mjs +5 -6
- package/dist/{RichEditorCore-62NIM7PC.js → RichEditorCore-6OT3VNJR.js} +15 -16
- package/dist/RichEditorCore-6OT3VNJR.js.map +1 -0
- package/dist/{RichEditorCore-CCO3SSSU.mjs → RichEditorCore-IF6JQHEO.mjs} +6 -7
- package/dist/{RichEditorCore-CCO3SSSU.mjs.map → RichEditorCore-IF6JQHEO.mjs.map} +1 -1
- package/dist/Search/index.js +5 -6
- package/dist/Search/index.js.map +1 -1
- package/dist/Search/index.mjs +4 -5
- package/dist/SendActivityModal/SendActivityModal.js +48 -49
- package/dist/SendActivityModal/SendActivityModal.js.map +1 -1
- package/dist/SendActivityModal/SendActivityModal.mjs +47 -48
- package/dist/SendActivityModal/index.js +48 -49
- package/dist/SendActivityModal/index.js.map +1 -1
- package/dist/SendActivityModal/index.mjs +47 -48
- package/dist/SendLessonModal/index.js +48 -49
- package/dist/SendLessonModal/index.js.map +1 -1
- package/dist/SendLessonModal/index.mjs +47 -48
- package/dist/SimulatedPerformance/SimulatedPerformanceView/index.js +48 -49
- package/dist/SimulatedPerformance/SimulatedPerformanceView/index.js.map +1 -1
- package/dist/SimulatedPerformance/SimulatedPerformanceView/index.mjs +47 -48
- package/dist/SimulatedPerformance/useSimulatedPerformance/index.js +6 -7
- package/dist/SimulatedPerformance/useSimulatedPerformance/index.js.map +1 -1
- package/dist/SimulatedPerformance/useSimulatedPerformance/index.mjs +5 -6
- package/dist/SimulatedStudentSimulationsModal/index.js +8 -9
- package/dist/SimulatedStudentSimulationsModal/index.js.map +1 -1
- package/dist/SimulatedStudentSimulationsModal/index.mjs +7 -8
- package/dist/SimulationSummaryCards/index.js +5 -5
- package/dist/SimulationSummaryCards/index.mjs +4 -4
- package/dist/SimulationsPage/index.js +48 -49
- package/dist/SimulationsPage/index.js.map +1 -1
- package/dist/SimulationsPage/index.mjs +47 -48
- package/dist/StudentLessonProgressModal/index.js +6 -7
- package/dist/StudentLessonProgressModal/index.js.map +1 -1
- package/dist/StudentLessonProgressModal/index.mjs +5 -6
- package/dist/StudentPerformanceDetailsModal/index.js +9 -10
- package/dist/StudentPerformanceDetailsModal/index.js.map +1 -1
- package/dist/StudentPerformanceDetailsModal/index.mjs +8 -9
- package/dist/Support/TicketModal/index.js +4 -5
- package/dist/Support/TicketModal/index.js.map +1 -1
- package/dist/Support/TicketModal/index.mjs +3 -4
- package/dist/Support/index.js +5 -6
- package/dist/Support/index.js.map +1 -1
- package/dist/Support/index.mjs +4 -5
- package/dist/TableProvider/index.js +48 -49
- package/dist/TableProvider/index.js.map +1 -1
- package/dist/TableProvider/index.mjs +47 -48
- package/dist/UnifiedDraftModelPage/index.js +48 -49
- package/dist/UnifiedDraftModelPage/index.js.map +1 -1
- package/dist/UnifiedDraftModelPage/index.mjs +47 -48
- package/dist/UnifiedHistoryPage/index.js +48 -49
- package/dist/UnifiedHistoryPage/index.js.map +1 -1
- package/dist/UnifiedHistoryPage/index.mjs +47 -48
- package/dist/VideoPlayer/index.js +7 -8
- package/dist/VideoPlayer/index.js.map +1 -1
- package/dist/VideoPlayer/index.mjs +6 -7
- package/dist/Whiteboard/index.js +4 -5
- package/dist/Whiteboard/index.js.map +1 -1
- package/dist/Whiteboard/index.mjs +3 -4
- package/dist/{chunk-EVBQNVQW.mjs → chunk-233FSBU7.mjs} +5 -5
- package/dist/{chunk-JU63EMZM.js → chunk-24DQFREC.js} +3 -3
- package/dist/{chunk-JU63EMZM.js.map → chunk-24DQFREC.js.map} +1 -1
- package/dist/{chunk-QFXSQKW3.mjs → chunk-254EBPMW.mjs} +22 -22
- package/dist/{chunk-QFXSQKW3.mjs.map → chunk-254EBPMW.mjs.map} +1 -1
- package/dist/{chunk-SFQVZ4KQ.js → chunk-2ETPIOCD.js} +3 -3
- package/dist/{chunk-SFQVZ4KQ.js.map → chunk-2ETPIOCD.js.map} +1 -1
- package/dist/{chunk-RCNIBRZY.js → chunk-2VTJ2PKF.js} +10 -10
- package/dist/{chunk-RCNIBRZY.js.map → chunk-2VTJ2PKF.js.map} +1 -1
- package/dist/{chunk-B35D5S4G.js → chunk-2ZMGNCMI.js} +6 -6
- package/dist/{chunk-B35D5S4G.js.map → chunk-2ZMGNCMI.js.map} +1 -1
- package/dist/{chunk-QEPKR6ZF.js → chunk-3KSRDIS2.js} +20 -20
- package/dist/{chunk-QEPKR6ZF.js.map → chunk-3KSRDIS2.js.map} +1 -1
- package/dist/{chunk-MUCV5ZWZ.mjs → chunk-3YF7H577.mjs} +15 -9
- package/dist/chunk-3YF7H577.mjs.map +1 -0
- package/dist/{chunk-MADPP2PW.mjs → chunk-3ZSI2KI5.mjs} +2 -2
- package/dist/{chunk-2W7PTFXS.mjs → chunk-42XKJV56.mjs} +2 -2
- package/dist/{chunk-M6TC6XRQ.mjs → chunk-55ESXRRM.mjs} +2 -2
- package/dist/{chunk-4MURAKPC.mjs → chunk-5DJVOLVX.mjs} +3 -3
- package/dist/{chunk-YVT7CT3G.mjs → chunk-5P6CBDZ6.mjs} +2 -2
- package/dist/{chunk-BHKTJCFD.js → chunk-5QUP5HKB.js} +3 -3
- package/dist/{chunk-BHKTJCFD.js.map → chunk-5QUP5HKB.js.map} +1 -1
- package/dist/{chunk-SFEU7BMY.mjs → chunk-5SFNRXZB.mjs} +2 -2
- package/dist/{chunk-6ALEXGAN.js → chunk-6U4AI5SE.js} +6 -6
- package/dist/{chunk-6ALEXGAN.js.map → chunk-6U4AI5SE.js.map} +1 -1
- package/dist/{chunk-KYY4U5SN.mjs → chunk-6Z5W5J44.mjs} +3 -3
- package/dist/{chunk-XOKBMLW3.js → chunk-7IGUYLSF.js} +3 -3
- package/dist/{chunk-XOKBMLW3.js.map → chunk-7IGUYLSF.js.map} +1 -1
- package/dist/{chunk-GVYGPJH3.mjs → chunk-AU5M2766.mjs} +2 -2
- package/dist/{chunk-2VODGC76.js → chunk-AVEMHDN2.js} +66 -44
- package/dist/chunk-AVEMHDN2.js.map +1 -0
- package/dist/{chunk-HIIOADV4.js → chunk-AZSRKBYS.js} +63 -71
- package/dist/chunk-AZSRKBYS.js.map +1 -0
- package/dist/{chunk-CY2VKNCB.js → chunk-BQIBVC6X.js} +5 -5
- package/dist/{chunk-CY2VKNCB.js.map → chunk-BQIBVC6X.js.map} +1 -1
- package/dist/{chunk-M77TQ5JJ.mjs → chunk-BU32E6BR.mjs} +4 -6
- package/dist/{chunk-M77TQ5JJ.mjs.map → chunk-BU32E6BR.mjs.map} +1 -1
- package/dist/{chunk-5CQVDUDO.js → chunk-BUNF5POU.js} +5 -5
- package/dist/{chunk-5CQVDUDO.js.map → chunk-BUNF5POU.js.map} +1 -1
- package/dist/{chunk-Z6UN4ZPW.mjs → chunk-BVHVYC7Q.mjs} +4 -4
- package/dist/{chunk-WJENEFDG.js → chunk-CAFVLHDV.js} +3 -3
- package/dist/{chunk-WJENEFDG.js.map → chunk-CAFVLHDV.js.map} +1 -1
- package/dist/{chunk-BVUPM6EY.js → chunk-CAQ2Q3ON.js} +2 -2
- package/dist/chunk-CAQ2Q3ON.js.map +1 -0
- package/dist/{chunk-QMPOGLAR.js → chunk-CIASXVWX.js} +3 -3
- package/dist/{chunk-QMPOGLAR.js.map → chunk-CIASXVWX.js.map} +1 -1
- package/dist/{chunk-APKEYUJ3.js → chunk-CIQLC2ZZ.js} +3 -3
- package/dist/{chunk-APKEYUJ3.js.map → chunk-CIQLC2ZZ.js.map} +1 -1
- package/dist/{chunk-36XPNLGQ.js → chunk-CW3FCWR4.js} +16 -16
- package/dist/{chunk-36XPNLGQ.js.map → chunk-CW3FCWR4.js.map} +1 -1
- package/dist/{chunk-J5VEAJN5.mjs → chunk-CWVUGZNK.mjs} +2 -2
- package/dist/{chunk-BCMDP6GK.mjs → chunk-DV3N2K3Y.mjs} +4 -4
- package/dist/{chunk-PP7SEERV.mjs → chunk-DXYSEBK3.mjs} +9 -3
- package/dist/chunk-DXYSEBK3.mjs.map +1 -0
- package/dist/{chunk-754M6HQ5.js → chunk-EJN4OP3D.js} +5 -5
- package/dist/{chunk-754M6HQ5.js.map → chunk-EJN4OP3D.js.map} +1 -1
- package/dist/{chunk-3IM2SBPO.js → chunk-F5K3HMKT.js} +4 -4
- package/dist/{chunk-3IM2SBPO.js.map → chunk-F5K3HMKT.js.map} +1 -1
- package/dist/{chunk-WMDSGVZ7.mjs → chunk-GCGSAS2Z.mjs} +48 -63
- package/dist/chunk-GCGSAS2Z.mjs.map +1 -0
- package/dist/{chunk-EXHGEJ4P.mjs → chunk-GKARHTZ2.mjs} +2 -2
- package/dist/{chunk-2VDCEEXB.js → chunk-GNKFBVW4.js} +3 -3
- package/dist/{chunk-2VDCEEXB.js.map → chunk-GNKFBVW4.js.map} +1 -1
- package/dist/{chunk-CDLOMECB.js → chunk-GTBPMNTJ.js} +3 -3
- package/dist/{chunk-CDLOMECB.js.map → chunk-GTBPMNTJ.js.map} +1 -1
- package/dist/{chunk-YQKAASWM.js → chunk-GXXDSBN2.js} +10 -4
- package/dist/chunk-GXXDSBN2.js.map +1 -0
- package/dist/{chunk-FASVPU6N.js → chunk-H3F4OCXC.js} +10 -10
- package/dist/{chunk-FASVPU6N.js.map → chunk-H3F4OCXC.js.map} +1 -1
- package/dist/{chunk-JCFN6KRS.mjs → chunk-HGWDB73S.mjs} +2 -2
- package/dist/{chunk-JXXMO7PY.mjs → chunk-HN5RW4C3.mjs} +3 -3
- package/dist/{chunk-I2A4EQPH.mjs → chunk-HQ2GXFK5.mjs} +6 -6
- package/dist/{chunk-BIPC6F6D.js → chunk-IDJ37MOU.js} +115 -115
- package/dist/{chunk-BIPC6F6D.js.map → chunk-IDJ37MOU.js.map} +1 -1
- package/dist/{chunk-TBJLNIOY.mjs → chunk-JBLYYTHN.mjs} +2 -2
- package/dist/{chunk-G4NK66PM.js → chunk-JTWXQ267.js} +24 -18
- package/dist/chunk-JTWXQ267.js.map +1 -0
- package/dist/{chunk-V6IC74KH.js → chunk-JXGLDRDC.js} +34 -34
- package/dist/{chunk-V6IC74KH.js.map → chunk-JXGLDRDC.js.map} +1 -1
- package/dist/{chunk-DDFIRQI5.mjs → chunk-K3E5VEBF.mjs} +56 -34
- package/dist/chunk-K3E5VEBF.mjs.map +1 -0
- package/dist/{chunk-MSBEWG26.js → chunk-K5O2IOI4.js} +8 -8
- package/dist/{chunk-MSBEWG26.js.map → chunk-K5O2IOI4.js.map} +1 -1
- package/dist/{chunk-SB5YGKXR.js → chunk-KBMLGQ5J.js} +49 -64
- package/dist/chunk-KBMLGQ5J.js.map +1 -0
- package/dist/chunk-KCZEKV7M.mjs +81 -0
- package/dist/chunk-KCZEKV7M.mjs.map +1 -0
- package/dist/{chunk-GRSN76BV.mjs → chunk-KH2R4STU.mjs} +3 -3
- package/dist/{chunk-7DQM34JT.js → chunk-KHYSXYPO.js} +23 -23
- package/dist/{chunk-7DQM34JT.js.map → chunk-KHYSXYPO.js.map} +1 -1
- package/dist/{chunk-V2YHMPRR.js → chunk-KJHBQQYJ.js} +5 -5
- package/dist/{chunk-V2YHMPRR.js.map → chunk-KJHBQQYJ.js.map} +1 -1
- package/dist/{chunk-ZF5NMQJZ.mjs → chunk-KUKLN3CK.mjs} +4 -4
- package/dist/{chunk-6AYB7CZH.js → chunk-KZQVGSR2.js} +2 -2
- package/dist/{chunk-6AYB7CZH.js.map → chunk-KZQVGSR2.js.map} +1 -1
- package/dist/{chunk-UAKRBNW2.mjs → chunk-L4T76OKM.mjs} +2 -2
- package/dist/{chunk-AUCXJ7LG.js → chunk-M3LQH7Y7.js} +3 -3
- package/dist/{chunk-AUCXJ7LG.js.map → chunk-M3LQH7Y7.js.map} +1 -1
- package/dist/{chunk-FQNJJH7F.js → chunk-MCXRKD56.js} +13 -13
- package/dist/{chunk-FQNJJH7F.js.map → chunk-MCXRKD56.js.map} +1 -1
- package/dist/{chunk-PY5WCBKN.mjs → chunk-MERKXOSI.mjs} +4 -4
- package/dist/{chunk-D3YDZF2G.js → chunk-N472HQPZ.js} +3 -3
- package/dist/{chunk-D3YDZF2G.js.map → chunk-N472HQPZ.js.map} +1 -1
- package/dist/{chunk-UPMYCGXR.js → chunk-N4K4X34Z.js} +4 -4
- package/dist/{chunk-UPMYCGXR.js.map → chunk-N4K4X34Z.js.map} +1 -1
- package/dist/{chunk-RU43UMEH.js → chunk-NFCNAFUK.js} +3 -3
- package/dist/{chunk-RU43UMEH.js.map → chunk-NFCNAFUK.js.map} +1 -1
- package/dist/{chunk-APCB5HWT.mjs → chunk-NLSDZJRR.mjs} +3 -3
- package/dist/{chunk-EWYIXCNF.mjs → chunk-NLUTNCLH.mjs} +5 -5
- package/dist/{chunk-OP4Q2KDS.mjs → chunk-NMKKMY5P.mjs} +2 -2
- package/dist/{chunk-WDPFO4II.mjs → chunk-NMPK336K.mjs} +2 -2
- package/dist/{chunk-X6BZ5IEV.mjs → chunk-NU7O6YKR.mjs} +2 -2
- package/dist/{chunk-ZABDSRX3.js → chunk-NUZ5K3CB.js} +4 -4
- package/dist/{chunk-ZABDSRX3.js.map → chunk-NUZ5K3CB.js.map} +1 -1
- package/dist/{chunk-N5ZGFYLA.js → chunk-NZX3BA62.js} +3 -3
- package/dist/{chunk-N5ZGFYLA.js.map → chunk-NZX3BA62.js.map} +1 -1
- package/dist/{chunk-2TLSEAL2.js → chunk-O4TRDWXJ.js} +3 -3
- package/dist/{chunk-2TLSEAL2.js.map → chunk-O4TRDWXJ.js.map} +1 -1
- package/dist/{chunk-CBI5F4ME.mjs → chunk-OMSSA4NO.mjs} +2 -2
- package/dist/{chunk-YGEEWLGJ.js → chunk-PKKXCX5B.js} +3 -3
- package/dist/{chunk-YGEEWLGJ.js.map → chunk-PKKXCX5B.js.map} +1 -1
- package/dist/{chunk-GYHD6QEA.mjs → chunk-PQGQ3EH5.mjs} +2 -2
- package/dist/{chunk-3LN5GQAC.js → chunk-Q6UIUYNF.js} +6 -8
- package/dist/chunk-Q6UIUYNF.js.map +1 -0
- package/dist/chunk-QLWBGM7H.js +81 -0
- package/dist/chunk-QLWBGM7H.js.map +1 -0
- package/dist/{chunk-IF5GW6ID.js → chunk-QZ5DCDZ2.js} +6 -6
- package/dist/{chunk-IF5GW6ID.js.map → chunk-QZ5DCDZ2.js.map} +1 -1
- package/dist/{chunk-LSUCENYD.mjs → chunk-RBKGHUSR.mjs} +2 -2
- package/dist/{chunk-PIZTI5SJ.js → chunk-RMCZ7C2C.js} +3 -3
- package/dist/{chunk-PIZTI5SJ.js.map → chunk-RMCZ7C2C.js.map} +1 -1
- package/dist/{chunk-LGQNMQOT.mjs → chunk-ROS5XGTQ.mjs} +2 -2
- package/dist/chunk-ROS5XGTQ.mjs.map +1 -0
- package/dist/{chunk-TEUERRDG.mjs → chunk-RV45XVXE.mjs} +2 -2
- package/dist/{chunk-FW6ZI2MC.mjs → chunk-UAFSWXN5.mjs} +2 -2
- package/dist/{chunk-QUGKQYAJ.mjs → chunk-ULVFVLFE.mjs} +4 -6
- package/dist/{chunk-QUGKQYAJ.mjs.map → chunk-ULVFVLFE.mjs.map} +1 -1
- package/dist/{chunk-ANLL2EIX.mjs → chunk-UWCGTH3U.mjs} +2 -2
- package/dist/{chunk-6R2LEEEP.mjs → chunk-UZF2D2GG.mjs} +2 -2
- package/dist/{chunk-62L3PMYE.mjs → chunk-V3OVMHZD.mjs} +2 -2
- package/dist/{chunk-UDITT3N3.mjs → chunk-V6ELDZ2B.mjs} +2 -2
- package/dist/{chunk-G7NUCBD3.js → chunk-VDPV24JJ.js} +3 -3
- package/dist/{chunk-G7NUCBD3.js.map → chunk-VDPV24JJ.js.map} +1 -1
- package/dist/{chunk-IJQOTS5O.mjs → chunk-VJUS3GC4.mjs} +2 -2
- package/dist/{chunk-ZUPP7R2K.js → chunk-W7BBVDBI.js} +17 -3
- package/dist/chunk-W7BBVDBI.js.map +1 -0
- package/dist/{chunk-EHQDQ5RV.js → chunk-XARMPXRN.js} +10 -12
- package/dist/chunk-XARMPXRN.js.map +1 -0
- package/dist/{chunk-MQEAEU6G.mjs → chunk-XGMRYNER.mjs} +2 -2
- package/dist/{chunk-MMQMVVD6.mjs → chunk-XLTD5J74.mjs} +3 -3
- package/dist/{chunk-L3ST5GUJ.js → chunk-XQUK7R7L.js} +17 -17
- package/dist/{chunk-L3ST5GUJ.js.map → chunk-XQUK7R7L.js.map} +1 -1
- package/dist/{chunk-OMBUOOMD.mjs → chunk-XYT542WD.mjs} +2 -2
- package/dist/{chunk-IZNABVXE.js → chunk-Y4IGIWP4.js} +3 -3
- package/dist/{chunk-IZNABVXE.js.map → chunk-Y4IGIWP4.js.map} +1 -1
- package/dist/{chunk-COWOGT7U.mjs → chunk-YZWFDSTC.mjs} +2 -2
- package/dist/{chunk-M2FN7CNS.mjs → chunk-Z4L2DWMX.mjs} +17 -3
- package/dist/chunk-Z4L2DWMX.mjs.map +1 -0
- package/dist/chunk-Z75J66LL.mjs +149 -0
- package/dist/chunk-Z75J66LL.mjs.map +1 -0
- package/dist/{chunk-CWIJ7RXR.js → chunk-ZHUFICW3.js} +3 -3
- package/dist/{chunk-CWIJ7RXR.js.map → chunk-ZHUFICW3.js.map} +1 -1
- package/dist/{chunk-Q5XGBTOY.js → chunk-ZNITTMV5.js} +3 -3
- package/dist/{chunk-Q5XGBTOY.js.map → chunk-ZNITTMV5.js.map} +1 -1
- package/dist/components/EnemMoment/HeaderFilters.d.ts +12 -1
- package/dist/components/EnemMoment/HeaderFilters.d.ts.map +1 -1
- package/dist/components/EnemMoment/types.d.ts +10 -1
- package/dist/components/EnemMoment/types.d.ts.map +1 -1
- package/dist/hooks/useAppContent/index.js +48 -49
- package/dist/hooks/useAppContent/index.js.map +1 -1
- package/dist/hooks/useAppContent/index.mjs +47 -48
- package/dist/hooks/useResizableColumns.d.ts +20 -9
- package/dist/hooks/useResizableColumns.d.ts.map +1 -1
- package/dist/hooks/useScreen/index.js +2 -2
- package/dist/hooks/useScreen/index.mjs +1 -1
- package/dist/index.js +48 -49
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +47 -48
- package/dist/store/layoutPreferencesStore.d.ts +12 -24
- package/dist/store/layoutPreferencesStore.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/RichEditorCore-62NIM7PC.js.map +0 -1
- package/dist/chunk-2EDRPEYL.mjs +0 -157
- package/dist/chunk-2EDRPEYL.mjs.map +0 -1
- package/dist/chunk-2VODGC76.js.map +0 -1
- package/dist/chunk-3LN5GQAC.js.map +0 -1
- package/dist/chunk-BVUPM6EY.js.map +0 -1
- package/dist/chunk-CH6BWMSQ.js +0 -17
- package/dist/chunk-CH6BWMSQ.js.map +0 -1
- package/dist/chunk-DDFIRQI5.mjs.map +0 -1
- package/dist/chunk-EHQDQ5RV.js.map +0 -1
- package/dist/chunk-G4NK66PM.js.map +0 -1
- package/dist/chunk-HIIOADV4.js.map +0 -1
- package/dist/chunk-JSH3BQZ7.mjs +0 -17
- package/dist/chunk-JSH3BQZ7.mjs.map +0 -1
- package/dist/chunk-LGQNMQOT.mjs.map +0 -1
- package/dist/chunk-LMDAF6LA.mjs +0 -51
- package/dist/chunk-LMDAF6LA.mjs.map +0 -1
- package/dist/chunk-M2FN7CNS.mjs.map +0 -1
- package/dist/chunk-MUCV5ZWZ.mjs.map +0 -1
- package/dist/chunk-PJOBOBNJ.js +0 -51
- package/dist/chunk-PJOBOBNJ.js.map +0 -1
- package/dist/chunk-PP7SEERV.mjs.map +0 -1
- package/dist/chunk-SB5YGKXR.js.map +0 -1
- package/dist/chunk-WMDSGVZ7.mjs.map +0 -1
- package/dist/chunk-YQKAASWM.js.map +0 -1
- package/dist/chunk-ZUPP7R2K.js.map +0 -1
- /package/dist/{chunk-EVBQNVQW.mjs.map → chunk-233FSBU7.mjs.map} +0 -0
- /package/dist/{chunk-MADPP2PW.mjs.map → chunk-3ZSI2KI5.mjs.map} +0 -0
- /package/dist/{chunk-2W7PTFXS.mjs.map → chunk-42XKJV56.mjs.map} +0 -0
- /package/dist/{chunk-M6TC6XRQ.mjs.map → chunk-55ESXRRM.mjs.map} +0 -0
- /package/dist/{chunk-4MURAKPC.mjs.map → chunk-5DJVOLVX.mjs.map} +0 -0
- /package/dist/{chunk-YVT7CT3G.mjs.map → chunk-5P6CBDZ6.mjs.map} +0 -0
- /package/dist/{chunk-SFEU7BMY.mjs.map → chunk-5SFNRXZB.mjs.map} +0 -0
- /package/dist/{chunk-KYY4U5SN.mjs.map → chunk-6Z5W5J44.mjs.map} +0 -0
- /package/dist/{chunk-GVYGPJH3.mjs.map → chunk-AU5M2766.mjs.map} +0 -0
- /package/dist/{chunk-Z6UN4ZPW.mjs.map → chunk-BVHVYC7Q.mjs.map} +0 -0
- /package/dist/{chunk-J5VEAJN5.mjs.map → chunk-CWVUGZNK.mjs.map} +0 -0
- /package/dist/{chunk-BCMDP6GK.mjs.map → chunk-DV3N2K3Y.mjs.map} +0 -0
- /package/dist/{chunk-EXHGEJ4P.mjs.map → chunk-GKARHTZ2.mjs.map} +0 -0
- /package/dist/{chunk-JCFN6KRS.mjs.map → chunk-HGWDB73S.mjs.map} +0 -0
- /package/dist/{chunk-JXXMO7PY.mjs.map → chunk-HN5RW4C3.mjs.map} +0 -0
- /package/dist/{chunk-I2A4EQPH.mjs.map → chunk-HQ2GXFK5.mjs.map} +0 -0
- /package/dist/{chunk-TBJLNIOY.mjs.map → chunk-JBLYYTHN.mjs.map} +0 -0
- /package/dist/{chunk-GRSN76BV.mjs.map → chunk-KH2R4STU.mjs.map} +0 -0
- /package/dist/{chunk-ZF5NMQJZ.mjs.map → chunk-KUKLN3CK.mjs.map} +0 -0
- /package/dist/{chunk-UAKRBNW2.mjs.map → chunk-L4T76OKM.mjs.map} +0 -0
- /package/dist/{chunk-PY5WCBKN.mjs.map → chunk-MERKXOSI.mjs.map} +0 -0
- /package/dist/{chunk-APCB5HWT.mjs.map → chunk-NLSDZJRR.mjs.map} +0 -0
- /package/dist/{chunk-EWYIXCNF.mjs.map → chunk-NLUTNCLH.mjs.map} +0 -0
- /package/dist/{chunk-OP4Q2KDS.mjs.map → chunk-NMKKMY5P.mjs.map} +0 -0
- /package/dist/{chunk-WDPFO4II.mjs.map → chunk-NMPK336K.mjs.map} +0 -0
- /package/dist/{chunk-X6BZ5IEV.mjs.map → chunk-NU7O6YKR.mjs.map} +0 -0
- /package/dist/{chunk-CBI5F4ME.mjs.map → chunk-OMSSA4NO.mjs.map} +0 -0
- /package/dist/{chunk-GYHD6QEA.mjs.map → chunk-PQGQ3EH5.mjs.map} +0 -0
- /package/dist/{chunk-LSUCENYD.mjs.map → chunk-RBKGHUSR.mjs.map} +0 -0
- /package/dist/{chunk-TEUERRDG.mjs.map → chunk-RV45XVXE.mjs.map} +0 -0
- /package/dist/{chunk-FW6ZI2MC.mjs.map → chunk-UAFSWXN5.mjs.map} +0 -0
- /package/dist/{chunk-ANLL2EIX.mjs.map → chunk-UWCGTH3U.mjs.map} +0 -0
- /package/dist/{chunk-6R2LEEEP.mjs.map → chunk-UZF2D2GG.mjs.map} +0 -0
- /package/dist/{chunk-62L3PMYE.mjs.map → chunk-V3OVMHZD.mjs.map} +0 -0
- /package/dist/{chunk-UDITT3N3.mjs.map → chunk-V6ELDZ2B.mjs.map} +0 -0
- /package/dist/{chunk-IJQOTS5O.mjs.map → chunk-VJUS3GC4.mjs.map} +0 -0
- /package/dist/{chunk-MQEAEU6G.mjs.map → chunk-XGMRYNER.mjs.map} +0 -0
- /package/dist/{chunk-MMQMVVD6.mjs.map → chunk-XLTD5J74.mjs.map} +0 -0
- /package/dist/{chunk-OMBUOOMD.mjs.map → chunk-XYT542WD.mjs.map} +0 -0
- /package/dist/{chunk-COWOGT7U.mjs.map → chunk-YZWFDSTC.mjs.map} +0 -0
package/dist/chunk-LMDAF6LA.mjs
DELETED
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
Text_default
|
|
3
|
-
} from "./chunk-IMCIR6TJ.mjs";
|
|
4
|
-
import {
|
|
5
|
-
cn
|
|
6
|
-
} from "./chunk-53ICLDGS.mjs";
|
|
7
|
-
import {
|
|
8
|
-
formatTimeSpent
|
|
9
|
-
} from "./chunk-WKILJIST.mjs";
|
|
10
|
-
import {
|
|
11
|
-
useQuizStore
|
|
12
|
-
} from "./chunk-MOSP7FR5.mjs";
|
|
13
|
-
|
|
14
|
-
// src/components/QuizTimer/QuizTimer.tsx
|
|
15
|
-
import { ClockIcon } from "@phosphor-icons/react/dist/csr/Clock";
|
|
16
|
-
import { forwardRef } from "react";
|
|
17
|
-
import { jsx, jsxs } from "react/jsx-runtime";
|
|
18
|
-
var QuizTimer = forwardRef(
|
|
19
|
-
({ className, ...props }, ref) => {
|
|
20
|
-
const { timeElapsed, isTimeExceeded } = useQuizStore();
|
|
21
|
-
const exceeded = isTimeExceeded();
|
|
22
|
-
const formatted = formatTimeSpent(timeElapsed);
|
|
23
|
-
return /* @__PURE__ */ jsxs(
|
|
24
|
-
"div",
|
|
25
|
-
{
|
|
26
|
-
ref,
|
|
27
|
-
role: "timer",
|
|
28
|
-
"aria-live": "off",
|
|
29
|
-
"aria-label": `Tempo de prova: ${formatted}${exceeded ? " \u2014 tempo excedido" : ""}`,
|
|
30
|
-
className: cn(
|
|
31
|
-
"inline-flex flex-row items-center gap-1 tabular-nums",
|
|
32
|
-
"rounded-md border px-2 py-1",
|
|
33
|
-
exceeded ? "bg-error-background border-error-300 text-error-700" : "bg-info border-info-300 text-info-800",
|
|
34
|
-
className
|
|
35
|
-
),
|
|
36
|
-
...props,
|
|
37
|
-
children: [
|
|
38
|
-
/* @__PURE__ */ jsx(ClockIcon, { size: 16, weight: exceeded ? "fill" : "regular" }),
|
|
39
|
-
/* @__PURE__ */ jsx(Text_default, { as: "span", size: "sm", weight: "medium", color: "", children: formatted })
|
|
40
|
-
]
|
|
41
|
-
}
|
|
42
|
-
);
|
|
43
|
-
}
|
|
44
|
-
);
|
|
45
|
-
QuizTimer.displayName = "QuizTimer";
|
|
46
|
-
var QuizTimer_default = QuizTimer;
|
|
47
|
-
|
|
48
|
-
export {
|
|
49
|
-
QuizTimer_default
|
|
50
|
-
};
|
|
51
|
-
//# sourceMappingURL=chunk-LMDAF6LA.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/QuizTimer/QuizTimer.tsx"],"sourcesContent":["import { ClockIcon } from '@phosphor-icons/react/dist/csr/Clock';\nimport { forwardRef } from 'react';\nimport { useQuizStore } from '../Quiz/useQuizStore';\nimport { formatTimeSpent } from '../../utils/activityDetailsUtils';\nimport { cn } from '../../utils/utils';\nimport Text from '../Text/Text';\n\nexport interface QuizTimerProps {\n className?: string;\n}\n\n/**\n * Progressive exam stopwatch, driven entirely by the quiz store.\n *\n * Presentational only: the counting, the pausing and the resume seed all live\n * in `useQuizStore`. Once the configured warning threshold is passed the\n * display turns red and keeps going — going over time is reported, never\n * enforced.\n */\nconst QuizTimer = forwardRef<HTMLDivElement, QuizTimerProps>(\n ({ className, ...props }, ref) => {\n const { timeElapsed, isTimeExceeded } = useQuizStore();\n const exceeded = isTimeExceeded();\n const formatted = formatTimeSpent(timeElapsed);\n\n return (\n <div\n ref={ref}\n role=\"timer\"\n aria-live=\"off\"\n aria-label={`Tempo de prova: ${formatted}${exceeded ? ' — tempo excedido' : ''}`}\n className={cn(\n 'inline-flex flex-row items-center gap-1 tabular-nums',\n 'rounded-md border px-2 py-1',\n exceeded\n ? 'bg-error-background border-error-300 text-error-700'\n : 'bg-info border-info-300 text-info-800',\n className\n )}\n {...props}\n >\n <ClockIcon size={16} weight={exceeded ? 'fill' : 'regular'} />\n <Text as=\"span\" size=\"sm\" weight=\"medium\" color=\"\">\n {formatted}\n </Text>\n </div>\n );\n }\n);\n\nQuizTimer.displayName = 'QuizTimer';\n\nexport default QuizTimer;\n"],"mappings":";;;;;;;;;;;;;;AAAA,SAAS,iBAAiB;AAC1B,SAAS,kBAAkB;AAyBrB,SAeE,KAfF;AAPN,IAAM,YAAY;AAAA,EAChB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAAQ;AAChC,UAAM,EAAE,aAAa,eAAe,IAAI,aAAa;AACrD,UAAM,WAAW,eAAe;AAChC,UAAM,YAAY,gBAAgB,WAAW;AAE7C,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,MAAK;AAAA,QACL,aAAU;AAAA,QACV,cAAY,mBAAmB,SAAS,GAAG,WAAW,2BAAsB,EAAE;AAAA,QAC9E,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA,WACI,wDACA;AAAA,UACJ;AAAA,QACF;AAAA,QACC,GAAG;AAAA,QAEJ;AAAA,8BAAC,aAAU,MAAM,IAAI,QAAQ,WAAW,SAAS,WAAW;AAAA,UAC5D,oBAAC,gBAAK,IAAG,QAAO,MAAK,MAAK,QAAO,UAAS,OAAM,IAC7C,qBACH;AAAA;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AAEA,UAAU,cAAc;AAExB,IAAO,oBAAQ;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/hooks/useModalFocus.ts"],"sourcesContent":["import { RefObject, useEffect } from 'react';\n\n/**\n * Elementos que entram no ciclo de Tab dentro do modal. O seletor já descarta\n * os desabilitados e quem tem `tabindex=\"-1\"`.\n */\nconst FOCUSABLE_SELECTOR = [\n 'a[href]',\n 'button:not([disabled])',\n 'input:not([disabled])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])',\n].join(',');\n\nconst getFocusableElements = (container: HTMLElement) =>\n Array.from(\n container.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR)\n ).filter((element) => element.getAttribute('aria-hidden') !== 'true');\n\n/**\n * Tags que não renderizam nada. Marcá-las como inertes não muda\n * comportamento nenhum, só sujaria o DOM de quem for inspecionar.\n */\nconst NON_RENDERED_TAGS = new Set([\n 'SCRIPT',\n 'STYLE',\n 'LINK',\n 'META',\n 'TEMPLATE',\n 'NOSCRIPT',\n 'TITLE',\n 'BASE',\n]);\n\ntype HiddenElement = {\n element: Element;\n previousAriaHidden: string | null;\n};\n\n/**\n * Tira do caminho tudo que não é o modal: sobe do diálogo até o `<body>` e, em\n * cada nível, marca os IRMÃOS do caminho com `inert` + `aria-hidden=\"true\"`.\n * Os ancestrais do diálogo nunca são marcados — fossem, o próprio modal (e o\n * backdrop, que precisa receber clique) iriam junto.\n *\n * `inert` tira do ciclo de Tab, do clique e da árvore de acessibilidade;\n * `aria-hidden` repete a última parte para os leitores de tela que ainda não\n * tratam `inert`. Juntos são o que faz a navegação ficar REALMENTE presa no\n * modal: o trap de Tab daqui só cobre o teclado, enquanto o cursor virtual do\n * VoiceOver (VO + setas) anda pelo DOM inteiro e ignora onde está o foco.\n * `aria-modal=\"true\"` sozinho não dá conta — é justamente o que o VoiceOver\n * costuma deixar passar.\n *\n * O que é montado DEPOIS da abertura não é marcado, de propósito: `Select`,\n * `DropdownMenu` e afins renderizam em portais no `document.body` e precisam\n * continuar utilizáveis dentro do modal (o trap de Tab também sai do caminho\n * nesse caso). Em troca, um portal que já estava aberto quando o modal abriu\n * fica inerte — o esperado, já que ele pertence à página de trás.\n *\n * @returns Função que devolve os atributos exatamente como estavam.\n */\nconst hideOutside = (container: HTMLElement) => {\n const hidden: HiddenElement[] = [];\n\n let node: HTMLElement | null = container;\n\n while (node && node !== document.body) {\n const parent: HTMLElement | null = node.parentElement;\n if (!parent) break;\n\n for (const sibling of Array.from(parent.children)) {\n if (sibling === node) continue;\n if (NON_RENDERED_TAGS.has(sibling.tagName)) continue;\n // Quem JÁ está inert foi marcado pela aplicação (ou por um modal de\n // baixo que ainda não fechou): não é nosso para mexer, e portanto nem\n // para devolver no fechamento.\n if (sibling.hasAttribute('inert')) continue;\n\n hidden.push({\n element: sibling,\n previousAriaHidden: sibling.getAttribute('aria-hidden'),\n });\n\n sibling.setAttribute('inert', '');\n sibling.setAttribute('aria-hidden', 'true');\n }\n\n node = parent;\n }\n\n return () => {\n for (const { element, previousAriaHidden } of hidden) {\n element.removeAttribute('inert');\n\n if (previousAriaHidden === null) {\n element.removeAttribute('aria-hidden');\n } else {\n element.setAttribute('aria-hidden', previousAriaHidden);\n }\n }\n };\n};\n\n/**\n * Pilha dos modais abertos, compartilhada por TODOS os modais da lib (mesma\n * ideia do contador do `useBodyScrollLock`).\n *\n * Só o modal do topo mantém o resto da página inerte. Sem isso, dois modais\n * irmãos abertos ao mesmo tempo marcariam um ao outro — cada um é \"o lado de\n * fora\" do outro — e a página inteira, modais inclusive, ficaria inerte.\n */\nconst openModals: HTMLElement[] = [];\nlet releaseInert: (() => void) | null = null;\n\n/**\n * Desfaz a marcação vigente e reaplica a partir do modal do topo. Chamado nas\n * duas pontas: ao abrir um modal (ele assume) e ao fechar (o de baixo retoma,\n * ou a página volta ao normal quando não sobra nenhum).\n */\nconst applyTopmostInert = () => {\n releaseInert?.();\n releaseInert = null;\n\n const topmost = openModals.at(-1);\n if (topmost) {\n releaseInert = hideOutside(topmost);\n }\n};\n\n/**\n * Dá conta do foco de um modal: leva o foco pra dentro quando ele abre, prende\n * a navegação lá dentro enquanto está aberto e devolve o foco pra quem o abriu\n * quando fecha.\n *\n * Os modais da lib usam `<dialog open>` em vez de `showModal()`, então o\n * navegador NÃO faz nada disso sozinho — não há top layer, e sem isto o leitor\n * de tela continua lendo a página atrás e o Tab escapa pro conteúdo que está\n * visualmente bloqueado pelo backdrop.\n *\n * O foco inicial vai pro próprio container (que precisa de `tabIndex={-1}`), e\n * não pro primeiro botão: como esses modais quase sempre são uma mensagem, cair\n * no \"Fechar modal\" faria o leitor anunciar só o botão e engolir o texto. No\n * container, ele anuncia título + papel de diálogo e o conteúdo fica legível a\n * partir do topo. Um `autoFocus` no conteúdo do modal tem prioridade e não é\n * sobrescrito.\n *\n * A navegação fica presa por duas vias complementares:\n *\n * 1. Tudo que está FORA do modal vira `inert` + `aria-hidden` (ver\n * `hideOutside`). É o que tranca também o cursor virtual do VoiceOver, e o\n * que impede o Tab de recomeçar do topo da página quando o foco cai no\n * `<body>` (um clique no backdrop, por exemplo).\n * 2. O Tab é interceptado nas bordas do ciclo, para fechar o anel em vez de\n * deixar o foco sair pela barra de endereços do navegador. Quando o foco\n * está num portal (Select, DropdownMenu e afins renderizam em\n * `document.body`, fora do container), o hook sai do caminho em vez de\n * arrastar o foco de volta.\n *\n * @param enabled - Liga o gerenciamento. Normalmente `isOpen`.\n * @param containerRef - Ref do elemento do diálogo.\n */\nexport const useModalFocus = (\n enabled: boolean,\n containerRef: RefObject<HTMLElement | null>\n) => {\n useEffect(() => {\n if (!enabled) return;\n\n const container = containerRef.current;\n if (!container) return;\n\n const activeOnOpen = document.activeElement as HTMLElement | null;\n\n // Se o foco JÁ está dentro do modal, quem mandou foi o consumidor (um\n // `autoFocus` num campo, por exemplo) e a escolha dele vale mais que o\n // padrão daqui. Nesse caso não há como saber quem abriu o modal, então\n // também não há o que devolver no fechamento.\n const focusWasOutside = !container.contains(activeOnOpen);\n const previouslyFocused = focusWasOutside ? activeOnOpen : null;\n\n // A ordem destes três passos importa, e cada um depende do anterior:\n //\n // 1. Guardar quem tinha o foco ACIMA, antes de qualquer `inert`. O\n // navegador desfoca na hora um elemento que vira inerte, então depois\n // disso `document.activeElement` já seria o `<body>` e não sobraria pra\n // quem devolver o foco no fechamento.\n // 2. Marcar a página, abaixo — é o que garante que este modal esteja fora\n // de qualquer região inerte. Um modal aberto sobre outro nasce DENTRO do\n // `inert` aplicado pelo de baixo; focá-lo antes desta linha não surtiria\n // efeito nenhum.\n // 3. Só então mover o foco.\n openModals.push(container);\n applyTopmostInert();\n\n if (focusWasOutside) {\n container.focus();\n }\n\n const handleKeyDown = (event: globalThis.KeyboardEvent) => {\n if (event.key !== 'Tab') return;\n\n const active = document.activeElement;\n if (!active || !container.contains(active)) return;\n\n const focusables = getFocusableElements(container);\n\n if (focusables.length === 0) {\n event.preventDefault();\n container.focus();\n return;\n }\n\n const first = focusables[0];\n // O guard de lista vazia acima garante que existe um último elemento;\n // `.at()` só não consegue expressar isso no tipo.\n const last = focusables.at(-1) as HTMLElement;\n\n if (event.shiftKey) {\n // O container entra no ciclo pra que voltar do topo caia no fim, em vez\n // de sair do modal.\n if (active === first || active === container) {\n event.preventDefault();\n last.focus();\n }\n return;\n }\n\n if (active === last) {\n event.preventDefault();\n first.focus();\n }\n };\n\n document.addEventListener('keydown', handleKeyDown, true);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown, true);\n\n // Devolver a página ANTES de devolver o foco: o gatilho que abriu o modal\n // mora lá fora, e `focus()` num elemento ainda inerte não faz nada.\n const index = openModals.indexOf(container);\n if (index !== -1) {\n openModals.splice(index, 1);\n }\n applyTopmostInert();\n\n // Só devolve o foco se quem abriu o modal ainda existe na página.\n if (previouslyFocused?.isConnected) {\n previouslyFocused.focus();\n }\n };\n }, [enabled, containerRef]);\n};\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/Modal/Modal.tsx","../src/components/ReadingFluencyIcons/MicIconReadingFluency.tsx","../src/components/ReadingFluencyIcons/MicOffIconReadingFluency.tsx","../src/components/ReadingFluencyIcons/StopIconReadingFluency.tsx","../src/components/ReadingFluencyIcons/PlayIconReadingFluency.tsx","../src/components/ReadingFluencyIcons/PauseIconReadingFluency.tsx","../src/components/ReadingFluencyIcons/VoiceIconReadingFluency.tsx","../src/components/ReadingFluencyIcons/CloseIconReadingFluency.tsx","../src/components/CloseButtonReadingFluency/CloseButtonReadingFluency.tsx","../src/hooks/useMicrophonePermission.ts","../src/hooks/useBodyScrollLock.ts"],"sourcesContent":["import {\n ReactNode,\n MouseEvent,\n useCallback,\n useEffect,\n useId,\n useRef,\n useState,\n} from 'react';\nimport { XIcon } from '@phosphor-icons/react/dist/csr/X';\nimport {\n MicIconReadingFluency,\n MicOffIconReadingFluency,\n PlayIconReadingFluency,\n PauseIconReadingFluency,\n} from '../ReadingFluencyIcons';\nimport { cn } from '../../utils/utils';\nimport Button, { ButtonReadingFluency } from '../Button/Button';\nimport { CloseButtonReadingFluency } from '../CloseButtonReadingFluency/CloseButtonReadingFluency';\nimport readingFluencyBird from '../../assets/img/readingFluencyBird.png';\nimport { readingFluencyFallback } from '../../assets/fallbacks/readingFluencyFallback';\nimport { useMicrophonePermission } from '../../hooks/useMicrophonePermission';\nimport { useEscapeToClose } from '../../hooks/useEscapeToClose';\nimport { useBodyScrollLock } from '../../hooks/useBodyScrollLock';\nimport { useModalFocus } from '../../hooks/useModalFocus';\nimport {\n isYouTubeUrl,\n getYouTubeVideoId,\n getYouTubeEmbedUrl,\n} from './utils/videoUtils';\nimport Text from '../Text/Text';\n\n/**\n * Lookup table for size classes\n */\nconst SIZE_CLASSES = {\n xs: 'max-w-[360px]',\n sm: 'max-w-[420px]',\n md: 'max-w-[510px]',\n lg: 'max-w-[640px]',\n xl: 'max-w-[970px]',\n} as const;\n\n/**\n * Modal component props interface\n */\ntype ModalProps = {\n contentClassName?: string;\n /** Whether the modal is open */\n isOpen: boolean;\n /** Function to close the modal */\n onClose: () => void;\n /**\n * Modal title. Aceita string OU ReactNode pra permitir elementos inline\n * (ex: botão de voltar + label). Como é renderizado dentro de <h2>,\n * quando ReactNode use APENAS phrasing content (`<span>`, `<button>`,\n * ícones) — nunca `<div>` ou `<p>`.\n */\n title: ReactNode;\n /** Modal description/content */\n children?: ReactNode;\n /** Size of the modal */\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n /** Additional CSS classes for the modal content */\n className?: string;\n /** Whether pressing Escape should close the modal */\n closeOnEscape?: boolean;\n /** Footer content (typically buttons) */\n footer?: ReactNode;\n /** Hide the close button */\n hideCloseButton?: boolean;\n /** Modal variant */\n variant?: 'default' | 'activity';\n /** Description for activity variant */\n description?: string;\n /** Image URL for activity variant */\n image?: string;\n /** Alt text for activity image (leave empty for decorative images) */\n imageAlt?: string;\n /** Action link for activity variant */\n actionLink?: string;\n /** Action button label for activity variant */\n actionLabel?: string;\n /**\n * Called when the action button is clicked, before the link opens.\n *\n * Lets the caller record the click — the notification center uses it to mark a\n * notice as read when the reader follows its \"Ver mais\" link. Optional and\n * side-effect free when omitted: the link still opens either way.\n */\n onActionClick?: () => void;\n};\n\n/**\n * Modal component for Analytica Ensino platforms\n *\n * A flexible modal component with multiple size variants and customizable behavior.\n *\n * @param isOpen - Whether the modal is currently open\n * @param onClose - Callback function called when the modal should be closed\n * @param title - The title displayed at the top of the modal\n * @param children - The main content of the modal\n * @param size - The size variant (xs, sm, md, lg, xl)\n * @param className - Additional CSS classes for the modal content\n * @param closeOnEscape - Whether pressing Escape closes the modal (default: true)\n * @param footer - Footer content, typically action buttons\n * @param hideCloseButton - Whether to hide the X close button (default: false)\n * @returns A modal overlay with content\n *\n * @example\n * ```tsx\n * <Modal\n * isOpen={isModalOpen}\n * onClose={() => setIsModalOpen(false)}\n * title=\"Invite your team\"\n * size=\"md\"\n * footer={\n * <div className=\"flex gap-3\">\n * <Button variant=\"outline\" onClick={() => setIsModalOpen(false)}>Cancel</Button>\n * <Button variant=\"solid\" onClick={handleExplore}>Explore</Button>\n * </div>\n * }\n * >\n * Elevate user interactions with our versatile modals.\n * </Modal>\n * ```\n */\nconst Modal = ({\n isOpen,\n onClose,\n title,\n children,\n size = 'md',\n className = '',\n closeOnEscape = true,\n footer,\n hideCloseButton = false,\n variant = 'default',\n description,\n image,\n imageAlt,\n actionLink,\n actionLabel,\n onActionClick,\n contentClassName = '',\n}: ModalProps) => {\n const titleId = useId();\n const dialogRef = useRef<HTMLDialogElement>(null);\n\n useEscapeToClose(isOpen && closeOnEscape, onClose);\n useBodyScrollLock(isOpen);\n useModalFocus(isOpen, dialogRef);\n\n if (!isOpen) return null;\n\n const sizeClasses = SIZE_CLASSES[size];\n const baseClasses =\n 'bg-secondary-50 rounded-3xl shadow-hard-shadow-2 border border-border-100 w-full mx-4 max-h-[calc(100dvh-2rem)] flex flex-col overflow-hidden';\n // Reset dialog default styles to prevent positioning issues\n const dialogResetClasses = 'p-0 m-0 border-none outline-none static';\n const modalClasses = cn(\n baseClasses,\n sizeClasses,\n dialogResetClasses,\n className\n );\n\n // Normalize URLs missing protocol\n const normalizeUrl = (href: string) =>\n /^https?:\\/\\//i.test(href) ? href : `https://${href}`;\n\n // Handle action link click\n const handleActionClick = () => {\n onActionClick?.();\n if (actionLink) {\n window.open(normalizeUrl(actionLink), '_blank', 'noopener,noreferrer');\n }\n };\n\n // Activity variant rendering\n if (variant === 'activity') {\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-xs border-none p-0 m-0 w-full cursor-default\">\n <dialog\n ref={dialogRef}\n tabIndex={-1}\n className={modalClasses}\n aria-labelledby={titleId}\n aria-modal=\"true\"\n open\n >\n {/* Header simples com XIcon */}\n <div className=\"flex justify-end p-6 pb-0\">\n {!hideCloseButton && (\n <button\n onClick={onClose}\n // Ver a nota sobre `data-print-hide` na montagem default abaixo.\n data-print-hide\n className=\"p-1 text-text-500 hover:text-text-700 hover:bg-background-50 rounded-md transition-colors focus:outline-none focus:ring-2 focus:ring-indicator-info focus:ring-offset-2\"\n aria-label=\"Fechar modal\"\n >\n <XIcon size={18} />\n </button>\n )}\n </div>\n\n {/* Conteúdo centralizado */}\n <div className=\"flex flex-col items-center px-6 pb-6 gap-5 flex-1 min-h-0 overflow-y-auto\">\n {/* Imagem ilustrativa */}\n {image && (\n <div className=\"flex justify-center\">\n <img\n src={image}\n alt={imageAlt ?? ''}\n className=\"w-[122px] h-[122px] object-contain\"\n />\n </div>\n )}\n\n {/* Título */}\n <Text\n id={titleId}\n size=\"lg\"\n className=\"font-semibold text-text-950 text-center\"\n >\n {title}\n </Text>\n\n {/* Descrição */}\n {description && (\n <Text\n size=\"sm\"\n className=\"text-text-400 text-center max-w-md leading-[21px]\"\n >\n {description}\n </Text>\n )}\n\n {/* Ação: Botão ou Vídeo Embedado */}\n {actionLink && (\n <div className=\"w-full\">\n {(() => {\n const normalized = normalizeUrl(actionLink);\n const isYT = isYouTubeUrl(normalized);\n if (!isYT) return null;\n const id = getYouTubeVideoId(normalized);\n if (!id) {\n return (\n <Button\n variant=\"solid\"\n action=\"primary\"\n size=\"large\"\n className=\"w-full\"\n onClick={handleActionClick}\n >\n {actionLabel || 'Iniciar Atividade'}\n </Button>\n );\n }\n return (\n <iframe\n src={getYouTubeEmbedUrl(id)}\n className=\"w-full aspect-video rounded-lg\"\n allowFullScreen\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\n title=\"Vídeo YouTube\"\n />\n );\n })()}\n {!isYouTubeUrl(normalizeUrl(actionLink)) && (\n <Button\n variant=\"solid\"\n action=\"primary\"\n size=\"large\"\n className=\"w-full\"\n onClick={handleActionClick}\n >\n {actionLabel || 'Iniciar Atividade'}\n </Button>\n )}\n </div>\n )}\n </div>\n </dialog>\n </div>\n );\n }\n\n // Default variant rendering\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-xs border-none p-0 m-0 w-full cursor-default\">\n <dialog\n ref={dialogRef}\n tabIndex={-1}\n className={modalClasses}\n aria-labelledby={titleId}\n aria-modal=\"true\"\n open\n >\n {/* Header */}\n <div className=\"flex items-center justify-between px-6 py-6\">\n <h2 id={titleId} className=\"text-lg font-semibold text-text-950\">\n {title}\n </h2>\n {!hideCloseButton && (\n <button\n onClick={onClose}\n /*\n * O X não sai no PDF. Quando este modal é a região de impressão\n * (`js-print-region` + `body.printing-modal`), o print.css revela\n * o <dialog> INTEIRO — o botão mora dentro dele e nada mais o\n * esconderia.\n *\n * Exceção deliberada ao contrato do print.css, que manda pôr\n * `data-print-hide` no CONTAINER e não no botão: aqui o container\n * é o header, e ele carrega o <h2> do título, que É conteúdo do\n * relatório. Marcá-lo apagaria o título junto. A razão do contrato\n * — colapsar o espaçamento do flex — não se aplica: o header usa\n * `justify-between`, sem `gap`, então o título simplesmente ocupa\n * a linha sozinho.\n *\n * Inerte fora de `@media print`, e só surte efeito em quem importa\n * `analytica-frontend-lib/print.css`.\n */\n data-print-hide\n className=\"p-1 text-text-500 hover:text-text-700 hover:bg-background-50 rounded-md transition-colors focus:outline-none focus:ring-2 focus:ring-indicator-info focus:ring-offset-2\"\n aria-label=\"Fechar modal\"\n >\n <XIcon size={18} />\n </button>\n )}\n </div>\n\n {/* Content */}\n {children && (\n <div\n className={cn(\n 'px-6 pb-6 flex-1 min-h-0 overflow-y-auto',\n contentClassName\n )}\n >\n <div\n className={cn(\n 'text-text-500 font-normal text-sm leading-6',\n contentClassName?.includes('flex') &&\n 'flex flex-col flex-1 min-h-0'\n )}\n >\n {children}\n </div>\n </div>\n )}\n\n {/* Footer */}\n {footer && (\n <div className=\"flex justify-end gap-3 px-6 pb-6\">{footer}</div>\n )}\n </dialog>\n </div>\n );\n};\n\nexport default Modal;\n\n// ======================================================================\n// MicPermissionModalReadingFluency — modal Reading Fluency de permissão de microfone\n// ======================================================================\n\ntype MicPermissionModalReadingFluencyProps = {\n /**\n * Controla a abertura (modo controlado). **Se omitido**, o modal entra em modo\n * gerenciado: usa `useMicrophonePermission` e se abre sozinho quando o\n * microfone ainda não foi concedido.\n */\n isOpen?: boolean;\n /** Fecha o modal (X e Esc). No modo gerenciado, apenas dispensa na sessão. */\n onClose?: () => void;\n /**\n * Chamado após o botão \"Habilitar permissões\" (o prompt do navegador já é\n * disparado internamente). Recebe se a permissão foi concedida.\n */\n onEnable?: (granted: boolean) => void;\n /** Ação do link \"Configurar depois\". */\n onConfigureLater?: () => void;\n /** Ação da barra \"Saiba mais sobre como cuidamos dos dados\". */\n onLearnMore?: () => void;\n /** Fecha ao pressionar Esc (default: true). */\n closeOnEscape?: boolean;\n /** Título (default: \"Por que pedimos acesso ao microfone\"). */\n title?: string;\n /** Texto explicativo (default: o texto da arte). */\n description?: ReactNode;\n /**\n * Fonte da imagem do passarinho. Default: o PNG Reading Fluency empacotado na lib.\n * Passe uma URL pelo cliente caso o asset da lib não seja resolvido no bundle.\n */\n imageSrc?: string;\n};\n\n/**\n * Modal Reading Fluency que pede permissão de uso do microfone.\n *\n * Header verde (`secondary-500`) com o passarinho + ícone de microfone e o botão\n * de fechar (`ButtonReadingFluency variant=\"icon\"`); corpo branco com título, texto e as\n * ações (`ButtonReadingFluency` solid \"Habilitar permissões\" + link \"Configurar depois\");\n * barra inferior verde-clara com o link \"Saiba mais...\".\n *\n * Modo **gerenciado** (sem `isOpen`): usa `useMicrophonePermission` — abre\n * sozinho quando o microfone não foi concedido, \"Habilitar permissões\" dispara o\n * prompt do navegador e \"Configurar depois\" apenas dispensa na sessão (como não\n * persiste, ao recarregar a página volta a pedir). Passando `isOpen`, vira\n * controlado (o `onEnable` ainda dispara o prompt do navegador).\n *\n * Observação: os tokens de cor/spacing são uma leitura da arte — ajustar na story.\n */\nconst MicPermissionModalReadingFluency = ({\n isOpen,\n onClose,\n onEnable,\n onConfigureLater,\n onLearnMore,\n closeOnEscape = true,\n title = 'Por que pedimos acesso ao microfone',\n description,\n imageSrc = readingFluencyBird,\n}: MicPermissionModalReadingFluencyProps) => {\n const titleId = useId();\n const dialogRef = useRef<HTMLDialogElement>(null);\n const { shouldAsk, requestPermission } = useMicrophonePermission();\n const [dismissed, setDismissed] = useState(false);\n\n const isControlled = isOpen !== undefined;\n // Gerenciado: abre quando falta permissão e não foi dispensado nesta sessão.\n const open = isControlled ? isOpen : shouldAsk && !dismissed;\n\n const handleClose = useCallback(() => {\n if (isControlled) onClose?.();\n else setDismissed(true);\n }, [isControlled, onClose]);\n\n const handleEnable = async () => {\n // Dispara o prompt nativo do navegador. No modo gerenciado, se conceder, o\n // `shouldAsk` vira false e o modal fecha sozinho.\n const granted = await requestPermission();\n onEnable?.(granted);\n };\n\n const handleConfigureLater = () => {\n if (!isControlled) setDismissed(true);\n onConfigureLater?.();\n };\n\n useEscapeToClose(open && closeOnEscape, handleClose);\n useBodyScrollLock(open);\n useModalFocus(open, dialogRef);\n\n if (!open) return null;\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-xs p-4\">\n <dialog\n ref={dialogRef}\n // `tabIndex={-1}` é requisito do `useModalFocus`: o foco inicial vai\n // pro próprio diálogo, pro leitor anunciar título e texto antes das\n // ações.\n tabIndex={-1}\n open\n aria-labelledby={titleId}\n aria-modal=\"true\"\n className=\"font-quicksand static m-0 w-full max-w-[420px] overflow-hidden rounded-3xl border-none p-0 shadow-hard-shadow-2\"\n >\n {/* Header verde */}\n <div className=\"relative flex items-center justify-center gap-3 bg-secondary-500 px-6 pt-8 pb-10\">\n <span className=\"absolute right-4 top-4\">\n <CloseButtonReadingFluency onClick={handleClose} />\n </span>\n\n <img\n src={imageSrc}\n alt=\"Reading Fluency\"\n className=\"h-14 w-auto select-none\"\n draggable={false}\n />\n\n <span className=\"flex size-14 items-center justify-center rounded-full bg-background\">\n <MicIconReadingFluency size={28} />\n </span>\n </div>\n\n {/* Corpo (padding 24) */}\n <div className=\"flex flex-col items-center gap-4 bg-background p-6 text-center\">\n <Text size=\"lg\" id={titleId} className=\"font-bold text-secondary-900\">\n {title}\n </Text>\n\n <div className=\"flex flex-col gap-3 text-[14px] font-medium text-text-600\">\n {description ?? (\n <>\n <Text size=\"sm\">\n Usamos o microfone para gravar a leitura da criança e avaliar\n sua fluência leitora ao longo do tempo.\n </Text>\n <Text size=\"sm\">\n As gravações ficam armazenadas com segurança e são usadas\n apenas para esse fim.\n </Text>\n </>\n )}\n </div>\n\n <ButtonReadingFluency\n variant=\"solid\"\n size=\"medium\"\n className=\"mt-2\"\n onClick={handleEnable}\n >\n Habilitar permissões\n </ButtonReadingFluency>\n\n <ButtonReadingFluency\n variant=\"link\"\n size=\"medium\"\n onClick={handleConfigureLater}\n >\n Configurar depois\n </ButtonReadingFluency>\n\n {/* Barra \"Saiba mais\": botão arredondado, inset pelo padding do corpo */}\n <Button\n type=\"button\"\n onClick={onLearnMore}\n variant=\"raw\"\n className=\"w-full cursor-pointer rounded-xl bg-secondary-100 px-4 py-4 text-center\"\n >\n <span className=\"text-[14px] font-medium text-secondary-700 underline\">\n Saiba mais sobre como cuidamos dos dados\n </span>\n </Button>\n </div>\n </dialog>\n </div>\n );\n};\nMicPermissionModalReadingFluency.displayName =\n 'MicPermissionModalReadingFluency';\n\nexport { MicPermissionModalReadingFluency };\nexport type { MicPermissionModalReadingFluencyProps };\n\n// ======================================================================\n// MicOffModalReadingFluency — modal Reading Fluency de \"microfone parece desligado\"\n// ======================================================================\n\ntype MicOffModalReadingFluencyProps = {\n /** Se o modal está aberto. */\n isOpen: boolean;\n /** Fecha o modal (X e Esc). */\n onClose: () => void;\n /** Ação do botão \"Tentar ler de novo\". */\n onRetry?: () => void;\n /** Ação do link \"Pedir ajuda a um adulto\". */\n onAskAdult?: () => void;\n /** Fecha ao pressionar Esc (default: true). */\n closeOnEscape?: boolean;\n /** Título (default: \"Parece que o microfone está desligado\"). */\n title?: string;\n};\n\n/**\n * Modal Reading Fluency exibido quando o microfone parece desligado/mudo durante a\n * leitura. Header verde com o ícone de microfone cortado + botão de fechar;\n * corpo branco com o título (uppercase) e as ações \"Tentar ler de novo\"\n * (`ButtonReadingFluency` solid) e \"Pedir ajuda a um adulto\" (`ButtonReadingFluency` link).\n *\n * É um modal controlado (o app decide quando abrir — ex.: ao detectar que não\n * há áudio durante a gravação).\n *\n * Observação: os tokens de cor/spacing são uma leitura da arte — ajustar na story.\n */\nconst MicOffModalReadingFluency = ({\n isOpen,\n onClose,\n onRetry,\n onAskAdult,\n closeOnEscape = true,\n title = 'Parece que o microfone está desligado',\n}: MicOffModalReadingFluencyProps) => {\n const titleId = useId();\n const dialogRef = useRef<HTMLDialogElement>(null);\n\n useEscapeToClose(isOpen && closeOnEscape, onClose);\n useBodyScrollLock(isOpen);\n useModalFocus(isOpen, dialogRef);\n\n if (!isOpen) return null;\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-xs p-4\">\n <dialog\n ref={dialogRef}\n // Ver a nota sobre `tabIndex={-1}` no MicPermissionModalReadingFluency.\n tabIndex={-1}\n open\n aria-labelledby={titleId}\n aria-modal=\"true\"\n className=\"font-quicksand static m-0 w-full max-w-[420px] overflow-hidden rounded-3xl border-none p-0 shadow-hard-shadow-2\"\n >\n {/* Header verde */}\n <div className=\"relative flex items-center justify-center bg-secondary-500 px-6 pt-10 pb-10\">\n <span className=\"absolute right-4 top-4\">\n <CloseButtonReadingFluency onClick={onClose} />\n </span>\n\n <span className=\"flex size-20 items-center justify-center rounded-full bg-background shadow-hard-shadow-2\">\n <MicOffIconReadingFluency size={40} />\n </span>\n </div>\n\n {/* Corpo (padding 24) */}\n <div className=\"flex flex-col items-center gap-4 bg-background p-6 text-center\">\n <Text\n id={titleId}\n size=\"lg\"\n className=\"font-bold uppercase text-secondary-900\"\n >\n {title}\n </Text>\n\n <ButtonReadingFluency\n variant=\"solid\"\n size=\"medium\"\n className=\"mt-2\"\n onClick={onRetry}\n >\n Tentar ler de novo\n </ButtonReadingFluency>\n\n <ButtonReadingFluency\n variant=\"link\"\n size=\"medium\"\n onClick={onAskAdult}\n >\n Pedir ajuda a um adulto\n </ButtonReadingFluency>\n </div>\n </dialog>\n </div>\n );\n};\nMicOffModalReadingFluency.displayName = 'MicOffModalReadingFluency';\n\nexport { MicOffModalReadingFluency };\nexport type { MicOffModalReadingFluencyProps };\n\n// ======================================================================\n// AudioPlaybackModalReadingFluency — modal Reading Fluency para ouvir a gravação\n// ======================================================================\n\ntype AudioPlaybackModalReadingFluencyProps = {\n /** Se o modal está aberto. */\n isOpen: boolean;\n /** Fecha o modal (X e Esc). */\n onClose: () => void;\n /**\n * A gravação a tocar: uma **URL** (string, ex.: blob URL) **ou** um\n * **arquivo/blob** (`File`/`Blob` — ex.: o blob do `AudioRecorderReadingFluency`).\n * Quando é `File`/`Blob`, vira um object URL same-origin internamente\n * (criado/revogado pelo componente).\n */\n src?: string | File | Blob;\n /** Ação do botão \"Pronto!\". */\n onConfirm?: () => void;\n /** Ação do link \"Quero ler de novo\". */\n onRetry?: () => void;\n /** Fecha ao pressionar Esc (default: true). */\n closeOnEscape?: boolean;\n};\n\n// Alturas (px) das barras da waveform — decorativa (não reflete o áudio real).\nconst PAPOLE_WAVEFORM_BARS = [\n 12, 20, 32, 16, 40, 24, 52, 28, 44, 60, 44, 28, 52, 24, 40, 16, 32, 20, 12,\n];\n\nconst formatPlaybackTime = (seconds: number): string => {\n const safe = Number.isFinite(seconds) ? Math.max(0, seconds) : 0;\n const pad = (n: number) => n.toString().padStart(2, '0');\n const h = Math.floor(safe / 3600);\n const m = Math.floor((safe % 3600) / 60);\n const s = Math.floor(safe % 60);\n return `${pad(h)}:${pad(m)}:${pad(s)}`;\n};\n\n/**\n * Modal Reading Fluency para o aluno ouvir a própria gravação. Header verde com uma\n * waveform decorativa e um player simples (play/pause + barra de progresso +\n * tempo) + botão de fechar; corpo branco com \"Pronto!\" (`ButtonReadingFluency` solid) e\n * \"Quero ler de novo\" (`ButtonReadingFluency` link).\n *\n * A gravação entra por `src`, que aceita **URL** (string) **ou** **File/Blob**\n * (ex.: o blob do `AudioRecorderReadingFluency`, convertido em object URL internamente).\n *\n * Controlado: o app decide quando abrir (ex.: após finalizar a gravação).\n *\n * Observação: waveform é decorativa (não analisa o áudio) e os tokens de\n * cor/spacing são uma leitura da arte — ajustar na story.\n */\nconst AudioPlaybackModalReadingFluency = ({\n isOpen,\n onClose,\n src,\n onConfirm,\n onRetry,\n closeOnEscape = true,\n}: AudioPlaybackModalReadingFluencyProps) => {\n const dialogRef = useRef<HTMLDialogElement>(null);\n const audioRef = useRef<HTMLAudioElement>(null);\n const [isPlaying, setIsPlaying] = useState(false);\n const [currentTime, setCurrentTime] = useState(0);\n const [duration, setDuration] = useState(0);\n const [objectUrl, setObjectUrl] = useState<string | undefined>(undefined);\n\n // String → usa direto; File/Blob → usa o object URL criado no efeito abaixo.\n const resolvedSrc = typeof src === 'string' ? src : objectUrl;\n\n useEscapeToClose(isOpen && closeOnEscape, onClose);\n useBodyScrollLock(isOpen);\n useModalFocus(isOpen, dialogRef);\n\n // `src` File/Blob → object URL same-origin (criado/revogado aqui).\n useEffect(() => {\n if (!src || typeof src === 'string') {\n setObjectUrl(undefined);\n return;\n }\n const url = URL.createObjectURL(src);\n setObjectUrl(url);\n return () => URL.revokeObjectURL(url);\n }, [src]);\n\n useEffect(() => {\n // Reseta o player ao fechar (o <audio> desmonta com o modal).\n if (!isOpen) {\n setIsPlaying(false);\n setCurrentTime(0);\n }\n }, [isOpen]);\n\n const togglePlay = () => {\n const audio = audioRef.current;\n if (!audio) return;\n if (isPlaying) {\n audio.pause();\n setIsPlaying(false);\n } else {\n // Só marca como tocando depois que o play() resolve. Se rejeitar\n // (AbortError ao pausar antes de iniciar, fonte inválida, etc.) mantém\n // false pra UI nunca indicar reprodução ativa numa falha.\n audio\n .play()\n ?.then(() => setIsPlaying(true))\n .catch(() => setIsPlaying(false));\n }\n };\n\n const handleSeek = (event: MouseEvent<HTMLButtonElement>) => {\n const audio = audioRef.current;\n if (!audio || !Number.isFinite(duration) || duration <= 0) return;\n const rect = event.currentTarget.getBoundingClientRect();\n const ratio = (event.clientX - rect.left) / rect.width;\n audio.currentTime = Math.min(Math.max(ratio, 0), 1) * duration;\n setCurrentTime(audio.currentTime);\n };\n\n if (!isOpen) return null;\n\n const progress = duration > 0 ? (currentTime / duration) * 100 : 0;\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-xs p-4\">\n <dialog\n ref={dialogRef}\n // Ver a nota sobre `tabIndex={-1}` no MicPermissionModalReadingFluency.\n tabIndex={-1}\n open\n aria-label=\"Ouvir gravação\"\n aria-modal=\"true\"\n className=\"font-quicksand static m-0 w-full max-w-[420px] overflow-hidden rounded-3xl border-none p-0 shadow-hard-shadow-2\"\n >\n {/* Header verde: waveform + player */}\n <div className=\"relative flex flex-col gap-5 bg-secondary-500 px-6 pt-8 pb-6\">\n <span className=\"absolute right-4 top-4\">\n <CloseButtonReadingFluency onClick={onClose} />\n </span>\n\n {/* Waveform (decorativa) */}\n <div\n className=\"flex h-16 items-center justify-center gap-1\"\n aria-hidden=\"true\"\n >\n {PAPOLE_WAVEFORM_BARS.map((height, index) => (\n <span\n key={index}\n style={{ height }}\n className=\"w-1 rounded-full bg-error-400\"\n />\n ))}\n </div>\n\n {/* Player */}\n <div className=\"flex items-center gap-3\">\n <audio\n ref={audioRef}\n src={resolvedSrc}\n preload=\"metadata\"\n onTimeUpdate={() =>\n setCurrentTime(audioRef.current?.currentTime ?? 0)\n }\n onLoadedMetadata={() =>\n setDuration(audioRef.current?.duration ?? 0)\n }\n onEnded={() => {\n setIsPlaying(false);\n setCurrentTime(0);\n }}\n >\n <track kind=\"captions\" />\n </audio>\n\n <Button\n type=\"button\"\n onClick={togglePlay}\n disabled={!resolvedSrc}\n aria-label={isPlaying ? 'Pausar' : 'Reproduzir'}\n variant=\"raw\"\n className=\"flex flex-shrink-0 items-center justify-center disabled:cursor-not-allowed disabled:opacity-40\"\n >\n {isPlaying ? (\n <PauseIconReadingFluency size={36} />\n ) : (\n <PlayIconReadingFluency size={36} />\n )}\n </Button>\n\n <Button\n type=\"button\"\n onClick={handleSeek}\n aria-label=\"Barra de progresso\"\n variant=\"raw\"\n className=\"h-2 flex-1 overflow-hidden rounded-full bg-background\"\n >\n <span\n className=\"block h-full rounded-full bg-primary-500 transition-[width] duration-100\"\n style={{ width: `${progress}%` }}\n />\n </Button>\n\n <span className=\"flex-shrink-0 text-sm font-medium text-primary\">\n {formatPlaybackTime(currentTime)}\n </span>\n </div>\n </div>\n\n {/* Corpo (padding 24) */}\n <div className=\"flex flex-col items-center gap-4 bg-background p-6 text-center\">\n <ButtonReadingFluency\n variant=\"solid\"\n size=\"medium\"\n className=\"w-full\"\n onClick={onConfirm}\n >\n Pronto!\n </ButtonReadingFluency>\n\n <ButtonReadingFluency variant=\"link\" size=\"medium\" onClick={onRetry}>\n Quero ler de novo\n </ButtonReadingFluency>\n </div>\n </dialog>\n </div>\n );\n};\nAudioPlaybackModalReadingFluency.displayName =\n 'AudioPlaybackModalReadingFluency';\n\nexport { AudioPlaybackModalReadingFluency };\nexport type { AudioPlaybackModalReadingFluencyProps };\n\n// ======================================================================\n// SuccessModalReadingFluency — modal Reading Fluency de feedback positivo\n// ======================================================================\n\ntype SuccessModalReadingFluencyProps = {\n /** Se o modal está aberto. */\n isOpen: boolean;\n /** Fecha o modal (X e Esc). */\n onClose: () => void;\n /** Título (ex.: \"Incrível!\"). */\n title?: string;\n /** Frase de reforço (ex.: \"Você leu muito bem!\"). */\n description?: string;\n /** Fecha ao pressionar Esc (default: true). */\n closeOnEscape?: boolean;\n /**\n * Fonte da imagem de comemoração. Default: a imagem de fallback genérica\n * empacotada na lib. Passe uma URL pelo cliente (ex.: a imagem configurada pela\n * instituição via `useReadingFluencyAsset`) para sobrescrever.\n */\n imageSrc?: string;\n};\n\n/**\n * Modal Reading Fluency de comemoração/feedback positivo: card branco com o passarinho,\n * um título grande e uma frase de reforço, e o botão de fechar. Sem header verde\n * e sem ações — o aluno fecha no X (ou Esc). Título/descrição são configuráveis\n * pra reaproveitar em outros feedbacks.\n */\nconst SuccessModalReadingFluency = ({\n isOpen,\n onClose,\n title = 'Incrível!',\n description = 'Você leu muito bem!',\n closeOnEscape = true,\n imageSrc = readingFluencyFallback,\n}: SuccessModalReadingFluencyProps) => {\n const titleId = useId();\n const dialogRef = useRef<HTMLDialogElement>(null);\n\n useEscapeToClose(isOpen && closeOnEscape, onClose);\n useBodyScrollLock(isOpen);\n useModalFocus(isOpen, dialogRef);\n\n if (!isOpen) return null;\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-xs p-4\">\n <dialog\n ref={dialogRef}\n // Ver a nota sobre `tabIndex={-1}` no MicPermissionModalReadingFluency.\n tabIndex={-1}\n open\n aria-labelledby={titleId}\n aria-modal=\"true\"\n className=\"font-quicksand static m-0 w-full max-w-[380px] overflow-hidden rounded-3xl border-none bg-background p-0 shadow-hard-shadow-2\"\n >\n <div className=\"relative flex flex-col items-center gap-4 p-8 text-center\">\n <span className=\"absolute right-4 top-4\">\n <CloseButtonReadingFluency onClick={onClose} />\n </span>\n\n <img\n src={imageSrc}\n alt=\"Reading Fluency\"\n className=\"h-[172px] w-[252px] select-none object-contain\"\n draggable={false}\n />\n\n <div className=\"flex flex-col items-center gap-1\">\n <Text\n id={titleId}\n size=\"3xl\"\n className=\"font-bold uppercase text-secondary-900\"\n >\n {title}\n </Text>\n <Text\n size=\"sm\"\n className=\"font-semibold uppercase tracking-wide text-text-500\"\n >\n {description}\n </Text>\n </div>\n </div>\n </dialog>\n </div>\n );\n};\nSuccessModalReadingFluency.displayName = 'SuccessModalReadingFluency';\n\nexport { SuccessModalReadingFluency };\nexport type { SuccessModalReadingFluencyProps };\n","import type { FC } from 'react';\nimport type { ReadingFluencyIconProps } from './types';\n\n/**\n * Microfone (ligado) — tema Reading Fluency. Cor marrom `#604903` (fixa da arte).\n * `aria-hidden` por ser decorativo; quem usa em botão deve prover o rótulo.\n */\nexport const MicIconReadingFluency: FC<ReadingFluencyIconProps> = ({\n size = 24,\n className,\n}) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n className={className}\n aria-hidden=\"true\"\n >\n <path\n d=\"M19.0899 9.64246C19.2722 9.12736 19.8996 8.87431 20.3966 9.09265C21.0667 9.38732 21.0012 10.0389 20.9688 10.6317C20.902 11.8547 20.6668 12.9383 20.1905 14.0663C19.8435 14.8412 19.4182 15.5484 18.8468 16.1815C17.3308 17.8298 15.2311 18.8217 12.9952 18.9471L13.0011 20.2665C13.0021 20.5743 13.0211 20.8906 12.9669 21.1962C12.9158 21.6151 12.4185 22.0384 11.9796 21.996C10.9121 21.8926 11.0195 20.9985 11.0206 20.3046L11.0235 18.955C6.82821 18.5619 3.81573 15.9926 3.14951 11.745C3.07466 11.2676 2.95457 10.2389 3.04502 9.78601C3.07111 9.6531 3.12649 9.52768 3.20713 9.41883C3.38516 9.17631 3.6094 9.06793 3.89658 9.02136C4.04493 9.0039 4.19567 9.02105 4.33603 9.07215C4.61331 9.16908 4.83184 9.38643 4.93076 9.66297C5.03905 9.96346 4.99607 10.5347 5.03037 10.8768C5.15593 12.1285 5.5318 13.3453 6.254 14.3856C8.21912 17.2126 12.5465 17.6029 15.505 16.2762C17.7033 15.2904 18.876 12.9902 18.9737 10.66C19.0011 10.3277 18.9782 9.95865 19.0899 9.64246ZM11.6446 2.02136C13.3014 1.8719 15.0753 2.55335 16.0636 3.90711C17.3039 5.60658 16.9297 7.57787 16.9933 9.51258C17.094 12.5795 15.5804 14.6964 12.4269 14.9735C11.0254 15.0315 9.70841 14.768 8.61631 13.829C7.65801 13.0048 7.11544 11.7587 7.04014 10.5096C6.99793 9.80921 7.02898 9.06921 7.02061 8.36316C6.99942 6.57705 6.92635 5.08207 8.18369 3.62488C9.06989 2.59789 10.3004 2.10617 11.6446 2.02136Z\"\n fill=\"#604903\"\n />\n </svg>\n);\nMicIconReadingFluency.displayName = 'MicIconReadingFluency';\n","import type { FC } from 'react';\nimport type { ReadingFluencyIconProps } from './types';\n\n/**\n * Microfone desligado — tema Reading Fluency. Cor marrom `#604903` (fixa da arte).\n * `aria-hidden` por ser decorativo; quem usa em botão deve prover o rótulo.\n */\nexport const MicOffIconReadingFluency: FC<ReadingFluencyIconProps> = ({\n size = 24,\n className,\n}) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n className={className}\n aria-hidden=\"true\"\n >\n <path\n d=\"M2.92138 2.00096C3.51243 1.97398 3.79735 2.38941 4.18114 2.77342L5.24071 3.83787L6.43603 5.03221C6.65214 5.24803 6.95078 5.53088 7.14013 5.75877C7.41612 4.73636 7.69377 4.07412 8.47899 3.31639C10.3488 1.51221 13.8942 1.57682 15.686 3.45994C16.928 4.74071 17.0078 6.30724 16.9936 7.9658C16.9725 10.4436 17.2409 12.039 15.2905 13.9053C15.4504 14.0281 15.7475 14.3379 15.897 14.4892C16.2051 14.7986 16.5109 15.1115 16.813 15.4267C18.1001 14.1651 18.7625 12.8312 18.9448 11.0283C19.0123 10.3609 18.8665 9.42655 19.5864 9.09959C19.8254 8.99225 20.0977 8.98518 20.3423 9.07908C20.5949 9.17395 20.7975 9.3682 20.9038 9.61619C21.022 9.89823 20.9779 10.3016 20.9614 10.6054C20.8956 11.8206 20.6659 12.8698 20.2183 13.999C19.8981 14.6879 19.5623 15.3325 19.0698 15.9189C18.8077 16.231 18.5097 16.5316 18.2339 16.8369C18.4118 16.9867 18.6925 17.2869 18.8696 17.4648L20.06 18.6582L21.1362 19.7285C21.6674 20.2521 22.3111 20.706 21.8325 21.541C21.6184 21.9356 20.8757 22.1607 20.5151 21.8642C19.9124 21.3681 19.3263 20.7287 18.7759 20.1748L15.3921 16.792L7.33251 8.7324L4.19774 5.59861C3.58409 4.98783 2.96253 4.37668 2.35497 3.75975C2.18785 3.59003 2.05404 3.38354 2.01317 3.14451C1.9702 2.89156 2.0312 2.63133 2.18212 2.42381C2.37884 2.15194 2.60825 2.05338 2.92138 2.00096ZM4.17724 9.09861C4.35579 9.08613 4.56672 9.14867 4.72313 9.2324C5.3088 9.54598 5.20095 10.4279 5.24853 11.0058C5.29609 11.546 5.39785 12.08 5.55224 12.5986C6.34419 15.2155 8.29261 16.6266 10.8843 16.9746C11.3668 17.0394 12.0198 16.9345 12.4526 17.1758C12.6687 17.2964 12.8225 17.4863 12.8872 17.7304C12.9826 18.0903 12.9844 20.6384 12.938 21.0605C12.9203 21.2214 12.8826 21.3792 12.8032 21.5205C12.6402 21.8103 12.3689 21.9179 12.0708 21.998C11.8022 22.0146 11.5208 21.9284 11.3276 21.7314C11.1975 21.5978 11.1064 21.4285 11.0659 21.2441C11.0016 20.9629 11.0318 19.3686 11.0308 18.9804C9.4007 18.7722 8.13113 18.4599 6.73388 17.4775C4.4657 15.8888 3.33397 13.1768 3.29052 10.415C3.27955 9.71664 3.39629 9.22846 4.17724 9.09861Z\"\n fill=\"#604903\"\n />\n </svg>\n);\nMicOffIconReadingFluency.displayName = 'MicOffIconReadingFluency';\n","import type { FC } from 'react';\nimport type { ReadingFluencyIconProps } from './types';\n\n/**\n * Parar (quadrado arredondado) — tema Reading Fluency. Cor marrom `#604903` (fixa da\n * arte). `aria-hidden` por ser decorativo; quem usa em botão deve prover o rótulo.\n */\nexport const StopIconReadingFluency: FC<ReadingFluencyIconProps> = ({\n size = 24,\n className,\n}) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n className={className}\n aria-hidden=\"true\"\n >\n <path\n d=\"M9.19373 3.02192C9.23924 3.01968 9.28477 3.01795 9.3303 3.01669C10.3859 2.98615 11.5022 3.00736 12.5695 3.00486C14.1845 3.02035 15.7972 2.94773 17.3862 3.2905C20.5781 3.97907 20.9146 6.66832 20.9808 9.41075C20.9978 10.5335 21.003 11.6565 20.996 12.7793C20.9942 14.8218 21.144 17.7223 19.7633 19.3629C18.5786 20.7708 16.5405 20.9308 14.8126 20.9714C13.7196 21.0046 12.4391 21.0064 11.3323 20.9895C9.21141 20.9573 6.22451 21.2041 4.55526 19.6974C3.28925 18.5546 3.06985 16.632 3.02355 15.0153C2.99244 13.9292 2.99703 12.6416 3.00958 11.5439C3.03437 9.37514 2.76331 6.22534 4.32955 4.52291C5.55279 3.19327 7.51307 3.08323 9.19373 3.02192Z\"\n fill=\"#604903\"\n />\n </svg>\n);\nStopIconReadingFluency.displayName = 'StopIconReadingFluency';\n","import type { FC } from 'react';\nimport type { ReadingFluencyIconProps } from './types';\n\n/**\n * Reproduzir (triângulo dourado com contorno creme) — tema Reading Fluency. Cores fixas\n * da arte (`#F9CB3B` + `#FDEFC4`). `aria-hidden`; quem usa em botão dá o rótulo.\n */\nexport const PlayIconReadingFluency: FC<ReadingFluencyIconProps> = ({\n size = 30,\n className,\n}) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0.5 0.5 29 29\"\n fill=\"none\"\n className={className}\n aria-hidden=\"true\"\n >\n <path\n d=\"M9.69336 3.00977C10.4688 2.9555 11.2352 3.14459 11.7656 3.30371C12.3241 3.47126 12.8823 3.69117 13.2188 3.81738L13.2266 3.81934L13.2334 3.82227C16.6576 5.1362 19.8422 7.04365 22.6582 9.45996L23.2168 9.94922L23.2227 9.95508C23.672 10.3617 24.7284 11.2995 25.2793 12.2227L25.2871 12.2354L25.2939 12.2471C26.0279 13.5184 26.1156 14.9454 25.8896 16.1572L25.8408 16.3965C25.4502 18.1299 24.2837 19.1044 23.6602 19.6924C22.0107 21.2479 20.2264 22.4993 18.4365 23.6328L18.4248 23.6406C16.5421 24.8144 14.5418 25.7695 12.46 26.4893L12.4512 26.4932L12.4414 26.4961C12.05 26.6272 11.243 26.9066 10.4883 26.9756L10.4893 26.9766C10.4871 26.9768 10.4846 26.9764 10.4824 26.9766C10.4811 26.9767 10.4798 26.9774 10.4785 26.9775L10.4775 26.9766C9.01305 27.1114 7.57551 26.6212 6.48535 25.6455L6.48145 25.6416C6.03578 25.2405 5.5503 24.6967 5.20605 24.0059C4.77418 23.1392 4.5478 21.9412 4.41113 21.0146C4.26294 20.0099 4.17714 18.9939 4.12598 18.332L4.12695 18.3311C3.87395 15.2113 4.00141 12.0703 4.50684 8.98438L4.50781 8.97559C4.58505 8.51619 4.69474 7.82631 4.87891 7.15918C5.05634 6.51655 5.3614 5.66072 5.96387 4.95801C6.91568 3.8481 8.10898 3.14206 9.66699 3.01172L9.67969 3.01074L9.69336 3.00977Z\"\n fill=\"#F9CB3B\"\n stroke=\"#FDEFC4\"\n strokeWidth={4}\n strokeLinejoin=\"round\"\n strokeLinecap=\"round\"\n />\n </svg>\n);\nPlayIconReadingFluency.displayName = 'PlayIconReadingFluency';\n","import { useId, type FC } from 'react';\nimport type { ReadingFluencyIconProps } from './types';\n\n/**\n * Pausar (duas barras douradas com contorno creme) — tema Reading Fluency. Cores fixas da\n * arte (`#F9CB3B` + `#FDEFC4`). O contorno usa um `mask` com id único (via\n * `useId`) pra não colidir entre instâncias. `aria-hidden`; rótulo vem de quem usa.\n */\nexport const PauseIconReadingFluency: FC<ReadingFluencyIconProps> = ({\n size = 30,\n className,\n}) => {\n // id único (sem \":\") pra o `mask` não colidir entre instâncias.\n const maskId = `reading-fluency-pause-mask-${useId().replaceAll(':', '')}`;\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0.5 0.5 29 29\"\n fill=\"none\"\n className={className}\n aria-hidden=\"true\"\n >\n <mask\n id={maskId}\n maskUnits=\"userSpaceOnUse\"\n x=\"0\"\n y=\"0\"\n width=\"30\"\n height=\"30\"\n fill=\"black\"\n >\n <rect fill=\"white\" x=\"0\" y=\"0\" width=\"30\" height=\"30\" />\n <path d=\"M8.35951 5.00949C10.6501 4.92814 12.3849 5.36738 12.9894 8.00754C13.2835 9.29259 13.3368 10.3731 13.4113 11.6814C13.5344 13.9646 13.5298 16.2541 13.3986 18.5368C13.3042 20.1586 13.2249 22.3488 12.2462 23.6999C11.5928 24.6021 10.6951 24.8378 9.67397 24.9607L9.52846 24.9695C8.38167 25.0352 6.67349 25.0771 5.79701 24.1872C4.54564 22.9165 4.64406 20.6255 4.56361 18.9236C4.53395 18.2957 4.52973 17.6529 4.51967 17.0271C4.48697 15.2495 4.49579 13.4711 4.54701 11.6941C4.59757 9.94732 4.49372 7.37338 5.64467 5.96848C6.31209 5.15389 7.40284 5.06041 8.35951 5.00949ZM21.1007 5.0007C22.1707 4.98962 23.5125 5.03762 24.2951 5.88742C25.4067 7.09483 25.3923 9.49503 25.4406 11.0954C25.4652 11.9549 25.4827 12.8147 25.4943 13.6745C25.5093 15.3472 25.4933 17.0201 25.4464 18.6921C25.4358 19.0755 25.4267 19.4585 25.4083 19.8464C25.3317 21.464 25.2498 23.707 23.7111 24.57C22.9844 24.9773 21.9663 24.9964 21.1583 24.9997C17.4651 25.012 16.8859 22.9575 16.6652 19.5163L16.5587 17.6726C16.4634 15.5104 16.4845 13.3439 16.6222 11.1843C16.7381 9.26399 16.7736 6.61625 18.5665 5.54758C19.2935 5.11439 20.0571 5.05304 20.8693 5.00754C20.9463 5.0036 21.0236 5.00123 21.1007 5.0007Z\" />\n </mask>\n <path\n d=\"M8.35951 5.00949C10.6501 4.92814 12.3849 5.36738 12.9894 8.00754C13.2835 9.29259 13.3368 10.3731 13.4113 11.6814C13.5344 13.9646 13.5298 16.2541 13.3986 18.5368C13.3042 20.1586 13.2249 22.3488 12.2462 23.6999C11.5928 24.6021 10.6951 24.8378 9.67397 24.9607L9.52846 24.9695C8.38167 25.0352 6.67349 25.0771 5.79701 24.1872C4.54564 22.9165 4.64406 20.6255 4.56361 18.9236C4.53395 18.2957 4.52973 17.6529 4.51967 17.0271C4.48697 15.2495 4.49579 13.4711 4.54701 11.6941C4.59757 9.94732 4.49372 7.37338 5.64467 5.96848C6.31209 5.15389 7.40284 5.06041 8.35951 5.00949ZM21.1007 5.0007C22.1707 4.98962 23.5125 5.03762 24.2951 5.88742C25.4067 7.09483 25.3923 9.49503 25.4406 11.0954C25.4652 11.9549 25.4827 12.8147 25.4943 13.6745C25.5093 15.3472 25.4933 17.0201 25.4464 18.6921C25.4358 19.0755 25.4267 19.4585 25.4083 19.8464C25.3317 21.464 25.2498 23.707 23.7111 24.57C22.9844 24.9773 21.9663 24.9964 21.1583 24.9997C17.4651 25.012 16.8859 22.9575 16.6652 19.5163L16.5587 17.6726C16.4634 15.5104 16.4845 13.3439 16.6222 11.1843C16.7381 9.26399 16.7736 6.61625 18.5665 5.54758C19.2935 5.11439 20.0571 5.05304 20.8693 5.00754C20.9463 5.0036 21.0236 5.00123 21.1007 5.0007Z\"\n fill=\"#F9CB3B\"\n />\n <path\n d=\"M8.35951 5.00949L8.21753 1.01201L8.18221 1.01327L8.14692 1.01514L8.35951 5.00949ZM12.9894 8.00754L16.8885 7.11501L16.8885 7.11478L12.9894 8.00754ZM13.4113 11.6814L17.4055 11.4659L17.4048 11.4542L13.4113 11.6814ZM13.3986 18.5368L17.3918 18.7693L17.392 18.7665L13.3986 18.5368ZM12.2462 23.6999L9.00678 21.3534L9.00675 21.3535L12.2462 23.6999ZM9.67397 24.9607L9.91514 28.9534L10.0338 28.9462L10.1519 28.932L9.67397 24.9607ZM9.52846 24.9695L9.75736 28.9629L9.76963 28.9622L9.52846 24.9695ZM5.79701 24.1872L2.94698 26.9939L2.94725 26.9942L5.79701 24.1872ZM4.56361 18.9236L0.568071 19.1123L0.568074 19.1124L4.56361 18.9236ZM4.51967 17.0271L8.51916 16.9628L8.51899 16.9535L4.51967 17.0271ZM4.54701 11.6941L0.548687 11.5783L0.548673 11.5788L4.54701 11.6941ZM5.64467 5.96848L2.55059 3.43339L2.55043 3.43358L5.64467 5.96848ZM21.1007 5.0007L21.1283 9.00063L21.1422 9.00049L21.1007 5.0007ZM24.2951 5.88742L27.2377 3.17806L27.2374 3.17775L24.2951 5.88742ZM25.4406 11.0954L29.4389 10.9808L29.4387 10.9748L25.4406 11.0954ZM25.4943 13.6745L29.4941 13.6385L29.494 13.6297L29.4939 13.6208L25.4943 13.6745ZM25.4464 18.6921L21.448 18.58L21.448 18.5811L25.4464 18.6921ZM25.4083 19.8464L29.4039 20.0357L29.4039 20.0356L25.4083 19.8464ZM23.7111 24.57L25.6668 28.0593L25.6678 28.0588L23.7111 24.57ZM21.1583 24.9997L21.1716 28.9997L21.175 28.9997L21.1583 24.9997ZM16.6652 19.5163L12.6718 19.7469L12.6726 19.7596L12.6734 19.7724L16.6652 19.5163ZM16.5587 17.6726L12.5626 17.8487L12.5638 17.8759L12.5654 17.9031L16.5587 17.6726ZM16.6222 11.1843L20.6141 11.4389L20.6149 11.4253L16.6222 11.1843ZM18.5665 5.54758L16.5189 2.11144L16.5185 2.11164L18.5665 5.54758ZM20.8693 5.00754L20.6652 1.01275L20.6554 1.01325L20.6455 1.0138L20.8693 5.00754ZM8.35951 5.00949L8.50149 9.00697C8.94628 8.99117 9.22481 9.00718 9.3955 9.0317C9.55838 9.0551 9.52798 9.07337 9.40598 9.00749C9.34262 8.97327 9.26944 8.92423 9.19718 8.85964C9.12479 8.79494 9.07279 8.73203 9.0397 8.68403C8.97479 8.58986 9.02531 8.61646 9.0903 8.9003L12.9894 8.00754L16.8885 7.11478C16.3936 4.95326 15.2449 3.06872 13.2075 1.96841C11.4302 1.0086 9.51614 0.965889 8.21753 1.01201L8.35951 5.00949ZM12.9894 8.00754L9.09024 8.90006C9.29709 9.8037 9.34041 10.5495 9.41773 11.9086L13.4113 11.6814L17.4048 11.4542C17.3333 10.1967 17.27 8.78147 16.8885 7.11501L12.9894 8.00754ZM13.4113 11.6814L9.41708 11.8968C9.53222 14.0312 9.52795 16.1721 9.40517 18.3072L13.3986 18.5368L17.392 18.7665C17.5317 16.3361 17.5367 13.8981 17.4055 11.4659L13.4113 11.6814ZM13.3986 18.5368L9.40533 18.3044C9.35312 19.2015 9.31895 19.9024 9.20896 20.5591C9.09438 21.2432 8.96301 21.4139 9.00678 21.3534L12.2462 23.6999L15.4857 26.0464C16.5081 24.6349 16.9057 23.0348 17.0991 21.8806C17.297 20.699 17.3496 19.4939 17.3918 18.7693L13.3986 18.5368ZM12.2462 23.6999L9.00675 21.3535C9.05447 21.2876 9.13219 21.2004 9.24072 21.1151C9.34795 21.0309 9.44718 20.9783 9.51396 20.9495C9.57485 20.9233 9.59274 20.9237 9.5378 20.936C9.4793 20.9492 9.37659 20.9676 9.19607 20.9893L9.67397 24.9607L10.1519 28.932C11.4584 28.7748 13.8144 28.3538 15.4857 26.0464L12.2462 23.6999ZM9.67397 24.9607L9.43279 20.9679L9.28729 20.9767L9.52846 24.9695L9.76963 28.9622L9.91514 28.9534L9.67397 24.9607ZM9.52846 24.9695L9.29956 20.976C9.04041 20.9909 8.81068 21.0006 8.59362 21.0001C8.37479 20.9996 8.21316 20.9885 8.1008 20.9732C7.98264 20.9571 7.98675 20.9453 8.07044 20.9787C8.16047 21.0146 8.39471 21.1244 8.64678 21.3803L5.79701 24.1872L2.94725 26.9942C4.29917 28.3667 5.99551 28.7604 7.02194 28.9001C8.11462 29.0489 9.16195 28.997 9.75736 28.9629L9.52846 24.9695ZM5.79701 24.1872L8.64704 21.3806C8.89881 21.6362 8.79101 21.7497 8.69682 21.1228C8.65569 20.849 8.62918 20.5201 8.61013 20.1029C8.60069 19.896 8.59383 19.6876 8.58625 19.4556C8.57899 19.2334 8.57083 18.9817 8.55915 18.7347L4.56361 18.9236L0.568074 19.1124C0.59464 19.6745 0.603352 21.0982 0.785607 22.3114C0.975172 23.5732 1.44384 25.4675 2.94698 26.9939L5.79701 24.1872ZM4.56361 18.9236L8.55916 18.7348C8.53335 18.1885 8.53007 17.6422 8.51915 16.9628L4.51967 17.0271L0.520185 17.0913C0.529381 17.6636 0.534558 18.403 0.568071 19.1123L4.56361 18.9236ZM4.51967 17.0271L8.51899 16.9535C8.48744 15.2382 8.49596 13.5228 8.54535 11.8093L4.54701 11.6941L0.548673 11.5788C0.49562 13.4195 0.486505 15.2609 0.520345 17.1006L4.51967 17.0271ZM4.54701 11.6941L8.54534 11.8098C8.5772 10.7088 8.55922 9.97709 8.65482 9.17865C8.75348 8.35476 8.90321 8.30281 8.7389 8.50337L5.64467 5.96848L2.55043 3.43358C1.23518 5.03905 0.861363 6.97652 0.711566 8.2275C0.55872 9.50395 0.567376 10.9326 0.548687 11.5783L4.54701 11.6941ZM5.64467 5.96848L8.73875 8.50356C8.58231 8.69449 8.4044 8.83555 8.24345 8.93019C8.09194 9.01928 7.98263 9.05158 7.95983 9.05789C7.94005 9.06336 7.97197 9.05289 8.08608 9.03966C8.20329 9.02608 8.3476 9.01579 8.5721 9.00384L8.35951 5.00949L8.14692 1.01514C7.47816 1.05074 4.49577 1.05928 2.55059 3.43339L5.64467 5.96848ZM21.1007 5.0007L21.1422 9.00049C21.3776 8.99805 21.5594 8.99992 21.7166 9.00876C21.8739 9.01761 21.9614 9.0313 21.9984 9.03892C22.0358 9.04664 21.9742 9.03864 21.8553 8.98034C21.7269 8.91736 21.538 8.79829 21.3527 8.5971L24.2951 5.88742L27.2374 3.17775C26.0751 1.91561 24.6472 1.41666 23.6129 1.20354C22.595 0.99378 21.6228 0.995078 21.0593 1.00092L21.1007 5.0007ZM24.2951 5.88742L21.3524 8.59679C21.1841 8.41405 21.1558 8.29532 21.186 8.37664C21.2156 8.45654 21.2653 8.63086 21.3101 8.93224C21.4076 9.58849 21.4143 10.2837 21.4424 11.2161L25.4406 11.0954L29.4387 10.9748C29.4186 10.3068 29.4083 9.00167 29.2231 7.75587C29.0491 6.58552 28.628 4.68808 27.2377 3.17806L24.2951 5.88742ZM25.4406 11.0954L21.4422 11.21C21.4662 12.0476 21.4833 12.8869 21.4946 13.7282L25.4943 13.6745L29.4939 13.6208C29.4821 12.7424 29.4642 11.8623 29.4389 10.9808L25.4406 11.0954ZM25.4943 13.6745L21.4944 13.7105C21.509 15.3336 21.4935 16.9571 21.448 18.58L25.4464 18.6921L29.4449 18.8042C29.4931 17.083 29.5096 15.3608 29.4941 13.6385L25.4943 13.6745ZM25.4464 18.6921L21.448 18.5811C21.4367 18.9878 21.4288 19.3191 21.4128 19.6572L25.4083 19.8464L29.4039 20.0356C29.4246 19.5979 29.4349 19.1631 29.4449 18.8031L25.4464 18.6921ZM25.4083 19.8464L21.4128 19.6571C21.3924 20.0876 21.3768 20.4307 21.3448 20.7705C21.3133 21.105 21.2736 21.3402 21.2324 21.5014C21.135 21.8828 21.1547 21.4176 21.7544 21.0813L23.7111 24.57L25.6678 28.0588C27.8061 26.8595 28.6362 24.8412 28.9836 23.481C29.326 22.1403 29.3704 20.7425 29.4039 20.0357L25.4083 19.8464ZM23.7111 24.57L21.7554 21.0807C21.9055 20.9966 22.0115 20.9649 22.0367 20.9578C22.0625 20.9506 22.0444 20.9578 21.9665 20.9676C21.89 20.9772 21.7844 20.9858 21.6395 20.9915C21.4931 20.9972 21.3365 20.999 21.1417 20.9998L21.1583 24.9997L21.175 28.9997C21.5753 28.998 22.251 28.9947 22.9639 28.9051C23.6593 28.8178 24.6687 28.6187 25.6668 28.0593L23.7111 24.57ZM21.1583 24.9997L21.1451 20.9997C20.566 21.0017 20.4158 20.9177 20.4905 20.9493C20.6318 21.0092 20.8151 21.1518 20.9282 21.3199C20.999 21.4251 20.9366 21.3873 20.8544 20.9989C20.772 20.609 20.7086 20.0646 20.657 19.2602L16.6652 19.5163L12.6734 19.7724C12.7775 21.3953 12.9746 23.83 14.291 25.7862C15.9393 28.2357 18.5546 29.0084 21.1716 28.9997L21.1583 24.9997ZM16.6652 19.5163L20.6585 19.2858L20.5521 17.442L16.5587 17.6726L12.5654 17.9031L12.6718 19.7469L16.6652 19.5163ZM16.5587 17.6726L20.5549 17.4964C20.4659 15.4776 20.4855 13.4548 20.6141 11.4389L16.6222 11.1843L12.6303 10.9297C12.4834 13.233 12.461 15.5433 12.5626 17.8487L16.5587 17.6726ZM16.6222 11.1843L20.6149 11.4253C20.6486 10.8683 20.6661 10.4577 20.707 9.99853C20.7459 9.56208 20.7952 9.23053 20.8559 8.97634C20.9917 8.4084 21.057 8.71981 20.6146 8.98351L18.5665 5.54758L16.5185 2.11164C14.2832 3.44402 13.4343 5.61363 13.0751 7.11681C12.7251 8.58124 12.6762 10.1691 12.6295 10.9433L16.6222 11.1843ZM18.5665 5.54758L20.6142 8.98371C20.5 9.05175 20.4177 9.06486 20.4558 9.0574C20.4837 9.05193 20.5422 9.04236 20.6511 9.03191C20.7645 9.02104 20.8978 9.01221 21.093 9.00128L20.8693 5.00754L20.6455 1.0138C19.8717 1.05715 18.1832 1.11964 16.5189 2.11144L18.5665 5.54758ZM20.8693 5.00754L21.0734 9.00233C21.0962 9.00116 21.1144 9.0007 21.1283 9.00061L21.1007 5.0007L21.0731 1.0008C20.9328 1.00176 20.7965 1.00604 20.6652 1.01275L20.8693 5.00754Z\"\n fill=\"#FDEFC4\"\n mask={`url(#${maskId})`}\n />\n </svg>\n );\n};\nPauseIconReadingFluency.displayName = 'PauseIconReadingFluency';\n","import type { FC } from 'react';\nimport type { ReadingFluencyIconProps } from './types';\n\n/**\n * Ícone de voz — passarinho Reading Fluency + ondas sonoras (ilustração multicolor, cores\n * fixas da arte). viewBox nativo 61×50 (não é quadrado): `size` define a LARGURA\n * e a altura sai proporcional; sem `size`, usa o tamanho nativo. Prefira dimensionar\n * por `className` (ex.: `h-full w-full`) — o viewBox preserva a proporção.\n * `aria-hidden` por ser decorativo; quem usa em botão deve prover o rótulo.\n */\nexport const VoiceIconReadingFluency: FC<ReadingFluencyIconProps> = ({\n size,\n className,\n}) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size ?? 61}\n height={size != null ? (size * 50) / 61 : 50}\n viewBox=\"0 0 61 50\"\n fill=\"none\"\n className={className}\n aria-hidden=\"true\"\n >\n <path\n d=\"M5.89958 11.0353C5.36925 9.39292 5.46146 5.2114 7.31148 4.38714C8.83221 3.71028 10.6106 8.56901 10.6024 9.56426C10.7431 9.91306 10.8001 10.1116 10.8951 10.4702C11.6865 10.7351 11.5683 11.6757 12.1608 11.8734C12.2664 11.3525 12.5066 9.88954 12.9531 9.62142C13.3623 7.56723 18.6693 4.18722 18.2897 7.90361C18.2066 8.71521 16.7618 10.9438 16.3177 11.6823C16.3047 11.6897 16.2912 11.697 16.2781 11.7044C16.2126 11.9791 16.0587 12.2842 15.9196 12.5298C15.0803 14.0115 14.4109 15.7585 14.5935 17.5096C13.9343 18.0849 12.1336 19.8053 11.6808 20.4719C11.3486 20.523 11.0145 20.5608 10.6795 20.5849C9.24711 20.6788 7.7871 20.1425 6.88473 18.982C6.67675 18.7148 6.43281 18.5793 6.41377 18.2225C5.82456 17.5439 5.66506 15.9093 7.00576 16.171C7.30467 16.2294 8.07822 16.5892 8.17307 16.8913C8.55448 16.9374 9.02883 17.2243 9.3772 17.4119C9.41743 17.3324 9.48578 17.1321 9.52079 17.0396C7.86606 15.6009 6.20837 13.2781 5.89958 11.0353ZM9.37816 17.4148C9.77375 17.6756 10.9896 18.2284 11.4333 18.2678C11.1755 18.0348 9.93269 17.3217 9.52232 17.0433C9.48728 17.1359 9.41837 17.3355 9.37816 17.4148ZM10.8943 10.4708C11.1467 11.6766 11.8103 14.7203 12.4008 15.7172L12.4799 15.7437C12.4638 15.5665 12.439 15.4452 12.3981 15.2721C12.1441 14.1973 12.0306 12.9691 12.1594 11.8732C11.5672 11.6754 11.6854 10.7358 10.8943 10.4708Z\"\n fill=\"#F2C63A\"\n />\n <path\n d=\"M5.89816 11.037C5.36767 9.39482 5.45956 5.21281 7.30989 4.38864C8.83091 3.71116 10.6093 8.5717 10.6006 9.56592C9.92562 10.5549 9.73674 12.6533 9.65742 13.836C7.74025 12.7144 7.49431 12.3699 5.89816 11.037Z\"\n fill=\"#30A34D\"\n />\n <path\n d=\"M12.9514 9.62322C13.3597 7.56898 18.6692 4.18769 18.2889 7.90547C18.2059 8.71724 16.7601 10.946 16.3164 11.6841C16.3033 11.6915 16.2901 11.6989 16.277 11.7063C15.4067 11.8016 14.445 12.6386 13.8166 13.1892C13.2694 11.7843 13.1261 11.1044 12.9514 9.62322Z\"\n fill=\"#326FC3\"\n />\n <path\n d=\"M6.41244 18.224C5.82281 17.5457 5.66258 15.9101 7.00374 16.1719C7.30256 16.2301 8.07691 16.5903 8.1711 16.8927C8.19085 17.3908 8.47107 18.2886 8.61778 18.8012C7.75783 18.7811 7.19159 18.5547 6.41244 18.224Z\"\n fill=\"#326FC3\"\n />\n <path\n d=\"M21.9013 12.2457C28.7536 10.4097 32.7867 13.2996 35.9036 18.8556C34.2692 20.4976 33.3412 23.961 33.7014 27.8574C34.1881 33.1218 36.84 37.1808 39.6237 36.9235C39.8707 36.9006 40.1096 36.8425 40.341 36.7556C39.31 40.7146 36.0917 43.4284 30.6476 44.8872C21.231 47.4104 11.9723 44.353 10.1892 33.8562C8.40605 23.3592 12.4847 14.7689 21.9013 12.2457Z\"\n fill=\"#30A34D\"\n />\n <path\n d=\"M20.1394 16.5047C24.7935 13.0145 31.4084 13.7302 34.7735 16.9147C35.1847 17.4974 35.5778 18.1238 35.9582 18.7891C34.2869 20.4061 33.3337 23.9075 33.6982 27.8508C34.1848 33.115 36.836 37.174 39.6196 36.9172C39.9469 36.8869 40.2605 36.7954 40.5601 36.654C40.5579 36.6631 40.5575 36.6726 40.5553 36.6816C36.3785 41.7088 29.4955 44.717 23.76 41.8492C18.3293 39.1336 16.4171 34.408 15.9158 31.2891C15.3061 27.4959 16.3161 19.372 20.1394 16.5047Z\"\n fill=\"#FEFEFE\"\n />\n <path\n d=\"M33.7926 26.8947C33.3406 25.1789 32.9294 23.8729 33.0648 22.0871C33.2268 19.9517 33.5639 18.936 34.6203 18.4262C35.9538 17.7827 38.105 17.1253 40.4071 18.4263C42.7092 19.7272 43.5262 22.9862 43.5262 25.1778C43.5262 27.1493 43.0549 30.6309 41.7132 28.859C41.169 28.1403 39.8684 27.8894 39.2212 28.0658C38.1561 28.3561 36.4652 28.9222 35.5473 28.7106C34.6294 28.4989 34.1011 28.0661 33.7926 26.8947Z\"\n fill=\"#414345\"\n />\n <path\n d=\"M34.3395 31.2139C35.4206 32.9759 36.3404 33.7131 37.1362 33.6873C39.5658 33.6087 39.8675 32.1382 42.3903 33.7994C41.9769 35.1235 42.0371 36.1015 40.7039 36.88C39.9968 37.2906 39.1563 37.363 38.3714 37.0809C36.6985 36.4688 35.1347 34.2329 34.3395 31.2139Z\"\n fill=\"#414345\"\n />\n <path\n d=\"M21.7834 24.0741C21.4056 22.7086 19.9271 20.7491 21.8142 20.3618C22.4902 20.223 23.1423 20.2085 23.8286 20.1765C25.56 19.9154 27.1508 19.9787 28.685 20.9431C30.9397 22.3605 31.5333 26.0731 30.2316 28.3226C29.7824 29.0988 28.7778 29.9327 27.8788 30.0096C27.8905 30.2143 27.982 30.3881 27.9328 30.6162C27.615 32.0909 25.665 32.5194 24.3996 32.29C23.5938 32.1439 22.6186 31.6772 22.8115 30.6936C22.9304 30.0875 23.5578 29.7112 24.0269 29.4072C23.0094 28.9732 21.6768 28.3704 21.2312 27.2565C20.7708 26.1055 21.3942 25.0944 21.7834 24.0741Z\"\n fill=\"#F2C63A\"\n />\n <path\n d=\"M26.1501 21.6541C26.596 21.5411 27.0656 21.5741 27.4918 21.7483C28.2517 22.0552 28.7944 22.7794 29.11 23.524C29.5437 24.5482 29.5578 25.7059 29.1494 26.7411C28.8269 27.5388 28.3981 27.9267 27.6522 28.2503C24.0318 29.049 22.9479 22.6523 26.1501 21.6541Z\"\n fill=\"#F05229\"\n />\n <path\n d=\"M26.0933 22.0685C29.016 21.3408 30.2031 26.6081 27.6336 27.8345C24.5972 28.4993 23.5183 23.3784 26.0933 22.0685Z\"\n fill=\"#070706\"\n />\n <path\n d=\"M27.1529 22.6617C27.5375 22.4874 27.9886 22.6568 28.1689 23.0432C28.3493 23.4296 28.1929 23.8917 27.8167 24.084C27.5654 24.2125 27.2654 24.1927 27.0328 24.0322C26.8001 23.8717 26.6713 23.5958 26.6963 23.3113C26.7212 23.0267 26.8959 22.7781 27.1529 22.6617Z\"\n fill=\"#FEFEFE\"\n />\n <path\n d=\"M22.3181 30.3049C23.9963 29.2449 26.117 28.3714 27.8852 29.7839C27.9718 30.0597 28.1587 30.2655 28.1686 30.5948C28.2326 32.7231 25.6662 33.9903 23.8265 34.1184C22.655 34.1999 21.1377 33.9021 21.0685 32.4892C21.0259 31.6185 21.7697 30.8846 22.3181 30.3049Z\"\n fill=\"#EF99A4\"\n />\n <path\n d=\"M35.4161 19.0845C36.6781 18.4283 38.0635 18.4166 39.3945 18.8412C39.9208 19.0092 40.3002 19.3 40.0868 19.8906C39.7412 20.2316 39.5839 20.0824 39.188 19.9615C38.7547 19.8291 38.2168 19.5584 37.76 19.5497C37.1002 19.5371 36.4057 19.9081 35.7571 19.9489C35.3143 19.8113 35.3863 19.4616 35.4161 19.0845Z\"\n fill=\"#696B6C\"\n />\n <path\n d=\"M48.4316 33.4614C48.6691 33.4699 48.997 33.5192 49.3125 33.7173L49.4473 33.812L49.4492 33.814C51.4905 35.4228 53.4968 37.1332 55.4727 38.7671C55.6675 38.9282 56.1486 39.2886 56.5127 39.6587C56.7037 39.8529 56.9119 40.0967 57.0684 40.3804C57.2057 40.6297 57.3276 40.9566 57.3232 41.3325L57.3135 41.4976C57.2179 42.3597 56.5375 42.8668 56.3682 43.02L56.1416 43.2251L55.8398 43.2681C55.2121 43.3581 54.6974 43.2644 54.2236 42.9839C54.0192 42.8628 53.8446 42.7199 53.7041 42.5991C53.5378 42.4562 53.4455 42.3699 53.2812 42.2329V42.2319C51.2601 40.5443 49.1115 38.851 47.0986 37.063C46.5724 36.5955 46.1646 35.9554 46.3408 35.1606C46.4148 34.8277 46.5774 34.5562 46.7295 34.3511C46.8823 34.1452 47.0633 33.954 47.2275 33.7896L47.4697 33.5483L47.8086 33.5044C47.9183 33.4904 48.1746 33.4523 48.4316 33.4614ZM47.7158 34.7261C47.6529 34.7955 47.5949 34.8637 47.5439 34.9312C47.5956 34.8628 47.6537 34.7934 47.7178 34.7231C47.717 34.724 47.7166 34.7252 47.7158 34.7261ZM58.4102 24.5317C58.8057 24.5266 59.2495 24.6016 59.6475 24.8589C60.0109 25.094 60.2606 25.433 60.4053 25.8247L60.4609 25.9966L60.4619 25.9976C60.6131 26.5363 60.5806 27.0735 60.2832 27.5503C60.0329 27.9511 59.651 28.2019 59.4228 28.3491L59.2471 28.4624L59.04 28.4956C57.6624 28.7179 56.243 28.8544 54.8525 28.979C53.4512 29.1046 52.0848 29.2179 50.7607 29.394C50.5168 29.4265 49.9037 29.5159 49.3076 29.5337C49.0119 29.5425 48.6721 29.5355 48.3584 29.48C48.1032 29.4348 47.5966 29.3158 47.2666 28.8853C46.907 28.4157 46.6189 27.8103 46.7715 27.1206C46.9137 26.4791 47.3824 26.0455 47.7812 25.7534L47.9775 25.6099L48.2168 25.5728C50.1283 25.2724 52.3605 25.1249 54.1953 24.9038L54.2129 24.9009L54.2295 24.8999C55.4754 24.7925 57.0045 24.5503 58.4092 24.5317H58.4102ZM47.7598 27.7173C47.7715 27.7617 47.7877 27.8067 47.8066 27.853C47.7877 27.8067 47.7716 27.7617 47.7598 27.7173ZM47.7314 27.5493C47.7319 27.5561 47.7328 27.563 47.7334 27.5698C47.7294 27.5264 47.7292 27.4838 47.7324 27.4419L47.7314 27.5493ZM48.3721 26.5601C48.3287 26.5919 48.2873 26.6241 48.248 26.6558C48.2873 26.6241 48.3287 26.5928 48.3721 26.561C48.5788 26.5285 48.788 26.4972 48.999 26.4683C48.788 26.4972 48.5788 26.5276 48.3721 26.5601ZM51.4746 26.189C52.0779 26.1297 52.6813 26.0705 53.2754 26.0093C52.6814 26.0708 52.0779 26.1297 51.4746 26.189ZM52.3516 11.1099C53.0202 11.109 53.6049 11.4715 53.9531 11.8521C54.3187 12.2501 54.4484 12.7482 54.4326 13.1909C54.4233 13.4527 54.3228 13.6799 54.2773 13.7788C54.215 13.9143 54.1342 14.0573 54.0498 14.1978C53.8793 14.4813 53.6471 14.824 53.3818 15.1948C52.8484 15.9403 52.1374 16.8614 51.4082 17.7759C49.9654 19.5852 48.3732 21.4657 47.8857 21.9497L47.6357 22.1978L47.2861 22.2349C47.1824 22.2458 47.0279 22.2613 46.8623 22.2612C46.5509 22.2612 46.2388 22.1842 45.9707 22.0669C45.7061 21.951 45.4048 21.7608 45.1768 21.4702C44.8756 21.0862 44.748 20.6596 44.7695 20.1929L44.793 20.0073C44.8282 19.8306 44.8932 19.6848 44.9287 19.6079C44.9922 19.4705 45.0738 19.3245 45.1602 19.1812C45.3346 18.8918 45.5721 18.542 45.8428 18.1646C46.387 17.4057 47.1104 16.4707 47.8486 15.5474C49.304 13.7271 50.9086 11.8384 51.3564 11.4087L51.6025 11.1724L51.9414 11.1362C52.04 11.1256 52.1901 11.109 52.3516 11.1089V11.1099ZM45.8545 19.9927C45.8439 20.0142 45.8339 20.0346 45.8252 20.0542C45.8338 20.0346 45.8439 20.0143 45.8545 19.9927ZM46.0068 19.7153C45.9585 19.7961 45.9172 19.87 45.8828 19.936C45.9172 19.87 45.9585 19.7961 46.0068 19.7153ZM53.2168 12.5288C53.2364 12.5501 53.2546 12.5722 53.2715 12.5952C53.2546 12.5721 53.2365 12.5493 53.2168 12.5278C53.1913 12.4999 53.1635 12.4731 53.1348 12.4468C53.1637 12.4733 53.1911 12.5007 53.2168 12.5288ZM51.8496 12.3354C51.8357 12.3504 51.8223 12.3672 51.8076 12.3833C51.9105 12.2712 51.9919 12.185 52.0488 12.1304L51.8496 12.3354ZM52.7041 12.1782C52.6493 12.1573 52.5932 12.1413 52.5371 12.1294C52.5933 12.1412 52.6493 12.1574 52.7041 12.1782ZM52.5117 12.1245C52.4983 12.122 52.4851 12.1185 52.4717 12.1167L52.4502 12.1147C52.4707 12.1171 52.4912 12.1207 52.5117 12.1245ZM47.7363 27.5903C47.739 27.6132 47.7415 27.6364 47.7461 27.6597C47.7493 27.6759 47.7536 27.692 47.7578 27.7085C47.7475 27.6684 47.7408 27.629 47.7363 27.5903Z\"\n fill=\"#D1F0DB\"\n />\n </svg>\n);\nVoiceIconReadingFluency.displayName = 'VoiceIconReadingFluency';\n","import { useId, type FC } from 'react';\nimport type { ReadingFluencyIconProps } from './types';\n\n/**\n * Fechar (X creme num disco rosa com contorno creme) — tema Reading Fluency.\n * Cores fixas da arte (`#EA909A` + `#FDEFC4` + `#FBF0CE`), como no resto da\n * família. `aria-hidden`; quem usa em botão dá o rótulo — ver\n * `CloseButtonReadingFluency`.\n *\n * O disco visível ocupa 29 dos 37 do box: a arte fica 1u acima do centro\n * vertical (centro em y=17,5) pra abrir espaço pra sombra, que desce 1u. Como o\n * borrão da sombra alcança ~y=39, a barra de baixo dela é cortada pelo box de\n * 37 — a 5%/10% de preto isso é imperceptível, e alargar o box encolheria a\n * arte, então fica como a designer entregou.\n *\n * O `filter` da sombra usa id único (via `useId`) pra não colidir entre\n * instâncias — mesmo cuidado do `PauseIconReadingFluency`.\n */\nexport const CloseIconReadingFluency: FC<ReadingFluencyIconProps> = ({\n size = 37,\n className,\n}) => {\n // id único (sem \":\") pra o `filter` não colidir entre instâncias.\n const filterId = `reading-fluency-close-shadow-${useId().replaceAll(':', '')}`;\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 37 37\"\n fill=\"none\"\n className={className}\n aria-hidden=\"true\"\n >\n <g filter={`url(#${filterId})`}>\n {/* Disco rosa com contorno creme. `strokeLinejoin` arredondado porque o\n path traz micro-segmentos quase degenerados do Figma (`V4.50145`,\n `V30.4614`) que viram farpas com o `miter` default. */}\n <path\n d=\"M18.3393 4.50145C18.6632 4.49328 19.0833 4.525 19.2309 4.53075C19.3571 4.53565 19.6589 4.53951 19.896 4.55809C20.512 4.60634 21.1133 4.70917 21.6665 4.82372C23.9818 5.30311 26.0685 6.30892 27.8286 7.98582L27.8296 7.9868C28.0478 8.19497 28.3029 8.50457 28.3628 8.57176L28.5171 8.73973C28.5904 8.82056 28.6752 8.91638 28.7407 8.99754C29.1275 9.47701 29.4543 9.99376 29.729 10.4731C29.9749 10.8961 30.197 11.3329 30.393 11.7807L30.5805 12.2319L30.5844 12.2427L30.6919 12.5347C31.2127 14.0062 31.4554 15.6151 31.4936 17.0884C31.5837 20.5692 30.5961 24.3495 27.8491 27.0073C26.0096 28.7872 23.6491 29.8392 21.2397 30.2593L21.2329 30.2612L21.226 30.2622C20.4284 30.3935 19.6221 30.4649 18.8139 30.48C18.5571 30.5059 18.3011 30.4988 18.1469 30.4917C18.0386 30.4866 17.9315 30.4796 17.8452 30.4741C17.7517 30.4682 17.6873 30.4644 17.6372 30.4624V30.4614C15.516 30.3925 13.4409 29.826 11.5796 28.8071L11.5727 28.8042L11.5669 28.8003C7.8651 26.7266 5.89682 22.9161 5.56003 18.9487C5.2757 15.599 5.96732 11.7362 8.35104 8.90868L8.35397 8.90575C10.2531 6.66533 12.8945 5.18306 15.7964 4.72801V4.72704C16.2826 4.64864 16.8342 4.57081 17.393 4.54442C17.7615 4.52704 17.9272 4.53156 18.1655 4.51024L18.1928 4.50829C18.2419 4.50479 18.2907 4.50359 18.3393 4.50243V4.50145Z\"\n fill=\"#EA909A\"\n stroke=\"#FDEFC4\"\n strokeWidth={3}\n strokeLinejoin=\"round\"\n />\n {/* Glifo X (10×10, centrado em ~18,1 / 17,1). */}\n <path\n d=\"M18.1454 15.3852C18.1993 15.3141 18.2759 15.234 18.3387 15.1706L20.1715 13.3386C20.4228 13.0873 20.9998 12.4544 21.2762 12.2963C22.0778 11.8376 23.1941 12.4592 23.1404 13.4209C23.1094 13.9774 22.8929 14.1713 22.5218 14.5401L21.937 15.1227C21.2706 15.7874 20.5934 16.4821 19.9169 17.1332L21.9604 19.1703L22.5612 19.7688C22.8649 20.0719 23.0725 20.2298 23.1299 20.6766C23.1757 21.0212 23.0813 21.3699 22.8677 21.6444C22.6253 21.9541 22.3339 22.0783 21.957 22.1262C21.9307 22.1273 21.9237 22.1458 21.8894 22.1418C21.6884 22.1179 21.3947 22.0724 21.2299 21.9462C20.8246 21.6362 20.4882 21.228 20.1169 20.8779C19.4629 20.217 18.7929 19.5668 18.1454 18.9046C17.9687 19.1005 17.7217 19.3346 17.5308 19.5258L16.3611 20.6955L15.6407 21.4168C15.2888 21.7686 15.0409 22.0827 14.5141 22.1267C13.6999 22.1944 13.0203 21.4341 13.1678 20.6329C13.2635 20.1137 13.7235 19.7838 14.085 19.4216L15.6099 17.8969C15.8251 17.6821 16.1838 17.3474 16.3736 17.1301C16.1813 16.929 15.9385 16.7023 15.7366 16.5008L14.2443 15.0104C13.9882 14.7549 13.5494 14.3713 13.3597 14.0876C12.8052 13.2582 13.3802 12.2545 14.305 12.1533C15.0134 12.128 15.178 12.3901 15.645 12.8586L16.5126 13.7277L17.5884 14.8014C17.729 14.9419 18.0421 15.2401 18.1454 15.3852Z\"\n fill=\"#FBF0CE\"\n />\n </g>\n <defs>\n {/* \"Drop Shadow/200\" da arte: duas sombras empilhadas (5% e 10% de\n #0C0C0D), ambas dy=1 / blur 2. */}\n <filter\n id={filterId}\n x=\"-0.857773\"\n y=\"-0.857758\"\n width=\"38\"\n height=\"38\"\n filterUnits=\"userSpaceOnUse\"\n colorInterpolationFilters=\"sRGB\"\n >\n <feFlood floodOpacity=\"0\" result=\"BackgroundImageFix\" />\n <feColorMatrix\n in=\"SourceAlpha\"\n type=\"matrix\"\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\n result=\"hardAlpha\"\n />\n <feOffset dy=\"1\" />\n <feGaussianBlur stdDeviation=\"2\" />\n <feComposite in2=\"hardAlpha\" operator=\"out\" />\n <feColorMatrix\n type=\"matrix\"\n values=\"0 0 0 0 0.0470588 0 0 0 0 0.0470588 0 0 0 0 0.0509804 0 0 0 0.05 0\"\n />\n <feBlend\n mode=\"normal\"\n in2=\"BackgroundImageFix\"\n result=\"effect1_dropShadow\"\n />\n <feColorMatrix\n in=\"SourceAlpha\"\n type=\"matrix\"\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\n result=\"hardAlpha\"\n />\n <feOffset dy=\"1\" />\n <feGaussianBlur stdDeviation=\"2\" />\n <feComposite in2=\"hardAlpha\" operator=\"out\" />\n <feColorMatrix\n type=\"matrix\"\n values=\"0 0 0 0 0.0470588 0 0 0 0 0.0470588 0 0 0 0 0.0509804 0 0 0 0.1 0\"\n />\n <feBlend\n mode=\"normal\"\n in2=\"effect1_dropShadow\"\n result=\"effect2_dropShadow\"\n />\n <feBlend\n mode=\"normal\"\n in=\"SourceGraphic\"\n in2=\"effect2_dropShadow\"\n result=\"shape\"\n />\n </filter>\n </defs>\n </svg>\n );\n};\nCloseIconReadingFluency.displayName = 'CloseIconReadingFluency';\n","import { ButtonHTMLAttributes, forwardRef } from 'react';\nimport { cn } from '../../utils/utils';\nimport { CloseIconReadingFluency } from '../ReadingFluencyIcons';\n\nexport interface CloseButtonReadingFluencyProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n /** Lado do ícone em pixels. Default: 37 (tamanho nativo da arte). */\n iconSize?: number;\n /** Classes extras (posicionamento fica com quem usa). */\n className?: string;\n}\n\n/**\n * Botão de fechar do tema Reading Fluency: alvo clicável de no mínimo 42×42\n * envolvendo o `CloseIconReadingFluency` (disco visível de ~29px no box de 37).\n *\n * Substitui a composição antiga `ButtonReadingFluency variant=\"icon\"` + `XIcon`\n * do phosphor, que montava o disco em CSS (`bg-error-500`, borda `primary-200`,\n * glifo 14px). Aquele caminho dependia de `--color-error-500`, que **o tema\n * papole light não define** — o rosa da arte não saía. Aqui as cores vêm do\n * próprio SVG, como no resto da família de ícones.\n *\n * `aria-label` já vem com \"Fechar\" (o ícone é decorativo); passe outro pra\n * sobrescrever. O alvo é um **mínimo** de 42×42 — preserva o toque do botão\n * anterior com o disco menor e cresce junto se `iconSize` passar de 42, em vez\n * de deixar o ícone estourar a área clicável.\n *\n * Estados: a spec só entregou o `default`, então hover/pressed usam realce e\n * recuo neutros (brilho + escala), que funcionam sobre o header verde e sobre o\n * corpo branco sem inventar cor nova. Foco reaproveita o `secondary-600` que o\n * resto dos botões Reading Fluency já usa.\n */\nconst BASE_CLASSES =\n 'inline-flex min-h-[42px] min-w-[42px] shrink-0 cursor-pointer items-center justify-center rounded-full ' +\n 'transition-[transform,filter] duration-100 ' +\n 'hover:brightness-105 ' +\n 'active:scale-95 ' +\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-secondary-600 ' +\n 'disabled:cursor-not-allowed disabled:opacity-40 ' +\n 'disabled:hover:brightness-100 disabled:active:scale-100';\n\nexport const CloseButtonReadingFluency = forwardRef<\n HTMLButtonElement,\n CloseButtonReadingFluencyProps\n>(\n (\n {\n iconSize = 37,\n className,\n type = 'button',\n 'aria-label': ariaLabel = 'Fechar',\n ...props\n },\n ref\n ) => (\n <button\n ref={ref}\n type={type}\n aria-label={ariaLabel}\n className={cn(BASE_CLASSES, className)}\n {...props}\n >\n <CloseIconReadingFluency size={iconSize} />\n </button>\n )\n);\nCloseButtonReadingFluency.displayName = 'CloseButtonReadingFluency';\n","/* eslint-disable no-undef -- tipos/globais do DOM (PermissionDescriptor, PermissionStatus, navigator) são verificados pelo TypeScript */\nimport { useCallback, useEffect, useState } from 'react';\n\nexport type MicrophonePermissionStatus =\n | 'checking'\n | 'granted'\n | 'denied'\n | 'prompt'\n | 'unsupported';\n\nexport interface UseMicrophonePermissionReturn {\n /** Estado atual da permissão de microfone. */\n status: MicrophonePermissionStatus;\n /** Já concedeu o acesso. */\n isGranted: boolean;\n /** O navegador suporta captura de áudio (`getUserMedia`). */\n isSupported: boolean;\n /**\n * Ainda não concedeu (precisa perguntar) — `true` em `prompt`/`denied`.\n * Use para decidir se abre o modal de permissão.\n */\n shouldAsk: boolean;\n /**\n * Dispara o prompt do navegador (via `getUserMedia`). Encerra as tracks logo\n * após (só queríamos a permissão). Retorna `true` se foi concedida.\n */\n requestPermission: () => Promise<boolean>;\n}\n\n/**\n * Encapsula a lógica de permissão de microfone do navegador:\n * - consulta o estado (Permissions API) e reage a mudanças;\n * - `requestPermission()` abre o prompt nativo (`getUserMedia`).\n *\n * Não persiste nada: ao recarregar a página o estado é reconsultado — então um\n * \"configurar depois\" (que não concede) volta a pedir no próximo carregamento.\n */\nexport function useMicrophonePermission(): UseMicrophonePermissionReturn {\n const [status, setStatus] = useState<MicrophonePermissionStatus>('checking');\n\n useEffect(() => {\n const nav = typeof navigator !== 'undefined' ? navigator : undefined;\n if (!nav?.mediaDevices?.getUserMedia) {\n setStatus('unsupported');\n return;\n }\n\n // Nem todos os navegadores suportam a Permissions API para consultar 'microphone'\n // (ex.: Safari). Nesses casos assumimos 'prompt' (precisa perguntar).\n const permissions = nav.permissions;\n if (!permissions?.query) {\n setStatus('prompt');\n return;\n }\n\n let active = true;\n let permStatus: PermissionStatus | null = null;\n\n const micDescriptor = {\n name: 'microphone',\n } as unknown as PermissionDescriptor;\n\n permissions\n .query(micDescriptor)\n .then((result) => {\n if (!active) return;\n permStatus = result;\n setStatus(result.state as MicrophonePermissionStatus);\n result.onchange = () =>\n setStatus(result.state as MicrophonePermissionStatus);\n })\n .catch(() => {\n if (active) setStatus('prompt');\n });\n\n return () => {\n active = false;\n if (permStatus) permStatus.onchange = null;\n };\n }, []);\n\n const requestPermission = useCallback(async () => {\n const nav = typeof navigator !== 'undefined' ? navigator : undefined;\n if (!nav?.mediaDevices?.getUserMedia) {\n setStatus('unsupported');\n return false;\n }\n try {\n const stream = await nav.mediaDevices.getUserMedia({ audio: true });\n stream.getTracks().forEach((track) => track.stop());\n setStatus('granted');\n return true;\n } catch (error) {\n // getUserMedia rejeita com uma DOMException cujo `name` diz o motivo. Só é\n // rejeição de permissão de fato em NotAllowedError/SecurityError (e o\n // legado PermissionDeniedError) → 'denied'. Falhas de hardware\n // (NotFoundError sem mic, NotReadableError mic ocupado) ou transitórias\n // (AbortError) NÃO são negação: voltam pro fallback 'prompt' pra permitir\n // nova tentativa, sem travar o usuário num falso 'denied'.\n const errorName = (error as { name?: unknown } | undefined)?.name;\n const isDenial =\n errorName === 'NotAllowedError' ||\n errorName === 'SecurityError' ||\n errorName === 'PermissionDeniedError';\n setStatus(isDenial ? 'denied' : 'prompt');\n return false;\n }\n }, []);\n\n return {\n status,\n isGranted: status === 'granted',\n isSupported: status !== 'unsupported',\n shouldAsk: status === 'prompt' || status === 'denied',\n requestPermission,\n };\n}\n","import { useEffect } from 'react';\n\n/**\n * Trava o scroll do `body` enquanto um modal está aberto, com contagem de\n * referências compartilhada entre TODOS os modais da lib.\n *\n * O primeiro modal a travar salva os estilos originais do `body`, aplica\n * `overflow: hidden`, compensa o sumiço da scrollbar com `padding-right` e cria\n * um overlay (`#modal-scrollbar-overlay`) cobrindo essa faixa com a cor do\n * backdrop. Modais abertos ao mesmo tempo apenas incrementam o contador; só\n * quando o ÚLTIMO fecha os estilos originais são restaurados — assim fechar um\n * modal não devolve o scroll do body enquanto outro continua aberto.\n */\nconst SCROLLBAR_OVERLAY_ID = 'modal-scrollbar-overlay';\n\nlet lockCount = 0;\nlet originalOverflow = '';\nlet originalPaddingRight = '';\n\nconst applyLock = () => {\n // Mede a scrollbar antes de esconder o overflow.\n const scrollbarWidth =\n window.innerWidth - document.documentElement.clientWidth;\n\n originalOverflow = document.body.style.overflow;\n originalPaddingRight = document.body.style.paddingRight;\n\n document.body.style.overflow = 'hidden';\n\n // Compensa a scrollbar que some pra não deslocar o layout.\n if (scrollbarWidth > 0) {\n // Soma à padding-right JÁ existente (inline ou de folha de estilo) em vez de\n // substituí-la — senão o espaçamento original do body seria descartado. O\n // valor inline original fica salvo em `originalPaddingRight` pra restaurar.\n const currentPaddingRight =\n Number.parseFloat(window.getComputedStyle(document.body).paddingRight) ||\n 0;\n document.body.style.paddingRight = `${currentPaddingRight + scrollbarWidth}px`;\n\n const overlay = document.createElement('div');\n overlay.id = SCROLLBAR_OVERLAY_ID;\n overlay.style.cssText = `\n position: fixed;\n top: 0;\n right: 0;\n width: ${scrollbarWidth}px;\n height: 100vh;\n background-color: rgb(0 0 0 / 0.6);\n z-index: 40;\n pointer-events: none;\n `;\n document.body.appendChild(overlay);\n }\n};\n\nconst releaseLock = () => {\n document.body.style.overflow = originalOverflow;\n document.body.style.paddingRight = originalPaddingRight;\n\n const overlay = document.getElementById(SCROLLBAR_OVERLAY_ID);\n if (overlay) {\n overlay.remove();\n }\n};\n\n/**\n * @param locked - Trava o scroll enquanto `true`. Normalmente `isOpen`.\n */\nexport const useBodyScrollLock = (locked: boolean) => {\n useEffect(() => {\n if (!locked) return;\n\n if (lockCount === 0) applyLock();\n lockCount += 1;\n\n return () => {\n lockCount -= 1;\n if (lockCount === 0) releaseLock();\n };\n }, [locked]);\n};\n"],"mappings":"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","names":["useCallback","useEffect","useId","useState","jsx","jsx","jsx","jsx","jsx","jsxs","useId","jsx","jsxs","jsx","useEffect","jsx","jsxs","useId","useState","useCallback","useId","jsx","jsxs","useState","useEffect","jsx","jsxs","useId","jsx","jsxs"]}
|
package/dist/chunk-PJOBOBNJ.js
DELETED
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
|
-
|
|
3
|
-
var _chunkANT66KVKjs = require('./chunk-ANT66KVK.js');
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
var _chunkTN3AYOMVjs = require('./chunk-TN3AYOMV.js');
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
var _chunkFPOKJGC6js = require('./chunk-FPOKJGC6.js');
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
var _chunk726PIA5Mjs = require('./chunk-726PIA5M.js');
|
|
13
|
-
|
|
14
|
-
// src/components/QuizTimer/QuizTimer.tsx
|
|
15
|
-
var _Clock = require('@phosphor-icons/react/dist/csr/Clock');
|
|
16
|
-
var _react = require('react');
|
|
17
|
-
var _jsxruntime = require('react/jsx-runtime');
|
|
18
|
-
var QuizTimer = _react.forwardRef.call(void 0,
|
|
19
|
-
({ className, ...props }, ref) => {
|
|
20
|
-
const { timeElapsed, isTimeExceeded } = _chunk726PIA5Mjs.useQuizStore.call(void 0, );
|
|
21
|
-
const exceeded = isTimeExceeded();
|
|
22
|
-
const formatted = _chunkFPOKJGC6js.formatTimeSpent.call(void 0, timeElapsed);
|
|
23
|
-
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
24
|
-
"div",
|
|
25
|
-
{
|
|
26
|
-
ref,
|
|
27
|
-
role: "timer",
|
|
28
|
-
"aria-live": "off",
|
|
29
|
-
"aria-label": `Tempo de prova: ${formatted}${exceeded ? " \u2014 tempo excedido" : ""}`,
|
|
30
|
-
className: _chunkTN3AYOMVjs.cn.call(void 0,
|
|
31
|
-
"inline-flex flex-row items-center gap-1 tabular-nums",
|
|
32
|
-
"rounded-md border px-2 py-1",
|
|
33
|
-
exceeded ? "bg-error-background border-error-300 text-error-700" : "bg-info border-info-300 text-info-800",
|
|
34
|
-
className
|
|
35
|
-
),
|
|
36
|
-
...props,
|
|
37
|
-
children: [
|
|
38
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _Clock.ClockIcon, { size: 16, weight: exceeded ? "fill" : "regular" }),
|
|
39
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkANT66KVKjs.Text_default, { as: "span", size: "sm", weight: "medium", color: "", children: formatted })
|
|
40
|
-
]
|
|
41
|
-
}
|
|
42
|
-
);
|
|
43
|
-
}
|
|
44
|
-
);
|
|
45
|
-
QuizTimer.displayName = "QuizTimer";
|
|
46
|
-
var QuizTimer_default = QuizTimer;
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
exports.QuizTimer_default = QuizTimer_default;
|
|
51
|
-
//# sourceMappingURL=chunk-PJOBOBNJ.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-PJOBOBNJ.js","../src/components/QuizTimer/QuizTimer.tsx"],"names":[],"mappings":"AAAA;AACE;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACA;ACbA,6DAA0B;AAC1B,8BAA2B;AAyBrB,+CAAA;AAPN,IAAM,UAAA,EAAY,+BAAA;AAAA,EAChB,CAAC,EAAE,SAAA,EAAW,GAAG,MAAM,CAAA,EAAG,GAAA,EAAA,GAAQ;AAChC,IAAA,MAAM,EAAE,WAAA,EAAa,eAAe,EAAA,EAAI,2CAAA,CAAa;AACrD,IAAA,MAAM,SAAA,EAAW,cAAA,CAAe,CAAA;AAChC,IAAA,MAAM,UAAA,EAAY,8CAAA,WAA2B,CAAA;AAE7C,IAAA,uBACE,8BAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,IAAA,EAAK,OAAA;AAAA,QACL,WAAA,EAAU,KAAA;AAAA,QACV,YAAA,EAAY,CAAA,gBAAA,EAAmB,SAAS,CAAA,EAAA;AAC7B,QAAA;AACT,UAAA;AACA,UAAA;AAEI,UAAA;AAEJ,UAAA;AACF,QAAA;AACI,QAAA;AAEJ,QAAA;AAAiB,0BAAA;AACR,0BAAA;AAET,QAAA;AAAA,MAAA;AACF,IAAA;AAEJ,EAAA;AACF;AAEwB;AAET;ADNoC;AACA;AACA;AACA","file":"/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-PJOBOBNJ.js","sourcesContent":[null,"import { ClockIcon } from '@phosphor-icons/react/dist/csr/Clock';\nimport { forwardRef } from 'react';\nimport { useQuizStore } from '../Quiz/useQuizStore';\nimport { formatTimeSpent } from '../../utils/activityDetailsUtils';\nimport { cn } from '../../utils/utils';\nimport Text from '../Text/Text';\n\nexport interface QuizTimerProps {\n className?: string;\n}\n\n/**\n * Progressive exam stopwatch, driven entirely by the quiz store.\n *\n * Presentational only: the counting, the pausing and the resume seed all live\n * in `useQuizStore`. Once the configured warning threshold is passed the\n * display turns red and keeps going — going over time is reported, never\n * enforced.\n */\nconst QuizTimer = forwardRef<HTMLDivElement, QuizTimerProps>(\n ({ className, ...props }, ref) => {\n const { timeElapsed, isTimeExceeded } = useQuizStore();\n const exceeded = isTimeExceeded();\n const formatted = formatTimeSpent(timeElapsed);\n\n return (\n <div\n ref={ref}\n role=\"timer\"\n aria-live=\"off\"\n aria-label={`Tempo de prova: ${formatted}${exceeded ? ' — tempo excedido' : ''}`}\n className={cn(\n 'inline-flex flex-row items-center gap-1 tabular-nums',\n 'rounded-md border px-2 py-1',\n exceeded\n ? 'bg-error-background border-error-300 text-error-700'\n : 'bg-info border-info-300 text-info-800',\n className\n )}\n {...props}\n >\n <ClockIcon size={16} weight={exceeded ? 'fill' : 'regular'} />\n <Text as=\"span\" size=\"sm\" weight=\"medium\" color=\"\">\n {formatted}\n </Text>\n </div>\n );\n }\n);\n\nQuizTimer.displayName = 'QuizTimer';\n\nexport default QuizTimer;\n"]}
|