chore: simplify grading for self paced course (#326)

* updated the grading flow for self paced course

* updated some logic and translations

* fix bug with newsfeed not opening for students and fix more bugs

* remove console

* add blog template route

* add doc page

---------

Co-authored-by: Rotimi Best <best@classroomio.com>
This commit is contained in:
Em_Dev
2024-05-25 05:50:14 +01:00
committed by GitHub
co-authored by Rotimi Best
parent 44087c458e
commit fc0b91a493
23 changed files with 144 additions and 176 deletions
@@ -0,0 +1 @@
<slot />
@@ -4,6 +4,8 @@
import TextareaQuestion from '$lib/components/Question/TextareaQuestion/index.svelte';
import { QUESTION_TYPE } from '$lib/components/Question/constants';
import { getPropsForQuestion } from './functions';
import { course } from '$lib/components/Course/store';
import { COURSE_TYPE } from '$lib/utils/types';
export let questions = [];
export let questionnaireMetaData = {};
@@ -37,6 +39,7 @@
handleGrade={handleGrade(currentQuestion.id)}
{disableGrading}
disabled={true}
hideGrading={$course.type === COURSE_TYPE.SELF_PACED}
/>
{:else if QUESTION_TYPE.CHECKBOX === currentQuestion.question_type.id}
<CheckboxQuestion
@@ -57,6 +60,7 @@
handleGrade={handleGrade(currentQuestion.id)}
{disableGrading}
disabled={true}
hideGrading={$course.type === COURSE_TYPE.SELF_PACED}
/>
{:else if QUESTION_TYPE.TEXTAREA === currentQuestion.question_type.id}
<TextareaQuestion
@@ -77,6 +81,7 @@
handleGrade={handleGrade(currentQuestion.id)}
{disableGrading}
disabled={true}
hideGrading={$course.type === COURSE_TYPE.SELF_PACED}
/>
{/if}
{/each}
@@ -17,11 +17,7 @@
import { getPropsForQuestion, filterOutDeleted, wasCorrectAnswerSelected } from './functions';
import { formatAnswers, getGroupMemberId } from '$lib/components/Course/function';
import { submitExercise } from '$lib/utils/services/courses';
import {
fetchSubmission,
updateQuestionAnswer,
updateSubmission
} from '$lib/utils/services/submissions';
import { fetchSubmission } from '$lib/utils/services/submissions';
import { profile } from '$lib/utils/store/user';
import { currentOrg } from '$lib/utils/store/org';
import {
@@ -30,9 +26,8 @@
} from '$lib/utils/services/notification/notification';
import { lesson } from '../store/lessons';
import { browser } from '$app/environment';
import { useCompletion } from 'ai/svelte';
import { COURSE_TYPE } from '$lib/utils/types';
import GradingLoader from './GradingLoader.svelte';
import { t } from '$lib/utils/functions/translations';
export let preview: boolean = false;
export let exerciseId = '';
@@ -44,10 +39,7 @@
let hasSubmission = false;
let isLoadingAutoSavedData = false;
let alreadyCheckedAutoSavedData = false;
let gradedComment = true;
let isLoading = false;
let submissionResponse;
let submissionId;
function handleStart() {
$questionnaireMetaData.currentQuestionIndex += 1;
@@ -88,89 +80,7 @@
});
};
const { input, handleSubmit, completion } = useCompletion({
api: '/api/completion/gradingprompt',
onFinish: async () => {
try {
const responseData = $completion.replace('```json', '').replace('```', '');
let aiResponses = [];
try {
// Parse the modified response data as JSON
aiResponses = JSON.parse(responseData);
} catch (error) {
console.error('Error parsing AI response', error);
}
$questionnaire.questions.forEach((question) => {
const { id, points, question_type_id } = question;
let questionAnswer = submissionResponse?.res?.data.find(
(answer) => answer.question_id === id
);
console.log('this is the question answer', questionAnswer);
if (question_type_id !== QUESTION_TYPE.TEXTAREA) {
const answer = $questionnaireMetaData.answers[question.name];
let score = points / answer.length;
$questionnaireMetaData.grades = {
...$questionnaireMetaData.grades,
[id]: score
};
updateQuestionAnswer({ point: score }, { id: questionAnswer?.id });
} else if (aiResponses.length) {
const graded = aiResponses.find((res) => res.id === id);
$questionnaireMetaData.grades = {
...$questionnaireMetaData.grades,
[id]: graded.score
};
updateQuestionAnswer({ point: graded.score }, { id: questionAnswer?.id });
}
});
$questionnaireMetaData.finalTotalGrade = Object.values(
$questionnaireMetaData.grades
).reduce((acc, answer): number => {
return acc + answer;
}, 0);
updateSubmission({
id: submissionId,
status_id: STATUS.GRADED,
total: $questionnaireMetaData.finalTotalGrade
});
$questionnaireMetaData.status = STATUS.GRADED;
console.log('grade', $questionnaireMetaData.finalTotalGrade);
} catch (error) {
console.error('Error', error);
} finally {
isLoading = false;
}
}
});
function automaticGrading(answers, questions) {
const paragraphAiInput = questions
.filter((q) => q.question_type_id === QUESTION_TYPE.TEXTAREA)
.map((q) => {
const answer = answers?.answers[q.name]; // { open_answer: '' }
return {
id: q.id,
question: q.title,
answer: answer,
point: q.points
};
});
$input = JSON.stringify(paragraphAiInput);
handleSubmit({ preventDefault: () => {} });
}
async function onSubmit(id, value) {
if ($course.type === COURSE_TYPE.SELF_PACED) {
isLoading = true;
}
const { answers } = $questionnaireMetaData;
const { questions } = $questionnaire;
const prevAnswer = answers[id] || [];
@@ -220,11 +130,6 @@
);
if (response) {
submissionResponse = response;
submissionId = submissionResponse.submission[0]?.id;
}
if ($course.type === COURSE_TYPE.SELF_PACED) {
automaticGrading($questionnaireMetaData, $questionnaire.questions);
}
notifyEducator();
@@ -316,10 +221,6 @@
alreadyCheckedAutoSavedData = true;
}
const toggleComments = () => {
gradedComment = !gradedComment;
};
$: browser && !alreadyCheckedAutoSavedData && getAutoSavedData();
// Reactive code
@@ -406,42 +307,46 @@
</div>
</RoleBasedSecurity>
{:else if $questionnaireMetaData.isFinished}
{#if isLoading}
<GradingLoader />
{:else if !isLoading && !isLoadingAutoSavedData}
{#if !isLoadingAutoSavedData}
<div class="flex items-center justify-between">
<div class="flex flex-col lg:flex-row items-start lg:items-center lg:space-x-4 w-full">
<h2 class="text-xl font-normal">{$questionnaire.title}</h2>
{#if STATUS.GRADED === $questionnaireMetaData.status}
<span
class="status-text bg-green-700 text-white py-1 px-2 text-center"
title="Status: Pending Review"
title={$t('course.navItem.lessons.exercises.all_exercises.view_mode.status_graded')}
>
Graded
{$t('course.navItem.lessons.exercises.all_exercises.view_mode.graded')}
</span>
{:else if $course.type === COURSE_TYPE.SELF_PACED}
<span
class="status-text bg-green-700 text-white py-1 px-2 text-center"
title={$t('course.navItem.lessons.exercises.all_exercises.view_mode.status_submitted')}
>
{$t('course.navItem.lessons.exercises.all_exercises.view_mode.submitted')}
</span>
{:else}
<span
class="status-text bg-yellow-600 text-white py-1 px-2 text-center"
title="Status: Pending Review"
title={$t('course.navItem.lessons.exercises.all_exercises.view_mode.status_pending')}
>
Pending
{$t('course.navItem.lessons.exercises.all_exercises.view_mode.pending')}
</span>
{/if}
</div>
{#if STATUS.GRADED === $questionnaireMetaData.status}
{#if STATUS.GRADED === $questionnaireMetaData.status && $course.type !== COURSE_TYPE.SELF_PACED}
<span
class="p-6 border-2 border-gray-300 bg-[#F5F8FE] rounded-full h-10 w-10 flex items-center justify-center text-[#2751DA] text-sm font-semibold"
title="Status: Pending Review"
title={$t('course.navItem.lessons.exercises.all_exercises.view_mode.status_graded')}
>
{$questionnaireMetaData.finalTotalGrade}/{$questionnaireMetaData.totalPossibleGrade}
</span>
{/if}
</div>
{#if $questionnaireMetaData.status === STATUS.GRADED && $questionnaireMetaData.comment}
<div
class="flex items-center justify-between bg-primary-700 p-4 text-white font-semibold rounded-sm mt-3"
>
{#if $questionnaireMetaData.status === STATUS.GRADED && $questionnaireMetaData.comment && $course.type !== COURSE_TYPE.SELF_PACED}
<div class="flex items-center justify-between bg-primary-700 p-4 text-white rounded-sm mt-3">
<span> {$questionnaireMetaData.comment}</span>
</div>
{/if}
@@ -18,7 +18,6 @@
export let courseId = '';
export let path = '';
export let isExercisePage = false;
export let isStudent = false;
export let isFetching = false;
export let containerClass = '';
@@ -51,20 +50,16 @@
$: onCourseIdChange(courseId);
$: if (typeof $globalStore.isStudent !== 'boolean') {
$: {
const user = $group.people.find((person) => person.profile_id === $profile.id);
if (user) {
isStudent = user.role_id === 3;
$globalStore.isStudent = isStudent;
$globalStore.isStudent = user.role_id === 3;
filterPollsByStatus(isStudent);
filterPollsByStatus($globalStore.isStudent);
} else if ($profile.id && $group.people.length) {
// Current User doesn't have permission to view
isPermitted = false;
}
} else {
isStudent = $globalStore.isStudent;
}
</script>
@@ -97,7 +92,7 @@
</Modal>
<div class="root">
<Navigation {path} {isStudent} />
<Navigation {path} isStudent={$globalStore.isStudent} />
<div class="rightBar {containerClass}" class:isMobile={$isMobile}>
{#if isExercisePage}
<Confetti />
@@ -7,6 +7,8 @@
import Grade from '$lib/components/Question/Grade.svelte';
import { t } from '$lib/utils/functions/translations';
import ReasonBox from '../ReasonBox.svelte';
import { course } from '$lib/components/Course/store';
import { COURSE_TYPE } from '$lib/utils/types';
export let title = '';
export let index = 1;
@@ -17,6 +19,7 @@
export let onPrevious = () => {};
export let defaultValue = [];
export let disablePreviousButton = false;
export let isLast = false;
export let disabled = false;
export let isPreview = false;
export let nextButtonProps = {};
@@ -134,7 +137,9 @@
<PrimaryButton
variant={nextButtonProps.isActive ? VARIANTS.CONTAINED : VARIANTS.OUTLINED}
type="submit"
label={nextButtonProps.label}
label={isLast
? $t('course.navItem.lessons.exercises.all_exercises.finish')
: $t('course.navItem.lessons.exercises.all_exercises.next')}
isDisabled={nextButtonProps.isDisabled}
{name}
/>
@@ -7,6 +7,8 @@
import Grade from '$lib/components/Question/Grade.svelte';
import { t } from '$lib/utils/functions/translations';
import ReasonBox from '../ReasonBox.svelte';
import { COURSE_TYPE } from '$lib/utils/types';
import { course } from '$lib/components/Course/store';
export let title = '';
export let index = 1;
@@ -20,6 +22,7 @@
export let disabled = false;
export let isPreview = false;
export let nextButtonProps = {};
export let isLast = false;
export let grade: number;
export let gradeMax = 0;
export let disableGrading = false;
@@ -135,7 +138,9 @@
<PrimaryButton
variant={nextButtonProps.isActive ? VARIANTS.CONTAINED : VARIANTS.OUTLINED}
type="submit"
label={nextButtonProps.label}
label={isLast
? $t('course.navItem.lessons.exercises.all_exercises.finish')
: $t('course.navItem.lessons.exercises.all_exercises.next')}
isDisabled={nextButtonProps.isDisabled}
{name}
/>
@@ -7,6 +7,8 @@
import Grade from '$lib/components/Question/Grade.svelte';
import { t } from '$lib/utils/functions/translations';
import ReasonBox from '../ReasonBox.svelte';
import { course } from '$lib/components/Course/store';
import { COURSE_TYPE } from '$lib/utils/types';
export let title = '';
export let index = 1;
@@ -76,7 +78,9 @@
<div class="ml-4">
{#if disabled}
<div class="bg-gray-200 dark:bg-gray-500 py-3 px-5 rounded-md mb-3">
{defaultValue}
{defaultValue === ''
? $t('course.navItem.lessons.exercises.all_exercises.no_answer')
: defaultValue}
</div>
{#if gradeWithAI}
<ReasonBox {reason} {isLoading} {acceptGrade} {rejectGrade} />
@@ -95,7 +99,7 @@
<PrimaryButton
variant={VARIANTS.OUTLINED}
onClick={handlePrevious}
label="Previous"
label={$t('course.navItem.lessons.exercises.all_exercises.previous')}
isDisabled={disablePreviousButton}
/>
<PrimaryButton
@@ -76,8 +76,12 @@
$: {
if (editorRef && lastVal !== value) {
editorRef.setContent(value);
text = editorRef.getContent({ format: 'text' });
try {
editorRef.setContent(value);
text = editorRef.getContent({ format: 'text' });
} catch (error) {
console.error('Error setting default value', error);
}
}
if (editorRef && disabled !== disablindCache) {
disablindCache = disabled;
@@ -15,11 +15,6 @@ const lessonSchema = z.object({
title: z.string().nonempty({ message: 'Title cannot be empty' }),
lesson_at: z.string().optional(),
call_url: z.string().nullable().optional(),
profile: z
.object({
id: z.string().optional()
})
.optional(),
is_unlocked: z.boolean()
});
@@ -582,7 +582,11 @@
"no_description": "Keine Beschreibung",
"start": "Start",
"graded": "Benotet",
"pending": "Ausstehend"
"pending": "Ausstehend",
"submitted": "Eingereicht",
"status_pending": "Status: Ausstehende Überprüfung",
"status_graded": "Status: Überprüfung abgeschlossen",
"status_submitted": "Status: Eingereicht"
},
"edit_mode": {
"delete_modal": "Modal löschen",
@@ -611,7 +615,9 @@
"heading": "Beschreibung",
"describe": "Beschreiben Sie Ihrem Schüler die Übung",
"no": "Keine Beschreibung"
}
},
"no_answer": "Es wurde keine Antwort gegeben",
"check": "Überprüfen"
},
"new_exercise_modal": {
"heading": "Neue Übung",
@@ -709,12 +715,12 @@
"modal_heading": "Neue Lektion hinzufügen",
"lesson_title": "Titel der Lektion",
"click_to": "Klicke um",
"lock": "sperren",
"unlock": "Freischalten",
"fullname": "vollständiger Name",
"save": "Speichern",
"edit": "Bearbeiten",
"delete": "Löschen"
"delete": "Löschen",
"lock": "Sperren",
"unlock": "Freischalten"
},
"disabled": "Funktion ist deaktiviert"
},
@@ -499,8 +499,8 @@
"modal_heading": "Add New Lesson",
"lesson_title": "Lesson Title",
"click_to": "Click to",
"lock": "lock",
"unlock": "unlock",
"lock": "Lock",
"unlock": "Unlock",
"fullname": "fullname",
"save": "Save",
"edit": "Edit",
@@ -629,6 +629,7 @@
"order_questions": "Order questions",
"write_your_answer": "Write your answer",
"write_your_answer_here": "Write your answer here",
"no_answer": "No answer was provided",
"write_your_question_here": "Write your question here",
"write_your_title": "Write your title here",
"write_your_subtitle": "Write your subtitle here",
@@ -645,6 +646,7 @@
"previous": "Previous",
"finish": "Finish",
"next": "Next",
"check": "Check",
"description": {
"title": "Title",
"heading": "Description",
@@ -684,7 +686,11 @@
"no_description": "No description",
"start": "Start",
"graded": "Graded",
"pending": "Pending"
"pending": "Pending",
"submitted": "Submitted",
"status_pending": "Status: Pending Review",
"status_graded": "Status: Review Completed",
"status_submitted": "Status: Submitted"
},
"analytics": {
"summary": {
@@ -582,7 +582,11 @@
"no_description": "Sin descripción",
"start": "Comenzar",
"graded": "Calificado",
"pending": "Pendiente"
"pending": "Pendiente",
"submitted": "Enviado",
"status_pending": "Estado: Pendiente de revisión",
"status_graded": "Estado: Revisión completada",
"status_submitted": "Estado: Enviado"
},
"edit_mode": {
"delete_modal": "Eliminar modal",
@@ -611,7 +615,9 @@
"heading": "Descripción",
"describe": "Describe el ejercicio a tu estudiante.",
"no": "Sin descripción"
}
},
"no_answer": "No se proporcionó respuesta",
"check": "Controlar"
},
"new_exercise_modal": {
"heading": "Nuevo ejercicio",
@@ -709,12 +715,12 @@
"modal_heading": "Agregar nueva lección",
"lesson_title": "Título de la lección",
"click_to": "Haga clic para",
"lock": "cerrar",
"unlock": "desbloquear",
"fullname": "nombre completo",
"save": "Ahorrar",
"edit": "Editar",
"delete": "Borrar"
"delete": "Borrar",
"lock": "Cerrar",
"unlock": "desbloquear"
},
"disabled": "La característica está deshabilitada"
},
@@ -582,7 +582,11 @@
"no_description": "Pas de description",
"start": "Commencer",
"graded": "Noté",
"pending": "En attente"
"pending": "En attente",
"submitted": "Soumis",
"status_pending": "Statut : En attente d'examen",
"status_graded": "Statut : Examen terminé",
"status_submitted": "Statut : Soumis"
},
"edit_mode": {
"delete_modal": "Supprimer le modal",
@@ -611,7 +615,9 @@
"heading": "Description",
"describe": "Décrivez l'exercice à votre élève",
"no": "Pas de description"
}
},
"no_answer": "Aucune réponse n'a été fournie",
"check": "Vérifier"
},
"new_exercise_modal": {
"heading": "Nouvel exercice",
@@ -709,12 +715,12 @@
"modal_heading": "Ajouter une nouvelle leçon",
"lesson_title": "Titre de la leçon",
"click_to": "Cliquez pour",
"lock": "verrouillage",
"unlock": "ouvrir",
"fullname": "nom et prénom",
"save": "Sauvegarder",
"edit": "Modifier",
"delete": "Supprimer"
"delete": "Supprimer",
"lock": "Verrouillage",
"unlock": "Ouvrir"
},
"disabled": "La fonctionnalité est désactivée"
},
@@ -582,7 +582,11 @@
"no_description": "कोई विवरण नहीं",
"start": "शुरू",
"graded": "ग्रेड दिया गया",
"pending": "लंबित"
"pending": "लंबित",
"submitted": "प्रस्तुत",
"status_pending": "स्थिति: समीक्षा लंबित",
"status_graded": "स्थिति: समीक्षा पूरी हुई",
"status_submitted": "स्थिति: सबमिट किया गया"
},
"edit_mode": {
"delete_modal": "मोडल हटाएँ",
@@ -611,7 +615,9 @@
"heading": "विवरण",
"describe": "अपने विद्यार्थी को व्यायाम का वर्णन करें",
"no": "कोई विवरण नहीं"
}
},
"no_answer": "कोई उत्तर नहीं दिया गया",
"check": "जाँच करना"
},
"new_exercise_modal": {
"heading": "नया व्यायाम",
@@ -709,12 +715,12 @@
"modal_heading": "नया पाठ जोड़ें",
"lesson_title": "पाठ का शीर्षक",
"click_to": "के लिए क्लिक करें",
"lock": "ताला",
"unlock": "अनलॉक",
"fullname": "पूरा नाम",
"save": "बचाना",
"edit": "संपादन करना",
"delete": "मिटाना"
"delete": "मिटाना",
"lock": "ताला",
"unlock": "अनलॉक"
},
"disabled": "सुविधा अक्षम है"
},
@@ -582,7 +582,11 @@
"no_description": "Sem descrição",
"start": "Começar",
"graded": "Classificado",
"pending": "Pendente"
"pending": "Pendente",
"submitted": "Submetido",
"status_pending": "Status: revisão pendente",
"status_graded": "Status: Revisão concluída",
"status_submitted": "Status: Enviado"
},
"edit_mode": {
"delete_modal": "Excluir Modal",
@@ -611,7 +615,9 @@
"heading": "Descrição",
"describe": "Descreva o exercício para seu aluno",
"no": "Sem descrição"
}
},
"no_answer": "Nenhuma resposta foi fornecida",
"check": "Verificar"
},
"new_exercise_modal": {
"heading": "Novo exercício",
@@ -709,12 +715,12 @@
"modal_heading": "Adicionar nova lição",
"lesson_title": "Título da lição",
"click_to": "Clique para",
"lock": "trancar",
"unlock": "desbloquear",
"fullname": "nome completo",
"save": "Salvar",
"edit": "Editar",
"delete": "Excluir"
"delete": "Excluir",
"lock": "Trancar",
"unlock": "Desbloquear"
},
"disabled": "O recurso está desativado"
},
@@ -582,7 +582,11 @@
"no_description": "без описания",
"start": "Начинать",
"graded": "Оцененный",
"pending": "В ожидании"
"pending": "В ожидании",
"submitted": "Поданный",
"status_pending": "Статус: Ожидает рассмотрения",
"status_graded": "Статус: Проверка завершена",
"status_submitted": "Статус: Отправлено"
},
"edit_mode": {
"delete_modal": "Удалить модальное окно",
@@ -611,7 +615,9 @@
"heading": "Описание",
"describe": "Опишите упражнение своему ученику.",
"no": "без описания"
}
},
"no_answer": "Ответ не был предоставлен",
"check": "Проверять"
},
"new_exercise_modal": {
"heading": "Новое упражнение",
@@ -709,12 +715,12 @@
"modal_heading": "Добавить новый урок",
"lesson_title": "Название урока",
"click_to": "Нажмите для",
"lock": "замок",
"unlock": "разблокировать",
"fullname": "полное имя",
"save": "Сохранять",
"edit": "Редактировать",
"delete": "Удалить"
"delete": "Удалить",
"lock": "Замок",
"unlock": "Разблокировать"
},
"disabled": "Функция отключена"
},
@@ -582,7 +582,11 @@
"no_description": "Không có mô tả",
"start": "Bắt đầu",
"graded": "Đã chấm điểm",
"pending": "Chưa giải quyết"
"pending": "Chưa giải quyết",
"submitted": "Đã gửi",
"status_pending": "Trạng thái: Đang chờ xem xét",
"status_graded": "Trạng thái: Đánh giá đã hoàn thành",
"status_submitted": "Trạng thái: Đã gửi"
},
"edit_mode": {
"delete_modal": "Xóa phương thức",
@@ -611,7 +615,9 @@
"heading": "Sự miêu tả",
"describe": "Mô tả bài tập cho học sinh của bạn",
"no": "Không có mô tả"
}
},
"no_answer": "Không có câu trả lời nào được đưa ra",
"check": "Kiểm tra"
},
"new_exercise_modal": {
"heading": "Bài tập mới",
@@ -709,12 +715,12 @@
"modal_heading": "Thêm bài học mới",
"lesson_title": "Tiêu đề bài học",
"click_to": "Bấm vào để",
"lock": "khóa",
"unlock": "mở khóa",
"fullname": "Họ và tên",
"save": "Cứu",
"edit": "Biên tập",
"delete": "Xóa bỏ"
"delete": "Xóa bỏ",
"lock": "Khóa",
"unlock": "Mở khóa"
},
"disabled": "Tính năng bị vô hiệu hóa"
},
@@ -228,7 +228,7 @@
const roles: number[] = [1, 2];
if (org.customization.course.newsfeed) {
roles.concat([3]);
roles.push(3);
}
return roles;
@@ -296,7 +296,7 @@
<!-- 3 dot edit -->
<div class="flex flex-row">
<RoleBasedSecurity allowedRoles={[1, 2]}>
<OverflowMenu size="xl" class={`absolute right-0 top-0`}>
<OverflowMenu size="xl">
<OverflowMenuItem
disabled={$globalStore.isStudent}
text={lesson.is_unlocked
@@ -208,7 +208,6 @@
return true;
});
console.log(`itemToWithNewStatus`, itemToWithNewStatus);
// Move to right column
if (itemToWithNewStatus) {
sections[nextStatusId - 1].items = [...sections[nextStatusId - 1].items, itemToWithNewStatus];
@@ -245,7 +244,6 @@
const questionAnswer = questionAnswers.find(
(answer: { question_id: string }) => answer.question_id == questionId
);
console.log('this is the question answer in the admin side', questionAnswer);
const point = questionAnswerByPoint[questionId];
totalPoints += parseInt(point, 10);
@@ -0,0 +1,2 @@
tinymce.Resource.add('content/default/content.css', "body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Open Sans','Helvetica Neue',sans-serif;line-height:1.4;margin:1rem}table{border-collapse:collapse}table:not([cellpadding]) td,table:not([cellpadding]) th{padding:.4rem}table[border]:not([border=\"0\"]):not([style*=border-width]) td,table[border]:not([border=\"0\"]):not([style*=border-width]) th{border-width:1px}table[border]:not([border=\"0\"]):not([style*=border-style]) td,table[border]:not([border=\"0\"]):not([style*=border-style]) th{border-style:solid}table[border]:not([border=\"0\"]):not([style*=border-color]) td,table[border]:not([border=\"0\"]):not([style*=border-color]) th{border-color:#ccc}figure{display:table;margin:1rem auto}figure figcaption{color:#999;display:block;margin-top:.25rem;text-align:center}hr{border-color:#ccc;border-style:solid;border-width:1px 0 0 0}code{background-color:#e8e8e8;border-radius:3px;padding:.1rem .2rem}.mce-content-body:not([dir=rtl]) blockquote{border-left:2px solid #ccc;margin-left:1.5rem;padding-left:1rem}.mce-content-body[dir=rtl] blockquote{border-right:2px solid #ccc;margin-right:1.5rem;padding-right:1rem}")
//# sourceMappingURL=content.js.map
@@ -0,0 +1 @@
body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Open Sans','Helvetica Neue',sans-serif;line-height:1.4;margin:1rem}table{border-collapse:collapse}table:not([cellpadding]) td,table:not([cellpadding]) th{padding:.4rem}table[border]:not([border="0"]):not([style*=border-width]) td,table[border]:not([border="0"]):not([style*=border-width]) th{border-width:1px}table[border]:not([border="0"]):not([style*=border-style]) td,table[border]:not([border="0"]):not([style*=border-style]) th{border-style:solid}table[border]:not([border="0"]):not([style*=border-color]) td,table[border]:not([border="0"]):not([style*=border-color]) th{border-color:#ccc}figure{display:table;margin:1rem auto}figure figcaption{color:#999;display:block;margin-top:.25rem;text-align:center}hr{border-color:#ccc;border-style:solid;border-width:1px 0 0 0}code{background-color:#e8e8e8;border-radius:3px;padding:.1rem .2rem}.mce-content-body:not([dir=rtl]) blockquote{border-left:2px solid #ccc;margin-left:1.5rem;padding-left:1rem}.mce-content-body[dir=rtl] blockquote{border-right:2px solid #ccc;margin-right:1.5rem;padding-right:1rem}