analytica-frontend-lib 1.1.20 → 1.1.21
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/Quiz/index.js +2 -2
- package/dist/Quiz/index.js.map +1 -1
- package/dist/Quiz/index.mjs +2 -2
- package/dist/Quiz/index.mjs.map +1 -1
- package/dist/Select/index.js +2 -2
- package/dist/Select/index.js.map +1 -1
- package/dist/Select/index.mjs +2 -2
- package/dist/Select/index.mjs.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/Quiz/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/Quiz/Quiz.tsx","../../src/components/Badge/Badge.tsx","../../src/utils/utils.ts","../../src/components/Alternative/Alternative.tsx","../../src/components/Radio/Radio.tsx","../../src/components/Text/Text.tsx","../../src/components/Button/Button.tsx","../../src/components/IconButton/IconButton.tsx","../../src/components/Quiz/useQuizStore.ts","../../src/components/AlertDialog/AlertDialog.tsx","../../src/components/Modal/Modal.tsx","../../src/components/Select/Select.tsx","../../src/components/Card/Card.tsx","../../src/components/ProgressBar/ProgressBar.tsx","../../src/components/ProgressCircle/ProgressCircle.tsx","../../src/components/MultipleChoice/MultipleChoice.tsx","../../src/components/CheckBox/CheckboxList.tsx","../../src/components/CheckBox/CheckBox.tsx","../../src/components/TextArea/TextArea.tsx"],"sourcesContent":["import {\n CaretLeft,\n CaretRight,\n Clock,\n SquaresFour,\n BookOpen,\n Book,\n CheckCircle,\n XCircle,\n} from 'phosphor-react';\nimport Badge from '../Badge/Badge';\nimport {\n AlternativesList,\n HeaderAlternative,\n} from '../Alternative/Alternative';\nimport Button from '../Button/Button';\nimport IconButton from '../IconButton/IconButton';\nimport {\n forwardRef,\n ReactNode,\n useEffect,\n useMemo,\n useId,\n useState,\n useCallback,\n useRef,\n ComponentType,\n MouseEvent,\n} from 'react';\nimport {\n Question,\n useQuizStore,\n QUESTION_DIFFICULTY,\n QUESTION_TYPE,\n ANSWER_STATUS,\n} from './useQuizStore';\nimport { AlertDialog } from '../AlertDialog/AlertDialog';\nimport Modal from '../Modal/Modal';\n\nimport Select, {\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '../Select/Select';\nimport { CardResults, CardStatus } from '../Card/Card';\nimport ProgressCircle from '../ProgressCircle/ProgressCircle';\nimport ProgressBar from '../ProgressBar/ProgressBar';\nimport { cn } from '../../utils/utils';\nimport { MultipleChoiceList } from '../MultipleChoice/MultipleChoice';\nimport TextArea from '../TextArea/TextArea';\nimport ImageQuestion from '../../assets/img/mock-image-question.png';\n\nexport const getStatusBadge = (status?: 'correct' | 'incorrect') => {\n switch (status) {\n case 'correct':\n return (\n <Badge variant=\"solid\" action=\"success\" iconLeft={<CheckCircle />}>\n Resposta correta\n </Badge>\n );\n case 'incorrect':\n return (\n <Badge variant=\"solid\" action=\"error\" iconLeft={<XCircle />}>\n Resposta incorreta\n </Badge>\n );\n default:\n return null;\n }\n};\n\nexport const getStatusStyles = (variantCorrect?: string) => {\n switch (variantCorrect) {\n case 'correct':\n return 'bg-success-background border-success-300';\n case 'incorrect':\n return 'bg-error-background border-error-300';\n }\n};\n\nconst Quiz = forwardRef<\n HTMLDivElement,\n { children: ReactNode; className?: string; variant?: 'result' | 'default' }\n>(({ children, className, variant = 'default', ...props }, ref) => {\n const { setVariant } = useQuizStore();\n\n useEffect(() => {\n setVariant(variant);\n }, [variant, setVariant]);\n\n return (\n <div\n ref={ref}\n className={cn(\n 'w-full max-w-[1000px] flex flex-col mx-auto h-full relative not-lg:px-6',\n className\n )}\n {...props}\n >\n {children}\n </div>\n );\n});\n\nconst QuizHeaderResult = forwardRef<HTMLDivElement, { className?: string }>(\n ({ className, ...props }, ref) => {\n const { getQuestionResultByQuestionId, getCurrentQuestion } =\n useQuizStore();\n const [isCorrect, setIsCorrect] = useState(false);\n\n useEffect(() => {\n const cq = getCurrentQuestion();\n if (!cq) {\n setIsCorrect(false);\n return;\n }\n const qr = getQuestionResultByQuestionId(cq.id);\n setIsCorrect(qr?.answerStatus === ANSWER_STATUS.RESPOSTA_CORRETA);\n }, [\n getCurrentQuestion,\n getQuestionResultByQuestionId,\n getCurrentQuestion()?.id,\n ]);\n\n return (\n <div\n ref={ref}\n className={cn(\n 'flex flex-row items-center gap-10 p-3.5 rounded-xl mb-4',\n isCorrect ? 'bg-success-background' : 'bg-error-background',\n className\n )}\n {...props}\n >\n <p className=\"text-text-950 font-bold text-lg\">Resultado</p>\n <p className=\"text-text-700 text-md\">\n {isCorrect ? '🎉 Parabéns!!' : 'Não foi dessa vez...'}\n </p>\n </div>\n );\n }\n);\n\nconst QuizTitle = forwardRef<HTMLDivElement, { className?: string }>(\n ({ className, ...props }, ref) => {\n const {\n currentQuestionIndex,\n getTotalQuestions,\n getQuizTitle,\n timeElapsed,\n formatTime,\n isStarted,\n } = useQuizStore();\n\n const totalQuestions = getTotalQuestions();\n const quizTitle = getQuizTitle();\n\n return (\n <div\n ref={ref}\n className={cn(\n 'flex flex-row justify-center items-center relative p-2',\n className\n )}\n {...props}\n >\n <span className=\"flex flex-col gap-2 text-center\">\n <p className=\"text-text-950 font-bold text-md\">{quizTitle}</p>\n <p className=\"text-text-600 text-xs\">\n {totalQuestions > 0\n ? `${currentQuestionIndex + 1} de ${totalQuestions}`\n : '0 de 0'}\n </p>\n </span>\n\n <span className=\"absolute right-2\">\n <Badge variant=\"outlined\" action=\"info\" iconLeft={<Clock />}>\n {isStarted ? formatTime(timeElapsed) : '00:00'}\n </Badge>\n </span>\n </div>\n );\n }\n);\n\nconst QuizSubTitle = forwardRef<HTMLDivElement, { subTitle: string }>(\n ({ subTitle, ...props }, ref) => {\n return (\n <div className=\"px-4 pb-2 pt-6\" {...props} ref={ref}>\n <p className=\"font-bold text-lg text-text-950\">{subTitle}</p>\n </div>\n );\n }\n);\n\nconst QuizHeader = () => {\n const { getCurrentQuestion, currentQuestionIndex } = useQuizStore();\n const currentQuestion = getCurrentQuestion();\n return (\n <HeaderAlternative\n title={\n currentQuestion ? `Questão ${currentQuestionIndex + 1}` : 'Questão'\n }\n subTitle={currentQuestion?.knowledgeMatrix?.[0]?.topic?.name ?? ''}\n content={currentQuestion?.statement ?? ''}\n />\n );\n};\n\nconst QuizContainer = forwardRef<\n HTMLDivElement,\n { children: ReactNode; className?: string }\n>(({ children, className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\n 'bg-background rounded-t-xl px-4 pt-4 pb-[80px] h-auto flex flex-col gap-4 mb-auto',\n className\n )}\n {...props}\n >\n {children}\n </div>\n );\n});\n\nconst QuizContent = forwardRef<\n HTMLDivElement,\n {\n paddingBottom?: string;\n }\n>(({ paddingBottom }) => {\n const { getCurrentQuestion } = useQuizStore();\n const currentQuestion = getCurrentQuestion();\n const questionComponents: Record<\n string,\n ComponentType<QuizVariantInterface>\n > = {\n [QUESTION_TYPE.ALTERNATIVA]: QuizAlternative,\n [QUESTION_TYPE.MULTIPLA_CHOICE]: QuizMultipleChoice,\n [QUESTION_TYPE.DISSERTATIVA]: QuizDissertative,\n [QUESTION_TYPE.VERDADEIRO_FALSO]: QuizTrueOrFalse,\n [QUESTION_TYPE.LIGAR_PONTOS]: QuizConnectDots,\n [QUESTION_TYPE.PREENCHER]: QuizFill,\n [QUESTION_TYPE.IMAGEM]: QuizImageQuestion,\n };\n\n const QuestionComponent = currentQuestion\n ? questionComponents[currentQuestion.questionType]\n : null;\n\n return QuestionComponent ? (\n <QuestionComponent paddingBottom={paddingBottom} />\n ) : null;\n});\n\nenum Status {\n CORRECT = 'correct',\n INCORRECT = 'incorrect',\n NEUTRAL = 'neutral',\n}\n\ninterface QuizVariantInterface {\n paddingBottom?: string;\n}\n\nconst QuizAlternative = ({ paddingBottom }: QuizVariantInterface) => {\n const {\n getCurrentQuestion,\n selectAnswer,\n getQuestionResultByQuestionId,\n getCurrentAnswer,\n variant,\n } = useQuizStore();\n const currentQuestion = getCurrentQuestion();\n const currentQuestionResult = getQuestionResultByQuestionId(\n currentQuestion?.id || ''\n );\n\n const currentAnswer = getCurrentAnswer();\n const alternatives = currentQuestion?.options?.map((option) => {\n let status: Status = Status.NEUTRAL;\n if (variant === 'result') {\n const isCorrectOption =\n currentQuestionResult?.options?.find((op) => op.id === option.id)\n ?.isCorrect || false;\n\n const isSelected = currentQuestionResult?.selectedOptions.some(\n (selectedOption) => selectedOption.optionId === option.id\n );\n\n if (isCorrectOption) {\n status = Status.CORRECT;\n } else if (isSelected && !isCorrectOption) {\n status = Status.INCORRECT;\n } else {\n status = Status.NEUTRAL;\n }\n }\n\n return {\n label: option.option,\n value: option.id,\n status: status,\n };\n });\n\n if (!alternatives)\n return (\n <div>\n <p>Não há Alternativas</p>\n </div>\n );\n\n return (\n <>\n <QuizSubTitle subTitle=\"Alternativas\" />\n\n <QuizContainer className={cn('', paddingBottom)}>\n <div className=\"space-y-4\">\n <AlternativesList\n mode={variant === 'default' ? 'interactive' : 'readonly'}\n key={`question-${currentQuestion?.id || '1'}`}\n name={`question-${currentQuestion?.id || '1'}`}\n layout=\"compact\"\n alternatives={alternatives}\n value={\n variant === 'result'\n ? currentQuestionResult?.selectedOptions[0]?.optionId || ''\n : currentAnswer?.optionId || ''\n }\n selectedValue={\n variant === 'result'\n ? currentQuestionResult?.selectedOptions[0]?.optionId || ''\n : currentAnswer?.optionId || ''\n }\n onValueChange={(value) => {\n if (currentQuestion) {\n selectAnswer(currentQuestion.id, value);\n }\n }}\n />\n </div>\n </QuizContainer>\n </>\n );\n};\n\nconst QuizMultipleChoice = ({ paddingBottom }: QuizVariantInterface) => {\n const {\n getCurrentQuestion,\n selectMultipleAnswer,\n getAllCurrentAnswer,\n getQuestionResultByQuestionId,\n variant,\n } = useQuizStore();\n const currentQuestion = getCurrentQuestion();\n const allCurrentAnswers = getAllCurrentAnswer();\n const currentQuestionResult = getQuestionResultByQuestionId(\n currentQuestion?.id || ''\n );\n // Use ref to track previous values and prevent unnecessary updates\n const prevSelectedValuesRef = useRef<string[]>([]);\n const prevQuestionIdRef = useRef<string>('');\n\n // Memoize the answer IDs to prevent unnecessary re-renders\n const allCurrentAnswerIds = useMemo(() => {\n return allCurrentAnswers?.map((answer) => answer.optionId) || [];\n }, [allCurrentAnswers]);\n\n // Memoize the selected values to prevent infinite loops\n const selectedValues = useMemo(() => {\n return allCurrentAnswerIds?.filter((id): id is string => id !== null) || [];\n }, [allCurrentAnswerIds]);\n\n // Only update selectedValues if they actually changed or question changed\n const stableSelectedValues = useMemo(() => {\n const currentQuestionId = currentQuestion?.id || '';\n const hasQuestionChanged = prevQuestionIdRef.current !== currentQuestionId;\n\n if (hasQuestionChanged) {\n prevQuestionIdRef.current = currentQuestionId;\n prevSelectedValuesRef.current = selectedValues;\n return selectedValues;\n }\n\n // Only update if values actually changed\n const hasValuesChanged =\n JSON.stringify(prevSelectedValuesRef.current) !==\n JSON.stringify(selectedValues);\n if (hasValuesChanged) {\n prevSelectedValuesRef.current = selectedValues;\n return selectedValues;\n }\n\n if (variant == 'result') {\n return (\n currentQuestionResult?.selectedOptions.map((op) => op.optionId) || []\n );\n } else {\n return prevSelectedValuesRef.current;\n }\n }, [\n selectedValues,\n currentQuestion?.id,\n variant,\n currentQuestionResult?.selectedOptions,\n ]);\n\n // Memoize the callback to prevent unnecessary re-renders\n const handleSelectedValues = useCallback(\n (values: string[]) => {\n if (currentQuestion) {\n selectMultipleAnswer(currentQuestion.id, values);\n }\n },\n [currentQuestion, selectMultipleAnswer]\n );\n\n // Create a stable key to force re-mount when question changes\n const questionKey = useMemo(\n () => `question-${currentQuestion?.id || '1'}`,\n [currentQuestion?.id]\n );\n const choices = currentQuestion?.options?.map((option) => {\n let status: Status = Status.NEUTRAL;\n\n if (variant === 'result') {\n const isCorrectOption =\n currentQuestionResult?.options?.find((op) => op.id === option.id)\n ?.isCorrect || false;\n\n const isSelected = currentQuestionResult?.selectedOptions?.some(\n (op) => op.optionId === option.id\n );\n\n if (isCorrectOption) {\n status = Status.CORRECT;\n } else if (isSelected && !isCorrectOption) {\n status = Status.INCORRECT;\n } else {\n status = Status.NEUTRAL;\n }\n }\n\n return {\n label: option.option,\n value: option.id,\n status: status,\n };\n });\n\n if (!choices)\n return (\n <div>\n <p>Não há Escolhas Multiplas</p>\n </div>\n );\n return (\n <>\n <QuizSubTitle subTitle=\"Alternativas\" />\n\n <QuizContainer className={cn('', paddingBottom)}>\n <div className=\"space-y-4\">\n <MultipleChoiceList\n choices={choices}\n key={questionKey}\n name={questionKey}\n selectedValues={stableSelectedValues}\n onHandleSelectedValues={handleSelectedValues}\n mode={variant === 'default' ? 'interactive' : 'readonly'}\n />\n </div>\n </QuizContainer>\n </>\n );\n};\n\nconst QuizDissertative = ({ paddingBottom }: QuizVariantInterface) => {\n const {\n getCurrentQuestion,\n getCurrentAnswer,\n selectDissertativeAnswer,\n getQuestionResultByQuestionId,\n variant,\n } = useQuizStore();\n\n const currentQuestion = getCurrentQuestion();\n const currentQuestionResult = getQuestionResultByQuestionId(\n currentQuestion?.id || ''\n );\n\n const currentAnswer = getCurrentAnswer();\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n const handleAnswerChange = (value: string) => {\n if (currentQuestion) {\n selectDissertativeAnswer(currentQuestion.id, value);\n }\n };\n\n // Auto-resize function\n const adjustTextareaHeight = useCallback(() => {\n if (textareaRef.current) {\n textareaRef.current.style.height = 'auto';\n const scrollHeight = textareaRef.current.scrollHeight;\n const minHeight = 120; // 120px minimum height\n const maxHeight = 400; // 400px maximum height\n const newHeight = Math.min(Math.max(scrollHeight, minHeight), maxHeight);\n textareaRef.current.style.height = `${newHeight}px`;\n }\n }, []);\n\n // Adjust height when currentAnswer changes\n useEffect(() => {\n adjustTextareaHeight();\n }, [currentAnswer, adjustTextareaHeight]);\n\n if (!currentQuestion) {\n return (\n <div className=\"space-y-4\">\n <p className=\"text-text-600 text-md\">Nenhuma questão disponível</p>\n </div>\n );\n }\n\n const localAnswer =\n (variant == 'result'\n ? currentQuestionResult?.answer\n : currentAnswer?.answer) || '';\n return (\n <>\n <QuizSubTitle subTitle=\"Resposta\" />\n\n <QuizContainer className={cn(variant != 'result' && paddingBottom)}>\n <div className=\"space-y-4 max-h-[600px] overflow-y-auto\">\n {variant === 'default' ? (\n <div className=\"space-y-4\">\n <TextArea\n ref={textareaRef}\n placeholder=\"Escreva sua resposta\"\n value={localAnswer}\n onChange={(e) => handleAnswerChange(e.target.value)}\n rows={4}\n className=\"min-h-[120px] max-h-[400px] resize-none overflow-y-auto\"\n />\n </div>\n ) : (\n <div className=\"space-y-4\">\n <p className=\"text-text-600 text-md whitespace-pre-wrap\">\n {localAnswer || 'Nenhuma resposta fornecida'}\n </p>\n </div>\n )}\n </div>\n </QuizContainer>\n\n {variant === 'result' &&\n currentQuestionResult?.answerStatus ==\n ANSWER_STATUS.RESPOSTA_INCORRETA && (\n <>\n <QuizSubTitle subTitle=\"Observação do professor\" />\n\n <QuizContainer className={cn('', paddingBottom)}>\n <p className=\"text-text-600 text-md whitespace-pre-wrap\">\n Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed\n euismod, urna eu tincidunt consectetur, nisi nisl aliquam nunc,\n eget aliquam massa nisl quis neque. Pellentesque habitant morbi\n tristique senectus et netus et malesuada fames ac turpis\n egestas. Vestibulum ante ipsum primis in faucibus orci luctus et\n ultrices posuere cubilia curae; Integer euismod, urna eu\n tincidunt consectetur, nisi nisl aliquam nunc, eget aliquam\n massa nisl quis neque. Pellentesque habitant morbi tristique\n senectus et netus et malesuada fames ac turpis egestas.\n Suspendisse potenti. Nullam ac urna eu felis dapibus condimentum\n sit amet a augue. Sed non neque elit. Sed ut imperdiet nisi.\n Proin condimentum fermentum nunc. Etiam pharetra, erat sed\n fermentum feugiat, velit mauris egestas quam, ut aliquam massa\n nisl quis neque. Suspendisse in orci enim. Mauris euismod, urna\n eu tincidunt consectetur, nisi nisl aliquam nunc, eget aliquam\n massa nisl quis neque. Pellentesque habitant morbi tristique\n senectus et netus et malesuada fames ac turpis egestas.\n Vestibulum ante ipsum primis in faucibus orci luctus et ultrices\n posuere cubilia curae; Integer euismod, urna eu tincidunt\n consectetur, nisi nisl aliquam nunc, eget aliquam massa nisl\n quis neque. Pellentesque habitant morbi tristique senectus et\n netus et malesuada fames ac turpis egestas. Suspendisse potenti.\n Nullam ac urna eu felis dapibus condimentum sit amet a augue.\n Sed non neque elit. Sed ut imperdiet nisi. Proin condimentum\n fermentum nunc. Etiam pharetra, erat sed fermentum feugiat,\n velit mauris egestas quam, ut aliquam massa nisl quis neque.\n Suspendisse in orci enim. Pellentesque habitant morbi tristique\n senectus et netus et malesuada fames ac turpis egestas.\n Vestibulum ante ipsum primis in faucibus orci luctus et ultrices\n posuere cubilia curae; Integer euismod, urna eu tincidunt\n consectetur, nisi nisl aliquam nunc, eget aliquam massa nisl\n quis neque. Pellentesque habitant morbi tristique senectus et\n netus et malesuada fames ac turpis egestas. Suspendisse potenti.\n Nullam ac urna eu felis dapibus condimentum sit amet a augue.\n Sed non neque elit. Sed ut imperdiet nisi. Proin condimentum\n fermentum nunc. Etiam pharetra, erat sed fermentum feugiat,\n velit mauris egestas quam, ut aliquam massa nisl quis neque.\n Suspendisse in orci enim.\n </p>\n </QuizContainer>\n </>\n )}\n </>\n );\n};\n\nconst QuizTrueOrFalse = ({ paddingBottom }: QuizVariantInterface) => {\n const { variant } = useQuizStore();\n const options = [\n {\n label: '25 metros',\n isCorrect: true,\n },\n {\n label: '30 metros',\n isCorrect: false,\n },\n {\n label: '40 metros',\n isCorrect: false,\n },\n {\n label: '50 metros',\n isCorrect: false,\n },\n ];\n\n const getLetterByIndex = (index: number) => String.fromCharCode(97 + index); // 97 = 'a' in ASCII\n\n const isDefaultVariant = variant == 'default';\n\n return (\n <>\n <QuizSubTitle subTitle=\"Alternativas\" />\n\n <QuizContainer className={cn('', paddingBottom)}>\n <div className=\"flex flex-col gap-3.5\">\n {options.map((option, index) => {\n const variantCorrect = option.isCorrect ? 'correct' : 'incorrect';\n return (\n <section\n key={option.label.concat(`-${index}`)}\n className=\"flex flex-col gap-2\"\n >\n <div\n className={cn(\n 'flex flex-row justify-between items-center gap-2 p-2 rounded-md',\n !isDefaultVariant ? getStatusStyles(variantCorrect) : ''\n )}\n >\n <p className=\"text-text-900 text-sm\">\n {getLetterByIndex(index).concat(') ').concat(option.label)}\n </p>\n\n {isDefaultVariant ? (\n <Select size=\"medium\">\n <SelectTrigger className=\"w-[180px]\">\n <SelectValue placeholder=\"Selecione opcão\" />\n </SelectTrigger>\n\n <SelectContent>\n <SelectItem value=\"V\">Verdadeiro</SelectItem>\n <SelectItem value=\"F\">Falso</SelectItem>\n </SelectContent>\n </Select>\n ) : (\n <div className=\"flex-shrink-0\">\n {getStatusBadge(variantCorrect)}\n </div>\n )}\n </div>\n\n {!isDefaultVariant && (\n <span className=\"flex flex-row gap-2 items-center\">\n <p className=\"text-text-800 text-2xs\">\n Resposta selecionada: V\n </p>\n {!option.isCorrect && (\n <p className=\"text-text-800 text-2xs\">\n Resposta correta: F\n </p>\n )}\n </span>\n )}\n </section>\n );\n })}\n </div>\n </QuizContainer>\n </>\n );\n};\n\ninterface UserAnswer {\n option: string;\n dotOption: string | null;\n correctOption: string;\n isCorrect: boolean | null;\n}\n\nconst QuizConnectDots = ({ paddingBottom }: QuizVariantInterface) => {\n const { variant } = useQuizStore();\n const dotsOptions = [\n { label: 'Ração' },\n { label: 'Rato' },\n { label: 'Grama' },\n { label: 'Peixe' },\n ];\n\n const options = [\n {\n label: 'Cachorro',\n correctOption: 'Ração',\n },\n {\n label: 'Gato',\n correctOption: 'Rato',\n },\n {\n label: 'Cabra',\n correctOption: 'Grama',\n },\n {\n label: 'Baleia',\n correctOption: 'Peixe',\n },\n ];\n\n const mockUserAnswers = [\n {\n option: 'Cachorro',\n dotOption: 'Ração',\n correctOption: 'Ração',\n isCorrect: true,\n },\n {\n option: 'Gato',\n dotOption: 'Rato',\n correctOption: 'Rato',\n isCorrect: true,\n },\n {\n option: 'Cabra',\n dotOption: 'Peixe',\n correctOption: 'Grama',\n isCorrect: false,\n },\n {\n option: 'Baleia',\n dotOption: 'Grama',\n correctOption: 'Peixe',\n isCorrect: false,\n },\n ];\n\n const [userAnswers, setUserAnswers] = useState<UserAnswer[]>(() => {\n if (variant === 'result') {\n return mockUserAnswers;\n }\n return options.map((option) => ({\n option: option.label,\n dotOption: null,\n correctOption: option.correctOption,\n isCorrect: null,\n }));\n });\n\n const handleSelectDot = (optionIndex: number, dotValue: string) => {\n setUserAnswers((prev) => {\n const next = [...prev];\n const { label: optionLabel, correctOption } = options[optionIndex];\n next[optionIndex] = {\n option: optionLabel,\n dotOption: dotValue,\n correctOption,\n isCorrect: dotValue ? dotValue === correctOption : null,\n };\n return next;\n });\n };\n\n const getLetterByIndex = (index: number) => String.fromCharCode(97 + index); // 'a', 'b', 'c'...\n\n const isDefaultVariant = variant === 'default';\n const assignedDots = new Set(\n userAnswers.map((a) => a.dotOption).filter(Boolean)\n );\n\n return (\n <>\n <QuizSubTitle subTitle=\"Alternativas\" />\n\n <QuizContainer className={cn('', paddingBottom)}>\n <div className=\"flex flex-col gap-3.5\">\n {options.map((option, index) => {\n const answer = userAnswers[index];\n const variantCorrect = answer.isCorrect ? 'correct' : 'incorrect';\n return (\n <section key={option.label} className=\"flex flex-col gap-2\">\n <div\n className={cn(\n 'flex flex-row justify-between items-center gap-2 p-2 rounded-md',\n !isDefaultVariant ? getStatusStyles(variantCorrect) : ''\n )}\n >\n <p className=\"text-text-900 text-sm\">\n {getLetterByIndex(index) + ') ' + option.label}\n </p>\n\n {isDefaultVariant ? (\n <Select\n size=\"medium\"\n value={answer.dotOption || undefined}\n onValueChange={(value) => handleSelectDot(index, value)}\n >\n <SelectTrigger className=\"w-[180px]\">\n <SelectValue placeholder=\"Selecione opção\" />\n </SelectTrigger>\n\n <SelectContent>\n {dotsOptions\n .filter(\n (dot) =>\n !assignedDots.has(dot.label) ||\n answer.dotOption === dot.label\n )\n .map((dot) => (\n <SelectItem key={dot.label} value={dot.label}>\n {dot.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n ) : (\n <div className=\"flex-shrink-0\">\n {answer.isCorrect === null\n ? null\n : getStatusBadge(variantCorrect)}\n </div>\n )}\n </div>\n\n {!isDefaultVariant && (\n <span className=\"flex flex-row gap-2 items-center\">\n <p className=\"text-text-800 text-2xs\">\n Resposta selecionada: {answer.dotOption || 'Nenhuma'}\n </p>\n {!answer.isCorrect && (\n <p className=\"text-text-800 text-2xs\">\n Resposta correta: {answer.correctOption}\n </p>\n )}\n </span>\n )}\n </section>\n );\n })}\n </div>\n </QuizContainer>\n </>\n );\n};\n\ninterface FillUserAnswer {\n selectId: string;\n userAnswer: string;\n correctAnswer: string;\n isCorrect: boolean;\n}\n\nconst QuizFill = ({ paddingBottom }: QuizVariantInterface) => {\n const { variant } = useQuizStore();\n const options = [\n 'ciência',\n 'disciplina',\n 'área',\n 'especialidade',\n 'variações',\n ];\n\n const exampleText = `A meteorologia é a {{ciencia}} que estuda os fenômenos atmosféricos e suas {{variações}}. Esta disciplina científica tem como objetivo principal {{objetivo}} o comportamento da atmosfera terrestre.\n\n Os meteorologistas utilizam diversos {{instrumentos}} para coletar dados atmosféricos, incluindo termômetros, barômetros e {{equipamentos}} modernos como radares meteorológicos.`;\n\n // Mock data for result variant - simulating user answers\n const mockUserAnswers: FillUserAnswer[] = [\n {\n selectId: 'ciencia',\n userAnswer: 'tecnologia',\n correctAnswer: 'ciência',\n isCorrect: false,\n },\n {\n selectId: 'variações',\n userAnswer: 'variações',\n correctAnswer: 'variações',\n isCorrect: true,\n },\n {\n selectId: 'objetivo',\n userAnswer: 'estudar',\n correctAnswer: 'compreender',\n isCorrect: false,\n },\n {\n selectId: 'instrumentos',\n userAnswer: 'ferramentas',\n correctAnswer: 'instrumentos',\n isCorrect: false,\n },\n {\n selectId: 'equipamentos',\n userAnswer: 'equipamentos',\n correctAnswer: 'equipamentos',\n isCorrect: true,\n },\n ];\n\n const [answers, setAnswers] = useState<Record<string, string>>({});\n const baseId = useId(); // Generate base ID for this component instance\n\n // Get available options for a specific select\n const getAvailableOptionsForSelect = (selectId: string) => {\n const usedOptions = Object.entries(answers)\n .filter(([key]) => key !== selectId) // Exclude the current selection itself\n .map(([, value]) => value);\n\n return options.filter((option) => !usedOptions.includes(option));\n };\n\n const handleSelectChange = (selectId: string, value: string) => {\n const newAnswers = { ...answers, [selectId]: value };\n setAnswers(newAnswers);\n };\n\n const renderResolutionElement = (selectId: string) => {\n const mockAnswer = mockUserAnswers.find(\n (answer) => answer.selectId === selectId\n );\n\n return (\n <p className=\"inline-flex mb-2.5 text-success-600 font-semibold text-md border-b-2 border-success-600\">\n {mockAnswer?.correctAnswer}\n </p>\n );\n };\n\n const renderDefaultElement = (\n selectId: string,\n startIndex: number,\n selectedValue: string,\n availableOptionsForThisSelect: string[]\n ) => {\n return (\n <Select\n key={`${selectId}-${startIndex}`}\n value={selectedValue}\n onValueChange={(value) => handleSelectChange(selectId, value)}\n className=\"inline-flex mb-2.5\"\n >\n <SelectTrigger className=\"inline-flex w-auto min-w-[140px] h-8 mx-1 bg-white border-gray-300\">\n <SelectValue placeholder=\"Selecione opção\" />\n </SelectTrigger>\n <SelectContent>\n {availableOptionsForThisSelect.map((option, index) => (\n <SelectItem key={`${option}-${index}`} value={option}>\n {option}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n );\n };\n\n const renderResultElement = (selectId: string) => {\n const mockAnswer = mockUserAnswers.find(\n (answer) => answer.selectId === selectId\n );\n\n if (!mockAnswer) return null;\n\n const action = mockAnswer.isCorrect ? 'success' : 'error';\n const icon = mockAnswer.isCorrect ? <CheckCircle /> : <XCircle />;\n\n return (\n <Badge\n key={selectId}\n variant=\"solid\"\n action={action}\n iconRight={icon}\n size=\"large\"\n className=\"py-3 w-[180px] justify-between mb-2.5\"\n >\n <span className=\"text-text-900\">{mockAnswer.userAnswer}</span>\n </Badge>\n );\n };\n\n const renderTextWithSelects = (text: string, isResolution?: boolean) => {\n const elements: Array<{ element: string | ReactNode; id: string }> = [];\n let lastIndex = 0;\n let elementCounter = 0;\n\n // Support Unicode letters/marks and digits: allows placeholders like {{variações}}\n const regex = /\\{\\{([\\p{L}\\p{M}\\d_]+)\\}\\}/gu;\n let match;\n\n while ((match = regex.exec(text)) !== null) {\n const [fullMatch, selectId] = match;\n const startIndex = match.index;\n\n if (startIndex > lastIndex) {\n elements.push({\n element: text.slice(lastIndex, startIndex),\n id: `${baseId}-text-${++elementCounter}`,\n });\n }\n\n const selectedValue = answers[selectId];\n const availableOptionsForThisSelect =\n getAvailableOptionsForSelect(selectId);\n\n if (isResolution) {\n elements.push({\n element: renderResolutionElement(selectId),\n id: `${baseId}-resolution-${++elementCounter}`,\n });\n } else if (variant === 'default') {\n elements.push({\n element: renderDefaultElement(\n selectId,\n startIndex,\n selectedValue,\n availableOptionsForThisSelect\n ),\n id: `${baseId}-select-${++elementCounter}`,\n });\n } else {\n const resultElement = renderResultElement(selectId);\n if (resultElement) {\n elements.push({\n element: resultElement,\n id: `${baseId}-result-${++elementCounter}`,\n });\n }\n }\n\n lastIndex = match.index + fullMatch.length;\n }\n\n if (lastIndex < text.length) {\n elements.push({\n element: text.slice(lastIndex),\n id: `${baseId}-text-${++elementCounter}`,\n });\n }\n\n return elements;\n };\n\n return (\n <>\n <QuizSubTitle subTitle=\"Alternativas\" />\n\n <QuizContainer className=\"h-auto pb-0\">\n <div className=\"space-y-6 px-4 h-auto\">\n <div\n className={cn(\n 'text-lg text-text-900 leading-8 h-auto',\n variant != 'result' && paddingBottom\n )}\n >\n {renderTextWithSelects(exampleText).map((element) => (\n <span key={element.id}>{element.element}</span>\n ))}\n </div>\n </div>\n </QuizContainer>\n\n {variant === 'result' && (\n <>\n <QuizSubTitle subTitle=\"Resultado\" />\n\n <QuizContainer className=\"h-auto pb-0\">\n <div className=\"space-y-6 px-4\">\n <div\n className={cn('text-lg text-text-900 leading-8', paddingBottom)}\n >\n {renderTextWithSelects(exampleText, true).map((element) => (\n <span key={element.id}>{element.element}</span>\n ))}\n </div>\n </div>\n </QuizContainer>\n </>\n )}\n </>\n );\n};\n\nconst QuizImageQuestion = ({ paddingBottom }: QuizVariantInterface) => {\n const { variant } = useQuizStore();\n const correctPositionRelative = { x: 0.48, y: 0.45 };\n\n // Calculate correctRadiusRelative automatically based on the circle dimensions\n const calculateCorrectRadiusRelative = (): number => {\n // The correct answer circle has width: 15% and height: 30%\n // We'll use the average of these as the radius\n const circleWidthRelative = 0.15; // 15%\n const circleHeightRelative = 0.3; // 30%\n\n // Calculate the average radius (half of the average of width and height)\n const averageRadius = (circleWidthRelative + circleHeightRelative) / 4;\n\n // Add a small tolerance for better user experience\n const tolerance = 0.02; // 2% tolerance\n\n return averageRadius + tolerance;\n };\n\n const correctRadiusRelative = calculateCorrectRadiusRelative();\n const mockUserAnswerRelative = { x: 0.72, y: 0.348 };\n\n const [clickPositionRelative, setClickPositionRelative] = useState<{\n x: number;\n y: number;\n } | null>(variant == 'result' ? mockUserAnswerRelative : null);\n\n // Helper function to safely convert click coordinates to relative coordinates\n const convertToRelativeCoordinates = (\n x: number,\n y: number,\n rect: DOMRect\n ): { x: number; y: number } => {\n // Guard against division by zero or extremely small dimensions\n const safeWidth = Math.max(rect.width, 0.001);\n const safeHeight = Math.max(rect.height, 0.001);\n\n // Convert to relative coordinates and clamp to [0, 1] range\n const xRelative = Math.max(0, Math.min(1, x / safeWidth));\n const yRelative = Math.max(0, Math.min(1, y / safeHeight));\n\n return { x: xRelative, y: yRelative };\n };\n\n const handleImageClick = (event: MouseEvent<HTMLButtonElement>) => {\n if (variant === 'result') return;\n\n const rect = event.currentTarget.getBoundingClientRect();\n const x = event.clientX - rect.left;\n const y = event.clientY - rect.top;\n\n // Use helper function for safe conversion\n const positionRelative = convertToRelativeCoordinates(x, y, rect);\n setClickPositionRelative(positionRelative);\n };\n\n const handleKeyboardActivate = () => {\n if (variant === 'result') return;\n // Choose a deterministic position for keyboard activation; center is a reasonable default\n setClickPositionRelative({ x: 0.5, y: 0.5 });\n };\n\n const isCorrect = () => {\n if (!clickPositionRelative) return false;\n\n const distance = Math.sqrt(\n Math.pow(clickPositionRelative.x - correctPositionRelative.x, 2) +\n Math.pow(clickPositionRelative.y - correctPositionRelative.y, 2)\n );\n\n return distance <= correctRadiusRelative;\n };\n\n const getUserCircleColorClasses = () => {\n if (variant === 'default') {\n return 'bg-indicator-primary/70 border-[#F8CC2E]';\n }\n\n if (variant === 'result') {\n return isCorrect()\n ? 'bg-success-600/70 border-white' // Green for correct answer\n : 'bg-indicator-error/70 border-white'; // Red for incorrect answer\n }\n\n return 'bg-success-600/70 border-white';\n };\n\n return (\n <>\n <QuizSubTitle subTitle=\"Clique na área correta\" />\n\n <QuizContainer className={cn('', paddingBottom)}>\n <div\n data-testid=\"quiz-image-container\"\n className=\"space-y-6 p-3 relative inline-block\"\n >\n {variant == 'result' && (\n <div\n data-testid=\"quiz-legend\"\n className=\"flex items-center gap-4 text-xs\"\n >\n <div className=\"flex items-center gap-2\">\n <div className=\"w-3 h-3 rounded-full bg-indicator-primary/70 border border-[#F8CC2E]\"></div>\n <span className=\"text-text-600 font-medium text-sm\">\n Área correta\n </span>\n </div>\n <div className=\"flex items-center gap-2\">\n <div className=\"w-3 h-3 rounded-full bg-success-600/70 border border-white\"></div>\n <span className=\"text-text-600 font-medium text-sm\">\n Resposta correta\n </span>\n </div>\n <div className=\"flex items-center gap-2\">\n <div className=\"w-3 h-3 rounded-full bg-indicator-error/70 border border-white\"></div>\n <span className=\"text-text-600 font-medium text-sm\">\n Resposta incorreta\n </span>\n </div>\n </div>\n )}\n\n <button\n data-testid=\"quiz-image-button\"\n type=\"button\"\n className=\"relative cursor-pointer w-full h-full border-0 bg-transparent p-0\"\n onClick={handleImageClick}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleKeyboardActivate();\n }\n }}\n aria-label=\"Área da imagem interativa\"\n >\n <img\n data-testid=\"quiz-image\"\n src={ImageQuestion}\n alt=\"Question\"\n className=\"w-full h-auto rounded-md\"\n />\n\n {/* Correct answer circle - only show in result variant */}\n {variant === 'result' && (\n <div\n data-testid=\"quiz-correct-circle\"\n className=\"absolute rounded-full bg-indicator-primary/70 border-4 border-[#F8CC2E] pointer-events-none\"\n style={{\n minWidth: '50px',\n maxWidth: '160px',\n width: '15%',\n aspectRatio: '1 / 1',\n left: `calc(${correctPositionRelative.x * 100}% - 7.5%)`,\n top: `calc(${correctPositionRelative.y * 100}% - 15%)`,\n }}\n />\n )}\n\n {/* User's answer circle */}\n {clickPositionRelative && (\n <div\n data-testid=\"quiz-user-circle\"\n className={`absolute rounded-full border-4 pointer-events-none ${getUserCircleColorClasses()}`}\n style={{\n minWidth: '30px',\n maxWidth: '52px',\n width: '5%',\n aspectRatio: '1 / 1',\n left: `calc(${clickPositionRelative.x * 100}% - 2.5%)`,\n top: `calc(${clickPositionRelative.y * 100}% - 2.5%)`,\n }}\n />\n )}\n </button>\n </div>\n </QuizContainer>\n </>\n );\n};\n\nconst QuizQuestionList = ({\n filterType = 'all',\n onQuestionClick,\n}: {\n filterType?: string;\n onQuestionClick?: () => void;\n} = {}) => {\n const {\n getQuestionsGroupedBySubject,\n goToQuestion,\n getQuestionStatusFromUserAnswers,\n getQuestionIndex,\n } = useQuizStore();\n\n const groupedQuestions = getQuestionsGroupedBySubject();\n const getQuestionStatus = (questionId: string) => {\n return getQuestionStatusFromUserAnswers(questionId);\n };\n\n const filteredGroupedQuestions = Object.entries(groupedQuestions).reduce(\n (acc, [subjectId, questions]) => {\n const filteredQuestions = questions.filter((question) => {\n const status = getQuestionStatus(question.id);\n\n switch (filterType) {\n case 'answered':\n return status === 'answered';\n case 'unanswered':\n return status === 'unanswered';\n default:\n return true;\n }\n });\n\n if (filteredQuestions.length > 0) {\n acc[subjectId] = filteredQuestions;\n }\n\n return acc;\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n {} as { [key: string]: any[] }\n );\n\n const getStatusLabel = (status: string) => {\n switch (status) {\n case 'answered':\n return 'Respondida';\n case 'skipped':\n return 'Não respondida';\n default:\n return 'Em branco';\n }\n };\n return (\n <div className=\"space-y-6 px-4\">\n {Object.entries(filteredGroupedQuestions).map(\n ([subjectId, questions]) => (\n <section key={subjectId} className=\"flex flex-col gap-2\">\n <span className=\"pt-6 pb-4 flex flex-row gap-2\">\n <div className=\"bg-primary-500 p-1 rounded-sm flex items-center justify-center\">\n <BookOpen size={17} className=\"text-white\" />\n </div>\n <p className=\"text-text-800 font-bold text-lg\">\n {questions?.[0]?.knowledgeMatrix?.[0]?.subject?.name ??\n 'Sem matéria'}\n </p>\n </span>\n\n <ul className=\"flex flex-col gap-2\">\n {questions.map((question) => {\n const status = getQuestionStatus(question.id);\n const questionNumber = getQuestionIndex(question.id);\n\n return (\n <CardStatus\n key={question.id}\n header={`Questão ${questionNumber.toString().padStart(2, '0')}`}\n label={getStatusLabel(status)}\n onClick={() => {\n goToQuestion(questionNumber - 1);\n onQuestionClick?.();\n }}\n />\n );\n })}\n </ul>\n </section>\n )\n )}\n </div>\n );\n};\n\nconst QuizFooter = forwardRef<\n HTMLDivElement,\n {\n className?: string;\n onGoToSimulated?: () => void;\n onDetailResult?: () => void;\n handleFinishSimulated?: () => void;\n resultImageComponent?: ReactNode;\n }\n>(\n (\n {\n className,\n onGoToSimulated,\n onDetailResult,\n handleFinishSimulated,\n resultImageComponent,\n ...props\n },\n ref\n ) => {\n const {\n currentQuestionIndex,\n getTotalQuestions,\n goToNextQuestion,\n goToPreviousQuestion,\n getUnansweredQuestionsFromUserAnswers,\n getCurrentAnswer,\n skipQuestion,\n getCurrentQuestion,\n getQuestionStatusFromUserAnswers,\n variant,\n getQuestionResultStatistics,\n } = useQuizStore();\n\n const totalQuestions = getTotalQuestions();\n const isFirstQuestion = currentQuestionIndex === 0;\n const isLastQuestion = currentQuestionIndex === totalQuestions - 1;\n const currentAnswer = getCurrentAnswer();\n const currentQuestion = getCurrentQuestion();\n const isCurrentQuestionSkipped = currentQuestion\n ? getQuestionStatusFromUserAnswers(currentQuestion.id) === 'skipped'\n : false;\n const [alertDialogOpen, setAlertDialogOpen] = useState(false);\n const [modalResultOpen, setModalResultOpen] = useState(false);\n const [modalNavigateOpen, setModalNavigateOpen] = useState(false);\n const [modalResolutionOpen, setModalResolutionOpen] = useState(false);\n const [filterType, setFilterType] = useState<string | undefined>(undefined);\n const unansweredQuestions = getUnansweredQuestionsFromUserAnswers();\n const allQuestions = getTotalQuestions();\n\n const handleFinishQuiz = async () => {\n if (unansweredQuestions.length > 0) {\n setAlertDialogOpen(true);\n return;\n }\n\n try {\n if (handleFinishSimulated) {\n await Promise.resolve(handleFinishSimulated());\n }\n setModalResultOpen(true);\n } catch (err) {\n console.error('handleFinishSimulated failed:', err);\n return;\n }\n };\n\n const handleAlertSubmit = async () => {\n try {\n if (handleFinishSimulated) {\n await Promise.resolve(handleFinishSimulated());\n }\n setModalResultOpen(true);\n setAlertDialogOpen(false);\n } catch (err) {\n console.error('handleFinishSimulated failed:', err);\n setAlertDialogOpen(false);\n return;\n }\n };\n\n return (\n <>\n <footer\n ref={ref}\n className={cn(\n 'w-full px-2 bg-background lg:max-w-[1000px] not-lg:max-w-[calc(100vw-32px)] border-t border-border-50 fixed bottom-0 min-h-[80px] flex flex-row justify-between items-center',\n className\n )}\n {...props}\n >\n {variant === 'default' ? (\n <>\n <div className=\"flex flex-row items-center gap-1\">\n <IconButton\n icon={<SquaresFour size={24} className=\"text-text-950\" />}\n size=\"md\"\n onClick={() => setModalNavigateOpen(true)}\n />\n\n {isFirstQuestion ? (\n <Button\n variant=\"outline\"\n size=\"small\"\n onClick={() => {\n skipQuestion();\n goToNextQuestion();\n }}\n >\n Pular\n </Button>\n ) : (\n <Button\n size=\"medium\"\n variant=\"link\"\n action=\"primary\"\n iconLeft={<CaretLeft size={18} />}\n onClick={() => {\n goToPreviousQuestion();\n }}\n >\n Voltar\n </Button>\n )}\n </div>\n\n {!isFirstQuestion && (\n <Button\n size=\"small\"\n variant=\"outline\"\n action=\"primary\"\n onClick={() => {\n skipQuestion();\n goToNextQuestion();\n }}\n >\n Pular\n </Button>\n )}\n\n {isLastQuestion ? (\n <Button\n size=\"medium\"\n variant=\"solid\"\n action=\"primary\"\n disabled={!currentAnswer && !isCurrentQuestionSkipped}\n onClick={handleFinishQuiz}\n >\n Finalizar\n </Button>\n ) : (\n <Button\n size=\"medium\"\n variant=\"link\"\n action=\"primary\"\n iconRight={<CaretRight size={18} />}\n disabled={!currentAnswer && !isCurrentQuestionSkipped}\n onClick={() => {\n goToNextQuestion();\n }}\n >\n Avançar\n </Button>\n )}\n </>\n ) : (\n <div className=\"flex flex-row items-center justify-end w-full\">\n <Button\n variant=\"solid\"\n action=\"primary\"\n size=\"medium\"\n onClick={() => setModalResolutionOpen(true)}\n >\n Ver Resolução\n </Button>\n </div>\n )}\n </footer>\n\n <AlertDialog\n isOpen={alertDialogOpen}\n onChangeOpen={setAlertDialogOpen}\n title=\"Finalizar simulado?\"\n description={\n unansweredQuestions.length > 0\n ? `Você deixou as questões ${unansweredQuestions.join(', ')} sem resposta. Finalizar agora pode impactar seu desempenho.`\n : 'Tem certeza que deseja finalizar o simulado?'\n }\n cancelButtonLabel=\"Voltar e revisar\"\n submitButtonLabel=\"Finalizar Mesmo Assim\"\n onSubmit={handleAlertSubmit}\n />\n\n <Modal\n isOpen={modalResultOpen}\n onClose={() => setModalResultOpen(false)}\n title=\"\"\n closeOnBackdropClick={false}\n closeOnEscape={false}\n hideCloseButton\n size={'md'}\n >\n <div className=\"flex flex-col w-full h-full items-center justify-center gap-4\">\n {resultImageComponent ? (\n <div className=\"w-[282px] h-auto\">{resultImageComponent}</div>\n ) : (\n <div className=\"w-[282px] h-[200px] bg-gray-100 rounded-md flex items-center justify-center\">\n <span className=\"text-gray-500 text-sm\">\n Imagem de resultado\n </span>\n </div>\n )}\n <div className=\"flex flex-col gap-2 text-center\">\n <h2 className=\"text-text-950 font-bold text-lg\">\n Você concluiu o simulado!\n </h2>\n <p className=\"text-text-500 font-sm\">\n Você acertou{' '}\n {getQuestionResultStatistics()?.correctAnswers ?? '--'} de{' '}\n {allQuestions} questões.\n </p>\n </div>\n\n <div className=\"px-6 flex flex-row items-center gap-2 w-full\">\n <Button\n variant=\"outline\"\n className=\"w-full\"\n size=\"small\"\n onClick={onGoToSimulated}\n >\n Ir para simulados\n </Button>\n\n <Button className=\"w-full\" onClick={onDetailResult}>\n Detalhar resultado\n </Button>\n </div>\n </div>\n </Modal>\n\n <Modal\n isOpen={modalNavigateOpen}\n onClose={() => setModalNavigateOpen(false)}\n title=\"Questões\"\n size={'lg'}\n >\n <div className=\"flex flex-col w-full h-full\">\n <div className=\"flex flex-row justify-between items-center py-6 pt-6 pb-4 border-b border-border-200\">\n <p className=\"text-text-950 font-bold text-lg\">Filtrar por</p>\n <span className=\"max-w-[266px]\">\n <Select value={filterType} onValueChange={setFilterType}>\n <SelectTrigger variant=\"rounded\" className=\"max-w-[266px]\">\n <SelectValue placeholder=\"Selecione uma opção\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"all\">Todas</SelectItem>\n <SelectItem value=\"unanswered\">Em branco</SelectItem>\n <SelectItem value=\"answered\">Respondidas</SelectItem>\n </SelectContent>\n </Select>\n </span>\n </div>\n\n <div className=\"flex flex-col gap-2 not-lg:h-[calc(100vh-200px)] lg:max-h-[687px] overflow-y-auto\">\n <QuizQuestionList\n filterType={filterType}\n onQuestionClick={() => setModalNavigateOpen(false)}\n />\n </div>\n </div>\n </Modal>\n\n <Modal\n isOpen={modalResolutionOpen}\n onClose={() => setModalResolutionOpen(false)}\n title=\"Resolução\"\n size={'lg'}\n >\n {currentQuestion?.solutionExplanation}\n </Modal>\n </>\n );\n }\n);\n\n// QUIZ RESULT COMPONENTS\n\nconst QuizResultHeaderTitle = forwardRef<\n HTMLDivElement,\n { className?: string }\n>(({ className, ...props }, ref) => {\n const { bySimulated } = useQuizStore();\n\n return (\n <div\n ref={ref}\n className={cn('flex flex-row pt-4 justify-between', className)}\n {...props}\n >\n <p className=\"text-text-950 font-bold text-2xl\">Resultado</p>\n {bySimulated && (\n <Badge variant=\"solid\" action=\"info\">\n {bySimulated.type}\n </Badge>\n )}\n </div>\n );\n});\n\nconst QuizResultTitle = forwardRef<\n HTMLParagraphElement,\n { className?: string }\n>(({ className, ...props }, ref) => {\n const { getQuizTitle } = useQuizStore();\n const quizTitle = getQuizTitle();\n\n return (\n <p\n className={cn('pt-6 pb-4 text-text-950 font-bold text-lg', className)}\n ref={ref}\n {...props}\n >\n {quizTitle}\n </p>\n );\n});\n\nconst QuizResultPerformance = forwardRef<HTMLDivElement>(\n ({ ...props }, ref) => {\n const {\n getTotalQuestions,\n timeElapsed,\n formatTime,\n getQuestionResultStatistics,\n getQuestionResult,\n } = useQuizStore();\n\n const totalQuestions = getTotalQuestions();\n const questionResult = getQuestionResult();\n\n let correctAnswers = 0;\n let correctEasyAnswers = 0;\n let correctMediumAnswers = 0;\n let correctDifficultAnswers = 0;\n let totalEasyQuestions = 0;\n let totalMediumQuestions = 0;\n let totalDifficultQuestions = 0;\n\n if (questionResult) {\n questionResult.answers.forEach((answer) => {\n const isCorrect = answer.answerStatus == ANSWER_STATUS.RESPOSTA_CORRETA;\n\n if (isCorrect) {\n correctAnswers++;\n }\n\n if (answer.difficultyLevel === QUESTION_DIFFICULTY.FACIL) {\n totalEasyQuestions++;\n if (isCorrect) {\n correctEasyAnswers++;\n }\n } else if (answer.difficultyLevel === QUESTION_DIFFICULTY.MEDIO) {\n totalMediumQuestions++;\n if (isCorrect) {\n correctMediumAnswers++;\n }\n } else if (answer.difficultyLevel === QUESTION_DIFFICULTY.DIFICIL) {\n totalDifficultQuestions++;\n if (isCorrect) {\n correctDifficultAnswers++;\n }\n }\n });\n }\n\n const percentage =\n totalQuestions > 0\n ? Math.round((correctAnswers / totalQuestions) * 100)\n : 0;\n\n return (\n <div\n className=\"flex flex-row gap-6 p-6 rounded-xl bg-background justify-between\"\n ref={ref}\n {...props}\n >\n <div className=\"relative\">\n <ProgressCircle\n size=\"medium\"\n variant=\"green\"\n value={percentage}\n showPercentage={false}\n label=\"\"\n />\n\n <div className=\"absolute inset-0 flex flex-col items-center justify-center\">\n <div className=\"flex items-center gap-1 mb-1\">\n <Clock size={12} weight=\"regular\" className=\"text-text-800\" />\n <span className=\"text-2xs font-medium text-text-800\">\n {formatTime(timeElapsed)}\n </span>\n </div>\n\n <div className=\"text-2xl font-medium text-text-800 leading-7\">\n {getQuestionResultStatistics()?.correctAnswers ?? '--'} de{' '}\n {totalQuestions}\n </div>\n\n <div className=\"text-2xs font-medium text-text-600 mt-1\">\n Corretas\n </div>\n </div>\n </div>\n\n <div className=\"flex flex-col gap-4 w-full\">\n <ProgressBar\n className=\"w-full\"\n layout=\"stacked\"\n variant=\"green\"\n value={correctEasyAnswers}\n max={totalEasyQuestions}\n label=\"Fáceis\"\n showHitCount\n labelClassName=\"text-base font-medium text-text-800 leading-none\"\n percentageClassName=\"text-xs font-medium leading-[14px] text-right\"\n />\n\n <ProgressBar\n className=\"w-full\"\n layout=\"stacked\"\n variant=\"green\"\n value={correctMediumAnswers}\n max={totalMediumQuestions}\n label=\"Médias\"\n showHitCount\n labelClassName=\"text-base font-medium text-text-800 leading-none\"\n percentageClassName=\"text-xs font-medium leading-[14px] text-right\"\n />\n\n <ProgressBar\n className=\"w-full\"\n layout=\"stacked\"\n variant=\"green\"\n value={correctDifficultAnswers}\n max={totalDifficultQuestions}\n label=\"Difíceis\"\n showHitCount\n labelClassName=\"text-base font-medium text-text-800 leading-none\"\n percentageClassName=\"text-xs font-medium leading-[14px] text-right\"\n />\n </div>\n </div>\n );\n }\n);\n\nconst QuizListResult = forwardRef<\n HTMLDivElement,\n {\n className?: string;\n onSubjectClick?: (subject: string) => void;\n }\n>(({ className, onSubjectClick, ...props }, ref) => {\n const { getQuestionsGroupedBySubject } = useQuizStore();\n const groupedQuestions = getQuestionsGroupedBySubject();\n const subjectsStats = Object.entries(groupedQuestions).map(\n ([subjectId, questions]) => {\n let correct = 0;\n let incorrect = 0;\n\n questions.forEach((question) => {\n if (question.answerStatus == ANSWER_STATUS.RESPOSTA_CORRETA) {\n correct++;\n } else {\n incorrect++;\n }\n });\n\n return {\n subject: {\n name:\n questions?.[0]?.knowledgeMatrix?.[0]?.subject?.name ??\n 'Sem matéria',\n id: subjectId,\n },\n correct,\n incorrect,\n total: questions.length,\n };\n }\n );\n\n return (\n <section ref={ref} className={className} {...props}>\n <p className=\"pt-6 pb-4 text-text-950 font-bold text-lg\">Matérias</p>\n\n <ul className=\"flex flex-col gap-2\">\n {subjectsStats.map((subject) => (\n <li key={subject.subject.id}>\n <CardResults\n onClick={() => onSubjectClick?.(subject.subject.id)}\n className=\"max-w-full\"\n header={subject.subject.name}\n correct_answers={subject.correct}\n incorrect_answers={subject.incorrect}\n icon={<Book size={20} />}\n direction=\"row\"\n />\n </li>\n ))}\n </ul>\n </section>\n );\n});\n\nconst QuizListResultByMateria = ({\n subject,\n onQuestionClick,\n}: {\n subject: string;\n onQuestionClick: (question: Question) => void;\n}) => {\n const { getQuestionsGroupedBySubject, getQuestionIndex } = useQuizStore();\n const groupedQuestions = getQuestionsGroupedBySubject();\n\n const answeredQuestions = groupedQuestions[subject] || [];\n\n return (\n <div className=\"w-full max-w-[1000px] flex flex-col mx-auto h-full relative not-lg:px-6\">\n <div className=\"flex flex-row pt-4 justify-between\">\n <p className=\"text-text-950 font-bold text-2xl\">\n {answeredQuestions?.[0]?.knowledgeMatrix?.[0]?.subject?.name ??\n 'Sem matéria'}\n </p>\n </div>\n\n <section className=\"flex flex-col \">\n <p className=\"pt-6 pb-4 text-text-950 font-bold text-lg\">\n Resultado das questões\n </p>\n\n <ul className=\"flex flex-col gap-2 pt-4\">\n {answeredQuestions.map((question) => {\n const questionIndex = getQuestionIndex(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (question as any).questionId ?? question.id\n );\n return (\n <li key={question.id}>\n <CardStatus\n className=\"max-w-full\"\n header={`Questão ${questionIndex.toString().padStart(2, '0')}`}\n status={(() => {\n if (\n question.answerStatus === ANSWER_STATUS.RESPOSTA_CORRETA\n )\n return 'correct';\n if (\n question.answerStatus === ANSWER_STATUS.RESPOSTA_INCORRETA\n )\n return 'incorrect';\n return undefined;\n })()}\n onClick={() => onQuestionClick?.(question)}\n />\n </li>\n );\n })}\n </ul>\n </section>\n </div>\n );\n};\n\nexport {\n QuizHeaderResult,\n QuizTitle,\n QuizSubTitle,\n Quiz,\n QuizHeader,\n QuizContainer,\n QuizContent,\n QuizAlternative,\n QuizQuestionList,\n QuizFooter,\n QuizListResult,\n QuizResultHeaderTitle,\n QuizResultTitle,\n QuizResultPerformance,\n QuizListResultByMateria,\n QuizMultipleChoice,\n QuizDissertative,\n QuizTrueOrFalse,\n QuizConnectDots,\n QuizFill,\n QuizImageQuestion,\n};\n","import { HTMLAttributes, ReactNode } from 'react';\nimport { Bell } from 'phosphor-react';\nimport { cn } from '../../utils/utils';\n\n/**\n * Lookup table for variant and action class combinations\n */\nconst VARIANT_ACTION_CLASSES = {\n solid: {\n error: 'bg-error-background text-error-700 focus-visible:outline-none',\n warning: 'bg-warning text-warning-800 focus-visible:outline-none',\n success: 'bg-success text-success-800 focus-visible:outline-none',\n info: 'bg-info text-info-800 focus-visible:outline-none',\n muted: 'bg-background-muted text-background-800 focus-visible:outline-none',\n },\n outlined: {\n error:\n 'bg-error text-error-700 border border-error-300 focus-visible:outline-none',\n warning:\n 'bg-warning text-warning-800 border border-warning-300 focus-visible:outline-none',\n success:\n 'bg-success text-success-800 border border-success-300 focus-visible:outline-none',\n info: 'bg-info text-info-800 border border-info-300 focus-visible:outline-none',\n muted:\n 'bg-background-muted text-background-800 border border-border-300 focus-visible:outline-none',\n },\n exams: {\n exam1: 'bg-exam-1 text-info-700 focus-visible:outline-none',\n exam2: 'bg-exam-2 text-typography-1 focus-visible:outline-none',\n exam3: 'bg-exam-3 text-typography-2 focus-visible:outline-none',\n exam4: 'bg-exam-4 text-success-700 focus-visible:outline-none',\n },\n examsOutlined: {\n exam1:\n 'bg-exam-1 text-info-700 border border-info-700 focus-visible:outline-none',\n exam2:\n 'bg-exam-2 text-typography-1 border border-typography-1 focus-visible:outline-none',\n exam3:\n 'bg-exam-3 text-typography-2 border border-typography-2 focus-visible:outline-none',\n exam4:\n 'bg-exam-4 text-success-700 border border-success-700 focus-visible:outline-none',\n },\n resultStatus: {\n negative: 'bg-error text-error-800 focus-visible:outline-none',\n positive: 'bg-success text-success-800 focus-visible:outline-none',\n },\n notification: 'text-primary',\n} as const;\n\n/**\n * Lookup table for size classes\n */\nconst SIZE_CLASSES = {\n small: 'text-2xs px-2 py-1',\n medium: 'text-xs px-2 py-1',\n large: 'text-sm px-2 py-1',\n} as const;\n\nconst SIZE_CLASSES_ICON = {\n small: 'size-3',\n medium: 'size-3.5',\n large: 'size-4',\n} as const;\n\n/**\n * Badge component props interface\n */\ntype BadgeProps = {\n /** Content to be displayed inside the badge */\n children?: ReactNode;\n /** Ícone à direita do texto */\n iconRight?: ReactNode;\n /** Ícone à esquerda do texto */\n iconLeft?: ReactNode;\n /** Size of the badge */\n size?: 'small' | 'medium' | 'large';\n /** Visual variant of the badge */\n variant?:\n | 'solid'\n | 'outlined'\n | 'exams'\n | 'examsOutlined'\n | 'resultStatus'\n | 'notification';\n /** Action type of the badge */\n action?:\n | 'error'\n | 'warning'\n | 'success'\n | 'info'\n | 'muted'\n | 'exam1'\n | 'exam2'\n | 'exam3'\n | 'exam4'\n | 'positive'\n | 'negative';\n /** Additional CSS classes to apply */\n className?: string;\n notificationActive?: boolean;\n} & HTMLAttributes<HTMLDivElement>;\n\n/**\n * Badge component for Analytica Ensino platforms\n *\n * A flexible button component with multiple variants, sizes and actions.\n *\n * @param children - The content to display inside the badge\n * @param size - The size variant (extra-small, small, medium, large, extra-large)\n * @param variant - The visual style variant (solid, outline, link)\n * @param action - The action type (primary, positive, negative)\n * @param className - Additional CSS classes\n * @param props - All other standard div HTML attributes\n * @returns A styled badge element\n *\n * @example\n * ```tsx\n * <Badge variant=\"solid\" action=\"info\" size=\"medium\">\n * Information\n * </Badge>\n * ```\n */\nconst Badge = ({\n children,\n iconLeft,\n iconRight,\n size = 'medium',\n variant = 'solid',\n action = 'error',\n className = '',\n notificationActive = false,\n ...props\n}: BadgeProps) => {\n // Get classes from lookup tables\n const sizeClasses = SIZE_CLASSES[size];\n const sizeClassesIcon = SIZE_CLASSES_ICON[size];\n const variantActionMap = VARIANT_ACTION_CLASSES[variant] || {};\n const variantClasses =\n typeof variantActionMap === 'string'\n ? variantActionMap\n : ((variantActionMap as Record<string, string>)[action] ??\n (variantActionMap as Record<string, string>).muted ??\n '');\n\n const baseClasses =\n 'inline-flex items-center justify-center rounded-xs font-normal gap-1 relative';\n\n const baseClassesIcon = 'flex items-center';\n if (variant === 'notification') {\n return (\n <div\n className={cn(baseClasses, variantClasses, sizeClasses, className)}\n {...props}\n >\n <Bell size={24} className=\"text-current\" aria-hidden=\"true\" />\n\n {notificationActive && (\n <span\n data-testid=\"notification-dot\"\n className=\"absolute top-[5px] right-[10px] block h-2 w-2 rounded-full bg-indicator-error ring-2 ring-white\"\n />\n )}\n </div>\n );\n }\n return (\n <div\n className={cn(baseClasses, variantClasses, sizeClasses, className)}\n {...props}\n >\n {iconLeft && (\n <span className={cn(baseClassesIcon, sizeClassesIcon)}>{iconLeft}</span>\n )}\n {children}\n {iconRight && (\n <span className={cn(baseClassesIcon, sizeClassesIcon)}>\n {iconRight}\n </span>\n )}\n </div>\n );\n};\n\nexport default Badge;\n","import { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import { CheckCircle, XCircle } from 'phosphor-react';\nimport Badge from '../Badge/Badge';\nimport { RadioGroup, RadioGroupItem } from '../Radio/Radio';\nimport { forwardRef, HTMLAttributes, useId, useState } from 'react';\nimport { cn } from '../../utils/utils';\n\n/**\n * Interface para definir uma alternativa\n */\nexport interface Alternative {\n value: string;\n label: string;\n status?: 'correct' | 'incorrect' | 'neutral';\n disabled?: boolean;\n description?: string;\n}\n\n/**\n * Props do componente AlternativesList\n */\nexport interface AlternativesListProps {\n /** Lista de alternativas */\n alternatives: Alternative[];\n /** Nome do grupo de radio */\n name?: string;\n /** Valor selecionado por padrão */\n defaultValue?: string;\n /** Valor controlado */\n value?: string;\n /** Callback quando uma alternativa é selecionada */\n onValueChange?: (value: string) => void;\n /** Se o componente está desabilitado */\n disabled?: boolean;\n /** Layout das alternativas */\n layout?: 'default' | 'compact' | 'detailed';\n /** Classes CSS adicionais */\n className?: string;\n /** Modo de exibição: interativo (com radios funcionais) ou readonly (apenas visual) */\n mode?: 'interactive' | 'readonly';\n /** Valor selecionado pelo usuário (apenas para modo readonly) */\n selectedValue?: string;\n}\n\n/**\n * Componente reutilizável para exibir lista de alternativas com RadioGroup\n *\n * Suporta dois modos:\n * - `interactive`: Permite interação com radios (padrão)\n * - `readonly`: Apenas exibição visual dos estados\n *\n * @example\n * ```tsx\n * // Modo interativo (padrão)\n * <AlternativesList\n * mode=\"interactive\"\n * alternatives={[\n * { value: \"a\", label: \"Alternativa A\", status: \"correct\" },\n * { value: \"b\", label: \"Alternativa B\", status: \"incorrect\" },\n * { value: \"c\", label: \"Alternativa C\" }\n * ]}\n * defaultValue=\"a\"\n * onValueChange={(value) => console.log(value)}\n * />\n *\n * // Modo readonly - mostra seleção do usuário\n * <AlternativesList\n * mode=\"readonly\"\n * selectedValue=\"b\" // O que o usuário selecionou\n * alternatives={[\n * { value: \"a\", label: \"Resposta A\", status: \"correct\" }, // Mostra como correta\n * { value: \"b\", label: \"Resposta B\" }, // Mostra radio selecionado + badge incorreto\n * { value: \"c\", label: \"Resposta C\" }\n * ]}\n * />\n * ```\n */\nconst AlternativesList = ({\n alternatives,\n name,\n defaultValue,\n value,\n onValueChange,\n disabled = false,\n layout = 'default',\n className = '',\n mode = 'interactive',\n selectedValue,\n}: AlternativesListProps) => {\n // Gerar um ID único para garantir que cada instância tenha seu próprio grupo\n const uniqueId = useId();\n const groupName = name || `alternatives-${uniqueId}`;\n const [actualValue, setActualValue] = useState(value);\n // No modo readonly, não precisamos de interação\n const isReadonly = mode === 'readonly';\n const getStatusStyles = (\n status?: Alternative['status'],\n isReadonly?: boolean\n ) => {\n const hoverClass = isReadonly ? '' : 'hover:bg-background-50';\n\n switch (status) {\n case 'correct':\n return 'bg-success-background border-success-300';\n case 'incorrect':\n return 'bg-error-background border-error-300';\n default:\n return `bg-background border-border-100 ${hoverClass}`;\n }\n };\n\n const getStatusBadge = (status?: Alternative['status']) => {\n switch (status) {\n case 'correct':\n return (\n <Badge variant=\"solid\" action=\"success\" iconLeft={<CheckCircle />}>\n Resposta correta\n </Badge>\n );\n case 'incorrect':\n return (\n <Badge variant=\"solid\" action=\"error\" iconLeft={<XCircle />}>\n Resposta incorreta\n </Badge>\n );\n default:\n return null;\n }\n };\n\n const getLayoutClasses = () => {\n switch (layout) {\n case 'compact':\n return 'gap-2';\n case 'detailed':\n return 'gap-4';\n default:\n return 'gap-3.5';\n }\n };\n\n // Componente para renderizar alternativa no modo readonly\n const renderReadonlyAlternative = (alternative: Alternative) => {\n const alternativeId = alternative.value;\n const isUserSelected = selectedValue === alternative.value;\n const isCorrectAnswer = alternative.status === 'correct';\n\n // Determinar o status da alternativa para visualização\n let displayStatus: Alternative['status'] = undefined;\n if (isUserSelected && !isCorrectAnswer) {\n // Usuário selecionou alternativa incorreta\n displayStatus = 'incorrect';\n } else if (isCorrectAnswer) {\n // Alternativa correta (independente se foi selecionada ou não)\n displayStatus = 'correct';\n }\n\n const statusStyles = getStatusStyles(displayStatus, true);\n const statusBadge = getStatusBadge(displayStatus);\n\n // Radio visual - apenas mostra selecionado se o usuário escolheu esta alternativa\n const renderRadio = () => {\n const radioClasses = `w-6 h-6 rounded-full border-2 cursor-default transition-all duration-200 flex items-center justify-center ${\n isUserSelected\n ? 'border-primary-950 bg-background'\n : 'border-border-400 bg-background'\n }`;\n\n const dotClasses =\n 'w-3 h-3 rounded-full bg-primary-950 transition-all duration-200';\n\n return (\n <div className={radioClasses}>\n {isUserSelected && <div className={dotClasses} />}\n </div>\n );\n };\n\n if (layout === 'detailed') {\n return (\n <div\n key={alternativeId}\n className={cn(\n 'border-2 rounded-lg p-4 w-full',\n statusStyles,\n alternative.disabled ? 'opacity-50' : ''\n )}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"flex items-start gap-3 flex-1\">\n <div className=\"mt-1\">{renderRadio()}</div>\n <div className=\"flex-1\">\n <p\n className={cn(\n 'block font-medium',\n selectedValue === alternative.value || statusBadge\n ? 'text-text-950'\n : 'text-text-600'\n )}\n >\n {alternative.label}\n </p>\n {alternative.description && (\n <p className=\"text-sm text-text-600 mt-1\">\n {alternative.description}\n </p>\n )}\n </div>\n </div>\n {statusBadge && <div className=\"flex-shrink-0\">{statusBadge}</div>}\n </div>\n </div>\n );\n }\n\n return (\n <div\n key={alternativeId}\n className={cn(\n 'flex flex-row justify-between items-start gap-2 p-2 rounded-lg w-full',\n statusStyles,\n alternative.disabled ? 'opacity-50' : ''\n )}\n >\n <div className=\"flex items-center gap-2 flex-1\">\n {renderRadio()}\n <span\n className={cn(\n 'flex-1',\n selectedValue === alternative.value || statusBadge\n ? 'text-text-950'\n : 'text-text-600'\n )}\n >\n {alternative.label}\n </span>\n </div>\n {statusBadge && <div className=\"flex-shrink-0\">{statusBadge}</div>}\n </div>\n );\n };\n\n // Se for modo readonly, renderizar sem RadioGroup\n if (isReadonly) {\n return (\n <div\n className={cn('flex flex-col', getLayoutClasses(), 'w-full', className)}\n >\n {alternatives.map((alternative) =>\n renderReadonlyAlternative(alternative)\n )}\n </div>\n );\n }\n\n return (\n <RadioGroup\n name={groupName}\n defaultValue={defaultValue}\n value={value}\n onValueChange={(value) => {\n setActualValue(value);\n onValueChange?.(value);\n }}\n disabled={disabled}\n className={cn('flex flex-col', getLayoutClasses(), className)}\n >\n {alternatives.map((alternative, index) => {\n const alternativeId = alternative.value || `alt-${index}`;\n const statusStyles = getStatusStyles(alternative.status, false);\n const statusBadge = getStatusBadge(alternative.status);\n\n if (layout === 'detailed') {\n return (\n <div\n key={alternativeId}\n className={cn(\n 'border-2 rounded-lg p-4 transition-all',\n statusStyles,\n alternative.disabled\n ? 'opacity-50 cursor-not-allowed'\n : 'cursor-pointer'\n )}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"flex items-start gap-3 flex-1\">\n <RadioGroupItem\n value={alternative.value}\n id={alternativeId}\n disabled={alternative.disabled}\n className=\"mt-1\"\n />\n <div className=\"flex-1\">\n <label\n htmlFor={alternativeId}\n className={cn(\n 'block font-medium',\n actualValue === alternative.value\n ? 'text-text-950'\n : 'text-text-600',\n alternative.disabled\n ? 'cursor-not-allowed'\n : 'cursor-pointer'\n )}\n >\n {alternative.label}\n </label>\n {alternative.description && (\n <p className=\"text-sm text-text-600 mt-1\">\n {alternative.description}\n </p>\n )}\n </div>\n </div>\n {statusBadge && (\n <div className=\"flex-shrink-0\">{statusBadge}</div>\n )}\n </div>\n </div>\n );\n }\n\n return (\n <div\n key={alternativeId}\n className={cn(\n 'flex flex-row justify-between gap-2 items-start p-2 rounded-lg transition-all',\n statusStyles,\n alternative.disabled ? 'opacity-50 cursor-not-allowed' : ''\n )}\n >\n <div className=\"flex items-center gap-2 flex-1\">\n <RadioGroupItem\n value={alternative.value}\n id={alternativeId}\n disabled={alternative.disabled}\n />\n <label\n htmlFor={alternativeId}\n className={cn(\n 'flex-1',\n actualValue === alternative.value\n ? 'text-text-950'\n : 'text-text-600',\n alternative.disabled ? 'cursor-not-allowed' : 'cursor-pointer'\n )}\n >\n {alternative.label}\n </label>\n </div>\n {statusBadge && <div className=\"flex-shrink-0\">{statusBadge}</div>}\n </div>\n );\n })}\n </RadioGroup>\n );\n};\n\ninterface HeaderAlternativeProps extends HTMLAttributes<HTMLDivElement> {\n title: string;\n subTitle: string;\n content: string;\n}\n\nconst HeaderAlternative = forwardRef<HTMLDivElement, HeaderAlternativeProps>(\n ({ className, title, subTitle, content, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\n 'bg-background p-4 flex flex-col gap-4 rounded-xl',\n className\n )}\n {...props}\n >\n <span className=\"flex flex-col\">\n <p className=\"text-text-950 font-bold text-lg\">{title}</p>\n <p className=\"text-text-700 text-sm \">{subTitle}</p>\n </span>\n\n <p className=\"text-text-950 text-md\">{content}</p>\n </div>\n );\n }\n);\n\nexport { AlternativesList, HeaderAlternative };\n","import {\n InputHTMLAttributes,\n HTMLAttributes,\n ReactNode,\n forwardRef,\n useState,\n useId,\n ChangeEvent,\n useEffect,\n useRef,\n Children,\n cloneElement,\n isValidElement,\n ReactElement,\n} from 'react';\nimport { create, StoreApi, useStore } from 'zustand';\nimport Text from '../Text/Text';\nimport { cn } from '../../utils/utils';\n\n/**\n * Radio size variants\n */\ntype RadioSize = 'small' | 'medium' | 'large' | 'extraLarge';\n\n/**\n * Radio visual state\n */\ntype RadioState = 'default' | 'hovered' | 'focused' | 'invalid' | 'disabled';\n\n/**\n * Size configurations using Tailwind classes\n */\nconst SIZE_CLASSES = {\n small: {\n radio: 'w-5 h-5',\n textSize: 'sm' as const,\n spacing: 'gap-1.5',\n borderWidth: 'border-2',\n dotSize: 'w-2.5 h-2.5',\n labelHeight: 'h-5',\n },\n medium: {\n radio: 'w-6 h-6',\n textSize: 'md' as const,\n spacing: 'gap-2',\n borderWidth: 'border-2',\n dotSize: 'w-3 h-3',\n labelHeight: 'h-6',\n },\n large: {\n radio: 'w-7 h-7',\n textSize: 'lg' as const,\n spacing: 'gap-2',\n borderWidth: 'border-2',\n dotSize: 'w-3.5 h-3.5',\n labelHeight: 'h-7',\n },\n extraLarge: {\n radio: 'w-8 h-8',\n textSize: 'xl' as const,\n spacing: 'gap-3',\n borderWidth: 'border-2',\n dotSize: 'w-4 h-4',\n labelHeight: 'h-8',\n },\n} as const;\n\n/**\n * Focused state maintains the same sizes as default state\n * Only adds wrapper styling, does not change radio/dot sizes\n */\n\n/**\n * Base radio styling classes using design system colors\n */\nconst BASE_RADIO_CLASSES =\n 'rounded-full border cursor-pointer transition-all duration-200 flex items-center justify-center focus:outline-none';\n\n/**\n * State-based styling classes using design system colors from styles.css\n */\nconst STATE_CLASSES = {\n default: {\n unchecked: 'border-border-400 bg-background hover:border-border-500',\n checked: 'border-primary-950 bg-background hover:border-primary-800',\n },\n hovered: {\n unchecked: 'border-border-500 bg-background',\n checked: 'border-info-700 bg-background',\n },\n focused: {\n unchecked: 'border-border-400 bg-background',\n checked: 'border-primary-950 bg-background',\n },\n invalid: {\n unchecked: 'border-border-400 bg-background',\n checked: 'border-primary-950 bg-background',\n },\n disabled: {\n unchecked: 'border-border-400 bg-background cursor-not-allowed',\n checked: 'border-primary-950 bg-background cursor-not-allowed',\n },\n} as const;\n\n/**\n * Dot styling classes for the inner dot when checked\n */\nconst DOT_CLASSES = {\n default: 'bg-primary-950',\n hovered: 'bg-info-700',\n focused: 'bg-primary-950',\n invalid: 'bg-primary-950',\n disabled: 'bg-primary-950',\n} as const;\n\n/**\n * Radio component props interface\n */\nexport type RadioProps = {\n /** Label text to display next to the radio */\n label?: ReactNode;\n /** Size variant of the radio */\n size?: RadioSize;\n /** Visual state of the radio */\n state?: RadioState;\n /** Error message to display */\n errorMessage?: string;\n /** Helper text to display */\n helperText?: string;\n /** Additional CSS classes */\n className?: string;\n /** Label CSS classes */\n labelClassName?: string;\n /** Radio group name */\n name?: string;\n /** Radio value */\n value?: string;\n /** Default checked state for uncontrolled radios */\n defaultChecked?: boolean;\n} & Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'size' | 'type' | 'defaultChecked'\n>;\n\n/**\n * Radio component for Analytica Ensino platforms\n *\n * A radio button component with essential states, sizes and themes.\n * Uses the Analytica Ensino Design System colors from styles.css with automatic\n * light/dark mode support. Includes Text component integration for consistent typography.\n *\n * @example\n * ```tsx\n * // Basic radio\n * <Radio name=\"option\" value=\"1\" label=\"Option 1\" />\n *\n * // Small size\n * <Radio size=\"small\" name=\"option\" value=\"2\" label=\"Small option\" />\n *\n * // Invalid state\n * <Radio state=\"invalid\" name=\"option\" value=\"3\" label=\"Required field\" />\n *\n * // Disabled state\n * <Radio disabled name=\"option\" value=\"4\" label=\"Disabled option\" />\n *\n * // Default checked (uncontrolled)\n * <Radio defaultChecked name=\"option\" value=\"5\" label=\"Initially checked\" />\n * ```\n */\nconst Radio = forwardRef<HTMLInputElement, RadioProps>(\n (\n {\n label,\n size = 'medium',\n state = 'default',\n errorMessage,\n helperText,\n className = '',\n labelClassName = '',\n checked: checkedProp,\n defaultChecked = false,\n disabled,\n id,\n name,\n value,\n onChange,\n ...props\n },\n ref\n ) => {\n // Generate unique ID if not provided\n const generatedId = useId();\n const inputId = id ?? `radio-${generatedId}`;\n const inputRef = useRef<HTMLInputElement>(null);\n\n // Handle controlled vs uncontrolled behavior\n const [internalChecked, setInternalChecked] = useState(defaultChecked);\n const isControlled = checkedProp !== undefined;\n const checked = isControlled ? checkedProp : internalChecked;\n\n // Handle change events\n const handleChange = (event: ChangeEvent<HTMLInputElement>) => {\n const newChecked = event.target.checked;\n\n if (!isControlled) {\n setInternalChecked(newChecked);\n }\n\n // Prevent automatic scroll when input changes\n if (event.target) {\n event.target.blur();\n }\n\n onChange?.(event);\n };\n\n // Determine current state based on props\n const currentState = disabled ? 'disabled' : state;\n\n // Get size classes\n const sizeClasses = SIZE_CLASSES[size];\n\n // Focused state maintains original sizes, only adds wrapper\n const actualRadioSize = sizeClasses.radio;\n const actualDotSize = sizeClasses.dotSize;\n\n // Determine radio visual variant\n const radioVariant = checked ? 'checked' : 'unchecked';\n\n // Get styling classes\n const stylingClasses = STATE_CLASSES[currentState][radioVariant];\n\n // Border width logic - consistent across all states and sizes\n const getBorderWidth = () => {\n if (currentState === 'focused') {\n return 'border-2';\n }\n return sizeClasses.borderWidth;\n };\n\n const borderWidthClass = getBorderWidth();\n\n // Get final radio classes\n const radioClasses = cn(\n BASE_RADIO_CLASSES,\n actualRadioSize,\n borderWidthClass,\n stylingClasses,\n className\n );\n\n // Get dot classes\n const dotClasses = cn(\n actualDotSize,\n 'rounded-full',\n DOT_CLASSES[currentState],\n 'transition-all duration-200'\n );\n\n // Determine if wrapper is needed only for focused or invalid states\n const isWrapperNeeded =\n currentState === 'focused' || currentState === 'invalid';\n const wrapperBorderColor =\n currentState === 'focused'\n ? 'border-indicator-info'\n : 'border-indicator-error';\n\n // Determine text color based on state and checked status\n const getTextColor = () => {\n if (currentState === 'disabled') {\n return checked ? 'text-text-900' : 'text-text-600';\n }\n\n if (currentState === 'focused') {\n return 'text-text-900';\n }\n\n return checked ? 'text-text-900' : 'text-text-600';\n };\n\n // Determine cursor class based on disabled state\n const getCursorClass = () => {\n return currentState === 'disabled'\n ? 'cursor-not-allowed'\n : 'cursor-pointer';\n };\n\n return (\n <div className=\"flex flex-col\">\n <div\n className={cn(\n 'flex flex-row items-center',\n isWrapperNeeded\n ? cn('p-1 border-2', wrapperBorderColor, 'rounded-lg gap-1.5')\n : sizeClasses.spacing,\n disabled ? 'opacity-40' : ''\n )}\n >\n {/* Hidden native input for accessibility and form submission */}\n <input\n ref={(node) => {\n inputRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) ref.current = node;\n }}\n type=\"radio\"\n id={inputId}\n checked={checked}\n disabled={disabled}\n name={name}\n value={value}\n onChange={handleChange}\n className=\"sr-only\"\n style={{\n position: 'absolute',\n left: '-9999px',\n visibility: 'hidden',\n }}\n {...props}\n />\n\n {/* Custom styled radio */}\n <button\n type=\"button\"\n className={radioClasses}\n disabled={disabled}\n aria-pressed={checked}\n onClick={(e) => {\n // Prevent scroll when radio is clicked\n e.preventDefault();\n if (!disabled) {\n // Simulate click on hidden input\n if (inputRef.current) {\n inputRef.current.click();\n // Remove focus to prevent scroll behavior\n inputRef.current.blur();\n }\n }\n }}\n onKeyDown={(e) => {\n // Handle keyboard activation (Enter or Space)\n if ((e.key === 'Enter' || e.key === ' ') && !disabled) {\n e.preventDefault();\n if (inputRef.current) {\n inputRef.current.click();\n inputRef.current.blur();\n }\n }\n }}\n >\n {/* Show dot when checked */}\n {checked && <div className={dotClasses} />}\n </button>\n\n {/* Label text */}\n {label && (\n <div\n className={cn(\n 'flex flex-row items-center',\n sizeClasses.labelHeight,\n 'flex-1 min-w-0'\n )}\n >\n <Text\n as=\"label\"\n htmlFor={inputId}\n size={sizeClasses.textSize}\n weight=\"normal\"\n className={cn(\n getCursorClass(),\n 'select-none leading-normal flex items-center font-roboto truncate',\n labelClassName\n )}\n color={getTextColor()}\n >\n {label}\n </Text>\n </div>\n )}\n </div>\n\n {/* Error message */}\n {errorMessage && (\n <Text\n size=\"sm\"\n weight=\"normal\"\n className=\"mt-1.5 truncate\"\n color=\"text-error-600\"\n >\n {errorMessage}\n </Text>\n )}\n\n {/* Helper text */}\n {helperText && !errorMessage && (\n <Text\n size=\"sm\"\n weight=\"normal\"\n className=\"mt-1.5 truncate\"\n color=\"text-text-500\"\n >\n {helperText}\n </Text>\n )}\n </div>\n );\n }\n);\n\nRadio.displayName = 'Radio';\n\n/**\n * RadioGroup store interface\n */\ninterface RadioGroupStore {\n value: string;\n setValue: (value: string) => void;\n onValueChange?: (value: string) => void;\n disabled: boolean;\n name: string;\n}\n\ntype RadioGroupStoreApi = StoreApi<RadioGroupStore>;\n\n/**\n * Create a new RadioGroup store\n */\nconst createRadioGroupStore = (\n name: string,\n defaultValue: string,\n disabled: boolean,\n onValueChange?: (value: string) => void\n): RadioGroupStoreApi =>\n create<RadioGroupStore>((set, get) => ({\n value: defaultValue,\n setValue: (value) => {\n if (!get().disabled) {\n set({ value });\n get().onValueChange?.(value);\n }\n },\n onValueChange,\n disabled,\n name,\n }));\n\n/**\n * Hook to access RadioGroup store\n */\nexport const useRadioGroupStore = (externalStore?: RadioGroupStoreApi) => {\n if (!externalStore) {\n throw new Error('RadioGroupItem must be used within a RadioGroup');\n }\n return externalStore;\n};\n\n/**\n * Inject store into RadioGroupItem children\n */\nconst injectStore = (\n children: ReactNode,\n store: RadioGroupStoreApi\n): ReactNode =>\n Children.map(children, (child) => {\n if (!isValidElement(child)) return child;\n /* eslint-disable-next-line @typescript-eslint/no-explicit-any */\n const typedChild = child as ReactElement<any>;\n const shouldInject = typedChild.type === RadioGroupItem;\n return cloneElement(typedChild, {\n ...(shouldInject ? { store } : {}),\n ...(typedChild.props.children\n ? { children: injectStore(typedChild.props.children, store) }\n : {}),\n });\n });\n\n/**\n * RadioGroup component props interface\n */\nexport type RadioGroupProps = {\n /** Current selected value */\n value?: string;\n /** Default selected value for uncontrolled usage */\n defaultValue?: string;\n /** Callback when selection changes */\n onValueChange?: (value: string) => void;\n /** Group name for all radios */\n name?: string;\n /** Disabled state for the entire group */\n disabled?: boolean;\n /** Additional CSS classes */\n className?: string;\n /** Children components */\n children: ReactNode;\n} & Omit<HTMLAttributes<HTMLDivElement>, 'onChange' | 'defaultValue'>;\n\n/**\n * RadioGroup component for flexible radio group composition\n *\n * Uses Zustand for state management with automatic store injection.\n * Allows complete control over layout and styling by composing with RadioGroupItem.\n *\n * @example\n * ```tsx\n * <RadioGroup defaultValue=\"option1\" onValueChange={setValue}>\n * <div className=\"flex items-center gap-3\">\n * <RadioGroupItem value=\"option1\" id=\"r1\" />\n * <label htmlFor=\"r1\">Option 1</label>\n * </div>\n * <div className=\"flex items-center gap-3\">\n * <RadioGroupItem value=\"option2\" id=\"r2\" />\n * <label htmlFor=\"r2\">Option 2</label>\n * </div>\n * </RadioGroup>\n * ```\n */\nconst RadioGroup = forwardRef<HTMLDivElement, RadioGroupProps>(\n (\n {\n value: propValue,\n defaultValue = '',\n onValueChange,\n name: propName,\n disabled = false,\n className = '',\n children,\n ...props\n },\n ref\n ) => {\n // Generate unique name if not provided\n const generatedId = useId();\n const name = propName || `radio-group-${generatedId}`;\n\n // Create store reference\n const storeRef = useRef<RadioGroupStoreApi>(null);\n storeRef.current ??= createRadioGroupStore(\n name,\n defaultValue,\n disabled,\n onValueChange\n );\n const store = storeRef.current;\n\n // Get store actions\n const { setValue } = useStore(store, (s) => s);\n\n // Call onValueChange with initial value\n useEffect(() => {\n const currentValue = store.getState().value;\n if (currentValue && onValueChange) {\n onValueChange(currentValue);\n }\n }, []); // Empty dependency array for mount only\n\n // Handle controlled value changes\n useEffect(() => {\n if (propValue !== undefined) {\n setValue(propValue);\n }\n }, [propValue, setValue]);\n\n // Update disabled state\n useEffect(() => {\n store.setState({ disabled });\n }, [disabled, store]);\n\n return (\n <div\n ref={ref}\n className={className}\n role=\"radiogroup\"\n aria-label={name}\n {...props}\n >\n {injectStore(children, store)}\n </div>\n );\n }\n);\n\nRadioGroup.displayName = 'RadioGroup';\n\n/**\n * RadioGroupItem component props interface\n */\nexport type RadioGroupItemProps = {\n /** Value for this radio item */\n value: string;\n /** Store reference (automatically injected by RadioGroup) */\n store?: RadioGroupStoreApi;\n /** Disabled state for this specific item */\n disabled?: boolean;\n /** Size variant */\n size?: RadioSize;\n /** Visual state */\n state?: RadioState;\n /** Additional CSS classes */\n className?: string;\n} & Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'type' | 'name' | 'value' | 'checked' | 'onChange' | 'size'\n>;\n\n/**\n * RadioGroupItem component for use within RadioGroup\n *\n * A radio button without label that works within RadioGroup context.\n * Provides just the radio input for maximum flexibility in composition.\n *\n * @example\n * ```tsx\n * <RadioGroup defaultValue=\"option1\">\n * <div className=\"flex items-center gap-3\">\n * <RadioGroupItem value=\"option1\" id=\"r1\" />\n * <label htmlFor=\"r1\">Option 1</label>\n * </div>\n * </RadioGroup>\n * ```\n */\nconst RadioGroupItem = forwardRef<HTMLInputElement, RadioGroupItemProps>(\n (\n {\n value,\n store: externalStore,\n disabled: itemDisabled,\n size = 'medium',\n state = 'default',\n className = '',\n id,\n ...props\n },\n ref\n ) => {\n // Get store and state\n const store = useRadioGroupStore(externalStore);\n const {\n value: groupValue,\n setValue,\n disabled: groupDisabled,\n name,\n } = useStore(store);\n\n // Generate unique ID if not provided\n const generatedId = useId();\n const inputId = id ?? `radio-item-${generatedId}`;\n\n // Determine states\n const isChecked = groupValue === value;\n const isDisabled = groupDisabled || itemDisabled;\n const currentState = isDisabled ? 'disabled' : state;\n\n // Use standard Radio component for consistency and simplicity\n return (\n <Radio\n ref={ref}\n id={inputId}\n name={name}\n value={value}\n checked={isChecked}\n disabled={isDisabled}\n size={size}\n state={currentState}\n className={className}\n onChange={(e) => {\n if (e.target.checked && !isDisabled) {\n setValue(value);\n }\n }}\n {...props}\n />\n );\n }\n);\n\nRadioGroupItem.displayName = 'RadioGroupItem';\n\nexport default Radio;\nexport { RadioGroup, RadioGroupItem };\n","import { ComponentPropsWithoutRef, ElementType, ReactNode } from 'react';\nimport { cn } from '../../utils/utils';\n\n/**\n * Base text component props\n */\ntype BaseTextProps = {\n /** Content to be displayed */\n children?: ReactNode;\n /** Text size variant */\n size?:\n | '2xs'\n | 'xs'\n | 'sm'\n | 'md'\n | 'lg'\n | 'xl'\n | '2xl'\n | '3xl'\n | '4xl'\n | '5xl'\n | '6xl';\n /** Font weight variant */\n weight?:\n | 'hairline'\n | 'light'\n | 'normal'\n | 'medium'\n | 'semibold'\n | 'bold'\n | 'extrabold'\n | 'black';\n /** Color variant - white for light backgrounds, black for dark backgrounds */\n color?: string;\n /** Additional CSS classes to apply */\n className?: string;\n};\n\n/**\n * Polymorphic text component props that ensures type safety based on the 'as' prop\n */\ntype TextProps<T extends ElementType = 'p'> = BaseTextProps & {\n /** HTML tag to render */\n as?: T;\n} & Omit<ComponentPropsWithoutRef<T>, keyof BaseTextProps>;\n\n/**\n * Text component for Analytica Ensino platforms\n *\n * A flexible polymorphic text component with multiple sizes, weights, and colors.\n * Automatically adapts to dark and light themes with full type safety.\n *\n * @param children - The content to display\n * @param size - The text size variant (2xs, xs, sm, md, lg, xl, 2xl, 3xl, 4xl, 5xl, 6xl)\n * @param weight - The font weight variant (hairline, light, normal, medium, semibold, bold, extrabold, black)\n * @param color - The color variant - adapts to theme\n * @param as - The HTML tag to render - determines allowed attributes via TypeScript\n * @param className - Additional CSS classes\n * @param props - HTML attributes valid for the chosen tag only\n * @returns A styled text element with type-safe attributes\n *\n * @example\n * ```tsx\n * <Text size=\"lg\" weight=\"bold\" color=\"text-info-800\">\n * This is a large, bold text\n * </Text>\n *\n * <Text as=\"a\" href=\"/link\" target=\"_blank\">\n * Link with type-safe anchor attributes\n * </Text>\n *\n * <Text as=\"button\" onClick={handleClick} disabled>\n * Button with type-safe button attributes\n * </Text>\n * ```\n */\nconst Text = <T extends ElementType = 'p'>({\n children,\n size = 'md',\n weight = 'normal',\n color = 'text-text-950',\n as,\n className = '',\n ...props\n}: TextProps<T>) => {\n let sizeClasses = '';\n let weightClasses = '';\n\n // Text size classes mapping\n const sizeClassMap = {\n '2xs': 'text-2xs',\n xs: 'text-xs',\n sm: 'text-sm',\n md: 'text-md',\n lg: 'text-lg',\n xl: 'text-xl',\n '2xl': 'text-2xl',\n '3xl': 'text-3xl',\n '4xl': 'text-4xl',\n '5xl': 'text-5xl',\n '6xl': 'text-6xl',\n } as const;\n\n sizeClasses = sizeClassMap[size] ?? sizeClassMap.md;\n\n // Font weight classes mapping\n const weightClassMap = {\n hairline: 'font-hairline',\n light: 'font-light',\n normal: 'font-normal',\n medium: 'font-medium',\n semibold: 'font-semibold',\n bold: 'font-bold',\n extrabold: 'font-extrabold',\n black: 'font-black',\n } as const;\n\n weightClasses = weightClassMap[weight] ?? weightClassMap.normal;\n\n const baseClasses = 'font-primary';\n const Component = as ?? ('p' as ElementType);\n\n return (\n <Component\n className={cn(baseClasses, sizeClasses, weightClasses, color, className)}\n {...props}\n >\n {children}\n </Component>\n );\n};\n\nexport default Text;\n","import { ButtonHTMLAttributes, ReactNode } from 'react';\nimport { cn } from '../../utils/utils';\n\n/**\n * Lookup table for variant and action class combinations\n */\nconst VARIANT_ACTION_CLASSES = {\n solid: {\n primary:\n 'bg-primary-950 text-text border border-primary-950 hover:bg-primary-800 hover:border-primary-800 focus-visible:outline-none focus-visible:bg-primary-950 focus-visible:ring-2 focus-visible:ring-offset-0 focus-visible:ring-indicator-info active:bg-primary-700 active:border-primary-700 disabled:bg-primary-500 disabled:border-primary-500 disabled:opacity-40 disabled:cursor-not-allowed',\n positive:\n 'bg-success-500 text-text border border-success-500 hover:bg-success-600 hover:border-success-600 focus-visible:outline-none focus-visible:bg-success-500 focus-visible:ring-2 focus-visible:ring-offset-0 focus-visible:ring-indicator-info active:bg-success-700 active:border-success-700 disabled:bg-success-500 disabled:border-success-500 disabled:opacity-40 disabled:cursor-not-allowed',\n negative:\n 'bg-error-500 text-text border border-error-500 hover:bg-error-600 hover:border-error-600 focus-visible:outline-none focus-visible:bg-error-500 focus-visible:ring-2 focus-visible:ring-offset-0 focus-visible:ring-indicator-info active:bg-error-700 active:border-error-700 disabled:bg-error-500 disabled:border-error-500 disabled:opacity-40 disabled:cursor-not-allowed',\n },\n outline: {\n primary:\n 'bg-transparent text-primary-950 border border-primary-950 hover:bg-background-50 hover:text-primary-400 hover:border-primary-400 focus-visible:border-0 focus-visible:outline-none focus-visible:text-primary-600 focus-visible:ring-2 focus-visible:ring-offset-0 focus-visible:ring-indicator-info active:text-primary-700 active:border-primary-700 disabled:opacity-40 disabled:cursor-not-allowed',\n positive:\n 'bg-transparent text-success-500 border border-success-300 hover:bg-background-50 hover:text-success-400 hover:border-success-400 focus-visible:border-0 focus-visible:outline-none focus-visible:text-success-600 focus-visible:ring-2 focus-visible:ring-offset-0 focus-visible:ring-indicator-info active:text-success-700 active:border-success-700 disabled:opacity-40 disabled:cursor-not-allowed',\n negative:\n 'bg-transparent text-error-500 border border-error-300 hover:bg-background-50 hover:text-error-400 hover:border-error-400 focus-visible:border-0 focus-visible:outline-none focus-visible:text-error-600 focus-visible:ring-2 focus-visible:ring-offset-0 focus-visible:ring-indicator-info active:text-error-700 active:border-error-700 disabled:opacity-40 disabled:cursor-not-allowed',\n },\n link: {\n primary:\n 'bg-transparent text-primary-950 hover:text-primary-400 focus-visible:outline-none focus-visible:text-primary-600 focus-visible:ring-2 focus-visible:ring-offset-0 focus-visible:ring-indicator-info active:text-primary-700 disabled:opacity-40 disabled:cursor-not-allowed',\n positive:\n 'bg-transparent text-success-500 hover:text-success-400 focus-visible:outline-none focus-visible:text-success-600 focus-visible:ring-2 focus-visible:ring-offset-0 focus-visible:ring-indicator-info active:text-success-700 disabled:opacity-40 disabled:cursor-not-allowed',\n negative:\n 'bg-transparent text-error-500 hover:text-error-400 focus-visible:outline-none focus-visible:text-error-600 focus-visible:ring-2 focus-visible:ring-offset-0 focus-visible:ring-indicator-info active:text-error-700 disabled:opacity-40 disabled:cursor-not-allowed',\n },\n} as const;\n\n/**\n * Lookup table for size classes\n */\nconst SIZE_CLASSES = {\n 'extra-small': 'text-xs px-3.5 py-2',\n small: 'text-sm px-4 py-2.5',\n medium: 'text-md px-5 py-2.5',\n large: 'text-lg px-6 py-3',\n 'extra-large': 'text-lg px-7 py-3.5',\n} as const;\n\n/**\n * Button component props interface\n */\ntype ButtonProps = {\n /** Content to be displayed inside the button */\n children: ReactNode;\n /** Ícone à esquerda do texto */\n iconLeft?: ReactNode;\n /** Ícone à direita do texto */\n iconRight?: ReactNode;\n /** Size of the button */\n size?: 'extra-small' | 'small' | 'medium' | 'large' | 'extra-large';\n /** Visual variant of the button */\n variant?: 'solid' | 'outline' | 'link';\n /** Action type of the button */\n action?: 'primary' | 'positive' | 'negative';\n /** Additional CSS classes to apply */\n className?: string;\n} & ButtonHTMLAttributes<HTMLButtonElement>;\n\n/**\n * Button component for Analytica Ensino platforms\n *\n * A flexible button component with multiple variants, sizes and actions.\n *\n * @param children - The content to display inside the button\n * @param size - The size variant (extra-small, small, medium, large, extra-large)\n * @param variant - The visual style variant (solid, outline, link)\n * @param action - The action type (primary, positive, negative)\n * @param className - Additional CSS classes\n * @param props - All other standard button HTML attributes\n * @returns A styled button element\n *\n * @example\n * ```tsx\n * <Button variant=\"solid\" action=\"primary\" size=\"medium\" onClick={() => console.log('clicked')}>\n * Click me\n * </Button>\n * ```\n */\nconst Button = ({\n children,\n iconLeft,\n iconRight,\n size = 'medium',\n variant = 'solid',\n action = 'primary',\n className = '',\n disabled,\n type = 'button',\n ...props\n}: ButtonProps) => {\n // Get classes from lookup tables\n const sizeClasses = SIZE_CLASSES[size];\n const variantClasses = VARIANT_ACTION_CLASSES[variant][action];\n\n const baseClasses =\n 'inline-flex items-center justify-center rounded-full cursor-pointer font-medium';\n\n return (\n <button\n className={cn(baseClasses, variantClasses, sizeClasses, className)}\n disabled={disabled}\n type={type}\n {...props}\n >\n {iconLeft && <span className=\"mr-2 flex items-center\">{iconLeft}</span>}\n {children}\n {iconRight && <span className=\"ml-2 flex items-center\">{iconRight}</span>}\n </button>\n );\n};\n\nexport default Button;\n","import { ButtonHTMLAttributes, ReactNode, forwardRef } from 'react';\nimport { cn } from '../../utils/utils';\n\n/**\n * IconButton component props interface\n */\nexport type IconButtonProps = {\n /** Ícone a ser exibido no botão */\n icon: ReactNode;\n /** Tamanho do botão */\n size?: 'sm' | 'md';\n /** Estado de seleção/ativo do botão - permanece ativo até ser clicado novamente ou outro botão ser ativado */\n active?: boolean;\n /** Additional CSS classes to apply */\n className?: string;\n} & ButtonHTMLAttributes<HTMLButtonElement>;\n\n/**\n * IconButton component for Analytica Ensino platforms\n *\n * Um botão compacto apenas com ícone, ideal para menus dropdown,\n * barras de ferramentas e ações secundárias.\n * Oferece dois tamanhos com estilo consistente.\n * Estado ativo permanece até ser clicado novamente ou outro botão ser ativado.\n * Suporta forwardRef para acesso programático ao elemento DOM.\n *\n * @param icon - O ícone a ser exibido no botão\n * @param size - Tamanho do botão (sm, md)\n * @param active - Estado ativo/selecionado do botão\n * @param className - Classes CSS adicionais\n * @param props - Todos os outros atributos HTML padrão de button\n * @returns Um elemento button compacto estilizado apenas com ícone\n *\n * @example\n * ```tsx\n * <IconButton\n * icon={<MoreVerticalIcon />}\n * size=\"sm\"\n * onClick={() => openMenu()}\n * />\n * ```\n *\n * @example\n * ```tsx\n * // Botão ativo em uma barra de ferramentas - permanece ativo até outro clique\n * <IconButton\n * icon={<BoldIcon />}\n * active={isBold}\n * onClick={toggleBold}\n * />\n * ```\n *\n * @example\n * ```tsx\n * // Usando ref para controle programático\n * const buttonRef = useRef<HTMLButtonElement>(null);\n *\n * <IconButton\n * ref={buttonRef}\n * icon={<EditIcon />}\n * size=\"md\"\n * onClick={() => startEditing()}\n * />\n * ```\n */\nconst IconButton = forwardRef<HTMLButtonElement, IconButtonProps>(\n (\n { icon, size = 'md', active = false, className = '', disabled, ...props },\n ref\n ) => {\n // Classes base para todos os estados\n const baseClasses = [\n 'inline-flex',\n 'items-center',\n 'justify-center',\n 'rounded-lg',\n 'font-medium',\n 'bg-transparent',\n 'text-text-950',\n 'cursor-pointer',\n 'hover:bg-primary-600',\n 'hover:text-text',\n 'focus-visible:outline-none',\n 'focus-visible:ring-2',\n 'focus-visible:ring-offset-0',\n 'focus-visible:ring-indicator-info',\n 'disabled:opacity-50',\n 'disabled:cursor-not-allowed',\n 'disabled:pointer-events-none',\n ];\n\n // Classes de tamanho\n const sizeClasses = {\n sm: ['w-6', 'h-6', 'text-sm'],\n md: ['w-10', 'h-10', 'text-base'],\n };\n\n // Classes de estado ativo\n const activeClasses = active\n ? ['!bg-primary-50', '!text-primary-950', 'hover:!bg-primary-100']\n : [];\n\n const allClasses = [\n ...baseClasses,\n ...sizeClasses[size],\n ...activeClasses,\n ].join(' ');\n\n // Garantir acessibilidade com aria-label padrão\n const ariaLabel = props['aria-label'] ?? 'Botão de ação';\n\n return (\n <button\n ref={ref}\n type=\"button\"\n className={cn(allClasses, className)}\n disabled={disabled}\n aria-pressed={active}\n aria-label={ariaLabel}\n {...props}\n >\n <span className=\"flex items-center justify-center\">{icon}</span>\n </button>\n );\n }\n);\n\nIconButton.displayName = 'IconButton';\n\nexport default IconButton;\n","import { create } from 'zustand';\nimport { devtools } from 'zustand/middleware';\n\nexport enum QUESTION_DIFFICULTY {\n FACIL = 'FACIL',\n MEDIO = 'MEDIO',\n DIFICIL = 'DIFICIL',\n}\n\nexport enum QUESTION_TYPE {\n ALTERNATIVA = 'ALTERNATIVA',\n DISSERTATIVA = 'DISSERTATIVA',\n MULTIPLA_CHOICE = 'MULTIPLA_CHOICE',\n VERDADEIRO_FALSO = 'VERDADEIRO_FALSO',\n LIGAR_PONTOS = 'LIGAR_PONTOS',\n PREENCHER = 'PREENCHER',\n IMAGEM = 'IMAGEM',\n}\n\nexport enum QUESTION_STATUS {\n PENDENTE_AVALIACAO = 'PENDENTE_AVALIACAO',\n RESPOSTA_CORRETA = 'RESPOSTA_CORRETA',\n RESPOSTA_INCORRETA = 'RESPOSTA_INCORRETA',\n NAO_RESPONDIDO = 'NAO_RESPONDIDO',\n}\n\nexport enum ANSWER_STATUS {\n RESPOSTA_CORRETA = 'RESPOSTA_CORRETA',\n RESPOSTA_INCORRETA = 'RESPOSTA_INCORRETA',\n PENDENTE_AVALIACAO = 'PENDENTE_AVALIACAO',\n}\n\nexport interface QuestionResult {\n answers: {\n id: string;\n questionId: string;\n answer: string | null;\n selectedOptions: {\n optionId: string;\n }[];\n answerStatus: ANSWER_STATUS;\n statement: string;\n questionType: QUESTION_TYPE;\n difficultyLevel: QUESTION_DIFFICULTY;\n solutionExplanation: string | null;\n correctOption: string;\n createdAt: string;\n updatedAt: string;\n options?: {\n id: string;\n option: string;\n isCorrect: boolean;\n }[];\n knowledgeMatrix: {\n areaKnowledge: {\n id: string;\n name: string;\n } | null;\n subject: {\n id: string;\n name: string;\n } | null;\n topic: {\n id: string;\n name: string;\n } | null;\n subtopic: {\n id: string;\n name: string;\n } | null;\n content: {\n id: string;\n name: string;\n } | null;\n }[];\n teacherFeedback: string | null;\n attachment: string | null;\n score: number | null;\n gradedAt: string | null;\n gradedBy: string | null;\n }[];\n statistics: {\n totalAnswered: number;\n correctAnswers: number;\n incorrectAnswers: number;\n pendingAnswers: number;\n score: number;\n };\n}\n\nexport interface Question {\n id: string;\n statement: string;\n questionType: QUESTION_TYPE;\n difficultyLevel: QUESTION_DIFFICULTY;\n description: string;\n examBoard: string | null;\n examYear: string | null;\n solutionExplanation: string | null;\n answer: null;\n answerStatus: ANSWER_STATUS;\n options: {\n id: string;\n option: string;\n }[];\n knowledgeMatrix: {\n areaKnowledge: {\n id: string;\n name: string;\n };\n subject: {\n id: string;\n name: string;\n };\n topic: {\n id: string;\n name: string;\n };\n subtopic: {\n id: string;\n name: string;\n };\n content: {\n id: string;\n name: string;\n };\n }[];\n correctOptionIds?: string[];\n}\n\nexport interface Simulated {\n id: string;\n title: string;\n type: string;\n subtype: string;\n difficulty: string | null;\n notification: string | null;\n status: string;\n startDate: string | null;\n finalDate: string | null;\n canRetry: boolean;\n createdAt: string | null;\n updatedAt: string | null;\n questions: Question[];\n}\n\nexport interface Activity {\n id: string;\n title: string;\n questions: Question[];\n}\n\nexport interface Lesson {\n id: string;\n title: string;\n questions: Question[];\n}\n\nexport interface UserAnswerItem {\n questionId: string;\n activityId: string;\n userId: string;\n answer: string | null;\n optionId: string | null;\n questionType: QUESTION_TYPE;\n answerStatus: ANSWER_STATUS;\n}\n\nexport interface QuizState {\n // Data\n bySimulated?: Simulated;\n byActivity?: Activity;\n byQuestionary?: Lesson;\n\n // UI State\n currentQuestionIndex: number;\n selectedAnswers: Record<string, string>;\n userAnswers: UserAnswerItem[];\n timeElapsed: number;\n isStarted: boolean;\n isFinished: boolean;\n userId: string;\n variant: 'result' | 'default';\n // Actions\n setBySimulated: (simulated: Simulated) => void;\n setByActivity: (activity: Activity) => void;\n setByQuestionary: (lesson: Lesson) => void;\n setQuestionResult: (questionResult: QuestionResult) => void;\n setUserId: (userId: string) => void;\n setUserAnswers: (userAnswers: UserAnswerItem[]) => void;\n setVariant: (variant: 'result' | 'default') => void;\n // Quiz Navigation\n goToNextQuestion: () => void;\n goToPreviousQuestion: () => void;\n goToQuestion: (index: number) => void;\n getActiveQuiz: () => {\n quiz: Simulated | Activity | Lesson;\n type: 'bySimulated' | 'byActivity' | 'byQuestionary';\n } | null;\n\n // Quiz Actions\n selectAnswer: (questionId: string, answerId: string) => void;\n selectMultipleAnswer: (questionId: string, answerIds: string[]) => void;\n selectDissertativeAnswer: (questionId: string, answer: 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: () => UserAnswerItem | undefined;\n getAllCurrentAnswer: () => UserAnswerItem[] | undefined;\n getQuizTitle: () => string;\n formatTime: (seconds: number) => string;\n getUserAnswers: () => UserAnswerItem[];\n getUnansweredQuestionsFromUserAnswers: () => number[];\n getQuestionsGroupedBySubject: () => { [key: string]: Question[] };\n getUserId: () => string;\n setCurrentQuestion: (question: Question) => void;\n\n // New methods for userAnswers\n getQuestionIndex: (questionId: string) => number;\n getUserAnswerByQuestionId: (questionId: string) => UserAnswerItem | null;\n isQuestionAnsweredByUserAnswers: (questionId: string) => boolean;\n getQuestionStatusFromUserAnswers: (\n questionId: string\n ) => 'answered' | 'unanswered' | 'skipped';\n getUserAnswersForActivity: () => UserAnswerItem[];\n // Answer status management\n setAnswerStatus: (questionId: string, status: ANSWER_STATUS) => void;\n getAnswerStatus: (questionId: string) => ANSWER_STATUS | null;\n\n // Question Result\n questionsResult: QuestionResult | null;\n currentQuestionResult: QuestionResult['answers'] | null;\n setQuestionsResult: (questionsResult: QuestionResult) => void;\n setCurrentQuestionResult: (\n currentQuestionResult: QuestionResult['answers']\n ) => void;\n getQuestionResultByQuestionId: (\n questionId: string\n ) => QuestionResult['answers'][number] | null;\n getQuestionResultStatistics: () => QuestionResult['statistics'] | null;\n getQuestionResult: () => QuestionResult | null;\n getCurrentQuestionResult: () => QuestionResult['answers'] | null;\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 (get().isFinished) {\n return;\n }\n\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 userAnswers: [],\n timeElapsed: 0,\n isStarted: false,\n isFinished: false,\n userId: '',\n variant: 'default',\n questionsResult: null,\n currentQuestionResult: null,\n // Setters\n setBySimulated: (simulated) => set({ bySimulated: simulated }),\n setByActivity: (activity) => set({ byActivity: activity }),\n setByQuestionary: (lesson) => set({ byQuestionary: lesson }),\n setUserId: (userId) => set({ userId }),\n setUserAnswers: (userAnswers) => set({ userAnswers }),\n getUserId: () => get().userId,\n setVariant: (variant) => set({ variant }),\n setQuestionResult: (questionsResult) => set({ questionsResult }),\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 getActiveQuiz: () => {\n const { bySimulated, byActivity, byQuestionary } = get();\n if (bySimulated)\n return { quiz: bySimulated, type: 'bySimulated' as const };\n if (byActivity)\n return { quiz: byActivity, type: 'byActivity' as const };\n if (byQuestionary)\n return { quiz: byQuestionary, type: 'byQuestionary' as const };\n return null;\n },\n\n selectAnswer: (questionId, answerId) => {\n const { getActiveQuiz, userAnswers } = get();\n const activeQuiz = getActiveQuiz();\n\n if (!activeQuiz) return;\n\n const activityId = activeQuiz.quiz.id;\n const userId = get().getUserId();\n\n if (!userId || userId === '') {\n console.warn('selectAnswer called before userId is set');\n return;\n }\n\n const question = activeQuiz.quiz.questions.find(\n (q) => q.id === questionId\n );\n if (!question) return;\n\n const existingAnswerIndex = userAnswers.findIndex(\n (answer) => answer.questionId === questionId\n );\n\n const newUserAnswer: UserAnswerItem = {\n questionId,\n activityId,\n userId,\n answer:\n question.questionType === QUESTION_TYPE.DISSERTATIVA\n ? answerId\n : null,\n optionId:\n question.questionType === QUESTION_TYPE.DISSERTATIVA\n ? null\n : answerId,\n questionType: question.questionType,\n answerStatus: ANSWER_STATUS.PENDENTE_AVALIACAO,\n };\n\n let updatedUserAnswers;\n if (existingAnswerIndex !== -1) {\n updatedUserAnswers = [...userAnswers];\n updatedUserAnswers[existingAnswerIndex] = newUserAnswer;\n } else {\n updatedUserAnswers = [...userAnswers, newUserAnswer];\n }\n\n set({\n userAnswers: updatedUserAnswers,\n });\n },\n\n selectMultipleAnswer: (questionId, answerIds) => {\n const { getActiveQuiz, userAnswers } = get();\n const activeQuiz = getActiveQuiz();\n\n if (!activeQuiz) return;\n\n const activityId = activeQuiz.quiz.id;\n const userId = get().getUserId();\n\n if (!userId || userId === '') {\n console.warn('selectMultipleAnswer called before userId is set');\n return;\n }\n\n const question = activeQuiz.quiz.questions.find(\n (q) => q.id === questionId\n );\n if (!question) return;\n\n // Remove all existing answers for this questionId\n const filteredUserAnswers = userAnswers.filter(\n (answer) => answer.questionId !== questionId\n );\n\n // Create new UserAnswerItem objects for each answerId\n const newUserAnswers: UserAnswerItem[] = answerIds.map(\n (answerId) => ({\n questionId,\n activityId,\n userId,\n answer: null, // selectMultipleAnswer is for non-dissertative questions\n optionId: answerId, // selectMultipleAnswer should only set optionId\n questionType: question.questionType,\n answerStatus: ANSWER_STATUS.PENDENTE_AVALIACAO,\n })\n );\n\n // Combine filtered answers with new answers\n const updatedUserAnswers = [\n ...filteredUserAnswers,\n ...newUserAnswers,\n ];\n\n set({\n userAnswers: updatedUserAnswers,\n });\n },\n\n selectDissertativeAnswer: (questionId, answer) => {\n const { getActiveQuiz, userAnswers } = get();\n const activeQuiz = getActiveQuiz();\n\n if (!activeQuiz) return;\n\n const activityId = activeQuiz.quiz.id;\n const userId = get().getUserId();\n\n if (!userId || userId === '') {\n console.warn(\n 'selectDissertativeAnswer called before userId is set'\n );\n return;\n }\n\n const question = activeQuiz.quiz.questions.find(\n (q) => q.id === questionId\n );\n if (\n !question ||\n question.questionType !== QUESTION_TYPE.DISSERTATIVA\n ) {\n console.warn(\n 'selectDissertativeAnswer called for non-dissertative question'\n );\n return;\n }\n\n const existingAnswerIndex = userAnswers.findIndex(\n (answerItem) => answerItem.questionId === questionId\n );\n\n const newUserAnswer: UserAnswerItem = {\n questionId,\n activityId,\n userId,\n answer: answer,\n optionId: null,\n questionType: QUESTION_TYPE.DISSERTATIVA,\n answerStatus: ANSWER_STATUS.PENDENTE_AVALIACAO,\n };\n\n let updatedUserAnswers;\n if (existingAnswerIndex !== -1) {\n updatedUserAnswers = [...userAnswers];\n updatedUserAnswers[existingAnswerIndex] = newUserAnswer;\n } else {\n updatedUserAnswers = [...userAnswers, newUserAnswer];\n }\n\n set({\n userAnswers: updatedUserAnswers,\n });\n },\n\n skipQuestion: () => {\n const { getCurrentQuestion, userAnswers, getActiveQuiz } = get();\n const currentQuestion = getCurrentQuestion();\n const activeQuiz = getActiveQuiz();\n\n if (!activeQuiz) return;\n\n if (currentQuestion) {\n const activityId = activeQuiz.quiz.id;\n const userId = get().getUserId();\n\n if (!userId || userId === '') {\n console.warn('skipQuestion called before userId is set');\n return;\n }\n\n const existingAnswerIndex = userAnswers.findIndex(\n (answer) => answer.questionId === currentQuestion.id\n );\n\n const newUserAnswer: UserAnswerItem = {\n questionId: currentQuestion.id,\n activityId,\n userId,\n answer: null,\n optionId: null,\n questionType: currentQuestion.questionType,\n answerStatus: ANSWER_STATUS.PENDENTE_AVALIACAO,\n };\n\n let updatedUserAnswers;\n if (existingAnswerIndex !== -1) {\n // Update existing answer\n updatedUserAnswers = [...userAnswers];\n updatedUserAnswers[existingAnswerIndex] = newUserAnswer;\n } else {\n // Add new answer\n updatedUserAnswers = [...userAnswers, newUserAnswer];\n }\n\n set({\n userAnswers: updatedUserAnswers,\n });\n }\n },\n\n addUserAnswer: (questionId, answerId) => {\n const { getActiveQuiz, userAnswers } = get();\n const activeQuiz = getActiveQuiz();\n\n if (!activeQuiz) return;\n\n // Add to userAnswers array with new structure\n const activityId = activeQuiz.quiz.id;\n const userId = get().getUserId();\n\n if (!userId || userId === '') {\n console.warn('addUserAnswer called before userId is set');\n return;\n }\n\n const question = activeQuiz.quiz.questions.find(\n (q) => q.id === questionId\n );\n if (!question) return;\n\n const existingAnswerIndex = userAnswers.findIndex(\n (answer) => answer.questionId === questionId\n );\n\n const newUserAnswer: UserAnswerItem = {\n questionId,\n activityId,\n userId,\n answer:\n question.questionType === QUESTION_TYPE.DISSERTATIVA\n ? answerId || null\n : null,\n optionId:\n question.questionType !== QUESTION_TYPE.DISSERTATIVA\n ? answerId || null\n : null,\n questionType: question.questionType,\n answerStatus: ANSWER_STATUS.PENDENTE_AVALIACAO,\n };\n\n if (existingAnswerIndex !== -1) {\n // Update existing answer\n const updatedUserAnswers = [...userAnswers];\n updatedUserAnswers[existingAnswerIndex] = newUserAnswer;\n set({ userAnswers: updatedUserAnswers });\n } else {\n // Add new answer\n set({ userAnswers: [...userAnswers, newUserAnswer] });\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 userAnswers: [],\n timeElapsed: 0,\n isStarted: false,\n isFinished: false,\n userId: '',\n variant: 'default',\n questionsResult: null,\n currentQuestionResult: null,\n });\n },\n\n // Timer\n updateTime: (time) => set({ timeElapsed: time }),\n startTimer,\n stopTimer,\n\n // Getters\n getCurrentQuestion: () => {\n const { currentQuestionIndex, getActiveQuiz } = get();\n const activeQuiz = getActiveQuiz();\n\n if (!activeQuiz) {\n return null;\n }\n\n return activeQuiz.quiz.questions[currentQuestionIndex];\n },\n\n getTotalQuestions: () => {\n const { getActiveQuiz } = get();\n const activeQuiz = getActiveQuiz();\n\n return activeQuiz?.quiz?.questions?.length || 0;\n },\n\n getAnsweredQuestions: () => {\n const { userAnswers } = get();\n return userAnswers.filter(\n (answer) => answer.optionId !== null || answer.answer !== null\n ).length;\n },\n\n getUnansweredQuestions: () => {\n const { getActiveQuiz, userAnswers } = get();\n const activeQuiz = getActiveQuiz();\n if (!activeQuiz) return [];\n\n const unansweredQuestions: number[] = [];\n\n activeQuiz.quiz.questions.forEach((question, index) => {\n const userAnswer = userAnswers.find(\n (answer) => answer.questionId === question.id\n );\n const isAnswered =\n userAnswer &&\n (userAnswer.optionId !== null || userAnswer.answer !== null);\n const isSkipped =\n userAnswer &&\n userAnswer.optionId === null &&\n userAnswer.answer === null;\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 { userAnswers } = get();\n return userAnswers.filter(\n (answer) => answer.optionId === null && answer.answer === null\n ).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 { userAnswers } = get();\n const userAnswer = userAnswers.find(\n (answer) => answer.questionId === questionId\n );\n return userAnswer\n ? userAnswer.optionId !== null || userAnswer.answer !== null\n : false;\n },\n\n isQuestionSkipped: (questionId) => {\n const { userAnswers } = get();\n const userAnswer = userAnswers.find(\n (answer) => answer.questionId === questionId\n );\n return userAnswer\n ? userAnswer.optionId === null && userAnswer.answer === null\n : false;\n },\n\n getCurrentAnswer: () => {\n const { getCurrentQuestion, userAnswers } = get();\n const currentQuestion = getCurrentQuestion();\n\n if (!currentQuestion) return undefined;\n\n const userAnswer = userAnswers.find(\n (answer) => answer.questionId === currentQuestion.id\n );\n\n // Retorna undefined se a resposta está vazia (não respondida)\n const hasAnswerContent = (ua?: UserAnswerItem | null) =>\n !!ua &&\n ((ua.optionId !== null && ua.optionId !== '') ||\n (ua.answer !== null && ua.answer !== ''));\n\n if (!hasAnswerContent(userAnswer)) {\n return undefined;\n }\n\n return userAnswer;\n },\n\n getAllCurrentAnswer: () => {\n const { getCurrentQuestion, userAnswers } = get();\n const currentQuestion = getCurrentQuestion();\n\n if (!currentQuestion) return undefined;\n\n const userAnswer = userAnswers.filter(\n (answer) => answer.questionId === currentQuestion.id\n );\n\n return userAnswer;\n },\n\n getQuizTitle: () => {\n const { getActiveQuiz } = get();\n const activeQuiz = getActiveQuiz();\n\n return activeQuiz?.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 { getActiveQuiz, userAnswers } = get();\n const activeQuiz = getActiveQuiz();\n if (!activeQuiz) return [];\n\n const unansweredQuestions: number[] = [];\n\n activeQuiz.quiz.questions.forEach((question, index) => {\n const userAnswer = userAnswers.find(\n (answer) => answer.questionId === question.id\n );\n const hasAnswer =\n userAnswer &&\n (userAnswer.optionId !== null || userAnswer.answer !== null);\n const isSkipped =\n userAnswer &&\n userAnswer.optionId === null &&\n userAnswer.answer === null;\n\n // Se não há resposta do usuário OU se a questão foi pulada\n if (!hasAnswer || 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 { getQuestionResult, getActiveQuiz, variant } = get();\n const questions =\n variant == 'result'\n ? getQuestionResult()?.answers\n : getActiveQuiz()?.quiz.questions;\n if (!questions) return {};\n const groupedQuestions: {\n [key: string]: (Question | QuestionResult['answers'][number])[];\n } = {};\n questions.forEach((question) => {\n const subjectId =\n question.knowledgeMatrix?.[0]?.subject?.id || '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 // New methods for userAnswers\n getUserAnswerByQuestionId: (questionId) => {\n const { userAnswers } = get();\n return (\n userAnswers.find((answer) => answer.questionId === questionId) ||\n null\n );\n },\n isQuestionAnsweredByUserAnswers: (questionId) => {\n const { userAnswers } = get();\n const answer = userAnswers.find(\n (answer) => answer.questionId === questionId\n );\n return answer\n ? answer.optionId !== null || answer.answer !== null\n : false;\n },\n getQuestionStatusFromUserAnswers: (questionId) => {\n const { userAnswers } = get();\n const answer = userAnswers.find(\n (answer) => answer.questionId === questionId\n );\n if (!answer) return 'unanswered';\n if (answer.optionId === null) return 'skipped';\n return 'answered';\n },\n getUserAnswersForActivity: () => {\n const { userAnswers } = get();\n return userAnswers;\n },\n setCurrentQuestion: (question) => {\n const { getActiveQuiz, variant, questionsResult } = get();\n const activeQuiz = getActiveQuiz();\n if (!activeQuiz) return;\n let questionIndex = 0;\n if (variant == 'result') {\n if (!questionsResult) return;\n const questionResult =\n questionsResult.answers.find((q) => q.id === question.id) ??\n questionsResult.answers.find((q) => q.questionId === question.id);\n if (!questionResult) return;\n questionIndex = activeQuiz.quiz.questions.findIndex(\n (q) => q.id === questionResult.questionId\n );\n } else {\n questionIndex = activeQuiz.quiz.questions.findIndex(\n (q) => q.id === question.id\n );\n }\n\n // Validate that the question was found before updating currentQuestionIndex\n if (questionIndex === -1) {\n console.warn(\n `Question with id \"${question.id}\" not found in active quiz`\n );\n return;\n }\n\n set({ currentQuestionIndex: questionIndex });\n },\n\n setAnswerStatus: (questionId, status) => {\n const { userAnswers } = get();\n const existingAnswerIndex = userAnswers.findIndex(\n (answer) => answer.questionId === questionId\n );\n\n if (existingAnswerIndex !== -1) {\n const updatedUserAnswers = [...userAnswers];\n updatedUserAnswers[existingAnswerIndex] = {\n ...updatedUserAnswers[existingAnswerIndex],\n answerStatus: status,\n };\n set({ userAnswers: updatedUserAnswers });\n }\n },\n\n getAnswerStatus: (questionId) => {\n const { userAnswers } = get();\n const userAnswer = userAnswers.find(\n (answer) => answer.questionId === questionId\n );\n return userAnswer ? userAnswer.answerStatus : null;\n },\n getQuestionIndex: (questionId) => {\n const { questionsResult } = get();\n if (!questionsResult) return 0;\n\n let idx = questionsResult.answers.findIndex(\n (q) => q.questionId === questionId\n );\n if (idx === -1) {\n idx = questionsResult.answers.findIndex((q) => q.id === questionId);\n }\n return idx !== -1 ? idx + 1 : 0;\n },\n\n // Question Result\n getQuestionResultByQuestionId: (questionId) => {\n const { questionsResult } = get();\n const question = questionsResult?.answers.find(\n (answer) => answer.questionId === questionId\n );\n\n return question || null;\n },\n getQuestionResultStatistics: () => {\n const { questionsResult } = get();\n return questionsResult?.statistics || null;\n },\n getQuestionResult: () => {\n const { questionsResult } = get();\n return questionsResult;\n },\n setQuestionsResult: (questionsResult) => {\n set({ questionsResult });\n },\n setCurrentQuestionResult: (currentQuestionResult) => {\n set({ currentQuestionResult });\n },\n getCurrentQuestionResult: () => {\n const { currentQuestionResult } = get();\n return currentQuestionResult;\n },\n };\n },\n {\n name: 'quiz-store',\n }\n )\n);\n","import {\n forwardRef,\n HTMLAttributes,\n useEffect,\n MouseEvent,\n KeyboardEvent,\n} from 'react';\nimport Button from '../Button/Button';\nimport { cn } from '../../utils/utils';\n\n/**\n * Lookup table for size classes\n */\nconst SIZE_CLASSES = {\n 'extra-small': 'w-screen max-w-[324px]',\n small: 'w-screen max-w-[378px]',\n medium: 'w-screen max-w-[459px]',\n large: 'w-screen max-w-[578px]',\n 'extra-large': 'w-screen max-w-[912px]',\n} as const;\n\ninterface AlertDialogProps extends HTMLAttributes<HTMLDivElement> {\n /** Title of the alert dialog */\n title: string;\n /** Whether the alert dialog is open (controlled mode) */\n isOpen: boolean;\n /** Function called when the alert dialog is opened or closed (controlled mode) */\n onChangeOpen: (open: boolean) => void;\n /** Whether clicking the backdrop should close the alert dialog */\n closeOnBackdropClick?: boolean;\n /** Whether pressing Escape should close the alert dialog */\n closeOnEscape?: boolean;\n /** Additional CSS classes for the alert dialog content */\n className?: string;\n /** Function called when submit button is clicked */\n onSubmit?: (value?: unknown) => void;\n /** Value to pass to onSubmit function */\n submitValue?: unknown;\n /** Function called when cancel button is clicked */\n onCancel?: (value?: unknown) => void;\n /** Value to pass to onCancel function */\n cancelValue?: unknown;\n /** Description of the alert dialog */\n description: string;\n /** Label of the cancel button */\n cancelButtonLabel?: string;\n /** Label of the submit button */\n submitButtonLabel?: string;\n /** Size of the alert dialog */\n size?: 'extra-small' | 'small' | 'medium' | 'large' | 'extra-large';\n}\n\nconst AlertDialog = forwardRef<HTMLDivElement, AlertDialogProps>(\n (\n {\n description,\n cancelButtonLabel = 'Cancelar',\n submitButtonLabel = 'Deletar',\n title,\n isOpen,\n closeOnBackdropClick = true,\n closeOnEscape = true,\n className = '',\n onSubmit,\n onChangeOpen,\n submitValue,\n onCancel,\n cancelValue,\n size = 'medium',\n ...props\n },\n ref\n ) => {\n // Handle escape key\n useEffect(() => {\n if (!isOpen || !closeOnEscape) return;\n\n const handleEscape = (event: globalThis.KeyboardEvent) => {\n if (event.key === 'Escape') {\n onChangeOpen(false);\n }\n };\n\n document.addEventListener('keydown', handleEscape);\n return () => document.removeEventListener('keydown', handleEscape);\n }, [isOpen, closeOnEscape]);\n\n // Prevent body scroll when modal is open\n useEffect(() => {\n if (isOpen) {\n document.body.style.overflow = 'hidden';\n } else {\n document.body.style.overflow = 'unset';\n }\n\n return () => {\n document.body.style.overflow = 'unset';\n };\n }, [isOpen]);\n\n const handleBackdropClick = (event: MouseEvent<HTMLDivElement>) => {\n if (event.target === event.currentTarget && closeOnBackdropClick) {\n onChangeOpen(false);\n }\n };\n\n const handleBackdropKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'Escape' && closeOnEscape) {\n onChangeOpen(false);\n }\n };\n\n const handleSubmit = () => {\n onChangeOpen(false);\n onSubmit?.(submitValue);\n };\n\n const handleCancel = () => {\n onChangeOpen(false);\n onCancel?.(cancelValue);\n };\n\n const sizeClasses = SIZE_CLASSES[size];\n\n return (\n <>\n {/* Alert Dialog Overlay */}\n {isOpen && (\n <div\n className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50 backdrop-blur-sm\"\n onClick={handleBackdropClick}\n onKeyDown={handleBackdropKeyDown}\n data-testid=\"alert-dialog-overlay\"\n >\n {/* Alert Dialog Content */}\n <div\n ref={ref}\n className={cn(\n 'bg-background border border-border-100 rounded-lg shadow-lg p-6 m-3',\n sizeClasses,\n className\n )}\n {...props}\n >\n <h2\n id=\"alert-dialog-title\"\n className=\"pb-3 text-xl font-semibold text-text-950\"\n >\n {title}\n </h2>\n <p\n id=\"alert-dialog-description\"\n className=\"text-text-700 text-sm\"\n >\n {description}\n </p>\n\n <div className=\"flex flex-row items-center justify-end pt-4 gap-3\">\n <Button variant=\"outline\" size=\"small\" onClick={handleCancel}>\n {cancelButtonLabel}\n </Button>\n\n <Button\n variant=\"solid\"\n size=\"small\"\n action=\"negative\"\n onClick={handleSubmit}\n >\n {submitButtonLabel}\n </Button>\n </div>\n </div>\n </div>\n )}\n </>\n );\n }\n);\n\nAlertDialog.displayName = 'AlertDialog';\n\nexport { AlertDialog };\n","import { ReactNode, MouseEvent, useEffect, KeyboardEvent } from 'react';\nimport { X } from 'phosphor-react';\nimport { cn } from '../../utils/utils';\n\n/**\n * Lookup table for size classes\n */\nconst SIZE_CLASSES = {\n xs: 'max-w-[360px]',\n sm: 'max-w-[420px]',\n md: 'max-w-[510px]',\n lg: 'max-w-[640px]',\n xl: 'max-w-[970px]',\n} as const;\n\n/**\n * Modal component props interface\n */\ntype ModalProps = {\n /** Whether the modal is open */\n isOpen: boolean;\n /** Function to close the modal */\n onClose: () => void;\n /** Modal title */\n title: string;\n /** Modal description/content */\n children: ReactNode;\n /** Size of the modal */\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n /** Additional CSS classes for the modal content */\n className?: string;\n /** Whether clicking the backdrop should close the modal */\n closeOnBackdropClick?: boolean;\n /** Whether pressing Escape should close the modal */\n closeOnEscape?: boolean;\n /** Footer content (typically buttons) */\n footer?: ReactNode;\n /** Hide the close button */\n hideCloseButton?: boolean;\n};\n\n/**\n * Modal component for Analytica Ensino platforms\n *\n * A flexible modal component with multiple size variants and customizable behavior.\n *\n * @param isOpen - Whether the modal is currently open\n * @param onClose - Callback function called when the modal should be closed\n * @param title - The title displayed at the top of the modal\n * @param children - The main content of the modal\n * @param size - The size variant (xs, sm, md, lg, xl)\n * @param className - Additional CSS classes for the modal content\n * @param closeOnBackdropClick - Whether clicking the backdrop closes the modal (default: true)\n * @param closeOnEscape - Whether pressing Escape closes the modal (default: true)\n * @param footer - Footer content, typically action buttons\n * @param hideCloseButton - Whether to hide the X close button (default: false)\n * @returns A modal overlay with content\n *\n * @example\n * ```tsx\n * <Modal\n * isOpen={isModalOpen}\n * onClose={() => setIsModalOpen(false)}\n * title=\"Invite your team\"\n * size=\"md\"\n * footer={\n * <div className=\"flex gap-3\">\n * <Button variant=\"outline\" onClick={() => setIsModalOpen(false)}>Cancel</Button>\n * <Button variant=\"solid\" onClick={handleExplore}>Explore</Button>\n * </div>\n * }\n * >\n * Elevate user interactions with our versatile modals.\n * </Modal>\n * ```\n */\nconst Modal = ({\n isOpen,\n onClose,\n title,\n children,\n size = 'md',\n className = '',\n closeOnBackdropClick = true,\n closeOnEscape = true,\n footer,\n hideCloseButton = false,\n}: ModalProps) => {\n // Handle escape key\n useEffect(() => {\n if (!isOpen || !closeOnEscape) return;\n\n const handleEscape = (event: globalThis.KeyboardEvent) => {\n if (event.key === 'Escape') {\n onClose();\n }\n };\n\n document.addEventListener('keydown', handleEscape);\n return () => document.removeEventListener('keydown', handleEscape);\n }, [isOpen, closeOnEscape, onClose]);\n\n // Handle body scroll lock\n useEffect(() => {\n const originalOverflow = document.body.style.overflow;\n if (isOpen) {\n document.body.style.overflow = 'hidden';\n } else {\n document.body.style.overflow = originalOverflow;\n }\n\n return () => {\n document.body.style.overflow = originalOverflow;\n };\n }, [isOpen]);\n\n // Handle backdrop click\n const handleBackdropClick = (event: MouseEvent<HTMLDivElement>) => {\n if (closeOnBackdropClick && event.target === event.currentTarget) {\n onClose();\n }\n };\n\n // Handle backdrop keyboard interaction\n const handleBackdropKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (closeOnBackdropClick && (event.key === 'Enter' || event.key === ' ')) {\n onClose();\n }\n };\n\n if (!isOpen) return null;\n\n const sizeClasses = SIZE_CLASSES[size];\n const baseClasses =\n 'bg-secondary-50 rounded-3xl shadow-hard-shadow-2 border border-border-100 w-full mx-4';\n // Reset dialog default styles to prevent positioning issues\n const dialogResetClasses =\n 'p-0 m-0 border-none outline-none max-h-none static';\n const modalClasses = cn(\n baseClasses,\n sizeClasses,\n dialogResetClasses,\n className\n );\n\n return (\n <div\n className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-xs\"\n onClick={handleBackdropClick}\n onKeyDown={handleBackdropKeyDown}\n role=\"button\"\n tabIndex={closeOnBackdropClick ? 0 : -1}\n aria-label=\"Fechar modal clicando no fundo\"\n >\n <dialog className={modalClasses} aria-labelledby=\"modal-title\" open>\n {/* Header */}\n <div className=\"flex items-center justify-between px-6 py-6\">\n <h2 id=\"modal-title\" className=\"text-lg font-semibold text-text-950\">\n {title}\n </h2>\n {!hideCloseButton && (\n <button\n onClick={onClose}\n className=\"p-1 text-text-500 hover:text-text-700 hover:bg-background-50 rounded-md transition-colors focus:outline-none focus:ring-2 focus:ring-indicator-info focus:ring-offset-2\"\n aria-label=\"Fechar modal\"\n >\n <X size={18} />\n </button>\n )}\n </div>\n\n {/* Content */}\n <div className=\"px-6 pb-6\">\n <div className=\"text-text-500 font-normal text-sm leading-6\">\n {children}\n </div>\n </div>\n\n {/* Footer */}\n {footer && (\n <div className=\"flex justify-end gap-3 px-6 pb-6\">{footer}</div>\n )}\n </dialog>\n </div>\n );\n};\n\nexport default Modal;\n","import { create, StoreApi, useStore } from 'zustand';\nimport {\n ReactNode,\n useEffect,\n useRef,\n ButtonHTMLAttributes,\n forwardRef,\n HTMLAttributes,\n KeyboardEvent,\n MouseEvent,\n ReactElement,\n isValidElement,\n Children,\n cloneElement,\n useId,\n} from 'react';\nimport { CaretDown, Check, WarningCircle } from 'phosphor-react';\nimport { cn } from '../../utils/utils';\n\nconst VARIANT_CLASSES = {\n outlined: 'border-2 rounded-lg focus:border-primary-950',\n underlined: 'border-b-2 focus:border-primary-950',\n rounded: 'border-2 rounded-full focus:border-primary-950',\n} as const;\n\nconst SIZE_CLASSES = {\n small: 'text-sm',\n medium: 'text-md',\n large: 'text-lg',\n 'extra-large': 'text-lg',\n} as const;\n\nconst HEIGHT_CLASSES = {\n small: 'h-8',\n medium: 'h-9',\n large: 'h-10',\n 'extra-large': 'h-12',\n} as const;\n\nconst PADDING_CLASSES = {\n small: 'px-2 py-1',\n medium: 'px-3 py-2',\n large: 'px-4 py-3',\n 'extra-large': 'px-5 py-4',\n} as const;\n\nconst SIDE_CLASSES = {\n top: 'bottom-full -translate-y-1',\n right: 'top-full translate-y-1',\n bottom: 'top-full translate-y-1',\n left: 'top-full translate-y-1',\n};\nconst ALIGN_CLASSES = {\n start: 'left-0',\n center: 'left-1/2 -translate-x-1/2',\n end: 'right-0',\n};\n\ninterface SelectStore {\n open: boolean;\n setOpen: (open: boolean) => void;\n value: string;\n setValue: (value: string) => void;\n selectedLabel: ReactNode;\n setSelectedLabel: (label: ReactNode) => void;\n onValueChange?: (value: string) => void;\n}\n\ntype SelectStoreApi = StoreApi<SelectStore>;\n\nexport function createSelectStore(\n onValueChange?: (value: string) => void\n): SelectStoreApi {\n return create<SelectStore>((set) => ({\n open: false,\n setOpen: (open) => set({ open }),\n value: '',\n setValue: (value) => set({ value }),\n selectedLabel: '',\n setSelectedLabel: (label) => set({ selectedLabel: label }),\n onValueChange,\n }));\n}\n\nexport const useSelectStore = (externalStore?: SelectStoreApi) => {\n if (!externalStore) {\n throw new Error(\n 'Component must be used within a Select (store is missing)'\n );\n }\n\n return externalStore;\n};\n\nexport function getLabelAsNode(children: ReactNode): ReactNode {\n if (typeof children === 'string' || typeof children === 'number') {\n return children;\n }\n const flattened = Children.toArray(children);\n\n if (flattened.length === 1) return flattened[0];\n\n return <>{flattened}</>;\n}\n\ninterface SelectProps {\n className?: string;\n children: ReactNode;\n defaultValue?: string;\n value?: string;\n onValueChange?: (value: string) => void;\n size?: 'small' | 'medium' | 'large' | 'extra-large';\n label?: string;\n helperText?: string;\n errorMessage?: string;\n id?: string;\n}\n\nconst injectStore = (\n children: ReactNode,\n store: SelectStoreApi,\n size: string,\n selectId: string\n): ReactNode => {\n return Children.map(children, (child) => {\n if (isValidElement(child)) {\n const typedChild = child as ReactElement<{\n store?: SelectStoreApi;\n children?: ReactNode;\n size?: string;\n selectId?: string;\n }>;\n\n const newProps: Partial<{\n store: SelectStoreApi;\n children: ReactNode;\n size: string;\n selectId: string;\n }> = {\n store,\n };\n\n // Only pass size and selectId to SelectTrigger\n if (typedChild.type === SelectTrigger) {\n newProps.size = size;\n newProps.selectId = selectId;\n }\n\n if (typedChild.props.children) {\n newProps.children = injectStore(\n typedChild.props.children,\n store,\n size,\n selectId\n );\n }\n\n return cloneElement(typedChild, newProps);\n }\n return child;\n });\n};\n\nconst Select = ({\n children,\n defaultValue = '',\n className,\n value: propValue,\n onValueChange,\n size = 'small',\n label,\n helperText,\n errorMessage,\n id,\n}: SelectProps) => {\n const storeRef = useRef<SelectStoreApi | null>(null);\n storeRef.current ??= createSelectStore(onValueChange);\n const store = storeRef.current;\n\n const selectRef = useRef<HTMLDivElement>(null);\n const { open, setOpen, setValue, selectedLabel } = useStore(store, (s) => s);\n\n // Generate unique ID if not provided\n const generatedId = useId();\n const selectId = id ?? `select-${generatedId}`;\n\n const findLabelForValue = (\n children: ReactNode,\n targetValue: string\n ): string | null => {\n let found: string | null = null;\n const search = (nodes: ReactNode) => {\n Children.forEach(nodes, (child) => {\n if (!isValidElement(child)) return;\n const typedChild = child as ReactElement<{\n value?: string;\n children?: ReactNode;\n }>;\n if (\n typedChild.type === SelectItem &&\n typedChild.props.value === targetValue\n ) {\n if (typeof typedChild.props.children === 'string')\n found = typedChild.props.children;\n }\n if (typedChild.props.children && !found)\n search(typedChild.props.children);\n });\n };\n search(children);\n return found;\n };\n\n useEffect(() => {\n if (!selectedLabel && defaultValue) {\n const label = findLabelForValue(children, defaultValue);\n if (label) store.setState({ selectedLabel: label });\n }\n }, [children, defaultValue, selectedLabel]);\n\n useEffect(() => {\n const handleClickOutside = (event: globalThis.MouseEvent) => {\n if (\n selectRef.current &&\n !selectRef.current.contains(event.target as Node)\n ) {\n setOpen(false);\n }\n };\n\n const handleArrowKeys = (event: globalThis.KeyboardEvent) => {\n const selectContent = selectRef.current?.querySelector('[role=\"menu\"]');\n if (selectContent) {\n event.preventDefault();\n const items = Array.from(\n selectContent.querySelectorAll(\n '[role=\"menuitem\"]:not([aria-disabled=\"true\"])'\n )\n ).filter((el): el is HTMLElement => el instanceof HTMLElement);\n\n const focused = document.activeElement as HTMLElement;\n const currentIndex = items.findIndex((item) => item === focused);\n\n let nextIndex = 0;\n if (event.key === 'ArrowDown') {\n nextIndex =\n currentIndex === -1 ? 0 : (currentIndex + 1) % items.length;\n } else {\n nextIndex =\n currentIndex === -1\n ? items.length - 1\n : (currentIndex - 1 + items.length) % items.length;\n }\n items[nextIndex]?.focus();\n }\n };\n\n if (open) {\n document.addEventListener('mousedown', handleClickOutside);\n document.addEventListener('keydown', handleArrowKeys);\n }\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n document.removeEventListener('keydown', handleArrowKeys);\n };\n }, [open]);\n\n useEffect(() => {\n if (propValue) {\n setValue(propValue);\n const label = findLabelForValue(children, propValue);\n if (label) store.setState({ selectedLabel: label });\n }\n }, [propValue]);\n\n const sizeClasses = SIZE_CLASSES[size];\n\n return (\n <div className={cn('w-fit', className)}>\n {/* Label */}\n {label && (\n <label\n htmlFor={selectId}\n className={cn('block font-bold text-text-900 mb-1.5', sizeClasses)}\n >\n {label}\n </label>\n )}\n\n {/* Select Container */}\n <div className={cn('relative w-fit')} ref={selectRef}>\n {injectStore(children, store, size, selectId)}\n </div>\n\n {/* Helper Text or Error Message */}\n {(helperText || errorMessage) && (\n <div className=\"mt-1.5 gap-1.5\">\n {helperText && <p className=\"text-sm text-text-500\">{helperText}</p>}\n {errorMessage && (\n <p className=\"flex gap-1 items-center text-sm text-indicator-error\">\n <WarningCircle size={16} /> {errorMessage}\n </p>\n )}\n </div>\n )}\n </div>\n );\n};\n\nconst SelectValue = ({\n placeholder,\n store: externalStore,\n}: {\n placeholder?: string;\n store?: SelectStoreApi;\n}) => {\n const store = useSelectStore(externalStore);\n\n const selectedLabel = useStore(store, (s) => s.selectedLabel);\n const value = useStore(store, (s) => s.value);\n return (\n <span className=\"text-inherit\">\n {selectedLabel || placeholder || value}\n </span>\n );\n};\n\ninterface SelectTriggerProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n className?: string;\n invalid?: boolean;\n variant?: 'outlined' | 'underlined' | 'rounded';\n store?: SelectStoreApi;\n size?: 'small' | 'medium' | 'large' | 'extra-large';\n selectId?: string;\n}\n\nconst SelectTrigger = forwardRef<HTMLButtonElement, SelectTriggerProps>(\n (\n {\n className,\n invalid = false,\n variant = 'outlined',\n store: externalStore,\n disabled,\n size = 'medium',\n selectId,\n ...props\n },\n ref\n ) => {\n const store = useSelectStore(externalStore);\n const open = useStore(store, (s) => s.open);\n const toggleOpen = () => store.setState({ open: !open });\n\n const variantClasses = VARIANT_CLASSES[variant];\n const heightClasses = HEIGHT_CLASSES[size];\n const paddingClasses = PADDING_CLASSES[size];\n\n return (\n <button\n ref={ref}\n id={selectId}\n className={cn(\n 'flex w-full items-center justify-between border-border-300',\n heightClasses,\n paddingClasses,\n invalid &&\n `${variant == 'underlined' ? 'border-b-2' : 'border-2'} border-indicator-error text-text-600`,\n disabled\n ? 'cursor-not-allowed text-text-400 pointer-events-none opacity-50'\n : 'cursor-pointer hover:bg-background-50 focus:bg-accent focus:text-accent-foreground hover:bg-accent hover:text-accent-foreground',\n !invalid && !disabled ? 'text-text-700' : '',\n variantClasses,\n className\n )}\n onClick={toggleOpen}\n aria-expanded={open}\n aria-haspopup=\"listbox\"\n aria-controls={open ? 'select-content' : undefined}\n {...props}\n >\n {props.children}\n <CaretDown\n className={cn(\n 'h-[1em] w-[1em] opacity-50 transition-transform',\n open ? 'rotate-180' : ''\n )}\n />\n </button>\n );\n }\n);\nSelectTrigger.displayName = 'SelectTrigger';\n\ninterface SelectContentProps extends HTMLAttributes<HTMLDivElement> {\n className?: string;\n align?: 'start' | 'center' | 'end';\n side?: 'top' | 'right' | 'bottom' | 'left';\n store?: SelectStoreApi;\n}\n\nconst SelectContent = forwardRef<HTMLDivElement, SelectContentProps>(\n (\n {\n children,\n className,\n align = 'start',\n side = 'bottom',\n store: externalStore,\n ...props\n },\n ref\n ) => {\n const store = useSelectStore(externalStore);\n\n const open = useStore(store, (s) => s.open);\n if (!open) return null;\n\n const getPositionClasses = () =>\n `w-full min-w-full absolute ${SIDE_CLASSES[side]} ${ALIGN_CLASSES[align]}`;\n\n return (\n <div\n role=\"menu\"\n ref={ref}\n className={cn(\n 'bg-secondary z-50 min-w-[210px] max-h-[300px] overflow-y-auto overflow-x-hidden rounded-md border p-1 shadow-md border-border-100',\n getPositionClasses(),\n className\n )}\n {...props}\n >\n {children}\n </div>\n );\n }\n);\nSelectContent.displayName = 'SelectContent';\n\ninterface SelectItemProps extends HTMLAttributes<HTMLDivElement> {\n value: string;\n disabled?: boolean;\n store?: SelectStoreApi;\n}\n\nconst SelectItem = forwardRef<HTMLDivElement, SelectItemProps>(\n (\n {\n className,\n children,\n value,\n disabled = false,\n store: externalStore,\n ...props\n },\n ref\n ) => {\n const store = useSelectStore(externalStore);\n const {\n value: selectedValue,\n setValue,\n setOpen,\n setSelectedLabel,\n onValueChange,\n } = useStore(store, (s) => s);\n\n const handleClick = (\n e: MouseEvent<HTMLDivElement> | KeyboardEvent<HTMLDivElement>\n ) => {\n const labelNode = getLabelAsNode(children);\n if (!disabled) {\n const newValue = selectedValue === value ? '' : value;\n const newLabel = selectedValue === value ? '' : labelNode;\n setValue(newValue);\n setSelectedLabel(newLabel);\n setOpen(false);\n onValueChange?.(newValue);\n }\n props.onClick?.(e as MouseEvent<HTMLDivElement>);\n };\n\n return (\n <div\n role=\"menuitem\"\n aria-disabled={disabled}\n ref={ref}\n className={`\n bg-secondary focus-visible:bg-background-50\n relative flex select-none items-center gap-2 rounded-sm p-3 outline-none transition-colors [&>svg]:size-4 [&>svg]:shrink-0\n ${className}\n ${\n disabled\n ? 'cursor-not-allowed text-text-400 pointer-events-none opacity-50'\n : 'cursor-pointer hover:bg-background-50 text-text-700 focus:bg-accent focus:text-accent-foreground hover:bg-accent hover:text-accent-foreground'\n }\n ${selectedValue === value && 'bg-background-50'}\n `}\n onClick={handleClick}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') handleClick(e);\n }}\n tabIndex={disabled ? -1 : 0}\n {...props}\n >\n <span className=\"absolute right-2 flex h-3.5 w-3.5 items-center justify-center\">\n {selectedValue === value && <Check className=\"\" />}\n </span>\n {children}\n </div>\n );\n }\n);\n\nSelectItem.displayName = 'SelectItem';\n\nexport default Select;\nexport { SelectTrigger, SelectContent, SelectItem, SelectValue };\n","import {\n forwardRef,\n Fragment,\n HTMLAttributes,\n ReactNode,\n useState,\n useRef,\n MouseEvent,\n ChangeEvent,\n KeyboardEvent,\n Ref,\n} from 'react';\nimport Button from '../Button/Button';\nimport Badge from '../Badge/Badge';\nimport ProgressBar from '../ProgressBar/ProgressBar';\nimport {\n CaretRight,\n ChatCircleText,\n CheckCircle,\n Clock,\n DotsThreeVertical,\n Play,\n SpeakerHigh,\n SpeakerLow,\n SpeakerSimpleX,\n XCircle,\n} from 'phosphor-react';\nimport Text from '../Text/Text';\nimport { cn } from '../../utils/utils';\n\n// Componente base reutilizável para todos os cards\ninterface CardBaseProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n variant?: 'default' | 'compact' | 'minimal';\n layout?: 'horizontal' | 'vertical';\n padding?: 'none' | 'small' | 'medium' | 'large';\n minHeight?: 'none' | 'small' | 'medium' | 'large';\n cursor?: 'default' | 'pointer';\n}\n\nconst CARD_BASE_CLASSES = {\n default: 'w-full bg-background border border-border-50 rounded-xl',\n compact: 'w-full bg-background border border-border-50 rounded-lg',\n minimal: 'w-full bg-background border border-border-100 rounded-md',\n};\n\nconst CARD_PADDING_CLASSES = {\n none: '',\n small: 'p-2',\n medium: 'p-4',\n large: 'p-6',\n};\n\nconst CARD_MIN_HEIGHT_CLASSES = {\n none: '',\n small: 'min-h-16',\n medium: 'min-h-20',\n large: 'min-h-24',\n};\n\nconst CARD_LAYOUT_CLASSES = {\n horizontal: 'flex flex-row',\n vertical: 'flex flex-col',\n};\n\nconst CARD_CURSOR_CLASSES = {\n default: '',\n pointer: 'cursor-pointer',\n};\n\nconst CardBase = forwardRef<HTMLDivElement, CardBaseProps>(\n (\n {\n children,\n variant = 'default',\n layout = 'horizontal',\n padding = 'medium',\n minHeight = 'medium',\n cursor = 'default',\n className = '',\n ...props\n },\n ref\n ) => {\n const baseClasses = CARD_BASE_CLASSES[variant];\n const paddingClasses = CARD_PADDING_CLASSES[padding];\n const minHeightClasses = CARD_MIN_HEIGHT_CLASSES[minHeight];\n const layoutClasses = CARD_LAYOUT_CLASSES[layout];\n const cursorClasses = CARD_CURSOR_CLASSES[cursor];\n\n const combinedClasses = [\n baseClasses,\n paddingClasses,\n minHeightClasses,\n layoutClasses,\n cursorClasses,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div ref={ref} className={combinedClasses} {...props}>\n {children}\n </div>\n );\n }\n);\n\ninterface CardActivitiesResultsProps extends HTMLAttributes<HTMLDivElement> {\n icon: ReactNode;\n title: string;\n subTitle: string;\n header: string;\n description?: string;\n extended?: boolean;\n action?: 'warning' | 'success' | 'error' | 'info';\n}\n\nconst ACTION_CARD_CLASSES = {\n warning: 'bg-warning-background',\n success: 'bg-success-300',\n error: 'bg-error-100',\n info: 'bg-info-background',\n};\n\nconst ACTION_ICON_CLASSES = {\n warning: 'bg-warning-300 text-text',\n success: 'bg-yellow-300 text-text-950',\n error: 'bg-error-500 text-text',\n info: 'bg-info-500 text-text',\n};\n\nconst ACTION_SUBTITLE_CLASSES = {\n warning: 'text-warning-600',\n success: 'text-success-700',\n error: 'text-error-700',\n info: 'text-info-700',\n};\n\nconst ACTION_HEADER_CLASSES = {\n warning: 'text-warning-300',\n success: 'text-success-300',\n error: 'text-error-300',\n info: 'text-info-300',\n};\n\nconst CardActivitiesResults = forwardRef<\n HTMLDivElement,\n CardActivitiesResultsProps\n>(\n (\n {\n icon,\n title,\n subTitle,\n header,\n extended = false,\n action = 'success',\n description,\n className,\n ...props\n },\n ref\n ) => {\n const actionCardClasses = ACTION_CARD_CLASSES[action];\n const actionIconClasses = ACTION_ICON_CLASSES[action];\n const actionSubTitleClasses = ACTION_SUBTITLE_CLASSES[action];\n const actionHeaderClasses = ACTION_HEADER_CLASSES[action];\n\n return (\n <div\n ref={ref}\n className={cn(\n 'w-full flex flex-col border border-border-50 bg-background rounded-xl',\n className\n )}\n {...props}\n >\n <div\n className={cn(\n 'flex flex-col gap-1 items-center justify-center p-4',\n actionCardClasses,\n extended ? 'rounded-t-xl' : 'rounded-xl'\n )}\n >\n <span\n className={cn(\n 'size-7.5 rounded-full flex items-center justify-center',\n actionIconClasses\n )}\n >\n {icon}\n </span>\n\n <Text\n size=\"2xs\"\n weight=\"medium\"\n className=\"text-text-800 uppercase truncate\"\n >\n {title}\n </Text>\n\n <p\n className={cn('text-lg font-bold truncate', actionSubTitleClasses)}\n >\n {subTitle}\n </p>\n </div>\n\n {extended && (\n <div className=\"flex flex-col items-center gap-2.5 pb-9.5 pt-2.5\">\n <p\n className={cn(\n 'text-2xs font-medium uppercase truncate',\n actionHeaderClasses\n )}\n >\n {header}\n </p>\n <Badge size=\"large\" action=\"info\">\n {description}\n </Badge>\n </div>\n )}\n </div>\n );\n }\n);\n\ninterface CardQuestionProps extends HTMLAttributes<HTMLDivElement> {\n header: string;\n state?: 'done' | 'undone';\n onClickButton?: (valueButton?: unknown) => void;\n valueButton?: unknown;\n}\n\nconst CardQuestions = forwardRef<HTMLDivElement, CardQuestionProps>(\n (\n {\n header,\n state = 'undone',\n className,\n onClickButton,\n valueButton,\n ...props\n },\n ref\n ) => {\n const isDone = state === 'done';\n const stateLabel = isDone ? 'Realizado' : 'Não Realizado';\n const buttonLabel = isDone ? 'Ver Questão' : 'Responder';\n\n return (\n <CardBase\n ref={ref}\n layout=\"horizontal\"\n padding=\"medium\"\n minHeight=\"medium\"\n className={cn('justify-between gap-4', className)}\n {...props}\n >\n <section className=\"flex flex-col gap-1 flex-1 min-w-0\">\n <p className=\"font-bold text-xs text-text-950 truncate\">{header}</p>\n\n <div className=\"flex flex-row gap-6 items-center\">\n <Badge\n size=\"medium\"\n variant=\"solid\"\n action={isDone ? 'success' : 'error'}\n >\n {stateLabel}\n </Badge>\n\n <span className=\"flex flex-row items-center gap-1 text-text-700 text-xs\">\n {isDone ? 'Nota' : 'Sem nota'}\n {isDone && (\n <Badge size=\"medium\" action=\"success\">\n 00\n </Badge>\n )}\n </span>\n </div>\n </section>\n\n <span className=\"flex-shrink-0\">\n <Button\n size=\"extra-small\"\n onClick={() => onClickButton?.(valueButton)}\n className=\"min-w-fit\"\n >\n {buttonLabel}\n </Button>\n </span>\n </CardBase>\n );\n }\n);\n\ninterface CardProgressProps extends HTMLAttributes<HTMLDivElement> {\n header: string;\n subhead?: string;\n initialDate?: string;\n endDate?: string;\n progress?: number;\n direction?: 'horizontal' | 'vertical';\n icon: ReactNode;\n color?: string;\n progressVariant?: 'blue' | 'green';\n showDates?: boolean;\n}\n\nconst CardProgress = forwardRef<HTMLDivElement, CardProgressProps>(\n (\n {\n header,\n subhead,\n initialDate,\n endDate,\n progress = 0,\n direction = 'horizontal',\n icon,\n color = '#B7DFFF',\n progressVariant = 'blue',\n showDates = true,\n className,\n ...props\n },\n ref\n ) => {\n const isHorizontal = direction === 'horizontal';\n const contentComponent = {\n horizontal: (\n <>\n {showDates && (\n <div className=\"flex flex-row gap-6 items-center\">\n {initialDate && (\n <span className=\"flex flex-row gap-1 items-center text-2xs\">\n <p className=\"text-text-800 font-semibold\">Início</p>\n <p className=\"text-text-600\">{initialDate}</p>\n </span>\n )}\n {endDate && (\n <span className=\"flex flex-row gap-1 items-center text-2xs\">\n <p className=\"text-text-800 font-semibold\">Fim</p>\n <p className=\"text-text-600\">{endDate}</p>\n </span>\n )}\n </div>\n )}\n <span className=\"grid grid-cols-[1fr_auto] items-center gap-2\">\n <ProgressBar\n size=\"small\"\n value={progress}\n variant={progressVariant}\n data-testid=\"progress-bar\"\n />\n\n <Text\n size=\"xs\"\n weight=\"medium\"\n className={cn(\n 'text-text-950 leading-none tracking-normal text-center flex-none'\n )}\n >\n {Math.round(progress)}%\n </Text>\n </span>\n </>\n ),\n vertical: <p className=\"text-sm text-text-800\">{subhead}</p>,\n };\n\n return (\n <CardBase\n ref={ref}\n layout={isHorizontal ? 'horizontal' : 'vertical'}\n padding=\"none\"\n minHeight=\"medium\"\n cursor=\"pointer\"\n className={cn(isHorizontal ? 'h-20' : '', className)}\n {...props}\n >\n <div\n className={cn(\n 'flex justify-center items-center [&>svg]:size-6 text-text-950',\n isHorizontal\n ? 'min-w-[80px] min-h-[80px] rounded-l-xl'\n : 'min-h-[50px] w-full rounded-t-xl',\n !color.startsWith('#') ? `bg-${color}` : ''\n )}\n style={color.startsWith('#') ? { backgroundColor: color } : undefined}\n data-testid=\"icon-container\"\n >\n {icon}\n </div>\n\n <div\n className={cn(\n 'p-4 flex flex-col justify-between w-full h-full',\n !isHorizontal && 'gap-4'\n )}\n >\n <Text size=\"sm\" weight=\"bold\" className=\"text-text-950 truncate\">\n {header}\n </Text>\n {contentComponent[direction]}\n </div>\n </CardBase>\n );\n }\n);\n\ninterface CardTopicProps extends HTMLAttributes<HTMLDivElement> {\n header: string;\n subHead?: string[];\n progress: number;\n showPercentage?: boolean;\n progressVariant?: 'blue' | 'green';\n}\n\nconst CardTopic = forwardRef<HTMLDivElement, CardTopicProps>(\n (\n {\n header,\n subHead,\n progress,\n showPercentage = false,\n progressVariant = 'blue',\n className = '',\n ...props\n },\n ref\n ) => {\n return (\n <CardBase\n ref={ref}\n layout=\"vertical\"\n padding=\"small\"\n minHeight=\"medium\"\n cursor=\"pointer\"\n className={cn('justify-center gap-2 py-2 px-4', className)}\n {...props}\n >\n {subHead && (\n <span className=\"text-text-600 text-2xs flex flex-row gap-1\">\n {subHead.map((text, index) => (\n <Fragment key={`${text} - ${index}`}>\n <p>{text}</p>\n {index < subHead.length - 1 && <p>•</p>}\n </Fragment>\n ))}\n </span>\n )}\n\n <p className=\"text-sm text-text-950 font-bold truncate\">{header}</p>\n\n <span className=\"grid grid-cols-[1fr_auto] items-center gap-2\">\n <ProgressBar\n size=\"small\"\n value={progress}\n variant={progressVariant}\n data-testid=\"progress-bar\"\n />\n {showPercentage && (\n <Text\n size=\"xs\"\n weight=\"medium\"\n className={cn(\n 'text-text-950 leading-none tracking-normal text-center flex-none'\n )}\n >\n {Math.round(progress)}%\n </Text>\n )}\n </span>\n </CardBase>\n );\n }\n);\n\ninterface CardPerformanceProps extends HTMLAttributes<HTMLDivElement> {\n header: string;\n description?: string;\n progress?: number;\n labelProgress?: string;\n actionVariant?: 'button' | 'caret';\n progressVariant?: 'blue' | 'green';\n onClickButton?: (valueButton?: unknown) => void;\n valueButton?: unknown;\n}\n\nconst CardPerformance = forwardRef<HTMLDivElement, CardPerformanceProps>(\n (\n {\n header,\n progress,\n description = 'Sem dados ainda! Você ainda não fez um questionário neste assunto.',\n actionVariant = 'button',\n progressVariant = 'blue',\n labelProgress = '',\n className = '',\n onClickButton,\n valueButton,\n ...props\n },\n ref\n ) => {\n const hasProgress = progress !== undefined;\n\n return (\n <CardBase\n ref={ref}\n layout=\"horizontal\"\n padding=\"medium\"\n minHeight=\"none\"\n className={cn(\n actionVariant == 'caret' ? 'cursor-pointer' : '',\n className\n )}\n onClick={() => actionVariant == 'caret' && onClickButton?.(valueButton)}\n {...props}\n >\n <div className=\"w-full flex flex-col justify-between gap-2\">\n <div className=\"flex flex-row justify-between items-center gap-2\">\n <p className=\"text-lg font-bold text-text-950 truncate flex-1 min-w-0\">\n {header}\n </p>\n {actionVariant === 'button' && (\n <Button\n variant=\"outline\"\n size=\"extra-small\"\n onClick={() => onClickButton?.(valueButton)}\n className=\"min-w-fit flex-shrink-0\"\n >\n Ver Aula\n </Button>\n )}\n </div>\n\n <div className=\"w-full\">\n {hasProgress ? (\n <ProgressBar\n value={progress}\n label={`${progress}% ${labelProgress}`}\n variant={progressVariant}\n />\n ) : (\n <p className=\"text-xs text-text-600 truncate\">{description}</p>\n )}\n </div>\n </div>\n\n {actionVariant == 'caret' && (\n <CaretRight\n className=\"size-4.5 text-text-800 cursor-pointer\"\n data-testid=\"caret-icon\"\n />\n )}\n </CardBase>\n );\n }\n);\n\ninterface CardResultsProps extends HTMLAttributes<HTMLDivElement> {\n header: string;\n icon: ReactNode;\n correct_answers: number;\n incorrect_answers: number;\n direction?: 'row' | 'col';\n color?: string;\n}\n\nconst CardResults = forwardRef<HTMLDivElement, CardResultsProps>(\n (\n {\n header,\n correct_answers,\n incorrect_answers,\n icon,\n direction = 'col',\n color = '#B7DFFF',\n className,\n ...props\n },\n ref\n ) => {\n const isRow = direction == 'row';\n\n return (\n <CardBase\n ref={ref}\n layout=\"horizontal\"\n padding=\"none\"\n minHeight=\"medium\"\n className={cn('items-center cursor-pointer pr-4', className)}\n {...props}\n >\n <div\n className={cn(\n 'flex justify-center items-center [&>svg]:size-8 text-text-950 min-w-20 max-w-20 min-h-20 h-full rounded-l-xl'\n )}\n style={{\n backgroundColor: color,\n }}\n >\n {icon}\n </div>\n\n <div\n className={cn(\n 'p-4 flex justify-between w-full h-full',\n isRow ? 'flex-row items-center gap-2' : 'flex-col'\n )}\n >\n <p className=\"text-sm font-bold text-text-950 truncate flex-1 min-w-0\">\n {header}\n </p>\n <span className=\"flex flex-row gap-1 items-center\">\n <Badge\n action=\"success\"\n variant=\"solid\"\n size=\"large\"\n iconLeft={<CheckCircle />}\n >\n {correct_answers} Corretas\n </Badge>\n\n <Badge\n action=\"error\"\n variant=\"solid\"\n size=\"large\"\n iconLeft={<XCircle />}\n >\n {incorrect_answers} Incorretas\n </Badge>\n </span>\n </div>\n\n <CaretRight className=\"min-w-6 min-h-6 text-text-800\" />\n </CardBase>\n );\n }\n);\n\ninterface CardStatusProps extends HTMLAttributes<HTMLDivElement> {\n header: string;\n status?: 'correct' | 'incorrect';\n label?: string;\n}\n\nconst CardStatus = forwardRef<HTMLDivElement, CardStatusProps>(\n ({ header, className, status, label, ...props }, ref) => {\n return (\n <CardBase\n ref={ref}\n layout=\"horizontal\"\n padding=\"medium\"\n minHeight=\"medium\"\n className={cn('items-center cursor-pointer', className)}\n {...props}\n >\n <div className=\"flex justify-between w-full h-full flex-row items-center gap-2\">\n <p className=\"text-sm font-bold text-text-950 truncate flex-1 min-w-0\">\n {header}\n </p>\n <span className=\"flex flex-row gap-1 items-center flex-shrink-0\">\n {status && (\n <Badge\n action={status == 'correct' ? 'success' : 'error'}\n variant=\"solid\"\n size=\"medium\"\n iconLeft={<CheckCircle />}\n >\n {status == 'correct' ? 'Correta' : 'Incorreta'}\n </Badge>\n )}\n {label && <p className=\"text-sm text-text-800\">{label}</p>}\n </span>\n <CaretRight className=\"min-w-6 min-h-6 text-text-800 cursor-pointer flex-shrink-0 ml-2\" />\n </div>\n </CardBase>\n );\n }\n);\n\ninterface CardSettingsProps extends HTMLAttributes<HTMLDivElement> {\n icon: ReactNode;\n header: string;\n}\n\nconst CardSettings = forwardRef<HTMLDivElement, CardSettingsProps>(\n ({ header, className, icon, ...props }, ref) => {\n return (\n <CardBase\n ref={ref}\n layout=\"horizontal\"\n padding=\"small\"\n minHeight=\"none\"\n className={cn(\n 'border-none items-center gap-2 text-text-700',\n className\n )}\n {...props}\n >\n <span className=\"[&>svg]:size-6\">{icon}</span>\n\n <p className=\"w-full text-sm truncate\">{header}</p>\n\n <CaretRight size={24} className=\"cursor-pointer\" />\n </CardBase>\n );\n }\n);\n\ninterface CardSupportProps extends HTMLAttributes<HTMLDivElement> {\n header: string;\n direction?: 'row' | 'col';\n children: ReactNode;\n}\n\nconst CardSupport = forwardRef<HTMLDivElement, CardSupportProps>(\n ({ header, className, direction = 'col', children, ...props }, ref) => {\n return (\n <CardBase\n ref={ref}\n layout=\"horizontal\"\n padding=\"medium\"\n minHeight=\"none\"\n className={cn(\n 'border-none items-center gap-2 text-text-700',\n className\n )}\n {...props}\n >\n <div\n className={cn(\n 'w-full flex',\n direction == 'col' ? 'flex-col' : 'flex-row items-center'\n )}\n >\n <span className=\"w-full min-w-0\">\n <p className=\"text-sm text-text-950 font-bold truncate\">{header}</p>\n </span>\n <span className=\"flex flex-row gap-1\">{children}</span>\n </div>\n\n <CaretRight className=\"text-text-800 cursor-pointer\" size={24} />\n </CardBase>\n );\n }\n);\n\ninterface CardForumProps<T = unknown> extends HTMLAttributes<HTMLDivElement> {\n title: string;\n content: string;\n comments: number;\n date: string;\n hour: string;\n onClickComments?: (value?: T) => void;\n valueComments?: T;\n onClickProfile?: (profile?: T) => void;\n valueProfile?: T;\n}\n\nconst CardForum = forwardRef<HTMLDivElement, CardForumProps>(\n (\n {\n title,\n content,\n comments,\n onClickComments,\n valueComments,\n onClickProfile,\n valueProfile,\n className = '',\n date,\n hour,\n ...props\n },\n ref\n ) => {\n return (\n <CardBase\n ref={ref}\n layout=\"horizontal\"\n padding=\"medium\"\n minHeight=\"none\"\n variant=\"minimal\"\n className={cn('w-auto h-auto gap-3', className)}\n {...props}\n >\n <button\n type=\"button\"\n aria-label=\"Ver perfil\"\n onClick={() => onClickProfile?.(valueProfile)}\n className=\"min-w-8 h-8 rounded-full bg-background-950\"\n />\n\n <div className=\"flex flex-col gap-2 flex-1 min-w-0\">\n <div className=\"flex flex-row gap-1 items-center flex-wrap\">\n <p className=\"text-xs font-semibold text-primary-700 truncate\">\n {title}\n </p>\n <p className=\"text-xs text-text-600\">\n • {date} • {hour}\n </p>\n </div>\n\n <p className=\"text-text-950 text-sm line-clamp-2 truncate\">\n {content}\n </p>\n\n <button\n type=\"button\"\n aria-label=\"Ver comentários\"\n onClick={() => onClickComments?.(valueComments)}\n className=\"text-text-600 flex flex-row gap-2 items-center\"\n >\n <ChatCircleText aria-hidden=\"true\" size={16} />\n <p className=\"text-xs\">{comments} respostas</p>\n </button>\n </div>\n </CardBase>\n );\n }\n);\n\ninterface CardAudioProps extends HTMLAttributes<HTMLDivElement> {\n src?: string;\n title?: string;\n onPlay?: () => void;\n onPause?: () => void;\n onEnded?: () => void;\n onAudioTimeUpdate?: (currentTime: number, duration: number) => void;\n loop?: boolean;\n preload?: 'none' | 'metadata' | 'auto';\n tracks?: Array<{\n kind: 'subtitles' | 'captions' | 'descriptions' | 'chapters' | 'metadata';\n src: string;\n srcLang: string;\n label: string;\n default?: boolean;\n }>;\n}\n\nconst CardAudio = forwardRef<HTMLDivElement, CardAudioProps>(\n (\n {\n src,\n title,\n onPlay,\n onPause,\n onEnded,\n onAudioTimeUpdate,\n loop = false,\n preload = 'metadata',\n tracks,\n className,\n ...props\n },\n ref\n ) => {\n const [isPlaying, setIsPlaying] = useState(false);\n const [currentTime, setCurrentTime] = useState(0);\n const [duration, setDuration] = useState(0);\n const [volume, setVolume] = useState(1);\n const [showVolumeControl, setShowVolumeControl] = useState(false);\n const [showSpeedMenu, setShowSpeedMenu] = useState(false);\n const [playbackRate, setPlaybackRate] = useState(1);\n const audioRef = useRef<HTMLAudioElement>(null);\n\n const formatTime = (time: number) => {\n const minutes = Math.floor(time / 60);\n const seconds = Math.floor(time % 60);\n return `${minutes}:${seconds.toString().padStart(2, '0')}`;\n };\n\n const handlePlayPause = () => {\n if (isPlaying) {\n audioRef.current?.pause();\n setIsPlaying(false);\n onPause?.();\n } else {\n audioRef.current?.play();\n setIsPlaying(true);\n onPlay?.();\n }\n };\n\n const handleTimeUpdate = () => {\n const current = audioRef.current?.currentTime ?? 0;\n const total = audioRef.current?.duration ?? 0;\n\n setCurrentTime(current);\n setDuration(total);\n onAudioTimeUpdate?.(current, total);\n };\n\n const handleLoadedMetadata = () => {\n setDuration(audioRef.current?.duration ?? 0);\n };\n\n const handleEnded = () => {\n setIsPlaying(false);\n setCurrentTime(0);\n onEnded?.();\n };\n\n const handleProgressClick = (e: MouseEvent<HTMLButtonElement>) => {\n const rect = e.currentTarget.getBoundingClientRect();\n const clickX = e.clientX - rect.left;\n const width = rect.width;\n const percentage = clickX / width;\n const newTime = percentage * duration;\n\n if (audioRef.current) {\n audioRef.current.currentTime = newTime;\n }\n setCurrentTime(newTime);\n };\n\n const handleVolumeChange = (e: ChangeEvent<HTMLInputElement>) => {\n const newVolume = parseFloat(e.target.value);\n setVolume(newVolume);\n if (audioRef.current) {\n audioRef.current.volume = newVolume;\n }\n };\n\n const toggleVolumeControl = () => {\n setShowVolumeControl(!showVolumeControl);\n };\n\n const toggleSpeedMenu = () => {\n setShowSpeedMenu(!showSpeedMenu);\n };\n\n const handleSpeedChange = (speed: number) => {\n setPlaybackRate(speed);\n if (audioRef.current) {\n audioRef.current.playbackRate = speed;\n }\n setShowSpeedMenu(false);\n };\n\n const getVolumeIcon = () => {\n if (volume === 0) {\n return <SpeakerSimpleX />;\n }\n if (volume < 0.5) {\n return <SpeakerLow />;\n }\n return <SpeakerHigh />;\n };\n\n return (\n <CardBase\n ref={ref}\n layout=\"horizontal\"\n padding=\"medium\"\n minHeight=\"none\"\n className={cn('w-auto h-14 items-center gap-2', className)}\n {...props}\n >\n {/* Audio element */}\n <audio\n ref={audioRef}\n src={src}\n loop={loop}\n preload={preload}\n onTimeUpdate={handleTimeUpdate}\n onLoadedMetadata={handleLoadedMetadata}\n onEnded={handleEnded}\n data-testid=\"audio-element\"\n aria-label={title}\n >\n {tracks ? (\n tracks.map((track) => (\n <track\n key={track.src}\n kind={track.kind}\n src={track.src}\n srcLang={track.srcLang}\n label={track.label}\n default={track.default}\n />\n ))\n ) : (\n <track\n kind=\"captions\"\n src=\"data:text/vtt;base64,\"\n srcLang=\"pt\"\n label=\"Sem legendas disponíveis\"\n />\n )}\n </audio>\n\n {/* Play/Pause Button */}\n <button\n type=\"button\"\n onClick={handlePlayPause}\n disabled={!src}\n className=\"cursor-pointer text-text-950 hover:text-primary-600 disabled:text-text-400 disabled:cursor-not-allowed\"\n aria-label={isPlaying ? 'Pausar' : 'Reproduzir'}\n >\n {isPlaying ? (\n <div className=\"w-6 h-6 flex items-center justify-center\">\n <div className=\"flex gap-0.5\">\n <div className=\"w-1 h-4 bg-current rounded-sm\"></div>\n <div className=\"w-1 h-4 bg-current rounded-sm\"></div>\n </div>\n </div>\n ) : (\n <Play size={24} />\n )}\n </button>\n\n {/* Current Time */}\n <p className=\"text-text-800 text-sm font-medium min-w-[2.5rem]\">\n {formatTime(currentTime)}\n </p>\n\n {/* Progress Bar */}\n <div className=\"flex-1 relative\" data-testid=\"progress-bar\">\n <button\n type=\"button\"\n className=\"w-full h-2 bg-border-100 rounded-full cursor-pointer\"\n onClick={handleProgressClick}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleProgressClick(\n e as unknown as MouseEvent<HTMLButtonElement>\n );\n }\n }}\n aria-label=\"Barra de progresso do áudio\"\n >\n <div\n className=\"h-full bg-primary-600 rounded-full transition-all duration-100\"\n style={{\n width:\n duration > 0 ? `${(currentTime / duration) * 100}%` : '0%',\n }}\n />\n </button>\n </div>\n\n {/* Duration */}\n <p className=\"text-text-800 text-sm font-medium min-w-[2.5rem]\">\n {formatTime(duration)}\n </p>\n\n {/* Volume Control */}\n <div className=\"relative\">\n <button\n type=\"button\"\n onClick={toggleVolumeControl}\n className=\"cursor-pointer text-text-950 hover:text-primary-600\"\n aria-label=\"Controle de volume\"\n >\n <div className=\"w-6 h-6 flex items-center justify-center\">\n {getVolumeIcon()}\n </div>\n </button>\n\n {showVolumeControl && (\n <button\n type=\"button\"\n className=\"absolute bottom-full right-0 mb-2 p-2 bg-background border border-border-100 rounded-lg shadow-lg focus:outline-none focus:ring-2 focus:ring-primary-500\"\n onKeyDown={(e) => {\n if (e.key === 'Escape') {\n setShowVolumeControl(false);\n }\n }}\n >\n <input\n type=\"range\"\n min=\"0\"\n max=\"1\"\n step=\"0.1\"\n value={volume}\n onChange={handleVolumeChange}\n onKeyDown={(e) => {\n if (e.key === 'ArrowUp' || e.key === 'ArrowRight') {\n e.preventDefault();\n const newVolume = Math.min(\n 1,\n Math.round((volume + 0.1) * 10) / 10\n );\n setVolume(newVolume);\n if (audioRef.current) audioRef.current.volume = newVolume;\n } else if (e.key === 'ArrowDown' || e.key === 'ArrowLeft') {\n e.preventDefault();\n const newVolume = Math.max(\n 0,\n Math.round((volume - 0.1) * 10) / 10\n );\n setVolume(newVolume);\n if (audioRef.current) audioRef.current.volume = newVolume;\n }\n }}\n className=\"w-20 h-2 bg-border-100 rounded-lg appearance-none cursor-pointer\"\n style={{\n background: `linear-gradient(to right, #3b82f6 0%, #3b82f6 ${volume * 100}%, #e5e7eb ${volume * 100}%, #e5e7eb 100%)`,\n }}\n aria-label=\"Volume\"\n aria-valuenow={Math.round(volume * 100)}\n aria-valuemin={0}\n aria-valuemax={100}\n />\n </button>\n )}\n </div>\n\n {/* Menu Button */}\n <div className=\"relative\">\n <button\n type=\"button\"\n onClick={toggleSpeedMenu}\n className=\"cursor-pointer text-text-950 hover:text-primary-600\"\n aria-label=\"Opções de velocidade\"\n >\n <DotsThreeVertical size={24} />\n </button>\n\n {showSpeedMenu && (\n <div className=\"absolute bottom-full right-0 mb-2 p-2 bg-background border border-border-100 rounded-lg shadow-lg min-w-24 z-10\">\n <div className=\"flex flex-col gap-1\">\n {[\n { speed: 1, label: '1x' },\n { speed: 1.5, label: '1.5x' },\n { speed: 2, label: '2x' },\n ].map(({ speed, label }) => (\n <button\n key={speed}\n type=\"button\"\n onClick={() => handleSpeedChange(speed)}\n className={cn(\n 'px-3 py-1 text-sm text-left rounded hover:bg-border-50 transition-colors',\n playbackRate === speed\n ? 'bg-primary-950 text-secondary-100 font-medium'\n : 'text-text-950'\n )}\n >\n {label}\n </button>\n ))}\n </div>\n </div>\n )}\n </div>\n </CardBase>\n );\n }\n);\n\ninterface CardSimuladoProps extends HTMLAttributes<HTMLDivElement> {\n title: string;\n duration?: string;\n info: string;\n backgroundColor: 'enem' | 'prova' | 'simuladao' | 'vestibular';\n}\n\nconst SIMULADO_BACKGROUND_CLASSES = {\n enem: 'bg-exam-1',\n prova: 'bg-exam-2',\n simuladao: 'bg-exam-3',\n vestibular: 'bg-exam-4',\n};\n\nconst CardSimulado = forwardRef<HTMLDivElement, CardSimuladoProps>(\n ({ title, duration, info, backgroundColor, className, ...props }, ref) => {\n const backgroundClass = SIMULADO_BACKGROUND_CLASSES[backgroundColor];\n\n return (\n <CardBase\n ref={ref}\n layout=\"horizontal\"\n padding=\"medium\"\n minHeight=\"none\"\n cursor=\"pointer\"\n className={cn(\n `${backgroundClass} hover:shadow-soft-shadow-2 transition-shadow duration-200`,\n className\n )}\n {...props}\n >\n <div className=\"flex justify-between items-center w-full gap-4\">\n <div className=\"flex flex-col gap-1 flex-1 min-w-0\">\n <Text size=\"lg\" weight=\"bold\" className=\"text-text-950 truncate\">\n {title}\n </Text>\n\n <div className=\"flex items-center gap-4 text-text-700\">\n {duration && (\n <div className=\"flex items-center gap-1\">\n <Clock size={16} className=\"flex-shrink-0\" />\n <Text size=\"sm\">{duration}</Text>\n </div>\n )}\n\n <Text size=\"sm\" className=\"truncate\">\n {info}\n </Text>\n </div>\n </div>\n\n <CaretRight\n size={24}\n className=\"text-text-800 flex-shrink-0\"\n data-testid=\"caret-icon\"\n />\n </div>\n </CardBase>\n );\n }\n);\n\ninterface CardTestProps extends Omit<HTMLAttributes<HTMLElement>, 'onSelect'> {\n title: string;\n duration?: string;\n questionsCount?: number;\n additionalInfo?: string;\n selected?: boolean;\n onSelect?: (selected: boolean) => void;\n}\n\nconst CardTest = forwardRef<HTMLElement, CardTestProps>(\n (\n {\n title,\n duration,\n questionsCount,\n additionalInfo,\n selected = false,\n onSelect,\n className = '',\n ...props\n },\n ref\n ) => {\n const handleClick = () => {\n if (onSelect) {\n onSelect(!selected);\n }\n };\n\n const handleKeyDown = (event: KeyboardEvent<HTMLElement>) => {\n if ((event.key === 'Enter' || event.key === ' ') && onSelect) {\n event.preventDefault();\n onSelect(!selected);\n }\n };\n\n const isSelectable = !!onSelect;\n const getQuestionsText = (count: number) => {\n const singular = count === 1 ? 'questão' : 'questões';\n return `${count} ${singular}`;\n };\n\n const displayInfo = questionsCount\n ? getQuestionsText(questionsCount)\n : additionalInfo || '';\n const baseClasses =\n 'flex flex-row items-center p-4 gap-2 w-full max-w-full bg-background shadow-soft-shadow-1 rounded-xl isolate border-0 text-left';\n const interactiveClasses = isSelectable\n ? 'cursor-pointer focus:outline-none focus:ring-2 focus:ring-primary-950 focus:ring-offset-2'\n : '';\n const selectedClasses = selected\n ? 'ring-2 ring-primary-950 ring-offset-2'\n : '';\n\n if (isSelectable) {\n return (\n <button\n ref={ref as Ref<HTMLButtonElement>}\n type=\"button\"\n className={cn(\n `${baseClasses} ${interactiveClasses} ${selectedClasses} ${className}`.trim()\n )}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n aria-pressed={selected}\n {...(props as HTMLAttributes<HTMLButtonElement>)}\n >\n <div className=\"flex flex-col justify-between gap-[27px] flex-grow min-h-[67px] w-full min-w-0\">\n <Text\n size=\"md\"\n weight=\"bold\"\n className=\"text-text-950 tracking-[0.2px] leading-[19px] truncate\"\n >\n {title}\n </Text>\n\n <div className=\"flex flex-row justify-start items-end gap-4 w-full\">\n {duration && (\n <div className=\"flex flex-row items-center gap-1 flex-shrink-0\">\n <Clock size={16} className=\"text-text-700\" />\n <Text\n size=\"sm\"\n className=\"text-text-700 leading-[21px] whitespace-nowrap\"\n >\n {duration}\n </Text>\n </div>\n )}\n\n <Text\n size=\"sm\"\n className=\"text-text-700 leading-[21px] flex-grow truncate\"\n >\n {displayInfo}\n </Text>\n </div>\n </div>\n </button>\n );\n }\n\n return (\n <div\n ref={ref as Ref<HTMLDivElement>}\n className={cn(`${baseClasses} ${className}`.trim())}\n {...(props as HTMLAttributes<HTMLDivElement>)}\n >\n <div className=\"flex flex-col justify-between gap-[27px] flex-grow min-h-[67px] w-full min-w-0\">\n <Text\n size=\"md\"\n weight=\"bold\"\n className=\"text-text-950 tracking-[0.2px] leading-[19px] truncate\"\n >\n {title}\n </Text>\n\n <div className=\"flex flex-row justify-start items-end gap-4 w-full\">\n {duration && (\n <div className=\"flex flex-row items-center gap-1 flex-shrink-0\">\n <Clock size={16} className=\"text-text-700\" />\n <Text\n size=\"sm\"\n className=\"text-text-700 leading-[21px] whitespace-nowrap\"\n >\n {duration}\n </Text>\n </div>\n )}\n\n <Text\n size=\"sm\"\n className=\"text-text-700 leading-[21px] flex-grow truncate min-w-0\"\n >\n {displayInfo}\n </Text>\n </div>\n </div>\n </div>\n );\n }\n);\n\ninterface SimulationItem {\n id: string;\n title: string;\n type: 'enem' | 'prova' | 'simulado' | 'vestibular';\n info: string;\n}\n\ninterface SimulationHistoryData {\n date: string;\n simulations: SimulationItem[];\n}\n\ninterface CardSimulationHistoryProps extends HTMLAttributes<HTMLDivElement> {\n data: SimulationHistoryData[];\n onSimulationClick?: (simulation: SimulationItem) => void;\n}\n\nconst SIMULATION_TYPE_STYLES = {\n enem: {\n background: 'bg-exam-1',\n badge: 'exam1' as const,\n text: 'Enem',\n },\n prova: {\n background: 'bg-exam-2',\n badge: 'exam2' as const,\n text: 'Prova',\n },\n simulado: {\n background: 'bg-exam-3',\n badge: 'exam3' as const,\n text: 'Simulado',\n },\n vestibular: {\n background: 'bg-exam-4',\n badge: 'exam4' as const,\n text: 'Vestibular',\n },\n};\n\nconst CardSimulationHistory = forwardRef<\n HTMLDivElement,\n CardSimulationHistoryProps\n>(({ data, onSimulationClick, className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn('w-full max-w-[992px] h-auto', className)}\n {...props}\n >\n {/* Content */}\n <div className=\"flex flex-col gap-0\">\n {data.map((section, sectionIndex) => (\n <div key={section.date} className=\"flex flex-col\">\n {/* Seção com data */}\n <div\n className={cn(\n 'flex flex-row justify-center items-start px-4 py-6 gap-2 w-full bg-white',\n sectionIndex === 0 ? 'rounded-t-3xl' : ''\n )}\n >\n <Text\n size=\"xs\"\n weight=\"bold\"\n className=\"text-text-800 w-11 flex-shrink-0\"\n >\n {section.date}\n </Text>\n\n <div className=\"flex flex-col gap-2 flex-1\">\n {section.simulations.map((simulation) => {\n const typeStyles = SIMULATION_TYPE_STYLES[simulation.type];\n\n return (\n <CardBase\n key={simulation.id}\n layout=\"horizontal\"\n padding=\"medium\"\n minHeight=\"none\"\n cursor=\"pointer\"\n className={cn(\n `${typeStyles.background} rounded-xl hover:shadow-soft-shadow-2 \n transition-shadow duration-200 h-auto min-h-[61px]`\n )}\n onClick={() => onSimulationClick?.(simulation)}\n >\n <div className=\"flex justify-between items-center w-full gap-2\">\n <div className=\"flex flex-col gap-2 flex-1 min-w-0\">\n <Text\n size=\"lg\"\n weight=\"bold\"\n className=\"text-text-950 truncate\"\n >\n {simulation.title}\n </Text>\n\n <div className=\"flex items-center gap-2\">\n <Badge\n variant=\"examsOutlined\"\n action={typeStyles.badge}\n size=\"medium\"\n >\n {typeStyles.text}\n </Badge>\n\n <Text size=\"sm\" className=\"text-text-800 truncate\">\n {simulation.info}\n </Text>\n </div>\n </div>\n\n <CaretRight\n size={24}\n className=\"text-text-800 flex-shrink-0\"\n data-testid=\"caret-icon\"\n />\n </div>\n </CardBase>\n );\n })}\n </div>\n </div>\n </div>\n ))}\n\n {/* Footer rounded */}\n {data.length > 0 && (\n <div className=\"w-full h-6 bg-white rounded-b-3xl\" />\n )}\n </div>\n </div>\n );\n});\n\nexport {\n CardBase,\n CardActivitiesResults,\n CardQuestions,\n CardProgress,\n CardTopic,\n CardPerformance,\n CardResults,\n CardStatus,\n CardSettings,\n CardSupport,\n CardForum,\n CardAudio,\n CardSimulado,\n CardTest,\n CardSimulationHistory,\n};\n","import { ReactNode } from 'react';\nimport Text from '../Text/Text';\nimport { cn } from '../../utils/utils';\n\n/**\n * Progress bar size variants\n */\ntype ProgressBarSize = 'small' | 'medium';\n\n/**\n * Progress bar color variants\n */\ntype ProgressBarVariant = 'blue' | 'green';\n\n/**\n * Progress bar layout variants\n */\ntype ProgressBarLayout = 'default' | 'stacked' | 'compact';\n\n/**\n * Size configurations using Tailwind classes\n */\nconst SIZE_CLASSES = {\n small: {\n container: 'h-1', // 4px height (h-1 = 4px in Tailwind)\n bar: 'h-1', // 4px height for the fill bar\n spacing: 'gap-2', // 8px gap between label and progress bar\n layout: 'flex-col', // vertical layout for small\n borderRadius: 'rounded-full', // 9999px border radius\n },\n medium: {\n container: 'h-2', // 8px height (h-2 = 8px in Tailwind)\n bar: 'h-2', // 8px height for the fill bar\n spacing: 'gap-2', // 8px gap between progress bar and label\n layout: 'flex-row items-center', // horizontal layout for medium\n borderRadius: 'rounded-lg', // 8px border radius\n },\n} as const;\n\n/**\n * Color configurations using design system colors\n */\nconst VARIANT_CLASSES = {\n blue: {\n background: 'bg-background-300', // Background track color (#D5D4D4)\n fill: 'bg-primary-700', // Blue for activity progress (#2271C4)\n },\n green: {\n background: 'bg-background-300', // Background track color (#D5D4D4)\n fill: 'bg-success-200', // Green for performance (#84D3A2)\n },\n} as const;\n\n/**\n * Type for size classes\n */\ntype SizeClassType = (typeof SIZE_CLASSES)[keyof typeof SIZE_CLASSES];\n\n/**\n * Type for variant classes\n */\ntype VariantClassType = (typeof VARIANT_CLASSES)[keyof typeof VARIANT_CLASSES];\n\n/**\n * Common props shared across all layout components\n */\ninterface BaseLayoutProps {\n className: string;\n label: ReactNode;\n showPercentage: boolean;\n showHitCount: boolean;\n labelClassName: string;\n percentageClassName: string;\n clampedValue: number;\n max: number;\n percentage: number;\n variantClasses: VariantClassType;\n}\n\n/**\n * Dimensions configuration for layouts\n */\ninterface LayoutDimensions {\n width: string;\n height: string;\n}\n\n/**\n * Props for StackedLayout component\n */\ninterface StackedLayoutProps extends BaseLayoutProps {\n dimensions: LayoutDimensions;\n}\n\n/**\n * Props for CompactLayout component\n */\ninterface CompactLayoutProps extends BaseLayoutProps {\n dimensions: LayoutDimensions;\n}\n\n/**\n * Props for DefaultLayout component\n */\ninterface DefaultLayoutProps {\n className: string;\n size: ProgressBarSize;\n sizeClasses: SizeClassType;\n variantClasses: VariantClassType;\n label: ReactNode;\n showPercentage: boolean;\n labelClassName: string;\n percentageClassName: string;\n clampedValue: number;\n max: number;\n percentage: number;\n}\n\n/**\n * ProgressBar component props interface\n */\nexport type ProgressBarProps = {\n /** Progress value between 0 and 100 */\n value: number;\n /** Maximum value (defaults to 100) */\n max?: number;\n /** Size variant of the progress bar */\n size?: ProgressBarSize;\n /** Color variant of the progress bar */\n variant?: ProgressBarVariant;\n /** Layout variant of the progress bar */\n layout?: ProgressBarLayout;\n /** Optional label to display */\n label?: ReactNode;\n /** Show percentage text */\n showPercentage?: boolean;\n /**\n * Show hit count (e.g., \"28 de 30\") instead of percentage\n *\n * PRIORITY: When both showHitCount and showPercentage are true,\n * showHitCount takes precedence (stacked and compact layouts only).\n * Default layout does not support showHitCount.\n */\n showHitCount?: boolean;\n /** Additional CSS classes */\n className?: string;\n /** Label CSS classes */\n labelClassName?: string;\n /** Percentage text CSS classes */\n percentageClassName?: string;\n /** Custom width for stacked layout (defaults to w-[380px]) */\n stackedWidth?: string;\n /** Custom height for stacked layout (defaults to h-[35px]) */\n stackedHeight?: string;\n /** Custom width for compact layout (defaults to w-[131px]) */\n compactWidth?: string;\n /** Custom height for compact layout (defaults to h-[24px]) */\n compactHeight?: string;\n};\n\n/**\n * Helper function to calculate safe progress values\n */\nconst calculateProgressValues = (value: number, max: number) => {\n const safeValue = isNaN(value) ? 0 : value;\n const clampedValue = Math.max(0, Math.min(safeValue, max));\n const percentage = max === 0 ? 0 : (clampedValue / max) * 100;\n\n return { clampedValue, percentage };\n};\n\n/**\n * Helper function to determine if header content should be shown\n */\nconst shouldShowHeader = (\n label: ReactNode,\n showPercentage: boolean,\n showHitCount: boolean\n): boolean => {\n return !!(label || showPercentage || showHitCount);\n};\n\n/**\n * Centralized function to determine display priority and content\n *\n * PRIORITY ORDER (consistent across all layouts):\n * 1. showHitCount (highest priority) - displays \"X de Y\" format\n * 2. showPercentage - displays \"X%\" format\n * 3. label (lowest priority) - displays custom label\n *\n * @param showHitCount - Whether to show hit count format\n * @param showPercentage - Whether to show percentage format\n * @param label - Custom label to display\n * @param clampedValue - Current progress value\n * @param max - Maximum progress value\n * @param percentage - Calculated percentage value\n * @returns Object with content type and formatted content\n */\nconst getDisplayPriority = (\n showHitCount: boolean,\n showPercentage: boolean,\n label: ReactNode,\n clampedValue: number,\n max: number,\n percentage: number\n) => {\n if (showHitCount) {\n return {\n type: 'hitCount' as const,\n content: `${Math.round(clampedValue)} de ${max}`,\n hasMetrics: true,\n };\n }\n\n if (showPercentage) {\n return {\n type: 'percentage' as const,\n content: `${Math.round(percentage)}%`,\n hasMetrics: true,\n };\n }\n\n return {\n type: 'label' as const,\n content: label,\n hasMetrics: false,\n };\n};\n\n/**\n * Parameters for compact layout configuration\n */\ninterface CompactLayoutConfigParams {\n showPercentage: boolean;\n showHitCount: boolean;\n percentage: number;\n clampedValue: number;\n max: number;\n label: ReactNode;\n percentageClassName: string;\n labelClassName: string;\n}\n\n/**\n * Helper function to get compact layout configuration\n *\n * PRIORITY ORDER (consistent across all layouts):\n * 1. showHitCount (highest priority) - displays \"X de Y\" format\n * 2. showPercentage - displays \"X%\" format\n * 3. label (lowest priority) - displays custom label\n *\n * When both showHitCount and showPercentage are true, showHitCount takes precedence.\n */\nconst getCompactLayoutConfig = ({\n showPercentage,\n showHitCount,\n percentage,\n clampedValue,\n max,\n label,\n percentageClassName,\n labelClassName,\n}: CompactLayoutConfigParams) => {\n // Use centralized priority logic for consistency\n const displayPriority = getDisplayPriority(\n showHitCount,\n showPercentage,\n label,\n clampedValue,\n max,\n percentage\n );\n\n return {\n color: displayPriority.hasMetrics ? 'text-primary-600' : 'text-primary-700',\n className: displayPriority.hasMetrics\n ? percentageClassName\n : labelClassName,\n content: displayPriority.content,\n };\n};\n\n/**\n * Helper function to get default layout display configuration\n *\n * PRIORITY ORDER for default layout (showHitCount is not supported):\n * 1. showPercentage (when enabled, takes precedence over label)\n * 2. label (shown only when showPercentage is false)\n *\n * Note: Default layout does not support showHitCount feature.\n */\nconst getDefaultLayoutDisplayConfig = (\n size: ProgressBarSize,\n label: ReactNode,\n showPercentage: boolean\n) => ({\n showHeader: size === 'small' && !!(label || showPercentage),\n showPercentage: size === 'medium' && showPercentage,\n showLabel: size === 'medium' && !!label && !showPercentage, // Only show label when percentage is not shown\n});\n\n/**\n * Helper function to render hit count or percentage display for stacked layout\n *\n * PRIORITY ORDER (consistent across all layouts):\n * 1. showHitCount (highest priority) - displays \"X de Y\" format\n * 2. showPercentage - displays \"X%\" format\n *\n * When both showHitCount and showPercentage are true, showHitCount takes precedence.\n */\nconst renderStackedHitCountDisplay = (\n showHitCount: boolean,\n showPercentage: boolean,\n clampedValue: number,\n max: number,\n percentage: number,\n percentageClassName: string\n): ReactNode => {\n if (!showHitCount && !showPercentage) return null;\n\n // Use centralized priority logic for consistency\n const displayPriority = getDisplayPriority(\n showHitCount,\n showPercentage,\n null, // label is not relevant for stacked layout metrics display\n clampedValue,\n max,\n percentage\n );\n\n return (\n <div\n className={cn(\n 'text-xs font-medium leading-[14px] text-right',\n percentageClassName\n )}\n >\n {displayPriority.type === 'hitCount' ? (\n <>\n <span className=\"text-success-200\">{Math.round(clampedValue)}</span>\n <span className=\"text-text-600\"> de {max}</span>\n </>\n ) : (\n <Text size=\"xs\" weight=\"medium\" className=\"text-success-200\">\n {Math.round(percentage)}%\n </Text>\n )}\n </div>\n );\n};\n\n/**\n * Base progress bar component with common rendering logic\n */\nconst ProgressBarBase = ({\n clampedValue,\n max,\n percentage,\n label,\n variantClasses,\n containerClassName,\n fillClassName,\n}: {\n clampedValue: number;\n max: number;\n percentage: number;\n label: ReactNode;\n variantClasses: VariantClassType;\n containerClassName: string;\n fillClassName: string;\n}) => (\n <div\n className={cn(\n containerClassName,\n variantClasses.background,\n 'overflow-hidden relative'\n )}\n >\n <progress\n value={clampedValue}\n max={max}\n aria-label={\n typeof label === 'string'\n ? `${label}: ${Math.round(percentage)}% complete`\n : `Progress: ${Math.round(percentage)}% of ${max}`\n }\n className=\"absolute inset-0 w-full h-full opacity-0\"\n />\n <div\n className={cn(\n fillClassName,\n variantClasses.fill,\n 'transition-all duration-300 ease-out'\n )}\n style={{ width: `${percentage}%` }}\n />\n </div>\n);\n\n/**\n * Stacked layout component\n */\nconst StackedLayout = ({\n className,\n label,\n showPercentage,\n showHitCount,\n labelClassName,\n percentageClassName,\n clampedValue,\n max,\n percentage,\n variantClasses,\n dimensions,\n}: StackedLayoutProps) => (\n <div\n className={cn(\n 'flex flex-col items-start gap-2',\n dimensions.width,\n dimensions.height,\n className\n )}\n >\n {shouldShowHeader(label, showPercentage, showHitCount) && (\n <div className=\"flex flex-row justify-between items-center w-full h-[19px]\">\n {label && (\n <Text\n as=\"div\"\n size=\"md\"\n weight=\"medium\"\n className={cn('text-text-600 leading-[19px]', labelClassName)}\n >\n {label}\n </Text>\n )}\n\n {renderStackedHitCountDisplay(\n showHitCount,\n showPercentage,\n clampedValue,\n max,\n percentage,\n percentageClassName\n )}\n </div>\n )}\n\n <ProgressBarBase\n clampedValue={clampedValue}\n max={max}\n percentage={percentage}\n label={label}\n variantClasses={variantClasses}\n containerClassName=\"w-full h-2 rounded-lg\"\n fillClassName=\"h-2 rounded-lg shadow-hard-shadow-3\"\n />\n </div>\n);\n\n/**\n * Compact layout component\n */\nconst CompactLayout = ({\n className,\n label,\n showPercentage,\n showHitCount,\n labelClassName,\n percentageClassName,\n clampedValue,\n max,\n percentage,\n variantClasses,\n dimensions,\n}: CompactLayoutProps) => {\n const {\n color,\n className: compactClassName,\n content,\n } = getCompactLayoutConfig({\n showPercentage,\n showHitCount,\n percentage,\n clampedValue,\n max,\n label,\n percentageClassName,\n labelClassName,\n });\n\n return (\n <div\n className={cn(\n 'flex flex-col items-start gap-1',\n dimensions.width,\n dimensions.height,\n className\n )}\n >\n {shouldShowHeader(label, showPercentage, showHitCount) && (\n <Text\n as=\"div\"\n size=\"sm\"\n weight=\"medium\"\n color={color}\n className={cn('leading-4 w-full', compactClassName)}\n >\n {content}\n </Text>\n )}\n\n <ProgressBarBase\n clampedValue={clampedValue}\n max={max}\n percentage={percentage}\n label={label}\n variantClasses={variantClasses}\n containerClassName=\"w-full h-1 rounded-full\"\n fillClassName=\"h-1 rounded-full\"\n />\n </div>\n );\n};\n\n/**\n * Default layout component\n */\nconst DefaultLayout = ({\n className,\n size,\n sizeClasses,\n variantClasses,\n label,\n showPercentage,\n labelClassName,\n percentageClassName,\n clampedValue,\n max,\n percentage,\n}: DefaultLayoutProps) => {\n const gapClass = size === 'medium' ? 'gap-2' : sizeClasses.spacing;\n const progressBarClass = size === 'medium' ? 'flex-grow' : 'w-full';\n const displayConfig = getDefaultLayoutDisplayConfig(\n size,\n label,\n showPercentage\n );\n\n return (\n <div className={cn('flex', sizeClasses.layout, gapClass, className)}>\n {displayConfig.showHeader && (\n <div className=\"flex flex-row items-center justify-between w-full\">\n {label && (\n <Text\n as=\"div\"\n size=\"xs\"\n weight=\"medium\"\n className={cn(\n 'text-text-950 leading-none tracking-normal text-center',\n labelClassName\n )}\n >\n {label}\n </Text>\n )}\n\n {showPercentage && (\n <Text\n size=\"xs\"\n weight=\"medium\"\n className={cn(\n 'text-text-950 leading-none tracking-normal text-center',\n percentageClassName\n )}\n >\n {Math.round(percentage)}%\n </Text>\n )}\n </div>\n )}\n\n <ProgressBarBase\n clampedValue={clampedValue}\n max={max}\n percentage={percentage}\n label={label}\n variantClasses={variantClasses}\n containerClassName={cn(\n progressBarClass,\n sizeClasses.container,\n sizeClasses.borderRadius\n )}\n fillClassName={cn(\n sizeClasses.bar,\n sizeClasses.borderRadius,\n 'shadow-hard-shadow-3'\n )}\n />\n\n {displayConfig.showPercentage && (\n <Text\n size=\"xs\"\n weight=\"medium\"\n className={cn(\n 'text-text-950 leading-none tracking-normal text-center flex-none',\n percentageClassName\n )}\n >\n {Math.round(percentage)}%\n </Text>\n )}\n\n {displayConfig.showLabel && (\n <Text\n as=\"div\"\n size=\"xs\"\n weight=\"medium\"\n className={cn(\n 'text-text-950 leading-none tracking-normal text-center flex-none',\n labelClassName\n )}\n >\n {label}\n </Text>\n )}\n </div>\n );\n};\n\n/**\n * ProgressBar component for Analytica Ensino platforms\n *\n * A progress bar component with size and color variants designed for tracking\n * activity progress (blue) and performance metrics (green).\n * Uses the Analytica Ensino Design System colors from styles.css with automatic\n * light/dark mode support. Includes Text component integration for consistent typography.\n *\n * CONTENT DISPLAY PRIORITY (Consistent across all layouts):\n * 1. showHitCount (highest) - \"X de Y\" format (stacked/compact only)\n * 2. showPercentage - \"X%\" format\n * 3. label (lowest) - Custom label text\n *\n * When multiple display options are enabled, higher priority options take precedence.\n *\n * @example\n * ```tsx\n * // Basic progress bar\n * <ProgressBar value={65} />\n *\n * // Activity progress (blue)\n * <ProgressBar variant=\"blue\" value={45} label=\"Progress\" showPercentage />\n *\n * // Performance metrics (green)\n * <ProgressBar variant=\"green\" size=\"medium\" value={85} label=\"Performance\" />\n *\n * // Small size with custom max value\n * <ProgressBar size=\"small\" value={3} max={5} showPercentage />\n *\n * // Stacked layout with fixed width and hit count\n * <ProgressBar layout=\"stacked\" variant=\"green\" value={28} max={30} label=\"Fáceis\" showHitCount />\n *\n * // Compact layout for small cards\n * <ProgressBar layout=\"compact\" variant=\"blue\" value={70} label=\"Questão 08\" />\n * ```\n */\nconst ProgressBar = ({\n value,\n max = 100,\n size = 'medium',\n variant = 'blue',\n layout = 'default',\n label,\n showPercentage = false,\n showHitCount = false,\n className = '',\n labelClassName = '',\n percentageClassName = '',\n stackedWidth,\n stackedHeight,\n compactWidth,\n compactHeight,\n}: ProgressBarProps) => {\n const { clampedValue, percentage } = calculateProgressValues(value, max);\n const sizeClasses = SIZE_CLASSES[size];\n const variantClasses = VARIANT_CLASSES[variant];\n\n if (layout === 'stacked') {\n return (\n <StackedLayout\n className={className}\n label={label}\n showPercentage={showPercentage}\n showHitCount={showHitCount}\n labelClassName={labelClassName}\n percentageClassName={percentageClassName}\n clampedValue={clampedValue}\n max={max}\n percentage={percentage}\n variantClasses={variantClasses}\n dimensions={{\n width: stackedWidth ?? 'w-[380px]',\n height: stackedHeight ?? 'h-[35px]',\n }}\n />\n );\n }\n\n if (layout === 'compact') {\n return (\n <CompactLayout\n className={className}\n label={label}\n showPercentage={showPercentage}\n showHitCount={showHitCount}\n labelClassName={labelClassName}\n percentageClassName={percentageClassName}\n clampedValue={clampedValue}\n max={max}\n percentage={percentage}\n variantClasses={variantClasses}\n dimensions={{\n width: compactWidth ?? 'w-[131px]',\n height: compactHeight ?? 'h-[24px]',\n }}\n />\n );\n }\n\n return (\n <DefaultLayout\n className={className}\n size={size}\n sizeClasses={sizeClasses}\n variantClasses={variantClasses}\n label={label}\n showPercentage={showPercentage}\n labelClassName={labelClassName}\n percentageClassName={percentageClassName}\n clampedValue={clampedValue}\n max={max}\n percentage={percentage}\n />\n );\n};\n\nexport default ProgressBar;\n","import { ReactNode } from 'react';\nimport Text from '../Text/Text';\nimport { cn } from '../../utils/utils';\n\n/**\n * Progress circle size variants\n */\ntype ProgressCircleSize = 'small' | 'medium';\n\n/**\n * Progress circle color variants\n */\ntype ProgressCircleVariant = 'blue' | 'green';\n\n/**\n * Size configurations using Tailwind classes\n */\nconst SIZE_CLASSES = {\n small: {\n container: 'w-[90px] h-[90px]', // 90px circle from design specs\n strokeWidth: 4, // 4px stroke width - matches ProgressBar small (h-1)\n textSize: '2xl', // 24px for percentage (font-size: 24px)\n textWeight: 'medium', // font-weight: 500\n labelSize: '2xs' as const, // Will be overridden with custom 8px in className\n labelWeight: 'bold', // font-weight: 700\n spacing: 'gap-0', // Reduced gap between percentage and label for better spacing\n contentWidth: 'max-w-[50px]', // Reduced width to fit text inside circle\n },\n medium: {\n container: 'w-[152px] h-[152px]', // 151.67px ≈ 152px circle from design specs\n strokeWidth: 8, // 8px stroke width - matches ProgressBar medium (h-2)\n textSize: '2xl', // 24px for percentage (font-size: 24px)\n textWeight: 'medium', // font-weight: 500\n labelSize: 'xs' as const, // 12px for status label (font-size: 12px)\n labelWeight: 'medium', // font-weight: 500 (changed from bold)\n spacing: 'gap-1', // 4px gap between percentage and label\n contentWidth: 'max-w-[90px]', // Reduced width to fit text inside circle\n },\n} as const;\n\n/**\n * Color configurations using design system colors\n */\nconst VARIANT_CLASSES = {\n blue: {\n background: 'stroke-primary-100', // Light blue background (#BBDCF7)\n fill: 'stroke-primary-700', // Blue for activity progress (#2271C4)\n textColor: 'text-primary-700', // Blue text color (#2271C4)\n labelColor: 'text-text-700', // Gray text for label (#525252)\n },\n green: {\n background: 'stroke-background-300', // Gray background (#D5D4D4 - matches design)\n fill: 'stroke-success-200', // Green for performance (#84D3A2 - matches design)\n textColor: 'text-text-800', // Dark gray text (#404040 - matches design)\n labelColor: 'text-text-600', // Medium gray text for label (#737373 - matches design)\n },\n} as const;\n\n/**\n * ProgressCircle component props interface\n */\nexport type ProgressCircleProps = {\n /** Progress value between 0 and 100 */\n value: number;\n /** Maximum value (defaults to 100) */\n max?: number;\n /** Size variant of the progress circle */\n size?: ProgressCircleSize;\n /** Color variant of the progress circle */\n variant?: ProgressCircleVariant;\n /** Optional label to display below percentage */\n label?: ReactNode;\n /** Show percentage text */\n showPercentage?: boolean;\n /** Additional CSS classes */\n className?: string;\n /** Label CSS classes */\n labelClassName?: string;\n /** Percentage text CSS classes */\n percentageClassName?: string;\n};\n\n/**\n * ProgressCircle component for Analytica Ensino platforms\n *\n * A circular progress indicator with size and color variants designed for tracking\n * activity progress (blue) and performance metrics (green).\n * Uses the Analytica Ensino Design System colors from styles.css with automatic\n * light/dark mode support. Includes Text component integration for consistent typography.\n *\n * @example\n * ```tsx\n * // Basic progress circle\n * <ProgressCircle value={65} />\n *\n * // Activity progress (blue)\n * <ProgressCircle variant=\"blue\" value={45} label=\"CONCLUÍDO\" showPercentage />\n *\n * // Performance metrics (green)\n * <ProgressCircle variant=\"green\" size=\"medium\" value={85} label=\"MÉDIA\" />\n *\n * // Small size with custom max value\n * <ProgressCircle size=\"small\" value={3} max={5} showPercentage />\n * ```\n */\nconst ProgressCircle = ({\n value,\n max = 100,\n size = 'small',\n variant = 'blue',\n label,\n showPercentage = true,\n className = '',\n labelClassName = '',\n percentageClassName = '',\n}: ProgressCircleProps) => {\n // Ensure value is within bounds and handle NaN/Infinity\n const safeValue = isNaN(value) ? 0 : value;\n const clampedValue = Math.max(0, Math.min(safeValue, max));\n const percentage = max === 0 ? 0 : (clampedValue / max) * 100;\n\n // Get size and variant classes\n const sizeClasses = SIZE_CLASSES[size];\n const variantClasses = VARIANT_CLASSES[variant];\n\n // Calculate SVG dimensions and stroke properties\n const radius = size === 'small' ? 37 : 64; // Radius calculation based on container size\n const circumference = 2 * Math.PI * radius;\n const strokeDashoffset = circumference - (percentage / 100) * circumference;\n const center = size === 'small' ? 45 : 76; // Center point of SVG\n const svgSize = size === 'small' ? 90 : 152; // SVG viewBox size\n\n return (\n <div\n className={cn(\n 'relative flex flex-col items-center justify-center',\n sizeClasses.container,\n 'rounded-lg',\n className\n )}\n >\n {/* Progress circle SVG */}\n <svg\n className=\"absolute inset-0 transform -rotate-90\"\n width={svgSize}\n height={svgSize}\n viewBox={`0 0 ${svgSize} ${svgSize}`}\n aria-hidden=\"true\"\n >\n {/* Background circle */}\n <circle\n cx={center}\n cy={center}\n r={radius}\n fill=\"none\"\n strokeWidth={sizeClasses.strokeWidth}\n className={cn(variantClasses.background, 'rounded-lg')}\n />\n {/* Progress circle - SVG stroke properties require style for animation */}\n <circle\n cx={center}\n cy={center}\n r={radius}\n fill=\"none\"\n strokeWidth={sizeClasses.strokeWidth}\n strokeLinecap=\"round\"\n strokeDasharray={circumference}\n strokeDashoffset={strokeDashoffset}\n className={cn(\n variantClasses.fill,\n 'transition-all duration-500 ease-out shadow-soft-shadow-3 rounded-lg'\n )}\n />\n </svg>\n\n {/* Native progress element for accessibility */}\n <progress\n value={clampedValue}\n max={max}\n aria-label={typeof label === 'string' ? label : 'Progress'}\n className=\"absolute opacity-0 w-0 h-0\"\n />\n\n {/* Content overlay - centered content */}\n <div\n className={cn(\n 'relative z-10 flex flex-col items-center justify-center',\n sizeClasses.spacing,\n sizeClasses.contentWidth\n )}\n >\n {/* Percentage text */}\n {showPercentage && (\n <Text\n size={sizeClasses.textSize}\n weight={sizeClasses.textWeight}\n className={cn(\n 'text-center w-full',\n variantClasses.textColor,\n percentageClassName\n )}\n >\n {Math.round(percentage)}%\n </Text>\n )}\n\n {/* Label text */}\n {label && (\n <Text\n as=\"span\"\n size={sizeClasses.labelSize}\n weight={sizeClasses.labelWeight}\n className={cn(\n variantClasses.labelColor,\n 'text-center uppercase tracking-wide truncate w-full',\n labelClassName\n )}\n >\n {label}\n </Text>\n )}\n </div>\n </div>\n );\n};\n\nexport default ProgressCircle;\n","import { HtmlHTMLAttributes, useEffect, useState } from 'react';\nimport CheckboxList, { CheckboxListItem } from '../CheckBox/CheckboxList';\nimport { cn } from '../../utils/utils';\nimport { CheckCircle, XCircle, Check } from 'phosphor-react';\nimport Badge from '../Badge/Badge';\n\ninterface Choice {\n value: string;\n label: string;\n status?: 'correct' | 'incorrect' | 'neutral';\n disabled?: boolean;\n}\n\ninterface MultipleChoiceListProps extends HtmlHTMLAttributes<HTMLDivElement> {\n choices: Choice[];\n disabled?: boolean;\n name?: string;\n selectedValues?: string[];\n onHandleSelectedValues?: (values: string[]) => void;\n mode?: 'interactive' | 'readonly';\n}\n\nconst MultipleChoiceList = ({\n disabled = false,\n className = '',\n choices,\n name,\n selectedValues,\n onHandleSelectedValues,\n mode = 'interactive',\n}: MultipleChoiceListProps) => {\n const [actualValue, setActualValue] = useState(selectedValues);\n\n useEffect(() => {\n setActualValue(selectedValues);\n }, [selectedValues]);\n const getStatusBadge = (status: Choice['status']) => {\n switch (status) {\n case 'correct':\n return (\n <Badge variant=\"solid\" action=\"success\" iconLeft={<CheckCircle />}>\n Resposta correta\n </Badge>\n );\n case 'incorrect':\n return (\n <Badge variant=\"solid\" action=\"error\" iconLeft={<XCircle />}>\n Resposta incorreta\n </Badge>\n );\n default:\n return null;\n }\n };\n\n const getStatusStyles = (status: Choice['status']) => {\n switch (status) {\n case 'correct':\n return 'bg-success-background border-success-300';\n case 'incorrect':\n return 'bg-error-background border-error-300';\n default:\n return `bg-background border-border-100`;\n }\n };\n\n const renderVisualCheckbox = (isSelected: boolean, isDisabled: boolean) => {\n const checkboxClasses = cn(\n 'w-5 h-5 rounded border-2 cursor-default transition-all duration-200 flex items-center justify-center',\n isSelected\n ? 'border-primary-950 bg-primary-950 text-text'\n : 'border-border-400 bg-background',\n isDisabled && 'opacity-40 cursor-not-allowed'\n );\n\n return (\n <div className={checkboxClasses}>\n {isSelected && <Check size={16} weight=\"bold\" />}\n </div>\n );\n };\n\n if (mode === 'readonly') {\n return (\n <div className={cn('flex flex-col gap-2', className)}>\n {choices.map((choice, i) => {\n const isSelected = actualValue?.includes(choice.value) || false;\n const statusStyles = getStatusStyles(choice.status);\n const statusBadge = getStatusBadge(choice.status);\n\n return (\n <div\n key={`readonly-${choice.value}-${i}`}\n className={cn(\n 'flex flex-row justify-between gap-2 items-start p-2 rounded-lg transition-all',\n statusStyles,\n choice.disabled ? 'opacity-50 cursor-not-allowed' : ''\n )}\n >\n <div className=\"flex items-center gap-2 flex-1\">\n {renderVisualCheckbox(isSelected, choice.disabled || disabled)}\n <span\n className={cn(\n 'flex-1',\n isSelected || (choice.status && choice.status != 'neutral')\n ? 'text-text-950'\n : 'text-text-600',\n choice.disabled || disabled\n ? 'cursor-not-allowed'\n : 'cursor-default'\n )}\n >\n {choice.label}\n </span>\n </div>\n {statusBadge && (\n <div className=\"flex-shrink-0\">{statusBadge}</div>\n )}\n </div>\n );\n })}\n </div>\n );\n }\n return (\n <div\n className={cn(\n 'flex flex-row justify-between gap-2 items-start p-2 rounded-lg transition-all',\n disabled ? 'opacity-50 cursor-not-allowed' : '',\n className\n )}\n >\n <CheckboxList\n name={name}\n values={actualValue}\n onValuesChange={(v) => {\n setActualValue(v);\n onHandleSelectedValues?.(v);\n }}\n disabled={disabled}\n >\n {choices.map((choice, i) => (\n <div\n key={`interactive-${choice.value}-${i}`}\n className=\"flex flex-row gap-2 items-center\"\n >\n <CheckboxListItem\n value={choice.value}\n id={`interactive-${choice.value}-${i}`}\n disabled={choice.disabled || disabled}\n />\n\n <label\n htmlFor={`interactive-${choice.value}-${i}`}\n className={cn(\n 'flex-1',\n actualValue?.includes(choice.value)\n ? 'text-text-950'\n : 'text-text-600',\n choice.disabled || disabled\n ? 'cursor-not-allowed'\n : 'cursor-pointer'\n )}\n >\n {choice.label}\n </label>\n </div>\n ))}\n </CheckboxList>\n </div>\n );\n};\n\nexport { MultipleChoiceList };\n","import {\n InputHTMLAttributes,\n HTMLAttributes,\n ReactNode,\n forwardRef,\n useId,\n useEffect,\n useRef,\n Children,\n cloneElement,\n isValidElement,\n ReactElement,\n} from 'react';\nimport { create, StoreApi, useStore } from 'zustand';\nimport CheckBox from './CheckBox';\nimport { cn } from '../../utils/utils';\n\n/**\n * CheckboxList size variants\n */\ntype CheckboxListSize = 'small' | 'medium' | 'large';\n\n/**\n * CheckboxList visual state\n */\ntype CheckboxListState =\n | 'default'\n | 'hovered'\n | 'focused'\n | 'invalid'\n | 'disabled';\n\n/**\n * CheckboxList store interface\n */\ninterface CheckboxListStore {\n values: string[];\n setValues: (values: string[]) => void;\n toggleValue: (value: string) => void;\n onValuesChange?: (values: string[]) => void;\n disabled: boolean;\n name: string;\n}\n\ntype CheckboxListStoreApi = StoreApi<CheckboxListStore>;\n\n/**\n * Create a new CheckboxList store\n */\nconst createCheckboxListStore = (\n name: string,\n defaultValues: string[],\n disabled: boolean,\n onValuesChange?: (values: string[]) => void\n): CheckboxListStoreApi =>\n create<CheckboxListStore>((set, get) => ({\n values: defaultValues,\n setValues: (values) => {\n if (!get().disabled) {\n set({ values });\n get().onValuesChange?.(values);\n }\n },\n toggleValue: (value) => {\n if (!get().disabled) {\n const currentValues = get().values;\n const newValues = currentValues.includes(value)\n ? currentValues.filter((v) => v !== value)\n : [...currentValues, value];\n set({ values: newValues });\n get().onValuesChange?.(newValues);\n }\n },\n onValuesChange,\n disabled,\n name,\n }));\n\n/**\n * Hook to access CheckboxList store\n */\nexport const useCheckboxListStore = (externalStore?: CheckboxListStoreApi) => {\n if (!externalStore) {\n throw new Error('CheckboxListItem must be used within a CheckboxList');\n }\n return externalStore;\n};\n\n/**\n * Inject store into CheckboxListItem children\n */\nconst injectStore = (\n children: ReactNode,\n store: CheckboxListStoreApi\n): ReactNode =>\n Children.map(children, (child) => {\n if (!isValidElement(child)) return child;\n const typedChild = child as ReactElement<CheckboxListItemProps>;\n const shouldInject = typedChild.type === CheckboxListItem;\n return cloneElement(typedChild, {\n ...(shouldInject ? { store } : {}),\n ...(typedChild.props.children\n ? { children: injectStore(typedChild.props.children, store) }\n : {}),\n });\n });\n\n/**\n * CheckboxList component props interface\n */\nexport type CheckboxListProps = {\n /** Current selected values */\n values?: string[];\n /** Default selected values for uncontrolled usage */\n defaultValues?: string[];\n /** Callback when selection changes */\n onValuesChange?: (values: string[]) => void;\n /** Group name for all checkboxes */\n name?: string;\n /** Disabled state for the entire group */\n disabled?: boolean;\n /** Additional CSS classes */\n className?: string;\n /** Children components */\n children: ReactNode;\n} & Omit<HTMLAttributes<HTMLDivElement>, 'onChange' | 'defaultValues'>;\n\n/**\n * CheckboxList component for flexible checkbox group composition\n *\n * Uses Zustand for state management with automatic store injection.\n * Allows complete control over layout and styling by composing with CheckboxListItem.\n *\n * @example\n * ```tsx\n * <CheckboxList defaultValues={[\"option1\"]} onValuesChange={setValues}>\n * <div className=\"flex items-center gap-3\">\n * <CheckboxListItem value=\"option1\" id=\"c1\" />\n * <label htmlFor=\"c1\">Option 1</label>\n * </div>\n * <div className=\"flex items-center gap-3\">\n * <CheckboxListItem value=\"option2\" id=\"c2\" />\n * <label htmlFor=\"c2\">Option 2</label>\n * </div>\n * </CheckboxList>\n * ```\n */\nconst CheckboxList = forwardRef<HTMLDivElement, CheckboxListProps>(\n (\n {\n values: propValues,\n defaultValues = [],\n onValuesChange,\n name: propName,\n disabled = false,\n className = '',\n children,\n ...props\n },\n ref\n ) => {\n // Generate unique name if not provided\n const generatedId = useId();\n const name = propName || `checkbox-list-${generatedId}`;\n\n // Create store reference\n const storeRef = useRef<CheckboxListStoreApi>(null);\n storeRef.current ??= createCheckboxListStore(\n name,\n defaultValues,\n disabled,\n onValuesChange\n );\n const store = storeRef.current;\n\n // Get store actions\n const { setValues } = useStore(store, (s) => s);\n\n // Call onValuesChange with initial values\n useEffect(() => {\n const currentValues = store.getState().values;\n if (currentValues.length > 0 && onValuesChange) {\n onValuesChange(currentValues);\n }\n }, []);\n\n // Handle controlled values changes\n useEffect(() => {\n if (propValues !== undefined) {\n setValues(propValues);\n }\n }, [propValues, setValues]);\n\n // Update disabled state\n useEffect(() => {\n store.setState({ disabled });\n }, [disabled, store]);\n\n return (\n <div\n ref={ref}\n className={cn('flex flex-col gap-2 w-full', className)}\n aria-label={name}\n {...props}\n >\n {injectStore(children, store)}\n </div>\n );\n }\n);\n\nCheckboxList.displayName = 'CheckboxList';\n\n/**\n * CheckboxListItem component props interface\n */\nexport type CheckboxListItemProps = {\n /** Value for this checkbox item */\n value: string;\n /** Store reference (automatically injected by CheckboxList) */\n store?: CheckboxListStoreApi;\n /** Disabled state for this specific item */\n disabled?: boolean;\n /** Size variant */\n size?: CheckboxListSize;\n /** Visual state */\n state?: CheckboxListState;\n /** Additional CSS classes */\n className?: string;\n} & Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'type' | 'name' | 'value' | 'checked' | 'onChange' | 'size'\n>;\n\n/**\n * CheckboxListItem component for use within CheckboxList\n *\n * A checkbox without label that works within CheckboxList context.\n * Provides just the checkbox input for maximum flexibility in composition.\n *\n * @example\n * ```tsx\n * <CheckboxList defaultValues={[\"option1\"]}>\n * <div className=\"flex items-center gap-3\">\n * <CheckboxListItem value=\"option1\" id=\"c1\" />\n * <label htmlFor=\"c1\">Option 1</label>\n * </div>\n * </CheckboxList>\n * ```\n */\nconst CheckboxListItem = forwardRef<HTMLInputElement, CheckboxListItemProps>(\n (\n {\n value,\n store: externalStore,\n disabled: itemDisabled,\n size = 'medium',\n state = 'default',\n className = '',\n id,\n ...props\n },\n ref\n ) => {\n // Get store and state\n const store = useCheckboxListStore(externalStore);\n const {\n values: groupValues,\n toggleValue,\n disabled: groupDisabled,\n name,\n } = useStore(store);\n\n // Generate unique ID if not provided\n const generatedId = useId();\n const inputId = id ?? `checkbox-item-${generatedId}`;\n\n // Determine states\n const isChecked = groupValues.includes(value);\n const isDisabled = groupDisabled || itemDisabled;\n const currentState = isDisabled ? 'disabled' : state;\n\n // Use standard CheckBox component for consistency and simplicity\n return (\n <CheckBox\n ref={ref}\n id={inputId}\n name={name}\n value={value}\n checked={isChecked}\n disabled={isDisabled}\n size={size}\n state={currentState}\n className={className}\n onChange={() => {\n if (!isDisabled) {\n toggleValue(value);\n }\n }}\n {...props}\n />\n );\n }\n);\n\nCheckboxListItem.displayName = 'CheckboxListItem';\n\nexport default CheckboxList;\nexport { CheckboxListItem };\n","import {\n InputHTMLAttributes,\n ReactNode,\n forwardRef,\n useState,\n useId,\n ChangeEvent,\n} from 'react';\nimport Text from '../Text/Text';\nimport { Check, Minus } from 'phosphor-react';\nimport { cn } from '../../utils/utils';\n\n/**\n * CheckBox size variants\n */\ntype CheckBoxSize = 'small' | 'medium' | 'large';\n\n/**\n * CheckBox visual state\n */\ntype CheckBoxState = 'default' | 'hovered' | 'focused' | 'invalid' | 'disabled';\n\n/**\n * Size configurations using Tailwind classes\n */\nconst SIZE_CLASSES = {\n small: {\n checkbox: 'w-4 h-4', // 16px x 16px\n textSize: 'sm' as const,\n spacing: 'gap-1.5', // 6px\n borderWidth: 'border-2',\n iconSize: 14, // pixels for Phosphor icons\n labelHeight: 'h-[21px]',\n },\n medium: {\n checkbox: 'w-5 h-5', // 20px x 20px\n textSize: 'md' as const,\n spacing: 'gap-2', // 8px\n borderWidth: 'border-2',\n iconSize: 16, // pixels for Phosphor icons\n labelHeight: 'h-6',\n },\n large: {\n checkbox: 'w-6 h-6', // 24px x 24px\n textSize: 'lg' as const,\n spacing: 'gap-2', // 8px\n borderWidth: 'border-[3px]', // 3px border\n iconSize: 20, // pixels for Phosphor icons\n labelHeight: 'h-[27px]',\n },\n} as const;\n\n/**\n * Base checkbox styling classes using design system colors\n */\nconst BASE_CHECKBOX_CLASSES =\n 'rounded border cursor-pointer transition-all duration-200 flex items-center justify-center focus:outline-none';\n\n/**\n * State-based styling classes using design system colors from styles.css\n */\nconst STATE_CLASSES = {\n default: {\n unchecked: 'border-border-400 bg-background hover:border-border-500',\n checked:\n 'border-primary-950 bg-primary-950 text-text hover:border-primary-800 hover:bg-primary-800',\n },\n hovered: {\n unchecked: 'border-border-500 bg-background',\n checked: 'border-primary-800 bg-primary-800 text-text',\n },\n focused: {\n unchecked:\n 'border-indicator-info bg-background ring-2 ring-indicator-info/20',\n checked:\n 'border-indicator-info bg-primary-950 text-text ring-2 ring-indicator-info/20',\n },\n invalid: {\n unchecked: 'border-error-700 bg-background hover:border-error-600',\n checked: 'border-error-700 bg-primary-950 text-text',\n },\n disabled: {\n unchecked: 'border-border-400 bg-background cursor-not-allowed opacity-40',\n checked:\n 'border-primary-600 bg-primary-600 text-text cursor-not-allowed opacity-40',\n },\n} as const;\n\n/**\n * CheckBox component props interface\n */\nexport type CheckBoxProps = {\n /** Label text to display next to the checkbox */\n label?: ReactNode;\n /** Size variant of the checkbox */\n size?: CheckBoxSize;\n /** Visual state of the checkbox */\n state?: CheckBoxState;\n /** Indeterminate state for partial selections */\n indeterminate?: boolean;\n /** Error message to display */\n errorMessage?: string;\n /** Helper text to display */\n helperText?: string;\n /** Additional CSS classes */\n className?: string;\n /** Label CSS classes */\n labelClassName?: string;\n} & Omit<InputHTMLAttributes<HTMLInputElement>, 'size' | 'type'>;\n\n/**\n * CheckBox component for Analytica Ensino platforms\n *\n * A checkbox component with essential states, sizes and themes.\n * Uses the Analytica Ensino Design System colors from styles.css with automatic\n * light/dark mode support. Includes Text component integration for consistent typography.\n *\n * @example\n * ```tsx\n * // Basic checkbox\n * <CheckBox label=\"Option\" />\n *\n * // Small size\n * <CheckBox size=\"small\" label=\"Small option\" />\n *\n * // Invalid state\n * <CheckBox state=\"invalid\" label=\"Required field\" />\n *\n * // Disabled state\n * <CheckBox disabled label=\"Disabled option\" />\n * ```\n */\nconst CheckBox = forwardRef<HTMLInputElement, CheckBoxProps>(\n (\n {\n label,\n size = 'medium',\n state = 'default',\n indeterminate = false,\n errorMessage,\n helperText,\n className = '',\n labelClassName = '',\n checked: checkedProp,\n disabled,\n id,\n onChange,\n ...props\n },\n ref\n ) => {\n // Generate unique ID if not provided\n const generatedId = useId();\n const inputId = id ?? `checkbox-${generatedId}`;\n\n // Handle controlled vs uncontrolled behavior\n const [internalChecked, setInternalChecked] = useState(false);\n const isControlled = checkedProp !== undefined;\n const checked = isControlled ? checkedProp : internalChecked;\n\n // Handle change events\n const handleChange = (event: ChangeEvent<HTMLInputElement>) => {\n if (!isControlled) {\n setInternalChecked(event.target.checked);\n }\n onChange?.(event);\n };\n\n // Determine current state based on props\n const currentState = disabled ? 'disabled' : state;\n\n // Get size classes\n const sizeClasses = SIZE_CLASSES[size];\n\n // Determine checkbox visual variant\n const checkVariant = checked || indeterminate ? 'checked' : 'unchecked';\n\n // Get styling classes\n const stylingClasses = STATE_CLASSES[currentState][checkVariant];\n\n // Special border width handling for focused/hovered states and large size\n const borderWidthClass =\n state === 'focused' || (state === 'hovered' && size === 'large')\n ? 'border-[3px]'\n : sizeClasses.borderWidth;\n\n // Get final checkbox classes\n const checkboxClasses = cn(\n BASE_CHECKBOX_CLASSES,\n sizeClasses.checkbox,\n borderWidthClass,\n stylingClasses,\n className\n );\n\n // Render appropriate icon based on state\n const renderIcon = () => {\n if (indeterminate) {\n return (\n <Minus\n size={sizeClasses.iconSize}\n weight=\"bold\"\n color=\"currentColor\"\n />\n );\n }\n\n if (checked) {\n return (\n <Check\n size={sizeClasses.iconSize}\n weight=\"bold\"\n color=\"currentColor\"\n />\n );\n }\n\n return null;\n };\n\n return (\n <div className=\"flex flex-col\">\n <div\n className={cn(\n 'flex flex-row items-center',\n sizeClasses.spacing,\n disabled ? 'opacity-40' : ''\n )}\n >\n {/* Hidden native input for accessibility and form submission */}\n <input\n ref={ref}\n type=\"checkbox\"\n id={inputId}\n checked={checked}\n disabled={disabled}\n onChange={handleChange}\n className=\"sr-only\"\n {...props}\n />\n\n {/* Custom styled checkbox */}\n <label htmlFor={inputId} className={checkboxClasses}>\n {/* Show appropriate icon based on state */}\n {renderIcon()}\n </label>\n\n {/* Label text */}\n {label && (\n <div\n className={cn(\n 'flex flex-row items-center',\n sizeClasses.labelHeight\n )}\n >\n <Text\n as=\"label\"\n htmlFor={inputId}\n size={sizeClasses.textSize}\n weight=\"normal\"\n className={cn(\n 'cursor-pointer select-none leading-[150%] flex items-center font-roboto',\n labelClassName\n )}\n >\n {label}\n </Text>\n </div>\n )}\n </div>\n\n {/* Error message */}\n {errorMessage && (\n <Text\n size=\"sm\"\n weight=\"normal\"\n className=\"mt-1.5\"\n color=\"text-error-600\"\n >\n {errorMessage}\n </Text>\n )}\n\n {/* Helper text */}\n {helperText && !errorMessage && (\n <Text\n size=\"sm\"\n weight=\"normal\"\n className=\"mt-1.5\"\n color=\"text-text-500\"\n >\n {helperText}\n </Text>\n )}\n </div>\n );\n }\n);\n\nCheckBox.displayName = 'CheckBox';\n\nexport default CheckBox;\n","import {\n TextareaHTMLAttributes,\n ReactNode,\n forwardRef,\n useState,\n useId,\n ChangeEvent,\n FocusEvent,\n} from 'react';\nimport { WarningCircle } from 'phosphor-react';\nimport Text from '../Text/Text';\nimport { cn } from '../../utils/utils';\n\n/**\n * TextArea size variants\n */\ntype TextAreaSize = 'small' | 'medium' | 'large' | 'extraLarge';\n\n/**\n * TextArea visual state\n */\ntype TextAreaState = 'default' | 'hovered' | 'focused' | 'invalid' | 'disabled';\n\n/**\n * Size configurations with exact pixel specifications\n */\nconst SIZE_CLASSES = {\n small: {\n textarea: 'h-24 text-sm', // 96px height, 14px font\n textSize: 'sm' as const,\n },\n medium: {\n textarea: 'h-24 text-base', // 96px height, 16px font\n textSize: 'md' as const,\n },\n large: {\n textarea: 'h-24 text-lg', // 96px height, 18px font\n textSize: 'lg' as const,\n },\n extraLarge: {\n textarea: 'h-24 text-xl', // 96px height, 20px font\n textSize: 'xl' as const,\n },\n} as const;\n\n/**\n * Base textarea styling classes using design system colors\n */\nconst BASE_TEXTAREA_CLASSES =\n 'w-full box-border p-3 bg-background border border-solid rounded-[4px] resize-none focus:outline-none font-roboto font-normal leading-[150%] placeholder:text-text-600 transition-all duration-200';\n\n/**\n * State-based styling classes using design system colors from styles.css\n */\nconst STATE_CLASSES = {\n default: {\n base: 'border-border-300 bg-background text-text-600',\n hover: 'hover:border-border-400',\n focus: 'focus:border-border-500',\n },\n hovered: {\n base: 'border-border-400 bg-background text-text-600',\n hover: '',\n focus: 'focus:border-border-500',\n },\n focused: {\n base: 'border-2 border-primary-950 bg-background text-text-900',\n hover: '',\n focus: '',\n },\n invalid: {\n base: 'border-2 border-red-700 bg-white text-gray-800',\n hover: 'hover:border-red-700',\n focus: 'focus:border-red-700',\n },\n disabled: {\n base: 'border-border-300 bg-background text-text-600 cursor-not-allowed opacity-40',\n hover: '',\n focus: '',\n },\n} as const;\n\n/**\n * TextArea component props interface\n */\nexport type TextAreaProps = {\n /** Label text to display above the textarea */\n label?: ReactNode;\n /** Size variant of the textarea */\n size?: TextAreaSize;\n /** Visual state of the textarea */\n state?: TextAreaState;\n /** Error message to display */\n errorMessage?: string;\n /** Helper text to display */\n helperMessage?: string;\n /** Additional CSS classes */\n className?: string;\n /** Label CSS classes */\n labelClassName?: string;\n} & Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, 'size'>;\n\n/**\n * TextArea component for Analytica Ensino platforms\n *\n * A textarea component with essential states, sizes and themes.\n * Uses exact design specifications with 288px width, 96px height, and specific\n * color values. Includes Text component integration for consistent typography.\n *\n * @example\n * ```tsx\n * // Basic textarea\n * <TextArea label=\"Description\" placeholder=\"Enter description...\" />\n *\n * // Small size\n * <TextArea size=\"small\" label=\"Comment\" />\n *\n * // Invalid state\n * <TextArea state=\"invalid\" label=\"Required field\" errorMessage=\"This field is required\" />\n *\n * // Disabled state\n * <TextArea disabled label=\"Read-only field\" />\n * ```\n */\nconst TextArea = forwardRef<HTMLTextAreaElement, TextAreaProps>(\n (\n {\n label,\n size = 'medium',\n state = 'default',\n errorMessage,\n helperMessage,\n className = '',\n labelClassName = '',\n disabled,\n id,\n onChange,\n placeholder,\n ...props\n },\n ref\n ) => {\n // Generate unique ID if not provided\n const generatedId = useId();\n const inputId = id ?? `textarea-${generatedId}`;\n\n // Internal state for focus tracking\n const [isFocused, setIsFocused] = useState(false);\n\n // Handle change events\n const handleChange = (event: ChangeEvent<HTMLTextAreaElement>) => {\n onChange?.(event);\n };\n\n // Handle focus events\n const handleFocus = (event: FocusEvent<HTMLTextAreaElement>) => {\n setIsFocused(true);\n props.onFocus?.(event);\n };\n\n // Handle blur events\n const handleBlur = (event: FocusEvent<HTMLTextAreaElement>) => {\n setIsFocused(false);\n props.onBlur?.(event);\n };\n\n // Determine current state based on props and focus\n let currentState = disabled ? 'disabled' : state;\n\n // Override state based on focus\n if (\n isFocused &&\n currentState !== 'invalid' &&\n currentState !== 'disabled'\n ) {\n currentState = 'focused';\n }\n\n // Get size classes\n const sizeClasses = SIZE_CLASSES[size];\n\n // Get styling classes\n const stateClasses = STATE_CLASSES[currentState];\n\n // Get final textarea classes\n const textareaClasses = cn(\n BASE_TEXTAREA_CLASSES,\n sizeClasses.textarea,\n stateClasses.base,\n stateClasses.hover,\n stateClasses.focus,\n className\n );\n\n return (\n <div className={`flex flex-col`}>\n {/* Label */}\n {label && (\n <Text\n as=\"label\"\n htmlFor={inputId}\n size={sizeClasses.textSize}\n weight=\"medium\"\n color=\"text-text-950\"\n className={cn('mb-1.5', labelClassName)}\n >\n {label}\n </Text>\n )}\n\n {/* Textarea */}\n <textarea\n ref={ref}\n id={inputId}\n disabled={disabled}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n className={textareaClasses}\n placeholder={placeholder}\n {...props}\n />\n\n {/* Error message */}\n {errorMessage && (\n <p className=\"flex gap-1 items-center text-sm text-indicator-error mt-1.5\">\n <WarningCircle size={16} /> {errorMessage}\n </p>\n )}\n\n {/* Helper text */}\n {helperMessage && !errorMessage && (\n <Text size=\"sm\" weight=\"normal\" className=\"mt-1.5 text-text-500\">\n {helperMessage}\n </Text>\n )}\n </div>\n );\n }\n);\n\nTextArea.displayName = 'TextArea';\n\nexport default TextArea;\n"],"mappings":"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","names":["import_phosphor_react","import_phosphor_react","import_jsx_runtime","import_jsx_runtime","SIZE_CLASSES","import_react","import_jsx_runtime","getStatusStyles","isReadonly","getStatusBadge","value","import_jsx_runtime","VARIANT_ACTION_CLASSES","SIZE_CLASSES","import_react","import_jsx_runtime","import_react","import_zustand","answer","import_react","import_jsx_runtime","SIZE_CLASSES","import_react","import_phosphor_react","import_jsx_runtime","SIZE_CLASSES","import_zustand","import_react","import_phosphor_react","import_jsx_runtime","SIZE_CLASSES","injectStore","children","label","import_react","import_jsx_runtime","SIZE_CLASSES","VARIANT_CLASSES","import_phosphor_react","import_jsx_runtime","import_jsx_runtime","SIZE_CLASSES","VARIANT_CLASSES","import_react","import_react","import_zustand","import_react","import_phosphor_react","import_jsx_runtime","SIZE_CLASSES","STATE_CLASSES","import_jsx_runtime","injectStore","import_phosphor_react","import_jsx_runtime","getStatusBadge","getStatusStyles","import_react","import_phosphor_react","import_jsx_runtime","SIZE_CLASSES","STATE_CLASSES","import_jsx_runtime"]}
|
|
1
|
+
{"version":3,"sources":["../../src/components/Quiz/Quiz.tsx","../../src/components/Badge/Badge.tsx","../../src/utils/utils.ts","../../src/components/Alternative/Alternative.tsx","../../src/components/Radio/Radio.tsx","../../src/components/Text/Text.tsx","../../src/components/Button/Button.tsx","../../src/components/IconButton/IconButton.tsx","../../src/components/Quiz/useQuizStore.ts","../../src/components/AlertDialog/AlertDialog.tsx","../../src/components/Modal/Modal.tsx","../../src/components/Select/Select.tsx","../../src/components/Card/Card.tsx","../../src/components/ProgressBar/ProgressBar.tsx","../../src/components/ProgressCircle/ProgressCircle.tsx","../../src/components/MultipleChoice/MultipleChoice.tsx","../../src/components/CheckBox/CheckboxList.tsx","../../src/components/CheckBox/CheckBox.tsx","../../src/components/TextArea/TextArea.tsx"],"sourcesContent":["import {\n CaretLeft,\n CaretRight,\n Clock,\n SquaresFour,\n BookOpen,\n Book,\n CheckCircle,\n XCircle,\n} from 'phosphor-react';\nimport Badge from '../Badge/Badge';\nimport {\n AlternativesList,\n HeaderAlternative,\n} from '../Alternative/Alternative';\nimport Button from '../Button/Button';\nimport IconButton from '../IconButton/IconButton';\nimport {\n forwardRef,\n ReactNode,\n useEffect,\n useMemo,\n useId,\n useState,\n useCallback,\n useRef,\n ComponentType,\n MouseEvent,\n} from 'react';\nimport {\n Question,\n useQuizStore,\n QUESTION_DIFFICULTY,\n QUESTION_TYPE,\n ANSWER_STATUS,\n} from './useQuizStore';\nimport { AlertDialog } from '../AlertDialog/AlertDialog';\nimport Modal from '../Modal/Modal';\n\nimport Select, {\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '../Select/Select';\nimport { CardResults, CardStatus } from '../Card/Card';\nimport ProgressCircle from '../ProgressCircle/ProgressCircle';\nimport ProgressBar from '../ProgressBar/ProgressBar';\nimport { cn } from '../../utils/utils';\nimport { MultipleChoiceList } from '../MultipleChoice/MultipleChoice';\nimport TextArea from '../TextArea/TextArea';\nimport ImageQuestion from '../../assets/img/mock-image-question.png';\n\nexport const getStatusBadge = (status?: 'correct' | 'incorrect') => {\n switch (status) {\n case 'correct':\n return (\n <Badge variant=\"solid\" action=\"success\" iconLeft={<CheckCircle />}>\n Resposta correta\n </Badge>\n );\n case 'incorrect':\n return (\n <Badge variant=\"solid\" action=\"error\" iconLeft={<XCircle />}>\n Resposta incorreta\n </Badge>\n );\n default:\n return null;\n }\n};\n\nexport const getStatusStyles = (variantCorrect?: string) => {\n switch (variantCorrect) {\n case 'correct':\n return 'bg-success-background border-success-300';\n case 'incorrect':\n return 'bg-error-background border-error-300';\n }\n};\n\nconst Quiz = forwardRef<\n HTMLDivElement,\n { children: ReactNode; className?: string; variant?: 'result' | 'default' }\n>(({ children, className, variant = 'default', ...props }, ref) => {\n const { setVariant } = useQuizStore();\n\n useEffect(() => {\n setVariant(variant);\n }, [variant, setVariant]);\n\n return (\n <div\n ref={ref}\n className={cn(\n 'w-full max-w-[1000px] flex flex-col mx-auto h-full relative not-lg:px-6',\n className\n )}\n {...props}\n >\n {children}\n </div>\n );\n});\n\nconst QuizHeaderResult = forwardRef<HTMLDivElement, { className?: string }>(\n ({ className, ...props }, ref) => {\n const { getQuestionResultByQuestionId, getCurrentQuestion } =\n useQuizStore();\n const [isCorrect, setIsCorrect] = useState(false);\n\n useEffect(() => {\n const cq = getCurrentQuestion();\n if (!cq) {\n setIsCorrect(false);\n return;\n }\n const qr = getQuestionResultByQuestionId(cq.id);\n setIsCorrect(qr?.answerStatus === ANSWER_STATUS.RESPOSTA_CORRETA);\n }, [\n getCurrentQuestion,\n getQuestionResultByQuestionId,\n getCurrentQuestion()?.id,\n ]);\n\n return (\n <div\n ref={ref}\n className={cn(\n 'flex flex-row items-center gap-10 p-3.5 rounded-xl mb-4',\n isCorrect ? 'bg-success-background' : 'bg-error-background',\n className\n )}\n {...props}\n >\n <p className=\"text-text-950 font-bold text-lg\">Resultado</p>\n <p className=\"text-text-700 text-md\">\n {isCorrect ? '🎉 Parabéns!!' : 'Não foi dessa vez...'}\n </p>\n </div>\n );\n }\n);\n\nconst QuizTitle = forwardRef<HTMLDivElement, { className?: string }>(\n ({ className, ...props }, ref) => {\n const {\n currentQuestionIndex,\n getTotalQuestions,\n getQuizTitle,\n timeElapsed,\n formatTime,\n isStarted,\n } = useQuizStore();\n\n const totalQuestions = getTotalQuestions();\n const quizTitle = getQuizTitle();\n\n return (\n <div\n ref={ref}\n className={cn(\n 'flex flex-row justify-center items-center relative p-2',\n className\n )}\n {...props}\n >\n <span className=\"flex flex-col gap-2 text-center\">\n <p className=\"text-text-950 font-bold text-md\">{quizTitle}</p>\n <p className=\"text-text-600 text-xs\">\n {totalQuestions > 0\n ? `${currentQuestionIndex + 1} de ${totalQuestions}`\n : '0 de 0'}\n </p>\n </span>\n\n <span className=\"absolute right-2\">\n <Badge variant=\"outlined\" action=\"info\" iconLeft={<Clock />}>\n {isStarted ? formatTime(timeElapsed) : '00:00'}\n </Badge>\n </span>\n </div>\n );\n }\n);\n\nconst QuizSubTitle = forwardRef<HTMLDivElement, { subTitle: string }>(\n ({ subTitle, ...props }, ref) => {\n return (\n <div className=\"px-4 pb-2 pt-6\" {...props} ref={ref}>\n <p className=\"font-bold text-lg text-text-950\">{subTitle}</p>\n </div>\n );\n }\n);\n\nconst QuizHeader = () => {\n const { getCurrentQuestion, currentQuestionIndex } = useQuizStore();\n const currentQuestion = getCurrentQuestion();\n return (\n <HeaderAlternative\n title={\n currentQuestion ? `Questão ${currentQuestionIndex + 1}` : 'Questão'\n }\n subTitle={currentQuestion?.knowledgeMatrix?.[0]?.topic?.name ?? ''}\n content={currentQuestion?.statement ?? ''}\n />\n );\n};\n\nconst QuizContainer = forwardRef<\n HTMLDivElement,\n { children: ReactNode; className?: string }\n>(({ children, className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\n 'bg-background rounded-t-xl px-4 pt-4 pb-[80px] h-auto flex flex-col gap-4 mb-auto',\n className\n )}\n {...props}\n >\n {children}\n </div>\n );\n});\n\nconst QuizContent = forwardRef<\n HTMLDivElement,\n {\n paddingBottom?: string;\n }\n>(({ paddingBottom }) => {\n const { getCurrentQuestion } = useQuizStore();\n const currentQuestion = getCurrentQuestion();\n const questionComponents: Record<\n string,\n ComponentType<QuizVariantInterface>\n > = {\n [QUESTION_TYPE.ALTERNATIVA]: QuizAlternative,\n [QUESTION_TYPE.MULTIPLA_CHOICE]: QuizMultipleChoice,\n [QUESTION_TYPE.DISSERTATIVA]: QuizDissertative,\n [QUESTION_TYPE.VERDADEIRO_FALSO]: QuizTrueOrFalse,\n [QUESTION_TYPE.LIGAR_PONTOS]: QuizConnectDots,\n [QUESTION_TYPE.PREENCHER]: QuizFill,\n [QUESTION_TYPE.IMAGEM]: QuizImageQuestion,\n };\n\n const QuestionComponent = currentQuestion\n ? questionComponents[currentQuestion.questionType]\n : null;\n\n return QuestionComponent ? (\n <QuestionComponent paddingBottom={paddingBottom} />\n ) : null;\n});\n\nenum Status {\n CORRECT = 'correct',\n INCORRECT = 'incorrect',\n NEUTRAL = 'neutral',\n}\n\ninterface QuizVariantInterface {\n paddingBottom?: string;\n}\n\nconst QuizAlternative = ({ paddingBottom }: QuizVariantInterface) => {\n const {\n getCurrentQuestion,\n selectAnswer,\n getQuestionResultByQuestionId,\n getCurrentAnswer,\n variant,\n } = useQuizStore();\n const currentQuestion = getCurrentQuestion();\n const currentQuestionResult = getQuestionResultByQuestionId(\n currentQuestion?.id || ''\n );\n\n const currentAnswer = getCurrentAnswer();\n const alternatives = currentQuestion?.options?.map((option) => {\n let status: Status = Status.NEUTRAL;\n if (variant === 'result') {\n const isCorrectOption =\n currentQuestionResult?.options?.find((op) => op.id === option.id)\n ?.isCorrect || false;\n\n const isSelected = currentQuestionResult?.selectedOptions.some(\n (selectedOption) => selectedOption.optionId === option.id\n );\n\n if (isCorrectOption) {\n status = Status.CORRECT;\n } else if (isSelected && !isCorrectOption) {\n status = Status.INCORRECT;\n } else {\n status = Status.NEUTRAL;\n }\n }\n\n return {\n label: option.option,\n value: option.id,\n status: status,\n };\n });\n\n if (!alternatives)\n return (\n <div>\n <p>Não há Alternativas</p>\n </div>\n );\n\n return (\n <>\n <QuizSubTitle subTitle=\"Alternativas\" />\n\n <QuizContainer className={cn('', paddingBottom)}>\n <div className=\"space-y-4\">\n <AlternativesList\n mode={variant === 'default' ? 'interactive' : 'readonly'}\n key={`question-${currentQuestion?.id || '1'}`}\n name={`question-${currentQuestion?.id || '1'}`}\n layout=\"compact\"\n alternatives={alternatives}\n value={\n variant === 'result'\n ? currentQuestionResult?.selectedOptions[0]?.optionId || ''\n : currentAnswer?.optionId || ''\n }\n selectedValue={\n variant === 'result'\n ? currentQuestionResult?.selectedOptions[0]?.optionId || ''\n : currentAnswer?.optionId || ''\n }\n onValueChange={(value) => {\n if (currentQuestion) {\n selectAnswer(currentQuestion.id, value);\n }\n }}\n />\n </div>\n </QuizContainer>\n </>\n );\n};\n\nconst QuizMultipleChoice = ({ paddingBottom }: QuizVariantInterface) => {\n const {\n getCurrentQuestion,\n selectMultipleAnswer,\n getAllCurrentAnswer,\n getQuestionResultByQuestionId,\n variant,\n } = useQuizStore();\n const currentQuestion = getCurrentQuestion();\n const allCurrentAnswers = getAllCurrentAnswer();\n const currentQuestionResult = getQuestionResultByQuestionId(\n currentQuestion?.id || ''\n );\n // Use ref to track previous values and prevent unnecessary updates\n const prevSelectedValuesRef = useRef<string[]>([]);\n const prevQuestionIdRef = useRef<string>('');\n\n // Memoize the answer IDs to prevent unnecessary re-renders\n const allCurrentAnswerIds = useMemo(() => {\n return allCurrentAnswers?.map((answer) => answer.optionId) || [];\n }, [allCurrentAnswers]);\n\n // Memoize the selected values to prevent infinite loops\n const selectedValues = useMemo(() => {\n return allCurrentAnswerIds?.filter((id): id is string => id !== null) || [];\n }, [allCurrentAnswerIds]);\n\n // Only update selectedValues if they actually changed or question changed\n const stableSelectedValues = useMemo(() => {\n const currentQuestionId = currentQuestion?.id || '';\n const hasQuestionChanged = prevQuestionIdRef.current !== currentQuestionId;\n\n if (hasQuestionChanged) {\n prevQuestionIdRef.current = currentQuestionId;\n prevSelectedValuesRef.current = selectedValues;\n return selectedValues;\n }\n\n // Only update if values actually changed\n const hasValuesChanged =\n JSON.stringify(prevSelectedValuesRef.current) !==\n JSON.stringify(selectedValues);\n if (hasValuesChanged) {\n prevSelectedValuesRef.current = selectedValues;\n return selectedValues;\n }\n\n if (variant == 'result') {\n return (\n currentQuestionResult?.selectedOptions.map((op) => op.optionId) || []\n );\n } else {\n return prevSelectedValuesRef.current;\n }\n }, [\n selectedValues,\n currentQuestion?.id,\n variant,\n currentQuestionResult?.selectedOptions,\n ]);\n\n // Memoize the callback to prevent unnecessary re-renders\n const handleSelectedValues = useCallback(\n (values: string[]) => {\n if (currentQuestion) {\n selectMultipleAnswer(currentQuestion.id, values);\n }\n },\n [currentQuestion, selectMultipleAnswer]\n );\n\n // Create a stable key to force re-mount when question changes\n const questionKey = useMemo(\n () => `question-${currentQuestion?.id || '1'}`,\n [currentQuestion?.id]\n );\n const choices = currentQuestion?.options?.map((option) => {\n let status: Status = Status.NEUTRAL;\n\n if (variant === 'result') {\n const isCorrectOption =\n currentQuestionResult?.options?.find((op) => op.id === option.id)\n ?.isCorrect || false;\n\n const isSelected = currentQuestionResult?.selectedOptions?.some(\n (op) => op.optionId === option.id\n );\n\n if (isCorrectOption) {\n status = Status.CORRECT;\n } else if (isSelected && !isCorrectOption) {\n status = Status.INCORRECT;\n } else {\n status = Status.NEUTRAL;\n }\n }\n\n return {\n label: option.option,\n value: option.id,\n status: status,\n };\n });\n\n if (!choices)\n return (\n <div>\n <p>Não há Escolhas Multiplas</p>\n </div>\n );\n return (\n <>\n <QuizSubTitle subTitle=\"Alternativas\" />\n\n <QuizContainer className={cn('', paddingBottom)}>\n <div className=\"space-y-4\">\n <MultipleChoiceList\n choices={choices}\n key={questionKey}\n name={questionKey}\n selectedValues={stableSelectedValues}\n onHandleSelectedValues={handleSelectedValues}\n mode={variant === 'default' ? 'interactive' : 'readonly'}\n />\n </div>\n </QuizContainer>\n </>\n );\n};\n\nconst QuizDissertative = ({ paddingBottom }: QuizVariantInterface) => {\n const {\n getCurrentQuestion,\n getCurrentAnswer,\n selectDissertativeAnswer,\n getQuestionResultByQuestionId,\n variant,\n } = useQuizStore();\n\n const currentQuestion = getCurrentQuestion();\n const currentQuestionResult = getQuestionResultByQuestionId(\n currentQuestion?.id || ''\n );\n\n const currentAnswer = getCurrentAnswer();\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n const handleAnswerChange = (value: string) => {\n if (currentQuestion) {\n selectDissertativeAnswer(currentQuestion.id, value);\n }\n };\n\n // Auto-resize function\n const adjustTextareaHeight = useCallback(() => {\n if (textareaRef.current) {\n textareaRef.current.style.height = 'auto';\n const scrollHeight = textareaRef.current.scrollHeight;\n const minHeight = 120; // 120px minimum height\n const maxHeight = 400; // 400px maximum height\n const newHeight = Math.min(Math.max(scrollHeight, minHeight), maxHeight);\n textareaRef.current.style.height = `${newHeight}px`;\n }\n }, []);\n\n // Adjust height when currentAnswer changes\n useEffect(() => {\n adjustTextareaHeight();\n }, [currentAnswer, adjustTextareaHeight]);\n\n if (!currentQuestion) {\n return (\n <div className=\"space-y-4\">\n <p className=\"text-text-600 text-md\">Nenhuma questão disponível</p>\n </div>\n );\n }\n\n const localAnswer =\n (variant == 'result'\n ? currentQuestionResult?.answer\n : currentAnswer?.answer) || '';\n return (\n <>\n <QuizSubTitle subTitle=\"Resposta\" />\n\n <QuizContainer className={cn(variant != 'result' && paddingBottom)}>\n <div className=\"space-y-4 max-h-[600px] overflow-y-auto\">\n {variant === 'default' ? (\n <div className=\"space-y-4\">\n <TextArea\n ref={textareaRef}\n placeholder=\"Escreva sua resposta\"\n value={localAnswer}\n onChange={(e) => handleAnswerChange(e.target.value)}\n rows={4}\n className=\"min-h-[120px] max-h-[400px] resize-none overflow-y-auto\"\n />\n </div>\n ) : (\n <div className=\"space-y-4\">\n <p className=\"text-text-600 text-md whitespace-pre-wrap\">\n {localAnswer || 'Nenhuma resposta fornecida'}\n </p>\n </div>\n )}\n </div>\n </QuizContainer>\n\n {variant === 'result' &&\n currentQuestionResult?.answerStatus ==\n ANSWER_STATUS.RESPOSTA_INCORRETA && (\n <>\n <QuizSubTitle subTitle=\"Observação do professor\" />\n\n <QuizContainer className={cn('', paddingBottom)}>\n <p className=\"text-text-600 text-md whitespace-pre-wrap\">\n Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed\n euismod, urna eu tincidunt consectetur, nisi nisl aliquam nunc,\n eget aliquam massa nisl quis neque. Pellentesque habitant morbi\n tristique senectus et netus et malesuada fames ac turpis\n egestas. Vestibulum ante ipsum primis in faucibus orci luctus et\n ultrices posuere cubilia curae; Integer euismod, urna eu\n tincidunt consectetur, nisi nisl aliquam nunc, eget aliquam\n massa nisl quis neque. Pellentesque habitant morbi tristique\n senectus et netus et malesuada fames ac turpis egestas.\n Suspendisse potenti. Nullam ac urna eu felis dapibus condimentum\n sit amet a augue. Sed non neque elit. Sed ut imperdiet nisi.\n Proin condimentum fermentum nunc. Etiam pharetra, erat sed\n fermentum feugiat, velit mauris egestas quam, ut aliquam massa\n nisl quis neque. Suspendisse in orci enim. Mauris euismod, urna\n eu tincidunt consectetur, nisi nisl aliquam nunc, eget aliquam\n massa nisl quis neque. Pellentesque habitant morbi tristique\n senectus et netus et malesuada fames ac turpis egestas.\n Vestibulum ante ipsum primis in faucibus orci luctus et ultrices\n posuere cubilia curae; Integer euismod, urna eu tincidunt\n consectetur, nisi nisl aliquam nunc, eget aliquam massa nisl\n quis neque. Pellentesque habitant morbi tristique senectus et\n netus et malesuada fames ac turpis egestas. Suspendisse potenti.\n Nullam ac urna eu felis dapibus condimentum sit amet a augue.\n Sed non neque elit. Sed ut imperdiet nisi. Proin condimentum\n fermentum nunc. Etiam pharetra, erat sed fermentum feugiat,\n velit mauris egestas quam, ut aliquam massa nisl quis neque.\n Suspendisse in orci enim. Pellentesque habitant morbi tristique\n senectus et netus et malesuada fames ac turpis egestas.\n Vestibulum ante ipsum primis in faucibus orci luctus et ultrices\n posuere cubilia curae; Integer euismod, urna eu tincidunt\n consectetur, nisi nisl aliquam nunc, eget aliquam massa nisl\n quis neque. Pellentesque habitant morbi tristique senectus et\n netus et malesuada fames ac turpis egestas. Suspendisse potenti.\n Nullam ac urna eu felis dapibus condimentum sit amet a augue.\n Sed non neque elit. Sed ut imperdiet nisi. Proin condimentum\n fermentum nunc. Etiam pharetra, erat sed fermentum feugiat,\n velit mauris egestas quam, ut aliquam massa nisl quis neque.\n Suspendisse in orci enim.\n </p>\n </QuizContainer>\n </>\n )}\n </>\n );\n};\n\nconst QuizTrueOrFalse = ({ paddingBottom }: QuizVariantInterface) => {\n const { variant } = useQuizStore();\n const options = [\n {\n label: '25 metros',\n isCorrect: true,\n },\n {\n label: '30 metros',\n isCorrect: false,\n },\n {\n label: '40 metros',\n isCorrect: false,\n },\n {\n label: '50 metros',\n isCorrect: false,\n },\n ];\n\n const getLetterByIndex = (index: number) => String.fromCharCode(97 + index); // 97 = 'a' in ASCII\n\n const isDefaultVariant = variant == 'default';\n\n return (\n <>\n <QuizSubTitle subTitle=\"Alternativas\" />\n\n <QuizContainer className={cn('', paddingBottom)}>\n <div className=\"flex flex-col gap-3.5\">\n {options.map((option, index) => {\n const variantCorrect = option.isCorrect ? 'correct' : 'incorrect';\n return (\n <section\n key={option.label.concat(`-${index}`)}\n className=\"flex flex-col gap-2\"\n >\n <div\n className={cn(\n 'flex flex-row justify-between items-center gap-2 p-2 rounded-md',\n !isDefaultVariant ? getStatusStyles(variantCorrect) : ''\n )}\n >\n <p className=\"text-text-900 text-sm\">\n {getLetterByIndex(index).concat(') ').concat(option.label)}\n </p>\n\n {isDefaultVariant ? (\n <Select size=\"medium\">\n <SelectTrigger className=\"w-[180px]\">\n <SelectValue placeholder=\"Selecione opcão\" />\n </SelectTrigger>\n\n <SelectContent>\n <SelectItem value=\"V\">Verdadeiro</SelectItem>\n <SelectItem value=\"F\">Falso</SelectItem>\n </SelectContent>\n </Select>\n ) : (\n <div className=\"flex-shrink-0\">\n {getStatusBadge(variantCorrect)}\n </div>\n )}\n </div>\n\n {!isDefaultVariant && (\n <span className=\"flex flex-row gap-2 items-center\">\n <p className=\"text-text-800 text-2xs\">\n Resposta selecionada: V\n </p>\n {!option.isCorrect && (\n <p className=\"text-text-800 text-2xs\">\n Resposta correta: F\n </p>\n )}\n </span>\n )}\n </section>\n );\n })}\n </div>\n </QuizContainer>\n </>\n );\n};\n\ninterface UserAnswer {\n option: string;\n dotOption: string | null;\n correctOption: string;\n isCorrect: boolean | null;\n}\n\nconst QuizConnectDots = ({ paddingBottom }: QuizVariantInterface) => {\n const { variant } = useQuizStore();\n const dotsOptions = [\n { label: 'Ração' },\n { label: 'Rato' },\n { label: 'Grama' },\n { label: 'Peixe' },\n ];\n\n const options = [\n {\n label: 'Cachorro',\n correctOption: 'Ração',\n },\n {\n label: 'Gato',\n correctOption: 'Rato',\n },\n {\n label: 'Cabra',\n correctOption: 'Grama',\n },\n {\n label: 'Baleia',\n correctOption: 'Peixe',\n },\n ];\n\n const mockUserAnswers = [\n {\n option: 'Cachorro',\n dotOption: 'Ração',\n correctOption: 'Ração',\n isCorrect: true,\n },\n {\n option: 'Gato',\n dotOption: 'Rato',\n correctOption: 'Rato',\n isCorrect: true,\n },\n {\n option: 'Cabra',\n dotOption: 'Peixe',\n correctOption: 'Grama',\n isCorrect: false,\n },\n {\n option: 'Baleia',\n dotOption: 'Grama',\n correctOption: 'Peixe',\n isCorrect: false,\n },\n ];\n\n const [userAnswers, setUserAnswers] = useState<UserAnswer[]>(() => {\n if (variant === 'result') {\n return mockUserAnswers;\n }\n return options.map((option) => ({\n option: option.label,\n dotOption: null,\n correctOption: option.correctOption,\n isCorrect: null,\n }));\n });\n\n const handleSelectDot = (optionIndex: number, dotValue: string) => {\n setUserAnswers((prev) => {\n const next = [...prev];\n const { label: optionLabel, correctOption } = options[optionIndex];\n next[optionIndex] = {\n option: optionLabel,\n dotOption: dotValue,\n correctOption,\n isCorrect: dotValue ? dotValue === correctOption : null,\n };\n return next;\n });\n };\n\n const getLetterByIndex = (index: number) => String.fromCharCode(97 + index); // 'a', 'b', 'c'...\n\n const isDefaultVariant = variant === 'default';\n const assignedDots = new Set(\n userAnswers.map((a) => a.dotOption).filter(Boolean)\n );\n\n return (\n <>\n <QuizSubTitle subTitle=\"Alternativas\" />\n\n <QuizContainer className={cn('', paddingBottom)}>\n <div className=\"flex flex-col gap-3.5\">\n {options.map((option, index) => {\n const answer = userAnswers[index];\n const variantCorrect = answer.isCorrect ? 'correct' : 'incorrect';\n return (\n <section key={option.label} className=\"flex flex-col gap-2\">\n <div\n className={cn(\n 'flex flex-row justify-between items-center gap-2 p-2 rounded-md',\n !isDefaultVariant ? getStatusStyles(variantCorrect) : ''\n )}\n >\n <p className=\"text-text-900 text-sm\">\n {getLetterByIndex(index) + ') ' + option.label}\n </p>\n\n {isDefaultVariant ? (\n <Select\n size=\"medium\"\n value={answer.dotOption || undefined}\n onValueChange={(value) => handleSelectDot(index, value)}\n >\n <SelectTrigger className=\"w-[180px]\">\n <SelectValue placeholder=\"Selecione opção\" />\n </SelectTrigger>\n\n <SelectContent>\n {dotsOptions\n .filter(\n (dot) =>\n !assignedDots.has(dot.label) ||\n answer.dotOption === dot.label\n )\n .map((dot) => (\n <SelectItem key={dot.label} value={dot.label}>\n {dot.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n ) : (\n <div className=\"flex-shrink-0\">\n {answer.isCorrect === null\n ? null\n : getStatusBadge(variantCorrect)}\n </div>\n )}\n </div>\n\n {!isDefaultVariant && (\n <span className=\"flex flex-row gap-2 items-center\">\n <p className=\"text-text-800 text-2xs\">\n Resposta selecionada: {answer.dotOption || 'Nenhuma'}\n </p>\n {!answer.isCorrect && (\n <p className=\"text-text-800 text-2xs\">\n Resposta correta: {answer.correctOption}\n </p>\n )}\n </span>\n )}\n </section>\n );\n })}\n </div>\n </QuizContainer>\n </>\n );\n};\n\ninterface FillUserAnswer {\n selectId: string;\n userAnswer: string;\n correctAnswer: string;\n isCorrect: boolean;\n}\n\nconst QuizFill = ({ paddingBottom }: QuizVariantInterface) => {\n const { variant } = useQuizStore();\n const options = [\n 'ciência',\n 'disciplina',\n 'área',\n 'especialidade',\n 'variações',\n ];\n\n const exampleText = `A meteorologia é a {{ciencia}} que estuda os fenômenos atmosféricos e suas {{variações}}. Esta disciplina científica tem como objetivo principal {{objetivo}} o comportamento da atmosfera terrestre.\n\n Os meteorologistas utilizam diversos {{instrumentos}} para coletar dados atmosféricos, incluindo termômetros, barômetros e {{equipamentos}} modernos como radares meteorológicos.`;\n\n // Mock data for result variant - simulating user answers\n const mockUserAnswers: FillUserAnswer[] = [\n {\n selectId: 'ciencia',\n userAnswer: 'tecnologia',\n correctAnswer: 'ciência',\n isCorrect: false,\n },\n {\n selectId: 'variações',\n userAnswer: 'variações',\n correctAnswer: 'variações',\n isCorrect: true,\n },\n {\n selectId: 'objetivo',\n userAnswer: 'estudar',\n correctAnswer: 'compreender',\n isCorrect: false,\n },\n {\n selectId: 'instrumentos',\n userAnswer: 'ferramentas',\n correctAnswer: 'instrumentos',\n isCorrect: false,\n },\n {\n selectId: 'equipamentos',\n userAnswer: 'equipamentos',\n correctAnswer: 'equipamentos',\n isCorrect: true,\n },\n ];\n\n const [answers, setAnswers] = useState<Record<string, string>>({});\n const baseId = useId(); // Generate base ID for this component instance\n\n // Get available options for a specific select\n const getAvailableOptionsForSelect = (selectId: string) => {\n const usedOptions = Object.entries(answers)\n .filter(([key]) => key !== selectId) // Exclude the current selection itself\n .map(([, value]) => value);\n\n return options.filter((option) => !usedOptions.includes(option));\n };\n\n const handleSelectChange = (selectId: string, value: string) => {\n const newAnswers = { ...answers, [selectId]: value };\n setAnswers(newAnswers);\n };\n\n const renderResolutionElement = (selectId: string) => {\n const mockAnswer = mockUserAnswers.find(\n (answer) => answer.selectId === selectId\n );\n\n return (\n <p className=\"inline-flex mb-2.5 text-success-600 font-semibold text-md border-b-2 border-success-600\">\n {mockAnswer?.correctAnswer}\n </p>\n );\n };\n\n const renderDefaultElement = (\n selectId: string,\n startIndex: number,\n selectedValue: string,\n availableOptionsForThisSelect: string[]\n ) => {\n return (\n <Select\n key={`${selectId}-${startIndex}`}\n value={selectedValue}\n onValueChange={(value) => handleSelectChange(selectId, value)}\n className=\"inline-flex mb-2.5\"\n >\n <SelectTrigger className=\"inline-flex w-auto min-w-[140px] h-8 mx-1 bg-white border-gray-300\">\n <SelectValue placeholder=\"Selecione opção\" />\n </SelectTrigger>\n <SelectContent>\n {availableOptionsForThisSelect.map((option, index) => (\n <SelectItem key={`${option}-${index}`} value={option}>\n {option}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n );\n };\n\n const renderResultElement = (selectId: string) => {\n const mockAnswer = mockUserAnswers.find(\n (answer) => answer.selectId === selectId\n );\n\n if (!mockAnswer) return null;\n\n const action = mockAnswer.isCorrect ? 'success' : 'error';\n const icon = mockAnswer.isCorrect ? <CheckCircle /> : <XCircle />;\n\n return (\n <Badge\n key={selectId}\n variant=\"solid\"\n action={action}\n iconRight={icon}\n size=\"large\"\n className=\"py-3 w-[180px] justify-between mb-2.5\"\n >\n <span className=\"text-text-900\">{mockAnswer.userAnswer}</span>\n </Badge>\n );\n };\n\n const renderTextWithSelects = (text: string, isResolution?: boolean) => {\n const elements: Array<{ element: string | ReactNode; id: string }> = [];\n let lastIndex = 0;\n let elementCounter = 0;\n\n // Support Unicode letters/marks and digits: allows placeholders like {{variações}}\n const regex = /\\{\\{([\\p{L}\\p{M}\\d_]+)\\}\\}/gu;\n let match;\n\n while ((match = regex.exec(text)) !== null) {\n const [fullMatch, selectId] = match;\n const startIndex = match.index;\n\n if (startIndex > lastIndex) {\n elements.push({\n element: text.slice(lastIndex, startIndex),\n id: `${baseId}-text-${++elementCounter}`,\n });\n }\n\n const selectedValue = answers[selectId];\n const availableOptionsForThisSelect =\n getAvailableOptionsForSelect(selectId);\n\n if (isResolution) {\n elements.push({\n element: renderResolutionElement(selectId),\n id: `${baseId}-resolution-${++elementCounter}`,\n });\n } else if (variant === 'default') {\n elements.push({\n element: renderDefaultElement(\n selectId,\n startIndex,\n selectedValue,\n availableOptionsForThisSelect\n ),\n id: `${baseId}-select-${++elementCounter}`,\n });\n } else {\n const resultElement = renderResultElement(selectId);\n if (resultElement) {\n elements.push({\n element: resultElement,\n id: `${baseId}-result-${++elementCounter}`,\n });\n }\n }\n\n lastIndex = match.index + fullMatch.length;\n }\n\n if (lastIndex < text.length) {\n elements.push({\n element: text.slice(lastIndex),\n id: `${baseId}-text-${++elementCounter}`,\n });\n }\n\n return elements;\n };\n\n return (\n <>\n <QuizSubTitle subTitle=\"Alternativas\" />\n\n <QuizContainer className=\"h-auto pb-0\">\n <div className=\"space-y-6 px-4 h-auto\">\n <div\n className={cn(\n 'text-lg text-text-900 leading-8 h-auto',\n variant != 'result' && paddingBottom\n )}\n >\n {renderTextWithSelects(exampleText).map((element) => (\n <span key={element.id}>{element.element}</span>\n ))}\n </div>\n </div>\n </QuizContainer>\n\n {variant === 'result' && (\n <>\n <QuizSubTitle subTitle=\"Resultado\" />\n\n <QuizContainer className=\"h-auto pb-0\">\n <div className=\"space-y-6 px-4\">\n <div\n className={cn('text-lg text-text-900 leading-8', paddingBottom)}\n >\n {renderTextWithSelects(exampleText, true).map((element) => (\n <span key={element.id}>{element.element}</span>\n ))}\n </div>\n </div>\n </QuizContainer>\n </>\n )}\n </>\n );\n};\n\nconst QuizImageQuestion = ({ paddingBottom }: QuizVariantInterface) => {\n const { variant } = useQuizStore();\n const correctPositionRelative = { x: 0.48, y: 0.45 };\n\n // Calculate correctRadiusRelative automatically based on the circle dimensions\n const calculateCorrectRadiusRelative = (): number => {\n // The correct answer circle has width: 15% and height: 30%\n // We'll use the average of these as the radius\n const circleWidthRelative = 0.15; // 15%\n const circleHeightRelative = 0.3; // 30%\n\n // Calculate the average radius (half of the average of width and height)\n const averageRadius = (circleWidthRelative + circleHeightRelative) / 4;\n\n // Add a small tolerance for better user experience\n const tolerance = 0.02; // 2% tolerance\n\n return averageRadius + tolerance;\n };\n\n const correctRadiusRelative = calculateCorrectRadiusRelative();\n const mockUserAnswerRelative = { x: 0.72, y: 0.348 };\n\n const [clickPositionRelative, setClickPositionRelative] = useState<{\n x: number;\n y: number;\n } | null>(variant == 'result' ? mockUserAnswerRelative : null);\n\n // Helper function to safely convert click coordinates to relative coordinates\n const convertToRelativeCoordinates = (\n x: number,\n y: number,\n rect: DOMRect\n ): { x: number; y: number } => {\n // Guard against division by zero or extremely small dimensions\n const safeWidth = Math.max(rect.width, 0.001);\n const safeHeight = Math.max(rect.height, 0.001);\n\n // Convert to relative coordinates and clamp to [0, 1] range\n const xRelative = Math.max(0, Math.min(1, x / safeWidth));\n const yRelative = Math.max(0, Math.min(1, y / safeHeight));\n\n return { x: xRelative, y: yRelative };\n };\n\n const handleImageClick = (event: MouseEvent<HTMLButtonElement>) => {\n if (variant === 'result') return;\n\n const rect = event.currentTarget.getBoundingClientRect();\n const x = event.clientX - rect.left;\n const y = event.clientY - rect.top;\n\n // Use helper function for safe conversion\n const positionRelative = convertToRelativeCoordinates(x, y, rect);\n setClickPositionRelative(positionRelative);\n };\n\n const handleKeyboardActivate = () => {\n if (variant === 'result') return;\n // Choose a deterministic position for keyboard activation; center is a reasonable default\n setClickPositionRelative({ x: 0.5, y: 0.5 });\n };\n\n const isCorrect = () => {\n if (!clickPositionRelative) return false;\n\n const distance = Math.sqrt(\n Math.pow(clickPositionRelative.x - correctPositionRelative.x, 2) +\n Math.pow(clickPositionRelative.y - correctPositionRelative.y, 2)\n );\n\n return distance <= correctRadiusRelative;\n };\n\n const getUserCircleColorClasses = () => {\n if (variant === 'default') {\n return 'bg-indicator-primary/70 border-[#F8CC2E]';\n }\n\n if (variant === 'result') {\n return isCorrect()\n ? 'bg-success-600/70 border-white' // Green for correct answer\n : 'bg-indicator-error/70 border-white'; // Red for incorrect answer\n }\n\n return 'bg-success-600/70 border-white';\n };\n\n return (\n <>\n <QuizSubTitle subTitle=\"Clique na área correta\" />\n\n <QuizContainer className={cn('', paddingBottom)}>\n <div\n data-testid=\"quiz-image-container\"\n className=\"space-y-6 p-3 relative inline-block\"\n >\n {variant == 'result' && (\n <div\n data-testid=\"quiz-legend\"\n className=\"flex items-center gap-4 text-xs\"\n >\n <div className=\"flex items-center gap-2\">\n <div className=\"w-3 h-3 rounded-full bg-indicator-primary/70 border border-[#F8CC2E]\"></div>\n <span className=\"text-text-600 font-medium text-sm\">\n Área correta\n </span>\n </div>\n <div className=\"flex items-center gap-2\">\n <div className=\"w-3 h-3 rounded-full bg-success-600/70 border border-white\"></div>\n <span className=\"text-text-600 font-medium text-sm\">\n Resposta correta\n </span>\n </div>\n <div className=\"flex items-center gap-2\">\n <div className=\"w-3 h-3 rounded-full bg-indicator-error/70 border border-white\"></div>\n <span className=\"text-text-600 font-medium text-sm\">\n Resposta incorreta\n </span>\n </div>\n </div>\n )}\n\n <button\n data-testid=\"quiz-image-button\"\n type=\"button\"\n className=\"relative cursor-pointer w-full h-full border-0 bg-transparent p-0\"\n onClick={handleImageClick}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleKeyboardActivate();\n }\n }}\n aria-label=\"Área da imagem interativa\"\n >\n <img\n data-testid=\"quiz-image\"\n src={ImageQuestion}\n alt=\"Question\"\n className=\"w-full h-auto rounded-md\"\n />\n\n {/* Correct answer circle - only show in result variant */}\n {variant === 'result' && (\n <div\n data-testid=\"quiz-correct-circle\"\n className=\"absolute rounded-full bg-indicator-primary/70 border-4 border-[#F8CC2E] pointer-events-none\"\n style={{\n minWidth: '50px',\n maxWidth: '160px',\n width: '15%',\n aspectRatio: '1 / 1',\n left: `calc(${correctPositionRelative.x * 100}% - 7.5%)`,\n top: `calc(${correctPositionRelative.y * 100}% - 15%)`,\n }}\n />\n )}\n\n {/* User's answer circle */}\n {clickPositionRelative && (\n <div\n data-testid=\"quiz-user-circle\"\n className={`absolute rounded-full border-4 pointer-events-none ${getUserCircleColorClasses()}`}\n style={{\n minWidth: '30px',\n maxWidth: '52px',\n width: '5%',\n aspectRatio: '1 / 1',\n left: `calc(${clickPositionRelative.x * 100}% - 2.5%)`,\n top: `calc(${clickPositionRelative.y * 100}% - 2.5%)`,\n }}\n />\n )}\n </button>\n </div>\n </QuizContainer>\n </>\n );\n};\n\nconst QuizQuestionList = ({\n filterType = 'all',\n onQuestionClick,\n}: {\n filterType?: string;\n onQuestionClick?: () => void;\n} = {}) => {\n const {\n getQuestionsGroupedBySubject,\n goToQuestion,\n getQuestionStatusFromUserAnswers,\n getQuestionIndex,\n } = useQuizStore();\n\n const groupedQuestions = getQuestionsGroupedBySubject();\n const getQuestionStatus = (questionId: string) => {\n return getQuestionStatusFromUserAnswers(questionId);\n };\n\n const filteredGroupedQuestions = Object.entries(groupedQuestions).reduce(\n (acc, [subjectId, questions]) => {\n const filteredQuestions = questions.filter((question) => {\n const status = getQuestionStatus(question.id);\n\n switch (filterType) {\n case 'answered':\n return status === 'answered';\n case 'unanswered':\n return status === 'unanswered';\n default:\n return true;\n }\n });\n\n if (filteredQuestions.length > 0) {\n acc[subjectId] = filteredQuestions;\n }\n\n return acc;\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n {} as { [key: string]: any[] }\n );\n\n const getStatusLabel = (status: string) => {\n switch (status) {\n case 'answered':\n return 'Respondida';\n case 'skipped':\n return 'Não respondida';\n default:\n return 'Em branco';\n }\n };\n return (\n <div className=\"space-y-6 px-4\">\n {Object.entries(filteredGroupedQuestions).map(\n ([subjectId, questions]) => (\n <section key={subjectId} className=\"flex flex-col gap-2\">\n <span className=\"pt-6 pb-4 flex flex-row gap-2\">\n <div className=\"bg-primary-500 p-1 rounded-sm flex items-center justify-center\">\n <BookOpen size={17} className=\"text-white\" />\n </div>\n <p className=\"text-text-800 font-bold text-lg\">\n {questions?.[0]?.knowledgeMatrix?.[0]?.subject?.name ??\n 'Sem matéria'}\n </p>\n </span>\n\n <ul className=\"flex flex-col gap-2\">\n {questions.map((question) => {\n const status = getQuestionStatus(question.id);\n const questionNumber = getQuestionIndex(question.id);\n\n return (\n <CardStatus\n key={question.id}\n header={`Questão ${questionNumber.toString().padStart(2, '0')}`}\n label={getStatusLabel(status)}\n onClick={() => {\n goToQuestion(questionNumber - 1);\n onQuestionClick?.();\n }}\n />\n );\n })}\n </ul>\n </section>\n )\n )}\n </div>\n );\n};\n\nconst QuizFooter = forwardRef<\n HTMLDivElement,\n {\n className?: string;\n onGoToSimulated?: () => void;\n onDetailResult?: () => void;\n handleFinishSimulated?: () => void;\n resultImageComponent?: ReactNode;\n }\n>(\n (\n {\n className,\n onGoToSimulated,\n onDetailResult,\n handleFinishSimulated,\n resultImageComponent,\n ...props\n },\n ref\n ) => {\n const {\n currentQuestionIndex,\n getTotalQuestions,\n goToNextQuestion,\n goToPreviousQuestion,\n getUnansweredQuestionsFromUserAnswers,\n getCurrentAnswer,\n skipQuestion,\n getCurrentQuestion,\n getQuestionStatusFromUserAnswers,\n variant,\n getQuestionResultStatistics,\n } = useQuizStore();\n\n const totalQuestions = getTotalQuestions();\n const isFirstQuestion = currentQuestionIndex === 0;\n const isLastQuestion = currentQuestionIndex === totalQuestions - 1;\n const currentAnswer = getCurrentAnswer();\n const currentQuestion = getCurrentQuestion();\n const isCurrentQuestionSkipped = currentQuestion\n ? getQuestionStatusFromUserAnswers(currentQuestion.id) === 'skipped'\n : false;\n const [alertDialogOpen, setAlertDialogOpen] = useState(false);\n const [modalResultOpen, setModalResultOpen] = useState(false);\n const [modalNavigateOpen, setModalNavigateOpen] = useState(false);\n const [modalResolutionOpen, setModalResolutionOpen] = useState(false);\n const [filterType, setFilterType] = useState<string | undefined>(undefined);\n const unansweredQuestions = getUnansweredQuestionsFromUserAnswers();\n const allQuestions = getTotalQuestions();\n\n const handleFinishQuiz = async () => {\n if (unansweredQuestions.length > 0) {\n setAlertDialogOpen(true);\n return;\n }\n\n try {\n if (handleFinishSimulated) {\n await Promise.resolve(handleFinishSimulated());\n }\n setModalResultOpen(true);\n } catch (err) {\n console.error('handleFinishSimulated failed:', err);\n return;\n }\n };\n\n const handleAlertSubmit = async () => {\n try {\n if (handleFinishSimulated) {\n await Promise.resolve(handleFinishSimulated());\n }\n setModalResultOpen(true);\n setAlertDialogOpen(false);\n } catch (err) {\n console.error('handleFinishSimulated failed:', err);\n setAlertDialogOpen(false);\n return;\n }\n };\n\n return (\n <>\n <footer\n ref={ref}\n className={cn(\n 'w-full px-2 bg-background lg:max-w-[1000px] not-lg:max-w-[calc(100vw-32px)] border-t border-border-50 fixed bottom-0 min-h-[80px] flex flex-row justify-between items-center',\n className\n )}\n {...props}\n >\n {variant === 'default' ? (\n <>\n <div className=\"flex flex-row items-center gap-1\">\n <IconButton\n icon={<SquaresFour size={24} className=\"text-text-950\" />}\n size=\"md\"\n onClick={() => setModalNavigateOpen(true)}\n />\n\n {isFirstQuestion ? (\n <Button\n variant=\"outline\"\n size=\"small\"\n onClick={() => {\n skipQuestion();\n goToNextQuestion();\n }}\n >\n Pular\n </Button>\n ) : (\n <Button\n size=\"medium\"\n variant=\"link\"\n action=\"primary\"\n iconLeft={<CaretLeft size={18} />}\n onClick={() => {\n goToPreviousQuestion();\n }}\n >\n Voltar\n </Button>\n )}\n </div>\n\n {!isFirstQuestion && (\n <Button\n size=\"small\"\n variant=\"outline\"\n action=\"primary\"\n onClick={() => {\n skipQuestion();\n goToNextQuestion();\n }}\n >\n Pular\n </Button>\n )}\n\n {isLastQuestion ? (\n <Button\n size=\"medium\"\n variant=\"solid\"\n action=\"primary\"\n disabled={!currentAnswer && !isCurrentQuestionSkipped}\n onClick={handleFinishQuiz}\n >\n Finalizar\n </Button>\n ) : (\n <Button\n size=\"medium\"\n variant=\"link\"\n action=\"primary\"\n iconRight={<CaretRight size={18} />}\n disabled={!currentAnswer && !isCurrentQuestionSkipped}\n onClick={() => {\n goToNextQuestion();\n }}\n >\n Avançar\n </Button>\n )}\n </>\n ) : (\n <div className=\"flex flex-row items-center justify-end w-full\">\n <Button\n variant=\"solid\"\n action=\"primary\"\n size=\"medium\"\n onClick={() => setModalResolutionOpen(true)}\n >\n Ver Resolução\n </Button>\n </div>\n )}\n </footer>\n\n <AlertDialog\n isOpen={alertDialogOpen}\n onChangeOpen={setAlertDialogOpen}\n title=\"Finalizar simulado?\"\n description={\n unansweredQuestions.length > 0\n ? `Você deixou as questões ${unansweredQuestions.join(', ')} sem resposta. Finalizar agora pode impactar seu desempenho.`\n : 'Tem certeza que deseja finalizar o simulado?'\n }\n cancelButtonLabel=\"Voltar e revisar\"\n submitButtonLabel=\"Finalizar Mesmo Assim\"\n onSubmit={handleAlertSubmit}\n />\n\n <Modal\n isOpen={modalResultOpen}\n onClose={() => setModalResultOpen(false)}\n title=\"\"\n closeOnBackdropClick={false}\n closeOnEscape={false}\n hideCloseButton\n size={'md'}\n >\n <div className=\"flex flex-col w-full h-full items-center justify-center gap-4\">\n {resultImageComponent ? (\n <div className=\"w-[282px] h-auto\">{resultImageComponent}</div>\n ) : (\n <div className=\"w-[282px] h-[200px] bg-gray-100 rounded-md flex items-center justify-center\">\n <span className=\"text-gray-500 text-sm\">\n Imagem de resultado\n </span>\n </div>\n )}\n <div className=\"flex flex-col gap-2 text-center\">\n <h2 className=\"text-text-950 font-bold text-lg\">\n Você concluiu o simulado!\n </h2>\n <p className=\"text-text-500 font-sm\">\n Você acertou{' '}\n {getQuestionResultStatistics()?.correctAnswers ?? '--'} de{' '}\n {allQuestions} questões.\n </p>\n </div>\n\n <div className=\"px-6 flex flex-row items-center gap-2 w-full\">\n <Button\n variant=\"outline\"\n className=\"w-full\"\n size=\"small\"\n onClick={onGoToSimulated}\n >\n Ir para simulados\n </Button>\n\n <Button className=\"w-full\" onClick={onDetailResult}>\n Detalhar resultado\n </Button>\n </div>\n </div>\n </Modal>\n\n <Modal\n isOpen={modalNavigateOpen}\n onClose={() => setModalNavigateOpen(false)}\n title=\"Questões\"\n size={'lg'}\n >\n <div className=\"flex flex-col w-full h-full\">\n <div className=\"flex flex-row justify-between items-center py-6 pt-6 pb-4 border-b border-border-200\">\n <p className=\"text-text-950 font-bold text-lg\">Filtrar por</p>\n <span className=\"max-w-[266px]\">\n <Select value={filterType} onValueChange={setFilterType}>\n <SelectTrigger variant=\"rounded\" className=\"max-w-[266px]\">\n <SelectValue placeholder=\"Selecione uma opção\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"all\">Todas</SelectItem>\n <SelectItem value=\"unanswered\">Em branco</SelectItem>\n <SelectItem value=\"answered\">Respondidas</SelectItem>\n </SelectContent>\n </Select>\n </span>\n </div>\n\n <div className=\"flex flex-col gap-2 not-lg:h-[calc(100vh-200px)] lg:max-h-[687px] overflow-y-auto\">\n <QuizQuestionList\n filterType={filterType}\n onQuestionClick={() => setModalNavigateOpen(false)}\n />\n </div>\n </div>\n </Modal>\n\n <Modal\n isOpen={modalResolutionOpen}\n onClose={() => setModalResolutionOpen(false)}\n title=\"Resolução\"\n size={'lg'}\n >\n {currentQuestion?.solutionExplanation}\n </Modal>\n </>\n );\n }\n);\n\n// QUIZ RESULT COMPONENTS\n\nconst QuizResultHeaderTitle = forwardRef<\n HTMLDivElement,\n { className?: string }\n>(({ className, ...props }, ref) => {\n const { bySimulated } = useQuizStore();\n\n return (\n <div\n ref={ref}\n className={cn('flex flex-row pt-4 justify-between', className)}\n {...props}\n >\n <p className=\"text-text-950 font-bold text-2xl\">Resultado</p>\n {bySimulated && (\n <Badge variant=\"solid\" action=\"info\">\n {bySimulated.type}\n </Badge>\n )}\n </div>\n );\n});\n\nconst QuizResultTitle = forwardRef<\n HTMLParagraphElement,\n { className?: string }\n>(({ className, ...props }, ref) => {\n const { getQuizTitle } = useQuizStore();\n const quizTitle = getQuizTitle();\n\n return (\n <p\n className={cn('pt-6 pb-4 text-text-950 font-bold text-lg', className)}\n ref={ref}\n {...props}\n >\n {quizTitle}\n </p>\n );\n});\n\nconst QuizResultPerformance = forwardRef<HTMLDivElement>(\n ({ ...props }, ref) => {\n const {\n getTotalQuestions,\n timeElapsed,\n formatTime,\n getQuestionResultStatistics,\n getQuestionResult,\n } = useQuizStore();\n\n const totalQuestions = getTotalQuestions();\n const questionResult = getQuestionResult();\n\n let correctAnswers = 0;\n let correctEasyAnswers = 0;\n let correctMediumAnswers = 0;\n let correctDifficultAnswers = 0;\n let totalEasyQuestions = 0;\n let totalMediumQuestions = 0;\n let totalDifficultQuestions = 0;\n\n if (questionResult) {\n questionResult.answers.forEach((answer) => {\n const isCorrect = answer.answerStatus == ANSWER_STATUS.RESPOSTA_CORRETA;\n\n if (isCorrect) {\n correctAnswers++;\n }\n\n if (answer.difficultyLevel === QUESTION_DIFFICULTY.FACIL) {\n totalEasyQuestions++;\n if (isCorrect) {\n correctEasyAnswers++;\n }\n } else if (answer.difficultyLevel === QUESTION_DIFFICULTY.MEDIO) {\n totalMediumQuestions++;\n if (isCorrect) {\n correctMediumAnswers++;\n }\n } else if (answer.difficultyLevel === QUESTION_DIFFICULTY.DIFICIL) {\n totalDifficultQuestions++;\n if (isCorrect) {\n correctDifficultAnswers++;\n }\n }\n });\n }\n\n const percentage =\n totalQuestions > 0\n ? Math.round((correctAnswers / totalQuestions) * 100)\n : 0;\n\n return (\n <div\n className=\"flex flex-row gap-6 p-6 rounded-xl bg-background justify-between\"\n ref={ref}\n {...props}\n >\n <div className=\"relative\">\n <ProgressCircle\n size=\"medium\"\n variant=\"green\"\n value={percentage}\n showPercentage={false}\n label=\"\"\n />\n\n <div className=\"absolute inset-0 flex flex-col items-center justify-center\">\n <div className=\"flex items-center gap-1 mb-1\">\n <Clock size={12} weight=\"regular\" className=\"text-text-800\" />\n <span className=\"text-2xs font-medium text-text-800\">\n {formatTime(timeElapsed)}\n </span>\n </div>\n\n <div className=\"text-2xl font-medium text-text-800 leading-7\">\n {getQuestionResultStatistics()?.correctAnswers ?? '--'} de{' '}\n {totalQuestions}\n </div>\n\n <div className=\"text-2xs font-medium text-text-600 mt-1\">\n Corretas\n </div>\n </div>\n </div>\n\n <div className=\"flex flex-col gap-4 w-full\">\n <ProgressBar\n className=\"w-full\"\n layout=\"stacked\"\n variant=\"green\"\n value={correctEasyAnswers}\n max={totalEasyQuestions}\n label=\"Fáceis\"\n showHitCount\n labelClassName=\"text-base font-medium text-text-800 leading-none\"\n percentageClassName=\"text-xs font-medium leading-[14px] text-right\"\n />\n\n <ProgressBar\n className=\"w-full\"\n layout=\"stacked\"\n variant=\"green\"\n value={correctMediumAnswers}\n max={totalMediumQuestions}\n label=\"Médias\"\n showHitCount\n labelClassName=\"text-base font-medium text-text-800 leading-none\"\n percentageClassName=\"text-xs font-medium leading-[14px] text-right\"\n />\n\n <ProgressBar\n className=\"w-full\"\n layout=\"stacked\"\n variant=\"green\"\n value={correctDifficultAnswers}\n max={totalDifficultQuestions}\n label=\"Difíceis\"\n showHitCount\n labelClassName=\"text-base font-medium text-text-800 leading-none\"\n percentageClassName=\"text-xs font-medium leading-[14px] text-right\"\n />\n </div>\n </div>\n );\n }\n);\n\nconst QuizListResult = forwardRef<\n HTMLDivElement,\n {\n className?: string;\n onSubjectClick?: (subject: string) => void;\n }\n>(({ className, onSubjectClick, ...props }, ref) => {\n const { getQuestionsGroupedBySubject } = useQuizStore();\n const groupedQuestions = getQuestionsGroupedBySubject();\n const subjectsStats = Object.entries(groupedQuestions).map(\n ([subjectId, questions]) => {\n let correct = 0;\n let incorrect = 0;\n\n questions.forEach((question) => {\n if (question.answerStatus == ANSWER_STATUS.RESPOSTA_CORRETA) {\n correct++;\n } else {\n incorrect++;\n }\n });\n\n return {\n subject: {\n name:\n questions?.[0]?.knowledgeMatrix?.[0]?.subject?.name ??\n 'Sem matéria',\n id: subjectId,\n },\n correct,\n incorrect,\n total: questions.length,\n };\n }\n );\n\n return (\n <section ref={ref} className={className} {...props}>\n <p className=\"pt-6 pb-4 text-text-950 font-bold text-lg\">Matérias</p>\n\n <ul className=\"flex flex-col gap-2\">\n {subjectsStats.map((subject) => (\n <li key={subject.subject.id}>\n <CardResults\n onClick={() => onSubjectClick?.(subject.subject.id)}\n className=\"max-w-full\"\n header={subject.subject.name}\n correct_answers={subject.correct}\n incorrect_answers={subject.incorrect}\n icon={<Book size={20} />}\n direction=\"row\"\n />\n </li>\n ))}\n </ul>\n </section>\n );\n});\n\nconst QuizListResultByMateria = ({\n subject,\n onQuestionClick,\n}: {\n subject: string;\n onQuestionClick: (question: Question) => void;\n}) => {\n const { getQuestionsGroupedBySubject, getQuestionIndex } = useQuizStore();\n const groupedQuestions = getQuestionsGroupedBySubject();\n\n const answeredQuestions = groupedQuestions[subject] || [];\n\n return (\n <div className=\"w-full max-w-[1000px] flex flex-col mx-auto h-full relative not-lg:px-6\">\n <div className=\"flex flex-row pt-4 justify-between\">\n <p className=\"text-text-950 font-bold text-2xl\">\n {answeredQuestions?.[0]?.knowledgeMatrix?.[0]?.subject?.name ??\n 'Sem matéria'}\n </p>\n </div>\n\n <section className=\"flex flex-col \">\n <p className=\"pt-6 pb-4 text-text-950 font-bold text-lg\">\n Resultado das questões\n </p>\n\n <ul className=\"flex flex-col gap-2 pt-4\">\n {answeredQuestions.map((question) => {\n const questionIndex = getQuestionIndex(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (question as any).questionId ?? question.id\n );\n return (\n <li key={question.id}>\n <CardStatus\n className=\"max-w-full\"\n header={`Questão ${questionIndex.toString().padStart(2, '0')}`}\n status={(() => {\n if (\n question.answerStatus === ANSWER_STATUS.RESPOSTA_CORRETA\n )\n return 'correct';\n if (\n question.answerStatus === ANSWER_STATUS.RESPOSTA_INCORRETA\n )\n return 'incorrect';\n return undefined;\n })()}\n onClick={() => onQuestionClick?.(question)}\n />\n </li>\n );\n })}\n </ul>\n </section>\n </div>\n );\n};\n\nexport {\n QuizHeaderResult,\n QuizTitle,\n QuizSubTitle,\n Quiz,\n QuizHeader,\n QuizContainer,\n QuizContent,\n QuizAlternative,\n QuizQuestionList,\n QuizFooter,\n QuizListResult,\n QuizResultHeaderTitle,\n QuizResultTitle,\n QuizResultPerformance,\n QuizListResultByMateria,\n QuizMultipleChoice,\n QuizDissertative,\n QuizTrueOrFalse,\n QuizConnectDots,\n QuizFill,\n QuizImageQuestion,\n};\n","import { HTMLAttributes, ReactNode } from 'react';\nimport { Bell } from 'phosphor-react';\nimport { cn } from '../../utils/utils';\n\n/**\n * Lookup table for variant and action class combinations\n */\nconst VARIANT_ACTION_CLASSES = {\n solid: {\n error: 'bg-error-background text-error-700 focus-visible:outline-none',\n warning: 'bg-warning text-warning-800 focus-visible:outline-none',\n success: 'bg-success text-success-800 focus-visible:outline-none',\n info: 'bg-info text-info-800 focus-visible:outline-none',\n muted: 'bg-background-muted text-background-800 focus-visible:outline-none',\n },\n outlined: {\n error:\n 'bg-error text-error-700 border border-error-300 focus-visible:outline-none',\n warning:\n 'bg-warning text-warning-800 border border-warning-300 focus-visible:outline-none',\n success:\n 'bg-success text-success-800 border border-success-300 focus-visible:outline-none',\n info: 'bg-info text-info-800 border border-info-300 focus-visible:outline-none',\n muted:\n 'bg-background-muted text-background-800 border border-border-300 focus-visible:outline-none',\n },\n exams: {\n exam1: 'bg-exam-1 text-info-700 focus-visible:outline-none',\n exam2: 'bg-exam-2 text-typography-1 focus-visible:outline-none',\n exam3: 'bg-exam-3 text-typography-2 focus-visible:outline-none',\n exam4: 'bg-exam-4 text-success-700 focus-visible:outline-none',\n },\n examsOutlined: {\n exam1:\n 'bg-exam-1 text-info-700 border border-info-700 focus-visible:outline-none',\n exam2:\n 'bg-exam-2 text-typography-1 border border-typography-1 focus-visible:outline-none',\n exam3:\n 'bg-exam-3 text-typography-2 border border-typography-2 focus-visible:outline-none',\n exam4:\n 'bg-exam-4 text-success-700 border border-success-700 focus-visible:outline-none',\n },\n resultStatus: {\n negative: 'bg-error text-error-800 focus-visible:outline-none',\n positive: 'bg-success text-success-800 focus-visible:outline-none',\n },\n notification: 'text-primary',\n} as const;\n\n/**\n * Lookup table for size classes\n */\nconst SIZE_CLASSES = {\n small: 'text-2xs px-2 py-1',\n medium: 'text-xs px-2 py-1',\n large: 'text-sm px-2 py-1',\n} as const;\n\nconst SIZE_CLASSES_ICON = {\n small: 'size-3',\n medium: 'size-3.5',\n large: 'size-4',\n} as const;\n\n/**\n * Badge component props interface\n */\ntype BadgeProps = {\n /** Content to be displayed inside the badge */\n children?: ReactNode;\n /** Ícone à direita do texto */\n iconRight?: ReactNode;\n /** Ícone à esquerda do texto */\n iconLeft?: ReactNode;\n /** Size of the badge */\n size?: 'small' | 'medium' | 'large';\n /** Visual variant of the badge */\n variant?:\n | 'solid'\n | 'outlined'\n | 'exams'\n | 'examsOutlined'\n | 'resultStatus'\n | 'notification';\n /** Action type of the badge */\n action?:\n | 'error'\n | 'warning'\n | 'success'\n | 'info'\n | 'muted'\n | 'exam1'\n | 'exam2'\n | 'exam3'\n | 'exam4'\n | 'positive'\n | 'negative';\n /** Additional CSS classes to apply */\n className?: string;\n notificationActive?: boolean;\n} & HTMLAttributes<HTMLDivElement>;\n\n/**\n * Badge component for Analytica Ensino platforms\n *\n * A flexible button component with multiple variants, sizes and actions.\n *\n * @param children - The content to display inside the badge\n * @param size - The size variant (extra-small, small, medium, large, extra-large)\n * @param variant - The visual style variant (solid, outline, link)\n * @param action - The action type (primary, positive, negative)\n * @param className - Additional CSS classes\n * @param props - All other standard div HTML attributes\n * @returns A styled badge element\n *\n * @example\n * ```tsx\n * <Badge variant=\"solid\" action=\"info\" size=\"medium\">\n * Information\n * </Badge>\n * ```\n */\nconst Badge = ({\n children,\n iconLeft,\n iconRight,\n size = 'medium',\n variant = 'solid',\n action = 'error',\n className = '',\n notificationActive = false,\n ...props\n}: BadgeProps) => {\n // Get classes from lookup tables\n const sizeClasses = SIZE_CLASSES[size];\n const sizeClassesIcon = SIZE_CLASSES_ICON[size];\n const variantActionMap = VARIANT_ACTION_CLASSES[variant] || {};\n const variantClasses =\n typeof variantActionMap === 'string'\n ? variantActionMap\n : ((variantActionMap as Record<string, string>)[action] ??\n (variantActionMap as Record<string, string>).muted ??\n '');\n\n const baseClasses =\n 'inline-flex items-center justify-center rounded-xs font-normal gap-1 relative';\n\n const baseClassesIcon = 'flex items-center';\n if (variant === 'notification') {\n return (\n <div\n className={cn(baseClasses, variantClasses, sizeClasses, className)}\n {...props}\n >\n <Bell size={24} className=\"text-current\" aria-hidden=\"true\" />\n\n {notificationActive && (\n <span\n data-testid=\"notification-dot\"\n className=\"absolute top-[5px] right-[10px] block h-2 w-2 rounded-full bg-indicator-error ring-2 ring-white\"\n />\n )}\n </div>\n );\n }\n return (\n <div\n className={cn(baseClasses, variantClasses, sizeClasses, className)}\n {...props}\n >\n {iconLeft && (\n <span className={cn(baseClassesIcon, sizeClassesIcon)}>{iconLeft}</span>\n )}\n {children}\n {iconRight && (\n <span className={cn(baseClassesIcon, sizeClassesIcon)}>\n {iconRight}\n </span>\n )}\n </div>\n );\n};\n\nexport default Badge;\n","import { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import { CheckCircle, XCircle } from 'phosphor-react';\nimport Badge from '../Badge/Badge';\nimport { RadioGroup, RadioGroupItem } from '../Radio/Radio';\nimport { forwardRef, HTMLAttributes, useId, useState } from 'react';\nimport { cn } from '../../utils/utils';\n\n/**\n * Interface para definir uma alternativa\n */\nexport interface Alternative {\n value: string;\n label: string;\n status?: 'correct' | 'incorrect' | 'neutral';\n disabled?: boolean;\n description?: string;\n}\n\n/**\n * Props do componente AlternativesList\n */\nexport interface AlternativesListProps {\n /** Lista de alternativas */\n alternatives: Alternative[];\n /** Nome do grupo de radio */\n name?: string;\n /** Valor selecionado por padrão */\n defaultValue?: string;\n /** Valor controlado */\n value?: string;\n /** Callback quando uma alternativa é selecionada */\n onValueChange?: (value: string) => void;\n /** Se o componente está desabilitado */\n disabled?: boolean;\n /** Layout das alternativas */\n layout?: 'default' | 'compact' | 'detailed';\n /** Classes CSS adicionais */\n className?: string;\n /** Modo de exibição: interativo (com radios funcionais) ou readonly (apenas visual) */\n mode?: 'interactive' | 'readonly';\n /** Valor selecionado pelo usuário (apenas para modo readonly) */\n selectedValue?: string;\n}\n\n/**\n * Componente reutilizável para exibir lista de alternativas com RadioGroup\n *\n * Suporta dois modos:\n * - `interactive`: Permite interação com radios (padrão)\n * - `readonly`: Apenas exibição visual dos estados\n *\n * @example\n * ```tsx\n * // Modo interativo (padrão)\n * <AlternativesList\n * mode=\"interactive\"\n * alternatives={[\n * { value: \"a\", label: \"Alternativa A\", status: \"correct\" },\n * { value: \"b\", label: \"Alternativa B\", status: \"incorrect\" },\n * { value: \"c\", label: \"Alternativa C\" }\n * ]}\n * defaultValue=\"a\"\n * onValueChange={(value) => console.log(value)}\n * />\n *\n * // Modo readonly - mostra seleção do usuário\n * <AlternativesList\n * mode=\"readonly\"\n * selectedValue=\"b\" // O que o usuário selecionou\n * alternatives={[\n * { value: \"a\", label: \"Resposta A\", status: \"correct\" }, // Mostra como correta\n * { value: \"b\", label: \"Resposta B\" }, // Mostra radio selecionado + badge incorreto\n * { value: \"c\", label: \"Resposta C\" }\n * ]}\n * />\n * ```\n */\nconst AlternativesList = ({\n alternatives,\n name,\n defaultValue,\n value,\n onValueChange,\n disabled = false,\n layout = 'default',\n className = '',\n mode = 'interactive',\n selectedValue,\n}: AlternativesListProps) => {\n // Gerar um ID único para garantir que cada instância tenha seu próprio grupo\n const uniqueId = useId();\n const groupName = name || `alternatives-${uniqueId}`;\n const [actualValue, setActualValue] = useState(value);\n // No modo readonly, não precisamos de interação\n const isReadonly = mode === 'readonly';\n const getStatusStyles = (\n status?: Alternative['status'],\n isReadonly?: boolean\n ) => {\n const hoverClass = isReadonly ? '' : 'hover:bg-background-50';\n\n switch (status) {\n case 'correct':\n return 'bg-success-background border-success-300';\n case 'incorrect':\n return 'bg-error-background border-error-300';\n default:\n return `bg-background border-border-100 ${hoverClass}`;\n }\n };\n\n const getStatusBadge = (status?: Alternative['status']) => {\n switch (status) {\n case 'correct':\n return (\n <Badge variant=\"solid\" action=\"success\" iconLeft={<CheckCircle />}>\n Resposta correta\n </Badge>\n );\n case 'incorrect':\n return (\n <Badge variant=\"solid\" action=\"error\" iconLeft={<XCircle />}>\n Resposta incorreta\n </Badge>\n );\n default:\n return null;\n }\n };\n\n const getLayoutClasses = () => {\n switch (layout) {\n case 'compact':\n return 'gap-2';\n case 'detailed':\n return 'gap-4';\n default:\n return 'gap-3.5';\n }\n };\n\n // Componente para renderizar alternativa no modo readonly\n const renderReadonlyAlternative = (alternative: Alternative) => {\n const alternativeId = alternative.value;\n const isUserSelected = selectedValue === alternative.value;\n const isCorrectAnswer = alternative.status === 'correct';\n\n // Determinar o status da alternativa para visualização\n let displayStatus: Alternative['status'] = undefined;\n if (isUserSelected && !isCorrectAnswer) {\n // Usuário selecionou alternativa incorreta\n displayStatus = 'incorrect';\n } else if (isCorrectAnswer) {\n // Alternativa correta (independente se foi selecionada ou não)\n displayStatus = 'correct';\n }\n\n const statusStyles = getStatusStyles(displayStatus, true);\n const statusBadge = getStatusBadge(displayStatus);\n\n // Radio visual - apenas mostra selecionado se o usuário escolheu esta alternativa\n const renderRadio = () => {\n const radioClasses = `w-6 h-6 rounded-full border-2 cursor-default transition-all duration-200 flex items-center justify-center ${\n isUserSelected\n ? 'border-primary-950 bg-background'\n : 'border-border-400 bg-background'\n }`;\n\n const dotClasses =\n 'w-3 h-3 rounded-full bg-primary-950 transition-all duration-200';\n\n return (\n <div className={radioClasses}>\n {isUserSelected && <div className={dotClasses} />}\n </div>\n );\n };\n\n if (layout === 'detailed') {\n return (\n <div\n key={alternativeId}\n className={cn(\n 'border-2 rounded-lg p-4 w-full',\n statusStyles,\n alternative.disabled ? 'opacity-50' : ''\n )}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"flex items-start gap-3 flex-1\">\n <div className=\"mt-1\">{renderRadio()}</div>\n <div className=\"flex-1\">\n <p\n className={cn(\n 'block font-medium',\n selectedValue === alternative.value || statusBadge\n ? 'text-text-950'\n : 'text-text-600'\n )}\n >\n {alternative.label}\n </p>\n {alternative.description && (\n <p className=\"text-sm text-text-600 mt-1\">\n {alternative.description}\n </p>\n )}\n </div>\n </div>\n {statusBadge && <div className=\"flex-shrink-0\">{statusBadge}</div>}\n </div>\n </div>\n );\n }\n\n return (\n <div\n key={alternativeId}\n className={cn(\n 'flex flex-row justify-between items-start gap-2 p-2 rounded-lg w-full',\n statusStyles,\n alternative.disabled ? 'opacity-50' : ''\n )}\n >\n <div className=\"flex items-center gap-2 flex-1\">\n {renderRadio()}\n <span\n className={cn(\n 'flex-1',\n selectedValue === alternative.value || statusBadge\n ? 'text-text-950'\n : 'text-text-600'\n )}\n >\n {alternative.label}\n </span>\n </div>\n {statusBadge && <div className=\"flex-shrink-0\">{statusBadge}</div>}\n </div>\n );\n };\n\n // Se for modo readonly, renderizar sem RadioGroup\n if (isReadonly) {\n return (\n <div\n className={cn('flex flex-col', getLayoutClasses(), 'w-full', className)}\n >\n {alternatives.map((alternative) =>\n renderReadonlyAlternative(alternative)\n )}\n </div>\n );\n }\n\n return (\n <RadioGroup\n name={groupName}\n defaultValue={defaultValue}\n value={value}\n onValueChange={(value) => {\n setActualValue(value);\n onValueChange?.(value);\n }}\n disabled={disabled}\n className={cn('flex flex-col', getLayoutClasses(), className)}\n >\n {alternatives.map((alternative, index) => {\n const alternativeId = alternative.value || `alt-${index}`;\n const statusStyles = getStatusStyles(alternative.status, false);\n const statusBadge = getStatusBadge(alternative.status);\n\n if (layout === 'detailed') {\n return (\n <div\n key={alternativeId}\n className={cn(\n 'border-2 rounded-lg p-4 transition-all',\n statusStyles,\n alternative.disabled\n ? 'opacity-50 cursor-not-allowed'\n : 'cursor-pointer'\n )}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"flex items-start gap-3 flex-1\">\n <RadioGroupItem\n value={alternative.value}\n id={alternativeId}\n disabled={alternative.disabled}\n className=\"mt-1\"\n />\n <div className=\"flex-1\">\n <label\n htmlFor={alternativeId}\n className={cn(\n 'block font-medium',\n actualValue === alternative.value\n ? 'text-text-950'\n : 'text-text-600',\n alternative.disabled\n ? 'cursor-not-allowed'\n : 'cursor-pointer'\n )}\n >\n {alternative.label}\n </label>\n {alternative.description && (\n <p className=\"text-sm text-text-600 mt-1\">\n {alternative.description}\n </p>\n )}\n </div>\n </div>\n {statusBadge && (\n <div className=\"flex-shrink-0\">{statusBadge}</div>\n )}\n </div>\n </div>\n );\n }\n\n return (\n <div\n key={alternativeId}\n className={cn(\n 'flex flex-row justify-between gap-2 items-start p-2 rounded-lg transition-all',\n statusStyles,\n alternative.disabled ? 'opacity-50 cursor-not-allowed' : ''\n )}\n >\n <div className=\"flex items-center gap-2 flex-1\">\n <RadioGroupItem\n value={alternative.value}\n id={alternativeId}\n disabled={alternative.disabled}\n />\n <label\n htmlFor={alternativeId}\n className={cn(\n 'flex-1',\n actualValue === alternative.value\n ? 'text-text-950'\n : 'text-text-600',\n alternative.disabled ? 'cursor-not-allowed' : 'cursor-pointer'\n )}\n >\n {alternative.label}\n </label>\n </div>\n {statusBadge && <div className=\"flex-shrink-0\">{statusBadge}</div>}\n </div>\n );\n })}\n </RadioGroup>\n );\n};\n\ninterface HeaderAlternativeProps extends HTMLAttributes<HTMLDivElement> {\n title: string;\n subTitle: string;\n content: string;\n}\n\nconst HeaderAlternative = forwardRef<HTMLDivElement, HeaderAlternativeProps>(\n ({ className, title, subTitle, content, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\n 'bg-background p-4 flex flex-col gap-4 rounded-xl',\n className\n )}\n {...props}\n >\n <span className=\"flex flex-col\">\n <p className=\"text-text-950 font-bold text-lg\">{title}</p>\n <p className=\"text-text-700 text-sm \">{subTitle}</p>\n </span>\n\n <p className=\"text-text-950 text-md\">{content}</p>\n </div>\n );\n }\n);\n\nexport { AlternativesList, HeaderAlternative };\n","import {\n InputHTMLAttributes,\n HTMLAttributes,\n ReactNode,\n forwardRef,\n useState,\n useId,\n ChangeEvent,\n useEffect,\n useRef,\n Children,\n cloneElement,\n isValidElement,\n ReactElement,\n} from 'react';\nimport { create, StoreApi, useStore } from 'zustand';\nimport Text from '../Text/Text';\nimport { cn } from '../../utils/utils';\n\n/**\n * Radio size variants\n */\ntype RadioSize = 'small' | 'medium' | 'large' | 'extraLarge';\n\n/**\n * Radio visual state\n */\ntype RadioState = 'default' | 'hovered' | 'focused' | 'invalid' | 'disabled';\n\n/**\n * Size configurations using Tailwind classes\n */\nconst SIZE_CLASSES = {\n small: {\n radio: 'w-5 h-5',\n textSize: 'sm' as const,\n spacing: 'gap-1.5',\n borderWidth: 'border-2',\n dotSize: 'w-2.5 h-2.5',\n labelHeight: 'h-5',\n },\n medium: {\n radio: 'w-6 h-6',\n textSize: 'md' as const,\n spacing: 'gap-2',\n borderWidth: 'border-2',\n dotSize: 'w-3 h-3',\n labelHeight: 'h-6',\n },\n large: {\n radio: 'w-7 h-7',\n textSize: 'lg' as const,\n spacing: 'gap-2',\n borderWidth: 'border-2',\n dotSize: 'w-3.5 h-3.5',\n labelHeight: 'h-7',\n },\n extraLarge: {\n radio: 'w-8 h-8',\n textSize: 'xl' as const,\n spacing: 'gap-3',\n borderWidth: 'border-2',\n dotSize: 'w-4 h-4',\n labelHeight: 'h-8',\n },\n} as const;\n\n/**\n * Focused state maintains the same sizes as default state\n * Only adds wrapper styling, does not change radio/dot sizes\n */\n\n/**\n * Base radio styling classes using design system colors\n */\nconst BASE_RADIO_CLASSES =\n 'rounded-full border cursor-pointer transition-all duration-200 flex items-center justify-center focus:outline-none';\n\n/**\n * State-based styling classes using design system colors from styles.css\n */\nconst STATE_CLASSES = {\n default: {\n unchecked: 'border-border-400 bg-background hover:border-border-500',\n checked: 'border-primary-950 bg-background hover:border-primary-800',\n },\n hovered: {\n unchecked: 'border-border-500 bg-background',\n checked: 'border-info-700 bg-background',\n },\n focused: {\n unchecked: 'border-border-400 bg-background',\n checked: 'border-primary-950 bg-background',\n },\n invalid: {\n unchecked: 'border-border-400 bg-background',\n checked: 'border-primary-950 bg-background',\n },\n disabled: {\n unchecked: 'border-border-400 bg-background cursor-not-allowed',\n checked: 'border-primary-950 bg-background cursor-not-allowed',\n },\n} as const;\n\n/**\n * Dot styling classes for the inner dot when checked\n */\nconst DOT_CLASSES = {\n default: 'bg-primary-950',\n hovered: 'bg-info-700',\n focused: 'bg-primary-950',\n invalid: 'bg-primary-950',\n disabled: 'bg-primary-950',\n} as const;\n\n/**\n * Radio component props interface\n */\nexport type RadioProps = {\n /** Label text to display next to the radio */\n label?: ReactNode;\n /** Size variant of the radio */\n size?: RadioSize;\n /** Visual state of the radio */\n state?: RadioState;\n /** Error message to display */\n errorMessage?: string;\n /** Helper text to display */\n helperText?: string;\n /** Additional CSS classes */\n className?: string;\n /** Label CSS classes */\n labelClassName?: string;\n /** Radio group name */\n name?: string;\n /** Radio value */\n value?: string;\n /** Default checked state for uncontrolled radios */\n defaultChecked?: boolean;\n} & Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'size' | 'type' | 'defaultChecked'\n>;\n\n/**\n * Radio component for Analytica Ensino platforms\n *\n * A radio button component with essential states, sizes and themes.\n * Uses the Analytica Ensino Design System colors from styles.css with automatic\n * light/dark mode support. Includes Text component integration for consistent typography.\n *\n * @example\n * ```tsx\n * // Basic radio\n * <Radio name=\"option\" value=\"1\" label=\"Option 1\" />\n *\n * // Small size\n * <Radio size=\"small\" name=\"option\" value=\"2\" label=\"Small option\" />\n *\n * // Invalid state\n * <Radio state=\"invalid\" name=\"option\" value=\"3\" label=\"Required field\" />\n *\n * // Disabled state\n * <Radio disabled name=\"option\" value=\"4\" label=\"Disabled option\" />\n *\n * // Default checked (uncontrolled)\n * <Radio defaultChecked name=\"option\" value=\"5\" label=\"Initially checked\" />\n * ```\n */\nconst Radio = forwardRef<HTMLInputElement, RadioProps>(\n (\n {\n label,\n size = 'medium',\n state = 'default',\n errorMessage,\n helperText,\n className = '',\n labelClassName = '',\n checked: checkedProp,\n defaultChecked = false,\n disabled,\n id,\n name,\n value,\n onChange,\n ...props\n },\n ref\n ) => {\n // Generate unique ID if not provided\n const generatedId = useId();\n const inputId = id ?? `radio-${generatedId}`;\n const inputRef = useRef<HTMLInputElement>(null);\n\n // Handle controlled vs uncontrolled behavior\n const [internalChecked, setInternalChecked] = useState(defaultChecked);\n const isControlled = checkedProp !== undefined;\n const checked = isControlled ? checkedProp : internalChecked;\n\n // Handle change events\n const handleChange = (event: ChangeEvent<HTMLInputElement>) => {\n const newChecked = event.target.checked;\n\n if (!isControlled) {\n setInternalChecked(newChecked);\n }\n\n // Prevent automatic scroll when input changes\n if (event.target) {\n event.target.blur();\n }\n\n onChange?.(event);\n };\n\n // Determine current state based on props\n const currentState = disabled ? 'disabled' : state;\n\n // Get size classes\n const sizeClasses = SIZE_CLASSES[size];\n\n // Focused state maintains original sizes, only adds wrapper\n const actualRadioSize = sizeClasses.radio;\n const actualDotSize = sizeClasses.dotSize;\n\n // Determine radio visual variant\n const radioVariant = checked ? 'checked' : 'unchecked';\n\n // Get styling classes\n const stylingClasses = STATE_CLASSES[currentState][radioVariant];\n\n // Border width logic - consistent across all states and sizes\n const getBorderWidth = () => {\n if (currentState === 'focused') {\n return 'border-2';\n }\n return sizeClasses.borderWidth;\n };\n\n const borderWidthClass = getBorderWidth();\n\n // Get final radio classes\n const radioClasses = cn(\n BASE_RADIO_CLASSES,\n actualRadioSize,\n borderWidthClass,\n stylingClasses,\n className\n );\n\n // Get dot classes\n const dotClasses = cn(\n actualDotSize,\n 'rounded-full',\n DOT_CLASSES[currentState],\n 'transition-all duration-200'\n );\n\n // Determine if wrapper is needed only for focused or invalid states\n const isWrapperNeeded =\n currentState === 'focused' || currentState === 'invalid';\n const wrapperBorderColor =\n currentState === 'focused'\n ? 'border-indicator-info'\n : 'border-indicator-error';\n\n // Determine text color based on state and checked status\n const getTextColor = () => {\n if (currentState === 'disabled') {\n return checked ? 'text-text-900' : 'text-text-600';\n }\n\n if (currentState === 'focused') {\n return 'text-text-900';\n }\n\n return checked ? 'text-text-900' : 'text-text-600';\n };\n\n // Determine cursor class based on disabled state\n const getCursorClass = () => {\n return currentState === 'disabled'\n ? 'cursor-not-allowed'\n : 'cursor-pointer';\n };\n\n return (\n <div className=\"flex flex-col\">\n <div\n className={cn(\n 'flex flex-row items-center',\n isWrapperNeeded\n ? cn('p-1 border-2', wrapperBorderColor, 'rounded-lg gap-1.5')\n : sizeClasses.spacing,\n disabled ? 'opacity-40' : ''\n )}\n >\n {/* Hidden native input for accessibility and form submission */}\n <input\n ref={(node) => {\n inputRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) ref.current = node;\n }}\n type=\"radio\"\n id={inputId}\n checked={checked}\n disabled={disabled}\n name={name}\n value={value}\n onChange={handleChange}\n className=\"sr-only\"\n style={{\n position: 'absolute',\n left: '-9999px',\n visibility: 'hidden',\n }}\n {...props}\n />\n\n {/* Custom styled radio */}\n <button\n type=\"button\"\n className={radioClasses}\n disabled={disabled}\n aria-pressed={checked}\n onClick={(e) => {\n // Prevent scroll when radio is clicked\n e.preventDefault();\n if (!disabled) {\n // Simulate click on hidden input\n if (inputRef.current) {\n inputRef.current.click();\n // Remove focus to prevent scroll behavior\n inputRef.current.blur();\n }\n }\n }}\n onKeyDown={(e) => {\n // Handle keyboard activation (Enter or Space)\n if ((e.key === 'Enter' || e.key === ' ') && !disabled) {\n e.preventDefault();\n if (inputRef.current) {\n inputRef.current.click();\n inputRef.current.blur();\n }\n }\n }}\n >\n {/* Show dot when checked */}\n {checked && <div className={dotClasses} />}\n </button>\n\n {/* Label text */}\n {label && (\n <div\n className={cn(\n 'flex flex-row items-center',\n sizeClasses.labelHeight,\n 'flex-1 min-w-0'\n )}\n >\n <Text\n as=\"label\"\n htmlFor={inputId}\n size={sizeClasses.textSize}\n weight=\"normal\"\n className={cn(\n getCursorClass(),\n 'select-none leading-normal flex items-center font-roboto truncate',\n labelClassName\n )}\n color={getTextColor()}\n >\n {label}\n </Text>\n </div>\n )}\n </div>\n\n {/* Error message */}\n {errorMessage && (\n <Text\n size=\"sm\"\n weight=\"normal\"\n className=\"mt-1.5 truncate\"\n color=\"text-error-600\"\n >\n {errorMessage}\n </Text>\n )}\n\n {/* Helper text */}\n {helperText && !errorMessage && (\n <Text\n size=\"sm\"\n weight=\"normal\"\n className=\"mt-1.5 truncate\"\n color=\"text-text-500\"\n >\n {helperText}\n </Text>\n )}\n </div>\n );\n }\n);\n\nRadio.displayName = 'Radio';\n\n/**\n * RadioGroup store interface\n */\ninterface RadioGroupStore {\n value: string;\n setValue: (value: string) => void;\n onValueChange?: (value: string) => void;\n disabled: boolean;\n name: string;\n}\n\ntype RadioGroupStoreApi = StoreApi<RadioGroupStore>;\n\n/**\n * Create a new RadioGroup store\n */\nconst createRadioGroupStore = (\n name: string,\n defaultValue: string,\n disabled: boolean,\n onValueChange?: (value: string) => void\n): RadioGroupStoreApi =>\n create<RadioGroupStore>((set, get) => ({\n value: defaultValue,\n setValue: (value) => {\n if (!get().disabled) {\n set({ value });\n get().onValueChange?.(value);\n }\n },\n onValueChange,\n disabled,\n name,\n }));\n\n/**\n * Hook to access RadioGroup store\n */\nexport const useRadioGroupStore = (externalStore?: RadioGroupStoreApi) => {\n if (!externalStore) {\n throw new Error('RadioGroupItem must be used within a RadioGroup');\n }\n return externalStore;\n};\n\n/**\n * Inject store into RadioGroupItem children\n */\nconst injectStore = (\n children: ReactNode,\n store: RadioGroupStoreApi\n): ReactNode =>\n Children.map(children, (child) => {\n if (!isValidElement(child)) return child;\n /* eslint-disable-next-line @typescript-eslint/no-explicit-any */\n const typedChild = child as ReactElement<any>;\n const shouldInject = typedChild.type === RadioGroupItem;\n return cloneElement(typedChild, {\n ...(shouldInject ? { store } : {}),\n ...(typedChild.props.children\n ? { children: injectStore(typedChild.props.children, store) }\n : {}),\n });\n });\n\n/**\n * RadioGroup component props interface\n */\nexport type RadioGroupProps = {\n /** Current selected value */\n value?: string;\n /** Default selected value for uncontrolled usage */\n defaultValue?: string;\n /** Callback when selection changes */\n onValueChange?: (value: string) => void;\n /** Group name for all radios */\n name?: string;\n /** Disabled state for the entire group */\n disabled?: boolean;\n /** Additional CSS classes */\n className?: string;\n /** Children components */\n children: ReactNode;\n} & Omit<HTMLAttributes<HTMLDivElement>, 'onChange' | 'defaultValue'>;\n\n/**\n * RadioGroup component for flexible radio group composition\n *\n * Uses Zustand for state management with automatic store injection.\n * Allows complete control over layout and styling by composing with RadioGroupItem.\n *\n * @example\n * ```tsx\n * <RadioGroup defaultValue=\"option1\" onValueChange={setValue}>\n * <div className=\"flex items-center gap-3\">\n * <RadioGroupItem value=\"option1\" id=\"r1\" />\n * <label htmlFor=\"r1\">Option 1</label>\n * </div>\n * <div className=\"flex items-center gap-3\">\n * <RadioGroupItem value=\"option2\" id=\"r2\" />\n * <label htmlFor=\"r2\">Option 2</label>\n * </div>\n * </RadioGroup>\n * ```\n */\nconst RadioGroup = forwardRef<HTMLDivElement, RadioGroupProps>(\n (\n {\n value: propValue,\n defaultValue = '',\n onValueChange,\n name: propName,\n disabled = false,\n className = '',\n children,\n ...props\n },\n ref\n ) => {\n // Generate unique name if not provided\n const generatedId = useId();\n const name = propName || `radio-group-${generatedId}`;\n\n // Create store reference\n const storeRef = useRef<RadioGroupStoreApi>(null);\n storeRef.current ??= createRadioGroupStore(\n name,\n defaultValue,\n disabled,\n onValueChange\n );\n const store = storeRef.current;\n\n // Get store actions\n const { setValue } = useStore(store, (s) => s);\n\n // Call onValueChange with initial value\n useEffect(() => {\n const currentValue = store.getState().value;\n if (currentValue && onValueChange) {\n onValueChange(currentValue);\n }\n }, []); // Empty dependency array for mount only\n\n // Handle controlled value changes\n useEffect(() => {\n if (propValue !== undefined) {\n setValue(propValue);\n }\n }, [propValue, setValue]);\n\n // Update disabled state\n useEffect(() => {\n store.setState({ disabled });\n }, [disabled, store]);\n\n return (\n <div\n ref={ref}\n className={className}\n role=\"radiogroup\"\n aria-label={name}\n {...props}\n >\n {injectStore(children, store)}\n </div>\n );\n }\n);\n\nRadioGroup.displayName = 'RadioGroup';\n\n/**\n * RadioGroupItem component props interface\n */\nexport type RadioGroupItemProps = {\n /** Value for this radio item */\n value: string;\n /** Store reference (automatically injected by RadioGroup) */\n store?: RadioGroupStoreApi;\n /** Disabled state for this specific item */\n disabled?: boolean;\n /** Size variant */\n size?: RadioSize;\n /** Visual state */\n state?: RadioState;\n /** Additional CSS classes */\n className?: string;\n} & Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'type' | 'name' | 'value' | 'checked' | 'onChange' | 'size'\n>;\n\n/**\n * RadioGroupItem component for use within RadioGroup\n *\n * A radio button without label that works within RadioGroup context.\n * Provides just the radio input for maximum flexibility in composition.\n *\n * @example\n * ```tsx\n * <RadioGroup defaultValue=\"option1\">\n * <div className=\"flex items-center gap-3\">\n * <RadioGroupItem value=\"option1\" id=\"r1\" />\n * <label htmlFor=\"r1\">Option 1</label>\n * </div>\n * </RadioGroup>\n * ```\n */\nconst RadioGroupItem = forwardRef<HTMLInputElement, RadioGroupItemProps>(\n (\n {\n value,\n store: externalStore,\n disabled: itemDisabled,\n size = 'medium',\n state = 'default',\n className = '',\n id,\n ...props\n },\n ref\n ) => {\n // Get store and state\n const store = useRadioGroupStore(externalStore);\n const {\n value: groupValue,\n setValue,\n disabled: groupDisabled,\n name,\n } = useStore(store);\n\n // Generate unique ID if not provided\n const generatedId = useId();\n const inputId = id ?? `radio-item-${generatedId}`;\n\n // Determine states\n const isChecked = groupValue === value;\n const isDisabled = groupDisabled || itemDisabled;\n const currentState = isDisabled ? 'disabled' : state;\n\n // Use standard Radio component for consistency and simplicity\n return (\n <Radio\n ref={ref}\n id={inputId}\n name={name}\n value={value}\n checked={isChecked}\n disabled={isDisabled}\n size={size}\n state={currentState}\n className={className}\n onChange={(e) => {\n if (e.target.checked && !isDisabled) {\n setValue(value);\n }\n }}\n {...props}\n />\n );\n }\n);\n\nRadioGroupItem.displayName = 'RadioGroupItem';\n\nexport default Radio;\nexport { RadioGroup, RadioGroupItem };\n","import { ComponentPropsWithoutRef, ElementType, ReactNode } from 'react';\nimport { cn } from '../../utils/utils';\n\n/**\n * Base text component props\n */\ntype BaseTextProps = {\n /** Content to be displayed */\n children?: ReactNode;\n /** Text size variant */\n size?:\n | '2xs'\n | 'xs'\n | 'sm'\n | 'md'\n | 'lg'\n | 'xl'\n | '2xl'\n | '3xl'\n | '4xl'\n | '5xl'\n | '6xl';\n /** Font weight variant */\n weight?:\n | 'hairline'\n | 'light'\n | 'normal'\n | 'medium'\n | 'semibold'\n | 'bold'\n | 'extrabold'\n | 'black';\n /** Color variant - white for light backgrounds, black for dark backgrounds */\n color?: string;\n /** Additional CSS classes to apply */\n className?: string;\n};\n\n/**\n * Polymorphic text component props that ensures type safety based on the 'as' prop\n */\ntype TextProps<T extends ElementType = 'p'> = BaseTextProps & {\n /** HTML tag to render */\n as?: T;\n} & Omit<ComponentPropsWithoutRef<T>, keyof BaseTextProps>;\n\n/**\n * Text component for Analytica Ensino platforms\n *\n * A flexible polymorphic text component with multiple sizes, weights, and colors.\n * Automatically adapts to dark and light themes with full type safety.\n *\n * @param children - The content to display\n * @param size - The text size variant (2xs, xs, sm, md, lg, xl, 2xl, 3xl, 4xl, 5xl, 6xl)\n * @param weight - The font weight variant (hairline, light, normal, medium, semibold, bold, extrabold, black)\n * @param color - The color variant - adapts to theme\n * @param as - The HTML tag to render - determines allowed attributes via TypeScript\n * @param className - Additional CSS classes\n * @param props - HTML attributes valid for the chosen tag only\n * @returns A styled text element with type-safe attributes\n *\n * @example\n * ```tsx\n * <Text size=\"lg\" weight=\"bold\" color=\"text-info-800\">\n * This is a large, bold text\n * </Text>\n *\n * <Text as=\"a\" href=\"/link\" target=\"_blank\">\n * Link with type-safe anchor attributes\n * </Text>\n *\n * <Text as=\"button\" onClick={handleClick} disabled>\n * Button with type-safe button attributes\n * </Text>\n * ```\n */\nconst Text = <T extends ElementType = 'p'>({\n children,\n size = 'md',\n weight = 'normal',\n color = 'text-text-950',\n as,\n className = '',\n ...props\n}: TextProps<T>) => {\n let sizeClasses = '';\n let weightClasses = '';\n\n // Text size classes mapping\n const sizeClassMap = {\n '2xs': 'text-2xs',\n xs: 'text-xs',\n sm: 'text-sm',\n md: 'text-md',\n lg: 'text-lg',\n xl: 'text-xl',\n '2xl': 'text-2xl',\n '3xl': 'text-3xl',\n '4xl': 'text-4xl',\n '5xl': 'text-5xl',\n '6xl': 'text-6xl',\n } as const;\n\n sizeClasses = sizeClassMap[size] ?? sizeClassMap.md;\n\n // Font weight classes mapping\n const weightClassMap = {\n hairline: 'font-hairline',\n light: 'font-light',\n normal: 'font-normal',\n medium: 'font-medium',\n semibold: 'font-semibold',\n bold: 'font-bold',\n extrabold: 'font-extrabold',\n black: 'font-black',\n } as const;\n\n weightClasses = weightClassMap[weight] ?? weightClassMap.normal;\n\n const baseClasses = 'font-primary';\n const Component = as ?? ('p' as ElementType);\n\n return (\n <Component\n className={cn(baseClasses, sizeClasses, weightClasses, color, className)}\n {...props}\n >\n {children}\n </Component>\n );\n};\n\nexport default Text;\n","import { ButtonHTMLAttributes, ReactNode } from 'react';\nimport { cn } from '../../utils/utils';\n\n/**\n * Lookup table for variant and action class combinations\n */\nconst VARIANT_ACTION_CLASSES = {\n solid: {\n primary:\n 'bg-primary-950 text-text border border-primary-950 hover:bg-primary-800 hover:border-primary-800 focus-visible:outline-none focus-visible:bg-primary-950 focus-visible:ring-2 focus-visible:ring-offset-0 focus-visible:ring-indicator-info active:bg-primary-700 active:border-primary-700 disabled:bg-primary-500 disabled:border-primary-500 disabled:opacity-40 disabled:cursor-not-allowed',\n positive:\n 'bg-success-500 text-text border border-success-500 hover:bg-success-600 hover:border-success-600 focus-visible:outline-none focus-visible:bg-success-500 focus-visible:ring-2 focus-visible:ring-offset-0 focus-visible:ring-indicator-info active:bg-success-700 active:border-success-700 disabled:bg-success-500 disabled:border-success-500 disabled:opacity-40 disabled:cursor-not-allowed',\n negative:\n 'bg-error-500 text-text border border-error-500 hover:bg-error-600 hover:border-error-600 focus-visible:outline-none focus-visible:bg-error-500 focus-visible:ring-2 focus-visible:ring-offset-0 focus-visible:ring-indicator-info active:bg-error-700 active:border-error-700 disabled:bg-error-500 disabled:border-error-500 disabled:opacity-40 disabled:cursor-not-allowed',\n },\n outline: {\n primary:\n 'bg-transparent text-primary-950 border border-primary-950 hover:bg-background-50 hover:text-primary-400 hover:border-primary-400 focus-visible:border-0 focus-visible:outline-none focus-visible:text-primary-600 focus-visible:ring-2 focus-visible:ring-offset-0 focus-visible:ring-indicator-info active:text-primary-700 active:border-primary-700 disabled:opacity-40 disabled:cursor-not-allowed',\n positive:\n 'bg-transparent text-success-500 border border-success-300 hover:bg-background-50 hover:text-success-400 hover:border-success-400 focus-visible:border-0 focus-visible:outline-none focus-visible:text-success-600 focus-visible:ring-2 focus-visible:ring-offset-0 focus-visible:ring-indicator-info active:text-success-700 active:border-success-700 disabled:opacity-40 disabled:cursor-not-allowed',\n negative:\n 'bg-transparent text-error-500 border border-error-300 hover:bg-background-50 hover:text-error-400 hover:border-error-400 focus-visible:border-0 focus-visible:outline-none focus-visible:text-error-600 focus-visible:ring-2 focus-visible:ring-offset-0 focus-visible:ring-indicator-info active:text-error-700 active:border-error-700 disabled:opacity-40 disabled:cursor-not-allowed',\n },\n link: {\n primary:\n 'bg-transparent text-primary-950 hover:text-primary-400 focus-visible:outline-none focus-visible:text-primary-600 focus-visible:ring-2 focus-visible:ring-offset-0 focus-visible:ring-indicator-info active:text-primary-700 disabled:opacity-40 disabled:cursor-not-allowed',\n positive:\n 'bg-transparent text-success-500 hover:text-success-400 focus-visible:outline-none focus-visible:text-success-600 focus-visible:ring-2 focus-visible:ring-offset-0 focus-visible:ring-indicator-info active:text-success-700 disabled:opacity-40 disabled:cursor-not-allowed',\n negative:\n 'bg-transparent text-error-500 hover:text-error-400 focus-visible:outline-none focus-visible:text-error-600 focus-visible:ring-2 focus-visible:ring-offset-0 focus-visible:ring-indicator-info active:text-error-700 disabled:opacity-40 disabled:cursor-not-allowed',\n },\n} as const;\n\n/**\n * Lookup table for size classes\n */\nconst SIZE_CLASSES = {\n 'extra-small': 'text-xs px-3.5 py-2',\n small: 'text-sm px-4 py-2.5',\n medium: 'text-md px-5 py-2.5',\n large: 'text-lg px-6 py-3',\n 'extra-large': 'text-lg px-7 py-3.5',\n} as const;\n\n/**\n * Button component props interface\n */\ntype ButtonProps = {\n /** Content to be displayed inside the button */\n children: ReactNode;\n /** Ícone à esquerda do texto */\n iconLeft?: ReactNode;\n /** Ícone à direita do texto */\n iconRight?: ReactNode;\n /** Size of the button */\n size?: 'extra-small' | 'small' | 'medium' | 'large' | 'extra-large';\n /** Visual variant of the button */\n variant?: 'solid' | 'outline' | 'link';\n /** Action type of the button */\n action?: 'primary' | 'positive' | 'negative';\n /** Additional CSS classes to apply */\n className?: string;\n} & ButtonHTMLAttributes<HTMLButtonElement>;\n\n/**\n * Button component for Analytica Ensino platforms\n *\n * A flexible button component with multiple variants, sizes and actions.\n *\n * @param children - The content to display inside the button\n * @param size - The size variant (extra-small, small, medium, large, extra-large)\n * @param variant - The visual style variant (solid, outline, link)\n * @param action - The action type (primary, positive, negative)\n * @param className - Additional CSS classes\n * @param props - All other standard button HTML attributes\n * @returns A styled button element\n *\n * @example\n * ```tsx\n * <Button variant=\"solid\" action=\"primary\" size=\"medium\" onClick={() => console.log('clicked')}>\n * Click me\n * </Button>\n * ```\n */\nconst Button = ({\n children,\n iconLeft,\n iconRight,\n size = 'medium',\n variant = 'solid',\n action = 'primary',\n className = '',\n disabled,\n type = 'button',\n ...props\n}: ButtonProps) => {\n // Get classes from lookup tables\n const sizeClasses = SIZE_CLASSES[size];\n const variantClasses = VARIANT_ACTION_CLASSES[variant][action];\n\n const baseClasses =\n 'inline-flex items-center justify-center rounded-full cursor-pointer font-medium';\n\n return (\n <button\n className={cn(baseClasses, variantClasses, sizeClasses, className)}\n disabled={disabled}\n type={type}\n {...props}\n >\n {iconLeft && <span className=\"mr-2 flex items-center\">{iconLeft}</span>}\n {children}\n {iconRight && <span className=\"ml-2 flex items-center\">{iconRight}</span>}\n </button>\n );\n};\n\nexport default Button;\n","import { ButtonHTMLAttributes, ReactNode, forwardRef } from 'react';\nimport { cn } from '../../utils/utils';\n\n/**\n * IconButton component props interface\n */\nexport type IconButtonProps = {\n /** Ícone a ser exibido no botão */\n icon: ReactNode;\n /** Tamanho do botão */\n size?: 'sm' | 'md';\n /** Estado de seleção/ativo do botão - permanece ativo até ser clicado novamente ou outro botão ser ativado */\n active?: boolean;\n /** Additional CSS classes to apply */\n className?: string;\n} & ButtonHTMLAttributes<HTMLButtonElement>;\n\n/**\n * IconButton component for Analytica Ensino platforms\n *\n * Um botão compacto apenas com ícone, ideal para menus dropdown,\n * barras de ferramentas e ações secundárias.\n * Oferece dois tamanhos com estilo consistente.\n * Estado ativo permanece até ser clicado novamente ou outro botão ser ativado.\n * Suporta forwardRef para acesso programático ao elemento DOM.\n *\n * @param icon - O ícone a ser exibido no botão\n * @param size - Tamanho do botão (sm, md)\n * @param active - Estado ativo/selecionado do botão\n * @param className - Classes CSS adicionais\n * @param props - Todos os outros atributos HTML padrão de button\n * @returns Um elemento button compacto estilizado apenas com ícone\n *\n * @example\n * ```tsx\n * <IconButton\n * icon={<MoreVerticalIcon />}\n * size=\"sm\"\n * onClick={() => openMenu()}\n * />\n * ```\n *\n * @example\n * ```tsx\n * // Botão ativo em uma barra de ferramentas - permanece ativo até outro clique\n * <IconButton\n * icon={<BoldIcon />}\n * active={isBold}\n * onClick={toggleBold}\n * />\n * ```\n *\n * @example\n * ```tsx\n * // Usando ref para controle programático\n * const buttonRef = useRef<HTMLButtonElement>(null);\n *\n * <IconButton\n * ref={buttonRef}\n * icon={<EditIcon />}\n * size=\"md\"\n * onClick={() => startEditing()}\n * />\n * ```\n */\nconst IconButton = forwardRef<HTMLButtonElement, IconButtonProps>(\n (\n { icon, size = 'md', active = false, className = '', disabled, ...props },\n ref\n ) => {\n // Classes base para todos os estados\n const baseClasses = [\n 'inline-flex',\n 'items-center',\n 'justify-center',\n 'rounded-lg',\n 'font-medium',\n 'bg-transparent',\n 'text-text-950',\n 'cursor-pointer',\n 'hover:bg-primary-600',\n 'hover:text-text',\n 'focus-visible:outline-none',\n 'focus-visible:ring-2',\n 'focus-visible:ring-offset-0',\n 'focus-visible:ring-indicator-info',\n 'disabled:opacity-50',\n 'disabled:cursor-not-allowed',\n 'disabled:pointer-events-none',\n ];\n\n // Classes de tamanho\n const sizeClasses = {\n sm: ['w-6', 'h-6', 'text-sm'],\n md: ['w-10', 'h-10', 'text-base'],\n };\n\n // Classes de estado ativo\n const activeClasses = active\n ? ['!bg-primary-50', '!text-primary-950', 'hover:!bg-primary-100']\n : [];\n\n const allClasses = [\n ...baseClasses,\n ...sizeClasses[size],\n ...activeClasses,\n ].join(' ');\n\n // Garantir acessibilidade com aria-label padrão\n const ariaLabel = props['aria-label'] ?? 'Botão de ação';\n\n return (\n <button\n ref={ref}\n type=\"button\"\n className={cn(allClasses, className)}\n disabled={disabled}\n aria-pressed={active}\n aria-label={ariaLabel}\n {...props}\n >\n <span className=\"flex items-center justify-center\">{icon}</span>\n </button>\n );\n }\n);\n\nIconButton.displayName = 'IconButton';\n\nexport default IconButton;\n","import { create } from 'zustand';\nimport { devtools } from 'zustand/middleware';\n\nexport enum QUESTION_DIFFICULTY {\n FACIL = 'FACIL',\n MEDIO = 'MEDIO',\n DIFICIL = 'DIFICIL',\n}\n\nexport enum QUESTION_TYPE {\n ALTERNATIVA = 'ALTERNATIVA',\n DISSERTATIVA = 'DISSERTATIVA',\n MULTIPLA_CHOICE = 'MULTIPLA_CHOICE',\n VERDADEIRO_FALSO = 'VERDADEIRO_FALSO',\n LIGAR_PONTOS = 'LIGAR_PONTOS',\n PREENCHER = 'PREENCHER',\n IMAGEM = 'IMAGEM',\n}\n\nexport enum QUESTION_STATUS {\n PENDENTE_AVALIACAO = 'PENDENTE_AVALIACAO',\n RESPOSTA_CORRETA = 'RESPOSTA_CORRETA',\n RESPOSTA_INCORRETA = 'RESPOSTA_INCORRETA',\n NAO_RESPONDIDO = 'NAO_RESPONDIDO',\n}\n\nexport enum ANSWER_STATUS {\n RESPOSTA_CORRETA = 'RESPOSTA_CORRETA',\n RESPOSTA_INCORRETA = 'RESPOSTA_INCORRETA',\n PENDENTE_AVALIACAO = 'PENDENTE_AVALIACAO',\n}\n\nexport interface QuestionResult {\n answers: {\n id: string;\n questionId: string;\n answer: string | null;\n selectedOptions: {\n optionId: string;\n }[];\n answerStatus: ANSWER_STATUS;\n statement: string;\n questionType: QUESTION_TYPE;\n difficultyLevel: QUESTION_DIFFICULTY;\n solutionExplanation: string | null;\n correctOption: string;\n createdAt: string;\n updatedAt: string;\n options?: {\n id: string;\n option: string;\n isCorrect: boolean;\n }[];\n knowledgeMatrix: {\n areaKnowledge: {\n id: string;\n name: string;\n } | null;\n subject: {\n id: string;\n name: string;\n } | null;\n topic: {\n id: string;\n name: string;\n } | null;\n subtopic: {\n id: string;\n name: string;\n } | null;\n content: {\n id: string;\n name: string;\n } | null;\n }[];\n teacherFeedback: string | null;\n attachment: string | null;\n score: number | null;\n gradedAt: string | null;\n gradedBy: string | null;\n }[];\n statistics: {\n totalAnswered: number;\n correctAnswers: number;\n incorrectAnswers: number;\n pendingAnswers: number;\n score: number;\n };\n}\n\nexport interface Question {\n id: string;\n statement: string;\n questionType: QUESTION_TYPE;\n difficultyLevel: QUESTION_DIFFICULTY;\n description: string;\n examBoard: string | null;\n examYear: string | null;\n solutionExplanation: string | null;\n answer: null;\n answerStatus: ANSWER_STATUS;\n options: {\n id: string;\n option: string;\n }[];\n knowledgeMatrix: {\n areaKnowledge: {\n id: string;\n name: string;\n };\n subject: {\n id: string;\n name: string;\n };\n topic: {\n id: string;\n name: string;\n };\n subtopic: {\n id: string;\n name: string;\n };\n content: {\n id: string;\n name: string;\n };\n }[];\n correctOptionIds?: string[];\n}\n\nexport interface Simulated {\n id: string;\n title: string;\n type: string;\n subtype: string;\n difficulty: string | null;\n notification: string | null;\n status: string;\n startDate: string | null;\n finalDate: string | null;\n canRetry: boolean;\n createdAt: string | null;\n updatedAt: string | null;\n questions: Question[];\n}\n\nexport interface Activity {\n id: string;\n title: string;\n questions: Question[];\n}\n\nexport interface Lesson {\n id: string;\n title: string;\n questions: Question[];\n}\n\nexport interface UserAnswerItem {\n questionId: string;\n activityId: string;\n userId: string;\n answer: string | null;\n optionId: string | null;\n questionType: QUESTION_TYPE;\n answerStatus: ANSWER_STATUS;\n}\n\nexport interface QuizState {\n // Data\n bySimulated?: Simulated;\n byActivity?: Activity;\n byQuestionary?: Lesson;\n\n // UI State\n currentQuestionIndex: number;\n selectedAnswers: Record<string, string>;\n userAnswers: UserAnswerItem[];\n timeElapsed: number;\n isStarted: boolean;\n isFinished: boolean;\n userId: string;\n variant: 'result' | 'default';\n // Actions\n setBySimulated: (simulated: Simulated) => void;\n setByActivity: (activity: Activity) => void;\n setByQuestionary: (lesson: Lesson) => void;\n setQuestionResult: (questionResult: QuestionResult) => void;\n setUserId: (userId: string) => void;\n setUserAnswers: (userAnswers: UserAnswerItem[]) => void;\n setVariant: (variant: 'result' | 'default') => void;\n // Quiz Navigation\n goToNextQuestion: () => void;\n goToPreviousQuestion: () => void;\n goToQuestion: (index: number) => void;\n getActiveQuiz: () => {\n quiz: Simulated | Activity | Lesson;\n type: 'bySimulated' | 'byActivity' | 'byQuestionary';\n } | null;\n\n // Quiz Actions\n selectAnswer: (questionId: string, answerId: string) => void;\n selectMultipleAnswer: (questionId: string, answerIds: string[]) => void;\n selectDissertativeAnswer: (questionId: string, answer: 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: () => UserAnswerItem | undefined;\n getAllCurrentAnswer: () => UserAnswerItem[] | undefined;\n getQuizTitle: () => string;\n formatTime: (seconds: number) => string;\n getUserAnswers: () => UserAnswerItem[];\n getUnansweredQuestionsFromUserAnswers: () => number[];\n getQuestionsGroupedBySubject: () => { [key: string]: Question[] };\n getUserId: () => string;\n setCurrentQuestion: (question: Question) => void;\n\n // New methods for userAnswers\n getQuestionIndex: (questionId: string) => number;\n getUserAnswerByQuestionId: (questionId: string) => UserAnswerItem | null;\n isQuestionAnsweredByUserAnswers: (questionId: string) => boolean;\n getQuestionStatusFromUserAnswers: (\n questionId: string\n ) => 'answered' | 'unanswered' | 'skipped';\n getUserAnswersForActivity: () => UserAnswerItem[];\n // Answer status management\n setAnswerStatus: (questionId: string, status: ANSWER_STATUS) => void;\n getAnswerStatus: (questionId: string) => ANSWER_STATUS | null;\n\n // Question Result\n questionsResult: QuestionResult | null;\n currentQuestionResult: QuestionResult['answers'] | null;\n setQuestionsResult: (questionsResult: QuestionResult) => void;\n setCurrentQuestionResult: (\n currentQuestionResult: QuestionResult['answers']\n ) => void;\n getQuestionResultByQuestionId: (\n questionId: string\n ) => QuestionResult['answers'][number] | null;\n getQuestionResultStatistics: () => QuestionResult['statistics'] | null;\n getQuestionResult: () => QuestionResult | null;\n getCurrentQuestionResult: () => QuestionResult['answers'] | null;\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 (get().isFinished) {\n return;\n }\n\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 userAnswers: [],\n timeElapsed: 0,\n isStarted: false,\n isFinished: false,\n userId: '',\n variant: 'default',\n questionsResult: null,\n currentQuestionResult: null,\n // Setters\n setBySimulated: (simulated) => set({ bySimulated: simulated }),\n setByActivity: (activity) => set({ byActivity: activity }),\n setByQuestionary: (lesson) => set({ byQuestionary: lesson }),\n setUserId: (userId) => set({ userId }),\n setUserAnswers: (userAnswers) => set({ userAnswers }),\n getUserId: () => get().userId,\n setVariant: (variant) => set({ variant }),\n setQuestionResult: (questionsResult) => set({ questionsResult }),\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 getActiveQuiz: () => {\n const { bySimulated, byActivity, byQuestionary } = get();\n if (bySimulated)\n return { quiz: bySimulated, type: 'bySimulated' as const };\n if (byActivity)\n return { quiz: byActivity, type: 'byActivity' as const };\n if (byQuestionary)\n return { quiz: byQuestionary, type: 'byQuestionary' as const };\n return null;\n },\n\n selectAnswer: (questionId, answerId) => {\n const { getActiveQuiz, userAnswers } = get();\n const activeQuiz = getActiveQuiz();\n\n if (!activeQuiz) return;\n\n const activityId = activeQuiz.quiz.id;\n const userId = get().getUserId();\n\n if (!userId || userId === '') {\n console.warn('selectAnswer called before userId is set');\n return;\n }\n\n const question = activeQuiz.quiz.questions.find(\n (q) => q.id === questionId\n );\n if (!question) return;\n\n const existingAnswerIndex = userAnswers.findIndex(\n (answer) => answer.questionId === questionId\n );\n\n const newUserAnswer: UserAnswerItem = {\n questionId,\n activityId,\n userId,\n answer:\n question.questionType === QUESTION_TYPE.DISSERTATIVA\n ? answerId\n : null,\n optionId:\n question.questionType === QUESTION_TYPE.DISSERTATIVA\n ? null\n : answerId,\n questionType: question.questionType,\n answerStatus: ANSWER_STATUS.PENDENTE_AVALIACAO,\n };\n\n let updatedUserAnswers;\n if (existingAnswerIndex !== -1) {\n updatedUserAnswers = [...userAnswers];\n updatedUserAnswers[existingAnswerIndex] = newUserAnswer;\n } else {\n updatedUserAnswers = [...userAnswers, newUserAnswer];\n }\n\n set({\n userAnswers: updatedUserAnswers,\n });\n },\n\n selectMultipleAnswer: (questionId, answerIds) => {\n const { getActiveQuiz, userAnswers } = get();\n const activeQuiz = getActiveQuiz();\n\n if (!activeQuiz) return;\n\n const activityId = activeQuiz.quiz.id;\n const userId = get().getUserId();\n\n if (!userId || userId === '') {\n console.warn('selectMultipleAnswer called before userId is set');\n return;\n }\n\n const question = activeQuiz.quiz.questions.find(\n (q) => q.id === questionId\n );\n if (!question) return;\n\n // Remove all existing answers for this questionId\n const filteredUserAnswers = userAnswers.filter(\n (answer) => answer.questionId !== questionId\n );\n\n // Create new UserAnswerItem objects for each answerId\n const newUserAnswers: UserAnswerItem[] = answerIds.map(\n (answerId) => ({\n questionId,\n activityId,\n userId,\n answer: null, // selectMultipleAnswer is for non-dissertative questions\n optionId: answerId, // selectMultipleAnswer should only set optionId\n questionType: question.questionType,\n answerStatus: ANSWER_STATUS.PENDENTE_AVALIACAO,\n })\n );\n\n // Combine filtered answers with new answers\n const updatedUserAnswers = [\n ...filteredUserAnswers,\n ...newUserAnswers,\n ];\n\n set({\n userAnswers: updatedUserAnswers,\n });\n },\n\n selectDissertativeAnswer: (questionId, answer) => {\n const { getActiveQuiz, userAnswers } = get();\n const activeQuiz = getActiveQuiz();\n\n if (!activeQuiz) return;\n\n const activityId = activeQuiz.quiz.id;\n const userId = get().getUserId();\n\n if (!userId || userId === '') {\n console.warn(\n 'selectDissertativeAnswer called before userId is set'\n );\n return;\n }\n\n const question = activeQuiz.quiz.questions.find(\n (q) => q.id === questionId\n );\n if (\n !question ||\n question.questionType !== QUESTION_TYPE.DISSERTATIVA\n ) {\n console.warn(\n 'selectDissertativeAnswer called for non-dissertative question'\n );\n return;\n }\n\n const existingAnswerIndex = userAnswers.findIndex(\n (answerItem) => answerItem.questionId === questionId\n );\n\n const newUserAnswer: UserAnswerItem = {\n questionId,\n activityId,\n userId,\n answer: answer,\n optionId: null,\n questionType: QUESTION_TYPE.DISSERTATIVA,\n answerStatus: ANSWER_STATUS.PENDENTE_AVALIACAO,\n };\n\n let updatedUserAnswers;\n if (existingAnswerIndex !== -1) {\n updatedUserAnswers = [...userAnswers];\n updatedUserAnswers[existingAnswerIndex] = newUserAnswer;\n } else {\n updatedUserAnswers = [...userAnswers, newUserAnswer];\n }\n\n set({\n userAnswers: updatedUserAnswers,\n });\n },\n\n skipQuestion: () => {\n const { getCurrentQuestion, userAnswers, getActiveQuiz } = get();\n const currentQuestion = getCurrentQuestion();\n const activeQuiz = getActiveQuiz();\n\n if (!activeQuiz) return;\n\n if (currentQuestion) {\n const activityId = activeQuiz.quiz.id;\n const userId = get().getUserId();\n\n if (!userId || userId === '') {\n console.warn('skipQuestion called before userId is set');\n return;\n }\n\n const existingAnswerIndex = userAnswers.findIndex(\n (answer) => answer.questionId === currentQuestion.id\n );\n\n const newUserAnswer: UserAnswerItem = {\n questionId: currentQuestion.id,\n activityId,\n userId,\n answer: null,\n optionId: null,\n questionType: currentQuestion.questionType,\n answerStatus: ANSWER_STATUS.PENDENTE_AVALIACAO,\n };\n\n let updatedUserAnswers;\n if (existingAnswerIndex !== -1) {\n // Update existing answer\n updatedUserAnswers = [...userAnswers];\n updatedUserAnswers[existingAnswerIndex] = newUserAnswer;\n } else {\n // Add new answer\n updatedUserAnswers = [...userAnswers, newUserAnswer];\n }\n\n set({\n userAnswers: updatedUserAnswers,\n });\n }\n },\n\n addUserAnswer: (questionId, answerId) => {\n const { getActiveQuiz, userAnswers } = get();\n const activeQuiz = getActiveQuiz();\n\n if (!activeQuiz) return;\n\n // Add to userAnswers array with new structure\n const activityId = activeQuiz.quiz.id;\n const userId = get().getUserId();\n\n if (!userId || userId === '') {\n console.warn('addUserAnswer called before userId is set');\n return;\n }\n\n const question = activeQuiz.quiz.questions.find(\n (q) => q.id === questionId\n );\n if (!question) return;\n\n const existingAnswerIndex = userAnswers.findIndex(\n (answer) => answer.questionId === questionId\n );\n\n const newUserAnswer: UserAnswerItem = {\n questionId,\n activityId,\n userId,\n answer:\n question.questionType === QUESTION_TYPE.DISSERTATIVA\n ? answerId || null\n : null,\n optionId:\n question.questionType !== QUESTION_TYPE.DISSERTATIVA\n ? answerId || null\n : null,\n questionType: question.questionType,\n answerStatus: ANSWER_STATUS.PENDENTE_AVALIACAO,\n };\n\n if (existingAnswerIndex !== -1) {\n // Update existing answer\n const updatedUserAnswers = [...userAnswers];\n updatedUserAnswers[existingAnswerIndex] = newUserAnswer;\n set({ userAnswers: updatedUserAnswers });\n } else {\n // Add new answer\n set({ userAnswers: [...userAnswers, newUserAnswer] });\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 userAnswers: [],\n timeElapsed: 0,\n isStarted: false,\n isFinished: false,\n userId: '',\n variant: 'default',\n questionsResult: null,\n currentQuestionResult: null,\n });\n },\n\n // Timer\n updateTime: (time) => set({ timeElapsed: time }),\n startTimer,\n stopTimer,\n\n // Getters\n getCurrentQuestion: () => {\n const { currentQuestionIndex, getActiveQuiz } = get();\n const activeQuiz = getActiveQuiz();\n\n if (!activeQuiz) {\n return null;\n }\n\n return activeQuiz.quiz.questions[currentQuestionIndex];\n },\n\n getTotalQuestions: () => {\n const { getActiveQuiz } = get();\n const activeQuiz = getActiveQuiz();\n\n return activeQuiz?.quiz?.questions?.length || 0;\n },\n\n getAnsweredQuestions: () => {\n const { userAnswers } = get();\n return userAnswers.filter(\n (answer) => answer.optionId !== null || answer.answer !== null\n ).length;\n },\n\n getUnansweredQuestions: () => {\n const { getActiveQuiz, userAnswers } = get();\n const activeQuiz = getActiveQuiz();\n if (!activeQuiz) return [];\n\n const unansweredQuestions: number[] = [];\n\n activeQuiz.quiz.questions.forEach((question, index) => {\n const userAnswer = userAnswers.find(\n (answer) => answer.questionId === question.id\n );\n const isAnswered =\n userAnswer &&\n (userAnswer.optionId !== null || userAnswer.answer !== null);\n const isSkipped =\n userAnswer &&\n userAnswer.optionId === null &&\n userAnswer.answer === null;\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 { userAnswers } = get();\n return userAnswers.filter(\n (answer) => answer.optionId === null && answer.answer === null\n ).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 { userAnswers } = get();\n const userAnswer = userAnswers.find(\n (answer) => answer.questionId === questionId\n );\n return userAnswer\n ? userAnswer.optionId !== null || userAnswer.answer !== null\n : false;\n },\n\n isQuestionSkipped: (questionId) => {\n const { userAnswers } = get();\n const userAnswer = userAnswers.find(\n (answer) => answer.questionId === questionId\n );\n return userAnswer\n ? userAnswer.optionId === null && userAnswer.answer === null\n : false;\n },\n\n getCurrentAnswer: () => {\n const { getCurrentQuestion, userAnswers } = get();\n const currentQuestion = getCurrentQuestion();\n\n if (!currentQuestion) return undefined;\n\n const userAnswer = userAnswers.find(\n (answer) => answer.questionId === currentQuestion.id\n );\n\n // Retorna undefined se a resposta está vazia (não respondida)\n const hasAnswerContent = (ua?: UserAnswerItem | null) =>\n !!ua &&\n ((ua.optionId !== null && ua.optionId !== '') ||\n (ua.answer !== null && ua.answer !== ''));\n\n if (!hasAnswerContent(userAnswer)) {\n return undefined;\n }\n\n return userAnswer;\n },\n\n getAllCurrentAnswer: () => {\n const { getCurrentQuestion, userAnswers } = get();\n const currentQuestion = getCurrentQuestion();\n\n if (!currentQuestion) return undefined;\n\n const userAnswer = userAnswers.filter(\n (answer) => answer.questionId === currentQuestion.id\n );\n\n return userAnswer;\n },\n\n getQuizTitle: () => {\n const { getActiveQuiz } = get();\n const activeQuiz = getActiveQuiz();\n\n return activeQuiz?.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 { getActiveQuiz, userAnswers } = get();\n const activeQuiz = getActiveQuiz();\n if (!activeQuiz) return [];\n\n const unansweredQuestions: number[] = [];\n\n activeQuiz.quiz.questions.forEach((question, index) => {\n const userAnswer = userAnswers.find(\n (answer) => answer.questionId === question.id\n );\n const hasAnswer =\n userAnswer &&\n (userAnswer.optionId !== null || userAnswer.answer !== null);\n const isSkipped =\n userAnswer &&\n userAnswer.optionId === null &&\n userAnswer.answer === null;\n\n // Se não há resposta do usuário OU se a questão foi pulada\n if (!hasAnswer || 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 { getQuestionResult, getActiveQuiz, variant } = get();\n const questions =\n variant == 'result'\n ? getQuestionResult()?.answers\n : getActiveQuiz()?.quiz.questions;\n if (!questions) return {};\n const groupedQuestions: {\n [key: string]: (Question | QuestionResult['answers'][number])[];\n } = {};\n questions.forEach((question) => {\n const subjectId =\n question.knowledgeMatrix?.[0]?.subject?.id || '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 // New methods for userAnswers\n getUserAnswerByQuestionId: (questionId) => {\n const { userAnswers } = get();\n return (\n userAnswers.find((answer) => answer.questionId === questionId) ||\n null\n );\n },\n isQuestionAnsweredByUserAnswers: (questionId) => {\n const { userAnswers } = get();\n const answer = userAnswers.find(\n (answer) => answer.questionId === questionId\n );\n return answer\n ? answer.optionId !== null || answer.answer !== null\n : false;\n },\n getQuestionStatusFromUserAnswers: (questionId) => {\n const { userAnswers } = get();\n const answer = userAnswers.find(\n (answer) => answer.questionId === questionId\n );\n if (!answer) return 'unanswered';\n if (answer.optionId === null) return 'skipped';\n return 'answered';\n },\n getUserAnswersForActivity: () => {\n const { userAnswers } = get();\n return userAnswers;\n },\n setCurrentQuestion: (question) => {\n const { getActiveQuiz, variant, questionsResult } = get();\n const activeQuiz = getActiveQuiz();\n if (!activeQuiz) return;\n let questionIndex = 0;\n if (variant == 'result') {\n if (!questionsResult) return;\n const questionResult =\n questionsResult.answers.find((q) => q.id === question.id) ??\n questionsResult.answers.find((q) => q.questionId === question.id);\n if (!questionResult) return;\n questionIndex = activeQuiz.quiz.questions.findIndex(\n (q) => q.id === questionResult.questionId\n );\n } else {\n questionIndex = activeQuiz.quiz.questions.findIndex(\n (q) => q.id === question.id\n );\n }\n\n // Validate that the question was found before updating currentQuestionIndex\n if (questionIndex === -1) {\n console.warn(\n `Question with id \"${question.id}\" not found in active quiz`\n );\n return;\n }\n\n set({ currentQuestionIndex: questionIndex });\n },\n\n setAnswerStatus: (questionId, status) => {\n const { userAnswers } = get();\n const existingAnswerIndex = userAnswers.findIndex(\n (answer) => answer.questionId === questionId\n );\n\n if (existingAnswerIndex !== -1) {\n const updatedUserAnswers = [...userAnswers];\n updatedUserAnswers[existingAnswerIndex] = {\n ...updatedUserAnswers[existingAnswerIndex],\n answerStatus: status,\n };\n set({ userAnswers: updatedUserAnswers });\n }\n },\n\n getAnswerStatus: (questionId) => {\n const { userAnswers } = get();\n const userAnswer = userAnswers.find(\n (answer) => answer.questionId === questionId\n );\n return userAnswer ? userAnswer.answerStatus : null;\n },\n getQuestionIndex: (questionId) => {\n const { questionsResult } = get();\n if (!questionsResult) return 0;\n\n let idx = questionsResult.answers.findIndex(\n (q) => q.questionId === questionId\n );\n if (idx === -1) {\n idx = questionsResult.answers.findIndex((q) => q.id === questionId);\n }\n return idx !== -1 ? idx + 1 : 0;\n },\n\n // Question Result\n getQuestionResultByQuestionId: (questionId) => {\n const { questionsResult } = get();\n const question = questionsResult?.answers.find(\n (answer) => answer.questionId === questionId\n );\n\n return question || null;\n },\n getQuestionResultStatistics: () => {\n const { questionsResult } = get();\n return questionsResult?.statistics || null;\n },\n getQuestionResult: () => {\n const { questionsResult } = get();\n return questionsResult;\n },\n setQuestionsResult: (questionsResult) => {\n set({ questionsResult });\n },\n setCurrentQuestionResult: (currentQuestionResult) => {\n set({ currentQuestionResult });\n },\n getCurrentQuestionResult: () => {\n const { currentQuestionResult } = get();\n return currentQuestionResult;\n },\n };\n },\n {\n name: 'quiz-store',\n }\n )\n);\n","import {\n forwardRef,\n HTMLAttributes,\n useEffect,\n MouseEvent,\n KeyboardEvent,\n} from 'react';\nimport Button from '../Button/Button';\nimport { cn } from '../../utils/utils';\n\n/**\n * Lookup table for size classes\n */\nconst SIZE_CLASSES = {\n 'extra-small': 'w-screen max-w-[324px]',\n small: 'w-screen max-w-[378px]',\n medium: 'w-screen max-w-[459px]',\n large: 'w-screen max-w-[578px]',\n 'extra-large': 'w-screen max-w-[912px]',\n} as const;\n\ninterface AlertDialogProps extends HTMLAttributes<HTMLDivElement> {\n /** Title of the alert dialog */\n title: string;\n /** Whether the alert dialog is open (controlled mode) */\n isOpen: boolean;\n /** Function called when the alert dialog is opened or closed (controlled mode) */\n onChangeOpen: (open: boolean) => void;\n /** Whether clicking the backdrop should close the alert dialog */\n closeOnBackdropClick?: boolean;\n /** Whether pressing Escape should close the alert dialog */\n closeOnEscape?: boolean;\n /** Additional CSS classes for the alert dialog content */\n className?: string;\n /** Function called when submit button is clicked */\n onSubmit?: (value?: unknown) => void;\n /** Value to pass to onSubmit function */\n submitValue?: unknown;\n /** Function called when cancel button is clicked */\n onCancel?: (value?: unknown) => void;\n /** Value to pass to onCancel function */\n cancelValue?: unknown;\n /** Description of the alert dialog */\n description: string;\n /** Label of the cancel button */\n cancelButtonLabel?: string;\n /** Label of the submit button */\n submitButtonLabel?: string;\n /** Size of the alert dialog */\n size?: 'extra-small' | 'small' | 'medium' | 'large' | 'extra-large';\n}\n\nconst AlertDialog = forwardRef<HTMLDivElement, AlertDialogProps>(\n (\n {\n description,\n cancelButtonLabel = 'Cancelar',\n submitButtonLabel = 'Deletar',\n title,\n isOpen,\n closeOnBackdropClick = true,\n closeOnEscape = true,\n className = '',\n onSubmit,\n onChangeOpen,\n submitValue,\n onCancel,\n cancelValue,\n size = 'medium',\n ...props\n },\n ref\n ) => {\n // Handle escape key\n useEffect(() => {\n if (!isOpen || !closeOnEscape) return;\n\n const handleEscape = (event: globalThis.KeyboardEvent) => {\n if (event.key === 'Escape') {\n onChangeOpen(false);\n }\n };\n\n document.addEventListener('keydown', handleEscape);\n return () => document.removeEventListener('keydown', handleEscape);\n }, [isOpen, closeOnEscape]);\n\n // Prevent body scroll when modal is open\n useEffect(() => {\n if (isOpen) {\n document.body.style.overflow = 'hidden';\n } else {\n document.body.style.overflow = 'unset';\n }\n\n return () => {\n document.body.style.overflow = 'unset';\n };\n }, [isOpen]);\n\n const handleBackdropClick = (event: MouseEvent<HTMLDivElement>) => {\n if (event.target === event.currentTarget && closeOnBackdropClick) {\n onChangeOpen(false);\n }\n };\n\n const handleBackdropKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'Escape' && closeOnEscape) {\n onChangeOpen(false);\n }\n };\n\n const handleSubmit = () => {\n onChangeOpen(false);\n onSubmit?.(submitValue);\n };\n\n const handleCancel = () => {\n onChangeOpen(false);\n onCancel?.(cancelValue);\n };\n\n const sizeClasses = SIZE_CLASSES[size];\n\n return (\n <>\n {/* Alert Dialog Overlay */}\n {isOpen && (\n <div\n className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50 backdrop-blur-sm\"\n onClick={handleBackdropClick}\n onKeyDown={handleBackdropKeyDown}\n data-testid=\"alert-dialog-overlay\"\n >\n {/* Alert Dialog Content */}\n <div\n ref={ref}\n className={cn(\n 'bg-background border border-border-100 rounded-lg shadow-lg p-6 m-3',\n sizeClasses,\n className\n )}\n {...props}\n >\n <h2\n id=\"alert-dialog-title\"\n className=\"pb-3 text-xl font-semibold text-text-950\"\n >\n {title}\n </h2>\n <p\n id=\"alert-dialog-description\"\n className=\"text-text-700 text-sm\"\n >\n {description}\n </p>\n\n <div className=\"flex flex-row items-center justify-end pt-4 gap-3\">\n <Button variant=\"outline\" size=\"small\" onClick={handleCancel}>\n {cancelButtonLabel}\n </Button>\n\n <Button\n variant=\"solid\"\n size=\"small\"\n action=\"negative\"\n onClick={handleSubmit}\n >\n {submitButtonLabel}\n </Button>\n </div>\n </div>\n </div>\n )}\n </>\n );\n }\n);\n\nAlertDialog.displayName = 'AlertDialog';\n\nexport { AlertDialog };\n","import { ReactNode, MouseEvent, useEffect, KeyboardEvent } from 'react';\nimport { X } from 'phosphor-react';\nimport { cn } from '../../utils/utils';\n\n/**\n * Lookup table for size classes\n */\nconst SIZE_CLASSES = {\n xs: 'max-w-[360px]',\n sm: 'max-w-[420px]',\n md: 'max-w-[510px]',\n lg: 'max-w-[640px]',\n xl: 'max-w-[970px]',\n} as const;\n\n/**\n * Modal component props interface\n */\ntype ModalProps = {\n /** Whether the modal is open */\n isOpen: boolean;\n /** Function to close the modal */\n onClose: () => void;\n /** Modal title */\n title: string;\n /** Modal description/content */\n children: ReactNode;\n /** Size of the modal */\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n /** Additional CSS classes for the modal content */\n className?: string;\n /** Whether clicking the backdrop should close the modal */\n closeOnBackdropClick?: boolean;\n /** Whether pressing Escape should close the modal */\n closeOnEscape?: boolean;\n /** Footer content (typically buttons) */\n footer?: ReactNode;\n /** Hide the close button */\n hideCloseButton?: boolean;\n};\n\n/**\n * Modal component for Analytica Ensino platforms\n *\n * A flexible modal component with multiple size variants and customizable behavior.\n *\n * @param isOpen - Whether the modal is currently open\n * @param onClose - Callback function called when the modal should be closed\n * @param title - The title displayed at the top of the modal\n * @param children - The main content of the modal\n * @param size - The size variant (xs, sm, md, lg, xl)\n * @param className - Additional CSS classes for the modal content\n * @param closeOnBackdropClick - Whether clicking the backdrop closes the modal (default: true)\n * @param closeOnEscape - Whether pressing Escape closes the modal (default: true)\n * @param footer - Footer content, typically action buttons\n * @param hideCloseButton - Whether to hide the X close button (default: false)\n * @returns A modal overlay with content\n *\n * @example\n * ```tsx\n * <Modal\n * isOpen={isModalOpen}\n * onClose={() => setIsModalOpen(false)}\n * title=\"Invite your team\"\n * size=\"md\"\n * footer={\n * <div className=\"flex gap-3\">\n * <Button variant=\"outline\" onClick={() => setIsModalOpen(false)}>Cancel</Button>\n * <Button variant=\"solid\" onClick={handleExplore}>Explore</Button>\n * </div>\n * }\n * >\n * Elevate user interactions with our versatile modals.\n * </Modal>\n * ```\n */\nconst Modal = ({\n isOpen,\n onClose,\n title,\n children,\n size = 'md',\n className = '',\n closeOnBackdropClick = true,\n closeOnEscape = true,\n footer,\n hideCloseButton = false,\n}: ModalProps) => {\n // Handle escape key\n useEffect(() => {\n if (!isOpen || !closeOnEscape) return;\n\n const handleEscape = (event: globalThis.KeyboardEvent) => {\n if (event.key === 'Escape') {\n onClose();\n }\n };\n\n document.addEventListener('keydown', handleEscape);\n return () => document.removeEventListener('keydown', handleEscape);\n }, [isOpen, closeOnEscape, onClose]);\n\n // Handle body scroll lock\n useEffect(() => {\n const originalOverflow = document.body.style.overflow;\n if (isOpen) {\n document.body.style.overflow = 'hidden';\n } else {\n document.body.style.overflow = originalOverflow;\n }\n\n return () => {\n document.body.style.overflow = originalOverflow;\n };\n }, [isOpen]);\n\n // Handle backdrop click\n const handleBackdropClick = (event: MouseEvent<HTMLDivElement>) => {\n if (closeOnBackdropClick && event.target === event.currentTarget) {\n onClose();\n }\n };\n\n // Handle backdrop keyboard interaction\n const handleBackdropKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (closeOnBackdropClick && (event.key === 'Enter' || event.key === ' ')) {\n onClose();\n }\n };\n\n if (!isOpen) return null;\n\n const sizeClasses = SIZE_CLASSES[size];\n const baseClasses =\n 'bg-secondary-50 rounded-3xl shadow-hard-shadow-2 border border-border-100 w-full mx-4';\n // Reset dialog default styles to prevent positioning issues\n const dialogResetClasses =\n 'p-0 m-0 border-none outline-none max-h-none static';\n const modalClasses = cn(\n baseClasses,\n sizeClasses,\n dialogResetClasses,\n className\n );\n\n return (\n <div\n className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-xs\"\n onClick={handleBackdropClick}\n onKeyDown={handleBackdropKeyDown}\n role=\"button\"\n tabIndex={closeOnBackdropClick ? 0 : -1}\n aria-label=\"Fechar modal clicando no fundo\"\n >\n <dialog className={modalClasses} aria-labelledby=\"modal-title\" open>\n {/* Header */}\n <div className=\"flex items-center justify-between px-6 py-6\">\n <h2 id=\"modal-title\" className=\"text-lg font-semibold text-text-950\">\n {title}\n </h2>\n {!hideCloseButton && (\n <button\n onClick={onClose}\n className=\"p-1 text-text-500 hover:text-text-700 hover:bg-background-50 rounded-md transition-colors focus:outline-none focus:ring-2 focus:ring-indicator-info focus:ring-offset-2\"\n aria-label=\"Fechar modal\"\n >\n <X size={18} />\n </button>\n )}\n </div>\n\n {/* Content */}\n <div className=\"px-6 pb-6\">\n <div className=\"text-text-500 font-normal text-sm leading-6\">\n {children}\n </div>\n </div>\n\n {/* Footer */}\n {footer && (\n <div className=\"flex justify-end gap-3 px-6 pb-6\">{footer}</div>\n )}\n </dialog>\n </div>\n );\n};\n\nexport default Modal;\n","import { create, StoreApi, useStore } from 'zustand';\nimport {\n ReactNode,\n useEffect,\n useRef,\n ButtonHTMLAttributes,\n forwardRef,\n HTMLAttributes,\n KeyboardEvent,\n MouseEvent,\n ReactElement,\n isValidElement,\n Children,\n cloneElement,\n useId,\n} from 'react';\nimport { CaretDown, Check, WarningCircle } from 'phosphor-react';\nimport { cn } from '../../utils/utils';\n\nconst VARIANT_CLASSES = {\n outlined: 'border-2 rounded-lg focus:border-primary-950',\n underlined: 'border-b-2 focus:border-primary-950',\n rounded: 'border-2 rounded-full focus:border-primary-950',\n} as const;\n\nconst SIZE_CLASSES = {\n small: 'text-sm',\n medium: 'text-md',\n large: 'text-lg',\n 'extra-large': 'text-lg',\n} as const;\n\nconst HEIGHT_CLASSES = {\n small: 'h-8',\n medium: 'h-9',\n large: 'h-10',\n 'extra-large': 'h-12',\n} as const;\n\nconst PADDING_CLASSES = {\n small: 'px-2 py-1',\n medium: 'px-3 py-2',\n large: 'px-4 py-3',\n 'extra-large': 'px-5 py-4',\n} as const;\n\nconst SIDE_CLASSES = {\n top: 'bottom-full -translate-y-1',\n right: 'top-full translate-y-1',\n bottom: 'top-full translate-y-1',\n left: 'top-full translate-y-1',\n};\nconst ALIGN_CLASSES = {\n start: 'left-0',\n center: 'left-1/2 -translate-x-1/2',\n end: 'right-0',\n};\n\ninterface SelectStore {\n open: boolean;\n setOpen: (open: boolean) => void;\n value: string;\n setValue: (value: string) => void;\n selectedLabel: ReactNode;\n setSelectedLabel: (label: ReactNode) => void;\n onValueChange?: (value: string) => void;\n}\n\ntype SelectStoreApi = StoreApi<SelectStore>;\n\nexport function createSelectStore(\n onValueChange?: (value: string) => void\n): SelectStoreApi {\n return create<SelectStore>((set) => ({\n open: false,\n setOpen: (open) => set({ open }),\n value: '',\n setValue: (value) => set({ value }),\n selectedLabel: '',\n setSelectedLabel: (label) => set({ selectedLabel: label }),\n onValueChange,\n }));\n}\n\nexport const useSelectStore = (externalStore?: SelectStoreApi) => {\n if (!externalStore) {\n throw new Error(\n 'Component must be used within a Select (store is missing)'\n );\n }\n\n return externalStore;\n};\n\nexport function getLabelAsNode(children: ReactNode): ReactNode {\n if (typeof children === 'string' || typeof children === 'number') {\n return children;\n }\n const flattened = Children.toArray(children);\n\n if (flattened.length === 1) return flattened[0];\n\n return <>{flattened}</>;\n}\n\ninterface SelectProps {\n className?: string;\n children: ReactNode;\n defaultValue?: string;\n value?: string;\n onValueChange?: (value: string) => void;\n size?: 'small' | 'medium' | 'large' | 'extra-large';\n label?: string;\n helperText?: string;\n errorMessage?: string;\n id?: string;\n}\n\nconst injectStore = (\n children: ReactNode,\n store: SelectStoreApi,\n size: string,\n selectId: string\n): ReactNode => {\n return Children.map(children, (child) => {\n if (isValidElement(child)) {\n const typedChild = child as ReactElement<{\n store?: SelectStoreApi;\n children?: ReactNode;\n size?: string;\n selectId?: string;\n }>;\n\n const newProps: Partial<{\n store: SelectStoreApi;\n children: ReactNode;\n size: string;\n selectId: string;\n }> = {\n store,\n };\n\n // Only pass size and selectId to SelectTrigger\n if (typedChild.type === SelectTrigger) {\n newProps.size = size;\n newProps.selectId = selectId;\n }\n\n if (typedChild.props.children) {\n newProps.children = injectStore(\n typedChild.props.children,\n store,\n size,\n selectId\n );\n }\n\n return cloneElement(typedChild, newProps);\n }\n return child;\n });\n};\n\nconst Select = ({\n children,\n defaultValue = '',\n className,\n value: propValue,\n onValueChange,\n size = 'small',\n label,\n helperText,\n errorMessage,\n id,\n}: SelectProps) => {\n const storeRef = useRef<SelectStoreApi | null>(null);\n storeRef.current ??= createSelectStore(onValueChange);\n const store = storeRef.current;\n\n const selectRef = useRef<HTMLDivElement>(null);\n const { open, setOpen, setValue, selectedLabel } = useStore(store, (s) => s);\n\n // Generate unique ID if not provided\n const generatedId = useId();\n const selectId = id ?? `select-${generatedId}`;\n\n const findLabelForValue = (\n children: ReactNode,\n targetValue: string\n ): string | null => {\n let found: string | null = null;\n const search = (nodes: ReactNode) => {\n Children.forEach(nodes, (child) => {\n if (!isValidElement(child)) return;\n const typedChild = child as ReactElement<{\n value?: string;\n children?: ReactNode;\n }>;\n if (\n typedChild.type === SelectItem &&\n typedChild.props.value === targetValue\n ) {\n if (typeof typedChild.props.children === 'string')\n found = typedChild.props.children;\n }\n if (typedChild.props.children && !found)\n search(typedChild.props.children);\n });\n };\n search(children);\n return found;\n };\n\n useEffect(() => {\n if (!selectedLabel && defaultValue) {\n const label = findLabelForValue(children, defaultValue);\n if (label) store.setState({ selectedLabel: label });\n }\n }, [children, defaultValue, selectedLabel]);\n\n useEffect(() => {\n const handleClickOutside = (event: globalThis.MouseEvent) => {\n if (\n selectRef.current &&\n !selectRef.current.contains(event.target as Node)\n ) {\n setOpen(false);\n }\n };\n\n const handleArrowKeys = (event: globalThis.KeyboardEvent) => {\n const selectContent = selectRef.current?.querySelector('[role=\"menu\"]');\n if (selectContent) {\n event.preventDefault();\n const items = Array.from(\n selectContent.querySelectorAll(\n '[role=\"menuitem\"]:not([aria-disabled=\"true\"])'\n )\n ).filter((el): el is HTMLElement => el instanceof HTMLElement);\n\n const focused = document.activeElement as HTMLElement;\n const currentIndex = items.findIndex((item) => item === focused);\n\n let nextIndex = 0;\n if (event.key === 'ArrowDown') {\n nextIndex =\n currentIndex === -1 ? 0 : (currentIndex + 1) % items.length;\n } else {\n nextIndex =\n currentIndex === -1\n ? items.length - 1\n : (currentIndex - 1 + items.length) % items.length;\n }\n items[nextIndex]?.focus();\n }\n };\n\n if (open) {\n document.addEventListener('mousedown', handleClickOutside);\n document.addEventListener('keydown', handleArrowKeys);\n }\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n document.removeEventListener('keydown', handleArrowKeys);\n };\n }, [open]);\n\n useEffect(() => {\n if (propValue) {\n setValue(propValue);\n const label = findLabelForValue(children, propValue);\n if (label) store.setState({ selectedLabel: label });\n }\n }, [propValue]);\n\n const sizeClasses = SIZE_CLASSES[size];\n\n return (\n <div className={cn('w-full', className)}>\n {/* Label */}\n {label && (\n <label\n htmlFor={selectId}\n className={cn('block font-bold text-text-900 mb-1.5', sizeClasses)}\n >\n {label}\n </label>\n )}\n\n {/* Select Container */}\n <div className={cn('relative w-full')} ref={selectRef}>\n {injectStore(children, store, size, selectId)}\n </div>\n\n {/* Helper Text or Error Message */}\n {(helperText || errorMessage) && (\n <div className=\"mt-1.5 gap-1.5\">\n {helperText && <p className=\"text-sm text-text-500\">{helperText}</p>}\n {errorMessage && (\n <p className=\"flex gap-1 items-center text-sm text-indicator-error\">\n <WarningCircle size={16} /> {errorMessage}\n </p>\n )}\n </div>\n )}\n </div>\n );\n};\n\nconst SelectValue = ({\n placeholder,\n store: externalStore,\n}: {\n placeholder?: string;\n store?: SelectStoreApi;\n}) => {\n const store = useSelectStore(externalStore);\n\n const selectedLabel = useStore(store, (s) => s.selectedLabel);\n const value = useStore(store, (s) => s.value);\n return (\n <span className=\"text-inherit\">\n {selectedLabel || placeholder || value}\n </span>\n );\n};\n\ninterface SelectTriggerProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n className?: string;\n invalid?: boolean;\n variant?: 'outlined' | 'underlined' | 'rounded';\n store?: SelectStoreApi;\n size?: 'small' | 'medium' | 'large' | 'extra-large';\n selectId?: string;\n}\n\nconst SelectTrigger = forwardRef<HTMLButtonElement, SelectTriggerProps>(\n (\n {\n className,\n invalid = false,\n variant = 'outlined',\n store: externalStore,\n disabled,\n size = 'medium',\n selectId,\n ...props\n },\n ref\n ) => {\n const store = useSelectStore(externalStore);\n const open = useStore(store, (s) => s.open);\n const toggleOpen = () => store.setState({ open: !open });\n\n const variantClasses = VARIANT_CLASSES[variant];\n const heightClasses = HEIGHT_CLASSES[size];\n const paddingClasses = PADDING_CLASSES[size];\n\n return (\n <button\n ref={ref}\n id={selectId}\n className={cn(\n 'flex w-full items-center justify-between border-border-300',\n heightClasses,\n paddingClasses,\n invalid &&\n `${variant == 'underlined' ? 'border-b-2' : 'border-2'} border-indicator-error text-text-600`,\n disabled\n ? 'cursor-not-allowed text-text-400 pointer-events-none opacity-50'\n : 'cursor-pointer hover:bg-background-50 focus:bg-accent focus:text-accent-foreground hover:bg-accent hover:text-accent-foreground',\n !invalid && !disabled ? 'text-text-700' : '',\n variantClasses,\n className\n )}\n onClick={toggleOpen}\n aria-expanded={open}\n aria-haspopup=\"listbox\"\n aria-controls={open ? 'select-content' : undefined}\n {...props}\n >\n {props.children}\n <CaretDown\n className={cn(\n 'h-[1em] w-[1em] opacity-50 transition-transform',\n open ? 'rotate-180' : ''\n )}\n />\n </button>\n );\n }\n);\nSelectTrigger.displayName = 'SelectTrigger';\n\ninterface SelectContentProps extends HTMLAttributes<HTMLDivElement> {\n className?: string;\n align?: 'start' | 'center' | 'end';\n side?: 'top' | 'right' | 'bottom' | 'left';\n store?: SelectStoreApi;\n}\n\nconst SelectContent = forwardRef<HTMLDivElement, SelectContentProps>(\n (\n {\n children,\n className,\n align = 'start',\n side = 'bottom',\n store: externalStore,\n ...props\n },\n ref\n ) => {\n const store = useSelectStore(externalStore);\n\n const open = useStore(store, (s) => s.open);\n if (!open) return null;\n\n const getPositionClasses = () =>\n `w-full min-w-full absolute ${SIDE_CLASSES[side]} ${ALIGN_CLASSES[align]}`;\n\n return (\n <div\n role=\"menu\"\n ref={ref}\n className={cn(\n 'bg-secondary z-50 min-w-[210px] max-h-[300px] overflow-y-auto overflow-x-hidden rounded-md border p-1 shadow-md border-border-100',\n getPositionClasses(),\n className\n )}\n {...props}\n >\n {children}\n </div>\n );\n }\n);\nSelectContent.displayName = 'SelectContent';\n\ninterface SelectItemProps extends HTMLAttributes<HTMLDivElement> {\n value: string;\n disabled?: boolean;\n store?: SelectStoreApi;\n}\n\nconst SelectItem = forwardRef<HTMLDivElement, SelectItemProps>(\n (\n {\n className,\n children,\n value,\n disabled = false,\n store: externalStore,\n ...props\n },\n ref\n ) => {\n const store = useSelectStore(externalStore);\n const {\n value: selectedValue,\n setValue,\n setOpen,\n setSelectedLabel,\n onValueChange,\n } = useStore(store, (s) => s);\n\n const handleClick = (\n e: MouseEvent<HTMLDivElement> | KeyboardEvent<HTMLDivElement>\n ) => {\n const labelNode = getLabelAsNode(children);\n if (!disabled) {\n const newValue = selectedValue === value ? '' : value;\n const newLabel = selectedValue === value ? '' : labelNode;\n setValue(newValue);\n setSelectedLabel(newLabel);\n setOpen(false);\n onValueChange?.(newValue);\n }\n props.onClick?.(e as MouseEvent<HTMLDivElement>);\n };\n\n return (\n <div\n role=\"menuitem\"\n aria-disabled={disabled}\n ref={ref}\n className={`\n bg-secondary focus-visible:bg-background-50\n relative flex select-none items-center gap-2 rounded-sm p-3 outline-none transition-colors [&>svg]:size-4 [&>svg]:shrink-0\n ${className}\n ${\n disabled\n ? 'cursor-not-allowed text-text-400 pointer-events-none opacity-50'\n : 'cursor-pointer hover:bg-background-50 text-text-700 focus:bg-accent focus:text-accent-foreground hover:bg-accent hover:text-accent-foreground'\n }\n ${selectedValue === value && 'bg-background-50'}\n `}\n onClick={handleClick}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') handleClick(e);\n }}\n tabIndex={disabled ? -1 : 0}\n {...props}\n >\n <span className=\"absolute right-2 flex h-3.5 w-3.5 items-center justify-center\">\n {selectedValue === value && <Check className=\"\" />}\n </span>\n {children}\n </div>\n );\n }\n);\n\nSelectItem.displayName = 'SelectItem';\n\nexport default Select;\nexport { SelectTrigger, SelectContent, SelectItem, SelectValue };\n","import {\n forwardRef,\n Fragment,\n HTMLAttributes,\n ReactNode,\n useState,\n useRef,\n MouseEvent,\n ChangeEvent,\n KeyboardEvent,\n Ref,\n} from 'react';\nimport Button from '../Button/Button';\nimport Badge from '../Badge/Badge';\nimport ProgressBar from '../ProgressBar/ProgressBar';\nimport {\n CaretRight,\n ChatCircleText,\n CheckCircle,\n Clock,\n DotsThreeVertical,\n Play,\n SpeakerHigh,\n SpeakerLow,\n SpeakerSimpleX,\n XCircle,\n} from 'phosphor-react';\nimport Text from '../Text/Text';\nimport { cn } from '../../utils/utils';\n\n// Componente base reutilizável para todos os cards\ninterface CardBaseProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n variant?: 'default' | 'compact' | 'minimal';\n layout?: 'horizontal' | 'vertical';\n padding?: 'none' | 'small' | 'medium' | 'large';\n minHeight?: 'none' | 'small' | 'medium' | 'large';\n cursor?: 'default' | 'pointer';\n}\n\nconst CARD_BASE_CLASSES = {\n default: 'w-full bg-background border border-border-50 rounded-xl',\n compact: 'w-full bg-background border border-border-50 rounded-lg',\n minimal: 'w-full bg-background border border-border-100 rounded-md',\n};\n\nconst CARD_PADDING_CLASSES = {\n none: '',\n small: 'p-2',\n medium: 'p-4',\n large: 'p-6',\n};\n\nconst CARD_MIN_HEIGHT_CLASSES = {\n none: '',\n small: 'min-h-16',\n medium: 'min-h-20',\n large: 'min-h-24',\n};\n\nconst CARD_LAYOUT_CLASSES = {\n horizontal: 'flex flex-row',\n vertical: 'flex flex-col',\n};\n\nconst CARD_CURSOR_CLASSES = {\n default: '',\n pointer: 'cursor-pointer',\n};\n\nconst CardBase = forwardRef<HTMLDivElement, CardBaseProps>(\n (\n {\n children,\n variant = 'default',\n layout = 'horizontal',\n padding = 'medium',\n minHeight = 'medium',\n cursor = 'default',\n className = '',\n ...props\n },\n ref\n ) => {\n const baseClasses = CARD_BASE_CLASSES[variant];\n const paddingClasses = CARD_PADDING_CLASSES[padding];\n const minHeightClasses = CARD_MIN_HEIGHT_CLASSES[minHeight];\n const layoutClasses = CARD_LAYOUT_CLASSES[layout];\n const cursorClasses = CARD_CURSOR_CLASSES[cursor];\n\n const combinedClasses = [\n baseClasses,\n paddingClasses,\n minHeightClasses,\n layoutClasses,\n cursorClasses,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div ref={ref} className={combinedClasses} {...props}>\n {children}\n </div>\n );\n }\n);\n\ninterface CardActivitiesResultsProps extends HTMLAttributes<HTMLDivElement> {\n icon: ReactNode;\n title: string;\n subTitle: string;\n header: string;\n description?: string;\n extended?: boolean;\n action?: 'warning' | 'success' | 'error' | 'info';\n}\n\nconst ACTION_CARD_CLASSES = {\n warning: 'bg-warning-background',\n success: 'bg-success-300',\n error: 'bg-error-100',\n info: 'bg-info-background',\n};\n\nconst ACTION_ICON_CLASSES = {\n warning: 'bg-warning-300 text-text',\n success: 'bg-yellow-300 text-text-950',\n error: 'bg-error-500 text-text',\n info: 'bg-info-500 text-text',\n};\n\nconst ACTION_SUBTITLE_CLASSES = {\n warning: 'text-warning-600',\n success: 'text-success-700',\n error: 'text-error-700',\n info: 'text-info-700',\n};\n\nconst ACTION_HEADER_CLASSES = {\n warning: 'text-warning-300',\n success: 'text-success-300',\n error: 'text-error-300',\n info: 'text-info-300',\n};\n\nconst CardActivitiesResults = forwardRef<\n HTMLDivElement,\n CardActivitiesResultsProps\n>(\n (\n {\n icon,\n title,\n subTitle,\n header,\n extended = false,\n action = 'success',\n description,\n className,\n ...props\n },\n ref\n ) => {\n const actionCardClasses = ACTION_CARD_CLASSES[action];\n const actionIconClasses = ACTION_ICON_CLASSES[action];\n const actionSubTitleClasses = ACTION_SUBTITLE_CLASSES[action];\n const actionHeaderClasses = ACTION_HEADER_CLASSES[action];\n\n return (\n <div\n ref={ref}\n className={cn(\n 'w-full flex flex-col border border-border-50 bg-background rounded-xl',\n className\n )}\n {...props}\n >\n <div\n className={cn(\n 'flex flex-col gap-1 items-center justify-center p-4',\n actionCardClasses,\n extended ? 'rounded-t-xl' : 'rounded-xl'\n )}\n >\n <span\n className={cn(\n 'size-7.5 rounded-full flex items-center justify-center',\n actionIconClasses\n )}\n >\n {icon}\n </span>\n\n <Text\n size=\"2xs\"\n weight=\"medium\"\n className=\"text-text-800 uppercase truncate\"\n >\n {title}\n </Text>\n\n <p\n className={cn('text-lg font-bold truncate', actionSubTitleClasses)}\n >\n {subTitle}\n </p>\n </div>\n\n {extended && (\n <div className=\"flex flex-col items-center gap-2.5 pb-9.5 pt-2.5\">\n <p\n className={cn(\n 'text-2xs font-medium uppercase truncate',\n actionHeaderClasses\n )}\n >\n {header}\n </p>\n <Badge size=\"large\" action=\"info\">\n {description}\n </Badge>\n </div>\n )}\n </div>\n );\n }\n);\n\ninterface CardQuestionProps extends HTMLAttributes<HTMLDivElement> {\n header: string;\n state?: 'done' | 'undone';\n onClickButton?: (valueButton?: unknown) => void;\n valueButton?: unknown;\n}\n\nconst CardQuestions = forwardRef<HTMLDivElement, CardQuestionProps>(\n (\n {\n header,\n state = 'undone',\n className,\n onClickButton,\n valueButton,\n ...props\n },\n ref\n ) => {\n const isDone = state === 'done';\n const stateLabel = isDone ? 'Realizado' : 'Não Realizado';\n const buttonLabel = isDone ? 'Ver Questão' : 'Responder';\n\n return (\n <CardBase\n ref={ref}\n layout=\"horizontal\"\n padding=\"medium\"\n minHeight=\"medium\"\n className={cn('justify-between gap-4', className)}\n {...props}\n >\n <section className=\"flex flex-col gap-1 flex-1 min-w-0\">\n <p className=\"font-bold text-xs text-text-950 truncate\">{header}</p>\n\n <div className=\"flex flex-row gap-6 items-center\">\n <Badge\n size=\"medium\"\n variant=\"solid\"\n action={isDone ? 'success' : 'error'}\n >\n {stateLabel}\n </Badge>\n\n <span className=\"flex flex-row items-center gap-1 text-text-700 text-xs\">\n {isDone ? 'Nota' : 'Sem nota'}\n {isDone && (\n <Badge size=\"medium\" action=\"success\">\n 00\n </Badge>\n )}\n </span>\n </div>\n </section>\n\n <span className=\"flex-shrink-0\">\n <Button\n size=\"extra-small\"\n onClick={() => onClickButton?.(valueButton)}\n className=\"min-w-fit\"\n >\n {buttonLabel}\n </Button>\n </span>\n </CardBase>\n );\n }\n);\n\ninterface CardProgressProps extends HTMLAttributes<HTMLDivElement> {\n header: string;\n subhead?: string;\n initialDate?: string;\n endDate?: string;\n progress?: number;\n direction?: 'horizontal' | 'vertical';\n icon: ReactNode;\n color?: string;\n progressVariant?: 'blue' | 'green';\n showDates?: boolean;\n}\n\nconst CardProgress = forwardRef<HTMLDivElement, CardProgressProps>(\n (\n {\n header,\n subhead,\n initialDate,\n endDate,\n progress = 0,\n direction = 'horizontal',\n icon,\n color = '#B7DFFF',\n progressVariant = 'blue',\n showDates = true,\n className,\n ...props\n },\n ref\n ) => {\n const isHorizontal = direction === 'horizontal';\n const contentComponent = {\n horizontal: (\n <>\n {showDates && (\n <div className=\"flex flex-row gap-6 items-center\">\n {initialDate && (\n <span className=\"flex flex-row gap-1 items-center text-2xs\">\n <p className=\"text-text-800 font-semibold\">Início</p>\n <p className=\"text-text-600\">{initialDate}</p>\n </span>\n )}\n {endDate && (\n <span className=\"flex flex-row gap-1 items-center text-2xs\">\n <p className=\"text-text-800 font-semibold\">Fim</p>\n <p className=\"text-text-600\">{endDate}</p>\n </span>\n )}\n </div>\n )}\n <span className=\"grid grid-cols-[1fr_auto] items-center gap-2\">\n <ProgressBar\n size=\"small\"\n value={progress}\n variant={progressVariant}\n data-testid=\"progress-bar\"\n />\n\n <Text\n size=\"xs\"\n weight=\"medium\"\n className={cn(\n 'text-text-950 leading-none tracking-normal text-center flex-none'\n )}\n >\n {Math.round(progress)}%\n </Text>\n </span>\n </>\n ),\n vertical: <p className=\"text-sm text-text-800\">{subhead}</p>,\n };\n\n return (\n <CardBase\n ref={ref}\n layout={isHorizontal ? 'horizontal' : 'vertical'}\n padding=\"none\"\n minHeight=\"medium\"\n cursor=\"pointer\"\n className={cn(isHorizontal ? 'h-20' : '', className)}\n {...props}\n >\n <div\n className={cn(\n 'flex justify-center items-center [&>svg]:size-6 text-text-950',\n isHorizontal\n ? 'min-w-[80px] min-h-[80px] rounded-l-xl'\n : 'min-h-[50px] w-full rounded-t-xl',\n !color.startsWith('#') ? `bg-${color}` : ''\n )}\n style={color.startsWith('#') ? { backgroundColor: color } : undefined}\n data-testid=\"icon-container\"\n >\n {icon}\n </div>\n\n <div\n className={cn(\n 'p-4 flex flex-col justify-between w-full h-full',\n !isHorizontal && 'gap-4'\n )}\n >\n <Text size=\"sm\" weight=\"bold\" className=\"text-text-950 truncate\">\n {header}\n </Text>\n {contentComponent[direction]}\n </div>\n </CardBase>\n );\n }\n);\n\ninterface CardTopicProps extends HTMLAttributes<HTMLDivElement> {\n header: string;\n subHead?: string[];\n progress: number;\n showPercentage?: boolean;\n progressVariant?: 'blue' | 'green';\n}\n\nconst CardTopic = forwardRef<HTMLDivElement, CardTopicProps>(\n (\n {\n header,\n subHead,\n progress,\n showPercentage = false,\n progressVariant = 'blue',\n className = '',\n ...props\n },\n ref\n ) => {\n return (\n <CardBase\n ref={ref}\n layout=\"vertical\"\n padding=\"small\"\n minHeight=\"medium\"\n cursor=\"pointer\"\n className={cn('justify-center gap-2 py-2 px-4', className)}\n {...props}\n >\n {subHead && (\n <span className=\"text-text-600 text-2xs flex flex-row gap-1\">\n {subHead.map((text, index) => (\n <Fragment key={`${text} - ${index}`}>\n <p>{text}</p>\n {index < subHead.length - 1 && <p>•</p>}\n </Fragment>\n ))}\n </span>\n )}\n\n <p className=\"text-sm text-text-950 font-bold truncate\">{header}</p>\n\n <span className=\"grid grid-cols-[1fr_auto] items-center gap-2\">\n <ProgressBar\n size=\"small\"\n value={progress}\n variant={progressVariant}\n data-testid=\"progress-bar\"\n />\n {showPercentage && (\n <Text\n size=\"xs\"\n weight=\"medium\"\n className={cn(\n 'text-text-950 leading-none tracking-normal text-center flex-none'\n )}\n >\n {Math.round(progress)}%\n </Text>\n )}\n </span>\n </CardBase>\n );\n }\n);\n\ninterface CardPerformanceProps extends HTMLAttributes<HTMLDivElement> {\n header: string;\n description?: string;\n progress?: number;\n labelProgress?: string;\n actionVariant?: 'button' | 'caret';\n progressVariant?: 'blue' | 'green';\n onClickButton?: (valueButton?: unknown) => void;\n valueButton?: unknown;\n}\n\nconst CardPerformance = forwardRef<HTMLDivElement, CardPerformanceProps>(\n (\n {\n header,\n progress,\n description = 'Sem dados ainda! Você ainda não fez um questionário neste assunto.',\n actionVariant = 'button',\n progressVariant = 'blue',\n labelProgress = '',\n className = '',\n onClickButton,\n valueButton,\n ...props\n },\n ref\n ) => {\n const hasProgress = progress !== undefined;\n\n return (\n <CardBase\n ref={ref}\n layout=\"horizontal\"\n padding=\"medium\"\n minHeight=\"none\"\n className={cn(\n actionVariant == 'caret' ? 'cursor-pointer' : '',\n className\n )}\n onClick={() => actionVariant == 'caret' && onClickButton?.(valueButton)}\n {...props}\n >\n <div className=\"w-full flex flex-col justify-between gap-2\">\n <div className=\"flex flex-row justify-between items-center gap-2\">\n <p className=\"text-lg font-bold text-text-950 truncate flex-1 min-w-0\">\n {header}\n </p>\n {actionVariant === 'button' && (\n <Button\n variant=\"outline\"\n size=\"extra-small\"\n onClick={() => onClickButton?.(valueButton)}\n className=\"min-w-fit flex-shrink-0\"\n >\n Ver Aula\n </Button>\n )}\n </div>\n\n <div className=\"w-full\">\n {hasProgress ? (\n <ProgressBar\n value={progress}\n label={`${progress}% ${labelProgress}`}\n variant={progressVariant}\n />\n ) : (\n <p className=\"text-xs text-text-600 truncate\">{description}</p>\n )}\n </div>\n </div>\n\n {actionVariant == 'caret' && (\n <CaretRight\n className=\"size-4.5 text-text-800 cursor-pointer\"\n data-testid=\"caret-icon\"\n />\n )}\n </CardBase>\n );\n }\n);\n\ninterface CardResultsProps extends HTMLAttributes<HTMLDivElement> {\n header: string;\n icon: ReactNode;\n correct_answers: number;\n incorrect_answers: number;\n direction?: 'row' | 'col';\n color?: string;\n}\n\nconst CardResults = forwardRef<HTMLDivElement, CardResultsProps>(\n (\n {\n header,\n correct_answers,\n incorrect_answers,\n icon,\n direction = 'col',\n color = '#B7DFFF',\n className,\n ...props\n },\n ref\n ) => {\n const isRow = direction == 'row';\n\n return (\n <CardBase\n ref={ref}\n layout=\"horizontal\"\n padding=\"none\"\n minHeight=\"medium\"\n className={cn('items-center cursor-pointer pr-4', className)}\n {...props}\n >\n <div\n className={cn(\n 'flex justify-center items-center [&>svg]:size-8 text-text-950 min-w-20 max-w-20 min-h-20 h-full rounded-l-xl'\n )}\n style={{\n backgroundColor: color,\n }}\n >\n {icon}\n </div>\n\n <div\n className={cn(\n 'p-4 flex justify-between w-full h-full',\n isRow ? 'flex-row items-center gap-2' : 'flex-col'\n )}\n >\n <p className=\"text-sm font-bold text-text-950 truncate flex-1 min-w-0\">\n {header}\n </p>\n <span className=\"flex flex-row gap-1 items-center\">\n <Badge\n action=\"success\"\n variant=\"solid\"\n size=\"large\"\n iconLeft={<CheckCircle />}\n >\n {correct_answers} Corretas\n </Badge>\n\n <Badge\n action=\"error\"\n variant=\"solid\"\n size=\"large\"\n iconLeft={<XCircle />}\n >\n {incorrect_answers} Incorretas\n </Badge>\n </span>\n </div>\n\n <CaretRight className=\"min-w-6 min-h-6 text-text-800\" />\n </CardBase>\n );\n }\n);\n\ninterface CardStatusProps extends HTMLAttributes<HTMLDivElement> {\n header: string;\n status?: 'correct' | 'incorrect';\n label?: string;\n}\n\nconst CardStatus = forwardRef<HTMLDivElement, CardStatusProps>(\n ({ header, className, status, label, ...props }, ref) => {\n return (\n <CardBase\n ref={ref}\n layout=\"horizontal\"\n padding=\"medium\"\n minHeight=\"medium\"\n className={cn('items-center cursor-pointer', className)}\n {...props}\n >\n <div className=\"flex justify-between w-full h-full flex-row items-center gap-2\">\n <p className=\"text-sm font-bold text-text-950 truncate flex-1 min-w-0\">\n {header}\n </p>\n <span className=\"flex flex-row gap-1 items-center flex-shrink-0\">\n {status && (\n <Badge\n action={status == 'correct' ? 'success' : 'error'}\n variant=\"solid\"\n size=\"medium\"\n iconLeft={<CheckCircle />}\n >\n {status == 'correct' ? 'Correta' : 'Incorreta'}\n </Badge>\n )}\n {label && <p className=\"text-sm text-text-800\">{label}</p>}\n </span>\n <CaretRight className=\"min-w-6 min-h-6 text-text-800 cursor-pointer flex-shrink-0 ml-2\" />\n </div>\n </CardBase>\n );\n }\n);\n\ninterface CardSettingsProps extends HTMLAttributes<HTMLDivElement> {\n icon: ReactNode;\n header: string;\n}\n\nconst CardSettings = forwardRef<HTMLDivElement, CardSettingsProps>(\n ({ header, className, icon, ...props }, ref) => {\n return (\n <CardBase\n ref={ref}\n layout=\"horizontal\"\n padding=\"small\"\n minHeight=\"none\"\n className={cn(\n 'border-none items-center gap-2 text-text-700',\n className\n )}\n {...props}\n >\n <span className=\"[&>svg]:size-6\">{icon}</span>\n\n <p className=\"w-full text-sm truncate\">{header}</p>\n\n <CaretRight size={24} className=\"cursor-pointer\" />\n </CardBase>\n );\n }\n);\n\ninterface CardSupportProps extends HTMLAttributes<HTMLDivElement> {\n header: string;\n direction?: 'row' | 'col';\n children: ReactNode;\n}\n\nconst CardSupport = forwardRef<HTMLDivElement, CardSupportProps>(\n ({ header, className, direction = 'col', children, ...props }, ref) => {\n return (\n <CardBase\n ref={ref}\n layout=\"horizontal\"\n padding=\"medium\"\n minHeight=\"none\"\n className={cn(\n 'border-none items-center gap-2 text-text-700',\n className\n )}\n {...props}\n >\n <div\n className={cn(\n 'w-full flex',\n direction == 'col' ? 'flex-col' : 'flex-row items-center'\n )}\n >\n <span className=\"w-full min-w-0\">\n <p className=\"text-sm text-text-950 font-bold truncate\">{header}</p>\n </span>\n <span className=\"flex flex-row gap-1\">{children}</span>\n </div>\n\n <CaretRight className=\"text-text-800 cursor-pointer\" size={24} />\n </CardBase>\n );\n }\n);\n\ninterface CardForumProps<T = unknown> extends HTMLAttributes<HTMLDivElement> {\n title: string;\n content: string;\n comments: number;\n date: string;\n hour: string;\n onClickComments?: (value?: T) => void;\n valueComments?: T;\n onClickProfile?: (profile?: T) => void;\n valueProfile?: T;\n}\n\nconst CardForum = forwardRef<HTMLDivElement, CardForumProps>(\n (\n {\n title,\n content,\n comments,\n onClickComments,\n valueComments,\n onClickProfile,\n valueProfile,\n className = '',\n date,\n hour,\n ...props\n },\n ref\n ) => {\n return (\n <CardBase\n ref={ref}\n layout=\"horizontal\"\n padding=\"medium\"\n minHeight=\"none\"\n variant=\"minimal\"\n className={cn('w-auto h-auto gap-3', className)}\n {...props}\n >\n <button\n type=\"button\"\n aria-label=\"Ver perfil\"\n onClick={() => onClickProfile?.(valueProfile)}\n className=\"min-w-8 h-8 rounded-full bg-background-950\"\n />\n\n <div className=\"flex flex-col gap-2 flex-1 min-w-0\">\n <div className=\"flex flex-row gap-1 items-center flex-wrap\">\n <p className=\"text-xs font-semibold text-primary-700 truncate\">\n {title}\n </p>\n <p className=\"text-xs text-text-600\">\n • {date} • {hour}\n </p>\n </div>\n\n <p className=\"text-text-950 text-sm line-clamp-2 truncate\">\n {content}\n </p>\n\n <button\n type=\"button\"\n aria-label=\"Ver comentários\"\n onClick={() => onClickComments?.(valueComments)}\n className=\"text-text-600 flex flex-row gap-2 items-center\"\n >\n <ChatCircleText aria-hidden=\"true\" size={16} />\n <p className=\"text-xs\">{comments} respostas</p>\n </button>\n </div>\n </CardBase>\n );\n }\n);\n\ninterface CardAudioProps extends HTMLAttributes<HTMLDivElement> {\n src?: string;\n title?: string;\n onPlay?: () => void;\n onPause?: () => void;\n onEnded?: () => void;\n onAudioTimeUpdate?: (currentTime: number, duration: number) => void;\n loop?: boolean;\n preload?: 'none' | 'metadata' | 'auto';\n tracks?: Array<{\n kind: 'subtitles' | 'captions' | 'descriptions' | 'chapters' | 'metadata';\n src: string;\n srcLang: string;\n label: string;\n default?: boolean;\n }>;\n}\n\nconst CardAudio = forwardRef<HTMLDivElement, CardAudioProps>(\n (\n {\n src,\n title,\n onPlay,\n onPause,\n onEnded,\n onAudioTimeUpdate,\n loop = false,\n preload = 'metadata',\n tracks,\n className,\n ...props\n },\n ref\n ) => {\n const [isPlaying, setIsPlaying] = useState(false);\n const [currentTime, setCurrentTime] = useState(0);\n const [duration, setDuration] = useState(0);\n const [volume, setVolume] = useState(1);\n const [showVolumeControl, setShowVolumeControl] = useState(false);\n const [showSpeedMenu, setShowSpeedMenu] = useState(false);\n const [playbackRate, setPlaybackRate] = useState(1);\n const audioRef = useRef<HTMLAudioElement>(null);\n\n const formatTime = (time: number) => {\n const minutes = Math.floor(time / 60);\n const seconds = Math.floor(time % 60);\n return `${minutes}:${seconds.toString().padStart(2, '0')}`;\n };\n\n const handlePlayPause = () => {\n if (isPlaying) {\n audioRef.current?.pause();\n setIsPlaying(false);\n onPause?.();\n } else {\n audioRef.current?.play();\n setIsPlaying(true);\n onPlay?.();\n }\n };\n\n const handleTimeUpdate = () => {\n const current = audioRef.current?.currentTime ?? 0;\n const total = audioRef.current?.duration ?? 0;\n\n setCurrentTime(current);\n setDuration(total);\n onAudioTimeUpdate?.(current, total);\n };\n\n const handleLoadedMetadata = () => {\n setDuration(audioRef.current?.duration ?? 0);\n };\n\n const handleEnded = () => {\n setIsPlaying(false);\n setCurrentTime(0);\n onEnded?.();\n };\n\n const handleProgressClick = (e: MouseEvent<HTMLButtonElement>) => {\n const rect = e.currentTarget.getBoundingClientRect();\n const clickX = e.clientX - rect.left;\n const width = rect.width;\n const percentage = clickX / width;\n const newTime = percentage * duration;\n\n if (audioRef.current) {\n audioRef.current.currentTime = newTime;\n }\n setCurrentTime(newTime);\n };\n\n const handleVolumeChange = (e: ChangeEvent<HTMLInputElement>) => {\n const newVolume = parseFloat(e.target.value);\n setVolume(newVolume);\n if (audioRef.current) {\n audioRef.current.volume = newVolume;\n }\n };\n\n const toggleVolumeControl = () => {\n setShowVolumeControl(!showVolumeControl);\n };\n\n const toggleSpeedMenu = () => {\n setShowSpeedMenu(!showSpeedMenu);\n };\n\n const handleSpeedChange = (speed: number) => {\n setPlaybackRate(speed);\n if (audioRef.current) {\n audioRef.current.playbackRate = speed;\n }\n setShowSpeedMenu(false);\n };\n\n const getVolumeIcon = () => {\n if (volume === 0) {\n return <SpeakerSimpleX />;\n }\n if (volume < 0.5) {\n return <SpeakerLow />;\n }\n return <SpeakerHigh />;\n };\n\n return (\n <CardBase\n ref={ref}\n layout=\"horizontal\"\n padding=\"medium\"\n minHeight=\"none\"\n className={cn('w-auto h-14 items-center gap-2', className)}\n {...props}\n >\n {/* Audio element */}\n <audio\n ref={audioRef}\n src={src}\n loop={loop}\n preload={preload}\n onTimeUpdate={handleTimeUpdate}\n onLoadedMetadata={handleLoadedMetadata}\n onEnded={handleEnded}\n data-testid=\"audio-element\"\n aria-label={title}\n >\n {tracks ? (\n tracks.map((track) => (\n <track\n key={track.src}\n kind={track.kind}\n src={track.src}\n srcLang={track.srcLang}\n label={track.label}\n default={track.default}\n />\n ))\n ) : (\n <track\n kind=\"captions\"\n src=\"data:text/vtt;base64,\"\n srcLang=\"pt\"\n label=\"Sem legendas disponíveis\"\n />\n )}\n </audio>\n\n {/* Play/Pause Button */}\n <button\n type=\"button\"\n onClick={handlePlayPause}\n disabled={!src}\n className=\"cursor-pointer text-text-950 hover:text-primary-600 disabled:text-text-400 disabled:cursor-not-allowed\"\n aria-label={isPlaying ? 'Pausar' : 'Reproduzir'}\n >\n {isPlaying ? (\n <div className=\"w-6 h-6 flex items-center justify-center\">\n <div className=\"flex gap-0.5\">\n <div className=\"w-1 h-4 bg-current rounded-sm\"></div>\n <div className=\"w-1 h-4 bg-current rounded-sm\"></div>\n </div>\n </div>\n ) : (\n <Play size={24} />\n )}\n </button>\n\n {/* Current Time */}\n <p className=\"text-text-800 text-sm font-medium min-w-[2.5rem]\">\n {formatTime(currentTime)}\n </p>\n\n {/* Progress Bar */}\n <div className=\"flex-1 relative\" data-testid=\"progress-bar\">\n <button\n type=\"button\"\n className=\"w-full h-2 bg-border-100 rounded-full cursor-pointer\"\n onClick={handleProgressClick}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleProgressClick(\n e as unknown as MouseEvent<HTMLButtonElement>\n );\n }\n }}\n aria-label=\"Barra de progresso do áudio\"\n >\n <div\n className=\"h-full bg-primary-600 rounded-full transition-all duration-100\"\n style={{\n width:\n duration > 0 ? `${(currentTime / duration) * 100}%` : '0%',\n }}\n />\n </button>\n </div>\n\n {/* Duration */}\n <p className=\"text-text-800 text-sm font-medium min-w-[2.5rem]\">\n {formatTime(duration)}\n </p>\n\n {/* Volume Control */}\n <div className=\"relative\">\n <button\n type=\"button\"\n onClick={toggleVolumeControl}\n className=\"cursor-pointer text-text-950 hover:text-primary-600\"\n aria-label=\"Controle de volume\"\n >\n <div className=\"w-6 h-6 flex items-center justify-center\">\n {getVolumeIcon()}\n </div>\n </button>\n\n {showVolumeControl && (\n <button\n type=\"button\"\n className=\"absolute bottom-full right-0 mb-2 p-2 bg-background border border-border-100 rounded-lg shadow-lg focus:outline-none focus:ring-2 focus:ring-primary-500\"\n onKeyDown={(e) => {\n if (e.key === 'Escape') {\n setShowVolumeControl(false);\n }\n }}\n >\n <input\n type=\"range\"\n min=\"0\"\n max=\"1\"\n step=\"0.1\"\n value={volume}\n onChange={handleVolumeChange}\n onKeyDown={(e) => {\n if (e.key === 'ArrowUp' || e.key === 'ArrowRight') {\n e.preventDefault();\n const newVolume = Math.min(\n 1,\n Math.round((volume + 0.1) * 10) / 10\n );\n setVolume(newVolume);\n if (audioRef.current) audioRef.current.volume = newVolume;\n } else if (e.key === 'ArrowDown' || e.key === 'ArrowLeft') {\n e.preventDefault();\n const newVolume = Math.max(\n 0,\n Math.round((volume - 0.1) * 10) / 10\n );\n setVolume(newVolume);\n if (audioRef.current) audioRef.current.volume = newVolume;\n }\n }}\n className=\"w-20 h-2 bg-border-100 rounded-lg appearance-none cursor-pointer\"\n style={{\n background: `linear-gradient(to right, #3b82f6 0%, #3b82f6 ${volume * 100}%, #e5e7eb ${volume * 100}%, #e5e7eb 100%)`,\n }}\n aria-label=\"Volume\"\n aria-valuenow={Math.round(volume * 100)}\n aria-valuemin={0}\n aria-valuemax={100}\n />\n </button>\n )}\n </div>\n\n {/* Menu Button */}\n <div className=\"relative\">\n <button\n type=\"button\"\n onClick={toggleSpeedMenu}\n className=\"cursor-pointer text-text-950 hover:text-primary-600\"\n aria-label=\"Opções de velocidade\"\n >\n <DotsThreeVertical size={24} />\n </button>\n\n {showSpeedMenu && (\n <div className=\"absolute bottom-full right-0 mb-2 p-2 bg-background border border-border-100 rounded-lg shadow-lg min-w-24 z-10\">\n <div className=\"flex flex-col gap-1\">\n {[\n { speed: 1, label: '1x' },\n { speed: 1.5, label: '1.5x' },\n { speed: 2, label: '2x' },\n ].map(({ speed, label }) => (\n <button\n key={speed}\n type=\"button\"\n onClick={() => handleSpeedChange(speed)}\n className={cn(\n 'px-3 py-1 text-sm text-left rounded hover:bg-border-50 transition-colors',\n playbackRate === speed\n ? 'bg-primary-950 text-secondary-100 font-medium'\n : 'text-text-950'\n )}\n >\n {label}\n </button>\n ))}\n </div>\n </div>\n )}\n </div>\n </CardBase>\n );\n }\n);\n\ninterface CardSimuladoProps extends HTMLAttributes<HTMLDivElement> {\n title: string;\n duration?: string;\n info: string;\n backgroundColor: 'enem' | 'prova' | 'simuladao' | 'vestibular';\n}\n\nconst SIMULADO_BACKGROUND_CLASSES = {\n enem: 'bg-exam-1',\n prova: 'bg-exam-2',\n simuladao: 'bg-exam-3',\n vestibular: 'bg-exam-4',\n};\n\nconst CardSimulado = forwardRef<HTMLDivElement, CardSimuladoProps>(\n ({ title, duration, info, backgroundColor, className, ...props }, ref) => {\n const backgroundClass = SIMULADO_BACKGROUND_CLASSES[backgroundColor];\n\n return (\n <CardBase\n ref={ref}\n layout=\"horizontal\"\n padding=\"medium\"\n minHeight=\"none\"\n cursor=\"pointer\"\n className={cn(\n `${backgroundClass} hover:shadow-soft-shadow-2 transition-shadow duration-200`,\n className\n )}\n {...props}\n >\n <div className=\"flex justify-between items-center w-full gap-4\">\n <div className=\"flex flex-col gap-1 flex-1 min-w-0\">\n <Text size=\"lg\" weight=\"bold\" className=\"text-text-950 truncate\">\n {title}\n </Text>\n\n <div className=\"flex items-center gap-4 text-text-700\">\n {duration && (\n <div className=\"flex items-center gap-1\">\n <Clock size={16} className=\"flex-shrink-0\" />\n <Text size=\"sm\">{duration}</Text>\n </div>\n )}\n\n <Text size=\"sm\" className=\"truncate\">\n {info}\n </Text>\n </div>\n </div>\n\n <CaretRight\n size={24}\n className=\"text-text-800 flex-shrink-0\"\n data-testid=\"caret-icon\"\n />\n </div>\n </CardBase>\n );\n }\n);\n\ninterface CardTestProps extends Omit<HTMLAttributes<HTMLElement>, 'onSelect'> {\n title: string;\n duration?: string;\n questionsCount?: number;\n additionalInfo?: string;\n selected?: boolean;\n onSelect?: (selected: boolean) => void;\n}\n\nconst CardTest = forwardRef<HTMLElement, CardTestProps>(\n (\n {\n title,\n duration,\n questionsCount,\n additionalInfo,\n selected = false,\n onSelect,\n className = '',\n ...props\n },\n ref\n ) => {\n const handleClick = () => {\n if (onSelect) {\n onSelect(!selected);\n }\n };\n\n const handleKeyDown = (event: KeyboardEvent<HTMLElement>) => {\n if ((event.key === 'Enter' || event.key === ' ') && onSelect) {\n event.preventDefault();\n onSelect(!selected);\n }\n };\n\n const isSelectable = !!onSelect;\n const getQuestionsText = (count: number) => {\n const singular = count === 1 ? 'questão' : 'questões';\n return `${count} ${singular}`;\n };\n\n const displayInfo = questionsCount\n ? getQuestionsText(questionsCount)\n : additionalInfo || '';\n const baseClasses =\n 'flex flex-row items-center p-4 gap-2 w-full max-w-full bg-background shadow-soft-shadow-1 rounded-xl isolate border-0 text-left';\n const interactiveClasses = isSelectable\n ? 'cursor-pointer focus:outline-none focus:ring-2 focus:ring-primary-950 focus:ring-offset-2'\n : '';\n const selectedClasses = selected\n ? 'ring-2 ring-primary-950 ring-offset-2'\n : '';\n\n if (isSelectable) {\n return (\n <button\n ref={ref as Ref<HTMLButtonElement>}\n type=\"button\"\n className={cn(\n `${baseClasses} ${interactiveClasses} ${selectedClasses} ${className}`.trim()\n )}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n aria-pressed={selected}\n {...(props as HTMLAttributes<HTMLButtonElement>)}\n >\n <div className=\"flex flex-col justify-between gap-[27px] flex-grow min-h-[67px] w-full min-w-0\">\n <Text\n size=\"md\"\n weight=\"bold\"\n className=\"text-text-950 tracking-[0.2px] leading-[19px] truncate\"\n >\n {title}\n </Text>\n\n <div className=\"flex flex-row justify-start items-end gap-4 w-full\">\n {duration && (\n <div className=\"flex flex-row items-center gap-1 flex-shrink-0\">\n <Clock size={16} className=\"text-text-700\" />\n <Text\n size=\"sm\"\n className=\"text-text-700 leading-[21px] whitespace-nowrap\"\n >\n {duration}\n </Text>\n </div>\n )}\n\n <Text\n size=\"sm\"\n className=\"text-text-700 leading-[21px] flex-grow truncate\"\n >\n {displayInfo}\n </Text>\n </div>\n </div>\n </button>\n );\n }\n\n return (\n <div\n ref={ref as Ref<HTMLDivElement>}\n className={cn(`${baseClasses} ${className}`.trim())}\n {...(props as HTMLAttributes<HTMLDivElement>)}\n >\n <div className=\"flex flex-col justify-between gap-[27px] flex-grow min-h-[67px] w-full min-w-0\">\n <Text\n size=\"md\"\n weight=\"bold\"\n className=\"text-text-950 tracking-[0.2px] leading-[19px] truncate\"\n >\n {title}\n </Text>\n\n <div className=\"flex flex-row justify-start items-end gap-4 w-full\">\n {duration && (\n <div className=\"flex flex-row items-center gap-1 flex-shrink-0\">\n <Clock size={16} className=\"text-text-700\" />\n <Text\n size=\"sm\"\n className=\"text-text-700 leading-[21px] whitespace-nowrap\"\n >\n {duration}\n </Text>\n </div>\n )}\n\n <Text\n size=\"sm\"\n className=\"text-text-700 leading-[21px] flex-grow truncate min-w-0\"\n >\n {displayInfo}\n </Text>\n </div>\n </div>\n </div>\n );\n }\n);\n\ninterface SimulationItem {\n id: string;\n title: string;\n type: 'enem' | 'prova' | 'simulado' | 'vestibular';\n info: string;\n}\n\ninterface SimulationHistoryData {\n date: string;\n simulations: SimulationItem[];\n}\n\ninterface CardSimulationHistoryProps extends HTMLAttributes<HTMLDivElement> {\n data: SimulationHistoryData[];\n onSimulationClick?: (simulation: SimulationItem) => void;\n}\n\nconst SIMULATION_TYPE_STYLES = {\n enem: {\n background: 'bg-exam-1',\n badge: 'exam1' as const,\n text: 'Enem',\n },\n prova: {\n background: 'bg-exam-2',\n badge: 'exam2' as const,\n text: 'Prova',\n },\n simulado: {\n background: 'bg-exam-3',\n badge: 'exam3' as const,\n text: 'Simulado',\n },\n vestibular: {\n background: 'bg-exam-4',\n badge: 'exam4' as const,\n text: 'Vestibular',\n },\n};\n\nconst CardSimulationHistory = forwardRef<\n HTMLDivElement,\n CardSimulationHistoryProps\n>(({ data, onSimulationClick, className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn('w-full max-w-[992px] h-auto', className)}\n {...props}\n >\n {/* Content */}\n <div className=\"flex flex-col gap-0\">\n {data.map((section, sectionIndex) => (\n <div key={section.date} className=\"flex flex-col\">\n {/* Seção com data */}\n <div\n className={cn(\n 'flex flex-row justify-center items-start px-4 py-6 gap-2 w-full bg-white',\n sectionIndex === 0 ? 'rounded-t-3xl' : ''\n )}\n >\n <Text\n size=\"xs\"\n weight=\"bold\"\n className=\"text-text-800 w-11 flex-shrink-0\"\n >\n {section.date}\n </Text>\n\n <div className=\"flex flex-col gap-2 flex-1\">\n {section.simulations.map((simulation) => {\n const typeStyles = SIMULATION_TYPE_STYLES[simulation.type];\n\n return (\n <CardBase\n key={simulation.id}\n layout=\"horizontal\"\n padding=\"medium\"\n minHeight=\"none\"\n cursor=\"pointer\"\n className={cn(\n `${typeStyles.background} rounded-xl hover:shadow-soft-shadow-2 \n transition-shadow duration-200 h-auto min-h-[61px]`\n )}\n onClick={() => onSimulationClick?.(simulation)}\n >\n <div className=\"flex justify-between items-center w-full gap-2\">\n <div className=\"flex flex-col gap-2 flex-1 min-w-0\">\n <Text\n size=\"lg\"\n weight=\"bold\"\n className=\"text-text-950 truncate\"\n >\n {simulation.title}\n </Text>\n\n <div className=\"flex items-center gap-2\">\n <Badge\n variant=\"examsOutlined\"\n action={typeStyles.badge}\n size=\"medium\"\n >\n {typeStyles.text}\n </Badge>\n\n <Text size=\"sm\" className=\"text-text-800 truncate\">\n {simulation.info}\n </Text>\n </div>\n </div>\n\n <CaretRight\n size={24}\n className=\"text-text-800 flex-shrink-0\"\n data-testid=\"caret-icon\"\n />\n </div>\n </CardBase>\n );\n })}\n </div>\n </div>\n </div>\n ))}\n\n {/* Footer rounded */}\n {data.length > 0 && (\n <div className=\"w-full h-6 bg-white rounded-b-3xl\" />\n )}\n </div>\n </div>\n );\n});\n\nexport {\n CardBase,\n CardActivitiesResults,\n CardQuestions,\n CardProgress,\n CardTopic,\n CardPerformance,\n CardResults,\n CardStatus,\n CardSettings,\n CardSupport,\n CardForum,\n CardAudio,\n CardSimulado,\n CardTest,\n CardSimulationHistory,\n};\n","import { ReactNode } from 'react';\nimport Text from '../Text/Text';\nimport { cn } from '../../utils/utils';\n\n/**\n * Progress bar size variants\n */\ntype ProgressBarSize = 'small' | 'medium';\n\n/**\n * Progress bar color variants\n */\ntype ProgressBarVariant = 'blue' | 'green';\n\n/**\n * Progress bar layout variants\n */\ntype ProgressBarLayout = 'default' | 'stacked' | 'compact';\n\n/**\n * Size configurations using Tailwind classes\n */\nconst SIZE_CLASSES = {\n small: {\n container: 'h-1', // 4px height (h-1 = 4px in Tailwind)\n bar: 'h-1', // 4px height for the fill bar\n spacing: 'gap-2', // 8px gap between label and progress bar\n layout: 'flex-col', // vertical layout for small\n borderRadius: 'rounded-full', // 9999px border radius\n },\n medium: {\n container: 'h-2', // 8px height (h-2 = 8px in Tailwind)\n bar: 'h-2', // 8px height for the fill bar\n spacing: 'gap-2', // 8px gap between progress bar and label\n layout: 'flex-row items-center', // horizontal layout for medium\n borderRadius: 'rounded-lg', // 8px border radius\n },\n} as const;\n\n/**\n * Color configurations using design system colors\n */\nconst VARIANT_CLASSES = {\n blue: {\n background: 'bg-background-300', // Background track color (#D5D4D4)\n fill: 'bg-primary-700', // Blue for activity progress (#2271C4)\n },\n green: {\n background: 'bg-background-300', // Background track color (#D5D4D4)\n fill: 'bg-success-200', // Green for performance (#84D3A2)\n },\n} as const;\n\n/**\n * Type for size classes\n */\ntype SizeClassType = (typeof SIZE_CLASSES)[keyof typeof SIZE_CLASSES];\n\n/**\n * Type for variant classes\n */\ntype VariantClassType = (typeof VARIANT_CLASSES)[keyof typeof VARIANT_CLASSES];\n\n/**\n * Common props shared across all layout components\n */\ninterface BaseLayoutProps {\n className: string;\n label: ReactNode;\n showPercentage: boolean;\n showHitCount: boolean;\n labelClassName: string;\n percentageClassName: string;\n clampedValue: number;\n max: number;\n percentage: number;\n variantClasses: VariantClassType;\n}\n\n/**\n * Dimensions configuration for layouts\n */\ninterface LayoutDimensions {\n width: string;\n height: string;\n}\n\n/**\n * Props for StackedLayout component\n */\ninterface StackedLayoutProps extends BaseLayoutProps {\n dimensions: LayoutDimensions;\n}\n\n/**\n * Props for CompactLayout component\n */\ninterface CompactLayoutProps extends BaseLayoutProps {\n dimensions: LayoutDimensions;\n}\n\n/**\n * Props for DefaultLayout component\n */\ninterface DefaultLayoutProps {\n className: string;\n size: ProgressBarSize;\n sizeClasses: SizeClassType;\n variantClasses: VariantClassType;\n label: ReactNode;\n showPercentage: boolean;\n labelClassName: string;\n percentageClassName: string;\n clampedValue: number;\n max: number;\n percentage: number;\n}\n\n/**\n * ProgressBar component props interface\n */\nexport type ProgressBarProps = {\n /** Progress value between 0 and 100 */\n value: number;\n /** Maximum value (defaults to 100) */\n max?: number;\n /** Size variant of the progress bar */\n size?: ProgressBarSize;\n /** Color variant of the progress bar */\n variant?: ProgressBarVariant;\n /** Layout variant of the progress bar */\n layout?: ProgressBarLayout;\n /** Optional label to display */\n label?: ReactNode;\n /** Show percentage text */\n showPercentage?: boolean;\n /**\n * Show hit count (e.g., \"28 de 30\") instead of percentage\n *\n * PRIORITY: When both showHitCount and showPercentage are true,\n * showHitCount takes precedence (stacked and compact layouts only).\n * Default layout does not support showHitCount.\n */\n showHitCount?: boolean;\n /** Additional CSS classes */\n className?: string;\n /** Label CSS classes */\n labelClassName?: string;\n /** Percentage text CSS classes */\n percentageClassName?: string;\n /** Custom width for stacked layout (defaults to w-[380px]) */\n stackedWidth?: string;\n /** Custom height for stacked layout (defaults to h-[35px]) */\n stackedHeight?: string;\n /** Custom width for compact layout (defaults to w-[131px]) */\n compactWidth?: string;\n /** Custom height for compact layout (defaults to h-[24px]) */\n compactHeight?: string;\n};\n\n/**\n * Helper function to calculate safe progress values\n */\nconst calculateProgressValues = (value: number, max: number) => {\n const safeValue = isNaN(value) ? 0 : value;\n const clampedValue = Math.max(0, Math.min(safeValue, max));\n const percentage = max === 0 ? 0 : (clampedValue / max) * 100;\n\n return { clampedValue, percentage };\n};\n\n/**\n * Helper function to determine if header content should be shown\n */\nconst shouldShowHeader = (\n label: ReactNode,\n showPercentage: boolean,\n showHitCount: boolean\n): boolean => {\n return !!(label || showPercentage || showHitCount);\n};\n\n/**\n * Centralized function to determine display priority and content\n *\n * PRIORITY ORDER (consistent across all layouts):\n * 1. showHitCount (highest priority) - displays \"X de Y\" format\n * 2. showPercentage - displays \"X%\" format\n * 3. label (lowest priority) - displays custom label\n *\n * @param showHitCount - Whether to show hit count format\n * @param showPercentage - Whether to show percentage format\n * @param label - Custom label to display\n * @param clampedValue - Current progress value\n * @param max - Maximum progress value\n * @param percentage - Calculated percentage value\n * @returns Object with content type and formatted content\n */\nconst getDisplayPriority = (\n showHitCount: boolean,\n showPercentage: boolean,\n label: ReactNode,\n clampedValue: number,\n max: number,\n percentage: number\n) => {\n if (showHitCount) {\n return {\n type: 'hitCount' as const,\n content: `${Math.round(clampedValue)} de ${max}`,\n hasMetrics: true,\n };\n }\n\n if (showPercentage) {\n return {\n type: 'percentage' as const,\n content: `${Math.round(percentage)}%`,\n hasMetrics: true,\n };\n }\n\n return {\n type: 'label' as const,\n content: label,\n hasMetrics: false,\n };\n};\n\n/**\n * Parameters for compact layout configuration\n */\ninterface CompactLayoutConfigParams {\n showPercentage: boolean;\n showHitCount: boolean;\n percentage: number;\n clampedValue: number;\n max: number;\n label: ReactNode;\n percentageClassName: string;\n labelClassName: string;\n}\n\n/**\n * Helper function to get compact layout configuration\n *\n * PRIORITY ORDER (consistent across all layouts):\n * 1. showHitCount (highest priority) - displays \"X de Y\" format\n * 2. showPercentage - displays \"X%\" format\n * 3. label (lowest priority) - displays custom label\n *\n * When both showHitCount and showPercentage are true, showHitCount takes precedence.\n */\nconst getCompactLayoutConfig = ({\n showPercentage,\n showHitCount,\n percentage,\n clampedValue,\n max,\n label,\n percentageClassName,\n labelClassName,\n}: CompactLayoutConfigParams) => {\n // Use centralized priority logic for consistency\n const displayPriority = getDisplayPriority(\n showHitCount,\n showPercentage,\n label,\n clampedValue,\n max,\n percentage\n );\n\n return {\n color: displayPriority.hasMetrics ? 'text-primary-600' : 'text-primary-700',\n className: displayPriority.hasMetrics\n ? percentageClassName\n : labelClassName,\n content: displayPriority.content,\n };\n};\n\n/**\n * Helper function to get default layout display configuration\n *\n * PRIORITY ORDER for default layout (showHitCount is not supported):\n * 1. showPercentage (when enabled, takes precedence over label)\n * 2. label (shown only when showPercentage is false)\n *\n * Note: Default layout does not support showHitCount feature.\n */\nconst getDefaultLayoutDisplayConfig = (\n size: ProgressBarSize,\n label: ReactNode,\n showPercentage: boolean\n) => ({\n showHeader: size === 'small' && !!(label || showPercentage),\n showPercentage: size === 'medium' && showPercentage,\n showLabel: size === 'medium' && !!label && !showPercentage, // Only show label when percentage is not shown\n});\n\n/**\n * Helper function to render hit count or percentage display for stacked layout\n *\n * PRIORITY ORDER (consistent across all layouts):\n * 1. showHitCount (highest priority) - displays \"X de Y\" format\n * 2. showPercentage - displays \"X%\" format\n *\n * When both showHitCount and showPercentage are true, showHitCount takes precedence.\n */\nconst renderStackedHitCountDisplay = (\n showHitCount: boolean,\n showPercentage: boolean,\n clampedValue: number,\n max: number,\n percentage: number,\n percentageClassName: string\n): ReactNode => {\n if (!showHitCount && !showPercentage) return null;\n\n // Use centralized priority logic for consistency\n const displayPriority = getDisplayPriority(\n showHitCount,\n showPercentage,\n null, // label is not relevant for stacked layout metrics display\n clampedValue,\n max,\n percentage\n );\n\n return (\n <div\n className={cn(\n 'text-xs font-medium leading-[14px] text-right',\n percentageClassName\n )}\n >\n {displayPriority.type === 'hitCount' ? (\n <>\n <span className=\"text-success-200\">{Math.round(clampedValue)}</span>\n <span className=\"text-text-600\"> de {max}</span>\n </>\n ) : (\n <Text size=\"xs\" weight=\"medium\" className=\"text-success-200\">\n {Math.round(percentage)}%\n </Text>\n )}\n </div>\n );\n};\n\n/**\n * Base progress bar component with common rendering logic\n */\nconst ProgressBarBase = ({\n clampedValue,\n max,\n percentage,\n label,\n variantClasses,\n containerClassName,\n fillClassName,\n}: {\n clampedValue: number;\n max: number;\n percentage: number;\n label: ReactNode;\n variantClasses: VariantClassType;\n containerClassName: string;\n fillClassName: string;\n}) => (\n <div\n className={cn(\n containerClassName,\n variantClasses.background,\n 'overflow-hidden relative'\n )}\n >\n <progress\n value={clampedValue}\n max={max}\n aria-label={\n typeof label === 'string'\n ? `${label}: ${Math.round(percentage)}% complete`\n : `Progress: ${Math.round(percentage)}% of ${max}`\n }\n className=\"absolute inset-0 w-full h-full opacity-0\"\n />\n <div\n className={cn(\n fillClassName,\n variantClasses.fill,\n 'transition-all duration-300 ease-out'\n )}\n style={{ width: `${percentage}%` }}\n />\n </div>\n);\n\n/**\n * Stacked layout component\n */\nconst StackedLayout = ({\n className,\n label,\n showPercentage,\n showHitCount,\n labelClassName,\n percentageClassName,\n clampedValue,\n max,\n percentage,\n variantClasses,\n dimensions,\n}: StackedLayoutProps) => (\n <div\n className={cn(\n 'flex flex-col items-start gap-2',\n dimensions.width,\n dimensions.height,\n className\n )}\n >\n {shouldShowHeader(label, showPercentage, showHitCount) && (\n <div className=\"flex flex-row justify-between items-center w-full h-[19px]\">\n {label && (\n <Text\n as=\"div\"\n size=\"md\"\n weight=\"medium\"\n className={cn('text-text-600 leading-[19px]', labelClassName)}\n >\n {label}\n </Text>\n )}\n\n {renderStackedHitCountDisplay(\n showHitCount,\n showPercentage,\n clampedValue,\n max,\n percentage,\n percentageClassName\n )}\n </div>\n )}\n\n <ProgressBarBase\n clampedValue={clampedValue}\n max={max}\n percentage={percentage}\n label={label}\n variantClasses={variantClasses}\n containerClassName=\"w-full h-2 rounded-lg\"\n fillClassName=\"h-2 rounded-lg shadow-hard-shadow-3\"\n />\n </div>\n);\n\n/**\n * Compact layout component\n */\nconst CompactLayout = ({\n className,\n label,\n showPercentage,\n showHitCount,\n labelClassName,\n percentageClassName,\n clampedValue,\n max,\n percentage,\n variantClasses,\n dimensions,\n}: CompactLayoutProps) => {\n const {\n color,\n className: compactClassName,\n content,\n } = getCompactLayoutConfig({\n showPercentage,\n showHitCount,\n percentage,\n clampedValue,\n max,\n label,\n percentageClassName,\n labelClassName,\n });\n\n return (\n <div\n className={cn(\n 'flex flex-col items-start gap-1',\n dimensions.width,\n dimensions.height,\n className\n )}\n >\n {shouldShowHeader(label, showPercentage, showHitCount) && (\n <Text\n as=\"div\"\n size=\"sm\"\n weight=\"medium\"\n color={color}\n className={cn('leading-4 w-full', compactClassName)}\n >\n {content}\n </Text>\n )}\n\n <ProgressBarBase\n clampedValue={clampedValue}\n max={max}\n percentage={percentage}\n label={label}\n variantClasses={variantClasses}\n containerClassName=\"w-full h-1 rounded-full\"\n fillClassName=\"h-1 rounded-full\"\n />\n </div>\n );\n};\n\n/**\n * Default layout component\n */\nconst DefaultLayout = ({\n className,\n size,\n sizeClasses,\n variantClasses,\n label,\n showPercentage,\n labelClassName,\n percentageClassName,\n clampedValue,\n max,\n percentage,\n}: DefaultLayoutProps) => {\n const gapClass = size === 'medium' ? 'gap-2' : sizeClasses.spacing;\n const progressBarClass = size === 'medium' ? 'flex-grow' : 'w-full';\n const displayConfig = getDefaultLayoutDisplayConfig(\n size,\n label,\n showPercentage\n );\n\n return (\n <div className={cn('flex', sizeClasses.layout, gapClass, className)}>\n {displayConfig.showHeader && (\n <div className=\"flex flex-row items-center justify-between w-full\">\n {label && (\n <Text\n as=\"div\"\n size=\"xs\"\n weight=\"medium\"\n className={cn(\n 'text-text-950 leading-none tracking-normal text-center',\n labelClassName\n )}\n >\n {label}\n </Text>\n )}\n\n {showPercentage && (\n <Text\n size=\"xs\"\n weight=\"medium\"\n className={cn(\n 'text-text-950 leading-none tracking-normal text-center',\n percentageClassName\n )}\n >\n {Math.round(percentage)}%\n </Text>\n )}\n </div>\n )}\n\n <ProgressBarBase\n clampedValue={clampedValue}\n max={max}\n percentage={percentage}\n label={label}\n variantClasses={variantClasses}\n containerClassName={cn(\n progressBarClass,\n sizeClasses.container,\n sizeClasses.borderRadius\n )}\n fillClassName={cn(\n sizeClasses.bar,\n sizeClasses.borderRadius,\n 'shadow-hard-shadow-3'\n )}\n />\n\n {displayConfig.showPercentage && (\n <Text\n size=\"xs\"\n weight=\"medium\"\n className={cn(\n 'text-text-950 leading-none tracking-normal text-center flex-none',\n percentageClassName\n )}\n >\n {Math.round(percentage)}%\n </Text>\n )}\n\n {displayConfig.showLabel && (\n <Text\n as=\"div\"\n size=\"xs\"\n weight=\"medium\"\n className={cn(\n 'text-text-950 leading-none tracking-normal text-center flex-none',\n labelClassName\n )}\n >\n {label}\n </Text>\n )}\n </div>\n );\n};\n\n/**\n * ProgressBar component for Analytica Ensino platforms\n *\n * A progress bar component with size and color variants designed for tracking\n * activity progress (blue) and performance metrics (green).\n * Uses the Analytica Ensino Design System colors from styles.css with automatic\n * light/dark mode support. Includes Text component integration for consistent typography.\n *\n * CONTENT DISPLAY PRIORITY (Consistent across all layouts):\n * 1. showHitCount (highest) - \"X de Y\" format (stacked/compact only)\n * 2. showPercentage - \"X%\" format\n * 3. label (lowest) - Custom label text\n *\n * When multiple display options are enabled, higher priority options take precedence.\n *\n * @example\n * ```tsx\n * // Basic progress bar\n * <ProgressBar value={65} />\n *\n * // Activity progress (blue)\n * <ProgressBar variant=\"blue\" value={45} label=\"Progress\" showPercentage />\n *\n * // Performance metrics (green)\n * <ProgressBar variant=\"green\" size=\"medium\" value={85} label=\"Performance\" />\n *\n * // Small size with custom max value\n * <ProgressBar size=\"small\" value={3} max={5} showPercentage />\n *\n * // Stacked layout with fixed width and hit count\n * <ProgressBar layout=\"stacked\" variant=\"green\" value={28} max={30} label=\"Fáceis\" showHitCount />\n *\n * // Compact layout for small cards\n * <ProgressBar layout=\"compact\" variant=\"blue\" value={70} label=\"Questão 08\" />\n * ```\n */\nconst ProgressBar = ({\n value,\n max = 100,\n size = 'medium',\n variant = 'blue',\n layout = 'default',\n label,\n showPercentage = false,\n showHitCount = false,\n className = '',\n labelClassName = '',\n percentageClassName = '',\n stackedWidth,\n stackedHeight,\n compactWidth,\n compactHeight,\n}: ProgressBarProps) => {\n const { clampedValue, percentage } = calculateProgressValues(value, max);\n const sizeClasses = SIZE_CLASSES[size];\n const variantClasses = VARIANT_CLASSES[variant];\n\n if (layout === 'stacked') {\n return (\n <StackedLayout\n className={className}\n label={label}\n showPercentage={showPercentage}\n showHitCount={showHitCount}\n labelClassName={labelClassName}\n percentageClassName={percentageClassName}\n clampedValue={clampedValue}\n max={max}\n percentage={percentage}\n variantClasses={variantClasses}\n dimensions={{\n width: stackedWidth ?? 'w-[380px]',\n height: stackedHeight ?? 'h-[35px]',\n }}\n />\n );\n }\n\n if (layout === 'compact') {\n return (\n <CompactLayout\n className={className}\n label={label}\n showPercentage={showPercentage}\n showHitCount={showHitCount}\n labelClassName={labelClassName}\n percentageClassName={percentageClassName}\n clampedValue={clampedValue}\n max={max}\n percentage={percentage}\n variantClasses={variantClasses}\n dimensions={{\n width: compactWidth ?? 'w-[131px]',\n height: compactHeight ?? 'h-[24px]',\n }}\n />\n );\n }\n\n return (\n <DefaultLayout\n className={className}\n size={size}\n sizeClasses={sizeClasses}\n variantClasses={variantClasses}\n label={label}\n showPercentage={showPercentage}\n labelClassName={labelClassName}\n percentageClassName={percentageClassName}\n clampedValue={clampedValue}\n max={max}\n percentage={percentage}\n />\n );\n};\n\nexport default ProgressBar;\n","import { ReactNode } from 'react';\nimport Text from '../Text/Text';\nimport { cn } from '../../utils/utils';\n\n/**\n * Progress circle size variants\n */\ntype ProgressCircleSize = 'small' | 'medium';\n\n/**\n * Progress circle color variants\n */\ntype ProgressCircleVariant = 'blue' | 'green';\n\n/**\n * Size configurations using Tailwind classes\n */\nconst SIZE_CLASSES = {\n small: {\n container: 'w-[90px] h-[90px]', // 90px circle from design specs\n strokeWidth: 4, // 4px stroke width - matches ProgressBar small (h-1)\n textSize: '2xl', // 24px for percentage (font-size: 24px)\n textWeight: 'medium', // font-weight: 500\n labelSize: '2xs' as const, // Will be overridden with custom 8px in className\n labelWeight: 'bold', // font-weight: 700\n spacing: 'gap-0', // Reduced gap between percentage and label for better spacing\n contentWidth: 'max-w-[50px]', // Reduced width to fit text inside circle\n },\n medium: {\n container: 'w-[152px] h-[152px]', // 151.67px ≈ 152px circle from design specs\n strokeWidth: 8, // 8px stroke width - matches ProgressBar medium (h-2)\n textSize: '2xl', // 24px for percentage (font-size: 24px)\n textWeight: 'medium', // font-weight: 500\n labelSize: 'xs' as const, // 12px for status label (font-size: 12px)\n labelWeight: 'medium', // font-weight: 500 (changed from bold)\n spacing: 'gap-1', // 4px gap between percentage and label\n contentWidth: 'max-w-[90px]', // Reduced width to fit text inside circle\n },\n} as const;\n\n/**\n * Color configurations using design system colors\n */\nconst VARIANT_CLASSES = {\n blue: {\n background: 'stroke-primary-100', // Light blue background (#BBDCF7)\n fill: 'stroke-primary-700', // Blue for activity progress (#2271C4)\n textColor: 'text-primary-700', // Blue text color (#2271C4)\n labelColor: 'text-text-700', // Gray text for label (#525252)\n },\n green: {\n background: 'stroke-background-300', // Gray background (#D5D4D4 - matches design)\n fill: 'stroke-success-200', // Green for performance (#84D3A2 - matches design)\n textColor: 'text-text-800', // Dark gray text (#404040 - matches design)\n labelColor: 'text-text-600', // Medium gray text for label (#737373 - matches design)\n },\n} as const;\n\n/**\n * ProgressCircle component props interface\n */\nexport type ProgressCircleProps = {\n /** Progress value between 0 and 100 */\n value: number;\n /** Maximum value (defaults to 100) */\n max?: number;\n /** Size variant of the progress circle */\n size?: ProgressCircleSize;\n /** Color variant of the progress circle */\n variant?: ProgressCircleVariant;\n /** Optional label to display below percentage */\n label?: ReactNode;\n /** Show percentage text */\n showPercentage?: boolean;\n /** Additional CSS classes */\n className?: string;\n /** Label CSS classes */\n labelClassName?: string;\n /** Percentage text CSS classes */\n percentageClassName?: string;\n};\n\n/**\n * ProgressCircle component for Analytica Ensino platforms\n *\n * A circular progress indicator with size and color variants designed for tracking\n * activity progress (blue) and performance metrics (green).\n * Uses the Analytica Ensino Design System colors from styles.css with automatic\n * light/dark mode support. Includes Text component integration for consistent typography.\n *\n * @example\n * ```tsx\n * // Basic progress circle\n * <ProgressCircle value={65} />\n *\n * // Activity progress (blue)\n * <ProgressCircle variant=\"blue\" value={45} label=\"CONCLUÍDO\" showPercentage />\n *\n * // Performance metrics (green)\n * <ProgressCircle variant=\"green\" size=\"medium\" value={85} label=\"MÉDIA\" />\n *\n * // Small size with custom max value\n * <ProgressCircle size=\"small\" value={3} max={5} showPercentage />\n * ```\n */\nconst ProgressCircle = ({\n value,\n max = 100,\n size = 'small',\n variant = 'blue',\n label,\n showPercentage = true,\n className = '',\n labelClassName = '',\n percentageClassName = '',\n}: ProgressCircleProps) => {\n // Ensure value is within bounds and handle NaN/Infinity\n const safeValue = isNaN(value) ? 0 : value;\n const clampedValue = Math.max(0, Math.min(safeValue, max));\n const percentage = max === 0 ? 0 : (clampedValue / max) * 100;\n\n // Get size and variant classes\n const sizeClasses = SIZE_CLASSES[size];\n const variantClasses = VARIANT_CLASSES[variant];\n\n // Calculate SVG dimensions and stroke properties\n const radius = size === 'small' ? 37 : 64; // Radius calculation based on container size\n const circumference = 2 * Math.PI * radius;\n const strokeDashoffset = circumference - (percentage / 100) * circumference;\n const center = size === 'small' ? 45 : 76; // Center point of SVG\n const svgSize = size === 'small' ? 90 : 152; // SVG viewBox size\n\n return (\n <div\n className={cn(\n 'relative flex flex-col items-center justify-center',\n sizeClasses.container,\n 'rounded-lg',\n className\n )}\n >\n {/* Progress circle SVG */}\n <svg\n className=\"absolute inset-0 transform -rotate-90\"\n width={svgSize}\n height={svgSize}\n viewBox={`0 0 ${svgSize} ${svgSize}`}\n aria-hidden=\"true\"\n >\n {/* Background circle */}\n <circle\n cx={center}\n cy={center}\n r={radius}\n fill=\"none\"\n strokeWidth={sizeClasses.strokeWidth}\n className={cn(variantClasses.background, 'rounded-lg')}\n />\n {/* Progress circle - SVG stroke properties require style for animation */}\n <circle\n cx={center}\n cy={center}\n r={radius}\n fill=\"none\"\n strokeWidth={sizeClasses.strokeWidth}\n strokeLinecap=\"round\"\n strokeDasharray={circumference}\n strokeDashoffset={strokeDashoffset}\n className={cn(\n variantClasses.fill,\n 'transition-all duration-500 ease-out shadow-soft-shadow-3 rounded-lg'\n )}\n />\n </svg>\n\n {/* Native progress element for accessibility */}\n <progress\n value={clampedValue}\n max={max}\n aria-label={typeof label === 'string' ? label : 'Progress'}\n className=\"absolute opacity-0 w-0 h-0\"\n />\n\n {/* Content overlay - centered content */}\n <div\n className={cn(\n 'relative z-10 flex flex-col items-center justify-center',\n sizeClasses.spacing,\n sizeClasses.contentWidth\n )}\n >\n {/* Percentage text */}\n {showPercentage && (\n <Text\n size={sizeClasses.textSize}\n weight={sizeClasses.textWeight}\n className={cn(\n 'text-center w-full',\n variantClasses.textColor,\n percentageClassName\n )}\n >\n {Math.round(percentage)}%\n </Text>\n )}\n\n {/* Label text */}\n {label && (\n <Text\n as=\"span\"\n size={sizeClasses.labelSize}\n weight={sizeClasses.labelWeight}\n className={cn(\n variantClasses.labelColor,\n 'text-center uppercase tracking-wide truncate w-full',\n labelClassName\n )}\n >\n {label}\n </Text>\n )}\n </div>\n </div>\n );\n};\n\nexport default ProgressCircle;\n","import { HtmlHTMLAttributes, useEffect, useState } from 'react';\nimport CheckboxList, { CheckboxListItem } from '../CheckBox/CheckboxList';\nimport { cn } from '../../utils/utils';\nimport { CheckCircle, XCircle, Check } from 'phosphor-react';\nimport Badge from '../Badge/Badge';\n\ninterface Choice {\n value: string;\n label: string;\n status?: 'correct' | 'incorrect' | 'neutral';\n disabled?: boolean;\n}\n\ninterface MultipleChoiceListProps extends HtmlHTMLAttributes<HTMLDivElement> {\n choices: Choice[];\n disabled?: boolean;\n name?: string;\n selectedValues?: string[];\n onHandleSelectedValues?: (values: string[]) => void;\n mode?: 'interactive' | 'readonly';\n}\n\nconst MultipleChoiceList = ({\n disabled = false,\n className = '',\n choices,\n name,\n selectedValues,\n onHandleSelectedValues,\n mode = 'interactive',\n}: MultipleChoiceListProps) => {\n const [actualValue, setActualValue] = useState(selectedValues);\n\n useEffect(() => {\n setActualValue(selectedValues);\n }, [selectedValues]);\n const getStatusBadge = (status: Choice['status']) => {\n switch (status) {\n case 'correct':\n return (\n <Badge variant=\"solid\" action=\"success\" iconLeft={<CheckCircle />}>\n Resposta correta\n </Badge>\n );\n case 'incorrect':\n return (\n <Badge variant=\"solid\" action=\"error\" iconLeft={<XCircle />}>\n Resposta incorreta\n </Badge>\n );\n default:\n return null;\n }\n };\n\n const getStatusStyles = (status: Choice['status']) => {\n switch (status) {\n case 'correct':\n return 'bg-success-background border-success-300';\n case 'incorrect':\n return 'bg-error-background border-error-300';\n default:\n return `bg-background border-border-100`;\n }\n };\n\n const renderVisualCheckbox = (isSelected: boolean, isDisabled: boolean) => {\n const checkboxClasses = cn(\n 'w-5 h-5 rounded border-2 cursor-default transition-all duration-200 flex items-center justify-center',\n isSelected\n ? 'border-primary-950 bg-primary-950 text-text'\n : 'border-border-400 bg-background',\n isDisabled && 'opacity-40 cursor-not-allowed'\n );\n\n return (\n <div className={checkboxClasses}>\n {isSelected && <Check size={16} weight=\"bold\" />}\n </div>\n );\n };\n\n if (mode === 'readonly') {\n return (\n <div className={cn('flex flex-col gap-2', className)}>\n {choices.map((choice, i) => {\n const isSelected = actualValue?.includes(choice.value) || false;\n const statusStyles = getStatusStyles(choice.status);\n const statusBadge = getStatusBadge(choice.status);\n\n return (\n <div\n key={`readonly-${choice.value}-${i}`}\n className={cn(\n 'flex flex-row justify-between gap-2 items-start p-2 rounded-lg transition-all',\n statusStyles,\n choice.disabled ? 'opacity-50 cursor-not-allowed' : ''\n )}\n >\n <div className=\"flex items-center gap-2 flex-1\">\n {renderVisualCheckbox(isSelected, choice.disabled || disabled)}\n <span\n className={cn(\n 'flex-1',\n isSelected || (choice.status && choice.status != 'neutral')\n ? 'text-text-950'\n : 'text-text-600',\n choice.disabled || disabled\n ? 'cursor-not-allowed'\n : 'cursor-default'\n )}\n >\n {choice.label}\n </span>\n </div>\n {statusBadge && (\n <div className=\"flex-shrink-0\">{statusBadge}</div>\n )}\n </div>\n );\n })}\n </div>\n );\n }\n return (\n <div\n className={cn(\n 'flex flex-row justify-between gap-2 items-start p-2 rounded-lg transition-all',\n disabled ? 'opacity-50 cursor-not-allowed' : '',\n className\n )}\n >\n <CheckboxList\n name={name}\n values={actualValue}\n onValuesChange={(v) => {\n setActualValue(v);\n onHandleSelectedValues?.(v);\n }}\n disabled={disabled}\n >\n {choices.map((choice, i) => (\n <div\n key={`interactive-${choice.value}-${i}`}\n className=\"flex flex-row gap-2 items-center\"\n >\n <CheckboxListItem\n value={choice.value}\n id={`interactive-${choice.value}-${i}`}\n disabled={choice.disabled || disabled}\n />\n\n <label\n htmlFor={`interactive-${choice.value}-${i}`}\n className={cn(\n 'flex-1',\n actualValue?.includes(choice.value)\n ? 'text-text-950'\n : 'text-text-600',\n choice.disabled || disabled\n ? 'cursor-not-allowed'\n : 'cursor-pointer'\n )}\n >\n {choice.label}\n </label>\n </div>\n ))}\n </CheckboxList>\n </div>\n );\n};\n\nexport { MultipleChoiceList };\n","import {\n InputHTMLAttributes,\n HTMLAttributes,\n ReactNode,\n forwardRef,\n useId,\n useEffect,\n useRef,\n Children,\n cloneElement,\n isValidElement,\n ReactElement,\n} from 'react';\nimport { create, StoreApi, useStore } from 'zustand';\nimport CheckBox from './CheckBox';\nimport { cn } from '../../utils/utils';\n\n/**\n * CheckboxList size variants\n */\ntype CheckboxListSize = 'small' | 'medium' | 'large';\n\n/**\n * CheckboxList visual state\n */\ntype CheckboxListState =\n | 'default'\n | 'hovered'\n | 'focused'\n | 'invalid'\n | 'disabled';\n\n/**\n * CheckboxList store interface\n */\ninterface CheckboxListStore {\n values: string[];\n setValues: (values: string[]) => void;\n toggleValue: (value: string) => void;\n onValuesChange?: (values: string[]) => void;\n disabled: boolean;\n name: string;\n}\n\ntype CheckboxListStoreApi = StoreApi<CheckboxListStore>;\n\n/**\n * Create a new CheckboxList store\n */\nconst createCheckboxListStore = (\n name: string,\n defaultValues: string[],\n disabled: boolean,\n onValuesChange?: (values: string[]) => void\n): CheckboxListStoreApi =>\n create<CheckboxListStore>((set, get) => ({\n values: defaultValues,\n setValues: (values) => {\n if (!get().disabled) {\n set({ values });\n get().onValuesChange?.(values);\n }\n },\n toggleValue: (value) => {\n if (!get().disabled) {\n const currentValues = get().values;\n const newValues = currentValues.includes(value)\n ? currentValues.filter((v) => v !== value)\n : [...currentValues, value];\n set({ values: newValues });\n get().onValuesChange?.(newValues);\n }\n },\n onValuesChange,\n disabled,\n name,\n }));\n\n/**\n * Hook to access CheckboxList store\n */\nexport const useCheckboxListStore = (externalStore?: CheckboxListStoreApi) => {\n if (!externalStore) {\n throw new Error('CheckboxListItem must be used within a CheckboxList');\n }\n return externalStore;\n};\n\n/**\n * Inject store into CheckboxListItem children\n */\nconst injectStore = (\n children: ReactNode,\n store: CheckboxListStoreApi\n): ReactNode =>\n Children.map(children, (child) => {\n if (!isValidElement(child)) return child;\n const typedChild = child as ReactElement<CheckboxListItemProps>;\n const shouldInject = typedChild.type === CheckboxListItem;\n return cloneElement(typedChild, {\n ...(shouldInject ? { store } : {}),\n ...(typedChild.props.children\n ? { children: injectStore(typedChild.props.children, store) }\n : {}),\n });\n });\n\n/**\n * CheckboxList component props interface\n */\nexport type CheckboxListProps = {\n /** Current selected values */\n values?: string[];\n /** Default selected values for uncontrolled usage */\n defaultValues?: string[];\n /** Callback when selection changes */\n onValuesChange?: (values: string[]) => void;\n /** Group name for all checkboxes */\n name?: string;\n /** Disabled state for the entire group */\n disabled?: boolean;\n /** Additional CSS classes */\n className?: string;\n /** Children components */\n children: ReactNode;\n} & Omit<HTMLAttributes<HTMLDivElement>, 'onChange' | 'defaultValues'>;\n\n/**\n * CheckboxList component for flexible checkbox group composition\n *\n * Uses Zustand for state management with automatic store injection.\n * Allows complete control over layout and styling by composing with CheckboxListItem.\n *\n * @example\n * ```tsx\n * <CheckboxList defaultValues={[\"option1\"]} onValuesChange={setValues}>\n * <div className=\"flex items-center gap-3\">\n * <CheckboxListItem value=\"option1\" id=\"c1\" />\n * <label htmlFor=\"c1\">Option 1</label>\n * </div>\n * <div className=\"flex items-center gap-3\">\n * <CheckboxListItem value=\"option2\" id=\"c2\" />\n * <label htmlFor=\"c2\">Option 2</label>\n * </div>\n * </CheckboxList>\n * ```\n */\nconst CheckboxList = forwardRef<HTMLDivElement, CheckboxListProps>(\n (\n {\n values: propValues,\n defaultValues = [],\n onValuesChange,\n name: propName,\n disabled = false,\n className = '',\n children,\n ...props\n },\n ref\n ) => {\n // Generate unique name if not provided\n const generatedId = useId();\n const name = propName || `checkbox-list-${generatedId}`;\n\n // Create store reference\n const storeRef = useRef<CheckboxListStoreApi>(null);\n storeRef.current ??= createCheckboxListStore(\n name,\n defaultValues,\n disabled,\n onValuesChange\n );\n const store = storeRef.current;\n\n // Get store actions\n const { setValues } = useStore(store, (s) => s);\n\n // Call onValuesChange with initial values\n useEffect(() => {\n const currentValues = store.getState().values;\n if (currentValues.length > 0 && onValuesChange) {\n onValuesChange(currentValues);\n }\n }, []);\n\n // Handle controlled values changes\n useEffect(() => {\n if (propValues !== undefined) {\n setValues(propValues);\n }\n }, [propValues, setValues]);\n\n // Update disabled state\n useEffect(() => {\n store.setState({ disabled });\n }, [disabled, store]);\n\n return (\n <div\n ref={ref}\n className={cn('flex flex-col gap-2 w-full', className)}\n aria-label={name}\n {...props}\n >\n {injectStore(children, store)}\n </div>\n );\n }\n);\n\nCheckboxList.displayName = 'CheckboxList';\n\n/**\n * CheckboxListItem component props interface\n */\nexport type CheckboxListItemProps = {\n /** Value for this checkbox item */\n value: string;\n /** Store reference (automatically injected by CheckboxList) */\n store?: CheckboxListStoreApi;\n /** Disabled state for this specific item */\n disabled?: boolean;\n /** Size variant */\n size?: CheckboxListSize;\n /** Visual state */\n state?: CheckboxListState;\n /** Additional CSS classes */\n className?: string;\n} & Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'type' | 'name' | 'value' | 'checked' | 'onChange' | 'size'\n>;\n\n/**\n * CheckboxListItem component for use within CheckboxList\n *\n * A checkbox without label that works within CheckboxList context.\n * Provides just the checkbox input for maximum flexibility in composition.\n *\n * @example\n * ```tsx\n * <CheckboxList defaultValues={[\"option1\"]}>\n * <div className=\"flex items-center gap-3\">\n * <CheckboxListItem value=\"option1\" id=\"c1\" />\n * <label htmlFor=\"c1\">Option 1</label>\n * </div>\n * </CheckboxList>\n * ```\n */\nconst CheckboxListItem = forwardRef<HTMLInputElement, CheckboxListItemProps>(\n (\n {\n value,\n store: externalStore,\n disabled: itemDisabled,\n size = 'medium',\n state = 'default',\n className = '',\n id,\n ...props\n },\n ref\n ) => {\n // Get store and state\n const store = useCheckboxListStore(externalStore);\n const {\n values: groupValues,\n toggleValue,\n disabled: groupDisabled,\n name,\n } = useStore(store);\n\n // Generate unique ID if not provided\n const generatedId = useId();\n const inputId = id ?? `checkbox-item-${generatedId}`;\n\n // Determine states\n const isChecked = groupValues.includes(value);\n const isDisabled = groupDisabled || itemDisabled;\n const currentState = isDisabled ? 'disabled' : state;\n\n // Use standard CheckBox component for consistency and simplicity\n return (\n <CheckBox\n ref={ref}\n id={inputId}\n name={name}\n value={value}\n checked={isChecked}\n disabled={isDisabled}\n size={size}\n state={currentState}\n className={className}\n onChange={() => {\n if (!isDisabled) {\n toggleValue(value);\n }\n }}\n {...props}\n />\n );\n }\n);\n\nCheckboxListItem.displayName = 'CheckboxListItem';\n\nexport default CheckboxList;\nexport { CheckboxListItem };\n","import {\n InputHTMLAttributes,\n ReactNode,\n forwardRef,\n useState,\n useId,\n ChangeEvent,\n} from 'react';\nimport Text from '../Text/Text';\nimport { Check, Minus } from 'phosphor-react';\nimport { cn } from '../../utils/utils';\n\n/**\n * CheckBox size variants\n */\ntype CheckBoxSize = 'small' | 'medium' | 'large';\n\n/**\n * CheckBox visual state\n */\ntype CheckBoxState = 'default' | 'hovered' | 'focused' | 'invalid' | 'disabled';\n\n/**\n * Size configurations using Tailwind classes\n */\nconst SIZE_CLASSES = {\n small: {\n checkbox: 'w-4 h-4', // 16px x 16px\n textSize: 'sm' as const,\n spacing: 'gap-1.5', // 6px\n borderWidth: 'border-2',\n iconSize: 14, // pixels for Phosphor icons\n labelHeight: 'h-[21px]',\n },\n medium: {\n checkbox: 'w-5 h-5', // 20px x 20px\n textSize: 'md' as const,\n spacing: 'gap-2', // 8px\n borderWidth: 'border-2',\n iconSize: 16, // pixels for Phosphor icons\n labelHeight: 'h-6',\n },\n large: {\n checkbox: 'w-6 h-6', // 24px x 24px\n textSize: 'lg' as const,\n spacing: 'gap-2', // 8px\n borderWidth: 'border-[3px]', // 3px border\n iconSize: 20, // pixels for Phosphor icons\n labelHeight: 'h-[27px]',\n },\n} as const;\n\n/**\n * Base checkbox styling classes using design system colors\n */\nconst BASE_CHECKBOX_CLASSES =\n 'rounded border cursor-pointer transition-all duration-200 flex items-center justify-center focus:outline-none';\n\n/**\n * State-based styling classes using design system colors from styles.css\n */\nconst STATE_CLASSES = {\n default: {\n unchecked: 'border-border-400 bg-background hover:border-border-500',\n checked:\n 'border-primary-950 bg-primary-950 text-text hover:border-primary-800 hover:bg-primary-800',\n },\n hovered: {\n unchecked: 'border-border-500 bg-background',\n checked: 'border-primary-800 bg-primary-800 text-text',\n },\n focused: {\n unchecked:\n 'border-indicator-info bg-background ring-2 ring-indicator-info/20',\n checked:\n 'border-indicator-info bg-primary-950 text-text ring-2 ring-indicator-info/20',\n },\n invalid: {\n unchecked: 'border-error-700 bg-background hover:border-error-600',\n checked: 'border-error-700 bg-primary-950 text-text',\n },\n disabled: {\n unchecked: 'border-border-400 bg-background cursor-not-allowed opacity-40',\n checked:\n 'border-primary-600 bg-primary-600 text-text cursor-not-allowed opacity-40',\n },\n} as const;\n\n/**\n * CheckBox component props interface\n */\nexport type CheckBoxProps = {\n /** Label text to display next to the checkbox */\n label?: ReactNode;\n /** Size variant of the checkbox */\n size?: CheckBoxSize;\n /** Visual state of the checkbox */\n state?: CheckBoxState;\n /** Indeterminate state for partial selections */\n indeterminate?: boolean;\n /** Error message to display */\n errorMessage?: string;\n /** Helper text to display */\n helperText?: string;\n /** Additional CSS classes */\n className?: string;\n /** Label CSS classes */\n labelClassName?: string;\n} & Omit<InputHTMLAttributes<HTMLInputElement>, 'size' | 'type'>;\n\n/**\n * CheckBox component for Analytica Ensino platforms\n *\n * A checkbox component with essential states, sizes and themes.\n * Uses the Analytica Ensino Design System colors from styles.css with automatic\n * light/dark mode support. Includes Text component integration for consistent typography.\n *\n * @example\n * ```tsx\n * // Basic checkbox\n * <CheckBox label=\"Option\" />\n *\n * // Small size\n * <CheckBox size=\"small\" label=\"Small option\" />\n *\n * // Invalid state\n * <CheckBox state=\"invalid\" label=\"Required field\" />\n *\n * // Disabled state\n * <CheckBox disabled label=\"Disabled option\" />\n * ```\n */\nconst CheckBox = forwardRef<HTMLInputElement, CheckBoxProps>(\n (\n {\n label,\n size = 'medium',\n state = 'default',\n indeterminate = false,\n errorMessage,\n helperText,\n className = '',\n labelClassName = '',\n checked: checkedProp,\n disabled,\n id,\n onChange,\n ...props\n },\n ref\n ) => {\n // Generate unique ID if not provided\n const generatedId = useId();\n const inputId = id ?? `checkbox-${generatedId}`;\n\n // Handle controlled vs uncontrolled behavior\n const [internalChecked, setInternalChecked] = useState(false);\n const isControlled = checkedProp !== undefined;\n const checked = isControlled ? checkedProp : internalChecked;\n\n // Handle change events\n const handleChange = (event: ChangeEvent<HTMLInputElement>) => {\n if (!isControlled) {\n setInternalChecked(event.target.checked);\n }\n onChange?.(event);\n };\n\n // Determine current state based on props\n const currentState = disabled ? 'disabled' : state;\n\n // Get size classes\n const sizeClasses = SIZE_CLASSES[size];\n\n // Determine checkbox visual variant\n const checkVariant = checked || indeterminate ? 'checked' : 'unchecked';\n\n // Get styling classes\n const stylingClasses = STATE_CLASSES[currentState][checkVariant];\n\n // Special border width handling for focused/hovered states and large size\n const borderWidthClass =\n state === 'focused' || (state === 'hovered' && size === 'large')\n ? 'border-[3px]'\n : sizeClasses.borderWidth;\n\n // Get final checkbox classes\n const checkboxClasses = cn(\n BASE_CHECKBOX_CLASSES,\n sizeClasses.checkbox,\n borderWidthClass,\n stylingClasses,\n className\n );\n\n // Render appropriate icon based on state\n const renderIcon = () => {\n if (indeterminate) {\n return (\n <Minus\n size={sizeClasses.iconSize}\n weight=\"bold\"\n color=\"currentColor\"\n />\n );\n }\n\n if (checked) {\n return (\n <Check\n size={sizeClasses.iconSize}\n weight=\"bold\"\n color=\"currentColor\"\n />\n );\n }\n\n return null;\n };\n\n return (\n <div className=\"flex flex-col\">\n <div\n className={cn(\n 'flex flex-row items-center',\n sizeClasses.spacing,\n disabled ? 'opacity-40' : ''\n )}\n >\n {/* Hidden native input for accessibility and form submission */}\n <input\n ref={ref}\n type=\"checkbox\"\n id={inputId}\n checked={checked}\n disabled={disabled}\n onChange={handleChange}\n className=\"sr-only\"\n {...props}\n />\n\n {/* Custom styled checkbox */}\n <label htmlFor={inputId} className={checkboxClasses}>\n {/* Show appropriate icon based on state */}\n {renderIcon()}\n </label>\n\n {/* Label text */}\n {label && (\n <div\n className={cn(\n 'flex flex-row items-center',\n sizeClasses.labelHeight\n )}\n >\n <Text\n as=\"label\"\n htmlFor={inputId}\n size={sizeClasses.textSize}\n weight=\"normal\"\n className={cn(\n 'cursor-pointer select-none leading-[150%] flex items-center font-roboto',\n labelClassName\n )}\n >\n {label}\n </Text>\n </div>\n )}\n </div>\n\n {/* Error message */}\n {errorMessage && (\n <Text\n size=\"sm\"\n weight=\"normal\"\n className=\"mt-1.5\"\n color=\"text-error-600\"\n >\n {errorMessage}\n </Text>\n )}\n\n {/* Helper text */}\n {helperText && !errorMessage && (\n <Text\n size=\"sm\"\n weight=\"normal\"\n className=\"mt-1.5\"\n color=\"text-text-500\"\n >\n {helperText}\n </Text>\n )}\n </div>\n );\n }\n);\n\nCheckBox.displayName = 'CheckBox';\n\nexport default CheckBox;\n","import {\n TextareaHTMLAttributes,\n ReactNode,\n forwardRef,\n useState,\n useId,\n ChangeEvent,\n FocusEvent,\n} from 'react';\nimport { WarningCircle } from 'phosphor-react';\nimport Text from '../Text/Text';\nimport { cn } from '../../utils/utils';\n\n/**\n * TextArea size variants\n */\ntype TextAreaSize = 'small' | 'medium' | 'large' | 'extraLarge';\n\n/**\n * TextArea visual state\n */\ntype TextAreaState = 'default' | 'hovered' | 'focused' | 'invalid' | 'disabled';\n\n/**\n * Size configurations with exact pixel specifications\n */\nconst SIZE_CLASSES = {\n small: {\n textarea: 'h-24 text-sm', // 96px height, 14px font\n textSize: 'sm' as const,\n },\n medium: {\n textarea: 'h-24 text-base', // 96px height, 16px font\n textSize: 'md' as const,\n },\n large: {\n textarea: 'h-24 text-lg', // 96px height, 18px font\n textSize: 'lg' as const,\n },\n extraLarge: {\n textarea: 'h-24 text-xl', // 96px height, 20px font\n textSize: 'xl' as const,\n },\n} as const;\n\n/**\n * Base textarea styling classes using design system colors\n */\nconst BASE_TEXTAREA_CLASSES =\n 'w-full box-border p-3 bg-background border border-solid rounded-[4px] resize-none focus:outline-none font-roboto font-normal leading-[150%] placeholder:text-text-600 transition-all duration-200';\n\n/**\n * State-based styling classes using design system colors from styles.css\n */\nconst STATE_CLASSES = {\n default: {\n base: 'border-border-300 bg-background text-text-600',\n hover: 'hover:border-border-400',\n focus: 'focus:border-border-500',\n },\n hovered: {\n base: 'border-border-400 bg-background text-text-600',\n hover: '',\n focus: 'focus:border-border-500',\n },\n focused: {\n base: 'border-2 border-primary-950 bg-background text-text-900',\n hover: '',\n focus: '',\n },\n invalid: {\n base: 'border-2 border-red-700 bg-white text-gray-800',\n hover: 'hover:border-red-700',\n focus: 'focus:border-red-700',\n },\n disabled: {\n base: 'border-border-300 bg-background text-text-600 cursor-not-allowed opacity-40',\n hover: '',\n focus: '',\n },\n} as const;\n\n/**\n * TextArea component props interface\n */\nexport type TextAreaProps = {\n /** Label text to display above the textarea */\n label?: ReactNode;\n /** Size variant of the textarea */\n size?: TextAreaSize;\n /** Visual state of the textarea */\n state?: TextAreaState;\n /** Error message to display */\n errorMessage?: string;\n /** Helper text to display */\n helperMessage?: string;\n /** Additional CSS classes */\n className?: string;\n /** Label CSS classes */\n labelClassName?: string;\n} & Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, 'size'>;\n\n/**\n * TextArea component for Analytica Ensino platforms\n *\n * A textarea component with essential states, sizes and themes.\n * Uses exact design specifications with 288px width, 96px height, and specific\n * color values. Includes Text component integration for consistent typography.\n *\n * @example\n * ```tsx\n * // Basic textarea\n * <TextArea label=\"Description\" placeholder=\"Enter description...\" />\n *\n * // Small size\n * <TextArea size=\"small\" label=\"Comment\" />\n *\n * // Invalid state\n * <TextArea state=\"invalid\" label=\"Required field\" errorMessage=\"This field is required\" />\n *\n * // Disabled state\n * <TextArea disabled label=\"Read-only field\" />\n * ```\n */\nconst TextArea = forwardRef<HTMLTextAreaElement, TextAreaProps>(\n (\n {\n label,\n size = 'medium',\n state = 'default',\n errorMessage,\n helperMessage,\n className = '',\n labelClassName = '',\n disabled,\n id,\n onChange,\n placeholder,\n ...props\n },\n ref\n ) => {\n // Generate unique ID if not provided\n const generatedId = useId();\n const inputId = id ?? `textarea-${generatedId}`;\n\n // Internal state for focus tracking\n const [isFocused, setIsFocused] = useState(false);\n\n // Handle change events\n const handleChange = (event: ChangeEvent<HTMLTextAreaElement>) => {\n onChange?.(event);\n };\n\n // Handle focus events\n const handleFocus = (event: FocusEvent<HTMLTextAreaElement>) => {\n setIsFocused(true);\n props.onFocus?.(event);\n };\n\n // Handle blur events\n const handleBlur = (event: FocusEvent<HTMLTextAreaElement>) => {\n setIsFocused(false);\n props.onBlur?.(event);\n };\n\n // Determine current state based on props and focus\n let currentState = disabled ? 'disabled' : state;\n\n // Override state based on focus\n if (\n isFocused &&\n currentState !== 'invalid' &&\n currentState !== 'disabled'\n ) {\n currentState = 'focused';\n }\n\n // Get size classes\n const sizeClasses = SIZE_CLASSES[size];\n\n // Get styling classes\n const stateClasses = STATE_CLASSES[currentState];\n\n // Get final textarea classes\n const textareaClasses = cn(\n BASE_TEXTAREA_CLASSES,\n sizeClasses.textarea,\n stateClasses.base,\n stateClasses.hover,\n stateClasses.focus,\n className\n );\n\n return (\n <div className={`flex flex-col`}>\n {/* Label */}\n {label && (\n <Text\n as=\"label\"\n htmlFor={inputId}\n size={sizeClasses.textSize}\n weight=\"medium\"\n color=\"text-text-950\"\n className={cn('mb-1.5', labelClassName)}\n >\n {label}\n </Text>\n )}\n\n {/* Textarea */}\n <textarea\n ref={ref}\n id={inputId}\n disabled={disabled}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n className={textareaClasses}\n placeholder={placeholder}\n {...props}\n />\n\n {/* Error message */}\n {errorMessage && (\n <p className=\"flex gap-1 items-center text-sm text-indicator-error mt-1.5\">\n <WarningCircle size={16} /> {errorMessage}\n </p>\n )}\n\n {/* Helper text */}\n {helperMessage && !errorMessage && (\n <Text size=\"sm\" weight=\"normal\" className=\"mt-1.5 text-text-500\">\n {helperMessage}\n </Text>\n )}\n </div>\n );\n }\n);\n\nTextArea.displayName = 'TextArea';\n\nexport default TextArea;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAAA,yBASO;;;ACRP,4BAAqB;;;ACDrB,kBAAsC;AACtC,4BAAwB;AAEjB,SAAS,MAAM,QAAsB;AAC1C,aAAO,mCAAQ,kBAAK,MAAM,CAAC;AAC7B;;;ADiJM;AA/IN,IAAM,yBAAyB;AAAA,EAC7B,OAAO;AAAA,IACL,OAAO;AAAA,IACP,SAAS;AAAA,IACT,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,UAAU;AAAA,IACR,OACE;AAAA,IACF,SACE;AAAA,IACF,SACE;AAAA,IACF,MAAM;AAAA,IACN,OACE;AAAA,EACJ;AAAA,EACA,OAAO;AAAA,IACL,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AAAA,EACA,eAAe;AAAA,IACb,OACE;AAAA,IACF,OACE;AAAA,IACF,OACE;AAAA,IACF,OACE;AAAA,EACJ;AAAA,EACA,cAAc;AAAA,IACZ,UAAU;AAAA,IACV,UAAU;AAAA,EACZ;AAAA,EACA,cAAc;AAChB;AAKA,IAAM,eAAe;AAAA,EACnB,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AACT;AAEA,IAAM,oBAAoB;AAAA,EACxB,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AACT;AA4DA,IAAM,QAAQ,CAAC;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,UAAU;AAAA,EACV,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,qBAAqB;AAAA,EACrB,GAAG;AACL,MAAkB;AAEhB,QAAM,cAAc,aAAa,IAAI;AACrC,QAAM,kBAAkB,kBAAkB,IAAI;AAC9C,QAAM,mBAAmB,uBAAuB,OAAO,KAAK,CAAC;AAC7D,QAAM,iBACJ,OAAO,qBAAqB,WACxB,mBACE,iBAA4C,MAAM,KACnD,iBAA4C,SAC7C;AAEN,QAAM,cACJ;AAEF,QAAM,kBAAkB;AACxB,MAAI,YAAY,gBAAgB;AAC9B,WACE;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,GAAG,aAAa,gBAAgB,aAAa,SAAS;AAAA,QAChE,GAAG;AAAA,QAEJ;AAAA,sDAAC,8BAAK,MAAM,IAAI,WAAU,gBAAe,eAAY,QAAO;AAAA,UAE3D,sBACC;AAAA,YAAC;AAAA;AAAA,cACC,eAAY;AAAA,cACZ,WAAU;AAAA;AAAA,UACZ;AAAA;AAAA;AAAA,IAEJ;AAAA,EAEJ;AACA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAG,aAAa,gBAAgB,aAAa,SAAS;AAAA,MAChE,GAAG;AAAA,MAEH;AAAA,oBACC,4CAAC,UAAK,WAAW,GAAG,iBAAiB,eAAe,GAAI,oBAAS;AAAA,QAElE;AAAA,QACA,aACC,4CAAC,UAAK,WAAW,GAAG,iBAAiB,eAAe,GACjD,qBACH;AAAA;AAAA;AAAA,EAEJ;AAEJ;AAEA,IAAO,gBAAQ;;;AEvLf,IAAAC,yBAAqC;;;ACArC,mBAcO;AACP,qBAA2C;;;AC4GvC,IAAAC,sBAAA;AA/CJ,IAAM,OAAO,CAA8B;AAAA,EACzC;AAAA,EACA,OAAO;AAAA,EACP,SAAS;AAAA,EACT,QAAQ;AAAA,EACR;AAAA,EACA,YAAY;AAAA,EACZ,GAAG;AACL,MAAoB;AAClB,MAAI,cAAc;AAClB,MAAI,gBAAgB;AAGpB,QAAM,eAAe;AAAA,IACnB,OAAO;AAAA,IACP,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AAEA,gBAAc,aAAa,IAAI,KAAK,aAAa;AAGjD,QAAM,iBAAiB;AAAA,IACrB,UAAU;AAAA,IACV,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,MAAM;AAAA,IACN,WAAW;AAAA,IACX,OAAO;AAAA,EACT;AAEA,kBAAgB,eAAe,MAAM,KAAK,eAAe;AAEzD,QAAM,cAAc;AACpB,QAAM,YAAY,MAAO;AAEzB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAG,aAAa,aAAa,eAAe,OAAO,SAAS;AAAA,MACtE,GAAG;AAAA,MAEH;AAAA;AAAA,EACH;AAEJ;AAEA,IAAO,eAAQ;;;AD6JP,IAAAC,sBAAA;AAjQR,IAAMC,gBAAe;AAAA,EACnB,OAAO;AAAA,IACL,OAAO;AAAA,IACP,UAAU;AAAA,IACV,SAAS;AAAA,IACT,aAAa;AAAA,IACb,SAAS;AAAA,IACT,aAAa;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,IACN,OAAO;AAAA,IACP,UAAU;AAAA,IACV,SAAS;AAAA,IACT,aAAa;AAAA,IACb,SAAS;AAAA,IACT,aAAa;AAAA,EACf;AAAA,EACA,OAAO;AAAA,IACL,OAAO;AAAA,IACP,UAAU;AAAA,IACV,SAAS;AAAA,IACT,aAAa;AAAA,IACb,SAAS;AAAA,IACT,aAAa;AAAA,EACf;AAAA,EACA,YAAY;AAAA,IACV,OAAO;AAAA,IACP,UAAU;AAAA,IACV,SAAS;AAAA,IACT,aAAa;AAAA,IACb,SAAS;AAAA,IACT,aAAa;AAAA,EACf;AACF;AAUA,IAAM,qBACJ;AAKF,IAAM,gBAAgB;AAAA,EACpB,SAAS;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA,EACX;AAAA,EACA,SAAS;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA,EACX;AAAA,EACA,SAAS;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA,EACX;AAAA,EACA,SAAS;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA,EACX;AAAA,EACA,UAAU;AAAA,IACR,WAAW;AAAA,IACX,SAAS;AAAA,EACX;AACF;AAKA,IAAM,cAAc;AAAA,EAClB,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,UAAU;AACZ;AAwDA,IAAM,YAAQ;AAAA,EACZ,CACE;AAAA,IACE;AAAA,IACA,OAAO;AAAA,IACP,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ,iBAAiB;AAAA,IACjB,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACG;AAEH,UAAM,kBAAc,oBAAM;AAC1B,UAAM,UAAU,MAAM,SAAS,WAAW;AAC1C,UAAM,eAAW,qBAAyB,IAAI;AAG9C,UAAM,CAAC,iBAAiB,kBAAkB,QAAI,uBAAS,cAAc;AACrE,UAAM,eAAe,gBAAgB;AACrC,UAAM,UAAU,eAAe,cAAc;AAG7C,UAAM,eAAe,CAAC,UAAyC;AAC7D,YAAM,aAAa,MAAM,OAAO;AAEhC,UAAI,CAAC,cAAc;AACjB,2BAAmB,UAAU;AAAA,MAC/B;AAGA,UAAI,MAAM,QAAQ;AAChB,cAAM,OAAO,KAAK;AAAA,MACpB;AAEA,iBAAW,KAAK;AAAA,IAClB;AAGA,UAAM,eAAe,WAAW,aAAa;AAG7C,UAAM,cAAcA,cAAa,IAAI;AAGrC,UAAM,kBAAkB,YAAY;AACpC,UAAM,gBAAgB,YAAY;AAGlC,UAAM,eAAe,UAAU,YAAY;AAG3C,UAAM,iBAAiB,cAAc,YAAY,EAAE,YAAY;AAG/D,UAAM,iBAAiB,MAAM;AAC3B,UAAI,iBAAiB,WAAW;AAC9B,eAAO;AAAA,MACT;AACA,aAAO,YAAY;AAAA,IACrB;AAEA,UAAM,mBAAmB,eAAe;AAGxC,UAAM,eAAe;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAGA,UAAM,aAAa;AAAA,MACjB;AAAA,MACA;AAAA,MACA,YAAY,YAAY;AAAA,MACxB;AAAA,IACF;AAGA,UAAM,kBACJ,iBAAiB,aAAa,iBAAiB;AACjD,UAAM,qBACJ,iBAAiB,YACb,0BACA;AAGN,UAAM,eAAe,MAAM;AACzB,UAAI,iBAAiB,YAAY;AAC/B,eAAO,UAAU,kBAAkB;AAAA,MACrC;AAEA,UAAI,iBAAiB,WAAW;AAC9B,eAAO;AAAA,MACT;AAEA,aAAO,UAAU,kBAAkB;AAAA,IACrC;AAGA,UAAM,iBAAiB,MAAM;AAC3B,aAAO,iBAAiB,aACpB,uBACA;AAAA,IACN;AAEA,WACE,8CAAC,SAAI,WAAU,iBACb;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAW;AAAA,YACT;AAAA,YACA,kBACI,GAAG,gBAAgB,oBAAoB,oBAAoB,IAC3D,YAAY;AAAA,YAChB,WAAW,eAAe;AAAA,UAC5B;AAAA,UAGA;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,KAAK,CAAC,SAAS;AACb,2BAAS,UAAU;AACnB,sBAAI,OAAO,QAAQ,WAAY,KAAI,IAAI;AAAA,2BAC9B,IAAK,KAAI,UAAU;AAAA,gBAC9B;AAAA,gBACA,MAAK;AAAA,gBACL,IAAI;AAAA,gBACJ;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA,UAAU;AAAA,gBACV,WAAU;AAAA,gBACV,OAAO;AAAA,kBACL,UAAU;AAAA,kBACV,MAAM;AAAA,kBACN,YAAY;AAAA,gBACd;AAAA,gBACC,GAAG;AAAA;AAAA,YACN;AAAA,YAGA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,WAAW;AAAA,gBACX;AAAA,gBACA,gBAAc;AAAA,gBACd,SAAS,CAAC,MAAM;AAEd,oBAAE,eAAe;AACjB,sBAAI,CAAC,UAAU;AAEb,wBAAI,SAAS,SAAS;AACpB,+BAAS,QAAQ,MAAM;AAEvB,+BAAS,QAAQ,KAAK;AAAA,oBACxB;AAAA,kBACF;AAAA,gBACF;AAAA,gBACA,WAAW,CAAC,MAAM;AAEhB,uBAAK,EAAE,QAAQ,WAAW,EAAE,QAAQ,QAAQ,CAAC,UAAU;AACrD,sBAAE,eAAe;AACjB,wBAAI,SAAS,SAAS;AACpB,+BAAS,QAAQ,MAAM;AACvB,+BAAS,QAAQ,KAAK;AAAA,oBACxB;AAAA,kBACF;AAAA,gBACF;AAAA,gBAGC,qBAAW,6CAAC,SAAI,WAAW,YAAY;AAAA;AAAA,YAC1C;AAAA,YAGC,SACC;AAAA,cAAC;AAAA;AAAA,gBACC,WAAW;AAAA,kBACT;AAAA,kBACA,YAAY;AAAA,kBACZ;AAAA,gBACF;AAAA,gBAEA;AAAA,kBAAC;AAAA;AAAA,oBACC,IAAG;AAAA,oBACH,SAAS;AAAA,oBACT,MAAM,YAAY;AAAA,oBAClB,QAAO;AAAA,oBACP,WAAW;AAAA,sBACT,eAAe;AAAA,sBACf;AAAA,sBACA;AAAA,oBACF;AAAA,oBACA,OAAO,aAAa;AAAA,oBAEnB;AAAA;AAAA,gBACH;AAAA;AAAA,YACF;AAAA;AAAA;AAAA,MAEJ;AAAA,MAGC,gBACC;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,QAAO;AAAA,UACP,WAAU;AAAA,UACV,OAAM;AAAA,UAEL;AAAA;AAAA,MACH;AAAA,MAID,cAAc,CAAC,gBACd;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,QAAO;AAAA,UACP,WAAU;AAAA,UACV,OAAM;AAAA,UAEL;AAAA;AAAA,MACH;AAAA,OAEJ;AAAA,EAEJ;AACF;AAEA,MAAM,cAAc;AAkBpB,IAAM,wBAAwB,CAC5B,MACA,cACA,UACA,sBAEA,uBAAwB,CAAC,KAAK,SAAS;AAAA,EACrC,OAAO;AAAA,EACP,UAAU,CAAC,UAAU;AACnB,QAAI,CAAC,IAAI,EAAE,UAAU;AACnB,UAAI,EAAE,MAAM,CAAC;AACb,UAAI,EAAE,gBAAgB,KAAK;AAAA,IAC7B;AAAA,EACF;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE;AAKG,IAAM,qBAAqB,CAAC,kBAAuC;AACxE,MAAI,CAAC,eAAe;AAClB,UAAM,IAAI,MAAM,iDAAiD;AAAA,EACnE;AACA,SAAO;AACT;AAKA,IAAM,cAAc,CAClB,UACA,UAEA,sBAAS,IAAI,UAAU,CAAC,UAAU;AAChC,MAAI,KAAC,6BAAe,KAAK,EAAG,QAAO;AAEnC,QAAM,aAAa;AACnB,QAAM,eAAe,WAAW,SAAS;AACzC,aAAO,2BAAa,YAAY;AAAA,IAC9B,GAAI,eAAe,EAAE,MAAM,IAAI,CAAC;AAAA,IAChC,GAAI,WAAW,MAAM,WACjB,EAAE,UAAU,YAAY,WAAW,MAAM,UAAU,KAAK,EAAE,IAC1D,CAAC;AAAA,EACP,CAAC;AACH,CAAC;AA0CH,IAAM,iBAAa;AAAA,EACjB,CACE;AAAA,IACE,OAAO;AAAA,IACP,eAAe;AAAA,IACf;AAAA,IACA,MAAM;AAAA,IACN,WAAW;AAAA,IACX,YAAY;AAAA,IACZ;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACG;AAEH,UAAM,kBAAc,oBAAM;AAC1B,UAAM,OAAO,YAAY,eAAe,WAAW;AAGnD,UAAM,eAAW,qBAA2B,IAAI;AAChD,aAAS,YAAY;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,UAAM,QAAQ,SAAS;AAGvB,UAAM,EAAE,SAAS,QAAI,yBAAS,OAAO,CAAC,MAAM,CAAC;AAG7C,gCAAU,MAAM;AACd,YAAM,eAAe,MAAM,SAAS,EAAE;AACtC,UAAI,gBAAgB,eAAe;AACjC,sBAAc,YAAY;AAAA,MAC5B;AAAA,IACF,GAAG,CAAC,CAAC;AAGL,gCAAU,MAAM;AACd,UAAI,cAAc,QAAW;AAC3B,iBAAS,SAAS;AAAA,MACpB;AAAA,IACF,GAAG,CAAC,WAAW,QAAQ,CAAC;AAGxB,gCAAU,MAAM;AACd,YAAM,SAAS,EAAE,SAAS,CAAC;AAAA,IAC7B,GAAG,CAAC,UAAU,KAAK,CAAC;AAEpB,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,MAAK;AAAA,QACL,cAAY;AAAA,QACX,GAAG;AAAA,QAEH,sBAAY,UAAU,KAAK;AAAA;AAAA,IAC9B;AAAA,EAEJ;AACF;AAEA,WAAW,cAAc;AAuCzB,IAAM,qBAAiB;AAAA,EACrB,CACE;AAAA,IACE;AAAA,IACA,OAAO;AAAA,IACP,UAAU;AAAA,IACV,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACG;AAEH,UAAM,QAAQ,mBAAmB,aAAa;AAC9C,UAAM;AAAA,MACJ,OAAO;AAAA,MACP;AAAA,MACA,UAAU;AAAA,MACV;AAAA,IACF,QAAI,yBAAS,KAAK;AAGlB,UAAM,kBAAc,oBAAM;AAC1B,UAAM,UAAU,MAAM,cAAc,WAAW;AAG/C,UAAM,YAAY,eAAe;AACjC,UAAM,aAAa,iBAAiB;AACpC,UAAM,eAAe,aAAa,aAAa;AAG/C,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,IAAI;AAAA,QACJ;AAAA,QACA;AAAA,QACA,SAAS;AAAA,QACT,UAAU;AAAA,QACV;AAAA,QACA,OAAO;AAAA,QACP;AAAA,QACA,UAAU,CAAC,MAAM;AACf,cAAI,EAAE,OAAO,WAAW,CAAC,YAAY;AACnC,qBAAS,KAAK;AAAA,UAChB;AAAA,QACF;AAAA,QACC,GAAG;AAAA;AAAA,IACN;AAAA,EAEJ;AACF;AAEA,eAAe,cAAc;;;ADhqB7B,IAAAC,gBAA4D;AA+GA,IAAAC,sBAAA;AAtC5D,IAAM,mBAAmB,CAAC;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,OAAO;AAAA,EACP;AACF,MAA6B;AAE3B,QAAM,eAAW,qBAAM;AACvB,QAAM,YAAY,QAAQ,gBAAgB,QAAQ;AAClD,QAAM,CAAC,aAAa,cAAc,QAAI,wBAAS,KAAK;AAEpD,QAAM,aAAa,SAAS;AAC5B,QAAMC,mBAAkB,CACtB,QACAC,gBACG;AACH,UAAM,aAAaA,cAAa,KAAK;AAErC,YAAQ,QAAQ;AAAA,MACd,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT;AACE,eAAO,mCAAmC,UAAU;AAAA,IACxD;AAAA,EACF;AAEA,QAAMC,kBAAiB,CAAC,WAAmC;AACzD,YAAQ,QAAQ;AAAA,MACd,KAAK;AACH,eACE,6CAAC,iBAAM,SAAQ,SAAQ,QAAO,WAAU,UAAU,6CAAC,sCAAY,GAAI,8BAEnE;AAAA,MAEJ,KAAK;AACH,eACE,6CAAC,iBAAM,SAAQ,SAAQ,QAAO,SAAQ,UAAU,6CAAC,kCAAQ,GAAI,gCAE7D;AAAA,MAEJ;AACE,eAAO;AAAA,IACX;AAAA,EACF;AAEA,QAAM,mBAAmB,MAAM;AAC7B,YAAQ,QAAQ;AAAA,MACd,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT;AACE,eAAO;AAAA,IACX;AAAA,EACF;AAGA,QAAM,4BAA4B,CAAC,gBAA6B;AAC9D,UAAM,gBAAgB,YAAY;AAClC,UAAM,iBAAiB,kBAAkB,YAAY;AACrD,UAAM,kBAAkB,YAAY,WAAW;AAG/C,QAAI,gBAAuC;AAC3C,QAAI,kBAAkB,CAAC,iBAAiB;AAEtC,sBAAgB;AAAA,IAClB,WAAW,iBAAiB;AAE1B,sBAAgB;AAAA,IAClB;AAEA,UAAM,eAAeF,iBAAgB,eAAe,IAAI;AACxD,UAAM,cAAcE,gBAAe,aAAa;AAGhD,UAAM,cAAc,MAAM;AACxB,YAAM,eAAe,6GACnB,iBACI,qCACA,iCACN;AAEA,YAAM,aACJ;AAEF,aACE,6CAAC,SAAI,WAAW,cACb,4BAAkB,6CAAC,SAAI,WAAW,YAAY,GACjD;AAAA,IAEJ;AAEA,QAAI,WAAW,YAAY;AACzB,aACE;AAAA,QAAC;AAAA;AAAA,UAEC,WAAW;AAAA,YACT;AAAA,YACA;AAAA,YACA,YAAY,WAAW,eAAe;AAAA,UACxC;AAAA,UAEA,wDAAC,SAAI,WAAU,0CACb;AAAA,0DAAC,SAAI,WAAU,iCACb;AAAA,2DAAC,SAAI,WAAU,QAAQ,sBAAY,GAAE;AAAA,cACrC,8CAAC,SAAI,WAAU,UACb;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAW;AAAA,sBACT;AAAA,sBACA,kBAAkB,YAAY,SAAS,cACnC,kBACA;AAAA,oBACN;AAAA,oBAEC,sBAAY;AAAA;AAAA,gBACf;AAAA,gBACC,YAAY,eACX,6CAAC,OAAE,WAAU,8BACV,sBAAY,aACf;AAAA,iBAEJ;AAAA,eACF;AAAA,YACC,eAAe,6CAAC,SAAI,WAAU,iBAAiB,uBAAY;AAAA,aAC9D;AAAA;AAAA,QA7BK;AAAA,MA8BP;AAAA,IAEJ;AAEA,WACE;AAAA,MAAC;AAAA;AAAA,QAEC,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA,YAAY,WAAW,eAAe;AAAA,QACxC;AAAA,QAEA;AAAA,wDAAC,SAAI,WAAU,kCACZ;AAAA,wBAAY;AAAA,YACb;AAAA,cAAC;AAAA;AAAA,gBACC,WAAW;AAAA,kBACT;AAAA,kBACA,kBAAkB,YAAY,SAAS,cACnC,kBACA;AAAA,gBACN;AAAA,gBAEC,sBAAY;AAAA;AAAA,YACf;AAAA,aACF;AAAA,UACC,eAAe,6CAAC,SAAI,WAAU,iBAAiB,uBAAY;AAAA;AAAA;AAAA,MApBvD;AAAA,IAqBP;AAAA,EAEJ;AAGA,MAAI,YAAY;AACd,WACE;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,GAAG,iBAAiB,iBAAiB,GAAG,UAAU,SAAS;AAAA,QAErE,uBAAa;AAAA,UAAI,CAAC,gBACjB,0BAA0B,WAAW;AAAA,QACvC;AAAA;AAAA,IACF;AAAA,EAEJ;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,eAAe,CAACC,WAAU;AACxB,uBAAeA,MAAK;AACpB,wBAAgBA,MAAK;AAAA,MACvB;AAAA,MACA;AAAA,MACA,WAAW,GAAG,iBAAiB,iBAAiB,GAAG,SAAS;AAAA,MAE3D,uBAAa,IAAI,CAAC,aAAa,UAAU;AACxC,cAAM,gBAAgB,YAAY,SAAS,OAAO,KAAK;AACvD,cAAM,eAAeH,iBAAgB,YAAY,QAAQ,KAAK;AAC9D,cAAM,cAAcE,gBAAe,YAAY,MAAM;AAErD,YAAI,WAAW,YAAY;AACzB,iBACE;AAAA,YAAC;AAAA;AAAA,cAEC,WAAW;AAAA,gBACT;AAAA,gBACA;AAAA,gBACA,YAAY,WACR,kCACA;AAAA,cACN;AAAA,cAEA,wDAAC,SAAI,WAAU,0CACb;AAAA,8DAAC,SAAI,WAAU,iCACb;AAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,OAAO,YAAY;AAAA,sBACnB,IAAI;AAAA,sBACJ,UAAU,YAAY;AAAA,sBACtB,WAAU;AAAA;AAAA,kBACZ;AAAA,kBACA,8CAAC,SAAI,WAAU,UACb;AAAA;AAAA,sBAAC;AAAA;AAAA,wBACC,SAAS;AAAA,wBACT,WAAW;AAAA,0BACT;AAAA,0BACA,gBAAgB,YAAY,QACxB,kBACA;AAAA,0BACJ,YAAY,WACR,uBACA;AAAA,wBACN;AAAA,wBAEC,sBAAY;AAAA;AAAA,oBACf;AAAA,oBACC,YAAY,eACX,6CAAC,OAAE,WAAU,8BACV,sBAAY,aACf;AAAA,qBAEJ;AAAA,mBACF;AAAA,gBACC,eACC,6CAAC,SAAI,WAAU,iBAAiB,uBAAY;AAAA,iBAEhD;AAAA;AAAA,YA1CK;AAAA,UA2CP;AAAA,QAEJ;AAEA,eACE;AAAA,UAAC;AAAA;AAAA,YAEC,WAAW;AAAA,cACT;AAAA,cACA;AAAA,cACA,YAAY,WAAW,kCAAkC;AAAA,YAC3D;AAAA,YAEA;AAAA,4DAAC,SAAI,WAAU,kCACb;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO,YAAY;AAAA,oBACnB,IAAI;AAAA,oBACJ,UAAU,YAAY;AAAA;AAAA,gBACxB;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACC,SAAS;AAAA,oBACT,WAAW;AAAA,sBACT;AAAA,sBACA,gBAAgB,YAAY,QACxB,kBACA;AAAA,sBACJ,YAAY,WAAW,uBAAuB;AAAA,oBAChD;AAAA,oBAEC,sBAAY;AAAA;AAAA,gBACf;AAAA,iBACF;AAAA,cACC,eAAe,6CAAC,SAAI,WAAU,iBAAiB,uBAAY;AAAA;AAAA;AAAA,UA1BvD;AAAA,QA2BP;AAAA,MAEJ,CAAC;AAAA;AAAA,EACH;AAEJ;AAQA,IAAM,wBAAoB;AAAA,EACxB,CAAC,EAAE,WAAW,OAAO,UAAU,SAAS,GAAG,MAAM,GAAG,QAAQ;AAC1D,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,QACC,GAAG;AAAA,QAEJ;AAAA,wDAAC,UAAK,WAAU,iBACd;AAAA,yDAAC,OAAE,WAAU,mCAAmC,iBAAM;AAAA,YACtD,6CAAC,OAAE,WAAU,0BAA0B,oBAAS;AAAA,aAClD;AAAA,UAEA,6CAAC,OAAE,WAAU,yBAAyB,mBAAQ;AAAA;AAAA;AAAA,IAChD;AAAA,EAEJ;AACF;;;AGvRI,IAAAE,sBAAA;AAlGJ,IAAMC,0BAAyB;AAAA,EAC7B,OAAO;AAAA,IACL,SACE;AAAA,IACF,UACE;AAAA,IACF,UACE;AAAA,EACJ;AAAA,EACA,SAAS;AAAA,IACP,SACE;AAAA,IACF,UACE;AAAA,IACF,UACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,SACE;AAAA,IACF,UACE;AAAA,IACF,UACE;AAAA,EACJ;AACF;AAKA,IAAMC,gBAAe;AAAA,EACnB,eAAe;AAAA,EACf,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,eAAe;AACjB;AA0CA,IAAM,SAAS,CAAC;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,UAAU;AAAA,EACV,SAAS;AAAA,EACT,YAAY;AAAA,EACZ;AAAA,EACA,OAAO;AAAA,EACP,GAAG;AACL,MAAmB;AAEjB,QAAM,cAAcA,cAAa,IAAI;AACrC,QAAM,iBAAiBD,wBAAuB,OAAO,EAAE,MAAM;AAE7D,QAAM,cACJ;AAEF,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAG,aAAa,gBAAgB,aAAa,SAAS;AAAA,MACjE;AAAA,MACA;AAAA,MACC,GAAG;AAAA,MAEH;AAAA,oBAAY,6CAAC,UAAK,WAAU,0BAA0B,oBAAS;AAAA,QAC/D;AAAA,QACA,aAAa,6CAAC,UAAK,WAAU,0BAA0B,qBAAU;AAAA;AAAA;AAAA,EACpE;AAEJ;AAEA,IAAO,iBAAQ;;;ACrHf,IAAAE,gBAA4D;AAyHpD,IAAAC,sBAAA;AAxDR,IAAM,iBAAa;AAAA,EACjB,CACE,EAAE,MAAM,OAAO,MAAM,SAAS,OAAO,YAAY,IAAI,UAAU,GAAG,MAAM,GACxE,QACG;AAEH,UAAM,cAAc;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAGA,UAAM,cAAc;AAAA,MAClB,IAAI,CAAC,OAAO,OAAO,SAAS;AAAA,MAC5B,IAAI,CAAC,QAAQ,QAAQ,WAAW;AAAA,IAClC;AAGA,UAAM,gBAAgB,SAClB,CAAC,kBAAkB,qBAAqB,uBAAuB,IAC/D,CAAC;AAEL,UAAM,aAAa;AAAA,MACjB,GAAG;AAAA,MACH,GAAG,YAAY,IAAI;AAAA,MACnB,GAAG;AAAA,IACL,EAAE,KAAK,GAAG;AAGV,UAAM,YAAY,MAAM,YAAY,KAAK;AAEzC,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,MAAK;AAAA,QACL,WAAW,GAAG,YAAY,SAAS;AAAA,QACnC;AAAA,QACA,gBAAc;AAAA,QACd,cAAY;AAAA,QACX,GAAG;AAAA,QAEJ,uDAAC,UAAK,WAAU,oCAAoC,gBAAK;AAAA;AAAA,IAC3D;AAAA,EAEJ;AACF;AAEA,WAAW,cAAc;AAEzB,IAAO,qBAAQ;;;APhHf,IAAAC,iBAWO;;;AQ5BP,IAAAC,kBAAuB;AACvB,wBAAyB;AAoQlB,IAAM,mBAAe,wBAAkB;AAAA,MAC5C;AAAA,IACE,CAAC,KAAK,QAAQ;AACZ,UAAI,gBAAuD;AAE3D,YAAM,aAAa,MAAM;AACvB,YAAI,IAAI,EAAE,YAAY;AACpB;AAAA,QACF;AAEA,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,aAAa,CAAC;AAAA,QACd,aAAa;AAAA,QACb,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,iBAAiB;AAAA,QACjB,uBAAuB;AAAA;AAAA,QAEvB,gBAAgB,CAAC,cAAc,IAAI,EAAE,aAAa,UAAU,CAAC;AAAA,QAC7D,eAAe,CAAC,aAAa,IAAI,EAAE,YAAY,SAAS,CAAC;AAAA,QACzD,kBAAkB,CAAC,WAAW,IAAI,EAAE,eAAe,OAAO,CAAC;AAAA,QAC3D,WAAW,CAAC,WAAW,IAAI,EAAE,OAAO,CAAC;AAAA,QACrC,gBAAgB,CAAC,gBAAgB,IAAI,EAAE,YAAY,CAAC;AAAA,QACpD,WAAW,MAAM,IAAI,EAAE;AAAA,QACvB,YAAY,CAAC,YAAY,IAAI,EAAE,QAAQ,CAAC;AAAA,QACxC,mBAAmB,CAAC,oBAAoB,IAAI,EAAE,gBAAgB,CAAC;AAAA;AAAA,QAE/D,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,QAEA,eAAe,MAAM;AACnB,gBAAM,EAAE,aAAa,YAAY,cAAc,IAAI,IAAI;AACvD,cAAI;AACF,mBAAO,EAAE,MAAM,aAAa,MAAM,cAAuB;AAC3D,cAAI;AACF,mBAAO,EAAE,MAAM,YAAY,MAAM,aAAsB;AACzD,cAAI;AACF,mBAAO,EAAE,MAAM,eAAe,MAAM,gBAAyB;AAC/D,iBAAO;AAAA,QACT;AAAA,QAEA,cAAc,CAAC,YAAY,aAAa;AACtC,gBAAM,EAAE,eAAe,YAAY,IAAI,IAAI;AAC3C,gBAAM,aAAa,cAAc;AAEjC,cAAI,CAAC,WAAY;AAEjB,gBAAM,aAAa,WAAW,KAAK;AACnC,gBAAM,SAAS,IAAI,EAAE,UAAU;AAE/B,cAAI,CAAC,UAAU,WAAW,IAAI;AAC5B,oBAAQ,KAAK,0CAA0C;AACvD;AAAA,UACF;AAEA,gBAAM,WAAW,WAAW,KAAK,UAAU;AAAA,YACzC,CAAC,MAAM,EAAE,OAAO;AAAA,UAClB;AACA,cAAI,CAAC,SAAU;AAEf,gBAAM,sBAAsB,YAAY;AAAA,YACtC,CAAC,WAAW,OAAO,eAAe;AAAA,UACpC;AAEA,gBAAM,gBAAgC;AAAA,YACpC;AAAA,YACA;AAAA,YACA;AAAA,YACA,QACE,SAAS,iBAAiB,oCACtB,WACA;AAAA,YACN,UACE,SAAS,iBAAiB,oCACtB,OACA;AAAA,YACN,cAAc,SAAS;AAAA,YACvB,cAAc;AAAA,UAChB;AAEA,cAAI;AACJ,cAAI,wBAAwB,IAAI;AAC9B,iCAAqB,CAAC,GAAG,WAAW;AACpC,+BAAmB,mBAAmB,IAAI;AAAA,UAC5C,OAAO;AACL,iCAAqB,CAAC,GAAG,aAAa,aAAa;AAAA,UACrD;AAEA,cAAI;AAAA,YACF,aAAa;AAAA,UACf,CAAC;AAAA,QACH;AAAA,QAEA,sBAAsB,CAAC,YAAY,cAAc;AAC/C,gBAAM,EAAE,eAAe,YAAY,IAAI,IAAI;AAC3C,gBAAM,aAAa,cAAc;AAEjC,cAAI,CAAC,WAAY;AAEjB,gBAAM,aAAa,WAAW,KAAK;AACnC,gBAAM,SAAS,IAAI,EAAE,UAAU;AAE/B,cAAI,CAAC,UAAU,WAAW,IAAI;AAC5B,oBAAQ,KAAK,kDAAkD;AAC/D;AAAA,UACF;AAEA,gBAAM,WAAW,WAAW,KAAK,UAAU;AAAA,YACzC,CAAC,MAAM,EAAE,OAAO;AAAA,UAClB;AACA,cAAI,CAAC,SAAU;AAGf,gBAAM,sBAAsB,YAAY;AAAA,YACtC,CAAC,WAAW,OAAO,eAAe;AAAA,UACpC;AAGA,gBAAM,iBAAmC,UAAU;AAAA,YACjD,CAAC,cAAc;AAAA,cACb;AAAA,cACA;AAAA,cACA;AAAA,cACA,QAAQ;AAAA;AAAA,cACR,UAAU;AAAA;AAAA,cACV,cAAc,SAAS;AAAA,cACvB,cAAc;AAAA,YAChB;AAAA,UACF;AAGA,gBAAM,qBAAqB;AAAA,YACzB,GAAG;AAAA,YACH,GAAG;AAAA,UACL;AAEA,cAAI;AAAA,YACF,aAAa;AAAA,UACf,CAAC;AAAA,QACH;AAAA,QAEA,0BAA0B,CAAC,YAAY,WAAW;AAChD,gBAAM,EAAE,eAAe,YAAY,IAAI,IAAI;AAC3C,gBAAM,aAAa,cAAc;AAEjC,cAAI,CAAC,WAAY;AAEjB,gBAAM,aAAa,WAAW,KAAK;AACnC,gBAAM,SAAS,IAAI,EAAE,UAAU;AAE/B,cAAI,CAAC,UAAU,WAAW,IAAI;AAC5B,oBAAQ;AAAA,cACN;AAAA,YACF;AACA;AAAA,UACF;AAEA,gBAAM,WAAW,WAAW,KAAK,UAAU;AAAA,YACzC,CAAC,MAAM,EAAE,OAAO;AAAA,UAClB;AACA,cACE,CAAC,YACD,SAAS,iBAAiB,mCAC1B;AACA,oBAAQ;AAAA,cACN;AAAA,YACF;AACA;AAAA,UACF;AAEA,gBAAM,sBAAsB,YAAY;AAAA,YACtC,CAAC,eAAe,WAAW,eAAe;AAAA,UAC5C;AAEA,gBAAM,gBAAgC;AAAA,YACpC;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,UAAU;AAAA,YACV,cAAc;AAAA,YACd,cAAc;AAAA,UAChB;AAEA,cAAI;AACJ,cAAI,wBAAwB,IAAI;AAC9B,iCAAqB,CAAC,GAAG,WAAW;AACpC,+BAAmB,mBAAmB,IAAI;AAAA,UAC5C,OAAO;AACL,iCAAqB,CAAC,GAAG,aAAa,aAAa;AAAA,UACrD;AAEA,cAAI;AAAA,YACF,aAAa;AAAA,UACf,CAAC;AAAA,QACH;AAAA,QAEA,cAAc,MAAM;AAClB,gBAAM,EAAE,oBAAoB,aAAa,cAAc,IAAI,IAAI;AAC/D,gBAAM,kBAAkB,mBAAmB;AAC3C,gBAAM,aAAa,cAAc;AAEjC,cAAI,CAAC,WAAY;AAEjB,cAAI,iBAAiB;AACnB,kBAAM,aAAa,WAAW,KAAK;AACnC,kBAAM,SAAS,IAAI,EAAE,UAAU;AAE/B,gBAAI,CAAC,UAAU,WAAW,IAAI;AAC5B,sBAAQ,KAAK,0CAA0C;AACvD;AAAA,YACF;AAEA,kBAAM,sBAAsB,YAAY;AAAA,cACtC,CAAC,WAAW,OAAO,eAAe,gBAAgB;AAAA,YACpD;AAEA,kBAAM,gBAAgC;AAAA,cACpC,YAAY,gBAAgB;AAAA,cAC5B;AAAA,cACA;AAAA,cACA,QAAQ;AAAA,cACR,UAAU;AAAA,cACV,cAAc,gBAAgB;AAAA,cAC9B,cAAc;AAAA,YAChB;AAEA,gBAAI;AACJ,gBAAI,wBAAwB,IAAI;AAE9B,mCAAqB,CAAC,GAAG,WAAW;AACpC,iCAAmB,mBAAmB,IAAI;AAAA,YAC5C,OAAO;AAEL,mCAAqB,CAAC,GAAG,aAAa,aAAa;AAAA,YACrD;AAEA,gBAAI;AAAA,cACF,aAAa;AAAA,YACf,CAAC;AAAA,UACH;AAAA,QACF;AAAA,QAEA,eAAe,CAAC,YAAY,aAAa;AACvC,gBAAM,EAAE,eAAe,YAAY,IAAI,IAAI;AAC3C,gBAAM,aAAa,cAAc;AAEjC,cAAI,CAAC,WAAY;AAGjB,gBAAM,aAAa,WAAW,KAAK;AACnC,gBAAM,SAAS,IAAI,EAAE,UAAU;AAE/B,cAAI,CAAC,UAAU,WAAW,IAAI;AAC5B,oBAAQ,KAAK,2CAA2C;AACxD;AAAA,UACF;AAEA,gBAAM,WAAW,WAAW,KAAK,UAAU;AAAA,YACzC,CAAC,MAAM,EAAE,OAAO;AAAA,UAClB;AACA,cAAI,CAAC,SAAU;AAEf,gBAAM,sBAAsB,YAAY;AAAA,YACtC,CAAC,WAAW,OAAO,eAAe;AAAA,UACpC;AAEA,gBAAM,gBAAgC;AAAA,YACpC;AAAA,YACA;AAAA,YACA;AAAA,YACA,QACE,SAAS,iBAAiB,oCACtB,YAAY,OACZ;AAAA,YACN,UACE,SAAS,iBAAiB,oCACtB,YAAY,OACZ;AAAA,YACN,cAAc,SAAS;AAAA,YACvB,cAAc;AAAA,UAChB;AAEA,cAAI,wBAAwB,IAAI;AAE9B,kBAAM,qBAAqB,CAAC,GAAG,WAAW;AAC1C,+BAAmB,mBAAmB,IAAI;AAC1C,gBAAI,EAAE,aAAa,mBAAmB,CAAC;AAAA,UACzC,OAAO;AAEL,gBAAI,EAAE,aAAa,CAAC,GAAG,aAAa,aAAa,EAAE,CAAC;AAAA,UACtD;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,aAAa,CAAC;AAAA,YACd,aAAa;AAAA,YACb,WAAW;AAAA,YACX,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,iBAAiB;AAAA,YACjB,uBAAuB;AAAA,UACzB,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,sBAAsB,cAAc,IAAI,IAAI;AACpD,gBAAM,aAAa,cAAc;AAEjC,cAAI,CAAC,YAAY;AACf,mBAAO;AAAA,UACT;AAEA,iBAAO,WAAW,KAAK,UAAU,oBAAoB;AAAA,QACvD;AAAA,QAEA,mBAAmB,MAAM;AACvB,gBAAM,EAAE,cAAc,IAAI,IAAI;AAC9B,gBAAM,aAAa,cAAc;AAEjC,iBAAO,YAAY,MAAM,WAAW,UAAU;AAAA,QAChD;AAAA,QAEA,sBAAsB,MAAM;AAC1B,gBAAM,EAAE,YAAY,IAAI,IAAI;AAC5B,iBAAO,YAAY;AAAA,YACjB,CAAC,WAAW,OAAO,aAAa,QAAQ,OAAO,WAAW;AAAA,UAC5D,EAAE;AAAA,QACJ;AAAA,QAEA,wBAAwB,MAAM;AAC5B,gBAAM,EAAE,eAAe,YAAY,IAAI,IAAI;AAC3C,gBAAM,aAAa,cAAc;AACjC,cAAI,CAAC,WAAY,QAAO,CAAC;AAEzB,gBAAM,sBAAgC,CAAC;AAEvC,qBAAW,KAAK,UAAU,QAAQ,CAAC,UAAU,UAAU;AACrD,kBAAM,aAAa,YAAY;AAAA,cAC7B,CAAC,WAAW,OAAO,eAAe,SAAS;AAAA,YAC7C;AACA,kBAAM,aACJ,eACC,WAAW,aAAa,QAAQ,WAAW,WAAW;AACzD,kBAAM,YACJ,cACA,WAAW,aAAa,QACxB,WAAW,WAAW;AAExB,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,YAAY,IAAI,IAAI;AAC5B,iBAAO,YAAY;AAAA,YACjB,CAAC,WAAW,OAAO,aAAa,QAAQ,OAAO,WAAW;AAAA,UAC5D,EAAE;AAAA,QACJ;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,YAAY,IAAI,IAAI;AAC5B,gBAAM,aAAa,YAAY;AAAA,YAC7B,CAAC,WAAW,OAAO,eAAe;AAAA,UACpC;AACA,iBAAO,aACH,WAAW,aAAa,QAAQ,WAAW,WAAW,OACtD;AAAA,QACN;AAAA,QAEA,mBAAmB,CAAC,eAAe;AACjC,gBAAM,EAAE,YAAY,IAAI,IAAI;AAC5B,gBAAM,aAAa,YAAY;AAAA,YAC7B,CAAC,WAAW,OAAO,eAAe;AAAA,UACpC;AACA,iBAAO,aACH,WAAW,aAAa,QAAQ,WAAW,WAAW,OACtD;AAAA,QACN;AAAA,QAEA,kBAAkB,MAAM;AACtB,gBAAM,EAAE,oBAAoB,YAAY,IAAI,IAAI;AAChD,gBAAM,kBAAkB,mBAAmB;AAE3C,cAAI,CAAC,gBAAiB,QAAO;AAE7B,gBAAM,aAAa,YAAY;AAAA,YAC7B,CAAC,WAAW,OAAO,eAAe,gBAAgB;AAAA,UACpD;AAGA,gBAAM,mBAAmB,CAAC,OACxB,CAAC,CAAC,OACA,GAAG,aAAa,QAAQ,GAAG,aAAa,MACvC,GAAG,WAAW,QAAQ,GAAG,WAAW;AAEzC,cAAI,CAAC,iBAAiB,UAAU,GAAG;AACjC,mBAAO;AAAA,UACT;AAEA,iBAAO;AAAA,QACT;AAAA,QAEA,qBAAqB,MAAM;AACzB,gBAAM,EAAE,oBAAoB,YAAY,IAAI,IAAI;AAChD,gBAAM,kBAAkB,mBAAmB;AAE3C,cAAI,CAAC,gBAAiB,QAAO;AAE7B,gBAAM,aAAa,YAAY;AAAA,YAC7B,CAAC,WAAW,OAAO,eAAe,gBAAgB;AAAA,UACpD;AAEA,iBAAO;AAAA,QACT;AAAA,QAEA,cAAc,MAAM;AAClB,gBAAM,EAAE,cAAc,IAAI,IAAI;AAC9B,gBAAM,aAAa,cAAc;AAEjC,iBAAO,YAAY,MAAM,SAAS;AAAA,QACpC;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,eAAe,YAAY,IAAI,IAAI;AAC3C,gBAAM,aAAa,cAAc;AACjC,cAAI,CAAC,WAAY,QAAO,CAAC;AAEzB,gBAAM,sBAAgC,CAAC;AAEvC,qBAAW,KAAK,UAAU,QAAQ,CAAC,UAAU,UAAU;AACrD,kBAAM,aAAa,YAAY;AAAA,cAC7B,CAAC,WAAW,OAAO,eAAe,SAAS;AAAA,YAC7C;AACA,kBAAM,YACJ,eACC,WAAW,aAAa,QAAQ,WAAW,WAAW;AACzD,kBAAM,YACJ,cACA,WAAW,aAAa,QACxB,WAAW,WAAW;AAGxB,gBAAI,CAAC,aAAa,WAAW;AAC3B,kCAAoB,KAAK,QAAQ,CAAC;AAAA,YACpC;AAAA,UACF,CAAC;AAED,iBAAO;AAAA,QACT;AAAA,QAEA,8BAA8B,MAAM;AAClC,gBAAM,EAAE,mBAAmB,eAAe,QAAQ,IAAI,IAAI;AAC1D,gBAAM,YACJ,WAAW,WACP,kBAAkB,GAAG,UACrB,cAAc,GAAG,KAAK;AAC5B,cAAI,CAAC,UAAW,QAAO,CAAC;AACxB,gBAAM,mBAEF,CAAC;AACL,oBAAU,QAAQ,CAAC,aAAa;AAC9B,kBAAM,YACJ,SAAS,kBAAkB,CAAC,GAAG,SAAS,MAAM;AAEhD,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;AAAA,QAGA,2BAA2B,CAAC,eAAe;AACzC,gBAAM,EAAE,YAAY,IAAI,IAAI;AAC5B,iBACE,YAAY,KAAK,CAAC,WAAW,OAAO,eAAe,UAAU,KAC7D;AAAA,QAEJ;AAAA,QACA,iCAAiC,CAAC,eAAe;AAC/C,gBAAM,EAAE,YAAY,IAAI,IAAI;AAC5B,gBAAM,SAAS,YAAY;AAAA,YACzB,CAACC,YAAWA,QAAO,eAAe;AAAA,UACpC;AACA,iBAAO,SACH,OAAO,aAAa,QAAQ,OAAO,WAAW,OAC9C;AAAA,QACN;AAAA,QACA,kCAAkC,CAAC,eAAe;AAChD,gBAAM,EAAE,YAAY,IAAI,IAAI;AAC5B,gBAAM,SAAS,YAAY;AAAA,YACzB,CAACA,YAAWA,QAAO,eAAe;AAAA,UACpC;AACA,cAAI,CAAC,OAAQ,QAAO;AACpB,cAAI,OAAO,aAAa,KAAM,QAAO;AACrC,iBAAO;AAAA,QACT;AAAA,QACA,2BAA2B,MAAM;AAC/B,gBAAM,EAAE,YAAY,IAAI,IAAI;AAC5B,iBAAO;AAAA,QACT;AAAA,QACA,oBAAoB,CAAC,aAAa;AAChC,gBAAM,EAAE,eAAe,SAAS,gBAAgB,IAAI,IAAI;AACxD,gBAAM,aAAa,cAAc;AACjC,cAAI,CAAC,WAAY;AACjB,cAAI,gBAAgB;AACpB,cAAI,WAAW,UAAU;AACvB,gBAAI,CAAC,gBAAiB;AACtB,kBAAM,iBACJ,gBAAgB,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,SAAS,EAAE,KACxD,gBAAgB,QAAQ,KAAK,CAAC,MAAM,EAAE,eAAe,SAAS,EAAE;AAClE,gBAAI,CAAC,eAAgB;AACrB,4BAAgB,WAAW,KAAK,UAAU;AAAA,cACxC,CAAC,MAAM,EAAE,OAAO,eAAe;AAAA,YACjC;AAAA,UACF,OAAO;AACL,4BAAgB,WAAW,KAAK,UAAU;AAAA,cACxC,CAAC,MAAM,EAAE,OAAO,SAAS;AAAA,YAC3B;AAAA,UACF;AAGA,cAAI,kBAAkB,IAAI;AACxB,oBAAQ;AAAA,cACN,qBAAqB,SAAS,EAAE;AAAA,YAClC;AACA;AAAA,UACF;AAEA,cAAI,EAAE,sBAAsB,cAAc,CAAC;AAAA,QAC7C;AAAA,QAEA,iBAAiB,CAAC,YAAY,WAAW;AACvC,gBAAM,EAAE,YAAY,IAAI,IAAI;AAC5B,gBAAM,sBAAsB,YAAY;AAAA,YACtC,CAAC,WAAW,OAAO,eAAe;AAAA,UACpC;AAEA,cAAI,wBAAwB,IAAI;AAC9B,kBAAM,qBAAqB,CAAC,GAAG,WAAW;AAC1C,+BAAmB,mBAAmB,IAAI;AAAA,cACxC,GAAG,mBAAmB,mBAAmB;AAAA,cACzC,cAAc;AAAA,YAChB;AACA,gBAAI,EAAE,aAAa,mBAAmB,CAAC;AAAA,UACzC;AAAA,QACF;AAAA,QAEA,iBAAiB,CAAC,eAAe;AAC/B,gBAAM,EAAE,YAAY,IAAI,IAAI;AAC5B,gBAAM,aAAa,YAAY;AAAA,YAC7B,CAAC,WAAW,OAAO,eAAe;AAAA,UACpC;AACA,iBAAO,aAAa,WAAW,eAAe;AAAA,QAChD;AAAA,QACA,kBAAkB,CAAC,eAAe;AAChC,gBAAM,EAAE,gBAAgB,IAAI,IAAI;AAChC,cAAI,CAAC,gBAAiB,QAAO;AAE7B,cAAI,MAAM,gBAAgB,QAAQ;AAAA,YAChC,CAAC,MAAM,EAAE,eAAe;AAAA,UAC1B;AACA,cAAI,QAAQ,IAAI;AACd,kBAAM,gBAAgB,QAAQ,UAAU,CAAC,MAAM,EAAE,OAAO,UAAU;AAAA,UACpE;AACA,iBAAO,QAAQ,KAAK,MAAM,IAAI;AAAA,QAChC;AAAA;AAAA,QAGA,+BAA+B,CAAC,eAAe;AAC7C,gBAAM,EAAE,gBAAgB,IAAI,IAAI;AAChC,gBAAM,WAAW,iBAAiB,QAAQ;AAAA,YACxC,CAAC,WAAW,OAAO,eAAe;AAAA,UACpC;AAEA,iBAAO,YAAY;AAAA,QACrB;AAAA,QACA,6BAA6B,MAAM;AACjC,gBAAM,EAAE,gBAAgB,IAAI,IAAI;AAChC,iBAAO,iBAAiB,cAAc;AAAA,QACxC;AAAA,QACA,mBAAmB,MAAM;AACvB,gBAAM,EAAE,gBAAgB,IAAI,IAAI;AAChC,iBAAO;AAAA,QACT;AAAA,QACA,oBAAoB,CAAC,oBAAoB;AACvC,cAAI,EAAE,gBAAgB,CAAC;AAAA,QACzB;AAAA,QACA,0BAA0B,CAAC,0BAA0B;AACnD,cAAI,EAAE,sBAAsB,CAAC;AAAA,QAC/B;AAAA,QACA,0BAA0B,MAAM;AAC9B,gBAAM,EAAE,sBAAsB,IAAI,IAAI;AACtC,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,IACR;AAAA,EACF;AACF;;;AC17BA,IAAAC,gBAMO;AAuHD,IAAAC,sBAAA;AAhHN,IAAMC,gBAAe;AAAA,EACnB,eAAe;AAAA,EACf,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,eAAe;AACjB;AAiCA,IAAM,kBAAc;AAAA,EAClB,CACE;AAAA,IACE;AAAA,IACA,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,IACpB;AAAA,IACA;AAAA,IACA,uBAAuB;AAAA,IACvB,gBAAgB;AAAA,IAChB,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP,GAAG;AAAA,EACL,GACA,QACG;AAEH,iCAAU,MAAM;AACd,UAAI,CAAC,UAAU,CAAC,cAAe;AAE/B,YAAM,eAAe,CAAC,UAAoC;AACxD,YAAI,MAAM,QAAQ,UAAU;AAC1B,uBAAa,KAAK;AAAA,QACpB;AAAA,MACF;AAEA,eAAS,iBAAiB,WAAW,YAAY;AACjD,aAAO,MAAM,SAAS,oBAAoB,WAAW,YAAY;AAAA,IACnE,GAAG,CAAC,QAAQ,aAAa,CAAC;AAG1B,iCAAU,MAAM;AACd,UAAI,QAAQ;AACV,iBAAS,KAAK,MAAM,WAAW;AAAA,MACjC,OAAO;AACL,iBAAS,KAAK,MAAM,WAAW;AAAA,MACjC;AAEA,aAAO,MAAM;AACX,iBAAS,KAAK,MAAM,WAAW;AAAA,MACjC;AAAA,IACF,GAAG,CAAC,MAAM,CAAC;AAEX,UAAM,sBAAsB,CAAC,UAAsC;AACjE,UAAI,MAAM,WAAW,MAAM,iBAAiB,sBAAsB;AAChE,qBAAa,KAAK;AAAA,MACpB;AAAA,IACF;AAEA,UAAM,wBAAwB,CAAC,UAAyC;AACtE,UAAI,MAAM,QAAQ,YAAY,eAAe;AAC3C,qBAAa,KAAK;AAAA,MACpB;AAAA,IACF;AAEA,UAAM,eAAe,MAAM;AACzB,mBAAa,KAAK;AAClB,iBAAW,WAAW;AAAA,IACxB;AAEA,UAAM,eAAe,MAAM;AACzB,mBAAa,KAAK;AAClB,iBAAW,WAAW;AAAA,IACxB;AAEA,UAAM,cAAcA,cAAa,IAAI;AAErC,WACE,6EAEG,oBACC;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,SAAS;AAAA,QACT,WAAW;AAAA,QACX,eAAY;AAAA,QAGZ;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA,WAAW;AAAA,cACT;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACC,GAAG;AAAA,YAEJ;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,IAAG;AAAA,kBACH,WAAU;AAAA,kBAET;AAAA;AAAA,cACH;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACC,IAAG;AAAA,kBACH,WAAU;AAAA,kBAET;AAAA;AAAA,cACH;AAAA,cAEA,8CAAC,SAAI,WAAU,qDACb;AAAA,6DAAC,kBAAO,SAAQ,WAAU,MAAK,SAAQ,SAAS,cAC7C,6BACH;AAAA,gBAEA;AAAA,kBAAC;AAAA;AAAA,oBACC,SAAQ;AAAA,oBACR,MAAK;AAAA,oBACL,QAAO;AAAA,oBACP,SAAS;AAAA,oBAER;AAAA;AAAA,gBACH;AAAA,iBACF;AAAA;AAAA;AAAA,QACF;AAAA;AAAA,IACF,GAEJ;AAAA,EAEJ;AACF;AAEA,YAAY,cAAc;;;ACnL1B,IAAAC,gBAAgE;AAChE,IAAAC,yBAAkB;AA2JV,IAAAC,sBAAA;AArJR,IAAMC,gBAAe;AAAA,EACnB,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AA+DA,IAAM,QAAQ,CAAC;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,uBAAuB;AAAA,EACvB,gBAAgB;AAAA,EAChB;AAAA,EACA,kBAAkB;AACpB,MAAkB;AAEhB,+BAAU,MAAM;AACd,QAAI,CAAC,UAAU,CAAC,cAAe;AAE/B,UAAM,eAAe,CAAC,UAAoC;AACxD,UAAI,MAAM,QAAQ,UAAU;AAC1B,gBAAQ;AAAA,MACV;AAAA,IACF;AAEA,aAAS,iBAAiB,WAAW,YAAY;AACjD,WAAO,MAAM,SAAS,oBAAoB,WAAW,YAAY;AAAA,EACnE,GAAG,CAAC,QAAQ,eAAe,OAAO,CAAC;AAGnC,+BAAU,MAAM;AACd,UAAM,mBAAmB,SAAS,KAAK,MAAM;AAC7C,QAAI,QAAQ;AACV,eAAS,KAAK,MAAM,WAAW;AAAA,IACjC,OAAO;AACL,eAAS,KAAK,MAAM,WAAW;AAAA,IACjC;AAEA,WAAO,MAAM;AACX,eAAS,KAAK,MAAM,WAAW;AAAA,IACjC;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAGX,QAAM,sBAAsB,CAAC,UAAsC;AACjE,QAAI,wBAAwB,MAAM,WAAW,MAAM,eAAe;AAChE,cAAQ;AAAA,IACV;AAAA,EACF;AAGA,QAAM,wBAAwB,CAAC,UAAyC;AACtE,QAAI,yBAAyB,MAAM,QAAQ,WAAW,MAAM,QAAQ,MAAM;AACxE,cAAQ;AAAA,IACV;AAAA,EACF;AAEA,MAAI,CAAC,OAAQ,QAAO;AAEpB,QAAM,cAAcA,cAAa,IAAI;AACrC,QAAM,cACJ;AAEF,QAAM,qBACJ;AACF,QAAM,eAAe;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,SAAS;AAAA,MACT,WAAW;AAAA,MACX,MAAK;AAAA,MACL,UAAU,uBAAuB,IAAI;AAAA,MACrC,cAAW;AAAA,MAEX,wDAAC,YAAO,WAAW,cAAc,mBAAgB,eAAc,MAAI,MAEjE;AAAA,sDAAC,SAAI,WAAU,+CACb;AAAA,uDAAC,QAAG,IAAG,eAAc,WAAU,uCAC5B,iBACH;AAAA,UACC,CAAC,mBACA;AAAA,YAAC;AAAA;AAAA,cACC,SAAS;AAAA,cACT,WAAU;AAAA,cACV,cAAW;AAAA,cAEX,uDAAC,4BAAE,MAAM,IAAI;AAAA;AAAA,UACf;AAAA,WAEJ;AAAA,QAGA,6CAAC,SAAI,WAAU,aACb,uDAAC,SAAI,WAAU,+CACZ,UACH,GACF;AAAA,QAGC,UACC,6CAAC,SAAI,WAAU,oCAAoC,kBAAO;AAAA,SAE9D;AAAA;AAAA,EACF;AAEJ;AAEA,IAAO,gBAAQ;;;AC3Lf,IAAAC,kBAA2C;AAC3C,IAAAC,gBAcO;AACP,IAAAC,yBAAgD;AAsFvC,IAAAC,sBAAA;AAnFT,IAAM,kBAAkB;AAAA,EACtB,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,SAAS;AACX;AAEA,IAAMC,gBAAe;AAAA,EACnB,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,eAAe;AACjB;AAEA,IAAM,iBAAiB;AAAA,EACrB,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,eAAe;AACjB;AAEA,IAAM,kBAAkB;AAAA,EACtB,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,eAAe;AACjB;AAEA,IAAM,eAAe;AAAA,EACnB,KAAK;AAAA,EACL,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AACR;AACA,IAAM,gBAAgB;AAAA,EACpB,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,KAAK;AACP;AAcO,SAAS,kBACd,eACgB;AAChB,aAAO,wBAAoB,CAAC,SAAS;AAAA,IACnC,MAAM;AAAA,IACN,SAAS,CAAC,SAAS,IAAI,EAAE,KAAK,CAAC;AAAA,IAC/B,OAAO;AAAA,IACP,UAAU,CAAC,UAAU,IAAI,EAAE,MAAM,CAAC;AAAA,IAClC,eAAe;AAAA,IACf,kBAAkB,CAAC,UAAU,IAAI,EAAE,eAAe,MAAM,CAAC;AAAA,IACzD;AAAA,EACF,EAAE;AACJ;AAEO,IAAM,iBAAiB,CAAC,kBAAmC;AAChE,MAAI,CAAC,eAAe;AAClB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,eAAe,UAAgC;AAC7D,MAAI,OAAO,aAAa,YAAY,OAAO,aAAa,UAAU;AAChE,WAAO;AAAA,EACT;AACA,QAAM,YAAY,uBAAS,QAAQ,QAAQ;AAE3C,MAAI,UAAU,WAAW,EAAG,QAAO,UAAU,CAAC;AAE9C,SAAO,6EAAG,qBAAU;AACtB;AAeA,IAAMC,eAAc,CAClB,UACA,OACA,MACA,aACc;AACd,SAAO,uBAAS,IAAI,UAAU,CAAC,UAAU;AACvC,YAAI,8BAAe,KAAK,GAAG;AACzB,YAAM,aAAa;AAOnB,YAAM,WAKD;AAAA,QACH;AAAA,MACF;AAGA,UAAI,WAAW,SAAS,eAAe;AACrC,iBAAS,OAAO;AAChB,iBAAS,WAAW;AAAA,MACtB;AAEA,UAAI,WAAW,MAAM,UAAU;AAC7B,iBAAS,WAAWA;AAAA,UAClB,WAAW,MAAM;AAAA,UACjB;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAEA,iBAAO,4BAAa,YAAY,QAAQ;AAAA,IAC1C;AACA,WAAO;AAAA,EACT,CAAC;AACH;AAEA,IAAM,SAAS,CAAC;AAAA,EACd;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAmB;AACjB,QAAM,eAAW,sBAA8B,IAAI;AACnD,WAAS,YAAY,kBAAkB,aAAa;AACpD,QAAM,QAAQ,SAAS;AAEvB,QAAM,gBAAY,sBAAuB,IAAI;AAC7C,QAAM,EAAE,MAAM,SAAS,UAAU,cAAc,QAAI,0BAAS,OAAO,CAAC,MAAM,CAAC;AAG3E,QAAM,kBAAc,qBAAM;AAC1B,QAAM,WAAW,MAAM,UAAU,WAAW;AAE5C,QAAM,oBAAoB,CACxBC,WACA,gBACkB;AAClB,QAAI,QAAuB;AAC3B,UAAM,SAAS,CAAC,UAAqB;AACnC,6BAAS,QAAQ,OAAO,CAAC,UAAU;AACjC,YAAI,KAAC,8BAAe,KAAK,EAAG;AAC5B,cAAM,aAAa;AAInB,YACE,WAAW,SAAS,cACpB,WAAW,MAAM,UAAU,aAC3B;AACA,cAAI,OAAO,WAAW,MAAM,aAAa;AACvC,oBAAQ,WAAW,MAAM;AAAA,QAC7B;AACA,YAAI,WAAW,MAAM,YAAY,CAAC;AAChC,iBAAO,WAAW,MAAM,QAAQ;AAAA,MACpC,CAAC;AAAA,IACH;AACA,WAAOA,SAAQ;AACf,WAAO;AAAA,EACT;AAEA,+BAAU,MAAM;AACd,QAAI,CAAC,iBAAiB,cAAc;AAClC,YAAMC,SAAQ,kBAAkB,UAAU,YAAY;AACtD,UAAIA,OAAO,OAAM,SAAS,EAAE,eAAeA,OAAM,CAAC;AAAA,IACpD;AAAA,EACF,GAAG,CAAC,UAAU,cAAc,aAAa,CAAC;AAE1C,+BAAU,MAAM;AACd,UAAM,qBAAqB,CAAC,UAAiC;AAC3D,UACE,UAAU,WACV,CAAC,UAAU,QAAQ,SAAS,MAAM,MAAc,GAChD;AACA,gBAAQ,KAAK;AAAA,MACf;AAAA,IACF;AAEA,UAAM,kBAAkB,CAAC,UAAoC;AAC3D,YAAM,gBAAgB,UAAU,SAAS,cAAc,eAAe;AACtE,UAAI,eAAe;AACjB,cAAM,eAAe;AACrB,cAAM,QAAQ,MAAM;AAAA,UAClB,cAAc;AAAA,YACZ;AAAA,UACF;AAAA,QACF,EAAE,OAAO,CAAC,OAA0B,cAAc,WAAW;AAE7D,cAAM,UAAU,SAAS;AACzB,cAAM,eAAe,MAAM,UAAU,CAAC,SAAS,SAAS,OAAO;AAE/D,YAAI,YAAY;AAChB,YAAI,MAAM,QAAQ,aAAa;AAC7B,sBACE,iBAAiB,KAAK,KAAK,eAAe,KAAK,MAAM;AAAA,QACzD,OAAO;AACL,sBACE,iBAAiB,KACb,MAAM,SAAS,KACd,eAAe,IAAI,MAAM,UAAU,MAAM;AAAA,QAClD;AACA,cAAM,SAAS,GAAG,MAAM;AAAA,MAC1B;AAAA,IACF;AAEA,QAAI,MAAM;AACR,eAAS,iBAAiB,aAAa,kBAAkB;AACzD,eAAS,iBAAiB,WAAW,eAAe;AAAA,IACtD;AACA,WAAO,MAAM;AACX,eAAS,oBAAoB,aAAa,kBAAkB;AAC5D,eAAS,oBAAoB,WAAW,eAAe;AAAA,IACzD;AAAA,EACF,GAAG,CAAC,IAAI,CAAC;AAET,+BAAU,MAAM;AACd,QAAI,WAAW;AACb,eAAS,SAAS;AAClB,YAAMA,SAAQ,kBAAkB,UAAU,SAAS;AACnD,UAAIA,OAAO,OAAM,SAAS,EAAE,eAAeA,OAAM,CAAC;AAAA,IACpD;AAAA,EACF,GAAG,CAAC,SAAS,CAAC;AAEd,QAAM,cAAcH,cAAa,IAAI;AAErC,SACE,8CAAC,SAAI,WAAW,GAAG,UAAU,SAAS,GAEnC;AAAA,aACC;AAAA,MAAC;AAAA;AAAA,QACC,SAAS;AAAA,QACT,WAAW,GAAG,wCAAwC,WAAW;AAAA,QAEhE;AAAA;AAAA,IACH;AAAA,IAIF,6CAAC,SAAI,WAAW,GAAG,iBAAiB,GAAG,KAAK,WACzC,UAAAC,aAAY,UAAU,OAAO,MAAM,QAAQ,GAC9C;AAAA,KAGE,cAAc,iBACd,8CAAC,SAAI,WAAU,kBACZ;AAAA,oBAAc,6CAAC,OAAE,WAAU,yBAAyB,sBAAW;AAAA,MAC/D,gBACC,8CAAC,OAAE,WAAU,wDACX;AAAA,qDAAC,wCAAc,MAAM,IAAI;AAAA,QAAE;AAAA,QAAE;AAAA,SAC/B;AAAA,OAEJ;AAAA,KAEJ;AAEJ;AAEA,IAAM,cAAc,CAAC;AAAA,EACnB;AAAA,EACA,OAAO;AACT,MAGM;AACJ,QAAM,QAAQ,eAAe,aAAa;AAE1C,QAAM,oBAAgB,0BAAS,OAAO,CAAC,MAAM,EAAE,aAAa;AAC5D,QAAM,YAAQ,0BAAS,OAAO,CAAC,MAAM,EAAE,KAAK;AAC5C,SACE,6CAAC,UAAK,WAAU,gBACb,2BAAiB,eAAe,OACnC;AAEJ;AAWA,IAAM,oBAAgB;AAAA,EACpB,CACE;AAAA,IACE;AAAA,IACA,UAAU;AAAA,IACV,UAAU;AAAA,IACV,OAAO;AAAA,IACP;AAAA,IACA,OAAO;AAAA,IACP;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACG;AACH,UAAM,QAAQ,eAAe,aAAa;AAC1C,UAAM,WAAO,0BAAS,OAAO,CAAC,MAAM,EAAE,IAAI;AAC1C,UAAM,aAAa,MAAM,MAAM,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC;AAEvD,UAAM,iBAAiB,gBAAgB,OAAO;AAC9C,UAAM,gBAAgB,eAAe,IAAI;AACzC,UAAM,iBAAiB,gBAAgB,IAAI;AAE3C,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,IAAI;AAAA,QACJ,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA,WACE,GAAG,WAAW,eAAe,eAAe,UAAU;AAAA,UACxD,WACI,oEACA;AAAA,UACJ,CAAC,WAAW,CAAC,WAAW,kBAAkB;AAAA,UAC1C;AAAA,UACA;AAAA,QACF;AAAA,QACA,SAAS;AAAA,QACT,iBAAe;AAAA,QACf,iBAAc;AAAA,QACd,iBAAe,OAAO,mBAAmB;AAAA,QACxC,GAAG;AAAA,QAEH;AAAA,gBAAM;AAAA,UACP;AAAA,YAAC;AAAA;AAAA,cACC,WAAW;AAAA,gBACT;AAAA,gBACA,OAAO,eAAe;AAAA,cACxB;AAAA;AAAA,UACF;AAAA;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AACA,cAAc,cAAc;AAS5B,IAAM,oBAAgB;AAAA,EACpB,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,OAAO;AAAA,IACP,GAAG;AAAA,EACL,GACA,QACG;AACH,UAAM,QAAQ,eAAe,aAAa;AAE1C,UAAM,WAAO,0BAAS,OAAO,CAAC,MAAM,EAAE,IAAI;AAC1C,QAAI,CAAC,KAAM,QAAO;AAElB,UAAM,qBAAqB,MACzB,8BAA8B,aAAa,IAAI,CAAC,IAAI,cAAc,KAAK,CAAC;AAE1E,WACE;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA,mBAAmB;AAAA,UACnB;AAAA,QACF;AAAA,QACC,GAAG;AAAA,QAEH;AAAA;AAAA,IACH;AAAA,EAEJ;AACF;AACA,cAAc,cAAc;AAQ5B,IAAM,iBAAa;AAAA,EACjB,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX,OAAO;AAAA,IACP,GAAG;AAAA,EACL,GACA,QACG;AACH,UAAM,QAAQ,eAAe,aAAa;AAC1C,UAAM;AAAA,MACJ,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,QAAI,0BAAS,OAAO,CAAC,MAAM,CAAC;AAE5B,UAAM,cAAc,CAClB,MACG;AACH,YAAM,YAAY,eAAe,QAAQ;AACzC,UAAI,CAAC,UAAU;AACb,cAAM,WAAW,kBAAkB,QAAQ,KAAK;AAChD,cAAM,WAAW,kBAAkB,QAAQ,KAAK;AAChD,iBAAS,QAAQ;AACjB,yBAAiB,QAAQ;AACzB,gBAAQ,KAAK;AACb,wBAAgB,QAAQ;AAAA,MAC1B;AACA,YAAM,UAAU,CAA+B;AAAA,IACjD;AAEA,WACE;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,iBAAe;AAAA,QACf;AAAA,QACA,WAAW;AAAA;AAAA;AAAA,YAGP,SAAS;AAAA,YAET,WACI,oEACA,+IACN;AAAA,YACE,kBAAkB,SAAS,kBAAkB;AAAA;AAAA,QAEjD,SAAS;AAAA,QACT,WAAW,CAAC,MAAM;AAChB,cAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,IAAK,aAAY,CAAC;AAAA,QACvD;AAAA,QACA,UAAU,WAAW,KAAK;AAAA,QACzB,GAAG;AAAA,QAEJ;AAAA,uDAAC,UAAK,WAAU,iEACb,4BAAkB,SAAS,6CAAC,gCAAM,WAAU,IAAG,GAClD;AAAA,UACC;AAAA;AAAA;AAAA,IACH;AAAA,EAEJ;AACF;AAEA,WAAW,cAAc;AAEzB,IAAO,iBAAQ;;;ACngBf,IAAAG,gBAWO;;;ACuUC,IAAAC,uBAAA;AA5TR,IAAMC,gBAAe;AAAA,EACnB,OAAO;AAAA,IACL,WAAW;AAAA;AAAA,IACX,KAAK;AAAA;AAAA,IACL,SAAS;AAAA;AAAA,IACT,QAAQ;AAAA;AAAA,IACR,cAAc;AAAA;AAAA,EAChB;AAAA,EACA,QAAQ;AAAA,IACN,WAAW;AAAA;AAAA,IACX,KAAK;AAAA;AAAA,IACL,SAAS;AAAA;AAAA,IACT,QAAQ;AAAA;AAAA,IACR,cAAc;AAAA;AAAA,EAChB;AACF;AAKA,IAAMC,mBAAkB;AAAA,EACtB,MAAM;AAAA,IACJ,YAAY;AAAA;AAAA,IACZ,MAAM;AAAA;AAAA,EACR;AAAA,EACA,OAAO;AAAA,IACL,YAAY;AAAA;AAAA,IACZ,MAAM;AAAA;AAAA,EACR;AACF;AAgHA,IAAM,0BAA0B,CAAC,OAAe,QAAgB;AAC9D,QAAM,YAAY,MAAM,KAAK,IAAI,IAAI;AACrC,QAAM,eAAe,KAAK,IAAI,GAAG,KAAK,IAAI,WAAW,GAAG,CAAC;AACzD,QAAM,aAAa,QAAQ,IAAI,IAAK,eAAe,MAAO;AAE1D,SAAO,EAAE,cAAc,WAAW;AACpC;AAKA,IAAM,mBAAmB,CACvB,OACA,gBACA,iBACY;AACZ,SAAO,CAAC,EAAE,SAAS,kBAAkB;AACvC;AAkBA,IAAM,qBAAqB,CACzB,cACA,gBACA,OACA,cACA,KACA,eACG;AACH,MAAI,cAAc;AAChB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS,GAAG,KAAK,MAAM,YAAY,CAAC,OAAO,GAAG;AAAA,MAC9C,YAAY;AAAA,IACd;AAAA,EACF;AAEA,MAAI,gBAAgB;AAClB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS,GAAG,KAAK,MAAM,UAAU,CAAC;AAAA,MAClC,YAAY;AAAA,IACd;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,YAAY;AAAA,EACd;AACF;AA0BA,IAAM,yBAAyB,CAAC;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAiC;AAE/B,QAAM,kBAAkB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SAAO;AAAA,IACL,OAAO,gBAAgB,aAAa,qBAAqB;AAAA,IACzD,WAAW,gBAAgB,aACvB,sBACA;AAAA,IACJ,SAAS,gBAAgB;AAAA,EAC3B;AACF;AAWA,IAAM,gCAAgC,CACpC,MACA,OACA,oBACI;AAAA,EACJ,YAAY,SAAS,WAAW,CAAC,EAAE,SAAS;AAAA,EAC5C,gBAAgB,SAAS,YAAY;AAAA,EACrC,WAAW,SAAS,YAAY,CAAC,CAAC,SAAS,CAAC;AAAA;AAC9C;AAWA,IAAM,+BAA+B,CACnC,cACA,gBACA,cACA,KACA,YACA,wBACc;AACd,MAAI,CAAC,gBAAgB,CAAC,eAAgB,QAAO;AAG7C,QAAM,kBAAkB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MAEC,0BAAgB,SAAS,aACxB,gFACE;AAAA,sDAAC,UAAK,WAAU,oBAAoB,eAAK,MAAM,YAAY,GAAE;AAAA,QAC7D,+CAAC,UAAK,WAAU,iBAAgB;AAAA;AAAA,UAAK;AAAA,WAAI;AAAA,SAC3C,IAEA,+CAAC,gBAAK,MAAK,MAAK,QAAO,UAAS,WAAU,oBACvC;AAAA,aAAK,MAAM,UAAU;AAAA,QAAE;AAAA,SAC1B;AAAA;AAAA,EAEJ;AAEJ;AAKA,IAAM,kBAAkB,CAAC;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MASE;AAAA,EAAC;AAAA;AAAA,IACC,WAAW;AAAA,MACT;AAAA,MACA,eAAe;AAAA,MACf;AAAA,IACF;AAAA,IAEA;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,UACP;AAAA,UACA,cACE,OAAO,UAAU,WACb,GAAG,KAAK,KAAK,KAAK,MAAM,UAAU,CAAC,eACnC,aAAa,KAAK,MAAM,UAAU,CAAC,QAAQ,GAAG;AAAA,UAEpD,WAAU;AAAA;AAAA,MACZ;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,WAAW;AAAA,YACT;AAAA,YACA,eAAe;AAAA,YACf;AAAA,UACF;AAAA,UACA,OAAO,EAAE,OAAO,GAAG,UAAU,IAAI;AAAA;AAAA,MACnC;AAAA;AAAA;AACF;AAMF,IAAM,gBAAgB,CAAC;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MACE;AAAA,EAAC;AAAA;AAAA,IACC,WAAW;AAAA,MACT;AAAA,MACA,WAAW;AAAA,MACX,WAAW;AAAA,MACX;AAAA,IACF;AAAA,IAEC;AAAA,uBAAiB,OAAO,gBAAgB,YAAY,KACnD,+CAAC,SAAI,WAAU,8DACZ;AAAA,iBACC;AAAA,UAAC;AAAA;AAAA,YACC,IAAG;AAAA,YACH,MAAK;AAAA,YACL,QAAO;AAAA,YACP,WAAW,GAAG,gCAAgC,cAAc;AAAA,YAE3D;AAAA;AAAA,QACH;AAAA,QAGD;AAAA,UACC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,SACF;AAAA,MAGF;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,oBAAmB;AAAA,UACnB,eAAc;AAAA;AAAA,MAChB;AAAA;AAAA;AACF;AAMF,IAAM,gBAAgB,CAAC;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAA0B;AACxB,QAAM;AAAA,IACJ;AAAA,IACA,WAAW;AAAA,IACX;AAAA,EACF,IAAI,uBAAuB;AAAA,IACzB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,WAAW;AAAA,QACX,WAAW;AAAA,QACX;AAAA,MACF;AAAA,MAEC;AAAA,yBAAiB,OAAO,gBAAgB,YAAY,KACnD;AAAA,UAAC;AAAA;AAAA,YACC,IAAG;AAAA,YACH,MAAK;AAAA,YACL,QAAO;AAAA,YACP;AAAA,YACA,WAAW,GAAG,oBAAoB,gBAAgB;AAAA,YAEjD;AAAA;AAAA,QACH;AAAA,QAGF;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,oBAAmB;AAAA,YACnB,eAAc;AAAA;AAAA,QAChB;AAAA;AAAA;AAAA,EACF;AAEJ;AAKA,IAAM,gBAAgB,CAAC;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAA0B;AACxB,QAAM,WAAW,SAAS,WAAW,UAAU,YAAY;AAC3D,QAAM,mBAAmB,SAAS,WAAW,cAAc;AAC3D,QAAM,gBAAgB;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SACE,+CAAC,SAAI,WAAW,GAAG,QAAQ,YAAY,QAAQ,UAAU,SAAS,GAC/D;AAAA,kBAAc,cACb,+CAAC,SAAI,WAAU,qDACZ;AAAA,eACC;AAAA,QAAC;AAAA;AAAA,UACC,IAAG;AAAA,UACH,MAAK;AAAA,UACL,QAAO;AAAA,UACP,WAAW;AAAA,YACT;AAAA,YACA;AAAA,UACF;AAAA,UAEC;AAAA;AAAA,MACH;AAAA,MAGD,kBACC;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,QAAO;AAAA,UACP,WAAW;AAAA,YACT;AAAA,YACA;AAAA,UACF;AAAA,UAEC;AAAA,iBAAK,MAAM,UAAU;AAAA,YAAE;AAAA;AAAA;AAAA,MAC1B;AAAA,OAEJ;AAAA,IAGF;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,oBAAoB;AAAA,UAClB;AAAA,UACA,YAAY;AAAA,UACZ,YAAY;AAAA,QACd;AAAA,QACA,eAAe;AAAA,UACb,YAAY;AAAA,UACZ,YAAY;AAAA,UACZ;AAAA,QACF;AAAA;AAAA,IACF;AAAA,IAEC,cAAc,kBACb;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,QAAO;AAAA,QACP,WAAW;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,QAEC;AAAA,eAAK,MAAM,UAAU;AAAA,UAAE;AAAA;AAAA;AAAA,IAC1B;AAAA,IAGD,cAAc,aACb;AAAA,MAAC;AAAA;AAAA,QACC,IAAG;AAAA,QACH,MAAK;AAAA,QACL,QAAO;AAAA,QACP,WAAW;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,QAEC;AAAA;AAAA,IACH;AAAA,KAEJ;AAEJ;AAsCA,IAAM,cAAc,CAAC;AAAA,EACnB;AAAA,EACA,MAAM;AAAA,EACN,OAAO;AAAA,EACP,UAAU;AAAA,EACV,SAAS;AAAA,EACT;AAAA,EACA,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,sBAAsB;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAwB;AACtB,QAAM,EAAE,cAAc,WAAW,IAAI,wBAAwB,OAAO,GAAG;AACvE,QAAM,cAAcD,cAAa,IAAI;AACrC,QAAM,iBAAiBC,iBAAgB,OAAO;AAE9C,MAAI,WAAW,WAAW;AACxB,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,YAAY;AAAA,UACV,OAAO,gBAAgB;AAAA,UACvB,QAAQ,iBAAiB;AAAA,QAC3B;AAAA;AAAA,IACF;AAAA,EAEJ;AAEA,MAAI,WAAW,WAAW;AACxB,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,YAAY;AAAA,UACV,OAAO,gBAAgB;AAAA,UACvB,QAAQ,iBAAiB;AAAA,QAC3B;AAAA;AAAA,IACF;AAAA,EAEJ;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,EACF;AAEJ;AAEA,IAAO,sBAAQ;;;AD1tBf,IAAAC,yBAWO;AA4ED,IAAAC,uBAAA;AA9DN,IAAM,oBAAoB;AAAA,EACxB,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AACX;AAEA,IAAM,uBAAuB;AAAA,EAC3B,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AACT;AAEA,IAAM,0BAA0B;AAAA,EAC9B,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AACT;AAEA,IAAM,sBAAsB;AAAA,EAC1B,YAAY;AAAA,EACZ,UAAU;AACZ;AAEA,IAAM,sBAAsB;AAAA,EAC1B,SAAS;AAAA,EACT,SAAS;AACX;AAEA,IAAM,eAAW;AAAA,EACf,CACE;AAAA,IACE;AAAA,IACA,UAAU;AAAA,IACV,SAAS;AAAA,IACT,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,GAAG;AAAA,EACL,GACA,QACG;AACH,UAAM,cAAc,kBAAkB,OAAO;AAC7C,UAAM,iBAAiB,qBAAqB,OAAO;AACnD,UAAM,mBAAmB,wBAAwB,SAAS;AAC1D,UAAM,gBAAgB,oBAAoB,MAAM;AAChD,UAAM,gBAAgB,oBAAoB,MAAM;AAEhD,UAAM,kBAAkB;AAAA,MACtB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,WACE,8CAAC,SAAI,KAAU,WAAW,iBAAkB,GAAG,OAC5C,UACH;AAAA,EAEJ;AACF;AAYA,IAAM,sBAAsB;AAAA,EAC1B,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAO;AAAA,EACP,MAAM;AACR;AAEA,IAAM,sBAAsB;AAAA,EAC1B,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAO;AAAA,EACP,MAAM;AACR;AAEA,IAAM,0BAA0B;AAAA,EAC9B,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAO;AAAA,EACP,MAAM;AACR;AAEA,IAAM,wBAAwB;AAAA,EAC5B,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAO;AAAA,EACP,MAAM;AACR;AAEA,IAAM,4BAAwB;AAAA,EAI5B,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACG;AACH,UAAM,oBAAoB,oBAAoB,MAAM;AACpD,UAAM,oBAAoB,oBAAoB,MAAM;AACpD,UAAM,wBAAwB,wBAAwB,MAAM;AAC5D,UAAM,sBAAsB,sBAAsB,MAAM;AAExD,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,QACC,GAAG;AAAA,QAEJ;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,WAAW;AAAA,gBACT;AAAA,gBACA;AAAA,gBACA,WAAW,iBAAiB;AAAA,cAC9B;AAAA,cAEA;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAW;AAAA,sBACT;AAAA,sBACA;AAAA,oBACF;AAAA,oBAEC;AAAA;AAAA,gBACH;AAAA,gBAEA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,QAAO;AAAA,oBACP,WAAU;AAAA,oBAET;AAAA;AAAA,gBACH;AAAA,gBAEA;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAW,GAAG,8BAA8B,qBAAqB;AAAA,oBAEhE;AAAA;AAAA,gBACH;AAAA;AAAA;AAAA,UACF;AAAA,UAEC,YACC,+CAAC,SAAI,WAAU,oDACb;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,WAAW;AAAA,kBACT;AAAA,kBACA;AAAA,gBACF;AAAA,gBAEC;AAAA;AAAA,YACH;AAAA,YACA,8CAAC,iBAAM,MAAK,SAAQ,QAAO,QACxB,uBACH;AAAA,aACF;AAAA;AAAA;AAAA,IAEJ;AAAA,EAEJ;AACF;AASA,IAAM,oBAAgB;AAAA,EACpB,CACE;AAAA,IACE;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACG;AACH,UAAM,SAAS,UAAU;AACzB,UAAM,aAAa,SAAS,cAAc;AAC1C,UAAM,cAAc,SAAS,mBAAgB;AAE7C,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,QAAO;AAAA,QACP,SAAQ;AAAA,QACR,WAAU;AAAA,QACV,WAAW,GAAG,yBAAyB,SAAS;AAAA,QAC/C,GAAG;AAAA,QAEJ;AAAA,yDAAC,aAAQ,WAAU,sCACjB;AAAA,0DAAC,OAAE,WAAU,4CAA4C,kBAAO;AAAA,YAEhE,+CAAC,SAAI,WAAU,oCACb;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,SAAQ;AAAA,kBACR,QAAQ,SAAS,YAAY;AAAA,kBAE5B;AAAA;AAAA,cACH;AAAA,cAEA,+CAAC,UAAK,WAAU,0DACb;AAAA,yBAAS,SAAS;AAAA,gBAClB,UACC,8CAAC,iBAAM,MAAK,UAAS,QAAO,WAAU,gBAEtC;AAAA,iBAEJ;AAAA,eACF;AAAA,aACF;AAAA,UAEA,8CAAC,UAAK,WAAU,iBACd;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS,MAAM,gBAAgB,WAAW;AAAA,cAC1C,WAAU;AAAA,cAET;AAAA;AAAA,UACH,GACF;AAAA;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AAeA,IAAM,mBAAe;AAAA,EACnB,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX,YAAY;AAAA,IACZ;AAAA,IACA,QAAQ;AAAA,IACR,kBAAkB;AAAA,IAClB,YAAY;AAAA,IACZ;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACG;AACH,UAAM,eAAe,cAAc;AACnC,UAAM,mBAAmB;AAAA,MACvB,YACE,gFACG;AAAA,qBACC,+CAAC,SAAI,WAAU,oCACZ;AAAA,yBACC,+CAAC,UAAK,WAAU,6CACd;AAAA,0DAAC,OAAE,WAAU,+BAA8B,uBAAM;AAAA,YACjD,8CAAC,OAAE,WAAU,iBAAiB,uBAAY;AAAA,aAC5C;AAAA,UAED,WACC,+CAAC,UAAK,WAAU,6CACd;AAAA,0DAAC,OAAE,WAAU,+BAA8B,iBAAG;AAAA,YAC9C,8CAAC,OAAE,WAAU,iBAAiB,mBAAQ;AAAA,aACxC;AAAA,WAEJ;AAAA,QAEF,+CAAC,UAAK,WAAU,gDACd;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,OAAO;AAAA,cACP,SAAS;AAAA,cACT,eAAY;AAAA;AAAA,UACd;AAAA,UAEA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,QAAO;AAAA,cACP,WAAW;AAAA,gBACT;AAAA,cACF;AAAA,cAEC;AAAA,qBAAK,MAAM,QAAQ;AAAA,gBAAE;AAAA;AAAA;AAAA,UACxB;AAAA,WACF;AAAA,SACF;AAAA,MAEF,UAAU,8CAAC,OAAE,WAAU,yBAAyB,mBAAQ;AAAA,IAC1D;AAEA,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,QAAQ,eAAe,eAAe;AAAA,QACtC,SAAQ;AAAA,QACR,WAAU;AAAA,QACV,QAAO;AAAA,QACP,WAAW,GAAG,eAAe,SAAS,IAAI,SAAS;AAAA,QAClD,GAAG;AAAA,QAEJ;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,WAAW;AAAA,gBACT;AAAA,gBACA,eACI,2CACA;AAAA,gBACJ,CAAC,MAAM,WAAW,GAAG,IAAI,MAAM,KAAK,KAAK;AAAA,cAC3C;AAAA,cACA,OAAO,MAAM,WAAW,GAAG,IAAI,EAAE,iBAAiB,MAAM,IAAI;AAAA,cAC5D,eAAY;AAAA,cAEX;AAAA;AAAA,UACH;AAAA,UAEA;AAAA,YAAC;AAAA;AAAA,cACC,WAAW;AAAA,gBACT;AAAA,gBACA,CAAC,gBAAgB;AAAA,cACnB;AAAA,cAEA;AAAA,8DAAC,gBAAK,MAAK,MAAK,QAAO,QAAO,WAAU,0BACrC,kBACH;AAAA,gBACC,iBAAiB,SAAS;AAAA;AAAA;AAAA,UAC7B;AAAA;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AAUA,IAAM,gBAAY;AAAA,EAChB,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,YAAY;AAAA,IACZ,GAAG;AAAA,EACL,GACA,QACG;AACH,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,QAAO;AAAA,QACP,SAAQ;AAAA,QACR,WAAU;AAAA,QACV,QAAO;AAAA,QACP,WAAW,GAAG,mCAAmC,SAAS;AAAA,QACzD,GAAG;AAAA,QAEH;AAAA,qBACC,8CAAC,UAAK,WAAU,8CACb,kBAAQ,IAAI,CAAC,MAAM,UAClB,+CAAC,0BACC;AAAA,0DAAC,OAAG,gBAAK;AAAA,YACR,QAAQ,QAAQ,SAAS,KAAK,8CAAC,OAAE,oBAAC;AAAA,eAFtB,GAAG,IAAI,MAAM,KAAK,EAGjC,CACD,GACH;AAAA,UAGF,8CAAC,OAAE,WAAU,4CAA4C,kBAAO;AAAA,UAEhE,+CAAC,UAAK,WAAU,gDACd;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,OAAO;AAAA,gBACP,SAAS;AAAA,gBACT,eAAY;AAAA;AAAA,YACd;AAAA,YACC,kBACC;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,QAAO;AAAA,gBACP,WAAW;AAAA,kBACT;AAAA,gBACF;AAAA,gBAEC;AAAA,uBAAK,MAAM,QAAQ;AAAA,kBAAE;AAAA;AAAA;AAAA,YACxB;AAAA,aAEJ;AAAA;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AAaA,IAAM,sBAAkB;AAAA,EACtB,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd,gBAAgB;AAAA,IAChB,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACG;AACH,UAAM,cAAc,aAAa;AAEjC,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,QAAO;AAAA,QACP,SAAQ;AAAA,QACR,WAAU;AAAA,QACV,WAAW;AAAA,UACT,iBAAiB,UAAU,mBAAmB;AAAA,UAC9C;AAAA,QACF;AAAA,QACA,SAAS,MAAM,iBAAiB,WAAW,gBAAgB,WAAW;AAAA,QACrE,GAAG;AAAA,QAEJ;AAAA,yDAAC,SAAI,WAAU,8CACb;AAAA,2DAAC,SAAI,WAAU,oDACb;AAAA,4DAAC,OAAE,WAAU,2DACV,kBACH;AAAA,cACC,kBAAkB,YACjB;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAQ;AAAA,kBACR,MAAK;AAAA,kBACL,SAAS,MAAM,gBAAgB,WAAW;AAAA,kBAC1C,WAAU;AAAA,kBACX;AAAA;AAAA,cAED;AAAA,eAEJ;AAAA,YAEA,8CAAC,SAAI,WAAU,UACZ,wBACC;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,gBACP,OAAO,GAAG,QAAQ,KAAK,aAAa;AAAA,gBACpC,SAAS;AAAA;AAAA,YACX,IAEA,8CAAC,OAAE,WAAU,kCAAkC,uBAAY,GAE/D;AAAA,aACF;AAAA,UAEC,iBAAiB,WAChB;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,eAAY;AAAA;AAAA,UACd;AAAA;AAAA;AAAA,IAEJ;AAAA,EAEJ;AACF;AAWA,IAAM,kBAAc;AAAA,EAClB,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACG;AACH,UAAM,QAAQ,aAAa;AAE3B,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,QAAO;AAAA,QACP,SAAQ;AAAA,QACR,WAAU;AAAA,QACV,WAAW,GAAG,oCAAoC,SAAS;AAAA,QAC1D,GAAG;AAAA,QAEJ;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,WAAW;AAAA,gBACT;AAAA,cACF;AAAA,cACA,OAAO;AAAA,gBACL,iBAAiB;AAAA,cACnB;AAAA,cAEC;AAAA;AAAA,UACH;AAAA,UAEA;AAAA,YAAC;AAAA;AAAA,cACC,WAAW;AAAA,gBACT;AAAA,gBACA,QAAQ,gCAAgC;AAAA,cAC1C;AAAA,cAEA;AAAA,8DAAC,OAAE,WAAU,2DACV,kBACH;AAAA,gBACA,+CAAC,UAAK,WAAU,oCACd;AAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,QAAO;AAAA,sBACP,SAAQ;AAAA,sBACR,MAAK;AAAA,sBACL,UAAU,8CAAC,sCAAY;AAAA,sBAEtB;AAAA;AAAA,wBAAgB;AAAA;AAAA;AAAA,kBACnB;AAAA,kBAEA;AAAA,oBAAC;AAAA;AAAA,sBACC,QAAO;AAAA,sBACP,SAAQ;AAAA,sBACR,MAAK;AAAA,sBACL,UAAU,8CAAC,kCAAQ;AAAA,sBAElB;AAAA;AAAA,wBAAkB;AAAA;AAAA;AAAA,kBACrB;AAAA,mBACF;AAAA;AAAA;AAAA,UACF;AAAA,UAEA,8CAAC,qCAAW,WAAU,iCAAgC;AAAA;AAAA;AAAA,IACxD;AAAA,EAEJ;AACF;AAQA,IAAM,iBAAa;AAAA,EACjB,CAAC,EAAE,QAAQ,WAAW,QAAQ,OAAO,GAAG,MAAM,GAAG,QAAQ;AACvD,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,QAAO;AAAA,QACP,SAAQ;AAAA,QACR,WAAU;AAAA,QACV,WAAW,GAAG,+BAA+B,SAAS;AAAA,QACrD,GAAG;AAAA,QAEJ,yDAAC,SAAI,WAAU,kEACb;AAAA,wDAAC,OAAE,WAAU,2DACV,kBACH;AAAA,UACA,+CAAC,UAAK,WAAU,kDACb;AAAA,sBACC;AAAA,cAAC;AAAA;AAAA,gBACC,QAAQ,UAAU,YAAY,YAAY;AAAA,gBAC1C,SAAQ;AAAA,gBACR,MAAK;AAAA,gBACL,UAAU,8CAAC,sCAAY;AAAA,gBAEtB,oBAAU,YAAY,YAAY;AAAA;AAAA,YACrC;AAAA,YAED,SAAS,8CAAC,OAAE,WAAU,yBAAyB,iBAAM;AAAA,aACxD;AAAA,UACA,8CAAC,qCAAW,WAAU,mEAAkE;AAAA,WAC1F;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AAOA,IAAM,mBAAe;AAAA,EACnB,CAAC,EAAE,QAAQ,WAAW,MAAM,GAAG,MAAM,GAAG,QAAQ;AAC9C,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,QAAO;AAAA,QACP,SAAQ;AAAA,QACR,WAAU;AAAA,QACV,WAAW;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,QACC,GAAG;AAAA,QAEJ;AAAA,wDAAC,UAAK,WAAU,kBAAkB,gBAAK;AAAA,UAEvC,8CAAC,OAAE,WAAU,2BAA2B,kBAAO;AAAA,UAE/C,8CAAC,qCAAW,MAAM,IAAI,WAAU,kBAAiB;AAAA;AAAA;AAAA,IACnD;AAAA,EAEJ;AACF;AAQA,IAAM,kBAAc;AAAA,EAClB,CAAC,EAAE,QAAQ,WAAW,YAAY,OAAO,UAAU,GAAG,MAAM,GAAG,QAAQ;AACrE,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,QAAO;AAAA,QACP,SAAQ;AAAA,QACR,WAAU;AAAA,QACV,WAAW;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,QACC,GAAG;AAAA,QAEJ;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,WAAW;AAAA,gBACT;AAAA,gBACA,aAAa,QAAQ,aAAa;AAAA,cACpC;AAAA,cAEA;AAAA,8DAAC,UAAK,WAAU,kBACd,wDAAC,OAAE,WAAU,4CAA4C,kBAAO,GAClE;AAAA,gBACA,8CAAC,UAAK,WAAU,uBAAuB,UAAS;AAAA;AAAA;AAAA,UAClD;AAAA,UAEA,8CAAC,qCAAW,WAAU,gCAA+B,MAAM,IAAI;AAAA;AAAA;AAAA,IACjE;AAAA,EAEJ;AACF;AAcA,IAAM,gBAAY;AAAA,EAChB,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACG;AACH,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,QAAO;AAAA,QACP,SAAQ;AAAA,QACR,WAAU;AAAA,QACV,SAAQ;AAAA,QACR,WAAW,GAAG,uBAAuB,SAAS;AAAA,QAC7C,GAAG;AAAA,QAEJ;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,cAAW;AAAA,cACX,SAAS,MAAM,iBAAiB,YAAY;AAAA,cAC5C,WAAU;AAAA;AAAA,UACZ;AAAA,UAEA,+CAAC,SAAI,WAAU,sCACb;AAAA,2DAAC,SAAI,WAAU,8CACb;AAAA,4DAAC,OAAE,WAAU,mDACV,iBACH;AAAA,cACA,+CAAC,OAAE,WAAU,yBAAwB;AAAA;AAAA,gBAChC;AAAA,gBAAK;AAAA,gBAAI;AAAA,iBACd;AAAA,eACF;AAAA,YAEA,8CAAC,OAAE,WAAU,+CACV,mBACH;AAAA,YAEA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,cAAW;AAAA,gBACX,SAAS,MAAM,kBAAkB,aAAa;AAAA,gBAC9C,WAAU;AAAA,gBAEV;AAAA,gEAAC,yCAAe,eAAY,QAAO,MAAM,IAAI;AAAA,kBAC7C,+CAAC,OAAE,WAAU,WAAW;AAAA;AAAA,oBAAS;AAAA,qBAAU;AAAA;AAAA;AAAA,YAC7C;AAAA,aACF;AAAA;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AAoBA,IAAM,gBAAY;AAAA,EAChB,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACG;AACH,UAAM,CAAC,WAAW,YAAY,QAAI,wBAAS,KAAK;AAChD,UAAM,CAAC,aAAa,cAAc,QAAI,wBAAS,CAAC;AAChD,UAAM,CAAC,UAAU,WAAW,QAAI,wBAAS,CAAC;AAC1C,UAAM,CAAC,QAAQ,SAAS,QAAI,wBAAS,CAAC;AACtC,UAAM,CAAC,mBAAmB,oBAAoB,QAAI,wBAAS,KAAK;AAChE,UAAM,CAAC,eAAe,gBAAgB,QAAI,wBAAS,KAAK;AACxD,UAAM,CAAC,cAAc,eAAe,QAAI,wBAAS,CAAC;AAClD,UAAM,eAAW,sBAAyB,IAAI;AAE9C,UAAM,aAAa,CAAC,SAAiB;AACnC,YAAM,UAAU,KAAK,MAAM,OAAO,EAAE;AACpC,YAAM,UAAU,KAAK,MAAM,OAAO,EAAE;AACpC,aAAO,GAAG,OAAO,IAAI,QAAQ,SAAS,EAAE,SAAS,GAAG,GAAG,CAAC;AAAA,IAC1D;AAEA,UAAM,kBAAkB,MAAM;AAC5B,UAAI,WAAW;AACb,iBAAS,SAAS,MAAM;AACxB,qBAAa,KAAK;AAClB,kBAAU;AAAA,MACZ,OAAO;AACL,iBAAS,SAAS,KAAK;AACvB,qBAAa,IAAI;AACjB,iBAAS;AAAA,MACX;AAAA,IACF;AAEA,UAAM,mBAAmB,MAAM;AAC7B,YAAM,UAAU,SAAS,SAAS,eAAe;AACjD,YAAM,QAAQ,SAAS,SAAS,YAAY;AAE5C,qBAAe,OAAO;AACtB,kBAAY,KAAK;AACjB,0BAAoB,SAAS,KAAK;AAAA,IACpC;AAEA,UAAM,uBAAuB,MAAM;AACjC,kBAAY,SAAS,SAAS,YAAY,CAAC;AAAA,IAC7C;AAEA,UAAM,cAAc,MAAM;AACxB,mBAAa,KAAK;AAClB,qBAAe,CAAC;AAChB,gBAAU;AAAA,IACZ;AAEA,UAAM,sBAAsB,CAAC,MAAqC;AAChE,YAAM,OAAO,EAAE,cAAc,sBAAsB;AACnD,YAAM,SAAS,EAAE,UAAU,KAAK;AAChC,YAAM,QAAQ,KAAK;AACnB,YAAM,aAAa,SAAS;AAC5B,YAAM,UAAU,aAAa;AAE7B,UAAI,SAAS,SAAS;AACpB,iBAAS,QAAQ,cAAc;AAAA,MACjC;AACA,qBAAe,OAAO;AAAA,IACxB;AAEA,UAAM,qBAAqB,CAAC,MAAqC;AAC/D,YAAM,YAAY,WAAW,EAAE,OAAO,KAAK;AAC3C,gBAAU,SAAS;AACnB,UAAI,SAAS,SAAS;AACpB,iBAAS,QAAQ,SAAS;AAAA,MAC5B;AAAA,IACF;AAEA,UAAM,sBAAsB,MAAM;AAChC,2BAAqB,CAAC,iBAAiB;AAAA,IACzC;AAEA,UAAM,kBAAkB,MAAM;AAC5B,uBAAiB,CAAC,aAAa;AAAA,IACjC;AAEA,UAAM,oBAAoB,CAAC,UAAkB;AAC3C,sBAAgB,KAAK;AACrB,UAAI,SAAS,SAAS;AACpB,iBAAS,QAAQ,eAAe;AAAA,MAClC;AACA,uBAAiB,KAAK;AAAA,IACxB;AAEA,UAAM,gBAAgB,MAAM;AAC1B,UAAI,WAAW,GAAG;AAChB,eAAO,8CAAC,yCAAe;AAAA,MACzB;AACA,UAAI,SAAS,KAAK;AAChB,eAAO,8CAAC,qCAAW;AAAA,MACrB;AACA,aAAO,8CAAC,sCAAY;AAAA,IACtB;AAEA,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,QAAO;AAAA,QACP,SAAQ;AAAA,QACR,WAAU;AAAA,QACV,WAAW,GAAG,kCAAkC,SAAS;AAAA,QACxD,GAAG;AAAA,QAGJ;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,KAAK;AAAA,cACL;AAAA,cACA;AAAA,cACA;AAAA,cACA,cAAc;AAAA,cACd,kBAAkB;AAAA,cAClB,SAAS;AAAA,cACT,eAAY;AAAA,cACZ,cAAY;AAAA,cAEX,mBACC,OAAO,IAAI,CAAC,UACV;AAAA,gBAAC;AAAA;AAAA,kBAEC,MAAM,MAAM;AAAA,kBACZ,KAAK,MAAM;AAAA,kBACX,SAAS,MAAM;AAAA,kBACf,OAAO,MAAM;AAAA,kBACb,SAAS,MAAM;AAAA;AAAA,gBALV,MAAM;AAAA,cAMb,CACD,IAED;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,KAAI;AAAA,kBACJ,SAAQ;AAAA,kBACR,OAAM;AAAA;AAAA,cACR;AAAA;AAAA,UAEJ;AAAA,UAGA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS;AAAA,cACT,UAAU,CAAC;AAAA,cACX,WAAU;AAAA,cACV,cAAY,YAAY,WAAW;AAAA,cAElC,sBACC,8CAAC,SAAI,WAAU,4CACb,yDAAC,SAAI,WAAU,gBACb;AAAA,8DAAC,SAAI,WAAU,iCAAgC;AAAA,gBAC/C,8CAAC,SAAI,WAAU,iCAAgC;AAAA,iBACjD,GACF,IAEA,8CAAC,+BAAK,MAAM,IAAI;AAAA;AAAA,UAEpB;AAAA,UAGA,8CAAC,OAAE,WAAU,oDACV,qBAAW,WAAW,GACzB;AAAA,UAGA,8CAAC,SAAI,WAAU,mBAAkB,eAAY,gBAC3C;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAU;AAAA,cACV,SAAS;AAAA,cACT,WAAW,CAAC,MAAM;AAChB,oBAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AACtC,oBAAE,eAAe;AACjB;AAAA,oBACE;AAAA,kBACF;AAAA,gBACF;AAAA,cACF;AAAA,cACA,cAAW;AAAA,cAEX;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAU;AAAA,kBACV,OAAO;AAAA,oBACL,OACE,WAAW,IAAI,GAAI,cAAc,WAAY,GAAG,MAAM;AAAA,kBAC1D;AAAA;AAAA,cACF;AAAA;AAAA,UACF,GACF;AAAA,UAGA,8CAAC,OAAE,WAAU,oDACV,qBAAW,QAAQ,GACtB;AAAA,UAGA,+CAAC,SAAI,WAAU,YACb;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS;AAAA,gBACT,WAAU;AAAA,gBACV,cAAW;AAAA,gBAEX,wDAAC,SAAI,WAAU,4CACZ,wBAAc,GACjB;AAAA;AAAA,YACF;AAAA,YAEC,qBACC;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,WAAU;AAAA,gBACV,WAAW,CAAC,MAAM;AAChB,sBAAI,EAAE,QAAQ,UAAU;AACtB,yCAAqB,KAAK;AAAA,kBAC5B;AAAA,gBACF;AAAA,gBAEA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,KAAI;AAAA,oBACJ,KAAI;AAAA,oBACJ,MAAK;AAAA,oBACL,OAAO;AAAA,oBACP,UAAU;AAAA,oBACV,WAAW,CAAC,MAAM;AAChB,0BAAI,EAAE,QAAQ,aAAa,EAAE,QAAQ,cAAc;AACjD,0BAAE,eAAe;AACjB,8BAAM,YAAY,KAAK;AAAA,0BACrB;AAAA,0BACA,KAAK,OAAO,SAAS,OAAO,EAAE,IAAI;AAAA,wBACpC;AACA,kCAAU,SAAS;AACnB,4BAAI,SAAS,QAAS,UAAS,QAAQ,SAAS;AAAA,sBAClD,WAAW,EAAE,QAAQ,eAAe,EAAE,QAAQ,aAAa;AACzD,0BAAE,eAAe;AACjB,8BAAM,YAAY,KAAK;AAAA,0BACrB;AAAA,0BACA,KAAK,OAAO,SAAS,OAAO,EAAE,IAAI;AAAA,wBACpC;AACA,kCAAU,SAAS;AACnB,4BAAI,SAAS,QAAS,UAAS,QAAQ,SAAS;AAAA,sBAClD;AAAA,oBACF;AAAA,oBACA,WAAU;AAAA,oBACV,OAAO;AAAA,sBACL,YAAY,iDAAiD,SAAS,GAAG,cAAc,SAAS,GAAG;AAAA,oBACrG;AAAA,oBACA,cAAW;AAAA,oBACX,iBAAe,KAAK,MAAM,SAAS,GAAG;AAAA,oBACtC,iBAAe;AAAA,oBACf,iBAAe;AAAA;AAAA,gBACjB;AAAA;AAAA,YACF;AAAA,aAEJ;AAAA,UAGA,+CAAC,SAAI,WAAU,YACb;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS;AAAA,gBACT,WAAU;AAAA,gBACV,cAAW;AAAA,gBAEX,wDAAC,4CAAkB,MAAM,IAAI;AAAA;AAAA,YAC/B;AAAA,YAEC,iBACC,8CAAC,SAAI,WAAU,mHACb,wDAAC,SAAI,WAAU,uBACZ;AAAA,cACC,EAAE,OAAO,GAAG,OAAO,KAAK;AAAA,cACxB,EAAE,OAAO,KAAK,OAAO,OAAO;AAAA,cAC5B,EAAE,OAAO,GAAG,OAAO,KAAK;AAAA,YAC1B,EAAE,IAAI,CAAC,EAAE,OAAO,MAAM,MACpB;AAAA,cAAC;AAAA;AAAA,gBAEC,MAAK;AAAA,gBACL,SAAS,MAAM,kBAAkB,KAAK;AAAA,gBACtC,WAAW;AAAA,kBACT;AAAA,kBACA,iBAAiB,QACb,kDACA;AAAA,gBACN;AAAA,gBAEC;AAAA;AAAA,cAVI;AAAA,YAWP,CACD,GACH,GACF;AAAA,aAEJ;AAAA;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AASA,IAAM,8BAA8B;AAAA,EAClC,MAAM;AAAA,EACN,OAAO;AAAA,EACP,WAAW;AAAA,EACX,YAAY;AACd;AAEA,IAAM,mBAAe;AAAA,EACnB,CAAC,EAAE,OAAO,UAAU,MAAM,iBAAiB,WAAW,GAAG,MAAM,GAAG,QAAQ;AACxE,UAAM,kBAAkB,4BAA4B,eAAe;AAEnE,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,QAAO;AAAA,QACP,SAAQ;AAAA,QACR,WAAU;AAAA,QACV,QAAO;AAAA,QACP,WAAW;AAAA,UACT,GAAG,eAAe;AAAA,UAClB;AAAA,QACF;AAAA,QACC,GAAG;AAAA,QAEJ,yDAAC,SAAI,WAAU,kDACb;AAAA,yDAAC,SAAI,WAAU,sCACb;AAAA,0DAAC,gBAAK,MAAK,MAAK,QAAO,QAAO,WAAU,0BACrC,iBACH;AAAA,YAEA,+CAAC,SAAI,WAAU,yCACZ;AAAA,0BACC,+CAAC,SAAI,WAAU,2BACb;AAAA,8DAAC,gCAAM,MAAM,IAAI,WAAU,iBAAgB;AAAA,gBAC3C,8CAAC,gBAAK,MAAK,MAAM,oBAAS;AAAA,iBAC5B;AAAA,cAGF,8CAAC,gBAAK,MAAK,MAAK,WAAU,YACvB,gBACH;AAAA,eACF;AAAA,aACF;AAAA,UAEA;AAAA,YAAC;AAAA;AAAA,cACC,MAAM;AAAA,cACN,WAAU;AAAA,cACV,eAAY;AAAA;AAAA,UACd;AAAA,WACF;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AAWA,IAAM,eAAW;AAAA,EACf,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA,YAAY;AAAA,IACZ,GAAG;AAAA,EACL,GACA,QACG;AACH,UAAM,cAAc,MAAM;AACxB,UAAI,UAAU;AACZ,iBAAS,CAAC,QAAQ;AAAA,MACpB;AAAA,IACF;AAEA,UAAM,gBAAgB,CAAC,UAAsC;AAC3D,WAAK,MAAM,QAAQ,WAAW,MAAM,QAAQ,QAAQ,UAAU;AAC5D,cAAM,eAAe;AACrB,iBAAS,CAAC,QAAQ;AAAA,MACpB;AAAA,IACF;AAEA,UAAM,eAAe,CAAC,CAAC;AACvB,UAAM,mBAAmB,CAAC,UAAkB;AAC1C,YAAM,WAAW,UAAU,IAAI,eAAY;AAC3C,aAAO,GAAG,KAAK,IAAI,QAAQ;AAAA,IAC7B;AAEA,UAAM,cAAc,iBAChB,iBAAiB,cAAc,IAC/B,kBAAkB;AACtB,UAAM,cACJ;AACF,UAAM,qBAAqB,eACvB,8FACA;AACJ,UAAM,kBAAkB,WACpB,0CACA;AAEJ,QAAI,cAAc;AAChB,aACE;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,MAAK;AAAA,UACL,WAAW;AAAA,YACT,GAAG,WAAW,IAAI,kBAAkB,IAAI,eAAe,IAAI,SAAS,GAAG,KAAK;AAAA,UAC9E;AAAA,UACA,SAAS;AAAA,UACT,WAAW;AAAA,UACX,gBAAc;AAAA,UACb,GAAI;AAAA,UAEL,yDAAC,SAAI,WAAU,kFACb;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,QAAO;AAAA,gBACP,WAAU;AAAA,gBAET;AAAA;AAAA,YACH;AAAA,YAEA,+CAAC,SAAI,WAAU,sDACZ;AAAA,0BACC,+CAAC,SAAI,WAAU,kDACb;AAAA,8DAAC,gCAAM,MAAM,IAAI,WAAU,iBAAgB;AAAA,gBAC3C;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,WAAU;AAAA,oBAET;AAAA;AAAA,gBACH;AAAA,iBACF;AAAA,cAGF;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAU;AAAA,kBAET;AAAA;AAAA,cACH;AAAA,eACF;AAAA,aACF;AAAA;AAAA,MACF;AAAA,IAEJ;AAEA,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAW,GAAG,GAAG,WAAW,IAAI,SAAS,GAAG,KAAK,CAAC;AAAA,QACjD,GAAI;AAAA,QAEL,yDAAC,SAAI,WAAU,kFACb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,QAAO;AAAA,cACP,WAAU;AAAA,cAET;AAAA;AAAA,UACH;AAAA,UAEA,+CAAC,SAAI,WAAU,sDACZ;AAAA,wBACC,+CAAC,SAAI,WAAU,kDACb;AAAA,4DAAC,gCAAM,MAAM,IAAI,WAAU,iBAAgB;AAAA,cAC3C;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAU;AAAA,kBAET;AAAA;AAAA,cACH;AAAA,eACF;AAAA,YAGF;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,WAAU;AAAA,gBAET;AAAA;AAAA,YACH;AAAA,aACF;AAAA,WACF;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AAmBA,IAAM,yBAAyB;AAAA,EAC7B,MAAM;AAAA,IACJ,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,MAAM;AAAA,EACR;AAAA,EACA,OAAO;AAAA,IACL,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,MAAM;AAAA,EACR;AAAA,EACA,UAAU;AAAA,IACR,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,MAAM;AAAA,EACR;AAAA,EACA,YAAY;AAAA,IACV,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,MAAM;AAAA,EACR;AACF;AAEA,IAAM,4BAAwB,0BAG5B,CAAC,EAAE,MAAM,mBAAmB,WAAW,GAAG,MAAM,GAAG,QAAQ;AAC3D,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW,GAAG,+BAA+B,SAAS;AAAA,MACrD,GAAG;AAAA,MAGJ,yDAAC,SAAI,WAAU,uBACZ;AAAA,aAAK,IAAI,CAAC,SAAS,iBAClB,8CAAC,SAAuB,WAAU,iBAEhC;AAAA,UAAC;AAAA;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACA,iBAAiB,IAAI,kBAAkB;AAAA,YACzC;AAAA,YAEA;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,QAAO;AAAA,kBACP,WAAU;AAAA,kBAET,kBAAQ;AAAA;AAAA,cACX;AAAA,cAEA,8CAAC,SAAI,WAAU,8BACZ,kBAAQ,YAAY,IAAI,CAAC,eAAe;AACvC,sBAAM,aAAa,uBAAuB,WAAW,IAAI;AAEzD,uBACE;AAAA,kBAAC;AAAA;AAAA,oBAEC,QAAO;AAAA,oBACP,SAAQ;AAAA,oBACR,WAAU;AAAA,oBACV,QAAO;AAAA,oBACP,WAAW;AAAA,sBACT,GAAG,WAAW,UAAU;AAAA;AAAA,oBAE1B;AAAA,oBACA,SAAS,MAAM,oBAAoB,UAAU;AAAA,oBAE7C,yDAAC,SAAI,WAAU,kDACb;AAAA,qEAAC,SAAI,WAAU,sCACb;AAAA;AAAA,0BAAC;AAAA;AAAA,4BACC,MAAK;AAAA,4BACL,QAAO;AAAA,4BACP,WAAU;AAAA,4BAET,qBAAW;AAAA;AAAA,wBACd;AAAA,wBAEA,+CAAC,SAAI,WAAU,2BACb;AAAA;AAAA,4BAAC;AAAA;AAAA,8BACC,SAAQ;AAAA,8BACR,QAAQ,WAAW;AAAA,8BACnB,MAAK;AAAA,8BAEJ,qBAAW;AAAA;AAAA,0BACd;AAAA,0BAEA,8CAAC,gBAAK,MAAK,MAAK,WAAU,0BACvB,qBAAW,MACd;AAAA,2BACF;AAAA,yBACF;AAAA,sBAEA;AAAA,wBAAC;AAAA;AAAA,0BACC,MAAM;AAAA,0BACN,WAAU;AAAA,0BACV,eAAY;AAAA;AAAA,sBACd;AAAA,uBACF;AAAA;AAAA,kBAzCK,WAAW;AAAA,gBA0ClB;AAAA,cAEJ,CAAC,GACH;AAAA;AAAA;AAAA,QACF,KApEQ,QAAQ,IAqElB,CACD;AAAA,QAGA,KAAK,SAAS,KACb,8CAAC,SAAI,WAAU,qCAAoC;AAAA,SAEvD;AAAA;AAAA,EACF;AAEJ,CAAC;;;AEx0CK,IAAAC,uBAAA;AA7HN,IAAMC,gBAAe;AAAA,EACnB,OAAO;AAAA,IACL,WAAW;AAAA;AAAA,IACX,aAAa;AAAA;AAAA,IACb,UAAU;AAAA;AAAA,IACV,YAAY;AAAA;AAAA,IACZ,WAAW;AAAA;AAAA,IACX,aAAa;AAAA;AAAA,IACb,SAAS;AAAA;AAAA,IACT,cAAc;AAAA;AAAA,EAChB;AAAA,EACA,QAAQ;AAAA,IACN,WAAW;AAAA;AAAA,IACX,aAAa;AAAA;AAAA,IACb,UAAU;AAAA;AAAA,IACV,YAAY;AAAA;AAAA,IACZ,WAAW;AAAA;AAAA,IACX,aAAa;AAAA;AAAA,IACb,SAAS;AAAA;AAAA,IACT,cAAc;AAAA;AAAA,EAChB;AACF;AAKA,IAAMC,mBAAkB;AAAA,EACtB,MAAM;AAAA,IACJ,YAAY;AAAA;AAAA,IACZ,MAAM;AAAA;AAAA,IACN,WAAW;AAAA;AAAA,IACX,YAAY;AAAA;AAAA,EACd;AAAA,EACA,OAAO;AAAA,IACL,YAAY;AAAA;AAAA,IACZ,MAAM;AAAA;AAAA,IACN,WAAW;AAAA;AAAA,IACX,YAAY;AAAA;AAAA,EACd;AACF;AAiDA,IAAM,iBAAiB,CAAC;AAAA,EACtB;AAAA,EACA,MAAM;AAAA,EACN,OAAO;AAAA,EACP,UAAU;AAAA,EACV;AAAA,EACA,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,sBAAsB;AACxB,MAA2B;AAEzB,QAAM,YAAY,MAAM,KAAK,IAAI,IAAI;AACrC,QAAM,eAAe,KAAK,IAAI,GAAG,KAAK,IAAI,WAAW,GAAG,CAAC;AACzD,QAAM,aAAa,QAAQ,IAAI,IAAK,eAAe,MAAO;AAG1D,QAAM,cAAcD,cAAa,IAAI;AACrC,QAAM,iBAAiBC,iBAAgB,OAAO;AAG9C,QAAM,SAAS,SAAS,UAAU,KAAK;AACvC,QAAM,gBAAgB,IAAI,KAAK,KAAK;AACpC,QAAM,mBAAmB,gBAAiB,aAAa,MAAO;AAC9D,QAAM,SAAS,SAAS,UAAU,KAAK;AACvC,QAAM,UAAU,SAAS,UAAU,KAAK;AAExC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,YAAY;AAAA,QACZ;AAAA,QACA;AAAA,MACF;AAAA,MAGA;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,SAAS,OAAO,OAAO,IAAI,OAAO;AAAA,YAClC,eAAY;AAAA,YAGZ;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,IAAI;AAAA,kBACJ,IAAI;AAAA,kBACJ,GAAG;AAAA,kBACH,MAAK;AAAA,kBACL,aAAa,YAAY;AAAA,kBACzB,WAAW,GAAG,eAAe,YAAY,YAAY;AAAA;AAAA,cACvD;AAAA,cAEA;AAAA,gBAAC;AAAA;AAAA,kBACC,IAAI;AAAA,kBACJ,IAAI;AAAA,kBACJ,GAAG;AAAA,kBACH,MAAK;AAAA,kBACL,aAAa,YAAY;AAAA,kBACzB,eAAc;AAAA,kBACd,iBAAiB;AAAA,kBACjB;AAAA,kBACA,WAAW;AAAA,oBACT,eAAe;AAAA,oBACf;AAAA,kBACF;AAAA;AAAA,cACF;AAAA;AAAA;AAAA,QACF;AAAA,QAGA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,YACP;AAAA,YACA,cAAY,OAAO,UAAU,WAAW,QAAQ;AAAA,YAChD,WAAU;AAAA;AAAA,QACZ;AAAA,QAGA;AAAA,UAAC;AAAA;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACA,YAAY;AAAA,cACZ,YAAY;AAAA,YACd;AAAA,YAGC;AAAA,gCACC;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAM,YAAY;AAAA,kBAClB,QAAQ,YAAY;AAAA,kBACpB,WAAW;AAAA,oBACT;AAAA,oBACA,eAAe;AAAA,oBACf;AAAA,kBACF;AAAA,kBAEC;AAAA,yBAAK,MAAM,UAAU;AAAA,oBAAE;AAAA;AAAA;AAAA,cAC1B;AAAA,cAID,SACC;AAAA,gBAAC;AAAA;AAAA,kBACC,IAAG;AAAA,kBACH,MAAM,YAAY;AAAA,kBAClB,QAAQ,YAAY;AAAA,kBACpB,WAAW;AAAA,oBACT,eAAe;AAAA,oBACf;AAAA,oBACA;AAAA,kBACF;AAAA,kBAEC;AAAA;AAAA,cACH;AAAA;AAAA;AAAA,QAEJ;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,IAAO,yBAAQ;;;AClOf,IAAAC,iBAAwD;;;ACAxD,IAAAC,gBAYO;AACP,IAAAC,kBAA2C;;;ACb3C,IAAAC,gBAOO;AAEP,IAAAC,yBAA6B;AA8LnB,IAAAC,uBAAA;AA9KV,IAAMC,gBAAe;AAAA,EACnB,OAAO;AAAA,IACL,UAAU;AAAA;AAAA,IACV,UAAU;AAAA,IACV,SAAS;AAAA;AAAA,IACT,aAAa;AAAA,IACb,UAAU;AAAA;AAAA,IACV,aAAa;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,IACN,UAAU;AAAA;AAAA,IACV,UAAU;AAAA,IACV,SAAS;AAAA;AAAA,IACT,aAAa;AAAA,IACb,UAAU;AAAA;AAAA,IACV,aAAa;AAAA,EACf;AAAA,EACA,OAAO;AAAA,IACL,UAAU;AAAA;AAAA,IACV,UAAU;AAAA,IACV,SAAS;AAAA;AAAA,IACT,aAAa;AAAA;AAAA,IACb,UAAU;AAAA;AAAA,IACV,aAAa;AAAA,EACf;AACF;AAKA,IAAM,wBACJ;AAKF,IAAMC,iBAAgB;AAAA,EACpB,SAAS;AAAA,IACP,WAAW;AAAA,IACX,SACE;AAAA,EACJ;AAAA,EACA,SAAS;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA,EACX;AAAA,EACA,SAAS;AAAA,IACP,WACE;AAAA,IACF,SACE;AAAA,EACJ;AAAA,EACA,SAAS;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA,EACX;AAAA,EACA,UAAU;AAAA,IACR,WAAW;AAAA,IACX,SACE;AAAA,EACJ;AACF;AA8CA,IAAM,eAAW;AAAA,EACf,CACE;AAAA,IACE;AAAA,IACA,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,gBAAgB;AAAA,IAChB;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ,iBAAiB;AAAA,IACjB,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACG;AAEH,UAAM,kBAAc,qBAAM;AAC1B,UAAM,UAAU,MAAM,YAAY,WAAW;AAG7C,UAAM,CAAC,iBAAiB,kBAAkB,QAAI,wBAAS,KAAK;AAC5D,UAAM,eAAe,gBAAgB;AACrC,UAAM,UAAU,eAAe,cAAc;AAG7C,UAAM,eAAe,CAAC,UAAyC;AAC7D,UAAI,CAAC,cAAc;AACjB,2BAAmB,MAAM,OAAO,OAAO;AAAA,MACzC;AACA,iBAAW,KAAK;AAAA,IAClB;AAGA,UAAM,eAAe,WAAW,aAAa;AAG7C,UAAM,cAAcD,cAAa,IAAI;AAGrC,UAAM,eAAe,WAAW,gBAAgB,YAAY;AAG5D,UAAM,iBAAiBC,eAAc,YAAY,EAAE,YAAY;AAG/D,UAAM,mBACJ,UAAU,aAAc,UAAU,aAAa,SAAS,UACpD,iBACA,YAAY;AAGlB,UAAM,kBAAkB;AAAA,MACtB;AAAA,MACA,YAAY;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAGA,UAAM,aAAa,MAAM;AACvB,UAAI,eAAe;AACjB,eACE;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,YAAY;AAAA,YAClB,QAAO;AAAA,YACP,OAAM;AAAA;AAAA,QACR;AAAA,MAEJ;AAEA,UAAI,SAAS;AACX,eACE;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,YAAY;AAAA,YAClB,QAAO;AAAA,YACP,OAAM;AAAA;AAAA,QACR;AAAA,MAEJ;AAEA,aAAO;AAAA,IACT;AAEA,WACE,+CAAC,SAAI,WAAU,iBACb;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAW;AAAA,YACT;AAAA,YACA,YAAY;AAAA,YACZ,WAAW,eAAe;AAAA,UAC5B;AAAA,UAGA;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC;AAAA,gBACA,MAAK;AAAA,gBACL,IAAI;AAAA,gBACJ;AAAA,gBACA;AAAA,gBACA,UAAU;AAAA,gBACV,WAAU;AAAA,gBACT,GAAG;AAAA;AAAA,YACN;AAAA,YAGA,8CAAC,WAAM,SAAS,SAAS,WAAW,iBAEjC,qBAAW,GACd;AAAA,YAGC,SACC;AAAA,cAAC;AAAA;AAAA,gBACC,WAAW;AAAA,kBACT;AAAA,kBACA,YAAY;AAAA,gBACd;AAAA,gBAEA;AAAA,kBAAC;AAAA;AAAA,oBACC,IAAG;AAAA,oBACH,SAAS;AAAA,oBACT,MAAM,YAAY;AAAA,oBAClB,QAAO;AAAA,oBACP,WAAW;AAAA,sBACT;AAAA,sBACA;AAAA,oBACF;AAAA,oBAEC;AAAA;AAAA,gBACH;AAAA;AAAA,YACF;AAAA;AAAA;AAAA,MAEJ;AAAA,MAGC,gBACC;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,QAAO;AAAA,UACP,WAAU;AAAA,UACV,OAAM;AAAA,UAEL;AAAA;AAAA,MACH;AAAA,MAID,cAAc,CAAC,gBACd;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,QAAO;AAAA,UACP,WAAU;AAAA,UACV,OAAM;AAAA,UAEL;AAAA;AAAA,MACH;AAAA,OAEJ;AAAA,EAEJ;AACF;AAEA,SAAS,cAAc;AAEvB,IAAO,mBAAQ;;;ADtGT,IAAAC,uBAAA;AAtJN,IAAM,0BAA0B,CAC9B,MACA,eACA,UACA,uBAEA,wBAA0B,CAAC,KAAK,SAAS;AAAA,EACvC,QAAQ;AAAA,EACR,WAAW,CAAC,WAAW;AACrB,QAAI,CAAC,IAAI,EAAE,UAAU;AACnB,UAAI,EAAE,OAAO,CAAC;AACd,UAAI,EAAE,iBAAiB,MAAM;AAAA,IAC/B;AAAA,EACF;AAAA,EACA,aAAa,CAAC,UAAU;AACtB,QAAI,CAAC,IAAI,EAAE,UAAU;AACnB,YAAM,gBAAgB,IAAI,EAAE;AAC5B,YAAM,YAAY,cAAc,SAAS,KAAK,IAC1C,cAAc,OAAO,CAAC,MAAM,MAAM,KAAK,IACvC,CAAC,GAAG,eAAe,KAAK;AAC5B,UAAI,EAAE,QAAQ,UAAU,CAAC;AACzB,UAAI,EAAE,iBAAiB,SAAS;AAAA,IAClC;AAAA,EACF;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE;AAKG,IAAM,uBAAuB,CAAC,kBAAyC;AAC5E,MAAI,CAAC,eAAe;AAClB,UAAM,IAAI,MAAM,qDAAqD;AAAA,EACvE;AACA,SAAO;AACT;AAKA,IAAMC,eAAc,CAClB,UACA,UAEA,uBAAS,IAAI,UAAU,CAAC,UAAU;AAChC,MAAI,KAAC,8BAAe,KAAK,EAAG,QAAO;AACnC,QAAM,aAAa;AACnB,QAAM,eAAe,WAAW,SAAS;AACzC,aAAO,4BAAa,YAAY;AAAA,IAC9B,GAAI,eAAe,EAAE,MAAM,IAAI,CAAC;AAAA,IAChC,GAAI,WAAW,MAAM,WACjB,EAAE,UAAUA,aAAY,WAAW,MAAM,UAAU,KAAK,EAAE,IAC1D,CAAC;AAAA,EACP,CAAC;AACH,CAAC;AA0CH,IAAM,mBAAe;AAAA,EACnB,CACE;AAAA,IACE,QAAQ;AAAA,IACR,gBAAgB,CAAC;AAAA,IACjB;AAAA,IACA,MAAM;AAAA,IACN,WAAW;AAAA,IACX,YAAY;AAAA,IACZ;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACG;AAEH,UAAM,kBAAc,qBAAM;AAC1B,UAAM,OAAO,YAAY,iBAAiB,WAAW;AAGrD,UAAM,eAAW,sBAA6B,IAAI;AAClD,aAAS,YAAY;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,UAAM,QAAQ,SAAS;AAGvB,UAAM,EAAE,UAAU,QAAI,0BAAS,OAAO,CAAC,MAAM,CAAC;AAG9C,iCAAU,MAAM;AACd,YAAM,gBAAgB,MAAM,SAAS,EAAE;AACvC,UAAI,cAAc,SAAS,KAAK,gBAAgB;AAC9C,uBAAe,aAAa;AAAA,MAC9B;AAAA,IACF,GAAG,CAAC,CAAC;AAGL,iCAAU,MAAM;AACd,UAAI,eAAe,QAAW;AAC5B,kBAAU,UAAU;AAAA,MACtB;AAAA,IACF,GAAG,CAAC,YAAY,SAAS,CAAC;AAG1B,iCAAU,MAAM;AACd,YAAM,SAAS,EAAE,SAAS,CAAC;AAAA,IAC7B,GAAG,CAAC,UAAU,KAAK,CAAC;AAEpB,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAW,GAAG,8BAA8B,SAAS;AAAA,QACrD,cAAY;AAAA,QACX,GAAG;AAAA,QAEH,UAAAA,aAAY,UAAU,KAAK;AAAA;AAAA,IAC9B;AAAA,EAEJ;AACF;AAEA,aAAa,cAAc;AAuC3B,IAAM,uBAAmB;AAAA,EACvB,CACE;AAAA,IACE;AAAA,IACA,OAAO;AAAA,IACP,UAAU;AAAA,IACV,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACG;AAEH,UAAM,QAAQ,qBAAqB,aAAa;AAChD,UAAM;AAAA,MACJ,QAAQ;AAAA,MACR;AAAA,MACA,UAAU;AAAA,MACV;AAAA,IACF,QAAI,0BAAS,KAAK;AAGlB,UAAM,kBAAc,qBAAM;AAC1B,UAAM,UAAU,MAAM,iBAAiB,WAAW;AAGlD,UAAM,YAAY,YAAY,SAAS,KAAK;AAC5C,UAAM,aAAa,iBAAiB;AACpC,UAAM,eAAe,aAAa,aAAa;AAG/C,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,IAAI;AAAA,QACJ;AAAA,QACA;AAAA,QACA,SAAS;AAAA,QACT,UAAU;AAAA,QACV;AAAA,QACA,OAAO;AAAA,QACP;AAAA,QACA,UAAU,MAAM;AACd,cAAI,CAAC,YAAY;AACf,wBAAY,KAAK;AAAA,UACnB;AAAA,QACF;AAAA,QACC,GAAG;AAAA;AAAA,IACN;AAAA,EAEJ;AACF;AAEA,iBAAiB,cAAc;AAE/B,IAAO,uBAAQ;;;ADhTf,IAAAC,yBAA4C;AAqCgB,IAAAC,uBAAA;AAlB5D,IAAM,qBAAqB,CAAC;AAAA,EAC1B,WAAW;AAAA,EACX,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AACT,MAA+B;AAC7B,QAAM,CAAC,aAAa,cAAc,QAAI,yBAAS,cAAc;AAE7D,gCAAU,MAAM;AACd,mBAAe,cAAc;AAAA,EAC/B,GAAG,CAAC,cAAc,CAAC;AACnB,QAAMC,kBAAiB,CAAC,WAA6B;AACnD,YAAQ,QAAQ;AAAA,MACd,KAAK;AACH,eACE,8CAAC,iBAAM,SAAQ,SAAQ,QAAO,WAAU,UAAU,8CAAC,sCAAY,GAAI,8BAEnE;AAAA,MAEJ,KAAK;AACH,eACE,8CAAC,iBAAM,SAAQ,SAAQ,QAAO,SAAQ,UAAU,8CAAC,kCAAQ,GAAI,gCAE7D;AAAA,MAEJ;AACE,eAAO;AAAA,IACX;AAAA,EACF;AAEA,QAAMC,mBAAkB,CAAC,WAA6B;AACpD,YAAQ,QAAQ;AAAA,MACd,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT;AACE,eAAO;AAAA,IACX;AAAA,EACF;AAEA,QAAM,uBAAuB,CAAC,YAAqB,eAAwB;AACzE,UAAM,kBAAkB;AAAA,MACtB;AAAA,MACA,aACI,gDACA;AAAA,MACJ,cAAc;AAAA,IAChB;AAEA,WACE,8CAAC,SAAI,WAAW,iBACb,wBAAc,8CAAC,gCAAM,MAAM,IAAI,QAAO,QAAO,GAChD;AAAA,EAEJ;AAEA,MAAI,SAAS,YAAY;AACvB,WACE,8CAAC,SAAI,WAAW,GAAG,uBAAuB,SAAS,GAChD,kBAAQ,IAAI,CAAC,QAAQ,MAAM;AAC1B,YAAM,aAAa,aAAa,SAAS,OAAO,KAAK,KAAK;AAC1D,YAAM,eAAeA,iBAAgB,OAAO,MAAM;AAClD,YAAM,cAAcD,gBAAe,OAAO,MAAM;AAEhD,aACE;AAAA,QAAC;AAAA;AAAA,UAEC,WAAW;AAAA,YACT;AAAA,YACA;AAAA,YACA,OAAO,WAAW,kCAAkC;AAAA,UACtD;AAAA,UAEA;AAAA,2DAAC,SAAI,WAAU,kCACZ;AAAA,mCAAqB,YAAY,OAAO,YAAY,QAAQ;AAAA,cAC7D;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAW;AAAA,oBACT;AAAA,oBACA,cAAe,OAAO,UAAU,OAAO,UAAU,YAC7C,kBACA;AAAA,oBACJ,OAAO,YAAY,WACf,uBACA;AAAA,kBACN;AAAA,kBAEC,iBAAO;AAAA;AAAA,cACV;AAAA,eACF;AAAA,YACC,eACC,8CAAC,SAAI,WAAU,iBAAiB,uBAAY;AAAA;AAAA;AAAA,QAxBzC,YAAY,OAAO,KAAK,IAAI,CAAC;AAAA,MA0BpC;AAAA,IAEJ,CAAC,GACH;AAAA,EAEJ;AACA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,WAAW,kCAAkC;AAAA,QAC7C;AAAA,MACF;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,QAAQ;AAAA,UACR,gBAAgB,CAAC,MAAM;AACrB,2BAAe,CAAC;AAChB,qCAAyB,CAAC;AAAA,UAC5B;AAAA,UACA;AAAA,UAEC,kBAAQ,IAAI,CAAC,QAAQ,MACpB;AAAA,YAAC;AAAA;AAAA,cAEC,WAAU;AAAA,cAEV;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO,OAAO;AAAA,oBACd,IAAI,eAAe,OAAO,KAAK,IAAI,CAAC;AAAA,oBACpC,UAAU,OAAO,YAAY;AAAA;AAAA,gBAC/B;AAAA,gBAEA;AAAA,kBAAC;AAAA;AAAA,oBACC,SAAS,eAAe,OAAO,KAAK,IAAI,CAAC;AAAA,oBACzC,WAAW;AAAA,sBACT;AAAA,sBACA,aAAa,SAAS,OAAO,KAAK,IAC9B,kBACA;AAAA,sBACJ,OAAO,YAAY,WACf,uBACA;AAAA,oBACN;AAAA,oBAEC,iBAAO;AAAA;AAAA,gBACV;AAAA;AAAA;AAAA,YAtBK,eAAe,OAAO,KAAK,IAAI,CAAC;AAAA,UAuBvC,CACD;AAAA;AAAA,MACH;AAAA;AAAA,EACF;AAEJ;;;AG3KA,IAAAE,iBAQO;AACP,IAAAC,yBAA8B;AA6LpB,IAAAC,uBAAA;AA5KV,IAAMC,iBAAe;AAAA,EACnB,OAAO;AAAA,IACL,UAAU;AAAA;AAAA,IACV,UAAU;AAAA,EACZ;AAAA,EACA,QAAQ;AAAA,IACN,UAAU;AAAA;AAAA,IACV,UAAU;AAAA,EACZ;AAAA,EACA,OAAO;AAAA,IACL,UAAU;AAAA;AAAA,IACV,UAAU;AAAA,EACZ;AAAA,EACA,YAAY;AAAA,IACV,UAAU;AAAA;AAAA,IACV,UAAU;AAAA,EACZ;AACF;AAKA,IAAM,wBACJ;AAKF,IAAMC,iBAAgB;AAAA,EACpB,SAAS;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AAAA,EACA,SAAS;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AAAA,EACA,SAAS;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AAAA,EACA,SAAS;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AAAA,EACA,UAAU;AAAA,IACR,MAAM;AAAA,IACN,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AACF;AA4CA,IAAM,eAAW;AAAA,EACf,CACE;AAAA,IACE;AAAA,IACA,OAAO;AAAA,IACP,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ,iBAAiB;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACG;AAEH,UAAM,kBAAc,sBAAM;AAC1B,UAAM,UAAU,MAAM,YAAY,WAAW;AAG7C,UAAM,CAAC,WAAW,YAAY,QAAI,yBAAS,KAAK;AAGhD,UAAM,eAAe,CAAC,UAA4C;AAChE,iBAAW,KAAK;AAAA,IAClB;AAGA,UAAM,cAAc,CAAC,UAA2C;AAC9D,mBAAa,IAAI;AACjB,YAAM,UAAU,KAAK;AAAA,IACvB;AAGA,UAAM,aAAa,CAAC,UAA2C;AAC7D,mBAAa,KAAK;AAClB,YAAM,SAAS,KAAK;AAAA,IACtB;AAGA,QAAI,eAAe,WAAW,aAAa;AAG3C,QACE,aACA,iBAAiB,aACjB,iBAAiB,YACjB;AACA,qBAAe;AAAA,IACjB;AAGA,UAAM,cAAcD,eAAa,IAAI;AAGrC,UAAM,eAAeC,eAAc,YAAY;AAG/C,UAAM,kBAAkB;AAAA,MACtB;AAAA,MACA,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,aAAa;AAAA,MACb,aAAa;AAAA,MACb;AAAA,IACF;AAEA,WACE,+CAAC,SAAI,WAAW,iBAEb;AAAA,eACC;AAAA,QAAC;AAAA;AAAA,UACC,IAAG;AAAA,UACH,SAAS;AAAA,UACT,MAAM,YAAY;AAAA,UAClB,QAAO;AAAA,UACP,OAAM;AAAA,UACN,WAAW,GAAG,UAAU,cAAc;AAAA,UAErC;AAAA;AAAA,MACH;AAAA,MAIF;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,IAAI;AAAA,UACJ;AAAA,UACA,UAAU;AAAA,UACV,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,WAAW;AAAA,UACX;AAAA,UACC,GAAG;AAAA;AAAA,MACN;AAAA,MAGC,gBACC,+CAAC,OAAE,WAAU,+DACX;AAAA,sDAAC,wCAAc,MAAM,IAAI;AAAA,QAAE;AAAA,QAAE;AAAA,SAC/B;AAAA,MAID,iBAAiB,CAAC,gBACjB,8CAAC,gBAAK,MAAK,MAAK,QAAO,UAAS,WAAU,wBACvC,yBACH;AAAA,OAEJ;AAAA,EAEJ;AACF;AAEA,SAAS,cAAc;AAEvB,IAAO,mBAAQ;A;;;;;AlB1L2C,IAAAC,uBAAA;AAJnD,IAAM,iBAAiB,CAAC,WAAqC;AAClE,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aACE,8CAAC,iBAAM,SAAQ,SAAQ,QAAO,WAAU,UAAU,8CAAC,sCAAY,GAAI,8BAEnE;AAAA,IAEJ,KAAK;AACH,aACE,8CAAC,iBAAM,SAAQ,SAAQ,QAAO,SAAQ,UAAU,8CAAC,kCAAQ,GAAI,gCAE7D;AAAA,IAEJ;AACE,aAAO;AAAA,EACX;AACF;AAEO,IAAM,kBAAkB,CAAC,mBAA4B;AAC1D,UAAQ,gBAAgB;AAAA,IACtB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,EACX;AACF;AAEA,IAAM,WAAO,2BAGX,CAAC,EAAE,UAAU,WAAW,UAAU,WAAW,GAAG,MAAM,GAAG,QAAQ;AACjE,QAAM,EAAE,WAAW,IAAI,aAAa;AAEpC,gCAAU,MAAM;AACd,eAAW,OAAO;AAAA,EACpB,GAAG,CAAC,SAAS,UAAU,CAAC;AAExB,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,EACH;AAEJ,CAAC;AAED,IAAM,uBAAmB;AAAA,EACvB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAAQ;AAChC,UAAM,EAAE,+BAA+B,mBAAmB,IACxD,aAAa;AACf,UAAM,CAAC,WAAW,YAAY,QAAI,yBAAS,KAAK;AAEhD,kCAAU,MAAM;AACd,YAAM,KAAK,mBAAmB;AAC9B,UAAI,CAAC,IAAI;AACP,qBAAa,KAAK;AAClB;AAAA,MACF;AACA,YAAM,KAAK,8BAA8B,GAAG,EAAE;AAC9C,mBAAa,IAAI,0DAA+C;AAAA,IAClE,GAAG;AAAA,MACD;AAAA,MACA;AAAA,MACA,mBAAmB,GAAG;AAAA,IACxB,CAAC;AAED,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA,YAAY,0BAA0B;AAAA,UACtC;AAAA,QACF;AAAA,QACC,GAAG;AAAA,QAEJ;AAAA,wDAAC,OAAE,WAAU,mCAAkC,uBAAS;AAAA,UACxD,8CAAC,OAAE,WAAU,yBACV,sBAAY,4BAAkB,2BACjC;AAAA;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AAEA,IAAM,gBAAY;AAAA,EAChB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAAQ;AAChC,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,IAAI,aAAa;AAEjB,UAAM,iBAAiB,kBAAkB;AACzC,UAAM,YAAY,aAAa;AAE/B,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,QACC,GAAG;AAAA,QAEJ;AAAA,yDAAC,UAAK,WAAU,mCACd;AAAA,0DAAC,OAAE,WAAU,mCAAmC,qBAAU;AAAA,YAC1D,8CAAC,OAAE,WAAU,yBACV,2BAAiB,IACd,GAAG,uBAAuB,CAAC,OAAO,cAAc,KAChD,UACN;AAAA,aACF;AAAA,UAEA,8CAAC,UAAK,WAAU,oBACd,wDAAC,iBAAM,SAAQ,YAAW,QAAO,QAAO,UAAU,8CAAC,gCAAM,GACtD,sBAAY,WAAW,WAAW,IAAI,SACzC,GACF;AAAA;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AAEA,IAAM,mBAAe;AAAA,EACnB,CAAC,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ;AAC/B,WACE,8CAAC,SAAI,WAAU,kBAAkB,GAAG,OAAO,KACzC,wDAAC,OAAE,WAAU,mCAAmC,oBAAS,GAC3D;AAAA,EAEJ;AACF;AAEA,IAAM,aAAa,MAAM;AACvB,QAAM,EAAE,oBAAoB,qBAAqB,IAAI,aAAa;AAClE,QAAM,kBAAkB,mBAAmB;AAC3C,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OACE,kBAAkB,cAAW,uBAAuB,CAAC,KAAK;AAAA,MAE5D,UAAU,iBAAiB,kBAAkB,CAAC,GAAG,OAAO,QAAQ;AAAA,MAChE,SAAS,iBAAiB,aAAa;AAAA;AAAA,EACzC;AAEJ;AAEA,IAAM,oBAAgB,2BAGpB,CAAC,EAAE,UAAU,WAAW,GAAG,MAAM,GAAG,QAAQ;AAC5C,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,EACH;AAEJ,CAAC;AAED,IAAM,kBAAc,2BAKlB,CAAC,EAAE,cAAc,MAAM;AACvB,QAAM,EAAE,mBAAmB,IAAI,aAAa;AAC5C,QAAM,kBAAkB,mBAAmB;AAC3C,QAAM,qBAGF;AAAA,IACF,gCAA0B,GAAG;AAAA,IAC7B,wCAA8B,GAAG;AAAA,IACjC,kCAA2B,GAAG;AAAA,IAC9B,0CAA+B,GAAG;AAAA,IAClC,kCAA2B,GAAG;AAAA,IAC9B,4BAAwB,GAAG;AAAA,IAC3B,sBAAqB,GAAG;AAAA,EAC1B;AAEA,QAAM,oBAAoB,kBACtB,mBAAmB,gBAAgB,YAAY,IAC/C;AAEJ,SAAO,oBACL,8CAAC,qBAAkB,eAA8B,IAC/C;AACN,CAAC;AAYD,IAAM,kBAAkB,CAAC,EAAE,cAAc,MAA4B;AACnE,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,aAAa;AACjB,QAAM,kBAAkB,mBAAmB;AAC3C,QAAM,wBAAwB;AAAA,IAC5B,iBAAiB,MAAM;AAAA,EACzB;AAEA,QAAM,gBAAgB,iBAAiB;AACvC,QAAM,eAAe,iBAAiB,SAAS,IAAI,CAAC,WAAW;AAC7D,QAAI,SAAiB;AACrB,QAAI,YAAY,UAAU;AACxB,YAAM,kBACJ,uBAAuB,SAAS,KAAK,CAAC,OAAO,GAAG,OAAO,OAAO,EAAE,GAC5D,aAAa;AAEnB,YAAM,aAAa,uBAAuB,gBAAgB;AAAA,QACxD,CAAC,mBAAmB,eAAe,aAAa,OAAO;AAAA,MACzD;AAEA,UAAI,iBAAiB;AACnB,iBAAS;AAAA,MACX,WAAW,cAAc,CAAC,iBAAiB;AACzC,iBAAS;AAAA,MACX,OAAO;AACL,iBAAS;AAAA,MACX;AAAA,IACF;AAEA,WAAO;AAAA,MACL,OAAO,OAAO;AAAA,MACd,OAAO,OAAO;AAAA,MACd;AAAA,IACF;AAAA,EACF,CAAC;AAED,MAAI,CAAC;AACH,WACE,8CAAC,SACC,wDAAC,OAAE,uCAAmB,GACxB;AAGJ,SACE,gFACE;AAAA,kDAAC,gBAAa,UAAS,gBAAe;AAAA,IAEtC,8CAAC,iBAAc,WAAW,GAAG,IAAI,aAAa,GAC5C,wDAAC,SAAI,WAAU,aACb;AAAA,MAAC;AAAA;AAAA,QACC,MAAM,YAAY,YAAY,gBAAgB;AAAA,QAE9C,MAAM,YAAY,iBAAiB,MAAM,GAAG;AAAA,QAC5C,QAAO;AAAA,QACP;AAAA,QACA,OACE,YAAY,WACR,uBAAuB,gBAAgB,CAAC,GAAG,YAAY,KACvD,eAAe,YAAY;AAAA,QAEjC,eACE,YAAY,WACR,uBAAuB,gBAAgB,CAAC,GAAG,YAAY,KACvD,eAAe,YAAY;AAAA,QAEjC,eAAe,CAAC,UAAU;AACxB,cAAI,iBAAiB;AACnB,yBAAa,gBAAgB,IAAI,KAAK;AAAA,UACxC;AAAA,QACF;AAAA;AAAA,MAlBK,YAAY,iBAAiB,MAAM,GAAG;AAAA,IAmB7C,GACF,GACF;AAAA,KACF;AAEJ;AAEA,IAAM,qBAAqB,CAAC,EAAE,cAAc,MAA4B;AACtE,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,aAAa;AACjB,QAAM,kBAAkB,mBAAmB;AAC3C,QAAM,oBAAoB,oBAAoB;AAC9C,QAAM,wBAAwB;AAAA,IAC5B,iBAAiB,MAAM;AAAA,EACzB;AAEA,QAAM,4BAAwB,uBAAiB,CAAC,CAAC;AACjD,QAAM,wBAAoB,uBAAe,EAAE;AAG3C,QAAM,0BAAsB,wBAAQ,MAAM;AACxC,WAAO,mBAAmB,IAAI,CAAC,WAAW,OAAO,QAAQ,KAAK,CAAC;AAAA,EACjE,GAAG,CAAC,iBAAiB,CAAC;AAGtB,QAAM,qBAAiB,wBAAQ,MAAM;AACnC,WAAO,qBAAqB,OAAO,CAAC,OAAqB,OAAO,IAAI,KAAK,CAAC;AAAA,EAC5E,GAAG,CAAC,mBAAmB,CAAC;AAGxB,QAAM,2BAAuB,wBAAQ,MAAM;AACzC,UAAM,oBAAoB,iBAAiB,MAAM;AACjD,UAAM,qBAAqB,kBAAkB,YAAY;AAEzD,QAAI,oBAAoB;AACtB,wBAAkB,UAAU;AAC5B,4BAAsB,UAAU;AAChC,aAAO;AAAA,IACT;AAGA,UAAM,mBACJ,KAAK,UAAU,sBAAsB,OAAO,MAC5C,KAAK,UAAU,cAAc;AAC/B,QAAI,kBAAkB;AACpB,4BAAsB,UAAU;AAChC,aAAO;AAAA,IACT;AAEA,QAAI,WAAW,UAAU;AACvB,aACE,uBAAuB,gBAAgB,IAAI,CAAC,OAAO,GAAG,QAAQ,KAAK,CAAC;AAAA,IAExE,OAAO;AACL,aAAO,sBAAsB;AAAA,IAC/B;AAAA,EACF,GAAG;AAAA,IACD;AAAA,IACA,iBAAiB;AAAA,IACjB;AAAA,IACA,uBAAuB;AAAA,EACzB,CAAC;AAGD,QAAM,2BAAuB;AAAA,IAC3B,CAAC,WAAqB;AACpB,UAAI,iBAAiB;AACnB,6BAAqB,gBAAgB,IAAI,MAAM;AAAA,MACjD;AAAA,IACF;AAAA,IACA,CAAC,iBAAiB,oBAAoB;AAAA,EACxC;AAGA,QAAM,kBAAc;AAAA,IAClB,MAAM,YAAY,iBAAiB,MAAM,GAAG;AAAA,IAC5C,CAAC,iBAAiB,EAAE;AAAA,EACtB;AACA,QAAM,UAAU,iBAAiB,SAAS,IAAI,CAAC,WAAW;AACxD,QAAI,SAAiB;AAErB,QAAI,YAAY,UAAU;AACxB,YAAM,kBACJ,uBAAuB,SAAS,KAAK,CAAC,OAAO,GAAG,OAAO,OAAO,EAAE,GAC5D,aAAa;AAEnB,YAAM,aAAa,uBAAuB,iBAAiB;AAAA,QACzD,CAAC,OAAO,GAAG,aAAa,OAAO;AAAA,MACjC;AAEA,UAAI,iBAAiB;AACnB,iBAAS;AAAA,MACX,WAAW,cAAc,CAAC,iBAAiB;AACzC,iBAAS;AAAA,MACX,OAAO;AACL,iBAAS;AAAA,MACX;AAAA,IACF;AAEA,WAAO;AAAA,MACL,OAAO,OAAO;AAAA,MACd,OAAO,OAAO;AAAA,MACd;AAAA,IACF;AAAA,EACF,CAAC;AAED,MAAI,CAAC;AACH,WACE,8CAAC,SACC,wDAAC,OAAE,6CAAyB,GAC9B;AAEJ,SACE,gFACE;AAAA,kDAAC,gBAAa,UAAS,gBAAe;AAAA,IAEtC,8CAAC,iBAAc,WAAW,GAAG,IAAI,aAAa,GAC5C,wDAAC,SAAI,WAAU,aACb;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QAEA,MAAM;AAAA,QACN,gBAAgB;AAAA,QAChB,wBAAwB;AAAA,QACxB,MAAM,YAAY,YAAY,gBAAgB;AAAA;AAAA,MAJzC;AAAA,IAKP,GACF,GACF;AAAA,KACF;AAEJ;AAEA,IAAM,mBAAmB,CAAC,EAAE,cAAc,MAA4B;AACpE,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,aAAa;AAEjB,QAAM,kBAAkB,mBAAmB;AAC3C,QAAM,wBAAwB;AAAA,IAC5B,iBAAiB,MAAM;AAAA,EACzB;AAEA,QAAM,gBAAgB,iBAAiB;AACvC,QAAM,kBAAc,uBAA4B,IAAI;AAEpD,QAAM,qBAAqB,CAAC,UAAkB;AAC5C,QAAI,iBAAiB;AACnB,+BAAyB,gBAAgB,IAAI,KAAK;AAAA,IACpD;AAAA,EACF;AAGA,QAAM,2BAAuB,4BAAY,MAAM;AAC7C,QAAI,YAAY,SAAS;AACvB,kBAAY,QAAQ,MAAM,SAAS;AACnC,YAAM,eAAe,YAAY,QAAQ;AACzC,YAAM,YAAY;AAClB,YAAM,YAAY;AAClB,YAAM,YAAY,KAAK,IAAI,KAAK,IAAI,cAAc,SAAS,GAAG,SAAS;AACvE,kBAAY,QAAQ,MAAM,SAAS,GAAG,SAAS;AAAA,IACjD;AAAA,EACF,GAAG,CAAC,CAAC;AAGL,gCAAU,MAAM;AACd,yBAAqB;AAAA,EACvB,GAAG,CAAC,eAAe,oBAAoB,CAAC;AAExC,MAAI,CAAC,iBAAiB;AACpB,WACE,8CAAC,SAAI,WAAU,aACb,wDAAC,OAAE,WAAU,yBAAwB,8CAA0B,GACjE;AAAA,EAEJ;AAEA,QAAM,eACH,WAAW,WACR,uBAAuB,SACvB,eAAe,WAAW;AAChC,SACE,gFACE;AAAA,kDAAC,gBAAa,UAAS,YAAW;AAAA,IAElC,8CAAC,iBAAc,WAAW,GAAG,WAAW,YAAY,aAAa,GAC/D,wDAAC,SAAI,WAAU,2CACZ,sBAAY,YACX,8CAAC,SAAI,WAAU,aACb;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,aAAY;AAAA,QACZ,OAAO;AAAA,QACP,UAAU,CAAC,MAAM,mBAAmB,EAAE,OAAO,KAAK;AAAA,QAClD,MAAM;AAAA,QACN,WAAU;AAAA;AAAA,IACZ,GACF,IAEA,8CAAC,SAAI,WAAU,aACb,wDAAC,OAAE,WAAU,6CACV,yBAAe,8BAClB,GACF,GAEJ,GACF;AAAA,IAEC,YAAY,YACX,uBAAuB,iEAErB,gFACE;AAAA,oDAAC,gBAAa,UAAS,iCAA0B;AAAA,MAEjD,8CAAC,iBAAc,WAAW,GAAG,IAAI,aAAa,GAC5C,wDAAC,OAAE,WAAU,6CAA4C,kwEAuCzD,GACF;AAAA,OACF;AAAA,KAEN;AAEJ;AAEA,IAAM,kBAAkB,CAAC,EAAE,cAAc,MAA4B;AACnE,QAAM,EAAE,QAAQ,IAAI,aAAa;AACjC,QAAM,UAAU;AAAA,IACd;AAAA,MACE,OAAO;AAAA,MACP,WAAW;AAAA,IACb;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,WAAW;AAAA,IACb;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,WAAW;AAAA,IACb;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,WAAW;AAAA,IACb;AAAA,EACF;AAEA,QAAM,mBAAmB,CAAC,UAAkB,OAAO,aAAa,KAAK,KAAK;AAE1E,QAAM,mBAAmB,WAAW;AAEpC,SACE,gFACE;AAAA,kDAAC,gBAAa,UAAS,gBAAe;AAAA,IAEtC,8CAAC,iBAAc,WAAW,GAAG,IAAI,aAAa,GAC5C,wDAAC,SAAI,WAAU,yBACZ,kBAAQ,IAAI,CAAC,QAAQ,UAAU;AAC9B,YAAM,iBAAiB,OAAO,YAAY,YAAY;AACtD,aACE;AAAA,QAAC;AAAA;AAAA,UAEC,WAAU;AAAA,UAEV;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,WAAW;AAAA,kBACT;AAAA,kBACA,CAAC,mBAAmB,gBAAgB,cAAc,IAAI;AAAA,gBACxD;AAAA,gBAEA;AAAA,gEAAC,OAAE,WAAU,yBACV,2BAAiB,KAAK,EAAE,OAAO,IAAI,EAAE,OAAO,OAAO,KAAK,GAC3D;AAAA,kBAEC,mBACC,+CAAC,kBAAO,MAAK,UACX;AAAA,kEAAC,iBAAc,WAAU,aACvB,wDAAC,eAAY,aAAY,sBAAkB,GAC7C;AAAA,oBAEA,+CAAC,iBACC;AAAA,oEAAC,cAAW,OAAM,KAAI,wBAAU;AAAA,sBAChC,8CAAC,cAAW,OAAM,KAAI,mBAAK;AAAA,uBAC7B;AAAA,qBACF,IAEA,8CAAC,SAAI,WAAU,iBACZ,yBAAe,cAAc,GAChC;AAAA;AAAA;AAAA,YAEJ;AAAA,YAEC,CAAC,oBACA,+CAAC,UAAK,WAAU,oCACd;AAAA,4DAAC,OAAE,WAAU,0BAAyB,qCAEtC;AAAA,cACC,CAAC,OAAO,aACP,8CAAC,OAAE,WAAU,0BAAyB,iCAEtC;AAAA,eAEJ;AAAA;AAAA;AAAA,QAzCG,OAAO,MAAM,OAAO,IAAI,KAAK,EAAE;AAAA,MA2CtC;AAAA,IAEJ,CAAC,GACH,GACF;AAAA,KACF;AAEJ;AASA,IAAM,kBAAkB,CAAC,EAAE,cAAc,MAA4B;AACnE,QAAM,EAAE,QAAQ,IAAI,aAAa;AACjC,QAAM,cAAc;AAAA,IAClB,EAAE,OAAO,cAAQ;AAAA,IACjB,EAAE,OAAO,OAAO;AAAA,IAChB,EAAE,OAAO,QAAQ;AAAA,IACjB,EAAE,OAAO,QAAQ;AAAA,EACnB;AAEA,QAAM,UAAU;AAAA,IACd;AAAA,MACE,OAAO;AAAA,MACP,eAAe;AAAA,IACjB;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,eAAe;AAAA,IACjB;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,eAAe;AAAA,IACjB;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,eAAe;AAAA,IACjB;AAAA,EACF;AAEA,QAAM,kBAAkB;AAAA,IACtB;AAAA,MACE,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,eAAe;AAAA,MACf,WAAW;AAAA,IACb;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,eAAe;AAAA,MACf,WAAW;AAAA,IACb;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,eAAe;AAAA,MACf,WAAW;AAAA,IACb;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,eAAe;AAAA,MACf,WAAW;AAAA,IACb;AAAA,EACF;AAEA,QAAM,CAAC,aAAa,cAAc,QAAI,yBAAuB,MAAM;AACjE,QAAI,YAAY,UAAU;AACxB,aAAO;AAAA,IACT;AACA,WAAO,QAAQ,IAAI,CAAC,YAAY;AAAA,MAC9B,QAAQ,OAAO;AAAA,MACf,WAAW;AAAA,MACX,eAAe,OAAO;AAAA,MACtB,WAAW;AAAA,IACb,EAAE;AAAA,EACJ,CAAC;AAED,QAAM,kBAAkB,CAAC,aAAqB,aAAqB;AACjE,mBAAe,CAAC,SAAS;AACvB,YAAM,OAAO,CAAC,GAAG,IAAI;AACrB,YAAM,EAAE,OAAO,aAAa,cAAc,IAAI,QAAQ,WAAW;AACjE,WAAK,WAAW,IAAI;AAAA,QAClB,QAAQ;AAAA,QACR,WAAW;AAAA,QACX;AAAA,QACA,WAAW,WAAW,aAAa,gBAAgB;AAAA,MACrD;AACA,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAEA,QAAM,mBAAmB,CAAC,UAAkB,OAAO,aAAa,KAAK,KAAK;AAE1E,QAAM,mBAAmB,YAAY;AACrC,QAAM,eAAe,IAAI;AAAA,IACvB,YAAY,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,OAAO;AAAA,EACpD;AAEA,SACE,gFACE;AAAA,kDAAC,gBAAa,UAAS,gBAAe;AAAA,IAEtC,8CAAC,iBAAc,WAAW,GAAG,IAAI,aAAa,GAC5C,wDAAC,SAAI,WAAU,yBACZ,kBAAQ,IAAI,CAAC,QAAQ,UAAU;AAC9B,YAAM,SAAS,YAAY,KAAK;AAChC,YAAM,iBAAiB,OAAO,YAAY,YAAY;AACtD,aACE,+CAAC,aAA2B,WAAU,uBACpC;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACA,CAAC,mBAAmB,gBAAgB,cAAc,IAAI;AAAA,YACxD;AAAA,YAEA;AAAA,4DAAC,OAAE,WAAU,yBACV,2BAAiB,KAAK,IAAI,OAAO,OAAO,OAC3C;AAAA,cAEC,mBACC;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,OAAO,OAAO,aAAa;AAAA,kBAC3B,eAAe,CAAC,UAAU,gBAAgB,OAAO,KAAK;AAAA,kBAEtD;AAAA,kEAAC,iBAAc,WAAU,aACvB,wDAAC,eAAY,aAAY,yBAAkB,GAC7C;AAAA,oBAEA,8CAAC,iBACE,sBACE;AAAA,sBACC,CAAC,QACC,CAAC,aAAa,IAAI,IAAI,KAAK,KAC3B,OAAO,cAAc,IAAI;AAAA,oBAC7B,EACC,IAAI,CAAC,QACJ,8CAAC,cAA2B,OAAO,IAAI,OACpC,cAAI,SADU,IAAI,KAErB,CACD,GACL;AAAA;AAAA;AAAA,cACF,IAEA,8CAAC,SAAI,WAAU,iBACZ,iBAAO,cAAc,OAClB,OACA,eAAe,cAAc,GACnC;AAAA;AAAA;AAAA,QAEJ;AAAA,QAEC,CAAC,oBACA,+CAAC,UAAK,WAAU,oCACd;AAAA,yDAAC,OAAE,WAAU,0BAAyB;AAAA;AAAA,YACb,OAAO,aAAa;AAAA,aAC7C;AAAA,UACC,CAAC,OAAO,aACP,+CAAC,OAAE,WAAU,0BAAyB;AAAA;AAAA,YACjB,OAAO;AAAA,aAC5B;AAAA,WAEJ;AAAA,WAtDU,OAAO,KAwDrB;AAAA,IAEJ,CAAC,GACH,GACF;AAAA,KACF;AAEJ;AASA,IAAM,WAAW,CAAC,EAAE,cAAc,MAA4B;AAC5D,QAAM,EAAE,QAAQ,IAAI,aAAa;AACjC,QAAM,UAAU;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,cAAc;AAAA;AAAA;AAKpB,QAAM,kBAAoC;AAAA,IACxC;AAAA,MACE,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,WAAW;AAAA,IACb;AAAA,IACA;AAAA,MACE,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,WAAW;AAAA,IACb;AAAA,IACA;AAAA,MACE,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,WAAW;AAAA,IACb;AAAA,IACA;AAAA,MACE,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,WAAW;AAAA,IACb;AAAA,IACA;AAAA,MACE,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,WAAW;AAAA,IACb;AAAA,EACF;AAEA,QAAM,CAAC,SAAS,UAAU,QAAI,yBAAiC,CAAC,CAAC;AACjE,QAAM,aAAS,sBAAM;AAGrB,QAAM,+BAA+B,CAAC,aAAqB;AACzD,UAAM,cAAc,OAAO,QAAQ,OAAO,EACvC,OAAO,CAAC,CAAC,GAAG,MAAM,QAAQ,QAAQ,EAClC,IAAI,CAAC,CAAC,EAAE,KAAK,MAAM,KAAK;AAE3B,WAAO,QAAQ,OAAO,CAAC,WAAW,CAAC,YAAY,SAAS,MAAM,CAAC;AAAA,EACjE;AAEA,QAAM,qBAAqB,CAAC,UAAkB,UAAkB;AAC9D,UAAM,aAAa,EAAE,GAAG,SAAS,CAAC,QAAQ,GAAG,MAAM;AACnD,eAAW,UAAU;AAAA,EACvB;AAEA,QAAM,0BAA0B,CAAC,aAAqB;AACpD,UAAM,aAAa,gBAAgB;AAAA,MACjC,CAAC,WAAW,OAAO,aAAa;AAAA,IAClC;AAEA,WACE,8CAAC,OAAE,WAAU,2FACV,sBAAY,eACf;AAAA,EAEJ;AAEA,QAAM,uBAAuB,CAC3B,UACA,YACA,eACA,kCACG;AACH,WACE;AAAA,MAAC;AAAA;AAAA,QAEC,OAAO;AAAA,QACP,eAAe,CAAC,UAAU,mBAAmB,UAAU,KAAK;AAAA,QAC5D,WAAU;AAAA,QAEV;AAAA,wDAAC,iBAAc,WAAU,sEACvB,wDAAC,eAAY,aAAY,yBAAkB,GAC7C;AAAA,UACA,8CAAC,iBACE,wCAA8B,IAAI,CAAC,QAAQ,UAC1C,8CAAC,cAAsC,OAAO,QAC3C,oBADc,GAAG,MAAM,IAAI,KAAK,EAEnC,CACD,GACH;AAAA;AAAA;AAAA,MAdK,GAAG,QAAQ,IAAI,UAAU;AAAA,IAehC;AAAA,EAEJ;AAEA,QAAM,sBAAsB,CAAC,aAAqB;AAChD,UAAM,aAAa,gBAAgB;AAAA,MACjC,CAAC,WAAW,OAAO,aAAa;AAAA,IAClC;AAEA,QAAI,CAAC,WAAY,QAAO;AAExB,UAAM,SAAS,WAAW,YAAY,YAAY;AAClD,UAAM,OAAO,WAAW,YAAY,8CAAC,sCAAY,IAAK,8CAAC,kCAAQ;AAE/D,WACE;AAAA,MAAC;AAAA;AAAA,QAEC,SAAQ;AAAA,QACR;AAAA,QACA,WAAW;AAAA,QACX,MAAK;AAAA,QACL,WAAU;AAAA,QAEV,wDAAC,UAAK,WAAU,iBAAiB,qBAAW,YAAW;AAAA;AAAA,MAPlD;AAAA,IAQP;AAAA,EAEJ;AAEA,QAAM,wBAAwB,CAAC,MAAc,iBAA2B;AACtE,UAAM,WAA+D,CAAC;AACtE,QAAI,YAAY;AAChB,QAAI,iBAAiB;AAGrB,UAAM,QAAQ;AACd,QAAI;AAEJ,YAAQ,QAAQ,MAAM,KAAK,IAAI,OAAO,MAAM;AAC1C,YAAM,CAAC,WAAW,QAAQ,IAAI;AAC9B,YAAM,aAAa,MAAM;AAEzB,UAAI,aAAa,WAAW;AAC1B,iBAAS,KAAK;AAAA,UACZ,SAAS,KAAK,MAAM,WAAW,UAAU;AAAA,UACzC,IAAI,GAAG,MAAM,SAAS,EAAE,cAAc;AAAA,QACxC,CAAC;AAAA,MACH;AAEA,YAAM,gBAAgB,QAAQ,QAAQ;AACtC,YAAM,gCACJ,6BAA6B,QAAQ;AAEvC,UAAI,cAAc;AAChB,iBAAS,KAAK;AAAA,UACZ,SAAS,wBAAwB,QAAQ;AAAA,UACzC,IAAI,GAAG,MAAM,eAAe,EAAE,cAAc;AAAA,QAC9C,CAAC;AAAA,MACH,WAAW,YAAY,WAAW;AAChC,iBAAS,KAAK;AAAA,UACZ,SAAS;AAAA,YACP;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,IAAI,GAAG,MAAM,WAAW,EAAE,cAAc;AAAA,QAC1C,CAAC;AAAA,MACH,OAAO;AACL,cAAM,gBAAgB,oBAAoB,QAAQ;AAClD,YAAI,eAAe;AACjB,mBAAS,KAAK;AAAA,YACZ,SAAS;AAAA,YACT,IAAI,GAAG,MAAM,WAAW,EAAE,cAAc;AAAA,UAC1C,CAAC;AAAA,QACH;AAAA,MACF;AAEA,kBAAY,MAAM,QAAQ,UAAU;AAAA,IACtC;AAEA,QAAI,YAAY,KAAK,QAAQ;AAC3B,eAAS,KAAK;AAAA,QACZ,SAAS,KAAK,MAAM,SAAS;AAAA,QAC7B,IAAI,GAAG,MAAM,SAAS,EAAE,cAAc;AAAA,MACxC,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAEA,SACE,gFACE;AAAA,kDAAC,gBAAa,UAAS,gBAAe;AAAA,IAEtC,8CAAC,iBAAc,WAAU,eACvB,wDAAC,SAAI,WAAU,yBACb;AAAA,MAAC;AAAA;AAAA,QACC,WAAW;AAAA,UACT;AAAA,UACA,WAAW,YAAY;AAAA,QACzB;AAAA,QAEC,gCAAsB,WAAW,EAAE,IAAI,CAAC,YACvC,8CAAC,UAAuB,kBAAQ,WAArB,QAAQ,EAAqB,CACzC;AAAA;AAAA,IACH,GACF,GACF;AAAA,IAEC,YAAY,YACX,gFACE;AAAA,oDAAC,gBAAa,UAAS,aAAY;AAAA,MAEnC,8CAAC,iBAAc,WAAU,eACvB,wDAAC,SAAI,WAAU,kBACb;AAAA,QAAC;AAAA;AAAA,UACC,WAAW,GAAG,mCAAmC,aAAa;AAAA,UAE7D,gCAAsB,aAAa,IAAI,EAAE,IAAI,CAAC,YAC7C,8CAAC,UAAuB,kBAAQ,WAArB,QAAQ,EAAqB,CACzC;AAAA;AAAA,MACH,GACF,GACF;AAAA,OACF;AAAA,KAEJ;AAEJ;AAEA,IAAM,oBAAoB,CAAC,EAAE,cAAc,MAA4B;AACrE,QAAM,EAAE,QAAQ,IAAI,aAAa;AACjC,QAAM,0BAA0B,EAAE,GAAG,MAAM,GAAG,KAAK;AAGnD,QAAM,iCAAiC,MAAc;AAGnD,UAAM,sBAAsB;AAC5B,UAAM,uBAAuB;AAG7B,UAAM,iBAAiB,sBAAsB,wBAAwB;AAGrE,UAAM,YAAY;AAElB,WAAO,gBAAgB;AAAA,EACzB;AAEA,QAAM,wBAAwB,+BAA+B;AAC7D,QAAM,yBAAyB,EAAE,GAAG,MAAM,GAAG,MAAM;AAEnD,QAAM,CAAC,uBAAuB,wBAAwB,QAAI,yBAGhD,WAAW,WAAW,yBAAyB,IAAI;AAG7D,QAAM,+BAA+B,CACnC,GACA,GACA,SAC6B;AAE7B,UAAM,YAAY,KAAK,IAAI,KAAK,OAAO,IAAK;AAC5C,UAAM,aAAa,KAAK,IAAI,KAAK,QAAQ,IAAK;AAG9C,UAAM,YAAY,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,IAAI,SAAS,CAAC;AACxD,UAAM,YAAY,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,IAAI,UAAU,CAAC;AAEzD,WAAO,EAAE,GAAG,WAAW,GAAG,UAAU;AAAA,EACtC;AAEA,QAAM,mBAAmB,CAAC,UAAyC;AACjE,QAAI,YAAY,SAAU;AAE1B,UAAM,OAAO,MAAM,cAAc,sBAAsB;AACvD,UAAM,IAAI,MAAM,UAAU,KAAK;AAC/B,UAAM,IAAI,MAAM,UAAU,KAAK;AAG/B,UAAM,mBAAmB,6BAA6B,GAAG,GAAG,IAAI;AAChE,6BAAyB,gBAAgB;AAAA,EAC3C;AAEA,QAAM,yBAAyB,MAAM;AACnC,QAAI,YAAY,SAAU;AAE1B,6BAAyB,EAAE,GAAG,KAAK,GAAG,IAAI,CAAC;AAAA,EAC7C;AAEA,QAAM,YAAY,MAAM;AACtB,QAAI,CAAC,sBAAuB,QAAO;AAEnC,UAAM,WAAW,KAAK;AAAA,MACpB,KAAK,IAAI,sBAAsB,IAAI,wBAAwB,GAAG,CAAC,IAC7D,KAAK,IAAI,sBAAsB,IAAI,wBAAwB,GAAG,CAAC;AAAA,IACnE;AAEA,WAAO,YAAY;AAAA,EACrB;AAEA,QAAM,4BAA4B,MAAM;AACtC,QAAI,YAAY,WAAW;AACzB,aAAO;AAAA,IACT;AAEA,QAAI,YAAY,UAAU;AACxB,aAAO,UAAU,IACb,mCACA;AAAA,IACN;AAEA,WAAO;AAAA,EACT;AAEA,SACE,gFACE;AAAA,kDAAC,gBAAa,UAAS,6BAAyB;AAAA,IAEhD,8CAAC,iBAAc,WAAW,GAAG,IAAI,aAAa,GAC5C;AAAA,MAAC;AAAA;AAAA,QACC,eAAY;AAAA,QACZ,WAAU;AAAA,QAET;AAAA,qBAAW,YACV;AAAA,YAAC;AAAA;AAAA,cACC,eAAY;AAAA,cACZ,WAAU;AAAA,cAEV;AAAA,+DAAC,SAAI,WAAU,2BACb;AAAA,gEAAC,SAAI,WAAU,wEAAuE;AAAA,kBACtF,8CAAC,UAAK,WAAU,qCAAoC,6BAEpD;AAAA,mBACF;AAAA,gBACA,+CAAC,SAAI,WAAU,2BACb;AAAA,gEAAC,SAAI,WAAU,8DAA6D;AAAA,kBAC5E,8CAAC,UAAK,WAAU,qCAAoC,8BAEpD;AAAA,mBACF;AAAA,gBACA,+CAAC,SAAI,WAAU,2BACb;AAAA,gEAAC,SAAI,WAAU,kEAAiE;AAAA,kBAChF,8CAAC,UAAK,WAAU,qCAAoC,gCAEpD;AAAA,mBACF;AAAA;AAAA;AAAA,UACF;AAAA,UAGF;AAAA,YAAC;AAAA;AAAA,cACC,eAAY;AAAA,cACZ,MAAK;AAAA,cACL,WAAU;AAAA,cACV,SAAS;AAAA,cACT,WAAW,CAAC,MAAM;AAChB,oBAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AACtC,oBAAE,eAAe;AACjB,yCAAuB;AAAA,gBACzB;AAAA,cACF;AAAA,cACA,cAAW;AAAA,cAEX;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,eAAY;AAAA,oBACZ,KAAK;AAAA,oBACL,KAAI;AAAA,oBACJ,WAAU;AAAA;AAAA,gBACZ;AAAA,gBAGC,YAAY,YACX;AAAA,kBAAC;AAAA;AAAA,oBACC,eAAY;AAAA,oBACZ,WAAU;AAAA,oBACV,OAAO;AAAA,sBACL,UAAU;AAAA,sBACV,UAAU;AAAA,sBACV,OAAO;AAAA,sBACP,aAAa;AAAA,sBACb,MAAM,QAAQ,wBAAwB,IAAI,GAAG;AAAA,sBAC7C,KAAK,QAAQ,wBAAwB,IAAI,GAAG;AAAA,oBAC9C;AAAA;AAAA,gBACF;AAAA,gBAID,yBACC;AAAA,kBAAC;AAAA;AAAA,oBACC,eAAY;AAAA,oBACZ,WAAW,sDAAsD,0BAA0B,CAAC;AAAA,oBAC5F,OAAO;AAAA,sBACL,UAAU;AAAA,sBACV,UAAU;AAAA,sBACV,OAAO;AAAA,sBACP,aAAa;AAAA,sBACb,MAAM,QAAQ,sBAAsB,IAAI,GAAG;AAAA,sBAC3C,KAAK,QAAQ,sBAAsB,IAAI,GAAG;AAAA,oBAC5C;AAAA;AAAA,gBACF;AAAA;AAAA;AAAA,UAEJ;AAAA;AAAA;AAAA,IACF,GACF;AAAA,KACF;AAEJ;AAEA,IAAM,mBAAmB,CAAC;AAAA,EACxB,aAAa;AAAA,EACb;AACF,IAGI,CAAC,MAAM;AACT,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,aAAa;AAEjB,QAAM,mBAAmB,6BAA6B;AACtD,QAAM,oBAAoB,CAAC,eAAuB;AAChD,WAAO,iCAAiC,UAAU;AAAA,EACpD;AAEA,QAAM,2BAA2B,OAAO,QAAQ,gBAAgB,EAAE;AAAA,IAChE,CAAC,KAAK,CAAC,WAAW,SAAS,MAAM;AAC/B,YAAM,oBAAoB,UAAU,OAAO,CAAC,aAAa;AACvD,cAAM,SAAS,kBAAkB,SAAS,EAAE;AAE5C,gBAAQ,YAAY;AAAA,UAClB,KAAK;AACH,mBAAO,WAAW;AAAA,UACpB,KAAK;AACH,mBAAO,WAAW;AAAA,UACpB;AACE,mBAAO;AAAA,QACX;AAAA,MACF,CAAC;AAED,UAAI,kBAAkB,SAAS,GAAG;AAChC,YAAI,SAAS,IAAI;AAAA,MACnB;AAEA,aAAO;AAAA,IACT;AAAA;AAAA,IAEA,CAAC;AAAA,EACH;AAEA,QAAM,iBAAiB,CAAC,WAAmB;AACzC,YAAQ,QAAQ;AAAA,MACd,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT;AACE,eAAO;AAAA,IACX;AAAA,EACF;AACA,SACE,8CAAC,SAAI,WAAU,kBACZ,iBAAO,QAAQ,wBAAwB,EAAE;AAAA,IACxC,CAAC,CAAC,WAAW,SAAS,MACpB,+CAAC,aAAwB,WAAU,uBACjC;AAAA,qDAAC,UAAK,WAAU,iCACd;AAAA,sDAAC,SAAI,WAAU,kEACb,wDAAC,mCAAS,MAAM,IAAI,WAAU,cAAa,GAC7C;AAAA,QACA,8CAAC,OAAE,WAAU,mCACV,sBAAY,CAAC,GAAG,kBAAkB,CAAC,GAAG,SAAS,QAC9C,kBACJ;AAAA,SACF;AAAA,MAEA,8CAAC,QAAG,WAAU,uBACX,oBAAU,IAAI,CAAC,aAAa;AAC3B,cAAM,SAAS,kBAAkB,SAAS,EAAE;AAC5C,cAAM,iBAAiB,iBAAiB,SAAS,EAAE;AAEnD,eACE;AAAA,UAAC;AAAA;AAAA,YAEC,QAAQ,cAAW,eAAe,SAAS,EAAE,SAAS,GAAG,GAAG,CAAC;AAAA,YAC7D,OAAO,eAAe,MAAM;AAAA,YAC5B,SAAS,MAAM;AACb,2BAAa,iBAAiB,CAAC;AAC/B,gCAAkB;AAAA,YACpB;AAAA;AAAA,UANK,SAAS;AAAA,QAOhB;AAAA,MAEJ,CAAC,GACH;AAAA,SA5BY,SA6Bd;AAAA,EAEJ,GACF;AAEJ;AAEA,IAAM,iBAAa;AAAA,EAUjB,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACG;AACH,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,IAAI,aAAa;AAEjB,UAAM,iBAAiB,kBAAkB;AACzC,UAAM,kBAAkB,yBAAyB;AACjD,UAAM,iBAAiB,yBAAyB,iBAAiB;AACjE,UAAM,gBAAgB,iBAAiB;AACvC,UAAM,kBAAkB,mBAAmB;AAC3C,UAAM,2BAA2B,kBAC7B,iCAAiC,gBAAgB,EAAE,MAAM,YACzD;AACJ,UAAM,CAAC,iBAAiB,kBAAkB,QAAI,yBAAS,KAAK;AAC5D,UAAM,CAAC,iBAAiB,kBAAkB,QAAI,yBAAS,KAAK;AAC5D,UAAM,CAAC,mBAAmB,oBAAoB,QAAI,yBAAS,KAAK;AAChE,UAAM,CAAC,qBAAqB,sBAAsB,QAAI,yBAAS,KAAK;AACpE,UAAM,CAAC,YAAY,aAAa,QAAI,yBAA6B,MAAS;AAC1E,UAAM,sBAAsB,sCAAsC;AAClE,UAAM,eAAe,kBAAkB;AAEvC,UAAM,mBAAmB,YAAY;AACnC,UAAI,oBAAoB,SAAS,GAAG;AAClC,2BAAmB,IAAI;AACvB;AAAA,MACF;AAEA,UAAI;AACF,YAAI,uBAAuB;AACzB,gBAAM,QAAQ,QAAQ,sBAAsB,CAAC;AAAA,QAC/C;AACA,2BAAmB,IAAI;AAAA,MACzB,SAAS,KAAK;AACZ,gBAAQ,MAAM,iCAAiC,GAAG;AAClD;AAAA,MACF;AAAA,IACF;AAEA,UAAM,oBAAoB,YAAY;AACpC,UAAI;AACF,YAAI,uBAAuB;AACzB,gBAAM,QAAQ,QAAQ,sBAAsB,CAAC;AAAA,QAC/C;AACA,2BAAmB,IAAI;AACvB,2BAAmB,KAAK;AAAA,MAC1B,SAAS,KAAK;AACZ,gBAAQ,MAAM,iCAAiC,GAAG;AAClD,2BAAmB,KAAK;AACxB;AAAA,MACF;AAAA,IACF;AAEA,WACE,gFACE;AAAA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,WAAW;AAAA,YACT;AAAA,YACA;AAAA,UACF;AAAA,UACC,GAAG;AAAA,UAEH,sBAAY,YACX,gFACE;AAAA,2DAAC,SAAI,WAAU,oCACb;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAM,8CAAC,sCAAY,MAAM,IAAI,WAAU,iBAAgB;AAAA,kBACvD,MAAK;AAAA,kBACL,SAAS,MAAM,qBAAqB,IAAI;AAAA;AAAA,cAC1C;AAAA,cAEC,kBACC;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAQ;AAAA,kBACR,MAAK;AAAA,kBACL,SAAS,MAAM;AACb,iCAAa;AACb,qCAAiB;AAAA,kBACnB;AAAA,kBACD;AAAA;AAAA,cAED,IAEA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,SAAQ;AAAA,kBACR,QAAO;AAAA,kBACP,UAAU,8CAAC,oCAAU,MAAM,IAAI;AAAA,kBAC/B,SAAS,MAAM;AACb,yCAAqB;AAAA,kBACvB;AAAA,kBACD;AAAA;AAAA,cAED;AAAA,eAEJ;AAAA,YAEC,CAAC,mBACA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAAQ;AAAA,gBACR,QAAO;AAAA,gBACP,SAAS,MAAM;AACb,+BAAa;AACb,mCAAiB;AAAA,gBACnB;AAAA,gBACD;AAAA;AAAA,YAED;AAAA,YAGD,iBACC;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAAQ;AAAA,gBACR,QAAO;AAAA,gBACP,UAAU,CAAC,iBAAiB,CAAC;AAAA,gBAC7B,SAAS;AAAA,gBACV;AAAA;AAAA,YAED,IAEA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAAQ;AAAA,gBACR,QAAO;AAAA,gBACP,WAAW,8CAAC,qCAAW,MAAM,IAAI;AAAA,gBACjC,UAAU,CAAC,iBAAiB,CAAC;AAAA,gBAC7B,SAAS,MAAM;AACb,mCAAiB;AAAA,gBACnB;AAAA,gBACD;AAAA;AAAA,YAED;AAAA,aAEJ,IAEA,8CAAC,SAAI,WAAU,iDACb;AAAA,YAAC;AAAA;AAAA,cACC,SAAQ;AAAA,cACR,QAAO;AAAA,cACP,MAAK;AAAA,cACL,SAAS,MAAM,uBAAuB,IAAI;AAAA,cAC3C;AAAA;AAAA,UAED,GACF;AAAA;AAAA,MAEJ;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,OAAM;AAAA,UACN,aACE,oBAAoB,SAAS,IACzB,iCAA2B,oBAAoB,KAAK,IAAI,CAAC,iEACzD;AAAA,UAEN,mBAAkB;AAAA,UAClB,mBAAkB;AAAA,UAClB,UAAU;AAAA;AAAA,MACZ;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,QAAQ;AAAA,UACR,SAAS,MAAM,mBAAmB,KAAK;AAAA,UACvC,OAAM;AAAA,UACN,sBAAsB;AAAA,UACtB,eAAe;AAAA,UACf,iBAAe;AAAA,UACf,MAAM;AAAA,UAEN,yDAAC,SAAI,WAAU,iEACZ;AAAA,mCACC,8CAAC,SAAI,WAAU,oBAAoB,gCAAqB,IAExD,8CAAC,SAAI,WAAU,+EACb,wDAAC,UAAK,WAAU,yBAAwB,iCAExC,GACF;AAAA,YAEF,+CAAC,SAAI,WAAU,mCACb;AAAA,4DAAC,QAAG,WAAU,mCAAkC,0CAEhD;AAAA,cACA,+CAAC,OAAE,WAAU,yBAAwB;AAAA;AAAA,gBACtB;AAAA,gBACZ,4BAA4B,GAAG,kBAAkB;AAAA,gBAAK;AAAA,gBAAI;AAAA,gBAC1D;AAAA,gBAAa;AAAA,iBAChB;AAAA,eACF;AAAA,YAEA,+CAAC,SAAI,WAAU,gDACb;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAQ;AAAA,kBACR,WAAU;AAAA,kBACV,MAAK;AAAA,kBACL,SAAS;AAAA,kBACV;AAAA;AAAA,cAED;AAAA,cAEA,8CAAC,kBAAO,WAAU,UAAS,SAAS,gBAAgB,gCAEpD;AAAA,eACF;AAAA,aACF;AAAA;AAAA,MACF;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,QAAQ;AAAA,UACR,SAAS,MAAM,qBAAqB,KAAK;AAAA,UACzC,OAAM;AAAA,UACN,MAAM;AAAA,UAEN,yDAAC,SAAI,WAAU,+BACb;AAAA,2DAAC,SAAI,WAAU,wFACb;AAAA,4DAAC,OAAE,WAAU,mCAAkC,yBAAW;AAAA,cAC1D,8CAAC,UAAK,WAAU,iBACd,yDAAC,kBAAO,OAAO,YAAY,eAAe,eACxC;AAAA,8DAAC,iBAAc,SAAQ,WAAU,WAAU,iBACzC,wDAAC,eAAY,aAAY,6BAAsB,GACjD;AAAA,gBACA,+CAAC,iBACC;AAAA,gEAAC,cAAW,OAAM,OAAM,mBAAK;AAAA,kBAC7B,8CAAC,cAAW,OAAM,cAAa,uBAAS;AAAA,kBACxC,8CAAC,cAAW,OAAM,YAAW,yBAAW;AAAA,mBAC1C;AAAA,iBACF,GACF;AAAA,eACF;AAAA,YAEA,8CAAC,SAAI,WAAU,qFACb;AAAA,cAAC;AAAA;AAAA,gBACC;AAAA,gBACA,iBAAiB,MAAM,qBAAqB,KAAK;AAAA;AAAA,YACnD,GACF;AAAA,aACF;AAAA;AAAA,MACF;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,QAAQ;AAAA,UACR,SAAS,MAAM,uBAAuB,KAAK;AAAA,UAC3C,OAAM;AAAA,UACN,MAAM;AAAA,UAEL,2BAAiB;AAAA;AAAA,MACpB;AAAA,OACF;AAAA,EAEJ;AACF;AAIA,IAAM,4BAAwB,2BAG5B,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAAQ;AAClC,QAAM,EAAE,YAAY,IAAI,aAAa;AAErC,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW,GAAG,sCAAsC,SAAS;AAAA,MAC5D,GAAG;AAAA,MAEJ;AAAA,sDAAC,OAAE,WAAU,oCAAmC,uBAAS;AAAA,QACxD,eACC,8CAAC,iBAAM,SAAQ,SAAQ,QAAO,QAC3B,sBAAY,MACf;AAAA;AAAA;AAAA,EAEJ;AAEJ,CAAC;AAED,IAAM,sBAAkB,2BAGtB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAAQ;AAClC,QAAM,EAAE,aAAa,IAAI,aAAa;AACtC,QAAM,YAAY,aAAa;AAE/B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAG,6CAA6C,SAAS;AAAA,MACpE;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,EACH;AAEJ,CAAC;AAED,IAAM,4BAAwB;AAAA,EAC5B,CAAC,EAAE,GAAG,MAAM,GAAG,QAAQ;AACrB,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,IAAI,aAAa;AAEjB,UAAM,iBAAiB,kBAAkB;AACzC,UAAM,iBAAiB,kBAAkB;AAEzC,QAAI,iBAAiB;AACrB,QAAI,qBAAqB;AACzB,QAAI,uBAAuB;AAC3B,QAAI,0BAA0B;AAC9B,QAAI,qBAAqB;AACzB,QAAI,uBAAuB;AAC3B,QAAI,0BAA0B;AAE9B,QAAI,gBAAgB;AAClB,qBAAe,QAAQ,QAAQ,CAAC,WAAW;AACzC,cAAM,YAAY,OAAO;AAEzB,YAAI,WAAW;AACb;AAAA,QACF;AAEA,YAAI,OAAO,yCAA+C;AACxD;AACA,cAAI,WAAW;AACb;AAAA,UACF;AAAA,QACF,WAAW,OAAO,yCAA+C;AAC/D;AACA,cAAI,WAAW;AACb;AAAA,UACF;AAAA,QACF,WAAW,OAAO,6CAAiD;AACjE;AACA,cAAI,WAAW;AACb;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAEA,UAAM,aACJ,iBAAiB,IACb,KAAK,MAAO,iBAAiB,iBAAkB,GAAG,IAClD;AAEN,WACE;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV;AAAA,QACC,GAAG;AAAA,QAEJ;AAAA,yDAAC,SAAI,WAAU,YACb;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAAQ;AAAA,gBACR,OAAO;AAAA,gBACP,gBAAgB;AAAA,gBAChB,OAAM;AAAA;AAAA,YACR;AAAA,YAEA,+CAAC,SAAI,WAAU,8DACb;AAAA,6DAAC,SAAI,WAAU,gCACb;AAAA,8DAAC,gCAAM,MAAM,IAAI,QAAO,WAAU,WAAU,iBAAgB;AAAA,gBAC5D,8CAAC,UAAK,WAAU,sCACb,qBAAW,WAAW,GACzB;AAAA,iBACF;AAAA,cAEA,+CAAC,SAAI,WAAU,gDACZ;AAAA,4CAA4B,GAAG,kBAAkB;AAAA,gBAAK;AAAA,gBAAI;AAAA,gBAC1D;AAAA,iBACH;AAAA,cAEA,8CAAC,SAAI,WAAU,2CAA0C,sBAEzD;AAAA,eACF;AAAA,aACF;AAAA,UAEA,+CAAC,SAAI,WAAU,8BACb;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,WAAU;AAAA,gBACV,QAAO;AAAA,gBACP,SAAQ;AAAA,gBACR,OAAO;AAAA,gBACP,KAAK;AAAA,gBACL,OAAM;AAAA,gBACN,cAAY;AAAA,gBACZ,gBAAe;AAAA,gBACf,qBAAoB;AAAA;AAAA,YACtB;AAAA,YAEA;AAAA,cAAC;AAAA;AAAA,gBACC,WAAU;AAAA,gBACV,QAAO;AAAA,gBACP,SAAQ;AAAA,gBACR,OAAO;AAAA,gBACP,KAAK;AAAA,gBACL,OAAM;AAAA,gBACN,cAAY;AAAA,gBACZ,gBAAe;AAAA,gBACf,qBAAoB;AAAA;AAAA,YACtB;AAAA,YAEA;AAAA,cAAC;AAAA;AAAA,gBACC,WAAU;AAAA,gBACV,QAAO;AAAA,gBACP,SAAQ;AAAA,gBACR,OAAO;AAAA,gBACP,KAAK;AAAA,gBACL,OAAM;AAAA,gBACN,cAAY;AAAA,gBACZ,gBAAe;AAAA,gBACf,qBAAoB;AAAA;AAAA,YACtB;AAAA,aACF;AAAA;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AAEA,IAAM,qBAAiB,2BAMrB,CAAC,EAAE,WAAW,gBAAgB,GAAG,MAAM,GAAG,QAAQ;AAClD,QAAM,EAAE,6BAA6B,IAAI,aAAa;AACtD,QAAM,mBAAmB,6BAA6B;AACtD,QAAM,gBAAgB,OAAO,QAAQ,gBAAgB,EAAE;AAAA,IACrD,CAAC,CAAC,WAAW,SAAS,MAAM;AAC1B,UAAI,UAAU;AACd,UAAI,YAAY;AAEhB,gBAAU,QAAQ,CAAC,aAAa;AAC9B,YAAI,SAAS,2DAAgD;AAC3D;AAAA,QACF,OAAO;AACL;AAAA,QACF;AAAA,MACF,CAAC;AAED,aAAO;AAAA,QACL,SAAS;AAAA,UACP,MACE,YAAY,CAAC,GAAG,kBAAkB,CAAC,GAAG,SAAS,QAC/C;AAAA,UACF,IAAI;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,QACA,OAAO,UAAU;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAEA,SACE,+CAAC,aAAQ,KAAU,WAAuB,GAAG,OAC3C;AAAA,kDAAC,OAAE,WAAU,6CAA4C,yBAAQ;AAAA,IAEjE,8CAAC,QAAG,WAAU,uBACX,wBAAc,IAAI,CAAC,YAClB,8CAAC,QACC;AAAA,MAAC;AAAA;AAAA,QACC,SAAS,MAAM,iBAAiB,QAAQ,QAAQ,EAAE;AAAA,QAClD,WAAU;AAAA,QACV,QAAQ,QAAQ,QAAQ;AAAA,QACxB,iBAAiB,QAAQ;AAAA,QACzB,mBAAmB,QAAQ;AAAA,QAC3B,MAAM,8CAAC,+BAAK,MAAM,IAAI;AAAA,QACtB,WAAU;AAAA;AAAA,IACZ,KATO,QAAQ,QAAQ,EAUzB,CACD,GACH;AAAA,KACF;AAEJ,CAAC;AAED,IAAM,0BAA0B,CAAC;AAAA,EAC/B;AAAA,EACA;AACF,MAGM;AACJ,QAAM,EAAE,8BAA8B,iBAAiB,IAAI,aAAa;AACxE,QAAM,mBAAmB,6BAA6B;AAEtD,QAAM,oBAAoB,iBAAiB,OAAO,KAAK,CAAC;AAExD,SACE,+CAAC,SAAI,WAAU,2EACb;AAAA,kDAAC,SAAI,WAAU,sCACb,wDAAC,OAAE,WAAU,oCACV,8BAAoB,CAAC,GAAG,kBAAkB,CAAC,GAAG,SAAS,QACtD,kBACJ,GACF;AAAA,IAEA,+CAAC,aAAQ,WAAU,kBACjB;AAAA,oDAAC,OAAE,WAAU,6CAA4C,uCAEzD;AAAA,MAEA,8CAAC,QAAG,WAAU,4BACX,4BAAkB,IAAI,CAAC,aAAa;AACnC,cAAM,gBAAgB;AAAA;AAAA,UAEnB,SAAiB,cAAc,SAAS;AAAA,QAC3C;AACA,eACE,8CAAC,QACC;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,QAAQ,cAAW,cAAc,SAAS,EAAE,SAAS,GAAG,GAAG,CAAC;AAAA,YAC5D,SAAS,MAAM;AACb,kBACE,SAAS;AAET,uBAAO;AACT,kBACE,SAAS;AAET,uBAAO;AACT,qBAAO;AAAA,YACT,GAAG;AAAA,YACH,SAAS,MAAM,kBAAkB,QAAQ;AAAA;AAAA,QAC3C,KAhBO,SAAS,EAiBlB;AAAA,MAEJ,CAAC,GACH;AAAA,OACF;AAAA,KACF;AAEJ;","names":["import_phosphor_react","import_phosphor_react","import_jsx_runtime","import_jsx_runtime","SIZE_CLASSES","import_react","import_jsx_runtime","getStatusStyles","isReadonly","getStatusBadge","value","import_jsx_runtime","VARIANT_ACTION_CLASSES","SIZE_CLASSES","import_react","import_jsx_runtime","import_react","import_zustand","answer","import_react","import_jsx_runtime","SIZE_CLASSES","import_react","import_phosphor_react","import_jsx_runtime","SIZE_CLASSES","import_zustand","import_react","import_phosphor_react","import_jsx_runtime","SIZE_CLASSES","injectStore","children","label","import_react","import_jsx_runtime","SIZE_CLASSES","VARIANT_CLASSES","import_phosphor_react","import_jsx_runtime","import_jsx_runtime","SIZE_CLASSES","VARIANT_CLASSES","import_react","import_react","import_zustand","import_react","import_phosphor_react","import_jsx_runtime","SIZE_CLASSES","STATE_CLASSES","import_jsx_runtime","injectStore","import_phosphor_react","import_jsx_runtime","getStatusBadge","getStatusStyles","import_react","import_phosphor_react","import_jsx_runtime","SIZE_CLASSES","STATE_CLASSES","import_jsx_runtime"]}
|