{"version":3,"sources":["../src/components/CorrectActivityModal/CorrectActivityModal.tsx","../src/utils/studentActivityCorrection/constants.ts","../src/utils/studentActivityCorrection/utils.ts","../src/utils/studentActivityCorrection/converter.ts","../src/utils/questionRenderer/alternative/index.tsx","../src/utils/questionRenderer/multipleChoice/index.tsx","../src/utils/questionRenderer/components/index.tsx","../src/utils/questionRenderer/trueOrFalse/index.tsx","../src/utils/questionRenderer/dissertative/index.tsx","../src/utils/questionRenderer/fill/index.tsx","../src/utils/questionRenderer/image/index.tsx","../src/utils/questionRenderer/connectDots/index.tsx","../src/utils/questionRenderer/index.tsx"],"sourcesContent":["import {\n  useState,\n  useRef,\n  useEffect,\n  useCallback,\n  type ReactNode,\n} from 'react';\nimport { PencilSimpleIcon } from '@phosphor-icons/react/dist/csr/PencilSimple';\nimport { PaperclipIcon } from '@phosphor-icons/react/dist/csr/Paperclip';\nimport { XIcon } from '@phosphor-icons/react/dist/csr/X';\nimport { ImageIcon } from '@phosphor-icons/react/dist/csr/Image';\nimport Modal from '../Modal/Modal';\nimport Text from '../Text/Text';\nimport Button from '../Button/Button';\nimport Badge from '../Badge/Badge';\nimport Radio from '../Radio/Radio';\nimport TextArea from '../TextArea/TextArea';\nimport { CardAccordation, AccordionGroup } from '../Accordation';\nimport { generateFileId } from '../FileAttachment/FileAttachment';\nimport type { AttachedFile } from '../FileAttachment/FileAttachment';\nimport { StatCard } from '../shared/StatCard';\nimport { cn } from '../../utils/utils';\nimport { QUESTION_TYPE } from '../Quiz/useQuizStore';\nimport {\n  type StudentActivityCorrectionData,\n  type SaveQuestionCorrectionPayload,\n  getQuestionStatusBadgeConfig,\n  getQuestionStatusFromData,\n  QUESTION_STATUS,\n} from '../../utils/studentActivityCorrection';\nimport {\n  renderQuestionAlternative,\n  renderQuestionMultipleChoice,\n  renderQuestionTrueOrFalse,\n  renderQuestionDissertative,\n  renderQuestionFill,\n  renderQuestionImage,\n  renderQuestionConnectDots,\n} from '../../utils/questionRenderer/index';\nimport useToastStore from '../Toast/utils/ToastStore';\nimport { HtmlMathRenderer } from '../HtmlMathRenderer';\n\n/**\n * Props for the CorrectActivityModal component\n */\nexport interface CorrectActivityModalProps {\n  /** Whether the modal is open */\n  isOpen: boolean;\n  /** Function to close the modal */\n  onClose: () => void;\n  /** Student activity correction data */\n  data: StudentActivityCorrectionData | null;\n  /** Whether the modal is in view-only mode */\n  isViewOnly?: boolean;\n  /** Callback when observation is submitted with optional files */\n  onObservationSubmit?: (\n    studentId: string,\n    observation: string,\n    files: File[],\n    existingAttachment: string | null\n  ) => void;\n  /** Callback when question correction is saved (for essay questions) */\n  onQuestionCorrectionSubmit?: (\n    studentId: string,\n    payload: SaveQuestionCorrectionPayload\n  ) => Promise<void>;\n  /** URL of the scanned answer sheet image (for exam mode) */\n  answerSheetImageUrl?: string | null;\n  /** Callback when \"Ver gabarito escaneado\" button is clicked */\n  onViewScannedAnswerSheet?: () => void;\n}\n\n/** Field names for essay correction state updates */\nconst EssayCorrectionField = {\n  IsCorrect: 'isCorrect',\n  TeacherFeedback: 'teacherFeedback',\n} as const;\n\n/**\n * Modal component for correcting or viewing student activity details\n *\n * Displays student information, statistics cards, observation section,\n * and a list of questions with their status.\n *\n * @param props - Component props\n * @returns JSX element\n *\n * @example\n * ```tsx\n * <CorrectActivityModal\n *   isOpen={isOpen}\n *   onClose={() => setIsOpen(false)}\n *   data={studentData}\n *   isViewOnly={false}\n *   onObservationSubmit={(obs, files) => console.log(obs, files)}\n * />\n * ```\n */\nconst CorrectActivityModal = ({\n  isOpen,\n  onClose,\n  data,\n  isViewOnly = false,\n  onObservationSubmit,\n  onQuestionCorrectionSubmit,\n  answerSheetImageUrl,\n  onViewScannedAnswerSheet,\n}: CorrectActivityModalProps) => {\n  const [observation, setObservation] = useState('');\n  const [isObservationExpanded, setIsObservationExpanded] = useState(false);\n  const [isObservationSaved, setIsObservationSaved] = useState(false);\n  const [savedObservation, setSavedObservation] = useState('');\n  const [attachedFiles, setAttachedFiles] = useState<AttachedFile[]>([]);\n  const [savedFiles, setSavedFiles] = useState<AttachedFile[]>([]);\n  const [existingAttachment, setExistingAttachment] = useState<string | null>(\n    null\n  );\n  const fileInputRef = useRef<HTMLInputElement>(null);\n\n  // Toast store for notifications\n  const addToast = useToastStore((state) => state.addToast);\n\n  // State for essay question corrections\n  const [essayCorrections, setEssayCorrections] = useState<\n    Record<\n      number,\n      {\n        isCorrect: boolean | null;\n        teacherFeedback: string;\n        isSaving: boolean;\n        isSaved: boolean;\n      }\n    >\n  >({});\n\n  /**\n   * Reset state when modal opens or student changes\n   * Load existing observation and attachment if available\n   */\n  useEffect(() => {\n    if (isOpen) {\n      setObservation('');\n      setIsObservationExpanded(false);\n      setAttachedFiles([]);\n      setSavedFiles([]);\n      setExistingAttachment(data?.attachment ?? null);\n\n      // Load existing observation/attachment if available\n      if (data?.observation || data?.attachment) {\n        setIsObservationSaved(true);\n        setSavedObservation(data.observation || '');\n      } else {\n        setIsObservationSaved(false);\n        setSavedObservation('');\n      }\n\n      // Initialize essay corrections from data\n      const initialCorrections: Record<\n        number,\n        {\n          isCorrect: boolean | null;\n          teacherFeedback: string;\n          isSaving: boolean;\n          isSaved: boolean;\n        }\n      > = {};\n      data?.questions?.forEach((questionData) => {\n        if (questionData.question.questionType === QUESTION_TYPE.DISSERTATIVA) {\n          initialCorrections[questionData.questionNumber] = {\n            isCorrect: questionData.correction?.isCorrect ?? null,\n            teacherFeedback: questionData.correction?.teacherFeedback || '',\n            isSaving: false,\n            isSaved: questionData.correction?.isCorrect != null,\n          };\n        }\n      });\n      setEssayCorrections(initialCorrections);\n    }\n  }, [\n    isOpen,\n    data?.studentId,\n    data?.observation,\n    data?.attachment,\n    data?.questions,\n  ]);\n\n  /**\n   * Handle opening observation section\n   */\n  const handleOpenObservation = () => {\n    setIsObservationExpanded(true);\n  };\n\n  /**\n   * Handle adding files (single file mode - replaces existing file)\n   * @param files - Files to add\n   */\n  const handleFilesAdd = (files: File[]) => {\n    const newFile = files[0];\n    if (newFile) {\n      setAttachedFiles([{ file: newFile, id: generateFileId() }]);\n    }\n  };\n\n  /**\n   * Handle removing a file\n   * @param id - File ID to remove\n   */\n  const handleFileRemove = (id: string) => {\n    setAttachedFiles((prev) => prev.filter((f) => f.id !== id));\n  };\n\n  /**\n   * Handle saving observation\n   */\n  const handleSaveObservation = () => {\n    if (observation.trim() || attachedFiles.length > 0 || existingAttachment) {\n      // Validate studentId before saving to prevent silent no-op\n      if (!data?.studentId) {\n        return;\n      }\n\n      setSavedObservation(observation);\n      setSavedFiles([...attachedFiles]);\n      setIsObservationSaved(true);\n      setIsObservationExpanded(false);\n\n      // Pass studentId explicitly from data prop to avoid stale closure issues\n      onObservationSubmit?.(\n        data.studentId,\n        observation,\n        attachedFiles.map((f) => f.file),\n        existingAttachment\n      );\n    }\n  };\n\n  /**\n   * Handle editing observation\n   */\n  const handleEditObservation = () => {\n    setObservation(savedObservation);\n    setAttachedFiles([...savedFiles]);\n    setIsObservationSaved(false);\n    setIsObservationExpanded(true);\n  };\n\n  /**\n   * Handle saving essay question correction\n   */\n  const handleSaveEssayCorrection = useCallback(\n    async (questionNumber: number) => {\n      if (!data?.studentId || !onQuestionCorrectionSubmit) return;\n\n      const correction = essayCorrections[questionNumber];\n      if (correction?.isCorrect == null) {\n        return;\n      }\n\n      setEssayCorrections((prev) => ({\n        ...prev,\n        [questionNumber]: { ...prev[questionNumber], isSaving: true },\n      }));\n\n      try {\n        // Find the question data to get questionId\n        const questionData = data?.questions.find(\n          (q) => q.questionNumber === questionNumber\n        );\n        if (!questionData) {\n          console.error('Questão não encontrada:', questionNumber);\n          return;\n        }\n\n        await onQuestionCorrectionSubmit(data.studentId, {\n          questionId: questionData.question.id,\n          isCorrect: correction.isCorrect,\n          teacherFeedback: correction.teacherFeedback,\n        });\n\n        // Mark as saved and show success toast\n        setEssayCorrections((prev) => ({\n          ...prev,\n          [questionNumber]: {\n            ...prev[questionNumber],\n            isSaving: false,\n            isSaved: true,\n          },\n        }));\n\n        addToast({\n          title: 'Correção salva',\n          description: `A correção da questão ${questionNumber} foi salva com sucesso.`,\n          variant: 'solid',\n          action: 'success',\n          position: 'top-right',\n        });\n      } catch (error) {\n        console.error('Erro ao salvar correção da questão:', error);\n\n        setEssayCorrections((prev) => ({\n          ...prev,\n          [questionNumber]: { ...prev[questionNumber], isSaving: false },\n        }));\n\n        addToast({\n          title: 'Erro ao salvar correção',\n          description: 'Não foi possível salvar a correção. Tente novamente.',\n          variant: 'solid',\n          action: 'warning',\n          position: 'top-right',\n        });\n      }\n    },\n    [\n      data?.studentId,\n      data?.questions,\n      essayCorrections,\n      onQuestionCorrectionSubmit,\n      addToast,\n    ]\n  );\n\n  /**\n   * Update essay correction state\n   * Resets isSaved to false when isCorrect changes so badge only updates after saving\n   */\n  const updateEssayCorrection = useCallback(\n    (\n      questionNumber: number,\n      field:\n        | (typeof EssayCorrectionField)['IsCorrect']\n        | (typeof EssayCorrectionField)['TeacherFeedback'],\n      value: boolean | string\n    ) => {\n      setEssayCorrections((prev) => ({\n        ...prev,\n        [questionNumber]: {\n          ...prev[questionNumber],\n          [field]: value,\n          // Reset isSaved when isCorrect changes so badge doesn't update until saved\n          ...(field === EssayCorrectionField.IsCorrect\n            ? { isSaved: false }\n            : {}),\n        },\n      }));\n    },\n    []\n  );\n\n  /**\n   * Get accordion title based on question type\n   */\n  const getAccordionTitle = (questionType: QUESTION_TYPE): string => {\n    switch (questionType) {\n      case QUESTION_TYPE.ALTERNATIVA:\n      case QUESTION_TYPE.MULTIPLA_ESCOLHA:\n      case QUESTION_TYPE.VERDADEIRO_FALSO:\n        return 'Alternativas';\n      case QUESTION_TYPE.DISSERTATIVA:\n        return 'Resposta';\n      case QUESTION_TYPE.PREENCHER_LACUNAS:\n        return 'Preencher Lacunas';\n      case QUESTION_TYPE.IMAGEM:\n        return 'Imagem';\n      case QUESTION_TYPE.RELACIONAR:\n        return 'Ligar Pontos';\n      default:\n        return 'Resposta';\n    }\n  };\n\n  /**\n   * Render question content using Quiz format renderers with accordion\n   */\n  const renderQuestionContent = (\n    questionData: StudentActivityCorrectionData['questions'][number]\n  ) => {\n    const { question, result } = questionData;\n    const questionType = question.questionType;\n    const accordionTitle = getAccordionTitle(questionType);\n\n    let content: ReactNode;\n\n    switch (questionType) {\n      case QUESTION_TYPE.ALTERNATIVA:\n        content = renderQuestionAlternative({\n          question,\n          result,\n        });\n        break;\n      case QUESTION_TYPE.MULTIPLA_ESCOLHA:\n        content = renderQuestionMultipleChoice({\n          question,\n          result,\n        });\n        break;\n      case QUESTION_TYPE.VERDADEIRO_FALSO:\n        content = renderQuestionTrueOrFalse({\n          question,\n          result,\n        });\n        break;\n      case QUESTION_TYPE.DISSERTATIVA:\n        content = (\n          <>\n            {renderQuestionDissertative({\n              result,\n            })}\n            {onQuestionCorrectionSubmit && (\n              <div className=\"space-y-4 border-t border-border-100 pt-4 mt-4\">\n                {renderEssayCorrectionFields(questionData)}\n              </div>\n            )}\n          </>\n        );\n        break;\n      case QUESTION_TYPE.PREENCHER_LACUNAS:\n        content = renderQuestionFill({\n          question,\n          result,\n        });\n        break;\n      case QUESTION_TYPE.IMAGEM:\n        content = renderQuestionImage({\n          result,\n        });\n        break;\n      case QUESTION_TYPE.RELACIONAR:\n        content = renderQuestionConnectDots({ paddingBottom: '' });\n        break;\n      default:\n        // Fallback: try to render based on options presence\n        if (question.options && question.options.length > 0) {\n          content = renderQuestionAlternative({\n            question,\n            result,\n          });\n        } else {\n          content = renderQuestionDissertative({\n            result,\n          });\n        }\n    }\n\n    return (\n      <CardAccordation\n        value={`accordion-${questionData.questionNumber}`}\n        className=\"border border-border-100 rounded-lg\"\n        trigger={\n          <div className=\"py-3 pr-2 w-full\">\n            <Text className=\"text-sm font-bold text-text-950\">\n              {accordionTitle}\n            </Text>\n          </div>\n        }\n      >\n        {content}\n      </CardAccordation>\n    );\n  };\n\n  /**\n   * Render essay correction fields (radio group, textarea, save button)\n   */\n  const renderEssayCorrectionFields = (\n    questionData: StudentActivityCorrectionData['questions'][number]\n  ) => {\n    const correction = essayCorrections[questionData.questionNumber] || {\n      isCorrect: null,\n      teacherFeedback: '',\n      isSaving: false,\n    };\n\n    let radioValue;\n    if (correction.isCorrect === null) {\n      radioValue = undefined;\n    } else if (correction.isCorrect) {\n      radioValue = 'true';\n    } else {\n      radioValue = 'false';\n    }\n\n    return (\n      <>\n        {/* Is correct radio group */}\n        <div className=\"space-y-2\">\n          <Text className=\"text-sm font-semibold text-text-950\">\n            Resposta está correta?\n          </Text>\n          <div className=\"flex gap-4\">\n            <Radio\n              name={`isCorrect-${questionData.questionNumber}`}\n              value=\"true\"\n              id={`correct-yes-${questionData.questionNumber}`}\n              label=\"Sim\"\n              size=\"medium\"\n              checked={radioValue === 'true'}\n              onChange={(e) => {\n                if (e.target.checked) {\n                  updateEssayCorrection(\n                    questionData.questionNumber,\n                    EssayCorrectionField.IsCorrect,\n                    true\n                  );\n                }\n              }}\n            />\n            <Radio\n              name={`isCorrect-${questionData.questionNumber}`}\n              value=\"false\"\n              id={`correct-no-${questionData.questionNumber}`}\n              label=\"Não\"\n              size=\"medium\"\n              checked={radioValue === 'false'}\n              onChange={(e) => {\n                if (e.target.checked) {\n                  updateEssayCorrection(\n                    questionData.questionNumber,\n                    EssayCorrectionField.IsCorrect,\n                    false\n                  );\n                }\n              }}\n            />\n          </div>\n        </div>\n\n        {/* Teacher feedback textarea */}\n        <div className=\"space-y-2\">\n          <Text className=\"text-sm font-semibold text-text-950\">\n            Incluir observação\n          </Text>\n          <TextArea\n            value={correction.teacherFeedback}\n            onChange={(e) => {\n              updateEssayCorrection(\n                questionData.questionNumber,\n                EssayCorrectionField.TeacherFeedback,\n                e.target.value\n              );\n            }}\n            placeholder=\"Escreva uma observação sobre a resposta do aluno\"\n            rows={4}\n            size=\"medium\"\n          />\n        </div>\n\n        {/* Save button */}\n        <Button\n          size=\"small\"\n          onClick={() => handleSaveEssayCorrection(questionData.questionNumber)}\n          disabled={\n            correction.isCorrect === null ||\n            correction.isSaving ||\n            !onQuestionCorrectionSubmit\n          }\n        >\n          {correction.isSaving ? 'Salvando...' : 'Salvar'}\n        </Button>\n      </>\n    );\n  };\n\n  if (!data) return null;\n\n  const title = isViewOnly ? 'Detalhes da atividade' : 'Corrigir atividade';\n  const formattedScore = data.score == null ? '-' : data.score.toFixed(1);\n\n  /**\n   * Render observation section based on current state\n   * Allows observations in all activity statuses (not just pending correction)\n   * @returns JSX element for observation section\n   */\n  const renderObservationSection = () => {\n    /**\n     * Get file name from URL\n     * @param url - File URL\n     * @returns File name extracted from URL\n     */\n    const getFileNameFromUrl = (_url: string): string => 'Anexado';\n\n    /**\n     * Render attachment input section for expanded state\n     * @returns JSX element for attachment input\n     */\n    const renderAttachmentInput = () => {\n      if (attachedFiles.length > 0) {\n        return (\n          <div className=\"flex items-center justify-center gap-2 px-5 h-10 bg-secondary-500 rounded-full min-w-0 max-w-[150px]\">\n            <PaperclipIcon size={18} className=\"text-text-800 flex-shrink-0\" />\n            <span className=\"text-base font-medium text-text-800 truncate\">\n              {attachedFiles[0].file.name}\n            </span>\n            <button\n              type=\"button\"\n              onClick={() => handleFileRemove(attachedFiles[0].id)}\n              className=\"text-text-700 hover:text-text-800 flex-shrink-0\"\n              aria-label={`Remover ${attachedFiles[0].file.name}`}\n            >\n              <XIcon size={18} />\n            </button>\n          </div>\n        );\n      }\n\n      if (existingAttachment) {\n        return (\n          <div className=\"flex items-center gap-2\">\n            <a\n              href={existingAttachment}\n              target=\"_blank\"\n              rel=\"noopener noreferrer\"\n              className=\"flex items-center gap-2 px-5 h-10 bg-secondary-500 rounded-full min-w-0 max-w-[150px] hover:bg-secondary-600 transition-colors\"\n            >\n              <PaperclipIcon\n                size={18}\n                className=\"text-text-800 flex-shrink-0\"\n              />\n              <span className=\"text-base font-medium text-text-800 truncate\">\n                {getFileNameFromUrl(existingAttachment)}\n              </span>\n            </a>\n            <Button\n              type=\"button\"\n              variant=\"outline\"\n              size=\"small\"\n              onClick={() => fileInputRef.current?.click()}\n              className=\"flex items-center gap-2\"\n            >\n              <PaperclipIcon size={18} />\n              Trocar\n            </Button>\n          </div>\n        );\n      }\n\n      return (\n        <Button\n          type=\"button\"\n          variant=\"outline\"\n          size=\"small\"\n          onClick={() => fileInputRef.current?.click()}\n          className=\"flex items-center gap-2\"\n        >\n          <PaperclipIcon size={18} />\n          Anexar\n        </Button>\n      );\n    };\n\n    // State: Saved\n    if (isObservationSaved) {\n      return (\n        <div className=\"bg-background border border-border-100 rounded-lg p-4 space-y-2\">\n          <div className=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3\">\n            <Text className=\"text-sm font-bold text-text-950\">Observação</Text>\n            <div className=\"flex items-center gap-3\">\n              {/* Show newly attached file */}\n              {savedFiles.length > 0 && (\n                <div className=\"flex items-center gap-2 px-5 h-10 bg-secondary-500 rounded-full min-w-0 max-w-[150px]\">\n                  <PaperclipIcon\n                    size={18}\n                    className=\"text-text-800 flex-shrink-0\"\n                  />\n                  <span className=\"text-base font-medium text-text-800 truncate\">\n                    {savedFiles[0].file.name}\n                  </span>\n                </div>\n              )}\n              {/* Show existing attachment from server (URL) */}\n              {savedFiles.length === 0 && existingAttachment && (\n                <a\n                  href={existingAttachment}\n                  target=\"_blank\"\n                  rel=\"noopener noreferrer\"\n                  className=\"flex items-center gap-2 px-5 h-10 bg-secondary-500 rounded-full min-w-0 max-w-[150px] hover:bg-secondary-600 transition-colors\"\n                >\n                  <PaperclipIcon\n                    size={18}\n                    className=\"text-text-800 flex-shrink-0\"\n                  />\n                  <span className=\"text-base font-medium text-text-800 truncate\">\n                    {getFileNameFromUrl(existingAttachment)}\n                  </span>\n                </a>\n              )}\n              <Button\n                type=\"button\"\n                variant=\"outline\"\n                size=\"small\"\n                onClick={handleEditObservation}\n                className=\"flex items-center gap-2 flex-shrink-0\"\n              >\n                <PencilSimpleIcon size={16} />\n                Editar\n              </Button>\n            </div>\n          </div>\n          {savedObservation && (\n            <div className=\"p-3 bg-background-50 rounded-lg\">\n              <Text className=\"text-sm text-text-700\">{savedObservation}</Text>\n            </div>\n          )}\n        </div>\n      );\n    }\n\n    // State: Expanded\n    if (isObservationExpanded) {\n      return (\n        <div className=\"bg-background border border-border-100 rounded-lg p-4 space-y-3\">\n          <Text className=\"text-sm font-bold text-text-950\">Observação</Text>\n          <textarea\n            value={observation}\n            onChange={(e) => setObservation(e.target.value)}\n            placeholder=\"Escreva uma observação para o estudante\"\n            className=\"w-full min-h-[80px] p-3 border border-border-100 rounded-lg text-sm text-text-700 placeholder:text-text-400 resize-none focus:outline-none focus:ring-2 focus:ring-primary-500\"\n          />\n          {/* Hidden file input */}\n          <input\n            type=\"file\"\n            ref={fileInputRef}\n            className=\"hidden\"\n            onChange={(e) => {\n              const selectedFiles = e.target.files;\n              if (selectedFiles && selectedFiles.length > 0) {\n                handleFilesAdd(Array.from(selectedFiles));\n              }\n              if (fileInputRef.current) {\n                fileInputRef.current.value = '';\n              }\n            }}\n            aria-label=\"Selecionar arquivo\"\n          />\n          {/* Buttons row: File indicator or Anexar button left, Salvar right */}\n          <div className=\"flex flex-col-reverse sm:flex-row gap-3 sm:justify-between\">\n            {renderAttachmentInput()}\n            <Button\n              type=\"button\"\n              size=\"small\"\n              onClick={handleSaveObservation}\n              disabled={\n                !observation.trim() &&\n                attachedFiles.length === 0 &&\n                !existingAttachment\n              }\n            >\n              Salvar\n            </Button>\n          </div>\n          {data.observation && (\n            <div className=\"p-3 bg-background-50 rounded-lg\">\n              <Text className=\"text-xs text-text-500\">\n                Observação anterior:\n              </Text>\n              <Text className=\"text-sm text-text-700\">{data.observation}</Text>\n            </div>\n          )}\n        </div>\n      );\n    }\n\n    // State: Closed (default)\n    return (\n      <div className=\"bg-background border border-border-100 rounded-lg p-4 flex flex-col sm:flex-row gap-3 sm:items-center sm:justify-between\">\n        <Text className=\"text-sm font-bold text-text-950\">Observação</Text>\n        <Button type=\"button\" size=\"small\" onClick={handleOpenObservation}>\n          Incluir\n        </Button>\n      </div>\n    );\n  };\n\n  return (\n    <Modal\n      isOpen={isOpen}\n      onClose={onClose}\n      title={title}\n      size=\"lg\"\n      contentClassName=\"max-h-[80vh] overflow-y-auto\"\n    >\n      <div className=\"space-y-6\">\n        {/* Student Info */}\n        <div className=\"flex items-center justify-between\">\n          <div className=\"flex items-center gap-3\">\n            <div className=\"w-10 h-10 bg-primary-100 rounded-full flex items-center justify-center\">\n              <Text className=\"text-lg font-semibold text-primary-700\">\n                {data.studentName?.charAt(0).toUpperCase() || '-'}\n              </Text>\n            </div>\n            <Text className=\"text-lg font-medium text-text-950\">\n              {data.studentName || 'Aluno'}\n            </Text>\n          </div>\n\n          {/* View scanned answer sheet button */}\n          {answerSheetImageUrl && onViewScannedAnswerSheet && (\n            <Button\n              variant=\"outline\"\n              size=\"small\"\n              onClick={onViewScannedAnswerSheet}\n            >\n              <ImageIcon size={18} className=\"mr-2\" />\n              Ver gabarito escaneado\n            </Button>\n          )}\n        </div>\n\n        {/* Stats Cards */}\n        <div className=\"grid grid-cols-3 gap-4\">\n          <StatCard label=\"Nota\" value={formattedScore} variant=\"score\" />\n          <StatCard\n            label=\"N° de questões corretas\"\n            value={data.correctCount}\n            variant=\"correct\"\n          />\n          <StatCard\n            label=\"N° de questões incorretas\"\n            value={data.incorrectCount}\n            variant=\"incorrect\"\n          />\n        </div>\n\n        {/* Observation Section */}\n        {renderObservationSection()}\n\n        {/* Questions List */}\n        <div className=\"space-y-2\">\n          <Text className=\"text-sm font-bold text-text-950\">Respostas</Text>\n          <AccordionGroup type=\"multiple\" className=\"space-y-2\">\n            {data.questions?.map((questionData) => {\n              // Check if we have a local correction for essay questions\n              const localCorrection =\n                essayCorrections[questionData.questionNumber];\n              const isEssayWithLocalCorrection =\n                questionData.question.questionType ===\n                  QUESTION_TYPE.DISSERTATIVA &&\n                localCorrection?.isSaved &&\n                localCorrection?.isCorrect != null;\n\n              // Use local correction status for essay questions, otherwise use original\n              let badgeConfig;\n              if (isEssayWithLocalCorrection) {\n                const localStatus = localCorrection.isCorrect\n                  ? QUESTION_STATUS.CORRETA\n                  : QUESTION_STATUS.INCORRETA;\n                badgeConfig = getQuestionStatusBadgeConfig(localStatus);\n              } else {\n                const status = getQuestionStatusFromData(questionData);\n                badgeConfig = getQuestionStatusBadgeConfig(status);\n              }\n\n              return (\n                <CardAccordation\n                  key={questionData.questionNumber}\n                  value={`question-${questionData.questionNumber}`}\n                  className=\"bg-background rounded-xl\"\n                  trigger={\n                    <div className=\"flex items-center justify-between w-full py-3 pr-2\">\n                      <Text className=\"text-base font-bold text-text-950\">\n                        Questão {questionData.questionNumber}\n                      </Text>\n                      <Badge\n                        className={cn(\n                          'text-xs px-2 py-1',\n                          badgeConfig.bgColor,\n                          badgeConfig.textColor\n                        )}\n                      >\n                        {badgeConfig.label}\n                      </Badge>\n                    </div>\n                  }\n                >\n                  <div className=\"space-y-4 pt-2\">\n                    {/* Question statement */}\n                    {questionData.question.statement && (\n                      <HtmlMathRenderer\n                        content={questionData.question.statement}\n                        className=\"text-sm text-text-700\"\n                      />\n                    )}\n\n                    {/* Question content based on type */}\n                    {renderQuestionContent(questionData)}\n                  </div>\n                </CardAccordation>\n              );\n            })}\n          </AccordionGroup>\n        </div>\n      </div>\n    </Modal>\n  );\n};\n\nexport default CorrectActivityModal;\n","/**\n * Question status enum for student activity correction\n * Maps from ANSWER_STATUS to a simpler status for UI display\n */\nexport const QUESTION_STATUS = {\n  CORRETA: 'CORRETA',\n  INCORRETA: 'INCORRETA',\n  EM_BRANCO: 'EM_BRANCO',\n  /** Reserved for future use - pending teacher evaluation for essay questions */\n  PENDENTE: 'PENDENTE',\n} as const;\n\nexport type QuestionStatus =\n  (typeof QUESTION_STATUS)[keyof typeof QUESTION_STATUS];\n","import { StatusBadgeConfig } from '@/types/activityDetails';\nimport {\n  ANSWER_STATUS,\n  QUESTION_TYPE,\n} from '../../components/Quiz/useQuizStore';\nimport { QUESTION_STATUS, type QuestionStatus } from './constants';\nimport type { CorrectionQuestionData } from './types';\n\n/**\n * Returns whether the answer is correct, incorrect, or null based on the answer status.\n * @param answerStatus - Answer status from ANSWER_STATUS enum\n * @returns Returns true for correct, false for incorrect, or null if undefined.\n */\nexport const getIsCorrect = (answerStatus: ANSWER_STATUS): boolean | null => {\n  if (answerStatus === ANSWER_STATUS.RESPOSTA_CORRETA) return true;\n  if (answerStatus === ANSWER_STATUS.RESPOSTA_INCORRETA) return false;\n  return null;\n};\n\n/**\n * Map ANSWER_STATUS from Quiz to QUESTION_STATUS for correction modal\n * @param answerStatus - Answer status from QuestionResult\n * @returns QuestionStatus for UI display\n */\nexport const mapAnswerStatusToQuestionStatus = (\n  answerStatus: ANSWER_STATUS\n): QuestionStatus => {\n  switch (answerStatus) {\n    case ANSWER_STATUS.RESPOSTA_CORRETA:\n      return QUESTION_STATUS.CORRETA;\n    case ANSWER_STATUS.RESPOSTA_INCORRETA:\n      return QUESTION_STATUS.INCORRETA;\n    case ANSWER_STATUS.NAO_RESPONDIDO:\n      return QUESTION_STATUS.EM_BRANCO;\n    case ANSWER_STATUS.PENDENTE_AVALIACAO:\n      return QUESTION_STATUS.PENDENTE;\n    default:\n      return QUESTION_STATUS.EM_BRANCO;\n  }\n};\n\n/**\n * Get question status badge configuration\n * @param status - Question status\n * @returns Badge configuration with label and colors\n */\nexport const getQuestionStatusBadgeConfig = (status: QuestionStatus) => {\n  const configs: Partial<Record<QuestionStatus, StatusBadgeConfig>> = {\n    [QUESTION_STATUS.CORRETA]: {\n      label: 'Correta',\n      bgColor: 'bg-success-background',\n      textColor: 'text-success-800',\n    },\n    [QUESTION_STATUS.INCORRETA]: {\n      label: 'Incorreta',\n      bgColor: 'bg-error-background',\n      textColor: 'text-error-800',\n    },\n    [QUESTION_STATUS.EM_BRANCO]: {\n      label: 'Em branco',\n      bgColor: 'bg-gray-100',\n      textColor: 'text-gray-600',\n    },\n    [QUESTION_STATUS.PENDENTE]: {\n      label: 'Pendente',\n      bgColor: 'bg-warning-background',\n      textColor: 'text-warning-800',\n    },\n  };\n\n  const defaultConfig = {\n    label: 'Sem categoria',\n    bgColor: 'bg-gray-100',\n    textColor: 'text-gray-600',\n  };\n\n  return configs[status] ?? defaultConfig;\n};\n\n/**\n * Check if question can be auto-validated based on options\n * All question types can be auto-validated except DISSERTATIVA (essay questions)\n * @param questionData - Correction question data\n * @returns true if can auto-validate, false otherwise\n */\nexport const canAutoValidate = (\n  questionData: CorrectionQuestionData\n): boolean => {\n  const { result } = questionData;\n\n  // Only dissertative questions require manual evaluation\n  if (result.questionType === QUESTION_TYPE.DISSERTATIVA) {\n    return false;\n  }\n\n  return true;\n};\n\ntype Option = {\n  id: string;\n  option: string;\n  isCorrect: boolean;\n};\n\n/**\n * Type predicate to check if an option has isCorrect defined\n */\nconst hasIsCorrect = (op: {\n  id: string;\n  option: string;\n  isCorrect?: boolean | null;\n}): op is Option => {\n  return op.isCorrect != null;\n};\n\n/**\n * Validate alternativa (single choice) question\n * Must select exactly one correct option\n */\nconst validateAlternativa = (\n  selected: Set<string>,\n  options: Option[]\n): ANSWER_STATUS => {\n  if (selected.size !== 1) return ANSWER_STATUS.RESPOSTA_INCORRETA;\n\n  const [selectedId] = selected;\n  return options.find((o) => o.id === selectedId)?.isCorrect\n    ? ANSWER_STATUS.RESPOSTA_CORRETA\n    : ANSWER_STATUS.RESPOSTA_INCORRETA;\n};\n\n/**\n * Validate multipla escolha (multiple choice) question\n * Each option must match its correct state: selected if correct, not selected if incorrect\n */\nconst validateMultiplaEscolha = (\n  selected: Set<string>,\n  options: Option[]\n): ANSWER_STATUS => {\n  const allMatch = options.every((op) => selected.has(op.id) === op.isCorrect);\n\n  return allMatch\n    ? ANSWER_STATUS.RESPOSTA_CORRETA\n    : ANSWER_STATUS.RESPOSTA_INCORRETA;\n};\n\n/**\n * Validate verdadeiro/falso (true/false) question\n * Each statement is evaluated individually: if statement is true, must be selected;\n * if statement is false, must not be selected\n */\nconst validateVerdadeiroFalso = validateMultiplaEscolha;\n\nconst validators: Partial<\n  Record<QUESTION_TYPE, (s: Set<string>, o: Option[]) => ANSWER_STATUS>\n> = {\n  [QUESTION_TYPE.ALTERNATIVA]: validateAlternativa,\n  [QUESTION_TYPE.MULTIPLA_ESCOLHA]: validateMultiplaEscolha,\n  [QUESTION_TYPE.VERDADEIRO_FALSO]: validateVerdadeiroFalso,\n};\n\n/**\n * Auto-validate question based on selected options vs correct options\n * @param questionData - Correction question data\n * @returns ANSWER_STATUS if can determine, null otherwise\n */\nexport const autoValidateQuestion = (\n  questionData: CorrectionQuestionData\n): ANSWER_STATUS | null => {\n  const { result } = questionData;\n\n  if (!canAutoValidate(questionData) || !result.options) return null;\n\n  // Filter options to only include those with isCorrect defined\n  const validOptions = result.options.filter(hasIsCorrect);\n  if (validOptions.length === 0) return null;\n\n  const selected = new Set(\n    result.selectedOptions?.map((o) => o.optionId) ?? []\n  );\n\n  if (selected.size === 0) return ANSWER_STATUS.NAO_RESPONDIDO;\n\n  const validator = validators[result.questionType];\n  if (!validator) return null;\n\n  return validator(selected, validOptions);\n};\n\n/**\n * Get question status from CorrectionQuestionData\n * Maps the result's answerStatus to QuestionStatus\n * If status is PENDENTE_AVALIACAO but can auto-validate, calculates status automatically\n * @param questionData - Correction question data\n * @returns QuestionStatus for UI display\n */\nexport const getQuestionStatusFromData = (\n  questionData: CorrectionQuestionData\n): QuestionStatus => {\n  const { result } = questionData;\n\n  // If pending evaluation, try to auto-validate\n  if (\n    result.answerStatus === ANSWER_STATUS.PENDENTE_AVALIACAO &&\n    canAutoValidate(questionData)\n  ) {\n    const autoValidatedStatus = autoValidateQuestion(questionData);\n    if (autoValidatedStatus !== null) {\n      return mapAnswerStatusToQuestionStatus(autoValidatedStatus);\n    }\n  }\n\n  return mapAnswerStatusToQuestionStatus(result.answerStatus);\n};\n","import type { Question } from '../../components/Quiz/useQuizStore';\nimport { QUESTION_TYPE } from '../../components/Quiz/useQuizStore';\nimport type {\n  QuestionsAnswersByStudentResponse,\n  StudentActivityCorrectionData,\n  CorrectionQuestionData,\n  EssayQuestionCorrection,\n} from './types';\nimport { getIsCorrect } from './utils';\n\n/**\n * Build Question object from answer data\n * @param answer - Answer data from QuestionResult\n * @returns Question object in Quiz format\n */\nconst buildQuestionFromAnswer = (\n  answer: QuestionsAnswersByStudentResponse['data']['answers'][number]\n): Question => {\n  return {\n    id: answer.questionId,\n    statement: answer.statement,\n    questionType: answer.questionType,\n    difficultyLevel: answer.difficultyLevel,\n    description: '',\n    examBoard: null,\n    examYear: null,\n    solutionExplanation: answer.solutionExplanation || null,\n    additionalContent: answer.additionalContent || null,\n    answer: null,\n    answerStatus: answer.answerStatus,\n    options: answer.options || [],\n    knowledgeMatrix: answer.knowledgeMatrix.map((matrix) => ({\n      areaKnowledge: matrix.areaKnowledge || {\n        id: '',\n        name: '',\n      },\n      subject: matrix.subject || {\n        id: '',\n        name: '',\n        color: '',\n        icon: '',\n      },\n      topic: matrix.topic || {\n        id: '',\n        name: '',\n      },\n      subtopic: matrix.subtopic || {\n        id: '',\n        name: '',\n      },\n      content: matrix.content || {\n        id: '',\n        name: '',\n      },\n    })),\n    correctOptionIds:\n      answer.options?.filter((opt) => opt.isCorrect).map((opt) => opt.id) || [],\n  };\n};\n\n/**\n * Build correction data for essay questions\n * @param answer - Answer data from QuestionResult\n * @returns EssayQuestionCorrection if question is DISSERTATIVA, undefined otherwise\n */\nconst buildEssayCorrection = (\n  answer: QuestionsAnswersByStudentResponse['data']['answers'][number]\n): EssayQuestionCorrection | undefined => {\n  if (answer.questionType === QUESTION_TYPE.DISSERTATIVA) {\n    return {\n      isCorrect: getIsCorrect(answer.answerStatus),\n      teacherFeedback: answer.teacherFeedback || '',\n    };\n  }\n  return undefined;\n};\n\n/**\n * Convert a single answer to CorrectionQuestionData format\n * @param answer - Answer data from QuestionResult\n * @param index - Index of the answer (0-based)\n * @returns CorrectionQuestionData formatted for the modal\n */\nconst convertAnswerToQuestionData = (\n  answer: QuestionsAnswersByStudentResponse['data']['answers'][number],\n  index: number\n): CorrectionQuestionData => {\n  const question = buildQuestionFromAnswer(answer);\n  const correction = buildEssayCorrection(answer);\n\n  return {\n    question,\n    result: answer,\n    questionNumber: index + 1,\n    correction,\n  };\n};\n\n/**\n * Convert QuestionResult from API to StudentActivityCorrectionData\n * This function transforms the API response into the format expected by CorrectActivityModal\n * @param apiResponse - API response with answers and statistics\n * @param studentId - Student ID\n * @param studentName - Student name\n * @param observation - Optional teacher observation\n * @param attachment - Optional attachment URL\n * @returns StudentActivityCorrectionData formatted for the modal\n */\nexport const convertApiResponseToCorrectionData = (\n  apiResponse: QuestionsAnswersByStudentResponse,\n  studentId: string,\n  studentName: string,\n  observation?: string,\n  attachment?: string\n): StudentActivityCorrectionData => {\n  const { answers, statistics } = apiResponse.data;\n\n  // Calculate counts from statistics\n  const correctCount = statistics.correctAnswers;\n  const incorrectCount = statistics.incorrectAnswers;\n  const blankCount = statistics.totalAnswered - correctCount - incorrectCount;\n\n  // Convert answers to CorrectionQuestionData format\n  const questions: CorrectionQuestionData[] = answers.map((answer, index) =>\n    convertAnswerToQuestionData(answer, index)\n  );\n\n  return {\n    studentId,\n    studentName,\n    score: statistics.score ?? null,\n    correctCount,\n    incorrectCount,\n    blankCount,\n    questions,\n    observation,\n    attachment,\n  };\n};\n","import type { ReactNode } from 'react';\nimport { ANSWER_STATUS } from '../../../components/Quiz/useQuizStore';\nimport { AlternativesList } from '../../../components/Alternative/Alternative';\nimport { OptionStatus } from '../../../enums/Options';\nimport Text from '../../../components/Text/Text';\nimport type { QuestionRendererProps } from '../types';\n\n/**\n * Render alternative question (single choice)\n * Returns content without wrapper (for accordion use)\n */\nexport const renderQuestionAlternative = ({\n  question,\n  result,\n}: QuestionRendererProps): ReactNode => {\n  // Check if options have isCorrect defined (can auto-validate even if pending)\n  const hasAutoValidation = result?.options?.some(\n    (op) => op.isCorrect !== undefined && op.isCorrect !== null\n  );\n\n  const alternatives = question.options?.map((option) => {\n    const isCorrectOption =\n      result?.options?.find((op) => op.id === option.id)?.isCorrect || false;\n\n    const isSelected =\n      result?.selectedOptions?.some(\n        (selectedOption) => selectedOption.optionId === option.id\n      ) || false;\n\n    // Show correct answers if not pending, OR if we can auto-validate (has isCorrect)\n    const shouldShowCorrectAnswers =\n      result?.answerStatus !== ANSWER_STATUS.PENDENTE_AVALIACAO ||\n      hasAutoValidation;\n\n    let status: OptionStatus;\n    if (shouldShowCorrectAnswers) {\n      if (isCorrectOption) {\n        status = OptionStatus.CORRECT;\n      } else if (isSelected && !isCorrectOption) {\n        status = OptionStatus.INCORRECT;\n      } else {\n        status = OptionStatus.NEUTRAL;\n      }\n    } else {\n      // When pending evaluation and no auto-validation, show all options as neutral\n      status = OptionStatus.NEUTRAL;\n    }\n\n    return {\n      label: option.option,\n      value: option.id,\n      status: status,\n    };\n  });\n\n  if (!alternatives || alternatives.length === 0) {\n    return (\n      <div>\n        <Text size=\"sm\" weight=\"normal\">\n          Não há Alternativas\n        </Text>\n      </div>\n    );\n  }\n\n  return (\n    <div className=\"pt-2\">\n      <AlternativesList\n        mode=\"readonly\"\n        key={`question-${question.id}`}\n        name={`question-${question.id}`}\n        layout=\"compact\"\n        alternatives={alternatives}\n        selectedValue={result?.selectedOptions?.[0]?.optionId || ''}\n      />\n    </div>\n  );\n};\n","import type { ReactNode } from 'react';\nimport { ANSWER_STATUS } from '../../../components/Quiz/useQuizStore';\nimport { MultipleChoiceList } from '../../../components/MultipleChoice/MultipleChoice';\nimport { OptionStatus } from '../../../enums/Options';\nimport Text from '../../../components/Text/Text';\nimport type { QuestionRendererProps } from '../types';\n\n/**\n * Render multiple choice question\n * Returns content without wrapper (for accordion use)\n */\nexport const renderQuestionMultipleChoice = ({\n  question,\n  result,\n}: QuestionRendererProps): ReactNode => {\n  // Check if options have isCorrect defined (can auto-validate even if pending)\n  const hasAutoValidation = result?.options?.some(\n    (op) => op.isCorrect !== undefined && op.isCorrect !== null\n  );\n\n  const choices = question.options?.map((option) => {\n    const isCorrectOption =\n      result?.options?.find((op) => op.id === option.id)?.isCorrect || false;\n\n    const isSelected = result?.selectedOptions?.some(\n      (op) => op.optionId === option.id\n    );\n\n    // Show correct/incorrect status if not pending/blank, OR if we can auto-validate (has isCorrect)\n    const shouldShowCorrectAnswers =\n      (result?.answerStatus !== ANSWER_STATUS.PENDENTE_AVALIACAO &&\n        result?.answerStatus !== ANSWER_STATUS.NAO_RESPONDIDO) ||\n      hasAutoValidation;\n\n    let status: OptionStatus;\n    if (shouldShowCorrectAnswers) {\n      if (isCorrectOption) {\n        status = OptionStatus.CORRECT;\n      } else if (isSelected && !isCorrectOption) {\n        status = OptionStatus.INCORRECT;\n      } else {\n        status = OptionStatus.NEUTRAL;\n      }\n    } else {\n      // When pending evaluation and no auto-validation, show all options as neutral\n      status = OptionStatus.NEUTRAL;\n    }\n\n    return {\n      label: option.option,\n      value: option.id,\n      status,\n    };\n  });\n\n  if (!choices || choices.length === 0) {\n    return (\n      <div>\n        <Text size=\"sm\" weight=\"normal\">\n          Não há Caixas de seleção\n        </Text>\n      </div>\n    );\n  }\n\n  const selectedValues =\n    result?.selectedOptions?.map((op) => op.optionId) || [];\n\n  return (\n    <div className=\"pt-2\">\n      <MultipleChoiceList\n        mode=\"readonly\"\n        key={`question-${question.id}`}\n        name={`question-${question.id}`}\n        choices={choices}\n        selectedValues={selectedValues}\n      />\n    </div>\n  );\n};\n","import { Fragment, useId, type ReactNode } from 'react';\nimport Badge from '../../../components/Badge/Badge';\nimport { CheckCircleIcon } from '@phosphor-icons/react/dist/csr/CheckCircle';\nimport { XCircleIcon } from '@phosphor-icons/react/dist/csr/XCircle';\nimport { cn } from '../../utils';\nimport Text from '../../../components/Text/Text';\nimport type { QuestionRendererProps } from '../types';\nimport { stripHtmlTags } from '../../stringUtils';\nimport { OptionStatus } from '../../../enums/Options';\n\n/**\n * Get status badge component\n */\nexport const getStatusBadge = (status?: OptionStatus): ReactNode => {\n  switch (status) {\n    case OptionStatus.CORRECT:\n      return (\n        <Badge variant=\"solid\" action=\"success\" iconLeft={<CheckCircleIcon />}>\n          Resposta correta\n        </Badge>\n      );\n    case OptionStatus.INCORRECT:\n      return (\n        <Badge variant=\"solid\" action=\"error\" iconLeft={<XCircleIcon />}>\n          Resposta incorreta\n        </Badge>\n      );\n    default:\n      return null;\n  }\n};\n\n/**\n * Container component for question content\n */\nexport const QuestionContainer = ({\n  children,\n  className,\n}: {\n  children: ReactNode;\n  className?: string;\n}) => {\n  return (\n    <div\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    >\n      {children}\n    </div>\n  );\n};\n\n/**\n * Subtitle component for question sections\n */\nexport const QuestionSubTitle = ({ subTitle }: { subTitle: string }) => {\n  return (\n    <div className=\"px-4 pb-2 pt-6\">\n      <Text size=\"md\" weight=\"bold\" color=\"text-text-950\">\n        {subTitle}\n      </Text>\n    </div>\n  );\n};\n\n/**\n * Internal component for fill in the blanks question\n * Uses useId hook to generate unique IDs\n *\n * Data structure:\n * - additionalContent: HTML text with {placeholderId} placeholders\n * - fillAnswers: Record<placeholderId, selectedOptionId> (what student chose)\n * - options: Array<{ id, option }> where id is placeholderId AND correct optionId\n * - Correctness: selectedOptionId === placeholderId means correct\n */\nexport const FillQuestionContent = ({\n  question,\n  result,\n}: QuestionRendererProps) => {\n  const baseId = useId();\n\n  // Get additionalContent (contains HTML with {placeholderId} placeholders)\n  // Falls back to question.statement for older questions that may not have additionalContent\n  const additionalContent =\n    result?.additionalContent ||\n    question.additionalContent ||\n    question.statement ||\n    '';\n\n  // Strip HTML tags for clean text rendering\n  const cleanText = stripHtmlTags(additionalContent);\n\n  // Get options array (id is placeholderId, option is the text)\n  const options =\n    (\n      result as {\n        options?: Array<{ id: string; option: string; isCorrect: boolean }>;\n      }\n    )?.options ||\n    question.options ||\n    [];\n\n  // Build a map of optionId -> option text for quick lookup\n  const optionTextMap: Record<string, string> = {};\n  options.forEach((opt) => {\n    optionTextMap[opt.id] = opt.option;\n  });\n\n  // Get fillAnswers: Record<placeholderId, selectedOptionId>\n  const fillAnswers: Record<string, string> = {};\n  try {\n    const resultWithFill = result as {\n      fillAnswers?: Record<string, string> | null;\n    };\n    if (resultWithFill?.fillAnswers) {\n      Object.assign(fillAnswers, resultWithFill.fillAnswers);\n    } else if (result?.answer) {\n      const parsed =\n        typeof result.answer === 'string'\n          ? JSON.parse(result.answer)\n          : result.answer;\n      if (typeof parsed === 'object') {\n        Object.assign(fillAnswers, parsed);\n      }\n    }\n  } catch {\n    // Ignore parse errors\n  }\n\n  // Helper to get option text by ID - returns null if not found\n  const getOptionTextById = (optionId: string): string | null => {\n    if (!optionId) return null;\n    return optionTextMap[optionId] ?? null;\n  };\n\n  // Check if answer is correct (selectedOptionId === placeholderId)\n  const isAnswerCorrect = (placeholderId: string): boolean => {\n    const selectedOptionId = fillAnswers[placeholderId];\n    return selectedOptionId === placeholderId;\n  };\n\n  // Render student answer badge\n  const renderStudentBadge = (placeholderId: string) => {\n    const selectedOptionId = fillAnswers[placeholderId];\n    const selectedOptionText = getOptionTextById(selectedOptionId);\n    const isCorrect = isAnswerCorrect(placeholderId);\n\n    if (!selectedOptionId) {\n      return (\n        <span className=\"inline-block align-middle mx-1 my-1\">\n          <Badge\n            variant=\"solid\"\n            action=\"error\"\n            iconRight={<XCircleIcon />}\n            size=\"large\"\n            className=\"py-1 px-2\"\n          >\n            Não respondido\n          </Badge>\n        </span>\n      );\n    }\n\n    // Handle case where option ID exists but text is not found\n    const displayText = selectedOptionText ?? 'Opção não encontrada';\n\n    return (\n      <span className=\"inline-block align-middle mx-1 my-1\">\n        <Badge\n          variant=\"solid\"\n          action={isCorrect ? 'success' : 'error'}\n          iconRight={isCorrect ? <CheckCircleIcon /> : <XCircleIcon />}\n          size=\"large\"\n          className=\"py-1 px-2\"\n        >\n          {displayText}\n        </Badge>\n      </span>\n    );\n  };\n\n  // Render correct answer\n  const renderCorrectAnswer = (placeholderId: string) => {\n    // The placeholderId IS the correct option ID\n    const correctOptionText = getOptionTextById(placeholderId);\n    const displayText = correctOptionText ?? '[Resposta não disponível]';\n    return (\n      <span className=\"inline mx-1 text-success-600 font-semibold border-b-2 border-success-600\">\n        {displayText}\n      </span>\n    );\n  };\n\n  // Parse text and render with elements\n  const renderTextWithElements = (text: string, isCorrectAnswer: boolean) => {\n    const elements: Array<{ element: string | ReactNode; id: string }> = [];\n    let lastIndex = 0;\n    const nextId = () => elements.length;\n\n    const regex = /\\{([a-zA-Z0-9-]+)\\}/g;\n    let match;\n\n    while ((match = regex.exec(text)) !== null) {\n      const [fullMatch, placeholderId] = match;\n      const startIndex = match.index;\n\n      // Add text before placeholder\n      if (startIndex > lastIndex) {\n        elements.push({\n          element: text.slice(lastIndex, startIndex),\n          id: `${baseId}-text-${nextId()}`,\n        });\n      }\n\n      // Add the appropriate element\n      if (isCorrectAnswer) {\n        elements.push({\n          element: renderCorrectAnswer(placeholderId),\n          id: `${baseId}-answer-sheet-${nextId()}`,\n        });\n      } else {\n        elements.push({\n          element: renderStudentBadge(placeholderId),\n          id: `${baseId}-student-${nextId()}`,\n        });\n      }\n\n      lastIndex = match.index + fullMatch.length;\n    }\n\n    // Add remaining text\n    if (lastIndex < text.length) {\n      elements.push({\n        element: text.slice(lastIndex),\n        id: `${baseId}-text-${nextId()}`,\n      });\n    }\n\n    return elements;\n  };\n\n  if (!additionalContent) {\n    return (\n      <div className=\"pt-2\">\n        <Text size=\"md\" color=\"text-text-600\" weight=\"normal\">\n          Nenhum conteúdo disponível para esta questão.\n        </Text>\n      </div>\n    );\n  }\n\n  return (\n    <div className=\"pt-2 space-y-4\">\n      <div className=\"space-y-2\">\n        <Text size=\"xs\" weight=\"normal\" color=\"text-text-500\">\n          Resposta do aluno:\n        </Text>\n        <div className=\"p-3 bg-background-50 rounded-lg border border-border-100\">\n          <Text\n            as=\"div\"\n            size=\"md\"\n            color=\"text-text-900\"\n            weight=\"normal\"\n            className=\"leading-[2.5] *:inline\"\n          >\n            {renderTextWithElements(cleanText, false).map((element) => (\n              <Fragment key={element.id}>{element.element}</Fragment>\n            ))}\n          </Text>\n        </div>\n      </div>\n\n      <div className=\"space-y-2\">\n        <Text size=\"xs\" weight=\"normal\" color=\"text-text-500\">\n          Gabarito:\n        </Text>\n        <div className=\"p-3 bg-background-50 rounded-lg border border-border-100\">\n          <Text\n            as=\"div\"\n            size=\"md\"\n            color=\"text-text-900\"\n            weight=\"normal\"\n            className=\"leading-[2.5] *:inline\"\n          >\n            {renderTextWithElements(cleanText, true).map((element) => (\n              <Fragment key={element.id}>{element.element}</Fragment>\n            ))}\n          </Text>\n        </div>\n      </div>\n    </div>\n  );\n};\n","import type { ReactNode } from 'react';\nimport { ANSWER_STATUS } from '../../../components/Quiz/useQuizStore';\nimport { getStatusStyles } from '../../../components/Quiz/QuizContent';\nimport Text from '../../../components/Text/Text';\nimport { cn } from '../../../utils/utils';\nimport type { QuestionRendererProps } from '../types';\nimport { getStatusBadge } from '../components';\nimport { HtmlMathRenderer } from '../../../components/HtmlMathRenderer';\nimport { TrueFalseEnum } from '../../../enums/Quiz';\nimport { OptionStatus } from '../../../enums/Options';\n\n/**\n * Render true or false question\n * Each option has a statement, and student marks V or F for each\n * Returns content without wrapper (for accordion use)\n */\nexport const renderQuestionTrueOrFalse = ({\n  question,\n  result,\n}: QuestionRendererProps): ReactNode => {\n  const options = question.options || [];\n  const getLetterByIndex = (index: number) => String.fromCodePoint(97 + index); // 97 = 'a' in ASCII\n\n  const shouldShowStatus =\n    result?.answerStatus !== ANSWER_STATUS.PENDENTE_AVALIACAO &&\n    result?.answerStatus !== ANSWER_STATUS.NAO_RESPONDIDO;\n\n  return (\n    <div className=\"pt-2\">\n      <div className=\"flex flex-col gap-3.5\">\n        {options.map((option, index) => {\n          // Find student's answer for this option\n          const studentSelection = result?.selectedOptions?.find(\n            (op) => op.optionId === option.id\n          );\n\n          // Get the correct answer from options array (if the statement is true or false)\n          const correctAnswerOption = result?.options?.find(\n            (op) => op.id === option.id\n          );\n          const hasCorrectAnswer = correctAnswerOption?.isCorrect !== undefined;\n          const statementIsTrue = correctAnswerOption?.isCorrect ?? false;\n\n          // Student's answer: isCorrect in selectedOptions represents what user marked\n          // isCorrect: true = user marked V (Verdadeiro)\n          // isCorrect: false = user marked F (Falso)\n          const hasAnswered = studentSelection !== undefined;\n          const studentMarkedTrue = studentSelection?.isCorrect ?? false;\n\n          // Determine if student's answer is correct (only valid when we have the correct answer)\n          // Student is correct if their mark matches the statement's truth value\n          const isStudentCorrect =\n            hasCorrectAnswer &&\n            hasAnswered &&\n            studentMarkedTrue === statementIsTrue;\n\n          // Only show correctness styling when we have the official answer\n          const canShowCorrectness = shouldShowStatus && hasCorrectAnswer;\n          const variantCorrect = isStudentCorrect\n            ? OptionStatus.CORRECT\n            : OptionStatus.INCORRECT;\n          const studentAnswer = studentMarkedTrue\n            ? TrueFalseEnum.VERDADEIRO\n            : TrueFalseEnum.FALSO;\n          const correctAnswer = statementIsTrue\n            ? TrueFalseEnum.VERDADEIRO\n            : TrueFalseEnum.FALSO;\n\n          return (\n            <section\n              key={option.id || `option-${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 border',\n                  canShowCorrectness && hasAnswered\n                    ? getStatusStyles(variantCorrect)\n                    : ''\n                )}\n              >\n                <Text as=\"span\" size=\"sm\" weight=\"normal\" color=\"text-text-900\">\n                  {getLetterByIndex(index).concat(') ')}\n                  <HtmlMathRenderer content={option.option} inline />\n                </Text>\n\n                {canShowCorrectness && hasAnswered && (\n                  <div className=\"flex-shrink-0\">\n                    {getStatusBadge(\n                      isStudentCorrect\n                        ? OptionStatus.CORRECT\n                        : OptionStatus.INCORRECT\n                    )}\n                  </div>\n                )}\n              </div>\n\n              {canShowCorrectness && (\n                <span className=\"flex flex-row gap-2 items-center flex-wrap\">\n                  {hasAnswered ? (\n                    <>\n                      <Text size=\"2xs\" weight=\"normal\" color=\"text-text-800\">\n                        Resposta selecionada: {studentAnswer}\n                      </Text>\n                      {!isStudentCorrect && (\n                        <Text size=\"2xs\" weight=\"normal\" color=\"text-text-800\">\n                          | Resposta correta: {correctAnswer}\n                        </Text>\n                      )}\n                    </>\n                  ) : (\n                    <Text size=\"2xs\" weight=\"normal\" color=\"text-text-800\">\n                      Não respondida | Resposta correta: {correctAnswer}\n                    </Text>\n                  )}\n                </span>\n              )}\n            </section>\n          );\n        })}\n      </div>\n    </div>\n  );\n};\n","import type { ReactNode } from 'react';\nimport { ANSWER_STATUS } from '../../../components/Quiz/useQuizStore';\nimport Text from '../../../components/Text/Text';\nimport type { QuestionRendererProps } from '../types';\nimport { HtmlMathRenderer } from '../../../components/HtmlMathRenderer';\n\n/**\n * Render essay/dissertative question (readonly mode for correction)\n * Returns content without wrapper (for accordion use)\n */\nexport const renderQuestionDissertative = ({\n  result,\n}: Omit<QuestionRendererProps, 'question'>): ReactNode => {\n  const localAnswer = result?.answer || '';\n\n  return (\n    <div className=\"pt-2 space-y-4\">\n      <div className=\"space-y-2\">\n        <Text size=\"sm\" weight=\"normal\" color=\"text-text-950\">\n          Resposta do aluno\n        </Text>\n        <div className=\"p-3 bg-background-50 rounded-lg border border-border-100\">\n          {localAnswer ? (\n            <HtmlMathRenderer\n              content={localAnswer}\n              className=\"text-sm text-text-700\"\n            />\n          ) : (\n            <Text size=\"sm\" weight=\"normal\" color=\"text-text-700\">\n              Nenhuma resposta fornecida\n            </Text>\n          )}\n        </div>\n      </div>\n\n      {result?.answerStatus === ANSWER_STATUS.RESPOSTA_INCORRETA &&\n        result?.teacherFeedback && (\n          <div className=\"space-y-2\">\n            <Text size=\"xs\" weight=\"normal\" color=\"text-text-500\">\n              Observação do professor:\n            </Text>\n            <div className=\"p-3 bg-background-50 rounded-lg border border-border-100\">\n              <HtmlMathRenderer\n                content={result.teacherFeedback}\n                className=\"text-sm text-text-700\"\n              />\n            </div>\n          </div>\n        )}\n    </div>\n  );\n};\n","import type { ReactNode } from 'react';\nimport type { QuestionRendererProps } from '../types';\nimport { FillQuestionContent } from '../components';\n\n/**\n * Render fill in the blanks question\n * Shows text with student answers highlighted (green if correct, red if wrong)\n * Also shows a correct answers section\n * Returns content without wrapper (for accordion use)\n */\nexport const renderQuestionFill = ({\n  question,\n  result,\n}: QuestionRendererProps): ReactNode => {\n  return <FillQuestionContent question={question} result={result} />;\n};\n","import type { ReactNode } from 'react';\nimport ImageQuestion from '../../../assets/img/mock-image-question.png';\nimport Text from '../../../components/Text/Text';\nimport type { QuestionRendererProps } from '../types';\n\n/**\n * Render image question\n * Shows image with clickable area, correct answer circle, and user's answer circle\n */\nexport const renderQuestionImage = ({\n  result,\n}: Omit<QuestionRendererProps, 'question'>): ReactNode => {\n  // Extract position data from result or question\n  // Assuming correct position is stored in question metadata or result\n  const correctPositionRelative = { x: 0.48, y: 0.45 }; // Default, should come from question data\n  const correctRadiusRelative = 0.1; // Default radius\n\n  // Get user's answer position from result\n  // This would typically be stored in result.answer as coordinates\n  let userPositionRelative: { x: number; y: number } | null = null;\n  try {\n    if (result?.answer) {\n      const parsed =\n        typeof result.answer === 'string'\n          ? JSON.parse(result.answer)\n          : result.answer;\n      if (\n        parsed &&\n        typeof parsed.x === 'number' &&\n        typeof parsed.y === 'number'\n      ) {\n        userPositionRelative = { x: parsed.x, y: parsed.y };\n      }\n    }\n  } catch {\n    userPositionRelative = null;\n  }\n\n  // Determine if answer is correct (within radius)\n  const isCorrect = userPositionRelative\n    ? Math.sqrt(\n        Math.pow(userPositionRelative.x - correctPositionRelative.x, 2) +\n          Math.pow(userPositionRelative.y - correctPositionRelative.y, 2)\n      ) <= correctRadiusRelative\n    : false;\n\n  const getUserCircleColorClasses = () => {\n    if (!userPositionRelative) return '';\n    return isCorrect\n      ? 'bg-success-600/70 border-white'\n      : 'bg-indicator-error/70 border-white';\n  };\n\n  // Calculate position descriptions for accessibility\n  const getPositionDescription = (x: number, y: number): string => {\n    const xPercent = Math.round(x * 100);\n    const yPercent = Math.round(y * 100);\n    return `${xPercent}% da esquerda, ${yPercent}% do topo`;\n  };\n\n  const getSpatialRelationship = (): string => {\n    if (!userPositionRelative) {\n      return `Área correta localizada em ${getPositionDescription(\n        correctPositionRelative.x,\n        correctPositionRelative.y\n      )}. Nenhuma resposta do aluno fornecida.`;\n    }\n\n    const deltaX = userPositionRelative.x - correctPositionRelative.x;\n    const deltaY = userPositionRelative.y - correctPositionRelative.y;\n    const distance = Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2));\n    const distancePercent = Math.round(distance * 100);\n\n    let direction: string;\n    if (Math.abs(deltaX) > Math.abs(deltaY)) {\n      direction = deltaX > 0 ? 'à direita' : 'à esquerda';\n    } else {\n      direction = deltaY > 0 ? 'abaixo' : 'acima';\n    }\n\n    const correctPos = getPositionDescription(\n      correctPositionRelative.x,\n      correctPositionRelative.y\n    );\n    const userPos = getPositionDescription(\n      userPositionRelative.x,\n      userPositionRelative.y\n    );\n\n    return `Área correta localizada em ${correctPos}. Resposta do aluno em ${userPos}. A resposta do aluno está ${distancePercent}% de distância ${direction} da área correta. ${isCorrect ? 'A resposta está dentro da área de tolerância e é considerada correta.' : 'A resposta está fora da área de tolerância e é considerada incorreta.'}`;\n  };\n\n  const correctPositionDescription = getPositionDescription(\n    correctPositionRelative.x,\n    correctPositionRelative.y\n  );\n  const imageAltText = `Questão de imagem com área correta localizada em ${correctPositionDescription}`;\n\n  return (\n    <div className=\"pt-2 space-y-4\">\n      {/* Legend */}\n      <div className=\"flex items-center gap-4 text-xs\">\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          <Text size=\"sm\" weight=\"normal\" color=\"text-text-600\">\n            Área correta\n          </Text>\n        </div>\n        {userPositionRelative && (\n          <>\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              <Text size=\"sm\" weight=\"normal\" color=\"text-text-600\">\n                Resposta correta\n              </Text>\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              <Text size=\"sm\" weight=\"normal\" color=\"text-text-600\">\n                Resposta incorreta\n              </Text>\n            </div>\n          </>\n        )}\n      </div>\n\n      {/* Image container */}\n      <div className=\"relative w-full\">\n        {/* Hidden text summary for screen readers */}\n        <div className=\"sr-only\">{getSpatialRelationship()}</div>\n\n        <img\n          src={ImageQuestion}\n          alt={imageAltText}\n          className=\"w-full h-auto rounded-md\"\n        />\n\n        {/* Correct answer circle */}\n        <div\n          role=\"img\"\n          aria-label={`Área correta marcada em ${correctPositionDescription}`}\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          <Text\n            size=\"sm\"\n            weight=\"normal\"\n            color=\"text-text-600\"\n            className=\"sr-only\"\n          >\n            Círculo amarelo indicando a área correta da resposta, posicionado em{' '}\n            {correctPositionDescription}\n          </Text>\n        </div>\n\n        {/* User's answer circle */}\n        {userPositionRelative && (\n          <div\n            role=\"img\"\n            aria-label={`Resposta do aluno marcada em ${getPositionDescription(\n              userPositionRelative.x,\n              userPositionRelative.y\n            )}, ${isCorrect ? 'correta' : 'incorreta'}`}\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(${userPositionRelative.x * 100}% - 2.5%)`,\n              top: `calc(${userPositionRelative.y * 100}% - 2.5%)`,\n            }}\n          >\n            <Text\n              size=\"sm\"\n              weight=\"normal\"\n              color=\"text-text-600\"\n              className=\"sr-only\"\n            >\n              Círculo {isCorrect ? 'verde' : 'vermelho'} indicando a resposta do\n              aluno, posicionado em{' '}\n              {getPositionDescription(\n                userPositionRelative.x,\n                userPositionRelative.y\n              )}\n              . A resposta está{' '}\n              {Math.round(\n                Math.sqrt(\n                  Math.pow(\n                    userPositionRelative.x - correctPositionRelative.x,\n                    2\n                  ) +\n                    Math.pow(\n                      userPositionRelative.y - correctPositionRelative.y,\n                      2\n                    )\n                ) * 100\n              )}\n              % de distância da área correta e é considerada{' '}\n              {isCorrect ? 'correta' : 'incorreta'}.\n            </Text>\n          </div>\n        )}\n      </div>\n    </div>\n  );\n};\n","import type { ReactNode } from 'react';\nimport { cn } from '../../../utils/utils';\nimport Text from '../../../components/Text/Text';\nimport { QuestionSubTitle, QuestionContainer } from '../components';\n\n/**\n * Render connect dots question (not implemented)\n */\nexport const renderQuestionConnectDots = ({\n  paddingBottom,\n}: {\n  paddingBottom?: string;\n} = {}): ReactNode => {\n  return (\n    <>\n      <QuestionSubTitle subTitle=\"Tipo de questão: Ligar Pontos\" />\n      <QuestionContainer className={cn('', paddingBottom)}>\n        <div className=\"space-y-4\">\n          <Text size=\"md\" weight=\"normal\" color=\"text-text-600\">\n            Tipo de questão: Ligar Pontos (não implementado)\n          </Text>\n        </div>\n      </QuestionContainer>\n    </>\n  );\n};\n","import type { ReactNode } from 'react';\nimport { QUESTION_TYPE } from '../../components/Quiz/useQuizStore';\nimport { renderQuestionAlternative } from './alternative';\nimport { renderQuestionMultipleChoice } from './multipleChoice';\nimport { renderQuestionTrueOrFalse } from './trueOrFalse';\nimport { renderQuestionDissertative } from './dissertative';\nimport { renderQuestionFill } from './fill';\nimport { renderQuestionImage } from './image';\nimport { renderQuestionConnectDots } from './connectDots';\nimport type { QuestionRendererProps } from './types';\n\n// Re-export types\nexport type { QuestionRendererProps } from './types';\n\n// Re-export components\nexport {\n  getStatusBadge,\n  QuestionContainer,\n  QuestionSubTitle,\n  FillQuestionContent,\n} from './components';\n\n// Re-export individual renderers\nexport { renderQuestionAlternative } from './alternative';\nexport { renderQuestionMultipleChoice } from './multipleChoice';\nexport { renderQuestionTrueOrFalse } from './trueOrFalse';\nexport { renderQuestionDissertative } from './dissertative';\nexport { renderQuestionFill } from './fill';\nexport { renderQuestionImage } from './image';\nexport { renderQuestionConnectDots } from './connectDots';\n\n/**\n * Map question types to their render functions\n */\nconst questionRendererMap = {\n  [QUESTION_TYPE.ALTERNATIVA]: renderQuestionAlternative,\n  [QUESTION_TYPE.MULTIPLA_ESCOLHA]: renderQuestionMultipleChoice,\n  [QUESTION_TYPE.VERDADEIRO_FALSO]: renderQuestionTrueOrFalse,\n  [QUESTION_TYPE.DISSERTATIVA]: renderQuestionDissertative,\n  [QUESTION_TYPE.PREENCHER_LACUNAS]: renderQuestionFill,\n  [QUESTION_TYPE.IMAGEM]: renderQuestionImage,\n  [QUESTION_TYPE.RELACIONAR]: renderQuestionConnectDots,\n};\n\n/**\n * Render question based on question type\n * @param props - Question renderer props\n * @returns Rendered question content\n */\nexport const renderQuestion = (props: QuestionRendererProps): ReactNode => {\n  const { question } = props;\n  const renderer = questionRendererMap[question.questionType];\n\n  if (!renderer) {\n    // Fallback: try to render based on options presence\n    if (question.options && question.options.length > 0) {\n      return renderQuestionAlternative(props);\n    }\n    return renderQuestionDissertative({ result: props.result });\n  }\n\n  // Handle renderers with different prop requirements\n  switch (question.questionType) {\n    case QUESTION_TYPE.DISSERTATIVA:\n      return renderQuestionDissertative({ result: props.result });\n    case QUESTION_TYPE.IMAGEM:\n      return renderQuestionImage({ result: props.result });\n    case QUESTION_TYPE.RELACIONAR:\n      return renderQuestionConnectDots({ paddingBottom: '' });\n    case QUESTION_TYPE.ALTERNATIVA:\n    case QUESTION_TYPE.MULTIPLA_ESCOLHA:\n    case QUESTION_TYPE.VERDADEIRO_FALSO:\n    case QUESTION_TYPE.PREENCHER_LACUNAS:\n      return renderer(props);\n    default:\n      return null;\n  }\n};\n\n/**\n * Type for question renderer map\n */\nexport type QuestionRendererMap = Record<QUESTION_TYPE, () => ReactNode>;\n\n/**\n * Render from a map of renderers\n * @param renderers - Map of question type to render function\n * @param questionType - Type of question to render\n * @returns Rendered content or null\n */\nexport const renderFromMap = (\n  renderers: QuestionRendererMap,\n  questionType?: QUESTION_TYPE\n) => {\n  if (!questionType) return null;\n  const renderer = renderers[questionType];\n  return renderer ? renderer() : null;\n};\n"],"mappings":"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","names":["jsx","jsx","Fragment","jsx","jsxs","jsx","jsxs","jsx","Fragment","jsx","jsxs","Fragment","jsx","jsxs","Fragment","jsx","jsxs"]}