analytica-frontend-lib 1.0.81 → 1.0.83
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/Accordation/index.js +76 -130
- package/dist/Accordation/index.js.map +1 -1
- package/dist/Accordation/index.mjs +76 -130
- package/dist/Accordation/index.mjs.map +1 -1
- package/dist/AlertDialog/index.js +1 -1
- package/dist/AlertDialog/index.js.map +1 -1
- package/dist/AlertDialog/index.mjs +1 -1
- package/dist/AlertDialog/index.mjs.map +1 -1
- package/dist/Card/index.d.mts +0 -3
- package/dist/Card/index.d.ts +0 -3
- package/dist/Card/index.js +76 -130
- package/dist/Card/index.js.map +1 -1
- package/dist/Card/index.mjs +76 -130
- package/dist/Card/index.mjs.map +1 -1
- package/dist/Modal/index.js +1 -1
- package/dist/Modal/index.js.map +1 -1
- package/dist/Modal/index.mjs +1 -1
- package/dist/Modal/index.mjs.map +1 -1
- package/dist/Quiz/index.d.mts +29 -0
- package/dist/Quiz/index.d.ts +29 -0
- package/dist/Quiz/index.js +3662 -0
- package/dist/Quiz/index.js.map +1 -0
- package/dist/Quiz/index.mjs +3673 -0
- package/dist/Quiz/index.mjs.map +1 -0
- package/dist/Quiz/useQuizStore/index.d.mts +108 -0
- package/dist/Quiz/useQuizStore/index.d.ts +108 -0
- package/dist/Quiz/useQuizStore/index.js +274 -0
- package/dist/Quiz/useQuizStore/index.js.map +1 -0
- package/dist/Quiz/useQuizStore/index.mjs +249 -0
- package/dist/Quiz/useQuizStore/index.mjs.map +1 -0
- package/dist/index.css +50 -3
- package/dist/index.css.map +1 -1
- package/dist/index.d.mts +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +733 -132
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +731 -132
- package/dist/index.mjs.map +1 -1
- package/dist/simulated-result-QN5HCUY5.png +0 -0
- package/dist/styles.css +50 -3
- package/dist/styles.css.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
// src/components/Quiz/useQuizStore.ts
|
|
2
|
+
import { create } from "zustand";
|
|
3
|
+
import { devtools } from "zustand/middleware";
|
|
4
|
+
var useQuizStore = create()(
|
|
5
|
+
devtools(
|
|
6
|
+
(set, get) => {
|
|
7
|
+
let timerInterval = null;
|
|
8
|
+
const startTimer = () => {
|
|
9
|
+
if (timerInterval) {
|
|
10
|
+
clearInterval(timerInterval);
|
|
11
|
+
}
|
|
12
|
+
timerInterval = setInterval(() => {
|
|
13
|
+
const { timeElapsed } = get();
|
|
14
|
+
set({ timeElapsed: timeElapsed + 1 });
|
|
15
|
+
}, 1e3);
|
|
16
|
+
};
|
|
17
|
+
const stopTimer = () => {
|
|
18
|
+
if (timerInterval) {
|
|
19
|
+
clearInterval(timerInterval);
|
|
20
|
+
timerInterval = null;
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
return {
|
|
24
|
+
// Initial State
|
|
25
|
+
currentQuestionIndex: 0,
|
|
26
|
+
selectedAnswers: {},
|
|
27
|
+
skippedQuestions: [],
|
|
28
|
+
userAnswers: [],
|
|
29
|
+
timeElapsed: 0,
|
|
30
|
+
isStarted: false,
|
|
31
|
+
isFinished: false,
|
|
32
|
+
// Setters
|
|
33
|
+
setBySimulado: (simulado) => set({ bySimulado: simulado }),
|
|
34
|
+
setByAtividade: (atividade) => set({ byAtividade: atividade }),
|
|
35
|
+
setByAula: (aula) => set({ byAula: aula }),
|
|
36
|
+
// Navigation
|
|
37
|
+
goToNextQuestion: () => {
|
|
38
|
+
const { currentQuestionIndex, getTotalQuestions } = get();
|
|
39
|
+
const totalQuestions = getTotalQuestions();
|
|
40
|
+
if (currentQuestionIndex < totalQuestions - 1) {
|
|
41
|
+
set({ currentQuestionIndex: currentQuestionIndex + 1 });
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
goToPreviousQuestion: () => {
|
|
45
|
+
const { currentQuestionIndex } = get();
|
|
46
|
+
if (currentQuestionIndex > 0) {
|
|
47
|
+
set({ currentQuestionIndex: currentQuestionIndex - 1 });
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
goToQuestion: (index) => {
|
|
51
|
+
const { getTotalQuestions } = get();
|
|
52
|
+
const totalQuestions = getTotalQuestions();
|
|
53
|
+
if (index >= 0 && index < totalQuestions) {
|
|
54
|
+
set({ currentQuestionIndex: index });
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
// Quiz Actions
|
|
58
|
+
selectAnswer: (questionId, answerId) => {
|
|
59
|
+
const { selectedAnswers, skippedQuestions, addUserAnswer } = get();
|
|
60
|
+
const newSkippedQuestions = skippedQuestions.filter(
|
|
61
|
+
(id) => id !== questionId
|
|
62
|
+
);
|
|
63
|
+
set({
|
|
64
|
+
selectedAnswers: {
|
|
65
|
+
...selectedAnswers,
|
|
66
|
+
[questionId]: answerId
|
|
67
|
+
},
|
|
68
|
+
skippedQuestions: newSkippedQuestions
|
|
69
|
+
});
|
|
70
|
+
addUserAnswer(questionId, answerId);
|
|
71
|
+
},
|
|
72
|
+
skipQuestion: () => {
|
|
73
|
+
const { getCurrentQuestion, skippedQuestions, addUserAnswer } = get();
|
|
74
|
+
const currentQuestion = getCurrentQuestion();
|
|
75
|
+
if (currentQuestion) {
|
|
76
|
+
set({
|
|
77
|
+
skippedQuestions: [...skippedQuestions, currentQuestion.id]
|
|
78
|
+
});
|
|
79
|
+
addUserAnswer(currentQuestion.id);
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
addUserAnswer: (questionId, answerId) => {
|
|
83
|
+
const { userAnswers, bySimulado, byAtividade, byAula } = get();
|
|
84
|
+
const quiz = bySimulado || byAtividade || byAula;
|
|
85
|
+
const question = quiz?.questions.find((q) => q.id === questionId);
|
|
86
|
+
if (!question) return;
|
|
87
|
+
const existingAnswerIndex = userAnswers.findIndex(
|
|
88
|
+
(answer) => answer.id === questionId
|
|
89
|
+
);
|
|
90
|
+
if (existingAnswerIndex !== -1) {
|
|
91
|
+
const updatedAnswers = [...userAnswers];
|
|
92
|
+
updatedAnswers[existingAnswerIndex] = {
|
|
93
|
+
...question,
|
|
94
|
+
answerKey: answerId || "",
|
|
95
|
+
isSkipped: !answerId
|
|
96
|
+
};
|
|
97
|
+
set({ userAnswers: updatedAnswers });
|
|
98
|
+
} else {
|
|
99
|
+
set({
|
|
100
|
+
userAnswers: [
|
|
101
|
+
...userAnswers,
|
|
102
|
+
{
|
|
103
|
+
...question,
|
|
104
|
+
answerKey: answerId || "",
|
|
105
|
+
isSkipped: !answerId
|
|
106
|
+
}
|
|
107
|
+
]
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
},
|
|
111
|
+
startQuiz: () => {
|
|
112
|
+
set({ isStarted: true, timeElapsed: 0 });
|
|
113
|
+
startTimer();
|
|
114
|
+
},
|
|
115
|
+
finishQuiz: () => {
|
|
116
|
+
set({ isFinished: true });
|
|
117
|
+
stopTimer();
|
|
118
|
+
},
|
|
119
|
+
resetQuiz: () => {
|
|
120
|
+
stopTimer();
|
|
121
|
+
set({
|
|
122
|
+
currentQuestionIndex: 0,
|
|
123
|
+
selectedAnswers: {},
|
|
124
|
+
skippedQuestions: [],
|
|
125
|
+
userAnswers: [],
|
|
126
|
+
timeElapsed: 0,
|
|
127
|
+
isStarted: false,
|
|
128
|
+
isFinished: false
|
|
129
|
+
});
|
|
130
|
+
},
|
|
131
|
+
// Timer
|
|
132
|
+
updateTime: (time) => set({ timeElapsed: time }),
|
|
133
|
+
startTimer,
|
|
134
|
+
stopTimer,
|
|
135
|
+
// Getters
|
|
136
|
+
getCurrentQuestion: () => {
|
|
137
|
+
const { bySimulado, byAtividade, byAula, currentQuestionIndex } = get();
|
|
138
|
+
const quiz = bySimulado || byAtividade || byAula;
|
|
139
|
+
if (!quiz) {
|
|
140
|
+
return null;
|
|
141
|
+
}
|
|
142
|
+
return quiz.questions[currentQuestionIndex];
|
|
143
|
+
},
|
|
144
|
+
getTotalQuestions: () => {
|
|
145
|
+
const { bySimulado, byAtividade, byAula } = get();
|
|
146
|
+
const quiz = bySimulado || byAtividade || byAula;
|
|
147
|
+
return quiz?.questions?.length || 0;
|
|
148
|
+
},
|
|
149
|
+
getAnsweredQuestions: () => {
|
|
150
|
+
const { selectedAnswers } = get();
|
|
151
|
+
return Object.keys(selectedAnswers).length;
|
|
152
|
+
},
|
|
153
|
+
getUnansweredQuestions: () => {
|
|
154
|
+
const {
|
|
155
|
+
bySimulado,
|
|
156
|
+
byAtividade,
|
|
157
|
+
byAula,
|
|
158
|
+
selectedAnswers,
|
|
159
|
+
skippedQuestions
|
|
160
|
+
} = get();
|
|
161
|
+
const quiz = bySimulado || byAtividade || byAula;
|
|
162
|
+
if (!quiz) return [];
|
|
163
|
+
const unansweredQuestions = [];
|
|
164
|
+
quiz.questions.forEach((question, index) => {
|
|
165
|
+
const isAnswered = question.id in selectedAnswers;
|
|
166
|
+
const isSkipped = skippedQuestions.includes(question.id);
|
|
167
|
+
if (!isAnswered && !isSkipped) {
|
|
168
|
+
unansweredQuestions.push(index + 1);
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
return unansweredQuestions;
|
|
172
|
+
},
|
|
173
|
+
getSkippedQuestions: () => {
|
|
174
|
+
const { skippedQuestions } = get();
|
|
175
|
+
return skippedQuestions.length;
|
|
176
|
+
},
|
|
177
|
+
getProgress: () => {
|
|
178
|
+
const { getTotalQuestions, getAnsweredQuestions } = get();
|
|
179
|
+
const total = getTotalQuestions();
|
|
180
|
+
const answered = getAnsweredQuestions();
|
|
181
|
+
return total > 0 ? answered / total * 100 : 0;
|
|
182
|
+
},
|
|
183
|
+
isQuestionAnswered: (questionId) => {
|
|
184
|
+
const { selectedAnswers } = get();
|
|
185
|
+
return questionId in selectedAnswers;
|
|
186
|
+
},
|
|
187
|
+
isQuestionSkipped: (questionId) => {
|
|
188
|
+
const { skippedQuestions } = get();
|
|
189
|
+
return skippedQuestions.includes(questionId);
|
|
190
|
+
},
|
|
191
|
+
getCurrentAnswer: () => {
|
|
192
|
+
const { getCurrentQuestion, selectedAnswers } = get();
|
|
193
|
+
const currentQuestion = getCurrentQuestion();
|
|
194
|
+
return selectedAnswers[currentQuestion?.id || ""];
|
|
195
|
+
},
|
|
196
|
+
getQuizTitle: () => {
|
|
197
|
+
const { bySimulado, byAtividade, byAula } = get();
|
|
198
|
+
const quiz = bySimulado || byAtividade || byAula;
|
|
199
|
+
return quiz?.title || "Quiz";
|
|
200
|
+
},
|
|
201
|
+
formatTime: (seconds) => {
|
|
202
|
+
const minutes = Math.floor(seconds / 60);
|
|
203
|
+
const remainingSeconds = seconds % 60;
|
|
204
|
+
return `${minutes.toString().padStart(2, "0")}:${remainingSeconds.toString().padStart(2, "0")}`;
|
|
205
|
+
},
|
|
206
|
+
getUserAnswers: () => {
|
|
207
|
+
const { userAnswers } = get();
|
|
208
|
+
return userAnswers;
|
|
209
|
+
},
|
|
210
|
+
getUnansweredQuestionsFromUserAnswers: () => {
|
|
211
|
+
const { bySimulado, byAtividade, byAula, userAnswers } = get();
|
|
212
|
+
const quiz = bySimulado || byAtividade || byAula;
|
|
213
|
+
if (!quiz) return [];
|
|
214
|
+
const unansweredQuestions = [];
|
|
215
|
+
quiz.questions.forEach((question, index) => {
|
|
216
|
+
const userAnswer = userAnswers.find(
|
|
217
|
+
(answer) => answer.id === question.id
|
|
218
|
+
);
|
|
219
|
+
if (!userAnswer || userAnswer.isSkipped) {
|
|
220
|
+
unansweredQuestions.push(index + 1);
|
|
221
|
+
}
|
|
222
|
+
});
|
|
223
|
+
return unansweredQuestions;
|
|
224
|
+
},
|
|
225
|
+
getQuestionsGroupedBySubject: () => {
|
|
226
|
+
const { bySimulado, byAtividade, byAula } = get();
|
|
227
|
+
const quiz = bySimulado || byAtividade || byAula;
|
|
228
|
+
if (!quiz) return {};
|
|
229
|
+
const groupedQuestions = {};
|
|
230
|
+
quiz.questions.forEach((question) => {
|
|
231
|
+
const subjectId = question.knowledgeMatrix?.[0]?.subjectId || "Sem mat\xE9ria";
|
|
232
|
+
if (!groupedQuestions[subjectId]) {
|
|
233
|
+
groupedQuestions[subjectId] = [];
|
|
234
|
+
}
|
|
235
|
+
groupedQuestions[subjectId].push(question);
|
|
236
|
+
});
|
|
237
|
+
return groupedQuestions;
|
|
238
|
+
}
|
|
239
|
+
};
|
|
240
|
+
},
|
|
241
|
+
{
|
|
242
|
+
name: "quiz-store"
|
|
243
|
+
}
|
|
244
|
+
)
|
|
245
|
+
);
|
|
246
|
+
export {
|
|
247
|
+
useQuizStore
|
|
248
|
+
};
|
|
249
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/Quiz/useQuizStore.ts"],"sourcesContent":["import { create } from 'zustand';\nimport { devtools } from 'zustand/middleware';\n\ninterface Question {\n id: string;\n questionText: string;\n correctOptionId: string;\n description: string;\n type: 'ALTERNATIVA' | 'DISSERTATIVA' | 'MULTIPLA_CHOICE';\n status: 'APROVADO' | 'REPROVADO';\n difficulty: 'FACIL' | 'MEDIO' | 'DIFICIL';\n examBoard: string | null;\n examYear: string | null;\n answerKey: string | null;\n createdAt: string;\n updatedAt: string;\n knowledgeMatrix: {\n areaKnowledgeId: string;\n subjectId: string;\n topicId: string;\n subtopicId: string;\n contentId: string;\n }[];\n options: {\n id: string;\n option: string;\n }[];\n createdBy: string;\n}\n\ninterface Simulado {\n id: string;\n title: string;\n questions: Question[];\n}\n\ninterface Atividade {\n id: string;\n title: string;\n questions: Question[];\n}\n\ninterface Aula {\n id: string;\n title: string;\n questions: Question[];\n}\n\ninterface UserAnswer extends Question {\n isSkipped: boolean;\n}\n\ninterface QuizState {\n // Data\n bySimulado?: Simulado;\n byAtividade?: Atividade;\n byAula?: Aula;\n\n // UI State\n currentQuestionIndex: number;\n selectedAnswers: Record<string, string>;\n skippedQuestions: string[];\n userAnswers: UserAnswer[];\n timeElapsed: number;\n isStarted: boolean;\n isFinished: boolean;\n\n // Actions\n setBySimulado: (simulado: Simulado) => void;\n setByAtividade: (atividade: Atividade) => void;\n setByAula: (aula: Aula) => void;\n\n // Quiz Navigation\n goToNextQuestion: () => void;\n goToPreviousQuestion: () => void;\n goToQuestion: (index: number) => void;\n\n // Quiz Actions\n selectAnswer: (questionId: string, answerId: string) => void;\n skipQuestion: () => void;\n addUserAnswer: (questionId: string, answerId?: string) => void;\n startQuiz: () => void;\n finishQuiz: () => void;\n resetQuiz: () => void;\n\n // Timer\n updateTime: (time: number) => void;\n startTimer: () => void;\n stopTimer: () => void;\n\n // Getters\n getCurrentQuestion: () => Question | null;\n getTotalQuestions: () => number;\n getAnsweredQuestions: () => number;\n getUnansweredQuestions: () => number[];\n getSkippedQuestions: () => number;\n getProgress: () => number;\n isQuestionAnswered: (questionId: string) => boolean;\n isQuestionSkipped: (questionId: string) => boolean;\n getCurrentAnswer: () => string | undefined;\n getQuizTitle: () => string;\n formatTime: (seconds: number) => string;\n getUserAnswers: () => UserAnswer[];\n getUnansweredQuestionsFromUserAnswers: () => number[];\n getQuestionsGroupedBySubject: () => { [key: string]: Question[] };\n}\n\nexport const useQuizStore = create<QuizState>()(\n devtools(\n (set, get) => {\n let timerInterval: ReturnType<typeof setInterval> | null = null;\n\n const startTimer = () => {\n if (timerInterval) {\n clearInterval(timerInterval);\n }\n\n timerInterval = setInterval(() => {\n const { timeElapsed } = get();\n set({ timeElapsed: timeElapsed + 1 });\n }, 1000);\n };\n\n const stopTimer = () => {\n if (timerInterval) {\n clearInterval(timerInterval);\n timerInterval = null;\n }\n };\n\n return {\n // Initial State\n currentQuestionIndex: 0,\n selectedAnswers: {},\n skippedQuestions: [],\n userAnswers: [],\n timeElapsed: 0,\n isStarted: false,\n isFinished: false,\n\n // Setters\n setBySimulado: (simulado) => set({ bySimulado: simulado }),\n setByAtividade: (atividade) => set({ byAtividade: atividade }),\n setByAula: (aula) => set({ byAula: aula }),\n\n // Navigation\n goToNextQuestion: () => {\n const { currentQuestionIndex, getTotalQuestions } = get();\n const totalQuestions = getTotalQuestions();\n\n if (currentQuestionIndex < totalQuestions - 1) {\n set({ currentQuestionIndex: currentQuestionIndex + 1 });\n }\n },\n\n goToPreviousQuestion: () => {\n const { currentQuestionIndex } = get();\n\n if (currentQuestionIndex > 0) {\n set({ currentQuestionIndex: currentQuestionIndex - 1 });\n }\n },\n\n goToQuestion: (index) => {\n const { getTotalQuestions } = get();\n const totalQuestions = getTotalQuestions();\n\n if (index >= 0 && index < totalQuestions) {\n set({ currentQuestionIndex: index });\n }\n },\n\n // Quiz Actions\n selectAnswer: (questionId, answerId) => {\n const { selectedAnswers, skippedQuestions, addUserAnswer } = get();\n // Remove from skipped questions if it was skipped\n const newSkippedQuestions = skippedQuestions.filter(\n (id) => id !== questionId\n );\n set({\n selectedAnswers: {\n ...selectedAnswers,\n [questionId]: answerId,\n },\n skippedQuestions: newSkippedQuestions,\n });\n // Add to user answers\n addUserAnswer(questionId, answerId);\n },\n\n skipQuestion: () => {\n const { getCurrentQuestion, skippedQuestions, addUserAnswer } = get();\n const currentQuestion = getCurrentQuestion();\n\n if (currentQuestion) {\n set({\n skippedQuestions: [...skippedQuestions, currentQuestion.id],\n });\n // Add to user answers as skipped\n addUserAnswer(currentQuestion.id);\n }\n },\n\n addUserAnswer: (questionId, answerId) => {\n const { userAnswers, bySimulado, byAtividade, byAula } = get();\n const quiz = bySimulado || byAtividade || byAula;\n const question = quiz?.questions.find((q) => q.id === questionId);\n\n if (!question) return;\n\n const existingAnswerIndex = userAnswers.findIndex(\n (answer) => answer.id === questionId\n );\n\n if (existingAnswerIndex !== -1) {\n // Update existing answer\n const updatedAnswers = [...userAnswers];\n updatedAnswers[existingAnswerIndex] = {\n ...question,\n answerKey: answerId || '',\n isSkipped: !answerId,\n };\n set({ userAnswers: updatedAnswers });\n } else {\n // Add new answer\n set({\n userAnswers: [\n ...userAnswers,\n {\n ...question,\n answerKey: answerId || '',\n isSkipped: !answerId,\n },\n ],\n });\n }\n },\n\n startQuiz: () => {\n set({ isStarted: true, timeElapsed: 0 });\n startTimer();\n },\n\n finishQuiz: () => {\n set({ isFinished: true });\n stopTimer();\n },\n\n resetQuiz: () => {\n stopTimer();\n set({\n currentQuestionIndex: 0,\n selectedAnswers: {},\n skippedQuestions: [],\n userAnswers: [],\n timeElapsed: 0,\n isStarted: false,\n isFinished: false,\n });\n },\n\n // Timer\n updateTime: (time) => set({ timeElapsed: time }),\n startTimer,\n stopTimer,\n\n // Getters\n getCurrentQuestion: () => {\n const { bySimulado, byAtividade, byAula, currentQuestionIndex } =\n get();\n const quiz = bySimulado || byAtividade || byAula;\n\n if (!quiz) {\n return null;\n }\n\n return quiz.questions[currentQuestionIndex];\n },\n\n getTotalQuestions: () => {\n const { bySimulado, byAtividade, byAula } = get();\n const quiz = bySimulado || byAtividade || byAula;\n\n return quiz?.questions?.length || 0;\n },\n\n getAnsweredQuestions: () => {\n const { selectedAnswers } = get();\n return Object.keys(selectedAnswers).length;\n },\n\n getUnansweredQuestions: () => {\n const {\n bySimulado,\n byAtividade,\n byAula,\n selectedAnswers,\n skippedQuestions,\n } = get();\n const quiz = bySimulado || byAtividade || byAula;\n if (!quiz) return [];\n\n const unansweredQuestions: number[] = [];\n\n quiz.questions.forEach((question, index) => {\n const isAnswered = question.id in selectedAnswers;\n const isSkipped = skippedQuestions.includes(question.id);\n\n if (!isAnswered && !isSkipped) {\n unansweredQuestions.push(index + 1); // index + 1 para mostrar número da questão\n }\n });\n return unansweredQuestions;\n },\n\n getSkippedQuestions: () => {\n const { skippedQuestions } = get();\n return skippedQuestions.length;\n },\n\n getProgress: () => {\n const { getTotalQuestions, getAnsweredQuestions } = get();\n const total = getTotalQuestions();\n const answered = getAnsweredQuestions();\n\n return total > 0 ? (answered / total) * 100 : 0;\n },\n\n isQuestionAnswered: (questionId) => {\n const { selectedAnswers } = get();\n return questionId in selectedAnswers;\n },\n\n isQuestionSkipped: (questionId) => {\n const { skippedQuestions } = get();\n return skippedQuestions.includes(questionId);\n },\n\n getCurrentAnswer: () => {\n const { getCurrentQuestion, selectedAnswers } = get();\n const currentQuestion = getCurrentQuestion();\n\n return selectedAnswers[currentQuestion?.id || ''];\n },\n\n getQuizTitle: () => {\n const { bySimulado, byAtividade, byAula } = get();\n const quiz = bySimulado || byAtividade || byAula;\n\n return quiz?.title || 'Quiz';\n },\n\n formatTime: (seconds: number) => {\n const minutes = Math.floor(seconds / 60);\n const remainingSeconds = seconds % 60;\n return `${minutes.toString().padStart(2, '0')}:${remainingSeconds.toString().padStart(2, '0')}`;\n },\n\n getUserAnswers: () => {\n const { userAnswers } = get();\n return userAnswers;\n },\n\n getUnansweredQuestionsFromUserAnswers: () => {\n const { bySimulado, byAtividade, byAula, userAnswers } = get();\n const quiz = bySimulado || byAtividade || byAula;\n if (!quiz) return [];\n\n const unansweredQuestions: number[] = [];\n\n quiz.questions.forEach((question, index) => {\n const userAnswer = userAnswers.find(\n (answer) => answer.id === question.id\n );\n\n // Se não há resposta do usuário OU se a questão foi pulada (isSkipped = true)\n if (!userAnswer || userAnswer.isSkipped) {\n unansweredQuestions.push(index + 1); // index + 1 para mostrar número da questão\n }\n });\n\n return unansweredQuestions;\n },\n\n getQuestionsGroupedBySubject: () => {\n const { bySimulado, byAtividade, byAula } = get();\n const quiz = bySimulado || byAtividade || byAula;\n if (!quiz) return {};\n\n const groupedQuestions: { [key: string]: Question[] } = {};\n\n quiz.questions.forEach((question) => {\n const subjectId =\n question.knowledgeMatrix?.[0]?.subjectId || 'Sem matéria';\n\n if (!groupedQuestions[subjectId]) {\n groupedQuestions[subjectId] = [];\n }\n\n groupedQuestions[subjectId].push(question);\n });\n\n return groupedQuestions;\n },\n };\n },\n {\n name: 'quiz-store',\n }\n )\n);\n"],"mappings":";AAAA,SAAS,cAAc;AACvB,SAAS,gBAAgB;AA0GlB,IAAM,eAAe,OAAkB;AAAA,EAC5C;AAAA,IACE,CAAC,KAAK,QAAQ;AACZ,UAAI,gBAAuD;AAE3D,YAAM,aAAa,MAAM;AACvB,YAAI,eAAe;AACjB,wBAAc,aAAa;AAAA,QAC7B;AAEA,wBAAgB,YAAY,MAAM;AAChC,gBAAM,EAAE,YAAY,IAAI,IAAI;AAC5B,cAAI,EAAE,aAAa,cAAc,EAAE,CAAC;AAAA,QACtC,GAAG,GAAI;AAAA,MACT;AAEA,YAAM,YAAY,MAAM;AACtB,YAAI,eAAe;AACjB,wBAAc,aAAa;AAC3B,0BAAgB;AAAA,QAClB;AAAA,MACF;AAEA,aAAO;AAAA;AAAA,QAEL,sBAAsB;AAAA,QACtB,iBAAiB,CAAC;AAAA,QAClB,kBAAkB,CAAC;AAAA,QACnB,aAAa,CAAC;AAAA,QACd,aAAa;AAAA,QACb,WAAW;AAAA,QACX,YAAY;AAAA;AAAA,QAGZ,eAAe,CAAC,aAAa,IAAI,EAAE,YAAY,SAAS,CAAC;AAAA,QACzD,gBAAgB,CAAC,cAAc,IAAI,EAAE,aAAa,UAAU,CAAC;AAAA,QAC7D,WAAW,CAAC,SAAS,IAAI,EAAE,QAAQ,KAAK,CAAC;AAAA;AAAA,QAGzC,kBAAkB,MAAM;AACtB,gBAAM,EAAE,sBAAsB,kBAAkB,IAAI,IAAI;AACxD,gBAAM,iBAAiB,kBAAkB;AAEzC,cAAI,uBAAuB,iBAAiB,GAAG;AAC7C,gBAAI,EAAE,sBAAsB,uBAAuB,EAAE,CAAC;AAAA,UACxD;AAAA,QACF;AAAA,QAEA,sBAAsB,MAAM;AAC1B,gBAAM,EAAE,qBAAqB,IAAI,IAAI;AAErC,cAAI,uBAAuB,GAAG;AAC5B,gBAAI,EAAE,sBAAsB,uBAAuB,EAAE,CAAC;AAAA,UACxD;AAAA,QACF;AAAA,QAEA,cAAc,CAAC,UAAU;AACvB,gBAAM,EAAE,kBAAkB,IAAI,IAAI;AAClC,gBAAM,iBAAiB,kBAAkB;AAEzC,cAAI,SAAS,KAAK,QAAQ,gBAAgB;AACxC,gBAAI,EAAE,sBAAsB,MAAM,CAAC;AAAA,UACrC;AAAA,QACF;AAAA;AAAA,QAGA,cAAc,CAAC,YAAY,aAAa;AACtC,gBAAM,EAAE,iBAAiB,kBAAkB,cAAc,IAAI,IAAI;AAEjE,gBAAM,sBAAsB,iBAAiB;AAAA,YAC3C,CAAC,OAAO,OAAO;AAAA,UACjB;AACA,cAAI;AAAA,YACF,iBAAiB;AAAA,cACf,GAAG;AAAA,cACH,CAAC,UAAU,GAAG;AAAA,YAChB;AAAA,YACA,kBAAkB;AAAA,UACpB,CAAC;AAED,wBAAc,YAAY,QAAQ;AAAA,QACpC;AAAA,QAEA,cAAc,MAAM;AAClB,gBAAM,EAAE,oBAAoB,kBAAkB,cAAc,IAAI,IAAI;AACpE,gBAAM,kBAAkB,mBAAmB;AAE3C,cAAI,iBAAiB;AACnB,gBAAI;AAAA,cACF,kBAAkB,CAAC,GAAG,kBAAkB,gBAAgB,EAAE;AAAA,YAC5D,CAAC;AAED,0BAAc,gBAAgB,EAAE;AAAA,UAClC;AAAA,QACF;AAAA,QAEA,eAAe,CAAC,YAAY,aAAa;AACvC,gBAAM,EAAE,aAAa,YAAY,aAAa,OAAO,IAAI,IAAI;AAC7D,gBAAM,OAAO,cAAc,eAAe;AAC1C,gBAAM,WAAW,MAAM,UAAU,KAAK,CAAC,MAAM,EAAE,OAAO,UAAU;AAEhE,cAAI,CAAC,SAAU;AAEf,gBAAM,sBAAsB,YAAY;AAAA,YACtC,CAAC,WAAW,OAAO,OAAO;AAAA,UAC5B;AAEA,cAAI,wBAAwB,IAAI;AAE9B,kBAAM,iBAAiB,CAAC,GAAG,WAAW;AACtC,2BAAe,mBAAmB,IAAI;AAAA,cACpC,GAAG;AAAA,cACH,WAAW,YAAY;AAAA,cACvB,WAAW,CAAC;AAAA,YACd;AACA,gBAAI,EAAE,aAAa,eAAe,CAAC;AAAA,UACrC,OAAO;AAEL,gBAAI;AAAA,cACF,aAAa;AAAA,gBACX,GAAG;AAAA,gBACH;AAAA,kBACE,GAAG;AAAA,kBACH,WAAW,YAAY;AAAA,kBACvB,WAAW,CAAC;AAAA,gBACd;AAAA,cACF;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF;AAAA,QAEA,WAAW,MAAM;AACf,cAAI,EAAE,WAAW,MAAM,aAAa,EAAE,CAAC;AACvC,qBAAW;AAAA,QACb;AAAA,QAEA,YAAY,MAAM;AAChB,cAAI,EAAE,YAAY,KAAK,CAAC;AACxB,oBAAU;AAAA,QACZ;AAAA,QAEA,WAAW,MAAM;AACf,oBAAU;AACV,cAAI;AAAA,YACF,sBAAsB;AAAA,YACtB,iBAAiB,CAAC;AAAA,YAClB,kBAAkB,CAAC;AAAA,YACnB,aAAa,CAAC;AAAA,YACd,aAAa;AAAA,YACb,WAAW;AAAA,YACX,YAAY;AAAA,UACd,CAAC;AAAA,QACH;AAAA;AAAA,QAGA,YAAY,CAAC,SAAS,IAAI,EAAE,aAAa,KAAK,CAAC;AAAA,QAC/C;AAAA,QACA;AAAA;AAAA,QAGA,oBAAoB,MAAM;AACxB,gBAAM,EAAE,YAAY,aAAa,QAAQ,qBAAqB,IAC5D,IAAI;AACN,gBAAM,OAAO,cAAc,eAAe;AAE1C,cAAI,CAAC,MAAM;AACT,mBAAO;AAAA,UACT;AAEA,iBAAO,KAAK,UAAU,oBAAoB;AAAA,QAC5C;AAAA,QAEA,mBAAmB,MAAM;AACvB,gBAAM,EAAE,YAAY,aAAa,OAAO,IAAI,IAAI;AAChD,gBAAM,OAAO,cAAc,eAAe;AAE1C,iBAAO,MAAM,WAAW,UAAU;AAAA,QACpC;AAAA,QAEA,sBAAsB,MAAM;AAC1B,gBAAM,EAAE,gBAAgB,IAAI,IAAI;AAChC,iBAAO,OAAO,KAAK,eAAe,EAAE;AAAA,QACtC;AAAA,QAEA,wBAAwB,MAAM;AAC5B,gBAAM;AAAA,YACJ;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF,IAAI,IAAI;AACR,gBAAM,OAAO,cAAc,eAAe;AAC1C,cAAI,CAAC,KAAM,QAAO,CAAC;AAEnB,gBAAM,sBAAgC,CAAC;AAEvC,eAAK,UAAU,QAAQ,CAAC,UAAU,UAAU;AAC1C,kBAAM,aAAa,SAAS,MAAM;AAClC,kBAAM,YAAY,iBAAiB,SAAS,SAAS,EAAE;AAEvD,gBAAI,CAAC,cAAc,CAAC,WAAW;AAC7B,kCAAoB,KAAK,QAAQ,CAAC;AAAA,YACpC;AAAA,UACF,CAAC;AACD,iBAAO;AAAA,QACT;AAAA,QAEA,qBAAqB,MAAM;AACzB,gBAAM,EAAE,iBAAiB,IAAI,IAAI;AACjC,iBAAO,iBAAiB;AAAA,QAC1B;AAAA,QAEA,aAAa,MAAM;AACjB,gBAAM,EAAE,mBAAmB,qBAAqB,IAAI,IAAI;AACxD,gBAAM,QAAQ,kBAAkB;AAChC,gBAAM,WAAW,qBAAqB;AAEtC,iBAAO,QAAQ,IAAK,WAAW,QAAS,MAAM;AAAA,QAChD;AAAA,QAEA,oBAAoB,CAAC,eAAe;AAClC,gBAAM,EAAE,gBAAgB,IAAI,IAAI;AAChC,iBAAO,cAAc;AAAA,QACvB;AAAA,QAEA,mBAAmB,CAAC,eAAe;AACjC,gBAAM,EAAE,iBAAiB,IAAI,IAAI;AACjC,iBAAO,iBAAiB,SAAS,UAAU;AAAA,QAC7C;AAAA,QAEA,kBAAkB,MAAM;AACtB,gBAAM,EAAE,oBAAoB,gBAAgB,IAAI,IAAI;AACpD,gBAAM,kBAAkB,mBAAmB;AAE3C,iBAAO,gBAAgB,iBAAiB,MAAM,EAAE;AAAA,QAClD;AAAA,QAEA,cAAc,MAAM;AAClB,gBAAM,EAAE,YAAY,aAAa,OAAO,IAAI,IAAI;AAChD,gBAAM,OAAO,cAAc,eAAe;AAE1C,iBAAO,MAAM,SAAS;AAAA,QACxB;AAAA,QAEA,YAAY,CAAC,YAAoB;AAC/B,gBAAM,UAAU,KAAK,MAAM,UAAU,EAAE;AACvC,gBAAM,mBAAmB,UAAU;AACnC,iBAAO,GAAG,QAAQ,SAAS,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,iBAAiB,SAAS,EAAE,SAAS,GAAG,GAAG,CAAC;AAAA,QAC/F;AAAA,QAEA,gBAAgB,MAAM;AACpB,gBAAM,EAAE,YAAY,IAAI,IAAI;AAC5B,iBAAO;AAAA,QACT;AAAA,QAEA,uCAAuC,MAAM;AAC3C,gBAAM,EAAE,YAAY,aAAa,QAAQ,YAAY,IAAI,IAAI;AAC7D,gBAAM,OAAO,cAAc,eAAe;AAC1C,cAAI,CAAC,KAAM,QAAO,CAAC;AAEnB,gBAAM,sBAAgC,CAAC;AAEvC,eAAK,UAAU,QAAQ,CAAC,UAAU,UAAU;AAC1C,kBAAM,aAAa,YAAY;AAAA,cAC7B,CAAC,WAAW,OAAO,OAAO,SAAS;AAAA,YACrC;AAGA,gBAAI,CAAC,cAAc,WAAW,WAAW;AACvC,kCAAoB,KAAK,QAAQ,CAAC;AAAA,YACpC;AAAA,UACF,CAAC;AAED,iBAAO;AAAA,QACT;AAAA,QAEA,8BAA8B,MAAM;AAClC,gBAAM,EAAE,YAAY,aAAa,OAAO,IAAI,IAAI;AAChD,gBAAM,OAAO,cAAc,eAAe;AAC1C,cAAI,CAAC,KAAM,QAAO,CAAC;AAEnB,gBAAM,mBAAkD,CAAC;AAEzD,eAAK,UAAU,QAAQ,CAAC,aAAa;AACnC,kBAAM,YACJ,SAAS,kBAAkB,CAAC,GAAG,aAAa;AAE9C,gBAAI,CAAC,iBAAiB,SAAS,GAAG;AAChC,+BAAiB,SAAS,IAAI,CAAC;AAAA,YACjC;AAEA,6BAAiB,SAAS,EAAE,KAAK,QAAQ;AAAA,UAC3C,CAAC;AAED,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,IACR;AAAA,EACF;AACF;","names":[]}
|
package/dist/index.css
CHANGED
|
@@ -532,6 +532,9 @@
|
|
|
532
532
|
.bottom-4 {
|
|
533
533
|
bottom: calc(var(--spacing) * 4);
|
|
534
534
|
}
|
|
535
|
+
.bottom-15 {
|
|
536
|
+
bottom: calc(var(--spacing) * 15);
|
|
537
|
+
}
|
|
535
538
|
.bottom-full {
|
|
536
539
|
bottom: 100%;
|
|
537
540
|
}
|
|
@@ -541,9 +544,6 @@
|
|
|
541
544
|
.left-1\/2 {
|
|
542
545
|
left: calc(1/2 * 100%);
|
|
543
546
|
}
|
|
544
|
-
.left-2 {
|
|
545
|
-
left: calc(var(--spacing) * 2);
|
|
546
|
-
}
|
|
547
547
|
.left-3 {
|
|
548
548
|
left: calc(var(--spacing) * 3);
|
|
549
549
|
}
|
|
@@ -658,6 +658,9 @@
|
|
|
658
658
|
.mb-8 {
|
|
659
659
|
margin-bottom: calc(var(--spacing) * 8);
|
|
660
660
|
}
|
|
661
|
+
.mb-auto {
|
|
662
|
+
margin-bottom: auto;
|
|
663
|
+
}
|
|
661
664
|
.ml-2 {
|
|
662
665
|
margin-left: calc(var(--spacing) * 2);
|
|
663
666
|
}
|
|
@@ -816,6 +819,9 @@
|
|
|
816
819
|
.h-\[152px\] {
|
|
817
820
|
height: 152px;
|
|
818
821
|
}
|
|
822
|
+
.h-\[calc\(100vh-180px\)\] {
|
|
823
|
+
height: calc(100vh - 180px);
|
|
824
|
+
}
|
|
819
825
|
.h-auto {
|
|
820
826
|
height: auto;
|
|
821
827
|
}
|
|
@@ -951,6 +957,9 @@
|
|
|
951
957
|
.w-\[200px\] {
|
|
952
958
|
width: 200px;
|
|
953
959
|
}
|
|
960
|
+
.w-\[282px\] {
|
|
961
|
+
width: 282px;
|
|
962
|
+
}
|
|
954
963
|
.w-\[320px\] {
|
|
955
964
|
width: 320px;
|
|
956
965
|
}
|
|
@@ -1000,6 +1009,9 @@
|
|
|
1000
1009
|
.max-w-\[262px\] {
|
|
1001
1010
|
max-width: 262px;
|
|
1002
1011
|
}
|
|
1012
|
+
.max-w-\[266px\] {
|
|
1013
|
+
max-width: 266px;
|
|
1014
|
+
}
|
|
1003
1015
|
.max-w-\[324px\] {
|
|
1004
1016
|
max-width: 324px;
|
|
1005
1017
|
}
|
|
@@ -2411,6 +2423,10 @@
|
|
|
2411
2423
|
.stroke-success-200 {
|
|
2412
2424
|
stroke: var(--color-success-200);
|
|
2413
2425
|
}
|
|
2426
|
+
.object-cover {
|
|
2427
|
+
-o-object-fit: cover;
|
|
2428
|
+
object-fit: cover;
|
|
2429
|
+
}
|
|
2414
2430
|
.p-0 {
|
|
2415
2431
|
padding: calc(var(--spacing) * 0);
|
|
2416
2432
|
}
|
|
@@ -2519,6 +2535,12 @@
|
|
|
2519
2535
|
.pb-9\.5 {
|
|
2520
2536
|
padding-bottom: calc(var(--spacing) * 9.5);
|
|
2521
2537
|
}
|
|
2538
|
+
.pb-15 {
|
|
2539
|
+
padding-bottom: calc(var(--spacing) * 15);
|
|
2540
|
+
}
|
|
2541
|
+
.pb-\[80px\] {
|
|
2542
|
+
padding-bottom: 80px;
|
|
2543
|
+
}
|
|
2522
2544
|
.pl-8 {
|
|
2523
2545
|
padding-left: calc(var(--spacing) * 8);
|
|
2524
2546
|
}
|
|
@@ -3421,6 +3443,21 @@
|
|
|
3421
3443
|
border-radius: var(--radius-xl);
|
|
3422
3444
|
}
|
|
3423
3445
|
}
|
|
3446
|
+
.not-lg\:h-\[calc\(100vh-200px\)\] {
|
|
3447
|
+
@media not (width >= 64rem) {
|
|
3448
|
+
height: calc(100vh - 200px);
|
|
3449
|
+
}
|
|
3450
|
+
}
|
|
3451
|
+
.not-lg\:max-w-\[calc\(100vw-32px\)\] {
|
|
3452
|
+
@media not (width >= 64rem) {
|
|
3453
|
+
max-width: calc(100vw - 32px);
|
|
3454
|
+
}
|
|
3455
|
+
}
|
|
3456
|
+
.not-lg\:px-6 {
|
|
3457
|
+
@media not (width >= 64rem) {
|
|
3458
|
+
padding-inline: calc(var(--spacing) * 6);
|
|
3459
|
+
}
|
|
3460
|
+
}
|
|
3424
3461
|
.group-hover\:text-primary-950 {
|
|
3425
3462
|
&:is(:where(.group):hover *) {
|
|
3426
3463
|
@media (hover: hover) {
|
|
@@ -7957,6 +7994,11 @@
|
|
|
7957
7994
|
height: calc(var(--spacing) * 6);
|
|
7958
7995
|
}
|
|
7959
7996
|
}
|
|
7997
|
+
.lg\:max-h-\[687px\] {
|
|
7998
|
+
@media (width >= 64rem) {
|
|
7999
|
+
max-height: 687px;
|
|
8000
|
+
}
|
|
8001
|
+
}
|
|
7960
8002
|
.lg\:w-3\.5 {
|
|
7961
8003
|
@media (width >= 64rem) {
|
|
7962
8004
|
width: calc(var(--spacing) * 3.5);
|
|
@@ -7967,6 +8009,11 @@
|
|
|
7967
8009
|
width: calc(var(--spacing) * 6);
|
|
7968
8010
|
}
|
|
7969
8011
|
}
|
|
8012
|
+
.lg\:max-w-\[1000px\] {
|
|
8013
|
+
@media (width >= 64rem) {
|
|
8014
|
+
max-width: 1000px;
|
|
8015
|
+
}
|
|
8016
|
+
}
|
|
7970
8017
|
.lg\:max-w-none {
|
|
7971
8018
|
@media (width >= 64rem) {
|
|
7972
8019
|
max-width: none;
|