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
|
@@ -11,8 +11,11 @@ import {
|
|
|
11
11
|
|
|
12
12
|
// src/store/layoutPreferencesStore.ts
|
|
13
13
|
import { create } from "zustand";
|
|
14
|
-
import { createJSONStorage, persist } from "zustand/middleware";
|
|
15
14
|
var SIDE_PANEL_DEFAULT_WIDTH = 400;
|
|
15
|
+
var dropLegacyPersistedWidths = () => {
|
|
16
|
+
localStorage.removeItem("@layout-preferences:analytica:v1" /* LAYOUT_PREFERENCES_STORAGE */);
|
|
17
|
+
};
|
|
18
|
+
dropLegacyPersistedWidths();
|
|
16
19
|
var clampPanelWidth = (value) => {
|
|
17
20
|
const width = Number(value);
|
|
18
21
|
if (!Number.isFinite(width)) return SIDE_PANEL_DEFAULT_WIDTH;
|
|
@@ -28,72 +31,47 @@ var createDefaultWidths = () => ({
|
|
|
28
31
|
preview: SIDE_PANEL_DEFAULT_WIDTH
|
|
29
32
|
}
|
|
30
33
|
});
|
|
31
|
-
var mergeScopeWidths = (persisted) => {
|
|
32
|
-
const saved = persisted ?? {};
|
|
33
|
-
return {
|
|
34
|
-
filters: clampPanelWidth(saved.filters),
|
|
35
|
-
preview: clampPanelWidth(saved.preview)
|
|
36
|
-
};
|
|
37
|
-
};
|
|
38
34
|
var withPanelWidth = (widths, scope, panel, width) => ({
|
|
39
35
|
...widths,
|
|
40
36
|
[scope]: { ...widths[scope], [panel]: width }
|
|
41
37
|
});
|
|
42
38
|
var useLayoutPreferencesStore = create()(
|
|
43
|
-
|
|
44
|
-
(
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
widths
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
widths
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
}));
|
|
78
|
-
}
|
|
79
|
-
}),
|
|
80
|
-
{
|
|
81
|
-
name: "@layout-preferences:analytica:v1" /* LAYOUT_PREFERENCES_STORAGE */,
|
|
82
|
-
storage: createJSONStorage(() => localStorage),
|
|
83
|
-
partialize: (state) => ({ widths: state.widths }),
|
|
84
|
-
merge: (persisted, current) => {
|
|
85
|
-
const saved = persisted ?? {};
|
|
86
|
-
const savedWidths = saved.widths ?? {};
|
|
87
|
-
return {
|
|
88
|
-
...current,
|
|
89
|
-
widths: {
|
|
90
|
-
activity: mergeScopeWidths(savedWidths.activity),
|
|
91
|
-
lesson: mergeScopeWidths(savedWidths.lesson)
|
|
92
|
-
}
|
|
93
|
-
};
|
|
94
|
-
}
|
|
39
|
+
(set) => ({
|
|
40
|
+
widths: createDefaultWidths(),
|
|
41
|
+
/**
|
|
42
|
+
* Aplica a largura escolhida pelo usuário para uma coluna
|
|
43
|
+
* @param scope - Tela alvo
|
|
44
|
+
* @param panel - Coluna alvo
|
|
45
|
+
* @param width - Largura em px
|
|
46
|
+
* @returns {void}
|
|
47
|
+
*/
|
|
48
|
+
setPanelWidth: (scope, panel, width) => {
|
|
49
|
+
set((state) => ({
|
|
50
|
+
widths: withPanelWidth(
|
|
51
|
+
state.widths,
|
|
52
|
+
scope,
|
|
53
|
+
panel,
|
|
54
|
+
clampPanelWidth(width)
|
|
55
|
+
)
|
|
56
|
+
}));
|
|
57
|
+
},
|
|
58
|
+
/**
|
|
59
|
+
* Devolve uma coluna à largura padrão
|
|
60
|
+
* @param scope - Tela alvo
|
|
61
|
+
* @param panel - Coluna alvo
|
|
62
|
+
* @returns {void}
|
|
63
|
+
*/
|
|
64
|
+
resetPanelWidth: (scope, panel) => {
|
|
65
|
+
set((state) => ({
|
|
66
|
+
widths: withPanelWidth(
|
|
67
|
+
state.widths,
|
|
68
|
+
scope,
|
|
69
|
+
panel,
|
|
70
|
+
SIDE_PANEL_DEFAULT_WIDTH
|
|
71
|
+
)
|
|
72
|
+
}));
|
|
95
73
|
}
|
|
96
|
-
)
|
|
74
|
+
})
|
|
97
75
|
);
|
|
98
76
|
var usePanelWidthPreference = (scope) => {
|
|
99
77
|
const filtersWidth = useLayoutPreferencesStore(
|
|
@@ -112,7 +90,7 @@ var usePanelWidthPreference = (scope) => {
|
|
|
112
90
|
};
|
|
113
91
|
|
|
114
92
|
// src/hooks/useResizableColumns.ts
|
|
115
|
-
var BANK_MIN_WIDTH =
|
|
93
|
+
var BANK_MIN_WIDTH = 400;
|
|
116
94
|
var RESIZE_KEYBOARD_STEP = 16;
|
|
117
95
|
var RESIZE_KEYBOARD_STEP_LARGE = 48;
|
|
118
96
|
var COLUMN_GAP = 20;
|
|
@@ -178,6 +156,13 @@ var useResizableColumns = (scope) => {
|
|
|
178
156
|
observerRef.current = observer;
|
|
179
157
|
}, []);
|
|
180
158
|
useEffect(() => () => observerRef.current?.disconnect(), []);
|
|
159
|
+
useEffect(
|
|
160
|
+
() => () => {
|
|
161
|
+
resetPanelWidth(scope, "filters");
|
|
162
|
+
resetPanelWidth(scope, "preview");
|
|
163
|
+
},
|
|
164
|
+
[resetPanelWidth, scope]
|
|
165
|
+
);
|
|
181
166
|
const preferredFilters = draft?.panel === "filters" ? draft.width : filtersWidth;
|
|
182
167
|
const preferredPreview = draft?.panel === "preview" ? draft.width : previewWidth;
|
|
183
168
|
const resolved = resolveColumnWidths(
|
|
@@ -402,4 +387,4 @@ export {
|
|
|
402
387
|
useMobile,
|
|
403
388
|
useTabletScreen
|
|
404
389
|
};
|
|
405
|
-
//# sourceMappingURL=chunk-
|
|
390
|
+
//# sourceMappingURL=chunk-GCGSAS2Z.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hooks/useScreen.ts","../src/hooks/useResizableColumns.ts","../src/store/layoutPreferencesStore.ts"],"sourcesContent":["import { useState, useEffect } from 'react';\nimport { DESKTOP_MIN_WIDTH } from './useResizableColumns';\n\ntype ScreenSize = {\n width: number;\n height: number;\n};\n\ntype UseScreenSizeOptions = {\n width?: boolean;\n height?: boolean;\n};\n\ntype UseScreenSizeReturn = {\n width?: number;\n height?: number;\n screenSize: ScreenSize;\n};\n\n// Mobile width in pixels\nconst MOBILE_WIDTH = 931;\n/**\n * Largest width that still gets the stacked layout on the creation screens.\n *\n * Derived from the three-column geometry instead of a number of its own: one\n * pixel above it the two side panels and the question bank all fit at their\n * minimum. It used to be a loose 1200, which let the desktop layout render in\n * a width where the bank was already below its floor.\n */\nconst SMALL_SCREEN_WIDTH = DESKTOP_MIN_WIDTH - 1;\n\n/**\n * Hook para capturar o tamanho da tela do usuário\n * @param options - Opções para escolher quais dimensões capturar\n * @returns Objeto com as dimensões solicitadas e o tamanho completo da tela\n */\nexport const useScreenSize = (\n options: UseScreenSizeOptions = {}\n): UseScreenSizeReturn => {\n const [screenSize, setScreenSize] = useState<ScreenSize>({\n width: window.innerWidth,\n height: window.innerHeight,\n });\n\n useEffect(() => {\n const handleResize = () => {\n setScreenSize({\n width: window.innerWidth,\n height: window.innerHeight,\n });\n };\n\n // Adicionar listener para mudanças de tamanho\n window.addEventListener('resize', handleResize);\n\n // Cleanup do listener\n return () => {\n window.removeEventListener('resize', handleResize);\n };\n }, []);\n\n // Retornar apenas as dimensões solicitadas\n const result: UseScreenSizeReturn = {\n screenSize,\n };\n\n if (options.width !== false) {\n result.width = screenSize.width;\n }\n\n if (options.height !== false) {\n result.height = screenSize.height;\n }\n\n return result;\n};\n\n/**\n * Hook para capturar apenas a largura da tela\n */\nexport const useScreenWidth = (): number => {\n const { width } = useScreenSize({ width: true, height: false });\n return width!;\n};\n\n/**\n * Hook para capturar apenas a altura da tela\n */\nexport const useScreenHeight = (): number => {\n const { height } = useScreenSize({ width: false, height: true });\n return height!;\n};\n\n/**\n * Hook para capturar o tamanho completo da tela\n */\nexport const useFullScreenSize = (): ScreenSize => {\n const { screenSize } = useScreenSize();\n return screenSize;\n};\n\n/**\n * Hook to detect screen size\n * @returns true if the screen is mobile, false otherwise\n */\nexport const useMobile = () => {\n const [isMobile, setIsMobile] = useState(false);\n\n useEffect(() => {\n const checkScreenSize = () => {\n setIsMobile(window.innerWidth < MOBILE_WIDTH);\n };\n\n checkScreenSize();\n\n window.addEventListener('resize', checkScreenSize);\n\n return () => window.removeEventListener('resize', checkScreenSize);\n }, []);\n\n return isMobile;\n};\n\n/**\n * Hook to detect the width below which the creation screens stack their\n * columns instead of showing the three resizable ones.\n *\n * Used by ActivityCreate and RecommendedLessonCreate components.\n *\n * @returns true when the three-column layout would not fit at its minimums\n */\nexport const useTabletScreen = () => {\n /*\n Resolved synchronously on the first render. Starting at `false` meant the\n first paint on a phone was always the desktop three-column layout, which\n then jumped to the narrow one as soon as the effect ran.\n */\n const [isSmallScreen, setIsSmallScreen] = useState(\n () => window.innerWidth <= SMALL_SCREEN_WIDTH\n );\n\n useEffect(() => {\n const checkScreenSize = () => {\n setIsSmallScreen(window.innerWidth <= SMALL_SCREEN_WIDTH);\n };\n\n checkScreenSize();\n\n window.addEventListener('resize', checkScreenSize);\n\n return () => window.removeEventListener('resize', checkScreenSize);\n }, []);\n\n return isSmallScreen;\n};\n","import {\n PointerEvent as ReactPointerEvent,\n KeyboardEvent as ReactKeyboardEvent,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport {\n LayoutPanel,\n LayoutScope,\n SIDE_PANEL_DEFAULT_WIDTH,\n usePanelWidthPreference,\n} from '../store/layoutPreferencesStore';\n\n/**\n * Largura mínima da coluna central (banco de questões/aulas) — o quanto os\n * divisores deixam de espaço antes de travar.\n *\n * O valor é ditado pelo conteúdo. Em 320px o banco ainda cabia, mas lido: o\n * enunciado e as alternativas do card quebravam a cada três ou quatro\n * palavras, e o cabeçalho da questão virava uma coluna de seis linhas. 400px\n * é o mesmo piso das laterais, o que mantém as três colunas comparáveis e dá\n * ao card uma linha de texto de leitura razoável.\n *\n * Abaixo de 480px o toolbar do banco empilha título, busca, contador e botão\n * (`@md` = 28rem sobre a largura do container, já descontado o `p-4`), então\n * a faixa entre este piso e 480px continua sendo atendida pelo layout\n * empilhado do toolbar, e não por compressão.\n *\n * Quem garante que esse mínimo é alcançável é `DESKTOP_MIN_WIDTH`: abaixo\n * dele as telas de criação trocam as três colunas pelo layout empilhado, em\n * vez de espremer o banco.\n */\nexport const BANK_MIN_WIDTH = 400;\n\n/** Ajuste por seta do teclado, em px. */\nexport const RESIZE_KEYBOARD_STEP = 16;\n\n/** Ajuste por seta com Shift, em px. */\nexport const RESIZE_KEYBOARD_STEP_LARGE = 48;\n\n/** `gap-5` entre os 5 filhos do flex row: 4 intervalos de 20px. */\nconst COLUMN_GAP = 20;\nconst GAP_COUNT = 4;\n\n/** Os dois divisores ocupam 1px cada. */\nconst DIVIDERS_WIDTH = 2;\n\n/** Espaço consumido pelo layout antes de sobrar largura para as colunas. */\nconst LAYOUT_OVERHEAD = COLUMN_GAP * GAP_COUNT + DIVIDERS_WIDTH;\n\n/**\n * Menor largura em que as três colunas cabem com todas no mínimo: as duas\n * laterais no padrão e o banco em `BANK_MIN_WIDTH`.\n *\n * É o limiar que `useTabletScreen` usa para escolher entre o layout de três\n * colunas e o empilhado. Derivar daqui, em vez de repetir um número solto,\n * é o que impede o caso de o layout desktop aparecer numa largura onde o\n * banco já nasceria abaixo do mínimo.\n */\nexport const DESKTOP_MIN_WIDTH =\n SIDE_PANEL_DEFAULT_WIDTH * 2 + BANK_MIN_WIDTH + LAYOUT_OVERHEAD;\n\n/**\n * Sentido em que cada coluna cresce: arrastar para a direita alarga os\n * filtros, arrastar para a esquerda alarga a prévia.\n */\nconst GROW_DIRECTION: Record<LayoutPanel, number> = {\n filters: 1,\n preview: -1,\n};\n\n/**\n * Maior largura que uma coluna lateral pode assumir sem empurrar o banco\n * abaixo de `BANK_MIN_WIDTH`.\n *\n * @param containerWidth - Largura medida do container das colunas\n * @param otherPanelWidth - Largura da outra coluna lateral\n * @returns Largura máxima; nunca menor que o padrão\n */\nexport const getMaxPanelWidth = (\n containerWidth: number,\n otherPanelWidth: number\n): number => {\n if (containerWidth <= 0) return SIDE_PANEL_DEFAULT_WIDTH;\n const budget =\n containerWidth - LAYOUT_OVERHEAD - BANK_MIN_WIDTH - otherPanelWidth;\n return Math.max(SIDE_PANEL_DEFAULT_WIDTH, Math.floor(budget));\n};\n\n/**\n * Mantém uma largura entre o padrão e o máximo que cabe na tela.\n *\n * @param width - Largura desejada\n * @param containerWidth - Largura medida do container\n * @param otherPanelWidth - Largura da outra coluna lateral\n * @returns Largura aplicável\n */\nexport const clampPanelToContainer = (\n width: number,\n containerWidth: number,\n otherPanelWidth: number\n): number => {\n const max = getMaxPanelWidth(containerWidth, otherPanelWidth);\n return Math.min(Math.max(width, SIDE_PANEL_DEFAULT_WIDTH), max);\n};\n\n/**\n * Resolve as larguras que serão realmente aplicadas.\n *\n * As duas laterais disputam o mesmo espaço, então não basta clampar uma de\n * cada vez. Quando a soma não cabe — a janela encolheu depois do arraste — o\n * excesso é devolvido proporcionalmente ao quanto cada coluna está **acima**\n * do padrão, e nenhuma desce abaixo dele.\n *\n * O resultado é derivado a cada render em vez de sobrescrever o valor do store:\n * alargar a janela de volta restaura a largura que o usuário escolheu.\n *\n * @param containerWidth - Largura medida do container (0 se ainda não medido)\n * @param preferredFilters - Largura desejada da coluna de filtros\n * @param preferredPreview - Largura desejada da coluna de prévia\n * @returns Larguras aplicáveis das duas colunas\n */\nexport const resolveColumnWidths = (\n containerWidth: number,\n preferredFilters: number,\n preferredPreview: number\n): { filters: number; preview: number } => {\n const filters = Math.max(preferredFilters, SIDE_PANEL_DEFAULT_WIDTH);\n const preview = Math.max(preferredPreview, SIDE_PANEL_DEFAULT_WIDTH);\n\n // Antes da primeira medição não há como saber o que cabe.\n if (containerWidth <= 0) return { filters, preview };\n\n const budget = containerWidth - LAYOUT_OVERHEAD - BANK_MIN_WIDTH;\n const excess = filters + preview - budget;\n if (excess <= 0) return { filters, preview };\n\n const filtersSlack = filters - SIDE_PANEL_DEFAULT_WIDTH;\n const previewSlack = preview - SIDE_PANEL_DEFAULT_WIDTH;\n const totalSlack = filtersSlack + previewSlack;\n\n // Ambas já estão no mínimo: a tela é estreita demais e o banco cede. Encolher\n // mais deixaria as colunas menores que o conteúdo que elas precisam mostrar.\n if (totalSlack <= 0) return { filters, preview };\n\n const reduction = Math.min(excess, totalSlack);\n const filtersCut = Math.round((reduction * filtersSlack) / totalSlack);\n\n return {\n filters: filters - filtersCut,\n preview: preview - (reduction - filtersCut),\n };\n};\n\n/**\n * Traduz a tecla pressionada em variação de largura, no eixo horizontal.\n *\n * @param key - Tecla do evento\n * @param step - Passo em px\n * @returns Variação em px, ou `null` quando a tecla não redimensiona\n */\nconst getHorizontalKeyDelta = (key: string, step: number): number | null => {\n if (key === 'ArrowRight') return step;\n if (key === 'ArrowLeft') return -step;\n return null;\n};\n\n/** Props prontas para o `ResizableDivider` de uma coluna. */\nexport interface ResizableDividerHandlers {\n value: number;\n min: number;\n max: number;\n disabled: boolean;\n isDragging: boolean;\n onPointerDown: (event: ReactPointerEvent<HTMLElement>) => void;\n onPointerMove: (event: ReactPointerEvent<HTMLElement>) => void;\n onPointerUp: (event: ReactPointerEvent<HTMLElement>) => void;\n onKeyDown: (event: ReactKeyboardEvent<HTMLElement>) => void;\n onDoubleClick: () => void;\n}\n\nexport interface UseResizableColumnsResult {\n containerRef: (node: HTMLDivElement | null) => void;\n filtersWidth: number;\n previewWidth: number;\n filtersDividerProps: ResizableDividerHandlers;\n previewDividerProps: ResizableDividerHandlers;\n}\n\n/**\n * Controla as duas colunas laterais redimensionáveis das telas de criação.\n *\n * Um hook só para os dois divisores porque os limites são acoplados: o quanto\n * a prévia pode crescer depende de quanto os filtros já ocuparam.\n *\n * As larguras valem só enquanto a tela está montada: ao desmontar, as duas\n * colunas voltam ao padrão, de modo que a próxima visita não herda o arraste\n * da anterior.\n *\n * @param scope - Tela cujas larguras devem ser lidas\n * @returns Larguras aplicáveis e as props de cada divisor\n */\nexport const useResizableColumns = (\n scope: LayoutScope\n): UseResizableColumnsResult => {\n const { filtersWidth, previewWidth, setPanelWidth, resetPanelWidth } =\n usePanelWidthPreference(scope);\n\n const [containerWidth, setContainerWidth] = useState(0);\n const [draft, setDraft] = useState<{\n panel: LayoutPanel;\n width: number;\n } | null>(null);\n\n // `currentWidth` mora aqui, e não só no estado `draft`, para o `pointerup`\n // ler a última largura sem depender do render que o `pointermove` agendou.\n const dragRef = useRef<{\n panel: LayoutPanel;\n startX: number;\n startWidth: number;\n currentWidth: number;\n } | null>(null);\n\n const observerRef = useRef<ResizeObserver | null>(null);\n\n const containerRef = useCallback((node: HTMLDivElement | null) => {\n observerRef.current?.disconnect();\n observerRef.current = null;\n\n if (!node) {\n setContainerWidth(0);\n return;\n }\n\n setContainerWidth(node.getBoundingClientRect().width);\n\n if (typeof ResizeObserver === 'undefined') return;\n const observer = new ResizeObserver(() => {\n setContainerWidth(node.getBoundingClientRect().width);\n });\n observer.observe(node);\n observerRef.current = observer;\n }, []);\n\n useEffect(() => () => observerRef.current?.disconnect(), []);\n\n useEffect(\n () => () => {\n resetPanelWidth(scope, 'filters');\n resetPanelWidth(scope, 'preview');\n },\n [resetPanelWidth, scope]\n );\n\n const preferredFilters =\n draft?.panel === 'filters' ? draft.width : filtersWidth;\n const preferredPreview =\n draft?.panel === 'preview' ? draft.width : previewWidth;\n\n const resolved = resolveColumnWidths(\n containerWidth,\n preferredFilters,\n preferredPreview\n );\n\n // Lido dentro dos handlers de pointer, que não podem depender do valor\n // capturado no render em que o arraste começou.\n const geometryRef = useRef({ containerWidth, resolved });\n geometryRef.current = { containerWidth, resolved };\n\n const isDragging = draft !== null;\n\n useEffect(() => {\n if (!isDragging) return;\n\n // O cursor precisa valer para a janela inteira: durante o arraste o ponteiro\n // sai de cima do divisor e passaria a mostrar o cursor de texto ou de link.\n const { body } = document;\n const previousCursor = body.style.cursor;\n const previousUserSelect = body.style.userSelect;\n body.style.cursor = 'col-resize';\n body.style.userSelect = 'none';\n\n return () => {\n body.style.cursor = previousCursor;\n body.style.userSelect = previousUserSelect;\n };\n }, [isDragging]);\n\n const getOtherWidth = useCallback((panel: LayoutPanel): number => {\n const { resolved: current } = geometryRef.current;\n return panel === 'filters' ? current.preview : current.filters;\n }, []);\n\n const commitWidth = useCallback(\n (panel: LayoutPanel, width: number) => {\n const { containerWidth: measured } = geometryRef.current;\n setPanelWidth(\n scope,\n panel,\n clampPanelToContainer(width, measured, getOtherWidth(panel))\n );\n },\n [getOtherWidth, scope, setPanelWidth]\n );\n\n const handlePointerDown = useCallback(\n (panel: LayoutPanel) => (event: ReactPointerEvent<HTMLElement>) => {\n if (event.button !== 0) return;\n\n const { containerWidth: measured, resolved: current } =\n geometryRef.current;\n if (\n getMaxPanelWidth(measured, getOtherWidth(panel)) <=\n SIDE_PANEL_DEFAULT_WIDTH\n ) {\n return;\n }\n\n event.preventDefault();\n // Optional call: o jsdom não implementa a Pointer Capture API.\n event.currentTarget.setPointerCapture?.(event.pointerId);\n\n const startWidth =\n panel === 'filters' ? current.filters : current.preview;\n dragRef.current = {\n panel,\n startX: event.clientX,\n startWidth,\n currentWidth: startWidth,\n };\n setDraft({ panel, width: startWidth });\n },\n [getOtherWidth]\n );\n\n const handlePointerMove = useCallback(\n (event: ReactPointerEvent<HTMLElement>) => {\n const drag = dragRef.current;\n if (!drag) return;\n\n const delta = (event.clientX - drag.startX) * GROW_DIRECTION[drag.panel];\n const { containerWidth: measured } = geometryRef.current;\n\n // Clampar já aqui (e não só na renderização) evita o arraste \"morto\":\n // sem isso o rascunho acumularia 2000px fora do limite e o usuário teria\n // de desfazer todos eles antes da coluna voltar a se mexer.\n const width = clampPanelToContainer(\n drag.startWidth + delta,\n measured,\n getOtherWidth(drag.panel)\n );\n\n drag.currentWidth = width;\n setDraft({ panel: drag.panel, width });\n },\n [getOtherWidth]\n );\n\n const handlePointerUp = useCallback(\n (event: ReactPointerEvent<HTMLElement>) => {\n const drag = dragRef.current;\n if (!drag) return;\n\n event.currentTarget.releasePointerCapture?.(event.pointerId);\n dragRef.current = null;\n\n setDraft(null);\n // Escrito no store só no fim do arraste, não a cada frame.\n commitWidth(drag.panel, drag.currentWidth);\n },\n [commitWidth]\n );\n\n const handleKeyDown = useCallback(\n (panel: LayoutPanel) => (event: ReactKeyboardEvent<HTMLElement>) => {\n const { containerWidth: measured, resolved: current } =\n geometryRef.current;\n const otherWidth = getOtherWidth(panel);\n const max = getMaxPanelWidth(measured, otherWidth);\n if (max <= SIDE_PANEL_DEFAULT_WIDTH) return;\n\n if (event.key === 'Home') {\n event.preventDefault();\n resetPanelWidth(scope, panel);\n return;\n }\n\n if (event.key === 'End') {\n event.preventDefault();\n setPanelWidth(scope, panel, max);\n return;\n }\n\n const step = event.shiftKey\n ? RESIZE_KEYBOARD_STEP_LARGE\n : RESIZE_KEYBOARD_STEP;\n const delta = getHorizontalKeyDelta(event.key, step);\n if (delta === null) return;\n\n event.preventDefault();\n const currentWidth =\n panel === 'filters' ? current.filters : current.preview;\n commitWidth(panel, currentWidth + delta * GROW_DIRECTION[panel]);\n },\n [commitWidth, getOtherWidth, resetPanelWidth, scope, setPanelWidth]\n );\n\n const buildDividerProps = (panel: LayoutPanel): ResizableDividerHandlers => {\n const value = panel === 'filters' ? resolved.filters : resolved.preview;\n const otherWidth =\n panel === 'filters' ? resolved.preview : resolved.filters;\n const max = getMaxPanelWidth(containerWidth, otherWidth);\n\n return {\n value,\n min: SIDE_PANEL_DEFAULT_WIDTH,\n max,\n disabled: max <= SIDE_PANEL_DEFAULT_WIDTH,\n isDragging: draft?.panel === panel,\n onPointerDown: handlePointerDown(panel),\n onPointerMove: handlePointerMove,\n onPointerUp: handlePointerUp,\n onKeyDown: handleKeyDown(panel),\n onDoubleClick: () => resetPanelWidth(scope, panel),\n };\n };\n\n return {\n containerRef,\n filtersWidth: resolved.filters,\n previewWidth: resolved.preview,\n filtersDividerProps: buildDividerProps('filters'),\n previewDividerProps: buildDividerProps('preview'),\n };\n};\n","import { create } from 'zustand';\nimport { KEYS } from '../utils/keys';\n\n/**\n * Largura das colunas laterais (filtros e prévia) enquanto o usuário nunca\n * arrastou um divisor. É também a largura **mínima**: os divisores só permitem\n * alargar, e encolher devolve no máximo até este valor.\n */\nexport const SIDE_PANEL_DEFAULT_WIDTH = 400;\n\n/** Tela que possui o layout redimensionável. */\nexport type LayoutScope = 'activity' | 'lesson';\n\n/** Coluna lateral controlada por um divisor. */\nexport type LayoutPanel = 'filters' | 'preview';\n\n/** Largura de cada coluna lateral de uma tela. */\nexport interface PanelWidths {\n filters: number;\n preview: number;\n}\n\nexport interface LayoutPreferencesState {\n /** Larguras atuais por tela */\n widths: Record<LayoutScope, PanelWidths>;\n setPanelWidth: (\n scope: LayoutScope,\n panel: LayoutPanel,\n width: number\n ) => void;\n resetPanelWidth: (scope: LayoutScope, panel: LayoutPanel) => void;\n}\n\n/**\n * Apaga a chave em que as larguras já foram persistidas.\n *\n * As larguras deixaram de ser salvas, então a entrada gravada pelas versões\n * anteriores ficaria para sempre no aparelho de quem usou as telas de criação:\n * lixo que ninguém mais lê e que engana quem for depurar o storage.\n *\n * @returns {void}\n */\nconst dropLegacyPersistedWidths = (): void => {\n localStorage.removeItem(KEYS.LAYOUT_PREFERENCES_STORAGE);\n};\n\ndropLegacyPersistedWidths();\n\n/**\n * Mantém a largura acima do mínimo e descarta valores inválidos (`NaN`,\n * negativo, string) — um `width` inválido no style inline colapsaria a coluna.\n *\n * Não há teto aqui de propósito: o limite superior depende da largura da tela\n * em runtime e é aplicado por `useResizableColumns`, não pelo store.\n *\n * @param value - Largura candidata\n * @returns Largura válida, nunca menor que `SIDE_PANEL_DEFAULT_WIDTH`\n */\nexport const clampPanelWidth = (value: unknown): number => {\n const width = Number(value);\n if (!Number.isFinite(width)) return SIDE_PANEL_DEFAULT_WIDTH;\n return Math.max(SIDE_PANEL_DEFAULT_WIDTH, Math.round(width));\n};\n\n/**\n * Larguras iniciais de todas as telas.\n *\n * @returns Mapa de larguras no valor padrão\n */\nconst createDefaultWidths = (): Record<LayoutScope, PanelWidths> => ({\n activity: {\n filters: SIDE_PANEL_DEFAULT_WIDTH,\n preview: SIDE_PANEL_DEFAULT_WIDTH,\n },\n lesson: {\n filters: SIDE_PANEL_DEFAULT_WIDTH,\n preview: SIDE_PANEL_DEFAULT_WIDTH,\n },\n});\n\n/**\n * Aplica uma largura a uma coluna sem mutar o restante do mapa.\n *\n * @param widths - Mapa atual\n * @param scope - Tela alvo\n * @param panel - Coluna alvo\n * @param width - Nova largura, já validada\n * @returns Novo mapa de larguras\n */\nconst withPanelWidth = (\n widths: Record<LayoutScope, PanelWidths>,\n scope: LayoutScope,\n panel: LayoutPanel,\n width: number\n): Record<LayoutScope, PanelWidths> => ({\n ...widths,\n [scope]: { ...widths[scope], [panel]: width },\n});\n\n/**\n * Store das larguras das colunas redimensionáveis das telas de criação.\n *\n * As larguras valem só enquanto a tela está aberta: nada é persistido, e\n * `useResizableColumns` devolve as duas colunas ao padrão ao desmontar. Toda\n * visita começa no layout de 400px, independente de como a anterior terminou.\n *\n * `activity` e `lesson` continuam independentes — o professor pode alargar a\n * prévia ao montar uma atividade sem mexer na tela de aula da mesma sessão.\n */\nexport const useLayoutPreferencesStore = create<LayoutPreferencesState>()(\n (set) => ({\n widths: createDefaultWidths(),\n\n /**\n * Aplica a largura escolhida pelo usuário para uma coluna\n * @param scope - Tela alvo\n * @param panel - Coluna alvo\n * @param width - Largura em px\n * @returns {void}\n */\n setPanelWidth: (\n scope: LayoutScope,\n panel: LayoutPanel,\n width: number\n ): void => {\n set((state) => ({\n widths: withPanelWidth(\n state.widths,\n scope,\n panel,\n clampPanelWidth(width)\n ),\n }));\n },\n\n /**\n * Devolve uma coluna à largura padrão\n * @param scope - Tela alvo\n * @param panel - Coluna alvo\n * @returns {void}\n */\n resetPanelWidth: (scope: LayoutScope, panel: LayoutPanel): void => {\n set((state) => ({\n widths: withPanelWidth(\n state.widths,\n scope,\n panel,\n SIDE_PANEL_DEFAULT_WIDTH\n ),\n }));\n },\n })\n);\n\n/**\n * Lê as larguras de uma tela com seletores primitivos, evitando o re-render\n * extra que um seletor de objeto causaria a cada `set` do store.\n *\n * @param scope - Tela cujas larguras devem ser lidas\n * @returns Larguras atuais e os setters\n */\nexport const usePanelWidthPreference = (scope: LayoutScope) => {\n const filtersWidth = useLayoutPreferencesStore(\n (state) => state.widths[scope].filters\n );\n const previewWidth = useLayoutPreferencesStore(\n (state) => state.widths[scope].preview\n );\n const setPanelWidth = useLayoutPreferencesStore(\n (state) => state.setPanelWidth\n );\n const resetPanelWidth = useLayoutPreferencesStore(\n (state) => state.resetPanelWidth\n );\n\n return { filtersWidth, previewWidth, setPanelWidth, resetPanelWidth };\n};\n"],"mappings":"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","names":["useState","useEffect","useState","useEffect"]}
|
|
@@ -17,7 +17,7 @@ import {
|
|
|
17
17
|
} from "./chunk-OEW3ST4F.mjs";
|
|
18
18
|
import {
|
|
19
19
|
Modal_default
|
|
20
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-3YF7H577.mjs";
|
|
21
21
|
import {
|
|
22
22
|
Text_default
|
|
23
23
|
} from "./chunk-IMCIR6TJ.mjs";
|
|
@@ -267,4 +267,4 @@ export {
|
|
|
267
267
|
PerformanceReportModal,
|
|
268
268
|
PerformanceReportModal_default
|
|
269
269
|
};
|
|
270
|
-
//# sourceMappingURL=chunk-
|
|
270
|
+
//# sourceMappingURL=chunk-GKARHTZ2.mjs.map
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
var _chunkP7W2VN4Kjs = require('./chunk-P7W2VN4K.js');
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
var
|
|
6
|
+
var _chunkZNITTMV5js = require('./chunk-ZNITTMV5.js');
|
|
7
7
|
|
|
8
8
|
// src/components/AnnouncementModal/AnnouncementsGate.tsx
|
|
9
9
|
var _react = require('react');
|
|
@@ -16,7 +16,7 @@ var AnnouncementsGate = ({ apiClient, userId }) => {
|
|
|
16
16
|
const { current, pending, dismissCurrent } = useAnnouncements(userId);
|
|
17
17
|
if (!current) return null;
|
|
18
18
|
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
19
|
-
|
|
19
|
+
_chunkZNITTMV5js.AnnouncementModal_default,
|
|
20
20
|
{
|
|
21
21
|
announcement: current,
|
|
22
22
|
isOpen: true,
|
|
@@ -30,4 +30,4 @@ var AnnouncementsGate_default = AnnouncementsGate;
|
|
|
30
30
|
|
|
31
31
|
|
|
32
32
|
exports.AnnouncementsGate_default = AnnouncementsGate_default;
|
|
33
|
-
//# sourceMappingURL=chunk-
|
|
33
|
+
//# sourceMappingURL=chunk-GNKFBVW4.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-GNKFBVW4.js","../src/components/AnnouncementModal/AnnouncementsGate.tsx"],"names":[],"mappings":"AAAA;AACE;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACA;ACPA,8BAAwB;AAgDpB,+CAAA;AAbJ,IAAM,kBAAA,EAAoB,CAAC,EAAE,SAAA,EAAW,OAAO,CAAA,EAAA,GAA8B;AAG3E,EAAA,MAAM,iBAAA,EAAmB,4BAAA;AAAA,IACvB,CAAA,EAAA,GAAM,qDAAA,SAAgC,CAAA;AAAA,IACtC,CAAC,SAAS;AAAA,EACZ,CAAA;AAEA,EAAA,MAAM,EAAE,OAAA,EAAS,OAAA,EAAS,eAAe,EAAA,EAAI,gBAAA,CAAiB,MAAM,CAAA;AAEpE,EAAA,GAAA,CAAI,CAAC,OAAA,EAAS,OAAO,IAAA;AAErB,EAAA,uBACE,6BAAA;AAAA,IAAC,0CAAA;AAAA,IAAA;AAAA,MACC,YAAA,EAAc,OAAA;AAAA,MACd,MAAA,EAAM,IAAA;AAAA,MACN,OAAA,EAAS,cAAA;AAAA,MACT,cAAA,EAAgB,OAAA,CAAQ,OAAA,EAAS;AAAA,IAAA;AAAA,EACnC,CAAA;AAEJ,CAAA;AAEA,IAAO,0BAAA,EAAQ,iBAAA;AD7Bf;AACA;AACE;AACF,8DAAC","file":"/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-GNKFBVW4.js","sourcesContent":[null,"import { useMemo } from 'react';\nimport AnnouncementModal from './AnnouncementModal';\nimport { createUseAnnouncements } from '../../hooks/useAnnouncements';\nimport type { AnnouncementsApiClient } from '../../types/announcements';\n\n/**\n * Props for {@link AnnouncementsGate}\n */\nexport type AnnouncementsGateProps = {\n /** Authenticated API client of the host app */\n apiClient: AnnouncementsApiClient;\n /**\n * Id of the logged-in user. Scopes the \"already seen\" storage, so two people\n * sharing a browser do not hide each other's announcements. Pass null/undefined\n * while unauthenticated and nothing is fetched.\n */\n userId?: string | null;\n};\n\n/**\n * Drop-in announcements gate for the authenticated app shell.\n *\n * Mount it once inside the logged-in layout and it takes care of everything:\n * fetching the announcements for this user's institution and profile, skipping\n * the ones already dismissed (localStorage), and showing the rest one after\n * another until the queue is empty.\n *\n * Identical in the student, teacher and manager apps — the only difference is\n * the API client each one injects.\n *\n * @example\n * ```tsx\n * <AnnouncementsGate apiClient={api} userId={user?.id} />\n * ```\n */\nconst AnnouncementsGate = ({ apiClient, userId }: AnnouncementsGateProps) => {\n // The hook factory closes over the client, so it must not be recreated on\n // every render — that would reset the fetch guard and refetch in a loop.\n const useAnnouncements = useMemo(\n () => createUseAnnouncements(apiClient),\n [apiClient]\n );\n\n const { current, pending, dismissCurrent } = useAnnouncements(userId);\n\n if (!current) return null;\n\n return (\n <AnnouncementModal\n announcement={current}\n isOpen\n onClose={dismissCurrent}\n remainingCount={pending.length - 1}\n />\n );\n};\n\nexport default AnnouncementsGate;\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _chunk5QUP5HKBjs = require('./chunk-5QUP5HKB.js');
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
var _chunkOSTHYDKMjs = require('./chunk-OSTHYDKM.js');
|
|
@@ -144,7 +144,7 @@ function ToneTile({
|
|
|
144
144
|
value
|
|
145
145
|
}) {
|
|
146
146
|
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
147
|
-
|
|
147
|
+
_chunk5QUP5HKBjs.SimulationStatCard,
|
|
148
148
|
{
|
|
149
149
|
tone,
|
|
150
150
|
icon: TONE_ICONS[tone],
|
|
@@ -207,4 +207,4 @@ function answerTiles({
|
|
|
207
207
|
|
|
208
208
|
|
|
209
209
|
exports.formatCount = formatCount; exports.MISSING_VALUE = MISSING_VALUE; exports.formatScore = formatScore; exports.formatPercentage = formatPercentage; exports.formatHoursMinutes = formatHoursMinutes; exports.formatDateTime = formatDateTime; exports.formatClock = formatClock; exports.formatMinutesSeconds = formatMinutesSeconds; exports.ENEM_MOMENT_PERFORMANCE_ORDER = ENEM_MOMENT_PERFORMANCE_ORDER; exports.ENEM_MOMENT_PERFORMANCE_LABELS = ENEM_MOMENT_PERFORMANCE_LABELS; exports.readableTextColor = readableTextColor; exports.EnemMomentTierBadge = EnemMomentTierBadge; exports.EnemMomentPerformanceBadge = EnemMomentPerformanceBadge; exports.ParticipationBadge = ParticipationBadge; exports.ToneTile = ToneTile; exports.scoreText = scoreText; exports.numberedExamScores = numberedExamScores; exports.answerTiles = answerTiles;
|
|
210
|
-
//# sourceMappingURL=chunk-
|
|
210
|
+
//# sourceMappingURL=chunk-GTBPMNTJ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-CDLOMECB.js","../src/components/EnemMoment/utils.ts","../src/components/EnemMoment/PerformanceBadge.tsx","../src/components/EnemMoment/ToneTiles.tsx"],"names":["jsx"],"mappings":"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","file":"/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-CDLOMECB.js","sourcesContent":[null,"/**\n * How the Momento ENEM sections write numbers, scores and times — pt-BR, and\n * \"—\" for what the API could not give.\n */\n\n/** Integer with pt-BR thousands separators: 16778 → \"16.778\". */\nexport const formatCount = (value: number): string =>\n value.toLocaleString('pt-BR');\n\n/** Shown in place of a number the API could not give. */\nexport const MISSING_VALUE = '—';\n\n/** A 0–10 score, one decimal, pt-BR — as the other reports print it: \"5,2\". */\nexport const formatScore = (score: number): string =>\n score.toLocaleString('pt-BR', {\n minimumFractionDigits: 1,\n maximumFractionDigits: 1,\n });\n\n/** A 0–100 share, up to one decimal, pt-BR: 18.3 → \"18,3%\"; `null` → \"—\". */\nexport const formatPercentage = (value: number | null): string =>\n value === null\n ? MISSING_VALUE\n : `${value.toLocaleString('pt-BR', { maximumFractionDigits: 1 })}%`;\n\n/**\n * A long duration, to the minute: 4800 → \"1h 20min\", 7200 → \"2h\",\n * 1500 → \"25min\". Under half a minute it falls back to seconds, so a real\n * value never reads \"0min\".\n */\nexport function formatHoursMinutes(seconds: number | null): string {\n if (seconds === null || !Number.isFinite(seconds)) return MISSING_VALUE;\n\n const totalMinutes = Math.round(seconds / 60);\n if (totalMinutes === 0) return `${Math.round(seconds)}s`;\n\n const hours = Math.floor(totalMinutes / 60);\n const minutes = totalMinutes % 60;\n if (hours === 0) return `${minutes}min`;\n return minutes === 0 ? `${hours}h` : `${hours}h ${minutes}min`;\n}\n\n/**\n * A moment as the student modals write it: \"24/09/2026 • 14:05h\", in the\n * viewer's time zone.\n */\nexport function formatDateTime(iso: string | null): string {\n const date = iso ? new Date(iso) : null;\n if (!date || Number.isNaN(date.getTime())) return MISSING_VALUE;\n\n const pad = (value: number) => String(value).padStart(2, '0');\n return `${pad(date.getDate())}/${pad(date.getMonth() + 1)}/${date.getFullYear()} • ${pad(date.getHours())}:${pad(date.getMinutes())}h`;\n}\n\n/** A duration as a clock, to the second: 4805 → \"01:20:05\". */\nexport function formatClock(seconds: number | null): string {\n if (seconds === null || !Number.isFinite(seconds)) return MISSING_VALUE;\n\n const total = Math.round(seconds);\n const pad = (value: number) => String(value).padStart(2, '0');\n return `${pad(Math.floor(total / 3600))}:${pad(Math.floor((total % 3600) / 60))}:${pad(total % 60)}`;\n}\n\n/**\n * A short duration, to the second: 89 → \"1min 29s\", 60 → \"1min\", 45 → \"45s\".\n */\nexport function formatMinutesSeconds(seconds: number | null): string {\n if (seconds === null || !Number.isFinite(seconds)) return MISSING_VALUE;\n\n const totalSeconds = Math.round(seconds);\n const minutes = Math.floor(totalSeconds / 60);\n const rest = totalSeconds % 60;\n if (minutes === 0) return `${rest}s`;\n return rest === 0 ? `${minutes}min` : `${minutes}min ${rest}s`;\n}\n","import type { ReactNode } from 'react';\nimport { InfoIcon } from '@phosphor-icons/react/dist/csr/Info';\nimport Badge from '../Badge/Badge';\nimport { Tooltip } from '../Tooltip/Tooltip';\nimport { useTheme } from '../../hooks/useTheme';\nimport type { EnemMomentPerformance } from './types';\n\n/** The \"Desempenho\" tiers, best first — the order every menu lists them. */\nexport const ENEM_MOMENT_PERFORMANCE_ORDER: readonly EnemMomentPerformance[] = [\n 'HIGHLIGHT',\n 'ABOVE_AVERAGE',\n 'BELOW_AVERAGE',\n 'ATTENTION_POINT',\n 'NO_EXAM',\n];\n\n/** A student's tier as its badge reads — who took nothing, \"Não participou\". */\nexport const ENEM_MOMENT_PERFORMANCE_LABELS: Record<\n EnemMomentPerformance,\n string\n> = {\n HIGHLIGHT: 'DESTAQUE',\n ABOVE_AVERAGE: 'ACIMA DA MÉDIA',\n BELOW_AVERAGE: 'ABAIXO DA MÉDIA',\n ATTENTION_POINT: 'PONTO DE ATENÇÃO',\n NO_EXAM: 'NÃO PARTICIPOU',\n};\n\n/**\n * The fill of each tier: the map palette, the same in both themes, so a badge\n * carries the color of the pie slice of its tier. Tokens would not do — the\n * dark theme redefines them. Who took nothing is a neutral that flips with the\n * theme, to stay visible.\n */\nconst TIER_COLORS: Record<Exclude<EnemMomentPerformance, 'NO_EXAM'>, string> = {\n HIGHLIGHT: '#66b584',\n ABOVE_AVERAGE: '#f8cc2e',\n BELOW_AVERAGE: '#fb954b',\n ATTENTION_POINT: '#b91c1c',\n};\n\nconst tierColor = (performance: EnemMomentPerformance, isDark: boolean) => {\n if (performance === 'NO_EXAM') return isDark ? '#e5e5e5' : '#2f2f2f';\n return TIER_COLORS[performance];\n};\n\n/**\n * White or near-black text for a fill, by its perceived luminance (ITU-R\n * BT.601): the yellow tier gets dark text, the darker ones white.\n */\nexport const readableTextColor = (hexColor: string): string => {\n const hex = hexColor.replace('#', '');\n const r = Number.parseInt(hex.slice(0, 2), 16);\n const g = Number.parseInt(hex.slice(2, 4), 16);\n const b = Number.parseInt(hex.slice(4, 6), 16);\n const luminance = (0.299 * r + 0.587 * g + 0.114 * b) / 255;\n return luminance > 0.7 ? '#171717' : '#ffffff';\n};\n\n/** A chip in the color of a tier, with whatever it says. */\nexport function EnemMomentTierBadge({\n performance,\n children,\n}: Readonly<{ performance: EnemMomentPerformance; children: ReactNode }>) {\n const { isDark } = useTheme();\n const backgroundColor = tierColor(performance, isDark);\n\n return (\n <Badge\n variant=\"solid\"\n action=\"info\"\n size=\"small\"\n style={{ backgroundColor, color: readableTextColor(backgroundColor) }}\n >\n {children}\n </Badge>\n );\n}\n\n/** A student's \"Desempenho\": the tier of their score, or \"Não participou\". */\nexport function EnemMomentPerformanceBadge({\n performance,\n}: Readonly<{ performance: EnemMomentPerformance }>) {\n return (\n <EnemMomentTierBadge performance={performance}>\n {ENEM_MOMENT_PERFORMANCE_LABELS[performance]}\n </EnemMomentTierBadge>\n );\n}\n\n/**\n * Whether a student took the exams of the cut — `PARTIAL` only when there is\n * more than one moment run, and the student skipped one.\n */\nexport type EnemMomentStudentParticipation =\n | 'PARTICIPATED'\n | 'PARTIAL'\n | 'NOT_PARTICIPATED';\n\nconst PARTIAL_HINT = 'Participou em somente 1 momento';\n\n/**\n * \"Participou\" / \"Não participou\", in the green of \"Destaque\" and the dark of\n * who took nothing. A student who took only one of the moments gets an info\n * icon, which explains itself on hover.\n */\nexport function ParticipationBadge({\n participation,\n}: Readonly<{ participation: EnemMomentStudentParticipation }>) {\n if (participation === 'NOT_PARTICIPATED') {\n return (\n <EnemMomentTierBadge performance=\"NO_EXAM\">\n NÃO PARTICIPOU\n </EnemMomentTierBadge>\n );\n }\n\n if (participation === 'PARTIAL') {\n return (\n // In a portal: a table cell clips what overflows it, and the last column\n // is where the balloon needs room on the right.\n <Tooltip content={PARTIAL_HINT} position=\"top\" usePortal>\n <EnemMomentTierBadge performance=\"HIGHLIGHT\">\n <span className=\"inline-flex items-center gap-1\">\n PARTICIPOU\n <InfoIcon size={14} aria-label={PARTIAL_HINT} />\n </span>\n </EnemMomentTierBadge>\n </Tooltip>\n );\n }\n\n return (\n <EnemMomentTierBadge performance=\"HIGHLIGHT\">\n PARTICIPOU\n </EnemMomentTierBadge>\n );\n}\n","import type { ReactNode } from 'react';\nimport { StarIcon } from '@phosphor-icons/react/dist/csr/Star';\nimport { MedalIcon } from '@phosphor-icons/react/dist/csr/Medal';\nimport { SealWarningIcon } from '@phosphor-icons/react/dist/csr/SealWarning';\nimport { SealQuestionIcon } from '@phosphor-icons/react/dist/csr/SealQuestion';\nimport {\n SimulationStatCard,\n type StatTone,\n} from '../shared/SimulationSummaryCards';\nimport type { EnemMomentMoment } from './types';\nimport { formatCount, formatScore, MISSING_VALUE } from './utils';\n\nconst TONE_ICONS: Record<StatTone, ReactNode> = {\n grade: <StarIcon size={16} weight=\"bold\" />,\n correct: <MedalIcon size={16} weight=\"bold\" />,\n incorrect: <SealWarningIcon size={16} weight=\"bold\" />,\n blank: <SealQuestionIcon size={16} weight=\"bold\" />,\n};\n\nexport interface ToneTileData {\n key: string;\n tone: StatTone;\n label: string;\n value: string;\n}\n\n/**\n * The lib's simulado stat card, with the icon of each tone of the design —\n * the \"Dados gerais\" of a school's page and the \"Desempenho geral\" of a\n * student's modal.\n */\nexport function ToneTile({\n tone,\n label,\n value,\n}: Readonly<Omit<ToneTileData, 'key'>>) {\n return (\n <SimulationStatCard\n tone={tone}\n icon={TONE_ICONS[tone]}\n label={label}\n value={value}\n />\n );\n}\n\nexport const scoreText = (value: number | null) =>\n value === null ? MISSING_VALUE : formatScore(value);\n\n/**\n * Each exam's score in the order of the moments (whatever order the API sent),\n * with its moment's number — 0 for an exam the tabs lack.\n */\nexport function numberedExamScores(\n examScores: Array<{ examId: string; averageScore: number | null }>,\n moments: EnemMomentMoment[]\n) {\n return examScores\n .map((exam) => ({\n ...exam,\n number: moments.findIndex((moment) => moment.examId === exam.examId) + 1,\n }))\n .sort((a, b) => a.number - b.number);\n}\n\n/** The three answer counts, as tiles. */\nexport function answerTiles({\n correct,\n incorrect,\n blank,\n}: Readonly<{\n correct: number;\n incorrect: number;\n blank: number;\n}>): ToneTileData[] {\n return [\n {\n key: 'correct',\n tone: 'correct',\n label: 'Nº de questões corretas',\n value: formatCount(correct),\n },\n {\n key: 'incorrect',\n tone: 'incorrect',\n label: 'Nº de questões incorretas',\n value: formatCount(incorrect),\n },\n {\n key: 'blank',\n tone: 'blank',\n label: 'Nº de questões em branco',\n value: formatCount(blank),\n },\n ];\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-GTBPMNTJ.js","../src/components/EnemMoment/utils.ts","../src/components/EnemMoment/PerformanceBadge.tsx","../src/components/EnemMoment/ToneTiles.tsx"],"names":["jsx"],"mappings":"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","file":"/home/runner/work/analytica-frontend-lib/analytica-frontend-lib/dist/chunk-GTBPMNTJ.js","sourcesContent":[null,"/**\n * How the Momento ENEM sections write numbers, scores and times — pt-BR, and\n * \"—\" for what the API could not give.\n */\n\n/** Integer with pt-BR thousands separators: 16778 → \"16.778\". */\nexport const formatCount = (value: number): string =>\n value.toLocaleString('pt-BR');\n\n/** Shown in place of a number the API could not give. */\nexport const MISSING_VALUE = '—';\n\n/** A 0–10 score, one decimal, pt-BR — as the other reports print it: \"5,2\". */\nexport const formatScore = (score: number): string =>\n score.toLocaleString('pt-BR', {\n minimumFractionDigits: 1,\n maximumFractionDigits: 1,\n });\n\n/** A 0–100 share, up to one decimal, pt-BR: 18.3 → \"18,3%\"; `null` → \"—\". */\nexport const formatPercentage = (value: number | null): string =>\n value === null\n ? MISSING_VALUE\n : `${value.toLocaleString('pt-BR', { maximumFractionDigits: 1 })}%`;\n\n/**\n * A long duration, to the minute: 4800 → \"1h 20min\", 7200 → \"2h\",\n * 1500 → \"25min\". Under half a minute it falls back to seconds, so a real\n * value never reads \"0min\".\n */\nexport function formatHoursMinutes(seconds: number | null): string {\n if (seconds === null || !Number.isFinite(seconds)) return MISSING_VALUE;\n\n const totalMinutes = Math.round(seconds / 60);\n if (totalMinutes === 0) return `${Math.round(seconds)}s`;\n\n const hours = Math.floor(totalMinutes / 60);\n const minutes = totalMinutes % 60;\n if (hours === 0) return `${minutes}min`;\n return minutes === 0 ? `${hours}h` : `${hours}h ${minutes}min`;\n}\n\n/**\n * A moment as the student modals write it: \"24/09/2026 • 14:05h\", in the\n * viewer's time zone.\n */\nexport function formatDateTime(iso: string | null): string {\n const date = iso ? new Date(iso) : null;\n if (!date || Number.isNaN(date.getTime())) return MISSING_VALUE;\n\n const pad = (value: number) => String(value).padStart(2, '0');\n return `${pad(date.getDate())}/${pad(date.getMonth() + 1)}/${date.getFullYear()} • ${pad(date.getHours())}:${pad(date.getMinutes())}h`;\n}\n\n/** A duration as a clock, to the second: 4805 → \"01:20:05\". */\nexport function formatClock(seconds: number | null): string {\n if (seconds === null || !Number.isFinite(seconds)) return MISSING_VALUE;\n\n const total = Math.round(seconds);\n const pad = (value: number) => String(value).padStart(2, '0');\n return `${pad(Math.floor(total / 3600))}:${pad(Math.floor((total % 3600) / 60))}:${pad(total % 60)}`;\n}\n\n/**\n * A short duration, to the second: 89 → \"1min 29s\", 60 → \"1min\", 45 → \"45s\".\n */\nexport function formatMinutesSeconds(seconds: number | null): string {\n if (seconds === null || !Number.isFinite(seconds)) return MISSING_VALUE;\n\n const totalSeconds = Math.round(seconds);\n const minutes = Math.floor(totalSeconds / 60);\n const rest = totalSeconds % 60;\n if (minutes === 0) return `${rest}s`;\n return rest === 0 ? `${minutes}min` : `${minutes}min ${rest}s`;\n}\n","import type { ReactNode } from 'react';\nimport { InfoIcon } from '@phosphor-icons/react/dist/csr/Info';\nimport Badge from '../Badge/Badge';\nimport { Tooltip } from '../Tooltip/Tooltip';\nimport { useTheme } from '../../hooks/useTheme';\nimport type { EnemMomentPerformance } from './types';\n\n/** The \"Desempenho\" tiers, best first — the order every menu lists them. */\nexport const ENEM_MOMENT_PERFORMANCE_ORDER: readonly EnemMomentPerformance[] = [\n 'HIGHLIGHT',\n 'ABOVE_AVERAGE',\n 'BELOW_AVERAGE',\n 'ATTENTION_POINT',\n 'NO_EXAM',\n];\n\n/** A student's tier as its badge reads — who took nothing, \"Não participou\". */\nexport const ENEM_MOMENT_PERFORMANCE_LABELS: Record<\n EnemMomentPerformance,\n string\n> = {\n HIGHLIGHT: 'DESTAQUE',\n ABOVE_AVERAGE: 'ACIMA DA MÉDIA',\n BELOW_AVERAGE: 'ABAIXO DA MÉDIA',\n ATTENTION_POINT: 'PONTO DE ATENÇÃO',\n NO_EXAM: 'NÃO PARTICIPOU',\n};\n\n/**\n * The fill of each tier: the map palette, the same in both themes, so a badge\n * carries the color of the pie slice of its tier. Tokens would not do — the\n * dark theme redefines them. Who took nothing is a neutral that flips with the\n * theme, to stay visible.\n */\nconst TIER_COLORS: Record<Exclude<EnemMomentPerformance, 'NO_EXAM'>, string> = {\n HIGHLIGHT: '#66b584',\n ABOVE_AVERAGE: '#f8cc2e',\n BELOW_AVERAGE: '#fb954b',\n ATTENTION_POINT: '#b91c1c',\n};\n\nconst tierColor = (performance: EnemMomentPerformance, isDark: boolean) => {\n if (performance === 'NO_EXAM') return isDark ? '#e5e5e5' : '#2f2f2f';\n return TIER_COLORS[performance];\n};\n\n/**\n * White or near-black text for a fill, by its perceived luminance (ITU-R\n * BT.601): the yellow tier gets dark text, the darker ones white.\n */\nexport const readableTextColor = (hexColor: string): string => {\n const hex = hexColor.replace('#', '');\n const r = Number.parseInt(hex.slice(0, 2), 16);\n const g = Number.parseInt(hex.slice(2, 4), 16);\n const b = Number.parseInt(hex.slice(4, 6), 16);\n const luminance = (0.299 * r + 0.587 * g + 0.114 * b) / 255;\n return luminance > 0.7 ? '#171717' : '#ffffff';\n};\n\n/** A chip in the color of a tier, with whatever it says. */\nexport function EnemMomentTierBadge({\n performance,\n children,\n}: Readonly<{ performance: EnemMomentPerformance; children: ReactNode }>) {\n const { isDark } = useTheme();\n const backgroundColor = tierColor(performance, isDark);\n\n return (\n <Badge\n variant=\"solid\"\n action=\"info\"\n size=\"small\"\n style={{ backgroundColor, color: readableTextColor(backgroundColor) }}\n >\n {children}\n </Badge>\n );\n}\n\n/** A student's \"Desempenho\": the tier of their score, or \"Não participou\". */\nexport function EnemMomentPerformanceBadge({\n performance,\n}: Readonly<{ performance: EnemMomentPerformance }>) {\n return (\n <EnemMomentTierBadge performance={performance}>\n {ENEM_MOMENT_PERFORMANCE_LABELS[performance]}\n </EnemMomentTierBadge>\n );\n}\n\n/**\n * Whether a student took the exams of the cut — `PARTIAL` only when there is\n * more than one moment run, and the student skipped one.\n */\nexport type EnemMomentStudentParticipation =\n | 'PARTICIPATED'\n | 'PARTIAL'\n | 'NOT_PARTICIPATED';\n\nconst PARTIAL_HINT = 'Participou em somente 1 momento';\n\n/**\n * \"Participou\" / \"Não participou\", in the green of \"Destaque\" and the dark of\n * who took nothing. A student who took only one of the moments gets an info\n * icon, which explains itself on hover.\n */\nexport function ParticipationBadge({\n participation,\n}: Readonly<{ participation: EnemMomentStudentParticipation }>) {\n if (participation === 'NOT_PARTICIPATED') {\n return (\n <EnemMomentTierBadge performance=\"NO_EXAM\">\n NÃO PARTICIPOU\n </EnemMomentTierBadge>\n );\n }\n\n if (participation === 'PARTIAL') {\n return (\n // In a portal: a table cell clips what overflows it, and the last column\n // is where the balloon needs room on the right.\n <Tooltip content={PARTIAL_HINT} position=\"top\" usePortal>\n <EnemMomentTierBadge performance=\"HIGHLIGHT\">\n <span className=\"inline-flex items-center gap-1\">\n PARTICIPOU\n <InfoIcon size={14} aria-label={PARTIAL_HINT} />\n </span>\n </EnemMomentTierBadge>\n </Tooltip>\n );\n }\n\n return (\n <EnemMomentTierBadge performance=\"HIGHLIGHT\">\n PARTICIPOU\n </EnemMomentTierBadge>\n );\n}\n","import type { ReactNode } from 'react';\nimport { StarIcon } from '@phosphor-icons/react/dist/csr/Star';\nimport { MedalIcon } from '@phosphor-icons/react/dist/csr/Medal';\nimport { SealWarningIcon } from '@phosphor-icons/react/dist/csr/SealWarning';\nimport { SealQuestionIcon } from '@phosphor-icons/react/dist/csr/SealQuestion';\nimport {\n SimulationStatCard,\n type StatTone,\n} from '../shared/SimulationSummaryCards';\nimport type { EnemMomentMoment } from './types';\nimport { formatCount, formatScore, MISSING_VALUE } from './utils';\n\nconst TONE_ICONS: Record<StatTone, ReactNode> = {\n grade: <StarIcon size={16} weight=\"bold\" />,\n correct: <MedalIcon size={16} weight=\"bold\" />,\n incorrect: <SealWarningIcon size={16} weight=\"bold\" />,\n blank: <SealQuestionIcon size={16} weight=\"bold\" />,\n};\n\nexport interface ToneTileData {\n key: string;\n tone: StatTone;\n label: string;\n value: string;\n}\n\n/**\n * The lib's simulado stat card, with the icon of each tone of the design —\n * the \"Dados gerais\" of a school's page and the \"Desempenho geral\" of a\n * student's modal.\n */\nexport function ToneTile({\n tone,\n label,\n value,\n}: Readonly<Omit<ToneTileData, 'key'>>) {\n return (\n <SimulationStatCard\n tone={tone}\n icon={TONE_ICONS[tone]}\n label={label}\n value={value}\n />\n );\n}\n\nexport const scoreText = (value: number | null) =>\n value === null ? MISSING_VALUE : formatScore(value);\n\n/**\n * Each exam's score in the order of the moments (whatever order the API sent),\n * with its moment's number — 0 for an exam the tabs lack.\n */\nexport function numberedExamScores(\n examScores: Array<{ examId: string; averageScore: number | null }>,\n moments: EnemMomentMoment[]\n) {\n return examScores\n .map((exam) => ({\n ...exam,\n number: moments.findIndex((moment) => moment.examId === exam.examId) + 1,\n }))\n .sort((a, b) => a.number - b.number);\n}\n\n/** The three answer counts, as tiles. */\nexport function answerTiles({\n correct,\n incorrect,\n blank,\n}: Readonly<{\n correct: number;\n incorrect: number;\n blank: number;\n}>): ToneTileData[] {\n return [\n {\n key: 'correct',\n tone: 'correct',\n label: 'Nº de questões corretas',\n value: formatCount(correct),\n },\n {\n key: 'incorrect',\n tone: 'incorrect',\n label: 'Nº de questões incorretas',\n value: formatCount(incorrect),\n },\n {\n key: 'blank',\n tone: 'blank',\n label: 'Nº de questões em branco',\n value: formatCount(blank),\n },\n ];\n}\n"]}
|
|
@@ -6,7 +6,7 @@ var _chunkVT5CIYRYjs = require('./chunk-VT5CIYRY.js');
|
|
|
6
6
|
var _chunkFRU4YZ4Ujs = require('./chunk-FRU4YZ4U.js');
|
|
7
7
|
|
|
8
8
|
|
|
9
|
-
var
|
|
9
|
+
var _chunkCAQ2Q3ONjs = require('./chunk-CAQ2Q3ON.js');
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
var _chunkRIVDFVR5js = require('./chunk-RIVDFVR5.js');
|
|
@@ -665,7 +665,13 @@ var CardStatus = _react.forwardRef.call(void 0,
|
|
|
665
665
|
),
|
|
666
666
|
label && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "text-sm text-text-800", children: label })
|
|
667
667
|
] }),
|
|
668
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
668
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
669
|
+
_CaretRight.CaretRightIcon,
|
|
670
|
+
{
|
|
671
|
+
"aria-hidden": "true",
|
|
672
|
+
className: "min-w-6 min-h-6 text-text-800 cursor-pointer flex-shrink-0 ml-2"
|
|
673
|
+
}
|
|
674
|
+
)
|
|
669
675
|
] })
|
|
670
676
|
}
|
|
671
677
|
);
|
|
@@ -1497,7 +1503,7 @@ var CardSimulationHistory = _react.forwardRef.call(void 0, ({ data, onSimulation
|
|
|
1497
1503
|
] }),
|
|
1498
1504
|
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex items-center gap-1 flex-shrink-0", children: [
|
|
1499
1505
|
simulation.canDelete && onDeleteClick && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1500
|
-
|
|
1506
|
+
_chunkCAQ2Q3ONjs.IconButton_default,
|
|
1501
1507
|
{
|
|
1502
1508
|
size: "sm",
|
|
1503
1509
|
icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _Trash.TrashIcon, { size: 20 }),
|
|
@@ -1807,4 +1813,4 @@ var CardReadingFluency = _react.forwardRef.call(void 0,
|
|
|
1807
1813
|
|
|
1808
1814
|
|
|
1809
1815
|
exports.CardBase = CardBase; exports.CardActivitiesResults = CardActivitiesResults; exports.CardQuestions = CardQuestions; exports.CardProgress = CardProgress; exports.CardTopic = CardTopic; exports.CardPerformance = CardPerformance; exports.CardResults = CardResults; exports.CardStatus = CardStatus; exports.CardSettings = CardSettings; exports.CardSupport = CardSupport; exports.CardForum = CardForum; exports.CardAudio = CardAudio; exports.CardSimulado = CardSimulado; exports.CardTest = CardTest; exports.CardSimulationHistory = CardSimulationHistory; exports.EssayStatus = EssayStatus; exports.EssayReviewStatus = EssayReviewStatus; exports.CardEssayHistory = CardEssayHistory; exports.CardReadingFluency = CardReadingFluency;
|
|
1810
|
-
//# sourceMappingURL=chunk-
|
|
1816
|
+
//# sourceMappingURL=chunk-GXXDSBN2.js.map
|