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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-6ALEXGAN.js","../src/components/StudentLessonProgressModal/StudentLessonProgressModal.tsx","../src/components/StudentLessonProgressModal/lessonProgress.ts"],"names":[],"mappings":"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","file":"/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-6ALEXGAN.js","sourcesContent":[null,"import { useMemo, useState, type ReactNode } from 'react';\nimport { XCircleIcon } from '@phosphor-icons/react/dist/csr/XCircle';\nimport { MedalIcon } from '@phosphor-icons/react/dist/csr/Medal';\nimport { SealWarningIcon } from '@phosphor-icons/react/dist/csr/SealWarning';\nimport { CaretRightIcon } from '@phosphor-icons/react/dist/csr/CaretRight';\nimport Modal from '../Modal/Modal';\nimport Text from '../Text/Text';\nimport ProgressBar from '../ProgressBar/ProgressBar';\nimport ProgressCircle from '../ProgressCircle/ProgressCircle';\nimport { CardActivitiesResults } from '../Card/Card';\nimport { UserIcon } from '../UserIcon/UserIcon';\nimport {\n Skeleton,\n SkeletonCircle,\n SkeletonRounded,\n} from '../Skeleton/Skeleton';\nimport type {\n StudentLessonProgressModalProps,\n StudentLessonProgressData,\n StudentLessonProgressLabels,\n TopicProgressItem,\n SubtopicProgressItem,\n ContentProgressItem,\n} from './types';\nimport { DEFAULT_LESSON_PROGRESS_LABELS } from './types';\nimport { hasContentData, roundProgress } from './lessonProgress';\nimport { cn } from '../../utils/utils';\n\n/**\n * Value line of the two highlight cards: 20px as designed, wrapping onto a\n * second line instead of being cut — a topic name is what the teacher came\n * to read, so an ellipsis would hide the point of the card.\n */\nconst HIGHLIGHT_VALUE_CLASS =\n 'text-xl leading-6 whitespace-normal text-clip line-clamp-2';\n\n/**\n * Body of an expandable row.\n *\n * Animates through `grid-template-rows` (0fr → 1fr), so the open height is the\n * content's own — a `max-h` cap would clip a long list of lessons behind\n * `overflow-hidden` with no way to reach the rest. While collapsed it is both\n * hidden from assistive technology and `inert`: the subtopic buttons inside a\n * topic stay mounted, and `aria-hidden` alone would leave them focusable.\n */\nconst Collapsible = ({\n expanded,\n testId,\n children,\n}: {\n expanded: boolean;\n testId: string;\n children: ReactNode;\n}) => (\n <div\n data-testid={testId}\n data-expanded={expanded}\n aria-hidden={!expanded}\n inert={!expanded}\n className={cn(\n 'grid transition-[grid-template-rows,opacity] duration-300 ease-in-out',\n expanded ? 'grid-rows-[1fr] opacity-100' : 'grid-rows-[0fr] opacity-0'\n )}\n >\n <div className=\"min-h-0 overflow-hidden\">{children}</div>\n </div>\n);\n\n/** Caret of an expandable row, turned down while it is open. */\nconst Caret = ({ expanded }: { expanded: boolean }) => (\n <CaretRightIcon\n size={18}\n className={cn(\n 'shrink-0 text-text-950 transition-transform duration-200',\n expanded ? 'rotate-90' : 'rotate-0'\n )}\n />\n);\n\n/** Percentage at the end of a row, rounded as every level draws it. */\nconst ProgressPercent = ({\n progress,\n className,\n}: {\n progress: number;\n className: string;\n}) => (\n <Text\n as=\"span\"\n size=\"xs\"\n weight=\"semibold\"\n className={cn('shrink-0 text-center', className)}\n >\n {roundProgress(progress)}%\n </Text>\n);\n\n/** Row of one lesson (content), the deepest level of the list. */\nconst ContentRow = ({\n item,\n noDataMessage,\n}: {\n item: ContentProgressItem;\n noDataMessage: string;\n}) => (\n <div className=\"flex items-center gap-4 border-t border-border-200 px-4 py-3\">\n <Text size=\"sm\" weight=\"medium\" className=\"min-w-0 flex-1 text-text-950\">\n {item.content.name}\n </Text>\n {hasContentData(item) ? (\n <ProgressPercent progress={item.progress} className=\"text-text-600\" />\n ) : (\n <Text size=\"xs\" className=\"shrink-0 text-text-500\">\n {noDataMessage}\n </Text>\n )}\n </div>\n);\n\n/**\n * Bordered card of one subtopic; its lessons list inside it, one row each,\n * once it is expanded.\n */\nconst SubtopicCard = ({\n item,\n noDataMessage,\n}: {\n item: SubtopicProgressItem;\n noDataMessage: string;\n}) => {\n const [isExpanded, setIsExpanded] = useState(false);\n const hasChildren = item.contents.length > 0;\n const hasNoData = item.status === 'no_data';\n\n return (\n <div className=\"flex flex-col rounded-xl border border-border-200 bg-background\">\n <button\n type=\"button\"\n onClick={() => hasChildren && setIsExpanded(!isExpanded)}\n disabled={!hasChildren}\n className={cn(\n 'flex w-full items-center gap-4 rounded-xl p-4 text-left',\n 'focus:outline-none focus:ring-2 focus:ring-inset focus:ring-primary-950',\n hasChildren ? 'cursor-pointer' : 'cursor-default'\n )}\n aria-expanded={hasChildren ? isExpanded : undefined}\n >\n <Text size=\"sm\" weight=\"bold\" className=\"min-w-0 flex-1 text-text-950\">\n {item.subtopic.name}\n </Text>\n {hasNoData ? (\n <Text size=\"xs\" className=\"shrink-0 text-text-500\">\n {noDataMessage}\n </Text>\n ) : (\n <ProgressPercent progress={item.progress} className=\"text-text-600\" />\n )}\n {hasChildren && <Caret expanded={isExpanded} />}\n </button>\n\n {hasChildren && (\n <Collapsible\n expanded={isExpanded}\n testId={`accordion-content-subtopic-${item.subtopic.id}`}\n >\n {item.contents.map((content) => (\n <ContentRow\n key={content.content.id}\n item={content}\n noDataMessage={noDataMessage}\n />\n ))}\n </Collapsible>\n )}\n </div>\n );\n};\n\n/**\n * Card of one topic: bold name, then a green bar with its percentage — or the\n * no-data message when nothing was measured yet. Its subtopic cards render\n * inside the card, under the header, once it is expanded.\n */\nconst TopicCard = ({\n item,\n noDataMessage,\n}: {\n item: TopicProgressItem;\n noDataMessage: string;\n}) => {\n const [isExpanded, setIsExpanded] = useState(false);\n const hasChildren = item.subtopics.length > 0;\n const hasNoData = item.status === 'no_data';\n\n return (\n <div\n data-testid={`lesson-item-${item.topic.id}`}\n className=\"flex flex-col rounded-xl bg-background\"\n >\n <button\n type=\"button\"\n onClick={() => hasChildren && setIsExpanded(!isExpanded)}\n disabled={!hasChildren}\n className={cn(\n 'flex w-full items-center gap-2 rounded-xl p-4 text-left',\n 'focus:outline-none focus:ring-2 focus:ring-inset focus:ring-primary-950',\n hasChildren ? 'cursor-pointer' : 'cursor-default'\n )}\n aria-expanded={hasChildren ? isExpanded : undefined}\n >\n <div className=\"flex min-w-0 flex-1 flex-col gap-2\">\n <Text size=\"lg\" weight=\"bold\" className=\"text-text-950\">\n {item.topic.name}\n </Text>\n {hasNoData ? (\n <Text size=\"xs\" className=\"text-text-500\">\n {noDataMessage}\n </Text>\n ) : (\n <div className=\"flex items-center gap-2\">\n <div className=\"flex-1\">\n <ProgressBar\n value={item.progress}\n variant=\"green\"\n size=\"medium\"\n />\n </div>\n <ProgressPercent\n progress={item.progress}\n className=\"text-text-950\"\n />\n </div>\n )}\n </div>\n {hasChildren && <Caret expanded={isExpanded} />}\n </button>\n\n {hasChildren && (\n <Collapsible\n expanded={isExpanded}\n testId={`accordion-content-${item.topic.id}`}\n >\n <div className=\"flex flex-col gap-2 px-4 pb-4\">\n {item.subtopics.map((subtopic) => (\n <SubtopicCard\n key={subtopic.subtopic.id}\n item={subtopic}\n noDataMessage={noDataMessage}\n />\n ))}\n </div>\n </Collapsible>\n )}\n </div>\n );\n};\n\n/**\n * Loading skeleton for the modal content\n */\nconst LoadingSkeleton = () => (\n <div data-testid=\"lesson-progress-skeleton\" className=\"flex flex-col gap-4\">\n <Skeleton variant=\"text\" width=\"12rem\" height={24} />\n <div className=\"flex flex-row gap-3\">\n <SkeletonCircle width={107} height={107} />\n <SkeletonRounded className=\"flex-1\" height={107} />\n <SkeletonRounded className=\"flex-1\" height={107} />\n </div>\n <Skeleton variant=\"text\" width=\"9rem\" height={24} className=\"mt-4\" />\n <div className=\"flex flex-col gap-2\">\n <SkeletonRounded height={80} />\n <SkeletonRounded height={80} />\n <SkeletonRounded height={80} />\n </div>\n </div>\n);\n\n/**\n * Error state component\n */\nconst ErrorContent = ({\n message,\n prefix,\n}: {\n message: string;\n prefix?: string;\n}) => (\n <div className=\"flex flex-col items-center justify-center py-8 gap-3\">\n <Text\n as=\"span\"\n className=\"size-12 rounded-full bg-error-100 flex items-center justify-center\"\n >\n <XCircleIcon size={24} className=\"text-error-700\" weight=\"fill\" />\n </Text>\n <Text size=\"md\" className=\"text-error-700 text-center\">\n {prefix ? `${prefix}: ${message}` : message}\n </Text>\n </div>\n);\n\n/**\n * Progress content when data is available\n */\nconst ProgressContent = ({\n data,\n labels,\n}: {\n data: StudentLessonProgressData;\n labels: StudentLessonProgressLabels;\n}) => (\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex items-center gap-2 pt-2\">\n <UserIcon size={24} className=\"shrink-0\" />\n <Text size=\"md\" className=\"text-text-950\">\n {data.name}\n </Text>\n </div>\n\n <div className=\"grid grid-cols-3 gap-2\">\n <div className=\"flex items-center justify-center rounded-xl border border-border-100 bg-background p-2\">\n <ProgressCircle\n value={data.overallCompletionRate}\n variant=\"green\"\n size=\"small\"\n label={labels.completionRateLabel}\n showPercentage\n />\n </div>\n\n <CardActivitiesResults\n icon={\n <MedalIcon size={16} weight=\"regular\" className=\"text-text-950\" />\n }\n title={labels.bestResultLabel}\n subTitle={data.bestResult || '-'}\n subTitleClassName={HIGHLIGHT_VALUE_CLASS}\n header=\"\"\n action=\"success\"\n />\n\n <CardActivitiesResults\n icon={\n <SealWarningIcon size={16} weight=\"regular\" className=\"text-white\" />\n }\n title={labels.biggestDifficultyLabel}\n subTitle={data.biggestDifficulty || '-'}\n subTitleClassName={HIGHLIGHT_VALUE_CLASS}\n header=\"\"\n action=\"error\"\n />\n </div>\n\n {data.lessonProgress.length > 0 && (\n <div className=\"flex flex-col gap-4 pt-4\">\n <Text size=\"lg\" weight=\"bold\" className=\"text-text-950\">\n {labels.lessonProgressTitle}\n </Text>\n <div className=\"flex flex-col gap-2\">\n {data.lessonProgress.map((topic) => (\n <TopicCard\n key={topic.topic.id}\n item={topic}\n noDataMessage={labels.noDataMessage}\n />\n ))}\n </div>\n </div>\n )}\n </div>\n);\n\n/**\n * Renders the modal content based on loading, error, and data state\n */\nconst renderModalContent = (\n loading: boolean,\n error: string | null | undefined,\n data: StudentLessonProgressData | null,\n labels: StudentLessonProgressLabels\n): ReactNode => {\n if (loading) {\n return <LoadingSkeleton />;\n }\n\n if (error) {\n return <ErrorContent message={error} prefix={labels.errorMessagePrefix} />;\n }\n\n if (data) {\n return <ProgressContent data={data} labels={labels} />;\n }\n\n return null;\n};\n\n/**\n * StudentLessonProgressModal component\n *\n * Displays a modal with student lesson progress information including:\n * - Student name with profile icon\n * - Completion rate circle\n * - Best result and biggest difficulty highlight cards\n * - Expandable nested list of lesson progress: topic → subtopic → lesson,\n * with the topics of every requested subject in one trail-ordered list\n *\n * Without data, loading or error the component renders nothing.\n */\nexport const StudentLessonProgressModal = ({\n isOpen,\n onClose,\n data,\n loading = false,\n error = null,\n labels: customLabels,\n}: StudentLessonProgressModalProps) => {\n const labels = useMemo(\n () => ({ ...DEFAULT_LESSON_PROGRESS_LABELS, ...customLabels }),\n [customLabels]\n );\n\n const content = renderModalContent(loading, error, data, labels);\n\n if (!content) {\n return null;\n }\n\n return (\n <Modal\n isOpen={isOpen}\n onClose={onClose}\n title={labels.title}\n size=\"lg\"\n contentClassName=\"max-h-[80vh] overflow-y-auto\"\n >\n {content}\n </Modal>\n );\n};\n\nexport default StudentLessonProgressModal;\n","import type { ContentProgressItem } from './types';\n\n/**\n * Reading rules of the accordion rows. Pure, no React.\n */\n\n/**\n * Whether a lesson has progress to show.\n *\n * The deepest level decides differently from the two above it: topic and\n * subtopic carry a `status`, while `ContentProgressItem` only has `progress`\n * and `isCompleted`, so \"no data\" is inferred from zero progress on a lesson\n * not completed. `isCompleted` matters because a completed lesson with zero\n * progress exists in the type, and for it the row shows \"0%\", not the\n * no-data message.\n */\nexport const hasContentData = (item: ContentProgressItem): boolean =>\n item.progress !== 0 || item.isCompleted;\n\n/**\n * Rounding of the percentage, as every level of the accordion draws it.\n */\nexport const roundProgress = (progress: number): number => Math.round(progress);\n"]}
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-6U4AI5SE.js","../src/components/StudentLessonProgressModal/StudentLessonProgressModal.tsx","../src/components/StudentLessonProgressModal/lessonProgress.ts"],"names":[],"mappings":"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","file":"/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-6U4AI5SE.js","sourcesContent":[null,"import { useMemo, useState, type ReactNode } from 'react';\nimport { XCircleIcon } from '@phosphor-icons/react/dist/csr/XCircle';\nimport { MedalIcon } from '@phosphor-icons/react/dist/csr/Medal';\nimport { SealWarningIcon } from '@phosphor-icons/react/dist/csr/SealWarning';\nimport { CaretRightIcon } from '@phosphor-icons/react/dist/csr/CaretRight';\nimport Modal from '../Modal/Modal';\nimport Text from '../Text/Text';\nimport ProgressBar from '../ProgressBar/ProgressBar';\nimport ProgressCircle from '../ProgressCircle/ProgressCircle';\nimport { CardActivitiesResults } from '../Card/Card';\nimport { UserIcon } from '../UserIcon/UserIcon';\nimport {\n Skeleton,\n SkeletonCircle,\n SkeletonRounded,\n} from '../Skeleton/Skeleton';\nimport type {\n StudentLessonProgressModalProps,\n StudentLessonProgressData,\n StudentLessonProgressLabels,\n TopicProgressItem,\n SubtopicProgressItem,\n ContentProgressItem,\n} from './types';\nimport { DEFAULT_LESSON_PROGRESS_LABELS } from './types';\nimport { hasContentData, roundProgress } from './lessonProgress';\nimport { cn } from '../../utils/utils';\n\n/**\n * Value line of the two highlight cards: 20px as designed, wrapping onto a\n * second line instead of being cut — a topic name is what the teacher came\n * to read, so an ellipsis would hide the point of the card.\n */\nconst HIGHLIGHT_VALUE_CLASS =\n 'text-xl leading-6 whitespace-normal text-clip line-clamp-2';\n\n/**\n * Body of an expandable row.\n *\n * Animates through `grid-template-rows` (0fr → 1fr), so the open height is the\n * content's own — a `max-h` cap would clip a long list of lessons behind\n * `overflow-hidden` with no way to reach the rest. While collapsed it is both\n * hidden from assistive technology and `inert`: the subtopic buttons inside a\n * topic stay mounted, and `aria-hidden` alone would leave them focusable.\n */\nconst Collapsible = ({\n expanded,\n testId,\n children,\n}: {\n expanded: boolean;\n testId: string;\n children: ReactNode;\n}) => (\n <div\n data-testid={testId}\n data-expanded={expanded}\n aria-hidden={!expanded}\n inert={!expanded}\n className={cn(\n 'grid transition-[grid-template-rows,opacity] duration-300 ease-in-out',\n expanded ? 'grid-rows-[1fr] opacity-100' : 'grid-rows-[0fr] opacity-0'\n )}\n >\n <div className=\"min-h-0 overflow-hidden\">{children}</div>\n </div>\n);\n\n/** Caret of an expandable row, turned down while it is open. */\nconst Caret = ({ expanded }: { expanded: boolean }) => (\n <CaretRightIcon\n size={18}\n className={cn(\n 'shrink-0 text-text-950 transition-transform duration-200',\n expanded ? 'rotate-90' : 'rotate-0'\n )}\n />\n);\n\n/** Percentage at the end of a row, rounded as every level draws it. */\nconst ProgressPercent = ({\n progress,\n className,\n}: {\n progress: number;\n className: string;\n}) => (\n <Text\n as=\"span\"\n size=\"xs\"\n weight=\"semibold\"\n className={cn('shrink-0 text-center', className)}\n >\n {roundProgress(progress)}%\n </Text>\n);\n\n/** Row of one lesson (content), the deepest level of the list. */\nconst ContentRow = ({\n item,\n noDataMessage,\n}: {\n item: ContentProgressItem;\n noDataMessage: string;\n}) => (\n <div className=\"flex items-center gap-4 border-t border-border-200 px-4 py-3\">\n <Text size=\"sm\" weight=\"medium\" className=\"min-w-0 flex-1 text-text-950\">\n {item.content.name}\n </Text>\n {hasContentData(item) ? (\n <ProgressPercent progress={item.progress} className=\"text-text-600\" />\n ) : (\n <Text size=\"xs\" className=\"shrink-0 text-text-500\">\n {noDataMessage}\n </Text>\n )}\n </div>\n);\n\n/**\n * Bordered card of one subtopic; its lessons list inside it, one row each,\n * once it is expanded.\n */\nconst SubtopicCard = ({\n item,\n noDataMessage,\n}: {\n item: SubtopicProgressItem;\n noDataMessage: string;\n}) => {\n const [isExpanded, setIsExpanded] = useState(false);\n const hasChildren = item.contents.length > 0;\n const hasNoData = item.status === 'no_data';\n\n return (\n <div className=\"flex flex-col rounded-xl border border-border-200 bg-background\">\n <button\n type=\"button\"\n onClick={() => hasChildren && setIsExpanded(!isExpanded)}\n disabled={!hasChildren}\n className={cn(\n 'flex w-full items-center gap-4 rounded-xl p-4 text-left',\n 'focus:outline-none focus:ring-2 focus:ring-inset focus:ring-primary-950',\n hasChildren ? 'cursor-pointer' : 'cursor-default'\n )}\n aria-expanded={hasChildren ? isExpanded : undefined}\n >\n <Text size=\"sm\" weight=\"bold\" className=\"min-w-0 flex-1 text-text-950\">\n {item.subtopic.name}\n </Text>\n {hasNoData ? (\n <Text size=\"xs\" className=\"shrink-0 text-text-500\">\n {noDataMessage}\n </Text>\n ) : (\n <ProgressPercent progress={item.progress} className=\"text-text-600\" />\n )}\n {hasChildren && <Caret expanded={isExpanded} />}\n </button>\n\n {hasChildren && (\n <Collapsible\n expanded={isExpanded}\n testId={`accordion-content-subtopic-${item.subtopic.id}`}\n >\n {item.contents.map((content) => (\n <ContentRow\n key={content.content.id}\n item={content}\n noDataMessage={noDataMessage}\n />\n ))}\n </Collapsible>\n )}\n </div>\n );\n};\n\n/**\n * Card of one topic: bold name, then a green bar with its percentage — or the\n * no-data message when nothing was measured yet. Its subtopic cards render\n * inside the card, under the header, once it is expanded.\n */\nconst TopicCard = ({\n item,\n noDataMessage,\n}: {\n item: TopicProgressItem;\n noDataMessage: string;\n}) => {\n const [isExpanded, setIsExpanded] = useState(false);\n const hasChildren = item.subtopics.length > 0;\n const hasNoData = item.status === 'no_data';\n\n return (\n <div\n data-testid={`lesson-item-${item.topic.id}`}\n className=\"flex flex-col rounded-xl bg-background\"\n >\n <button\n type=\"button\"\n onClick={() => hasChildren && setIsExpanded(!isExpanded)}\n disabled={!hasChildren}\n className={cn(\n 'flex w-full items-center gap-2 rounded-xl p-4 text-left',\n 'focus:outline-none focus:ring-2 focus:ring-inset focus:ring-primary-950',\n hasChildren ? 'cursor-pointer' : 'cursor-default'\n )}\n aria-expanded={hasChildren ? isExpanded : undefined}\n >\n <div className=\"flex min-w-0 flex-1 flex-col gap-2\">\n <Text size=\"lg\" weight=\"bold\" className=\"text-text-950\">\n {item.topic.name}\n </Text>\n {hasNoData ? (\n <Text size=\"xs\" className=\"text-text-500\">\n {noDataMessage}\n </Text>\n ) : (\n <div className=\"flex items-center gap-2\">\n <div className=\"flex-1\">\n <ProgressBar\n value={item.progress}\n variant=\"green\"\n size=\"medium\"\n />\n </div>\n <ProgressPercent\n progress={item.progress}\n className=\"text-text-950\"\n />\n </div>\n )}\n </div>\n {hasChildren && <Caret expanded={isExpanded} />}\n </button>\n\n {hasChildren && (\n <Collapsible\n expanded={isExpanded}\n testId={`accordion-content-${item.topic.id}`}\n >\n <div className=\"flex flex-col gap-2 px-4 pb-4\">\n {item.subtopics.map((subtopic) => (\n <SubtopicCard\n key={subtopic.subtopic.id}\n item={subtopic}\n noDataMessage={noDataMessage}\n />\n ))}\n </div>\n </Collapsible>\n )}\n </div>\n );\n};\n\n/**\n * Loading skeleton for the modal content\n */\nconst LoadingSkeleton = () => (\n <div data-testid=\"lesson-progress-skeleton\" className=\"flex flex-col gap-4\">\n <Skeleton variant=\"text\" width=\"12rem\" height={24} />\n <div className=\"flex flex-row gap-3\">\n <SkeletonCircle width={107} height={107} />\n <SkeletonRounded className=\"flex-1\" height={107} />\n <SkeletonRounded className=\"flex-1\" height={107} />\n </div>\n <Skeleton variant=\"text\" width=\"9rem\" height={24} className=\"mt-4\" />\n <div className=\"flex flex-col gap-2\">\n <SkeletonRounded height={80} />\n <SkeletonRounded height={80} />\n <SkeletonRounded height={80} />\n </div>\n </div>\n);\n\n/**\n * Error state component\n */\nconst ErrorContent = ({\n message,\n prefix,\n}: {\n message: string;\n prefix?: string;\n}) => (\n <div className=\"flex flex-col items-center justify-center py-8 gap-3\">\n <Text\n as=\"span\"\n className=\"size-12 rounded-full bg-error-100 flex items-center justify-center\"\n >\n <XCircleIcon size={24} className=\"text-error-700\" weight=\"fill\" />\n </Text>\n <Text size=\"md\" className=\"text-error-700 text-center\">\n {prefix ? `${prefix}: ${message}` : message}\n </Text>\n </div>\n);\n\n/**\n * Progress content when data is available\n */\nconst ProgressContent = ({\n data,\n labels,\n}: {\n data: StudentLessonProgressData;\n labels: StudentLessonProgressLabels;\n}) => (\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex items-center gap-2 pt-2\">\n <UserIcon size={24} className=\"shrink-0\" />\n <Text size=\"md\" className=\"text-text-950\">\n {data.name}\n </Text>\n </div>\n\n <div className=\"grid grid-cols-3 gap-2\">\n <div className=\"flex items-center justify-center rounded-xl border border-border-100 bg-background p-2\">\n <ProgressCircle\n value={data.overallCompletionRate}\n variant=\"green\"\n size=\"small\"\n label={labels.completionRateLabel}\n showPercentage\n />\n </div>\n\n <CardActivitiesResults\n icon={\n <MedalIcon size={16} weight=\"regular\" className=\"text-text-950\" />\n }\n title={labels.bestResultLabel}\n subTitle={data.bestResult || '-'}\n subTitleClassName={HIGHLIGHT_VALUE_CLASS}\n header=\"\"\n action=\"success\"\n />\n\n <CardActivitiesResults\n icon={\n <SealWarningIcon size={16} weight=\"regular\" className=\"text-white\" />\n }\n title={labels.biggestDifficultyLabel}\n subTitle={data.biggestDifficulty || '-'}\n subTitleClassName={HIGHLIGHT_VALUE_CLASS}\n header=\"\"\n action=\"error\"\n />\n </div>\n\n {data.lessonProgress.length > 0 && (\n <div className=\"flex flex-col gap-4 pt-4\">\n <Text size=\"lg\" weight=\"bold\" className=\"text-text-950\">\n {labels.lessonProgressTitle}\n </Text>\n <div className=\"flex flex-col gap-2\">\n {data.lessonProgress.map((topic) => (\n <TopicCard\n key={topic.topic.id}\n item={topic}\n noDataMessage={labels.noDataMessage}\n />\n ))}\n </div>\n </div>\n )}\n </div>\n);\n\n/**\n * Renders the modal content based on loading, error, and data state\n */\nconst renderModalContent = (\n loading: boolean,\n error: string | null | undefined,\n data: StudentLessonProgressData | null,\n labels: StudentLessonProgressLabels\n): ReactNode => {\n if (loading) {\n return <LoadingSkeleton />;\n }\n\n if (error) {\n return <ErrorContent message={error} prefix={labels.errorMessagePrefix} />;\n }\n\n if (data) {\n return <ProgressContent data={data} labels={labels} />;\n }\n\n return null;\n};\n\n/**\n * StudentLessonProgressModal component\n *\n * Displays a modal with student lesson progress information including:\n * - Student name with profile icon\n * - Completion rate circle\n * - Best result and biggest difficulty highlight cards\n * - Expandable nested list of lesson progress: topic → subtopic → lesson,\n * with the topics of every requested subject in one trail-ordered list\n *\n * Without data, loading or error the component renders nothing.\n */\nexport const StudentLessonProgressModal = ({\n isOpen,\n onClose,\n data,\n loading = false,\n error = null,\n labels: customLabels,\n}: StudentLessonProgressModalProps) => {\n const labels = useMemo(\n () => ({ ...DEFAULT_LESSON_PROGRESS_LABELS, ...customLabels }),\n [customLabels]\n );\n\n const content = renderModalContent(loading, error, data, labels);\n\n if (!content) {\n return null;\n }\n\n return (\n <Modal\n isOpen={isOpen}\n onClose={onClose}\n title={labels.title}\n size=\"lg\"\n contentClassName=\"max-h-[80vh] overflow-y-auto\"\n >\n {content}\n </Modal>\n );\n};\n\nexport default StudentLessonProgressModal;\n","import type { ContentProgressItem } from './types';\n\n/**\n * Reading rules of the accordion rows. Pure, no React.\n */\n\n/**\n * Whether a lesson has progress to show.\n *\n * The deepest level decides differently from the two above it: topic and\n * subtopic carry a `status`, while `ContentProgressItem` only has `progress`\n * and `isCompleted`, so \"no data\" is inferred from zero progress on a lesson\n * not completed. `isCompleted` matters because a completed lesson with zero\n * progress exists in the type, and for it the row shows \"0%\", not the\n * no-data message.\n */\nexport const hasContentData = (item: ContentProgressItem): boolean =>\n item.progress !== 0 || item.isCompleted;\n\n/**\n * Rounding of the percentage, as every level of the accordion draws it.\n */\nexport const roundProgress = (progress: number): number => Math.round(progress);\n"]}
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
} from "./chunk-IVPVR5IM.mjs";
|
|
4
4
|
import {
|
|
5
5
|
CardActivitiesResults
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-DXYSEBK3.mjs";
|
|
7
7
|
import {
|
|
8
8
|
Skeleton,
|
|
9
9
|
SkeletonCircle,
|
|
@@ -20,7 +20,7 @@ import {
|
|
|
20
20
|
} from "./chunk-RU26377I.mjs";
|
|
21
21
|
import {
|
|
22
22
|
Modal_default
|
|
23
|
-
} from "./chunk-
|
|
23
|
+
} from "./chunk-3YF7H577.mjs";
|
|
24
24
|
import {
|
|
25
25
|
Text_default
|
|
26
26
|
} from "./chunk-IMCIR6TJ.mjs";
|
|
@@ -334,4 +334,4 @@ export {
|
|
|
334
334
|
StudentLessonProgressModal,
|
|
335
335
|
StudentLessonProgressModal_default
|
|
336
336
|
};
|
|
337
|
-
//# sourceMappingURL=chunk-
|
|
337
|
+
//# sourceMappingURL=chunk-6Z5W5J44.mjs.map
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
var _chunkFRU4YZ4Ujs = require('./chunk-FRU4YZ4U.js');
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
var
|
|
6
|
+
var _chunkJTWXQ267js = require('./chunk-JTWXQ267.js');
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
var _chunkANT66KVKjs = require('./chunk-ANT66KVK.js');
|
|
@@ -24,7 +24,7 @@ var ProgressModal = ({
|
|
|
24
24
|
const resolvedAccessibleName = typeof message === "string" ? message : _nullishCoalesce(accessibleName, () => ( "Carregando"));
|
|
25
25
|
const resolvedAlt = _nullishCoalesce(imageAlt, () => ( resolvedAccessibleName));
|
|
26
26
|
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
27
|
-
|
|
27
|
+
_chunkJTWXQ267js.Modal_default,
|
|
28
28
|
{
|
|
29
29
|
isOpen,
|
|
30
30
|
onClose,
|
|
@@ -58,4 +58,4 @@ var ProgressModal_default = ProgressModal;
|
|
|
58
58
|
|
|
59
59
|
|
|
60
60
|
exports.ProgressModal_default = ProgressModal_default;
|
|
61
|
-
//# sourceMappingURL=chunk-
|
|
61
|
+
//# sourceMappingURL=chunk-7IGUYLSF.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-7IGUYLSF.js","../src/components/ProgressModal/ProgressModal.tsx"],"names":[],"mappings":"AAAA;AACE;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACA;ACiEa,+CAAA;AAnBb,IAAM,cAAA,EAAgB,CAAC;AAAA,EACrB,MAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,cAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA,EAAO;AACT,CAAA,EAAA,GAA0B;AACxB,EAAA,MAAM,gBAAA,EAAkB,SAAA,IAAa,KAAA,CAAA;AACrC,EAAA,MAAM,uBAAA,EACJ,OAAO,QAAA,IAAY,SAAA,EAAW,QAAA,mBAAW,cAAA,UAAkB,cAAA;AAC7D,EAAA,MAAM,YAAA,mBAAc,QAAA,UAAY,wBAAA;AAEhC,EAAA,uBACE,6BAAA;AAAA,IAAC,8BAAA;AAAA,IAAA;AAAA,MACC,MAAA;AAAA,MACA,OAAA;AAAA,MACA,KAAA,kBAAO,6BAAA,MAAC,EAAA,EAAK,SAAA,EAAU,SAAA,EAAW,QAAA,EAAA,uBAAA,CAAuB,CAAA;AAAA,MACzD,IAAA;AAAA,MAEA,QAAA,kBAAA,8BAAA,KAAC,EAAA,EAAI,SAAA,EAAU,uCAAA,EACZ,QAAA,EAAA;AAAA,QAAA,MAAA,mBACC,6BAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,GAAA,EAAK,KAAA;AAAA,YACL,GAAA,EAAK,WAAA;AAAA,YACL,SAAA,EAAU;AAAA,UAAA;AAAA,QACZ,CAAA;AAAA,wBAGF,6BAAA,6BAAC,EAAA,EAAK,IAAA,EAAK,IAAA,EAAK,SAAA,EAAU,2BAAA,EACvB,QAAA,EAAA,QAAA,CACH,CAAA;AAAA,wBAEA,6BAAA,KAAC,EAAA,EAAI,SAAA,EAAW,gBAAA,EAAkB,uBAAA,EAAyB,QAAA,EACzD,QAAA,kBAAA,6BAAA;AAAA,UAAC,oCAAA;AAAA,UAAA;AAAA,YACC,KAAA,mBAAO,QAAA,UAAY,IAAA;AAAA,YACnB,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAQ,MAAA;AAAA,YACR,cAAA,EAAgB,CAAC;AAAA,UAAA;AAAA,QACnB,EAAA,CACF;AAAA,MAAA,EAAA,CACF;AAAA,IAAA;AAAA,EACF,CAAA;AAEJ,CAAA;AAEA,IAAO,sBAAA,EAAQ,aAAA;ADhDf;AACA;AACE;AACF,sDAAC","file":"/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-7IGUYLSF.js","sourcesContent":[null,"import { ReactNode } from 'react';\nimport Modal from '../Modal/Modal';\nimport ProgressBar from '../ProgressBar/ProgressBar';\nimport Text from '../Text/Text';\n\nexport interface ProgressModalProps {\n /** Controla se o modal está aberto */\n isOpen: boolean;\n /** Callback ao fechar */\n onClose: () => void;\n /**\n * Mensagem principal exibida abaixo da imagem. Também é usada como\n * accessible name do dialog (renderizada visualmente escondida no `<h2>`\n * do Modal pra leitores de tela).\n */\n message: ReactNode;\n /** URL ou import de imagem ilustrativa (opcional) */\n image?: string;\n /** Alt text da imagem — se não informado usa a `message` quando for string */\n imageAlt?: string;\n /**\n * Accessible name quando `message` é ReactNode. Se omitido, cai em\n * \"Carregando\". Ignorado quando `message` é string.\n */\n accessibleName?: string;\n /**\n * Valor 0-100. Se omitido, mostra indicador indeterminado (pulse sem %).\n * Use quando o backend não reportar progresso real.\n */\n progress?: number;\n /** Tamanho do Modal. Default: 'sm' */\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n}\n\n/**\n * Modal de progresso com imagem ilustrativa + mensagem + ProgressBar.\n *\n * Pensado para operações assíncronas longas (upload, OCR, correção por IA, etc).\n * Quando `progress` é omitido, a barra é renderizada em modo indeterminado\n * (`animate-pulse` sem percentual visível).\n *\n * Layout: X no topo direito, imagem centralizada, mensagem abaixo da imagem,\n * progress bar ao final. A mensagem também é injetada como título invisível\n * (`sr-only`) no `<h2>` do Modal pra acessibilidade.\n *\n * @example\n * ```tsx\n * <ProgressModal\n * isOpen={isLoading}\n * onClose={() => setIsLoading(false)}\n * image={myImage}\n * message=\"Analisando sua redação...\"\n * // progress opcional — sem valor, usa indicador indeterminado\n * />\n * ```\n */\nconst ProgressModal = ({\n isOpen,\n onClose,\n message,\n image,\n imageAlt,\n accessibleName,\n progress,\n size = 'sm',\n}: ProgressModalProps) => {\n const isIndeterminate = progress === undefined;\n const resolvedAccessibleName =\n typeof message === 'string' ? message : (accessibleName ?? 'Carregando');\n const resolvedAlt = imageAlt ?? resolvedAccessibleName;\n\n return (\n <Modal\n isOpen={isOpen}\n onClose={onClose}\n title={<span className=\"sr-only\">{resolvedAccessibleName}</span>}\n size={size}\n >\n <div className=\"flex flex-col items-center gap-6 py-2\">\n {image && (\n <img\n src={image}\n alt={resolvedAlt}\n className=\"w-60 h-60 object-contain\"\n />\n )}\n\n <Text size=\"md\" className=\"text-text-950 text-center\">\n {message}\n </Text>\n\n <div className={isIndeterminate ? 'w-full animate-pulse' : 'w-full'}>\n <ProgressBar\n value={progress ?? 60}\n size=\"medium\"\n variant=\"blue\"\n showPercentage={!isIndeterminate}\n />\n </div>\n </div>\n </Modal>\n );\n};\n\nexport default ProgressModal;\n"]}
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
DropdownMenuItem,
|
|
4
4
|
DropdownMenu_default,
|
|
5
5
|
createDropdownStore
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-NMPK336K.mjs";
|
|
7
7
|
import {
|
|
8
8
|
cn
|
|
9
9
|
} from "./chunk-53ICLDGS.mjs";
|
|
@@ -318,4 +318,4 @@ export {
|
|
|
318
318
|
getResultsMessage,
|
|
319
319
|
Search_default
|
|
320
320
|
};
|
|
321
|
-
//# sourceMappingURL=chunk-
|
|
321
|
+
//# sourceMappingURL=chunk-AU5M2766.mjs.map
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _chunkQLWBGM7Hjs = require('./chunk-QLWBGM7H.js');
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
var
|
|
6
|
+
var _chunkAZSRKBYSjs = require('./chunk-AZSRKBYS.js');
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
var _chunkYCOW5GXGjs = require('./chunk-YCOW5GXG.js');
|
|
@@ -32,7 +32,7 @@ var _chunkZ24WPUCCjs = require('./chunk-Z24WPUCC.js');
|
|
|
32
32
|
var _chunkKRYBXYOBjs = require('./chunk-KRYBXYOB.js');
|
|
33
33
|
|
|
34
34
|
|
|
35
|
-
var
|
|
35
|
+
var _chunkGXXDSBN2js = require('./chunk-GXXDSBN2.js');
|
|
36
36
|
|
|
37
37
|
|
|
38
38
|
|
|
@@ -45,10 +45,10 @@ var _chunkO4HQL4GLjs = require('./chunk-O4HQL4GL.js');
|
|
|
45
45
|
var _chunkAN62GXF5js = require('./chunk-AN62GXF5.js');
|
|
46
46
|
|
|
47
47
|
|
|
48
|
-
var
|
|
48
|
+
var _chunkCAQ2Q3ONjs = require('./chunk-CAQ2Q3ON.js');
|
|
49
49
|
|
|
50
50
|
|
|
51
|
-
var
|
|
51
|
+
var _chunkJTWXQ267js = require('./chunk-JTWXQ267.js');
|
|
52
52
|
|
|
53
53
|
|
|
54
54
|
var _chunkXN2HPVVHjs = require('./chunk-XN2HPVVH.js');
|
|
@@ -72,6 +72,7 @@ var _SquaresFour = require('@phosphor-icons/react/dist/csr/SquaresFour');
|
|
|
72
72
|
|
|
73
73
|
|
|
74
74
|
|
|
75
|
+
|
|
75
76
|
var _react = require('react');
|
|
76
77
|
var _jsxruntime = require('react/jsx-runtime');
|
|
77
78
|
var getQuizTypeConfig = (type) => {
|
|
@@ -182,7 +183,7 @@ var QuizTitle = _react.forwardRef.call(void 0, ({ className, onBack, showTimer =
|
|
|
182
183
|
...props,
|
|
183
184
|
children: [
|
|
184
185
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
185
|
-
|
|
186
|
+
_chunkCAQ2Q3ONjs.IconButton_default,
|
|
186
187
|
{
|
|
187
188
|
icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _CaretLeft.CaretLeftIcon, { size: 24 }),
|
|
188
189
|
size: "md",
|
|
@@ -195,12 +196,12 @@ var QuizTitle = _react.forwardRef.call(void 0, ({ className, onBack, showTimer =
|
|
|
195
196
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkANT66KVKjs.Text_default, { size: "md", weight: "bold", color: "text-text-950", children: quizTitle }),
|
|
196
197
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkANT66KVKjs.Text_default, { size: "xs", color: "text-text-600", children: totalQuestions > 0 ? `${currentQuestionIndex + 1} de ${totalQuestions}` : "0 de 0" })
|
|
197
198
|
] }),
|
|
198
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "justify-self-end", children: showTimer && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
199
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "justify-self-end", children: showTimer && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkQLWBGM7Hjs.QuizTimer_default, {}) })
|
|
199
200
|
]
|
|
200
201
|
}
|
|
201
202
|
),
|
|
202
203
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
203
|
-
|
|
204
|
+
_chunkAZSRKBYSjs.AlertDialog,
|
|
204
205
|
{
|
|
205
206
|
isOpen: showExitConfirmation,
|
|
206
207
|
onChangeOpen: setShowExitConfirmation,
|
|
@@ -315,8 +316,15 @@ var QuizQuestionList = ({
|
|
|
315
316
|
Object.entries(filteredGroupedQuestions).map(
|
|
316
317
|
([subjectId, questions]) => /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "section", { className: "flex flex-col gap-2", children: [
|
|
317
318
|
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "span", { className: "pt-6 pb-4 flex flex-row gap-2", children: [
|
|
318
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
319
|
-
|
|
319
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
320
|
+
"div",
|
|
321
|
+
{
|
|
322
|
+
className: "bg-primary-500 p-1 rounded-sm flex items-center justify-center",
|
|
323
|
+
"aria-hidden": "true",
|
|
324
|
+
children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _BookOpen.BookOpenIcon, { size: 17, className: "text-white" })
|
|
325
|
+
}
|
|
326
|
+
),
|
|
327
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "h3", { className: "text-text-800 font-bold text-lg", children: _nullishCoalesce(_optionalChain([questions, 'optionalAccess', _14 => _14[0], 'optionalAccess', _15 => _15.knowledgeMatrix, 'optionalAccess', _16 => _16[0], 'optionalAccess', _17 => _17.subject, 'optionalAccess', _18 => _18.name]), () => ( "Sem componente curricular")) })
|
|
320
328
|
] }),
|
|
321
329
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "ul", { className: "flex flex-col gap-2", children: questions.map((question) => {
|
|
322
330
|
const status = getQuestionStatus(question.id);
|
|
@@ -324,8 +332,8 @@ var QuizQuestionList = ({
|
|
|
324
332
|
const examInfo = showExamInfo ? _chunkXAYT3KUNjs.formatExamInfo.call(void 0, question.examBoard, question.examYear) : "";
|
|
325
333
|
const questionTitle = `Quest\xE3o ${questionNumber.toString().padStart(2, "0")}`;
|
|
326
334
|
const header = examInfo ? `${questionTitle} ${examInfo}` : questionTitle;
|
|
327
|
-
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
328
|
-
|
|
335
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "li", { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
336
|
+
_chunkGXXDSBN2js.CardStatus,
|
|
329
337
|
{
|
|
330
338
|
header,
|
|
331
339
|
label: getStatusLabel(status),
|
|
@@ -333,9 +341,8 @@ var QuizQuestionList = ({
|
|
|
333
341
|
goToQuestion(questionNumber - 1);
|
|
334
342
|
_optionalChain([onQuestionClick, 'optionalCall', _19 => _19()]);
|
|
335
343
|
}
|
|
336
|
-
}
|
|
337
|
-
|
|
338
|
-
);
|
|
344
|
+
}
|
|
345
|
+
) }, question.id);
|
|
339
346
|
}) })
|
|
340
347
|
] }, subjectId)
|
|
341
348
|
)
|
|
@@ -349,25 +356,31 @@ var QuizResultModal = ({
|
|
|
349
356
|
title,
|
|
350
357
|
description,
|
|
351
358
|
footer
|
|
352
|
-
}) =>
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
)
|
|
359
|
+
}) => {
|
|
360
|
+
const titleId = _react.useId.call(void 0, );
|
|
361
|
+
const descriptionId = _react.useId.call(void 0, );
|
|
362
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
363
|
+
_chunkJTWXQ267js.Modal_default,
|
|
364
|
+
{
|
|
365
|
+
isOpen,
|
|
366
|
+
onClose,
|
|
367
|
+
title: "",
|
|
368
|
+
labelledBy: titleId,
|
|
369
|
+
describedBy: descriptionId,
|
|
370
|
+
closeOnEscape: false,
|
|
371
|
+
hideCloseButton: true,
|
|
372
|
+
size: "md",
|
|
373
|
+
children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-col w-full h-full items-center justify-center gap-4", children: [
|
|
374
|
+
image ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "w-[282px] h-auto", children: image }) : showImagePlaceholder && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "w-[282px] h-[200px] bg-gray-100 rounded-md flex items-center justify-center", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkANT66KVKjs.Text_default, { as: "span", size: "sm", color: "text-gray-500", children: "Imagem de resultado" }) }),
|
|
375
|
+
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-col gap-2 text-center", children: [
|
|
376
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkANT66KVKjs.Text_default, { as: "h2", id: titleId, size: "lg", weight: "bold", children: title }),
|
|
377
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { id: descriptionId, className: "flex flex-col gap-2", children: description })
|
|
378
|
+
] }),
|
|
379
|
+
footer
|
|
380
|
+
] })
|
|
381
|
+
}
|
|
382
|
+
);
|
|
383
|
+
};
|
|
371
384
|
var useCurrentCorrection = () => {
|
|
372
385
|
const { getCurrentQuestion, getQuestionResultByQuestionId } = _chunk726PIA5Mjs.useQuizStore.call(void 0, );
|
|
373
386
|
const currentQuestion = getCurrentQuestion();
|
|
@@ -471,6 +484,7 @@ var QuizFooter = _react.forwardRef.call(void 0,
|
|
|
471
484
|
const isCurrentQuestionSkipped = currentQuestion ? getQuestionStatusFromUserAnswers(currentQuestion.id) === "skipped" : false;
|
|
472
485
|
const [activeModal, setActiveModal] = _react.useState.call(void 0, null);
|
|
473
486
|
const [filterType, setFilterType] = _react.useState.call(void 0, "all");
|
|
487
|
+
const filterLabelId = _react.useId.call(void 0, );
|
|
474
488
|
const openModal = (modalName) => setActiveModal(modalName);
|
|
475
489
|
const closeModal = () => setActiveModal(null);
|
|
476
490
|
const isModalOpen = (modalName) => activeModal === modalName;
|
|
@@ -535,10 +549,12 @@ var QuizFooter = _react.forwardRef.call(void 0,
|
|
|
535
549
|
children: variant === "default" ? /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
|
|
536
550
|
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-row items-center gap-1", children: [
|
|
537
551
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
538
|
-
|
|
552
|
+
_chunkCAQ2Q3ONjs.IconButton_default,
|
|
539
553
|
{
|
|
540
554
|
icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _SquaresFour.SquaresFourIcon, { size: 24, className: "text-text-950" }),
|
|
541
555
|
size: "md",
|
|
556
|
+
"aria-label": "Lista de todas as quest\xF5es",
|
|
557
|
+
"aria-haspopup": "dialog",
|
|
542
558
|
onClick: () => openModal("modalNavigate")
|
|
543
559
|
}
|
|
544
560
|
),
|
|
@@ -547,6 +563,7 @@ var QuizFooter = _react.forwardRef.call(void 0,
|
|
|
547
563
|
{
|
|
548
564
|
variant: "outline",
|
|
549
565
|
size: "small",
|
|
566
|
+
"aria-label": "Pular quest\xE3o",
|
|
550
567
|
onClick: () => {
|
|
551
568
|
skipQuestion();
|
|
552
569
|
goToNextQuestion();
|
|
@@ -559,7 +576,8 @@ var QuizFooter = _react.forwardRef.call(void 0,
|
|
|
559
576
|
size: "medium",
|
|
560
577
|
variant: "link",
|
|
561
578
|
action: "primary",
|
|
562
|
-
iconLeft: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _CaretLeft.CaretLeftIcon, { size: 18 }),
|
|
579
|
+
iconLeft: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _CaretLeft.CaretLeftIcon, { size: 18, "aria-hidden": "true" }),
|
|
580
|
+
"aria-label": "Voltar \xE0 quest\xE3o anterior",
|
|
563
581
|
onClick: () => {
|
|
564
582
|
goToPreviousQuestion();
|
|
565
583
|
},
|
|
@@ -573,6 +591,7 @@ var QuizFooter = _react.forwardRef.call(void 0,
|
|
|
573
591
|
size: "small",
|
|
574
592
|
variant: "outline",
|
|
575
593
|
action: "primary",
|
|
594
|
+
"aria-label": "Pular quest\xE3o",
|
|
576
595
|
onClick: () => {
|
|
577
596
|
skipQuestion();
|
|
578
597
|
goToNextQuestion();
|
|
@@ -586,6 +605,7 @@ var QuizFooter = _react.forwardRef.call(void 0,
|
|
|
586
605
|
size: "medium",
|
|
587
606
|
variant: "solid",
|
|
588
607
|
action: "primary",
|
|
608
|
+
"aria-label": `Finalizar ${quizTypeLabel.toLowerCase()}`,
|
|
589
609
|
onClick: handleFinishQuiz,
|
|
590
610
|
children: "Finalizar"
|
|
591
611
|
}
|
|
@@ -595,7 +615,8 @@ var QuizFooter = _react.forwardRef.call(void 0,
|
|
|
595
615
|
size: "medium",
|
|
596
616
|
variant: "link",
|
|
597
617
|
action: "primary",
|
|
598
|
-
iconRight: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _CaretRight.CaretRightIcon, { size: 18 }),
|
|
618
|
+
iconRight: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _CaretRight.CaretRightIcon, { size: 18, "aria-hidden": "true" }),
|
|
619
|
+
"aria-label": "Avan\xE7ar para a pr\xF3xima quest\xE3o",
|
|
599
620
|
disabled: !currentAnswer && !isCurrentQuestionSkipped,
|
|
600
621
|
onClick: () => {
|
|
601
622
|
goToNextQuestion();
|
|
@@ -663,7 +684,7 @@ var QuizFooter = _react.forwardRef.call(void 0,
|
|
|
663
684
|
}
|
|
664
685
|
),
|
|
665
686
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
666
|
-
|
|
687
|
+
_chunkAZSRKBYSjs.AlertDialog,
|
|
667
688
|
{
|
|
668
689
|
isOpen: isModalOpen("alertDialog"),
|
|
669
690
|
onChangeOpen: (open) => open ? openModal("alertDialog") : closeModal(),
|
|
@@ -723,7 +744,7 @@ var QuizFooter = _react.forwardRef.call(void 0,
|
|
|
723
744
|
}
|
|
724
745
|
),
|
|
725
746
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
726
|
-
|
|
747
|
+
_chunkJTWXQ267js.Modal_default,
|
|
727
748
|
{
|
|
728
749
|
isOpen: isModalOpen("modalNavigate"),
|
|
729
750
|
onClose: closeModal,
|
|
@@ -731,11 +752,12 @@ var QuizFooter = _react.forwardRef.call(void 0,
|
|
|
731
752
|
size: "lg",
|
|
732
753
|
children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-col w-full not-lg:h-[calc(100vh-200px)] lg:max-h-[687px] lg:h-[687px]", children: [
|
|
733
754
|
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-row justify-between items-center py-6 pt-6 pb-4 border-b border-border-200 flex-shrink-0", children: [
|
|
734
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "text-text-950 font-bold text-lg", children: "Filtrar por" }),
|
|
755
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { id: filterLabelId, className: "text-text-950 font-bold text-lg", children: "Filtrar por" }),
|
|
735
756
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "max-w-[266px]", children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkO4HQL4GLjs.Select_default, { value: filterType, onValueChange: setFilterType, children: [
|
|
736
757
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
737
758
|
_chunkO4HQL4GLjs.SelectTrigger,
|
|
738
759
|
{
|
|
760
|
+
"aria-labelledby": filterLabelId,
|
|
739
761
|
variant: "rounded",
|
|
740
762
|
className: "max-w-[266px] min-w-[160px]",
|
|
741
763
|
children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkO4HQL4GLjs.SelectValue, { placeholder: "Selecione uma op\xE7\xE3o" })
|
|
@@ -759,7 +781,7 @@ var QuizFooter = _react.forwardRef.call(void 0,
|
|
|
759
781
|
}
|
|
760
782
|
),
|
|
761
783
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
762
|
-
|
|
784
|
+
_chunkJTWXQ267js.Modal_default,
|
|
763
785
|
{
|
|
764
786
|
isOpen: isModalOpen("modalResolution"),
|
|
765
787
|
onClose: closeModal,
|
|
@@ -775,7 +797,7 @@ var QuizFooter = _react.forwardRef.call(void 0,
|
|
|
775
797
|
}
|
|
776
798
|
),
|
|
777
799
|
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
778
|
-
|
|
800
|
+
_chunkJTWXQ267js.Modal_default,
|
|
779
801
|
{
|
|
780
802
|
isOpen: isModalOpen("modalTeacherComment"),
|
|
781
803
|
onClose: closeModal,
|
|
@@ -863,7 +885,7 @@ var QuizFooter = _react.forwardRef.call(void 0,
|
|
|
863
885
|
}
|
|
864
886
|
),
|
|
865
887
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
866
|
-
|
|
888
|
+
_chunkAZSRKBYSjs.AlertDialog,
|
|
867
889
|
{
|
|
868
890
|
isOpen: isModalOpen("alertDialogTryLater"),
|
|
869
891
|
onChangeOpen: (open) => open ? openModal("alertDialogTryLater") : closeModal(),
|
|
@@ -901,4 +923,4 @@ var QuizFooter = _react.forwardRef.call(void 0,
|
|
|
901
923
|
|
|
902
924
|
|
|
903
925
|
exports.getQuizTypeConfig = getQuizTypeConfig; exports.getTypeLabel = getTypeLabel; exports.getQuizArticle = getQuizArticle; exports.getQuizPreposition = getQuizPreposition; exports.getCompletionTitle = getCompletionTitle; exports.getGoBackButtonLabel = getGoBackButtonLabel; exports.getExitConfirmationText = getExitConfirmationText; exports.getFinishConfirmationText = getFinishConfirmationText; exports.Quiz = Quiz; exports.QuizTitle = QuizTitle; exports.QuizHeader = QuizHeader; exports.QuizContent = QuizContent; exports.QuizQuestionList = QuizQuestionList; exports.QuizFooter = QuizFooter;
|
|
904
|
-
//# sourceMappingURL=chunk-
|
|
926
|
+
//# sourceMappingURL=chunk-AVEMHDN2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-AVEMHDN2.js","../src/components/Quiz/Quiz.tsx"],"names":[],"mappings":"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","file":"/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-AVEMHDN2.js","sourcesContent":[null,"import { BookOpenIcon } from '@phosphor-icons/react/dist/csr/BookOpen';\nimport { CaretLeftIcon } from '@phosphor-icons/react/dist/csr/CaretLeft';\nimport { CaretRightIcon } from '@phosphor-icons/react/dist/csr/CaretRight';\nimport { SquaresFourIcon } from '@phosphor-icons/react/dist/csr/SquaresFour';\nimport { HeaderAlternative } from '../Alternative/Alternative';\nimport Button from '../Button/Button';\nimport IconButton from '../IconButton/IconButton';\nimport {\n forwardRef,\n ReactNode,\n useEffect,\n useId,\n useRef,\n useState,\n ComponentType,\n} from 'react';\nimport {\n useQuizStore,\n QUESTION_TYPE,\n QUIZ_TYPE,\n AI_CORRECTION_STATUS,\n CORRECTION_SOURCE,\n} from './useQuizStore';\nimport CorrectionSourceTag from './CorrectionSourceTag';\nimport { resolveCorrectionText } from './correction.utils';\nimport { QuizVariant } from './Quiz.types';\nimport { AlertDialog } from '../AlertDialog/AlertDialog';\nimport Modal from '../Modal/Modal';\n\nimport Select, {\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '../Select/Select';\nimport { cn } from '../../utils/utils';\nimport {\n QuizAlternative,\n QuizConnectDots,\n QuizDissertative,\n QuizFill,\n QuizImageQuestion,\n QuizMultipleChoice,\n QuizTrueOrFalse,\n} from './QuizContent';\nimport { CardStatus } from '../Card/Card';\nimport Text from '../Text/Text';\nimport HtmlMathRenderer from '../HtmlMathRenderer/HtmlMathRenderer';\nimport {\n formatExamInfo,\n getQuestionA11yIds,\n shouldShowExamInfo,\n} from './Quiz.utils';\nimport QuizTimer from '../QuizTimer/QuizTimer';\nimport { useMobile } from '../../hooks/useMobile';\n\n// Função para obter configuração do tipo de quiz\nexport const getQuizTypeConfig = (type: QUIZ_TYPE) => {\n // Configuração centralizada para cada tipo de quiz\n const QUIZ_TYPE_CONFIG = {\n [QUIZ_TYPE.SIMULADO]: {\n label: 'Simulado',\n article: 'o',\n preposition: 'do',\n },\n [QUIZ_TYPE.QUESTIONARIO]: {\n label: 'Questionário',\n article: 'o',\n preposition: 'do',\n },\n [QUIZ_TYPE.ATIVIDADE]: {\n label: 'Atividade',\n article: 'a',\n preposition: 'da',\n },\n [QUIZ_TYPE.AULA_RECOMENDADA]: {\n label: 'Aula recomendada',\n article: 'a',\n preposition: 'da',\n },\n } as const;\n\n const config = QUIZ_TYPE_CONFIG[type];\n return config || QUIZ_TYPE_CONFIG[QUIZ_TYPE.SIMULADO]; // fallback para simulado\n};\n\n// Função para obter o label do tipo\nexport const getTypeLabel = (type: QUIZ_TYPE) => {\n return getQuizTypeConfig(type).label;\n};\n\n// Função para obter o artigo (o/a)\nexport const getQuizArticle = (type: QUIZ_TYPE) => {\n return getQuizTypeConfig(type).article;\n};\n\n// Função para obter a preposição (do/da)\nexport const getQuizPreposition = (type: QUIZ_TYPE) => {\n return getQuizTypeConfig(type).preposition;\n};\n\n// Função para gerar título de conclusão\nexport const getCompletionTitle = (type: QUIZ_TYPE) => {\n const config = getQuizTypeConfig(type);\n return `Você concluiu ${config.article} ${config.label.toLowerCase()}!`;\n};\n\n// Função para gerar o rótulo do botão de retorno no modal de conclusão\nexport const getGoBackButtonLabel = (type: QUIZ_TYPE): string => {\n if (type === QUIZ_TYPE.SIMULADO) return 'Ir para simulados';\n if (type === QUIZ_TYPE.QUESTIONARIO) return 'Ir para aulas';\n if (type === QUIZ_TYPE.ATIVIDADE) return 'Ir para atividades';\n if (type === QUIZ_TYPE.AULA_RECOMENDADA) return 'Ir para aulas recomendadas';\n return 'Ir para simulados';\n};\n\n// Função para gerar texto de confirmação de saída\nexport const getExitConfirmationText = (type: QUIZ_TYPE) => {\n const config = getQuizTypeConfig(type);\n // QUESTIONARIO não tem rascunho: ao sair, as respostas são perdidas.\n // Demais tipos (SIMULADO, ATIVIDADE, AULA_RECOMENDADA e fallback) salvam o\n // progresso, então o aluno pode continuar depois de onde parou.\n if (type === QUIZ_TYPE.QUESTIONARIO) {\n return `Se você sair ${config.preposition} ${config.label.toLowerCase()} agora, todas as respostas serão perdidas.`;\n }\n return `Se você sair ${config.preposition} ${config.label.toLowerCase()} agora, poderá continuar de onde parou depois.`;\n};\n\n// Função para gerar texto de confirmação de finalização\nexport const getFinishConfirmationText = (type: QUIZ_TYPE) => {\n const config = getQuizTypeConfig(type);\n return `Tem certeza que deseja finalizar ${config.article} ${config.label.toLowerCase()}?`;\n};\n\nconst Quiz = forwardRef<\n HTMLDivElement,\n { children: ReactNode; className?: string; variant?: 'result' | 'default' }\n>(({ children, className, variant = QuizVariant.DEFAULT, ...props }, ref) => {\n const { setVariant } = useQuizStore();\n\n useEffect(() => {\n setVariant(variant as QuizVariant);\n }, [variant, setVariant]);\n\n return (\n <div ref={ref} className={cn('flex flex-col', className)} {...props}>\n {children}\n </div>\n );\n});\n\nconst QuizTitle = forwardRef<\n HTMLDivElement,\n { className?: string; onBack?: () => void; showTimer?: boolean }\n>(({ className, onBack, showTimer = false, ...props }, ref) => {\n const {\n quiz,\n currentQuestionIndex,\n getTotalQuestions,\n getQuizTitle,\n isStarted,\n } = useQuizStore();\n\n const [showExitConfirmation, setShowExitConfirmation] = useState(false);\n\n const totalQuestions = getTotalQuestions();\n const quizTitle = getQuizTitle();\n\n const handleBackClick = () => {\n if (isStarted) {\n setShowExitConfirmation(true);\n } else {\n actionOnBack();\n }\n };\n\n const handleConfirmExit = () => {\n setShowExitConfirmation(false);\n actionOnBack();\n };\n\n const actionOnBack = () => {\n if (onBack) {\n onBack();\n } else {\n globalThis.history.back();\n }\n };\n\n const handleCancelExit = () => {\n setShowExitConfirmation(false);\n };\n\n return (\n <>\n <div\n ref={ref}\n /*\n * Três colunas em vez de `justify-between`: as laterais são `1fr`\n * iguais, então o título fica centralizado na tela mesmo com o voltar\n * e o cronômetro tendo larguras diferentes. Com flex ele era empurrado\n * para a direita junto do cronômetro.\n */\n className={cn(\n 'grid grid-cols-[1fr_auto_1fr] items-center gap-2 relative p-2',\n className\n )}\n {...props}\n >\n <IconButton\n icon={<CaretLeftIcon size={24} />}\n size=\"md\"\n aria-label=\"Voltar\"\n onClick={handleBackClick}\n className=\"justify-self-start\"\n />\n <span className=\"flex flex-col gap-2 text-center\">\n <Text size=\"md\" weight=\"bold\" color=\"text-text-950\">\n {quizTitle}\n </Text>\n <Text size=\"xs\" color=\"text-text-600\">\n {totalQuestions > 0\n ? `${currentQuestionIndex + 1} de ${totalQuestions}`\n : '0 de 0'}\n </Text>\n </span>\n <div className=\"justify-self-end\">{showTimer && <QuizTimer />}</div>\n </div>\n\n <AlertDialog\n isOpen={showExitConfirmation}\n onChangeOpen={setShowExitConfirmation}\n title=\"Deseja sair?\"\n description={getExitConfirmationText(quiz?.type || QUIZ_TYPE.SIMULADO)}\n cancelButtonLabel=\"Voltar e revisar\"\n submitButtonLabel=\"Sair Mesmo Assim\"\n onSubmit={handleConfirmExit}\n onCancel={handleCancelExit}\n />\n </>\n );\n});\n\nconst QuizHeader = () => {\n const { getCurrentQuestion, getQuestionIndex, quiz, currentQuestionIndex } =\n useQuizStore();\n const currentQuestion = getCurrentQuestion();\n const titleRef = useRef<HTMLHeadingElement>(null);\n const previousIndexRef = useRef(currentQuestionIndex);\n\n // After \"Próxima\"/\"Anterior\" focus would stay on the footer button and the\n // new question would go unannounced. Moving it to the heading makes the\n // screen reader read it, and the next Tab lands on the answer controls.\n // The first render is skipped so opening the quiz does not steal focus.\n useEffect(() => {\n if (previousIndexRef.current === currentQuestionIndex) return;\n previousIndexRef.current = currentQuestionIndex;\n titleRef.current?.focus();\n }, [currentQuestionIndex]);\n let currentId =\n currentQuestion && 'questionId' in currentQuestion\n ? (currentQuestion.questionId as string)\n : currentQuestion?.id;\n const questionIndex = getQuestionIndex(currentId!);\n\n const questionNumber = currentQuestion\n ? `Questão ${questionIndex.toString().padStart(2, '0')}`\n : 'Questão';\n\n const showExamInfo = shouldShowExamInfo(quiz);\n const examInfo = showExamInfo\n ? formatExamInfo(currentQuestion?.examBoard, currentQuestion?.examYear)\n : '';\n\n const title = examInfo ? `${questionNumber} ${examInfo}` : questionNumber;\n\n const { titleId, statementId } = getQuestionA11yIds(currentQuestion?.id);\n\n return (\n <HeaderAlternative\n titleId={titleId}\n contentId={statementId}\n titleRef={titleRef}\n title={title}\n subTitle={currentQuestion?.knowledgeMatrix?.[0]?.topic?.name ?? ''}\n content={currentQuestion?.statement ?? ''}\n />\n );\n};\n\nconst QuizContent = ({ paddingBottom }: { paddingBottom?: string }) => {\n const { getCurrentQuestion } = useQuizStore();\n const { isMobile } = useMobile();\n const currentQuestion = getCurrentQuestion();\n\n // `QuizFooter` is `position: fixed`, so it sits on top of the content instead\n // of taking space in the flow — without room reserved here, the last\n // alternative ends up underneath it and unreadable. The bar is taller on a\n // phone, where its controls stack into two rows.\n const contentPaddingBottom = paddingBottom ?? (isMobile ? 'pb-32' : 'pb-24');\n const questionComponents: Record<\n string,\n ComponentType<QuizVariantInterface>\n > = {\n [QUESTION_TYPE.ALTERNATIVA]: QuizAlternative,\n [QUESTION_TYPE.MULTIPLA_ESCOLHA]: QuizMultipleChoice,\n [QUESTION_TYPE.DISSERTATIVA]: QuizDissertative,\n [QUESTION_TYPE.VERDADEIRO_FALSO]: QuizTrueOrFalse,\n [QUESTION_TYPE.RELACIONAR]: QuizConnectDots,\n [QUESTION_TYPE.PREENCHER_LACUNAS]: QuizFill,\n [QUESTION_TYPE.IMAGEM]: QuizImageQuestion,\n };\n\n const QuestionComponent = currentQuestion\n ? questionComponents[currentQuestion.questionType]\n : null;\n\n if (!QuestionComponent) {\n return (\n <Text size=\"md\" weight=\"medium\" className=\"text-text-950 text-md\">\n Tipo de questão não suportado\n </Text>\n );\n }\n\n // The teacher's comment is no longer echoed here: in the result variant it\n // lives behind the \"Ver comentário\" button in the footer, so it is not shown\n // twice on the same screen.\n return <QuestionComponent paddingBottom={contentPaddingBottom} />;\n};\n\ninterface QuizVariantInterface {\n paddingBottom?: string;\n}\n\nconst QuizQuestionList = ({\n filterType = 'all',\n onQuestionClick,\n}: {\n filterType?: string;\n onQuestionClick?: () => void;\n} = {}) => {\n const {\n getQuestionsGroupedBySubject,\n goToQuestion,\n getQuestionStatusFromUserAnswers,\n getQuestionIndex,\n quiz,\n } = useQuizStore();\n\n const showExamInfo = shouldShowExamInfo(quiz);\n\n const groupedQuestions = getQuestionsGroupedBySubject();\n const getQuestionStatus = (questionId: string) => {\n return getQuestionStatusFromUserAnswers(questionId);\n };\n const filteredGroupedQuestions = Object.entries(groupedQuestions).reduce(\n (acc, [subjectId, questions]) => {\n const filteredQuestions = questions.filter((question) => {\n const status = getQuestionStatus(question.id);\n switch (filterType) {\n case 'answered':\n return status === 'answered';\n case 'unanswered':\n return status === 'unanswered' || status === 'skipped';\n default:\n return true;\n }\n });\n\n if (filteredQuestions.length > 0) {\n acc[subjectId] = filteredQuestions;\n }\n\n return acc;\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n {} as { [key: string]: any[] }\n );\n\n const getStatusLabel = (status: string) => {\n switch (status) {\n case 'answered':\n return 'Respondida';\n case 'skipped':\n return 'Em branco';\n default:\n return 'Em branco';\n }\n };\n return (\n <div className=\"space-y-6 px-4 h-full\">\n {Object.entries(filteredGroupedQuestions).length == 0 && (\n <div className=\"flex items-center justify-center text-gray-500 py-8 h-full\">\n <p className=\"text-lg\">Nenhum resultado</p>\n </div>\n )}\n {Object.entries(filteredGroupedQuestions).map(\n ([subjectId, questions]) => (\n <section key={subjectId} className=\"flex flex-col gap-2\">\n <span className=\"pt-6 pb-4 flex flex-row gap-2\">\n <div\n className=\"bg-primary-500 p-1 rounded-sm flex items-center justify-center\"\n aria-hidden=\"true\"\n >\n <BookOpenIcon size={17} className=\"text-white\" />\n </div>\n <h3 className=\"text-text-800 font-bold text-lg\">\n {questions?.[0]?.knowledgeMatrix?.[0]?.subject?.name ??\n 'Sem componente curricular'}\n </h3>\n </span>\n\n <ul className=\"flex flex-col gap-2\">\n {questions.map((question) => {\n const status = getQuestionStatus(question.id);\n const questionNumber = getQuestionIndex(question.id);\n const examInfo = showExamInfo\n ? formatExamInfo(question.examBoard, question.examYear)\n : '';\n const questionTitle = `Questão ${questionNumber.toString().padStart(2, '0')}`;\n const header = examInfo\n ? `${questionTitle} ${examInfo}`\n : questionTitle;\n return (\n <li key={question.id}>\n <CardStatus\n header={header}\n label={getStatusLabel(status)}\n onClick={() => {\n goToQuestion(questionNumber - 1);\n onQuestionClick?.();\n }}\n />\n </li>\n );\n })}\n </ul>\n </section>\n )\n )}\n </div>\n );\n};\n\n/**\n * Shared layout for the quiz result modals (generic result, all-correct and\n * all-incorrect questionnaire variants): a centered image, a title and a\n * footer with action buttons.\n */\nconst QuizResultModal = ({\n isOpen,\n onClose,\n image,\n showImagePlaceholder = true,\n title,\n description,\n footer,\n}: {\n isOpen: boolean;\n onClose: () => void;\n image?: ReactNode;\n showImagePlaceholder?: boolean;\n title: ReactNode;\n description: ReactNode;\n footer: ReactNode;\n}) => {\n const titleId = useId();\n const descriptionId = useId();\n\n return (\n <Modal\n isOpen={isOpen}\n onClose={onClose}\n title=\"\"\n labelledBy={titleId}\n describedBy={descriptionId}\n closeOnEscape={false}\n hideCloseButton\n size={'md'}\n >\n <div className=\"flex flex-col w-full h-full items-center justify-center gap-4\">\n {image ? (\n <div className=\"w-[282px] h-auto\">{image}</div>\n ) : (\n showImagePlaceholder && (\n <div className=\"w-[282px] h-[200px] bg-gray-100 rounded-md flex items-center justify-center\">\n <Text as=\"span\" size=\"sm\" color=\"text-gray-500\">\n Imagem de resultado\n </Text>\n </div>\n )\n )}\n <div className=\"flex flex-col gap-2 text-center\">\n <Text as=\"h2\" id={titleId} size=\"lg\" weight=\"bold\">\n {title}\n </Text>\n <div id={descriptionId} className=\"flex flex-col gap-2\">\n {description}\n </div>\n </div>\n {footer}\n </div>\n </Modal>\n );\n};\n\n/**\n * Correction of the question currently on screen, resolved once.\n *\n * A dissertativa may have been graded by the AI. The teacher's text wins when it\n * exists, the AI's stands otherwise; the two are never merged — the backend\n * keeps them in separate columns precisely so a review does not destroy the\n * original verdict — and `correctionSource` says which one is on screen.\n *\n * It lives here, and not inline in `QuizFooter`, because both the footer (for\n * the modal body and title) and `QuizReviewActions` (for the buttons) need the\n * same four values, and deriving them twice would be two chances to disagree.\n *\n * @returns The effective comment plus the fields the tag and the title read\n */\nconst useCurrentCorrection = () => {\n const { getCurrentQuestion, getQuestionResultByQuestionId } = useQuizStore();\n\n const currentQuestion = getCurrentQuestion();\n const result = currentQuestion\n ? getQuestionResultByQuestionId(currentQuestion.id)\n : null;\n\n return {\n comment: resolveCorrectionText({ ...result }),\n correctionSource: result?.correctionSource,\n aiCorrectionStatus: result?.aiCorrectionStatus,\n };\n};\n\n/**\n * Title for the per-question feedback modal, phrased for whoever wrote it.\n *\n * Calling an AI correction \"Comentário do professor\" would be a lie the tag\n * inside the modal immediately contradicts, so both are derived from the same\n * `correctionSource`.\n *\n * @param correctionSource - Who produced the correction on display\n * @returns The modal title\n */\nconst getCorrectionModalTitle = (\n correctionSource?: CORRECTION_SOURCE | null\n): string => {\n if (correctionSource === CORRECTION_SOURCE.IA) {\n return 'Correção por IA';\n }\n\n if (correctionSource === CORRECTION_SOURCE.IA_PROFESSOR) {\n return 'Correção revisada pelo professor';\n }\n\n return 'Comentário do professor';\n};\n\n/**\n * The review bar's question-scoped actions: see the resolution, see the correction.\n *\n * Split out of `QuizFooter` because the two bars do different jobs — the\n * `default` one navigates between questions, this one reads a question already\n * graded — and because the four conditions the correction needs pushed the\n * footer past the cognitive-complexity limit while sitting in the middle of\n * unrelated navigation markup.\n *\n * @param props - Callbacks that open the footer's modals\n * @returns JSX element\n */\nconst QuizReviewActions = ({\n onOpenResolution,\n onOpenComment,\n className,\n}: {\n onOpenResolution: () => void;\n onOpenComment: () => void;\n readonly className?: string;\n}) => {\n const { getCurrentQuestion } = useQuizStore();\n const { comment, correctionSource, aiCorrectionStatus } =\n useCurrentCorrection();\n\n const currentQuestion = getCurrentQuestion();\n const hasResolution = Boolean(currentQuestion?.solutionExplanation);\n const isAiCorrecting = aiCorrectionStatus === AI_CORRECTION_STATUS.PENDING;\n const commentLabel =\n correctionSource === CORRECTION_SOURCE.IA\n ? 'Ver correção da IA'\n : 'Ver comentário';\n\n return (\n <div className={className}>\n {hasResolution && (\n <Button\n variant=\"solid\"\n action=\"primary\"\n size=\"large\"\n onClick={onOpenResolution}\n >\n Ver resolução\n </Button>\n )}\n {comment && (\n <Button\n variant=\"outline\"\n action=\"primary\"\n size=\"large\"\n onClick={onOpenComment}\n >\n {commentLabel}\n </Button>\n )}\n {/* Sem comentário ainda, mas a IA está corrigindo: o aluno acaba de\n entregar e chegou aqui antes do feedback existir. Dizer que está a\n caminho é melhor do que não mostrar nada. */}\n {!comment && isAiCorrecting && (\n <CorrectionSourceTag\n aiCorrectionStatus={aiCorrectionStatus}\n className=\"self-center\"\n />\n )}\n </div>\n );\n};\n\n/**\n * What the completion modal shows instead of the score.\n *\n * Some exams are not corrected on the spot — the in-classroom ENEM simulation\n * is graded later — so telling the student how many they got right would be\n * wrong. With this set, finishing opens a modal with only this content and\n * one button.\n */\nexport interface QuizCompletionOverride {\n title: ReactNode;\n description: ReactNode;\n buttonLabel: string;\n onConfirm: () => void;\n}\n\nconst QuizFooter = forwardRef<\n HTMLDivElement,\n {\n className?: string;\n onGoToSimulated?: () => void;\n onDetailResult?: () => void;\n handleFinishSimulated?: () => void;\n onGoToNextModule?: () => void;\n onRepeat?: () => void;\n onTryLater?: () => void;\n resultImageComponent?: ReactNode;\n resultIncorrectImageComponent?: ReactNode;\n /** Replaces the score modal; see `QuizCompletionOverride`. */\n completionOverride?: QuizCompletionOverride;\n }\n>(\n (\n {\n className,\n onGoToSimulated,\n onDetailResult,\n handleFinishSimulated,\n onGoToNextModule,\n onRepeat,\n onTryLater,\n resultImageComponent,\n resultIncorrectImageComponent,\n completionOverride,\n ...props\n },\n ref\n ) => {\n const {\n quiz,\n currentQuestionIndex,\n getTotalQuestions,\n goToNextQuestion,\n goToPreviousQuestion,\n getUnansweredQuestionsFromUserAnswers,\n getCurrentAnswer,\n skipQuestion,\n skipCurrentQuestionIfUnanswered,\n getCurrentQuestion,\n getQuestionStatusFromUserAnswers,\n variant,\n getQuestionResultStatistics,\n } = useQuizStore();\n\n // The review bar carries four controls. Below ~500px they no longer fit on\n // one line, so the actions and the pagination stack into two centred rows.\n const { isMobile } = useMobile();\n\n const totalQuestions = getTotalQuestions();\n const isFirstQuestion = currentQuestionIndex === 0;\n const isLastQuestion = currentQuestionIndex === totalQuestions - 1;\n const currentAnswer = getCurrentAnswer();\n const currentQuestion = getCurrentQuestion();\n const {\n comment: teacherComment,\n correctionSource,\n aiCorrectionStatus,\n } = useCurrentCorrection();\n const isCurrentQuestionSkipped = currentQuestion\n ? getQuestionStatusFromUserAnswers(currentQuestion.id) === 'skipped'\n : false;\n // Sistema unificado de controle de modais\n const [activeModal, setActiveModal] = useState<string | null>(null);\n const [filterType, setFilterType] = useState<string>('all');\n const filterLabelId = useId();\n\n // Funções para controlar modais\n const openModal = (modalName: string) => setActiveModal(modalName);\n const closeModal = () => setActiveModal(null);\n const isModalOpen = (modalName: string) => activeModal === modalName;\n const unansweredQuestions = getUnansweredQuestionsFromUserAnswers();\n const allQuestions = getTotalQuestions();\n const stats = getQuestionResultStatistics();\n const correctAnswers = stats?.correctAnswers;\n const quizType = quiz?.type || QUIZ_TYPE.SIMULADO;\n const quizTypeLabel = getTypeLabel(quizType);\n // Real subtopic name, used to label the questionnaire completion modals.\n // The backend always populates the question knowledge matrix, so this is\n // available as soon as the quiz is loaded.\n const moduleName =\n quiz?.questions?.[0]?.knowledgeMatrix?.[0]?.subtopic?.name;\n\n // Submits the answers and opens the correct result modal. Statistics must\n // be read AFTER handleFinishSimulated, which is what populates\n // questionsResult in the store (the render-time values are still empty).\n const submitAndOpenResultModal = async () => {\n if (handleFinishSimulated) {\n await Promise.resolve(handleFinishSimulated());\n }\n\n if (completionOverride) {\n openModal('modalCompletionOverride');\n return;\n }\n\n const latestStats = getQuestionResultStatistics();\n const latestCorrect = latestStats?.correctAnswers;\n const latestTotal = latestStats?.totalAnswered;\n\n if (\n quizType === QUIZ_TYPE.QUESTIONARIO &&\n typeof latestCorrect === 'number' &&\n typeof latestTotal === 'number' &&\n latestCorrect === latestTotal\n ) {\n openModal('modalQuestionnaireAllCorrect');\n return;\n }\n\n if (\n quizType === QUIZ_TYPE.QUESTIONARIO &&\n typeof latestCorrect === 'number' &&\n latestCorrect === 0\n ) {\n openModal('modalQuestionnaireAllIncorrect');\n return;\n }\n\n openModal('modalResult');\n };\n\n const handleFinishQuiz = async () => {\n // Marca a questão atual como pulada se não foi respondida\n skipCurrentQuestionIfUnanswered();\n\n if (unansweredQuestions.length > 0) {\n openModal('alertDialog');\n return;\n }\n\n try {\n await submitAndOpenResultModal();\n } catch (err) {\n console.error('handleFinishSimulated failed:', err);\n }\n };\n\n const handleAlertSubmit = async () => {\n try {\n await submitAndOpenResultModal();\n } catch (err) {\n console.error('handleFinishSimulated failed:', err);\n closeModal();\n }\n };\n\n return (\n <>\n <footer\n ref={ref}\n className={cn(\n 'w-full px-2 bg-background lg:max-w-[1000px] not-lg:max-w-[calc(100vw-32px)] border-t border-border-50 fixed bottom-0 min-h-[80px] flex flex-row justify-between items-center',\n className\n )}\n {...props}\n >\n {variant === 'default' ? (\n <>\n <div className=\"flex flex-row items-center gap-1\">\n <IconButton\n icon={<SquaresFourIcon size={24} className=\"text-text-950\" />}\n size=\"md\"\n aria-label=\"Lista de todas as questões\"\n aria-haspopup=\"dialog\"\n onClick={() => openModal('modalNavigate')}\n />\n\n {isFirstQuestion ? (\n <Button\n variant=\"outline\"\n size=\"small\"\n aria-label=\"Pular questão\"\n onClick={() => {\n skipQuestion();\n goToNextQuestion();\n }}\n >\n Pular\n </Button>\n ) : (\n <Button\n size=\"medium\"\n variant=\"link\"\n action=\"primary\"\n iconLeft={<CaretLeftIcon size={18} aria-hidden=\"true\" />}\n aria-label=\"Voltar à questão anterior\"\n onClick={() => {\n goToPreviousQuestion();\n }}\n >\n Voltar\n </Button>\n )}\n </div>\n\n {!isFirstQuestion && !isLastQuestion && (\n <Button\n size=\"small\"\n variant=\"outline\"\n action=\"primary\"\n aria-label=\"Pular questão\"\n onClick={() => {\n skipQuestion();\n goToNextQuestion();\n }}\n >\n Pular\n </Button>\n )}\n\n {isLastQuestion ? (\n <Button\n size=\"medium\"\n variant=\"solid\"\n action=\"primary\"\n aria-label={`Finalizar ${quizTypeLabel.toLowerCase()}`}\n onClick={handleFinishQuiz}\n >\n Finalizar\n </Button>\n ) : (\n <Button\n size=\"medium\"\n variant=\"link\"\n action=\"primary\"\n iconRight={<CaretRightIcon size={18} aria-hidden=\"true\" />}\n aria-label=\"Avançar para a próxima questão\"\n disabled={!currentAnswer && !isCurrentQuestionSkipped}\n onClick={() => {\n goToNextQuestion();\n }}\n >\n Avançar\n </Button>\n )}\n </>\n ) : (\n <div\n className={cn(\n 'flex w-full items-center gap-2',\n isMobile ? 'flex-col py-2' : 'flex-row'\n )}\n >\n <QuizReviewActions\n className={cn(\n 'flex flex-row items-center gap-2',\n isMobile && 'justify-center'\n )}\n onOpenResolution={() => openModal('modalResolution')}\n onOpenComment={() => openModal('modalTeacherComment')}\n />\n {/* On a wide bar the pagination sits at the far end, away from the\n actions that act on the question being read; stacked, it is\n centred under them. */}\n <div\n className={cn(\n 'flex flex-row items-center gap-2',\n isMobile ? 'justify-center' : 'flex-1 justify-end'\n )}\n >\n <Button\n variant=\"outline\"\n action=\"primary\"\n size=\"medium\"\n aria-label=\"Questão anterior\"\n disabled={isFirstQuestion}\n onClick={goToPreviousQuestion}\n >\n <CaretLeftIcon size={18} />\n </Button>\n <Button\n variant=\"outline\"\n action=\"primary\"\n size=\"medium\"\n aria-label=\"Próxima questão\"\n disabled={isLastQuestion}\n onClick={goToNextQuestion}\n >\n <CaretRightIcon size={18} />\n </Button>\n </div>\n </div>\n )}\n </footer>\n\n <AlertDialog\n isOpen={isModalOpen('alertDialog')}\n onChangeOpen={(open) =>\n open ? openModal('alertDialog') : closeModal()\n }\n title={`Finalizar ${quizTypeLabel.toLowerCase()}?`}\n description={\n unansweredQuestions.length > 0\n ? `Você deixou as questões ${unansweredQuestions.join(', ')} sem resposta. Finalizar agora pode impactar seu desempenho.`\n : getFinishConfirmationText(quizType)\n }\n cancelButtonLabel=\"Voltar e revisar\"\n submitButtonLabel=\"Finalizar Mesmo Assim\"\n onSubmit={handleAlertSubmit}\n />\n\n <QuizResultModal\n isOpen={isModalOpen('modalResult')}\n onClose={closeModal}\n image={resultImageComponent}\n title={getCompletionTitle(quizType)}\n description={\n <Text as=\"p\" size=\"sm\" color=\"text-text-500\">\n Você acertou {correctAnswers ?? '--'} de {allQuestions} questões.\n </Text>\n }\n footer={\n <div className=\"px-6 flex flex-row items-center gap-2 w-full\">\n <Button\n variant=\"outline\"\n className=\"w-full\"\n size=\"small\"\n onClick={onGoToSimulated}\n >\n {getGoBackButtonLabel(quizType)}\n </Button>\n\n <Button className=\"w-full\" onClick={onDetailResult}>\n Detalhar resultado\n </Button>\n </div>\n }\n />\n\n {completionOverride && (\n <QuizResultModal\n isOpen={isModalOpen('modalCompletionOverride')}\n onClose={closeModal}\n image={resultImageComponent}\n title={completionOverride.title}\n description={\n <Text as=\"p\" size=\"sm\" color=\"text-text-500\">\n {completionOverride.description}\n </Text>\n }\n footer={\n <div className=\"px-6 flex flex-row items-center w-full\">\n <Button\n className=\"w-full\"\n onClick={completionOverride.onConfirm}\n data-testid=\"quiz-completion-override-confirm\"\n >\n {completionOverride.buttonLabel}\n </Button>\n </div>\n }\n />\n )}\n\n <Modal\n isOpen={isModalOpen('modalNavigate')}\n onClose={closeModal}\n title=\"Questões\"\n size={'lg'}\n >\n <div className=\"flex flex-col w-full not-lg:h-[calc(100vh-200px)] lg:max-h-[687px] lg:h-[687px]\">\n <div className=\"flex flex-row justify-between items-center py-6 pt-6 pb-4 border-b border-border-200 flex-shrink-0\">\n <p id={filterLabelId} className=\"text-text-950 font-bold text-lg\">\n Filtrar por\n </p>\n <span className=\"max-w-[266px]\">\n <Select value={filterType} onValueChange={setFilterType}>\n <SelectTrigger\n aria-labelledby={filterLabelId}\n variant=\"rounded\"\n className=\"max-w-[266px] min-w-[160px]\"\n >\n <SelectValue placeholder=\"Selecione uma opção\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"all\">Todas</SelectItem>\n <SelectItem value=\"unanswered\">Em branco</SelectItem>\n <SelectItem value=\"answered\">Respondidas</SelectItem>\n </SelectContent>\n </Select>\n </span>\n </div>\n\n <div className=\"flex flex-col gap-2 flex-1 min-h-0 overflow-y-auto\">\n <QuizQuestionList\n filterType={filterType}\n onQuestionClick={closeModal}\n />\n </div>\n </div>\n </Modal>\n\n <Modal\n isOpen={isModalOpen('modalResolution')}\n onClose={closeModal}\n title=\"Resolução\"\n size={'lg'}\n >\n <HtmlMathRenderer\n content={currentQuestion?.solutionExplanation || ''}\n className=\"text-text-950 text-base\"\n />\n </Modal>\n\n <Modal\n isOpen={isModalOpen('modalTeacherComment')}\n onClose={closeModal}\n title={getCorrectionModalTitle(correctionSource)}\n size={'lg'}\n >\n {/* A tag fica dentro do modal, junto do texto: é ela que diz se o que\n está sendo lido saiu da IA, do professor, ou da IA revisada por\n ele. Sem isso o título sozinho teria que carregar essa informação\n em toda variação. */}\n <CorrectionSourceTag\n correctionSource={correctionSource}\n aiCorrectionStatus={aiCorrectionStatus}\n className=\"mb-3\"\n />\n {/* Plain text on purpose: the teacher writes this in a bare textarea,\n so running it through the HTML/LaTeX renderer would change what\n they typed. `whitespace-pre-wrap` keeps their line breaks. The AI\n feedback is plain text for the same reason. */}\n <Text\n size=\"md\"\n className=\"text-text-950 whitespace-pre-wrap break-words\"\n >\n {teacherComment}\n </Text>\n </Modal>\n\n <QuizResultModal\n isOpen={isModalOpen('modalQuestionnaireAllCorrect')}\n onClose={closeModal}\n image={resultImageComponent}\n title=\"🎉 Parabéns!\"\n description={\n <Text as=\"p\" size=\"sm\" color=\"text-text-500\">\n {moduleName\n ? `Você concluiu o módulo ${moduleName}.`\n : 'Você concluiu o questionário!'}\n </Text>\n }\n footer={\n <div className=\"px-6 flex flex-row items-center gap-2 w-full\">\n <Button className=\"w-full\" onClick={onGoToNextModule}>\n {getGoBackButtonLabel(quizType)}\n </Button>\n </div>\n }\n />\n\n <QuizResultModal\n isOpen={isModalOpen('modalQuestionnaireAllIncorrect')}\n onClose={closeModal}\n image={resultIncorrectImageComponent}\n showImagePlaceholder={false}\n title=\"😕 Não foi dessa vez...\"\n description={\n <>\n <Text as=\"p\" size=\"sm\" color=\"text-text-500\">\n Você tirou 0 no questionário, mas não se preocupe! Isso é apenas\n uma oportunidade de aprendizado.\n </Text>\n\n <Text as=\"p\" size=\"sm\" color=\"text-text-500\">\n Que tal tentar novamente para melhorar sua nota? Estamos aqui\n para te ajudar a entender o conteúdo e evoluir.\n </Text>\n\n {quiz?.canRetry && (\n <Text as=\"p\" size=\"sm\" color=\"text-text-500\">\n Clique em Repetir Questionário e mostre do que você é capaz!\n 💪\n </Text>\n )}\n </>\n }\n footer={\n <div className=\"flex flex-row justify-center items-center gap-2 w-full\">\n {quiz?.canRetry && (\n <Button\n type=\"button\"\n variant=\"link\"\n size=\"small\"\n className=\"w-auto\"\n onClick={() => {\n closeModal();\n openModal('alertDialogTryLater');\n }}\n >\n Tentar depois\n </Button>\n )}\n\n <Button\n variant=\"outline\"\n size=\"small\"\n className=\"w-auto\"\n onClick={onDetailResult}\n >\n Detalhar resultado\n </Button>\n\n {quiz?.canRetry ? (\n <Button className=\"w-auto\" size=\"small\" onClick={onRepeat}>\n Repetir questionário\n </Button>\n ) : (\n <Button\n className=\"w-auto\"\n size=\"small\"\n onClick={onGoToSimulated}\n >\n {getGoBackButtonLabel(quizType)}\n </Button>\n )}\n </div>\n }\n />\n\n <AlertDialog\n isOpen={isModalOpen('alertDialogTryLater')}\n onChangeOpen={(open) =>\n open ? openModal('alertDialogTryLater') : closeModal()\n }\n title=\"Tentar depois?\"\n description={\n 'Você optou por refazer o questionário mais tarde.\\n\\nLembre-se: enquanto não refazer o questionário, sua nota permanecerá 0 no sistema.'\n }\n cancelButtonLabel=\"Repetir questionário\"\n submitButtonLabel=\"Tentar depois\"\n onSubmit={() => {\n onTryLater?.();\n closeModal();\n }}\n onCancel={() => {\n onRepeat?.();\n closeModal();\n }}\n />\n </>\n );\n }\n);\n\nexport {\n QuizTitle,\n Quiz,\n QuizHeader,\n QuizContent,\n QuizFooter,\n QuizQuestionList,\n};\n"]}
|