@learnmd/default-theme 0.0.1-beta.1 → 0.0.2-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/CatalogViewer.d.ts +3 -1
- package/dist/components/CatalogViewer.d.ts.map +1 -1
- package/dist/components/CatalogViewer.js +18 -3
- package/dist/components/CatalogViewer.js.map +1 -1
- package/dist/components/CourseOverview.d.ts +11 -0
- package/dist/components/CourseOverview.d.ts.map +1 -0
- package/dist/components/CourseOverview.js +21 -0
- package/dist/components/CourseOverview.js.map +1 -0
- package/dist/components/CourseViewer.d.ts +3 -1
- package/dist/components/CourseViewer.d.ts.map +1 -1
- package/dist/components/CourseViewer.js +89 -17
- package/dist/components/CourseViewer.js.map +1 -1
- package/dist/components/ProfileViewer.d.ts.map +1 -1
- package/dist/components/ProfileViewer.js +22 -6
- package/dist/components/ProfileViewer.js.map +1 -1
- package/dist/components/Quiz.d.ts +3 -1
- package/dist/components/Quiz.d.ts.map +1 -1
- package/dist/components/Quiz.js +5 -3
- package/dist/components/Quiz.js.map +1 -1
- package/dist/components/index.d.ts +1 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +1 -0
- package/dist/components/index.js.map +1 -1
- package/dist/layouts/CourseLayout.d.ts.map +1 -1
- package/dist/layouts/CourseLayout.js +2 -11
- package/dist/layouts/CourseLayout.js.map +1 -1
- package/dist/layouts/MainLayout.d.ts +5 -1
- package/dist/layouts/MainLayout.d.ts.map +1 -1
- package/dist/layouts/MainLayout.js +19 -3
- package/dist/layouts/MainLayout.js.map +1 -1
- package/dist/styles/output.css +143 -55
- package/package.json +3 -2
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
import React from 'react';
|
|
1
2
|
export interface CatalogViewerProps {
|
|
2
3
|
courses: Array<{
|
|
3
4
|
courseSlug: string;
|
|
4
5
|
slug: string;
|
|
5
6
|
frontmatter: Record<string, unknown>;
|
|
6
7
|
}>;
|
|
8
|
+
HomeComponent?: React.ComponentType;
|
|
7
9
|
}
|
|
8
|
-
export declare function CatalogViewer({ courses }: CatalogViewerProps): import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
export declare function CatalogViewer({ courses, HomeComponent }: CatalogViewerProps): import("react/jsx-runtime").JSX.Element;
|
|
9
11
|
//# sourceMappingURL=CatalogViewer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CatalogViewer.d.ts","sourceRoot":"","sources":["../../src/components/CatalogViewer.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"CatalogViewer.d.ts","sourceRoot":"","sources":["../../src/components/CatalogViewer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAqB1B,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,KAAK,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CAAC;IAC3F,aAAa,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CACrC;AAED,wBAAgB,aAAa,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,EAAE,kBAAkB,2CAiE3E"}
|
|
@@ -1,8 +1,23 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { MainLayout, Header } from '../layouts/MainLayout';
|
|
3
3
|
import { Link } from 'react-router-dom';
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
// @ts-ignore
|
|
5
|
+
import { MDXProvider } from '@mdx-js/react';
|
|
6
|
+
import { Callout } from './Callout';
|
|
7
|
+
import { Quiz } from './Quiz';
|
|
8
|
+
import { VideoEmbed } from './VideoEmbed';
|
|
9
|
+
import { Progress } from './Progress';
|
|
10
|
+
import { LanguageSwitcher } from './LanguageSwitcher';
|
|
11
|
+
import { Paragraph } from './Paragraph';
|
|
12
|
+
const components = {
|
|
13
|
+
Callout,
|
|
14
|
+
Quiz,
|
|
15
|
+
VideoEmbed,
|
|
16
|
+
Progress,
|
|
17
|
+
LanguageSwitcher,
|
|
18
|
+
Paragraph,
|
|
19
|
+
};
|
|
20
|
+
export function CatalogViewer({ courses, HomeComponent }) {
|
|
6
21
|
// Group lessons by courseSlug
|
|
7
22
|
const courseMap = new Map();
|
|
8
23
|
courses.forEach(lesson => {
|
|
@@ -19,6 +34,6 @@ export function CatalogViewer({ courses }) {
|
|
|
19
34
|
}
|
|
20
35
|
});
|
|
21
36
|
const uniqueCourses = Array.from(courseMap.values());
|
|
22
|
-
return (_jsxs(MainLayout, { children: [_jsx(Header, { title: "Course Catalog",
|
|
37
|
+
return (_jsxs(MainLayout, { children: [_jsx(Header, { title: "Course Catalog" }), _jsxs("div", { className: "container mx-auto px-4 py-8 max-w-5xl", children: [HomeComponent && (_jsx("div", { className: "prose dark:prose-invert max-w-none mb-12", children: _jsx(MDXProvider, { components: components, children: _jsx(HomeComponent, {}) }) })), _jsx("h1", { className: "text-3xl font-bold mb-8 text-[rgb(var(--text-primary))]", children: "Available Courses" }), "...", uniqueCourses.length === 0 ? (_jsx("div", { className: "text-center py-12 text-gray-500", children: "No courses available yet. Add some courses in the 'courses/' folder!" })) : (_jsx("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6", children: uniqueCourses.map(course => (_jsxs(Link, { to: `/courses/${course.id}`, className: "block p-6 bg-white dark:bg-gray-800 rounded-xl shadow-sm border border-gray-200 dark:border-gray-700 hover:shadow-md hover:border-emerald-500 transition-all group", children: [_jsx("h2", { className: "text-xl font-semibold mb-2 group-hover:text-emerald-500 transition-colors", children: course.title }), _jsxs("p", { className: "text-sm text-gray-500 dark:text-gray-400 mb-4", children: [course.totalLessons, " lessons inside"] }), _jsxs("div", { className: "text-emerald-600 dark:text-emerald-400 text-sm font-medium flex items-center", children: ["Start Course", _jsx("svg", { className: "w-4 h-4 ml-1 group-hover:translate-x-1 transition-transform", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M9 5l7 7-7 7" }) })] })] }, course.id))) }))] })] }));
|
|
23
38
|
}
|
|
24
39
|
//# sourceMappingURL=CatalogViewer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CatalogViewer.js","sourceRoot":"","sources":["../../src/components/CatalogViewer.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"CatalogViewer.js","sourceRoot":"","sources":["../../src/components/CatalogViewer.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { Course } from '@learnmd/core';
|
|
3
|
+
export interface CourseOverviewProps {
|
|
4
|
+
course: Course;
|
|
5
|
+
overviewContent?: React.ReactNode;
|
|
6
|
+
onStartCourse?: () => void;
|
|
7
|
+
completedLessons?: string[];
|
|
8
|
+
courseProgress?: number;
|
|
9
|
+
}
|
|
10
|
+
export declare function CourseOverview({ course, overviewContent, onStartCourse, completedLessons, courseProgress }: CourseOverviewProps): import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
//# sourceMappingURL=CourseOverview.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CourseOverview.d.ts","sourceRoot":"","sources":["../../src/components/CourseOverview.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAK5C,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAClC,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,cAAc,CAAC,EAAE,MAAM,EAAE,eAAe,EAAE,aAAa,EAAE,gBAAqB,EAAE,cAAkB,EAAE,EAAE,mBAAmB,2CA6GxI"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useI18n } from '../hooks';
|
|
3
|
+
import { Link } from 'react-router-dom';
|
|
4
|
+
export function CourseOverview({ course, overviewContent, onStartCourse, completedLessons = [], courseProgress = 0 }) {
|
|
5
|
+
const { currentLanguage } = useI18n();
|
|
6
|
+
const title = typeof course.title === 'string'
|
|
7
|
+
? course.title
|
|
8
|
+
: course.title[currentLanguage] || Object.values(course.title)[0];
|
|
9
|
+
const description = course.description
|
|
10
|
+
? (typeof course.description === 'string' ? course.description : course.description[currentLanguage] || Object.values(course.description)[0])
|
|
11
|
+
: null;
|
|
12
|
+
return (_jsxs("div", { className: "course-overview container mx-auto px-4 py-8 max-w-5xl", children: [_jsxs("header", { className: "mb-8 border-b border-[rgb(var(--border-color))] pb-8", children: [_jsx("h1", { className: "text-4xl font-bold mb-4 text-[rgb(var(--text-primary))]", children: title }), description && (_jsx("p", { className: "text-xl text-[rgb(var(--text-secondary))] mb-6", children: description })), _jsxs("div", { className: "flex flex-wrap gap-4 text-sm mb-6", children: [course.difficulty && (_jsxs("span", { className: "px-3 py-1 bg-[rgb(var(--bg-tertiary))] text-[rgb(var(--text-primary))] rounded-full", children: ["Difficulty: ", _jsx("span", { className: "font-semibold capitalize", children: course.difficulty })] })), course.estimatedTime && (_jsxs("span", { className: "px-3 py-1 bg-[rgb(var(--bg-tertiary))] text-[rgb(var(--text-primary))] rounded-full", children: ["Time: ", _jsx("span", { className: "font-semibold", children: course.estimatedTime })] }))] }), onStartCourse && (_jsx("button", { onClick: onStartCourse, className: "px-6 py-3 bg-[rgb(var(--color-primary-500))] hover:bg-[rgb(var(--color-primary-600))] text-white font-bold rounded-lg transition-colors shadow-sm", children: completedLessons.length > 0 ? (completedLessons.length >= (course.lessons?.length || 0) ? 'Review Course' : 'Continue Course') : 'Start Course' }))] }), _jsxs("div", { className: "grid grid-cols-1 md:grid-cols-3 gap-8", children: [_jsxs("div", { className: "md:col-span-2", children: [overviewContent && (_jsx("div", { className: "prose dark:prose-invert max-w-none mb-8 text-[rgb(var(--text-primary))]", children: overviewContent })), _jsx("h2", { className: "text-2xl font-bold mb-4 text-[rgb(var(--text-primary))]", children: "Syllabus" }), _jsx("div", { className: "space-y-4", children: course.lessons && course.lessons.length > 0 ? (course.lessons.map((lesson, idx) => {
|
|
13
|
+
const lessonTitle = typeof lesson === 'string'
|
|
14
|
+
? lesson
|
|
15
|
+
: (typeof lesson.frontmatter.title === 'string' ? lesson.frontmatter.title : 'Lesson');
|
|
16
|
+
const slug = typeof lesson === 'string' ? lesson : lesson.slug;
|
|
17
|
+
const isCompleted = completedLessons.includes(slug);
|
|
18
|
+
return (_jsxs("div", { className: "p-4 border border-[rgb(var(--border-color))] rounded-lg hover:border-[rgb(var(--color-primary-500))] transition-colors bg-[rgb(var(--bg-secondary))] flex justify-between items-center", children: [_jsxs(Link, { to: `${course.basePath}/${slug}`, className: "text-lg font-medium text-[rgb(var(--text-primary))] hover:text-[rgb(var(--color-primary-500))] transition-colors block", children: [_jsxs("span", { className: "text-[rgb(var(--text-secondary))] mr-2", children: [idx + 1, "."] }), " ", lessonTitle] }), isCompleted && (_jsxs("span", { className: "text-sm text-emerald-500 font-semibold flex items-center gap-1", children: [_jsx("svg", { className: "w-4 h-4", fill: "currentColor", viewBox: "0 0 20 20", children: _jsx("path", { fillRule: "evenodd", d: "M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z", clipRule: "evenodd" }) }), " Completed"] }))] }, idx));
|
|
19
|
+
})) : (_jsx("p", { className: "text-[rgb(var(--text-secondary))]", children: "No lessons available yet." })) })] }), _jsxs("div", { className: "md:col-span-1 space-y-6", children: [course.prerequisites && course.prerequisites.length > 0 && (_jsxs("div", { className: "bg-[rgb(var(--bg-secondary))] p-6 rounded-lg border border-[rgb(var(--border-color))]", children: [_jsx("h3", { className: "font-bold mb-3 text-[rgb(var(--text-primary))]", children: "Prerequisites" }), _jsx("ul", { className: "list-disc list-inside space-y-2 text-sm text-[rgb(var(--text-secondary))]", children: course.prerequisites.map((prereq, i) => (_jsx("li", { children: prereq }, i))) })] })), course.expectedSkills && course.expectedSkills.length > 0 && (_jsxs("div", { className: "bg-[rgb(var(--bg-secondary))] p-6 rounded-lg border border-[rgb(var(--border-color))]", children: [_jsx("h3", { className: "font-bold mb-3 text-[rgb(var(--text-primary))]", children: "What You'll Learn" }), _jsx("ul", { className: "list-disc list-inside space-y-2 text-sm text-[rgb(var(--text-secondary))]", children: course.expectedSkills.map((skill, i) => (_jsx("li", { children: skill }, i))) })] }))] })] })] }));
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=CourseOverview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CourseOverview.js","sourceRoot":"","sources":["../../src/components/CourseOverview.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
+
import { Course } from '@learnmd/core';
|
|
2
3
|
export interface CourseViewerProps {
|
|
3
4
|
allLessons: Array<{
|
|
4
5
|
courseSlug: string;
|
|
@@ -6,6 +7,7 @@ export interface CourseViewerProps {
|
|
|
6
7
|
Component: React.ComponentType;
|
|
7
8
|
frontmatter: Record<string, unknown>;
|
|
8
9
|
}>;
|
|
10
|
+
coursesConfig?: Record<string, Course>;
|
|
9
11
|
}
|
|
10
|
-
export declare function CourseViewer({ allLessons }: CourseViewerProps): import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
export declare function CourseViewer({ allLessons, coursesConfig }: CourseViewerProps): import("react/jsx-runtime").JSX.Element;
|
|
11
13
|
//# sourceMappingURL=CourseViewer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CourseViewer.d.ts","sourceRoot":"","sources":["../../src/components/CourseViewer.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"CourseViewer.d.ts","sourceRoot":"","sources":["../../src/components/CourseViewer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAuC,MAAM,OAAO,CAAC;AAW5D,OAAO,EAAuB,MAAM,EAAc,MAAM,eAAe,CAAC;AAKxE,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,KAAK,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,KAAK,CAAC,aAAa,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CAAC;IAC9H,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACxC;AAED,wBAAgB,YAAY,CAAC,EAAE,UAAU,EAAE,aAAkB,EAAE,EAAE,iBAAiB,2CAgMjF"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useMemo, useEffect, useState } from 'react';
|
|
2
3
|
import { ThemeProvider } from '../hooks';
|
|
3
4
|
import { CourseLayout } from '../layouts';
|
|
4
5
|
// @ts-ignore
|
|
@@ -9,23 +10,55 @@ import { VideoEmbed } from './VideoEmbed';
|
|
|
9
10
|
import { Progress } from './Progress';
|
|
10
11
|
import { LanguageSwitcher } from './LanguageSwitcher';
|
|
11
12
|
import { Paragraph } from './Paragraph';
|
|
12
|
-
import { getTranslatedString } from '@learnmd/core';
|
|
13
|
+
import { getTranslatedString, useLearnMD } from '@learnmd/core';
|
|
14
|
+
import { CourseOverview } from './CourseOverview';
|
|
13
15
|
import { useParams, useNavigate } from 'react-router-dom';
|
|
14
|
-
|
|
15
|
-
Callout,
|
|
16
|
-
Quiz,
|
|
17
|
-
VideoEmbed,
|
|
18
|
-
Progress,
|
|
19
|
-
LanguageSwitcher,
|
|
20
|
-
Paragraph,
|
|
21
|
-
};
|
|
22
|
-
export function CourseViewer({ allLessons }) {
|
|
16
|
+
export function CourseViewer({ allLessons, coursesConfig = {} }) {
|
|
23
17
|
const { courseId, '*': pathLessonSlug } = useParams();
|
|
24
18
|
const navigate = useNavigate();
|
|
25
|
-
const
|
|
26
|
-
const
|
|
27
|
-
const
|
|
19
|
+
const { storage, completeLesson } = useLearnMD();
|
|
20
|
+
const [completedLessons, setCompletedLessons] = useState([]);
|
|
21
|
+
const [courseProgress, setCourseProgress] = useState(0);
|
|
22
|
+
const courseLessons = useMemo(() => allLessons.filter(l => l.courseSlug === courseId), [allLessons, courseId]);
|
|
23
|
+
// If no specific lesson slug is provided, we are at the course root -> show overview
|
|
24
|
+
const isOverview = !pathLessonSlug;
|
|
25
|
+
const currentSlug = pathLessonSlug || '';
|
|
26
|
+
const currentLesson = courseLessons.find(l => l.slug === currentSlug);
|
|
28
27
|
const Component = currentLesson?.Component;
|
|
28
|
+
const currentIndex = courseLessons.findIndex(l => l.slug === currentSlug);
|
|
29
|
+
const prevLesson = currentIndex > 0 ? courseLessons[currentIndex - 1] : null;
|
|
30
|
+
const nextLesson = currentIndex < courseLessons.length - 1 ? courseLessons[currentIndex + 1] : null;
|
|
31
|
+
useEffect(() => {
|
|
32
|
+
if (!courseId)
|
|
33
|
+
return;
|
|
34
|
+
storage.getCourseProgress(courseId).then((progress) => {
|
|
35
|
+
if (progress) {
|
|
36
|
+
setCompletedLessons(progress.completedLessons || []);
|
|
37
|
+
const pct = courseLessons.length > 0 ? ((progress.completedLessons?.length || 0) / courseLessons.length) * 100 : 0;
|
|
38
|
+
setCourseProgress(Math.min(100, Math.round(pct)));
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
}, [courseId, currentSlug, storage, courseLessons.length]);
|
|
42
|
+
const handleNavigate = (slug) => {
|
|
43
|
+
navigate(`/courses/${courseId}/${slug}`);
|
|
44
|
+
};
|
|
45
|
+
const handleCompleteAndNext = async () => {
|
|
46
|
+
if (courseId && currentSlug) {
|
|
47
|
+
await completeLesson(courseId, currentSlug, { totalLessons: courseLessons.length });
|
|
48
|
+
const progress = await storage.getCourseProgress(courseId);
|
|
49
|
+
if (nextLesson) {
|
|
50
|
+
handleNavigate(nextLesson.slug);
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
// Force refresh progress if it's the last lesson
|
|
54
|
+
if (progress) {
|
|
55
|
+
setCompletedLessons(progress.completedLessons || []);
|
|
56
|
+
setCourseProgress(100);
|
|
57
|
+
}
|
|
58
|
+
handleNavigate(''); // Go back to overview
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
};
|
|
29
62
|
const navigation = [{
|
|
30
63
|
type: 'module',
|
|
31
64
|
id: `module-${courseId}`,
|
|
@@ -35,11 +68,50 @@ export function CourseViewer({ allLessons }) {
|
|
|
35
68
|
id: l.slug,
|
|
36
69
|
title: getTranslatedString(l.frontmatter?.title, 'en') || l.slug,
|
|
37
70
|
slug: l.slug,
|
|
71
|
+
completed: completedLessons.includes(l.slug)
|
|
38
72
|
}))
|
|
39
73
|
}];
|
|
40
|
-
const
|
|
41
|
-
|
|
74
|
+
const courseData = coursesConfig[courseId || ''] || {
|
|
75
|
+
id: courseId || '',
|
|
76
|
+
title: String(courseId).replace(/-/g, ' ').toUpperCase(),
|
|
77
|
+
modules: [],
|
|
78
|
+
lessons: courseLessons.map(l => ({ slug: l.slug, title: getTranslatedString(l.frontmatter?.title, 'en') || l.slug })),
|
|
79
|
+
frontmatter: {},
|
|
80
|
+
basePath: `/courses/${courseId}`
|
|
81
|
+
};
|
|
82
|
+
// Inject props into Quiz to handle completion
|
|
83
|
+
const components = {
|
|
84
|
+
Callout,
|
|
85
|
+
Quiz: (props) => {
|
|
86
|
+
const isCompleted = completedLessons.includes(currentSlug);
|
|
87
|
+
// We don't have the exact score in completedLessons array, but we can assume 100 or fetch it
|
|
88
|
+
// For now, if the lesson is completed, we pass initialCompleted=true
|
|
89
|
+
return (_jsx(Quiz, { ...props, initialCompleted: isCompleted, initialScore: 100, onComplete: async (results) => {
|
|
90
|
+
if (props.onComplete)
|
|
91
|
+
props.onComplete(results);
|
|
92
|
+
if (results.passed && courseId && currentSlug) {
|
|
93
|
+
await completeLesson(courseId, currentSlug, {
|
|
94
|
+
totalLessons: courseLessons.length,
|
|
95
|
+
score: results.score,
|
|
96
|
+
passed: results.passed
|
|
97
|
+
});
|
|
98
|
+
const progress = await storage.getCourseProgress(courseId);
|
|
99
|
+
if (progress) {
|
|
100
|
+
setCompletedLessons(progress.completedLessons || []);
|
|
101
|
+
const pct = courseLessons.length > 0 ? ((progress.completedLessons?.length || 0) / courseLessons.length) * 100 : 0;
|
|
102
|
+
setCourseProgress(Math.min(100, Math.round(pct)));
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
} }));
|
|
106
|
+
},
|
|
107
|
+
VideoEmbed,
|
|
108
|
+
Progress,
|
|
109
|
+
LanguageSwitcher,
|
|
110
|
+
Paragraph,
|
|
42
111
|
};
|
|
43
|
-
return (_jsx(ThemeProvider, { children: _jsx(CourseLayout, { courseTitle: String(courseId).replace(/-/g, ' ').toUpperCase(), navigation: navigation, currentLessonSlug: currentSlug, completedLessons:
|
|
112
|
+
return (_jsx(ThemeProvider, { children: _jsx(CourseLayout, { courseTitle: String(courseId).replace(/-/g, ' ').toUpperCase(), navigation: navigation, currentLessonSlug: currentSlug, completedLessons: completedLessons, progress: courseProgress, onNavigate: handleNavigate, children: _jsx("div", { className: "prose px-8 py-4 max-w-4xl mx-auto pb-24", children: isOverview ? (_jsx(CourseOverview, { course: courseData, overviewContent: undefined, onStartCourse: () => {
|
|
113
|
+
const firstUncompleted = courseLessons.find(l => !completedLessons.includes(l.slug));
|
|
114
|
+
handleNavigate(firstUncompleted?.slug || courseLessons[0]?.slug || '');
|
|
115
|
+
}, completedLessons: completedLessons, courseProgress: courseProgress })) : Component ? (_jsxs(_Fragment, { children: [_jsx(MDXProvider, { components: components, children: _jsx(Component, {}) }), _jsxs("div", { className: "mt-16 pt-8 border-t border-[rgb(var(--border-color))] flex flex-col sm:flex-row items-center justify-between gap-4", children: [_jsx("div", { className: "w-full sm:w-auto", children: prevLesson && (_jsxs("button", { onClick: () => handleNavigate(prevLesson.slug), className: "w-full px-6 py-3 border border-[rgb(var(--border-color))] hover:bg-[rgb(var(--bg-secondary))] text-[rgb(var(--text-primary))] font-medium rounded-lg transition-colors flex items-center justify-center gap-2", children: [_jsx("span", { children: "\u2190" }), " Previous"] })) }), _jsxs("div", { className: "w-full sm:w-auto flex flex-col sm:flex-row gap-4 ml-auto", children: [!completedLessons.includes(currentSlug) && (_jsx("button", { onClick: handleCompleteAndNext, className: "w-full px-6 py-3 bg-[rgb(var(--color-primary-500))] hover:bg-[rgb(var(--color-primary-600))] text-white font-bold rounded-lg transition-colors shadow-sm", children: nextLesson ? 'Mark Complete & Next' : 'Finish Course' })), completedLessons.includes(currentSlug) && nextLesson && (_jsxs("button", { onClick: () => handleNavigate(nextLesson.slug), className: "w-full px-6 py-3 bg-[rgb(var(--bg-secondary))] hover:bg-[rgb(var(--border-color))] text-[rgb(var(--text-primary))] font-bold rounded-lg transition-colors shadow-sm flex items-center justify-center gap-2", children: ["Next ", _jsx("span", { children: "\u2192" })] })), completedLessons.includes(currentSlug) && !nextLesson && (_jsxs("button", { onClick: () => handleNavigate(''), className: "w-full px-6 py-3 bg-[rgb(var(--bg-secondary))] hover:bg-[rgb(var(--border-color))] text-[rgb(var(--text-primary))] font-bold rounded-lg transition-colors shadow-sm flex items-center justify-center gap-2", children: ["Return to Overview ", _jsx("span", { children: "\u2192" })] }))] })] })] })) : (_jsx("div", { className: "text-center p-8", children: _jsx("p", { className: "text-lg text-[rgb(var(--text-muted))]", children: "Lesson not found." }) })) }) }) }));
|
|
44
116
|
}
|
|
45
117
|
//# sourceMappingURL=CourseViewer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CourseViewer.js","sourceRoot":"","sources":["../../src/components/CourseViewer.tsx"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"CourseViewer.js","sourceRoot":"","sources":["../../src/components/CourseViewer.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProfileViewer.d.ts","sourceRoot":"","sources":["../../src/components/ProfileViewer.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ProfileViewer.d.ts","sourceRoot":"","sources":["../../src/components/ProfileViewer.tsx"],"names":[],"mappings":"AAOA,wBAAgB,aAAa,4CAkK5B"}
|
|
@@ -1,31 +1,47 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { useState, useEffect } from 'react';
|
|
3
3
|
import { useLearnMD } from '@learnmd/core';
|
|
4
|
-
import { MainLayout, Header } from '../layouts/MainLayout';
|
|
5
4
|
import { Link } from 'react-router-dom';
|
|
5
|
+
import { generateCertificate } from '@learnmd/plugin-pdf';
|
|
6
6
|
export function ProfileViewer() {
|
|
7
7
|
const { storage } = useLearnMD();
|
|
8
|
+
const [profile, setProfile] = useState(null);
|
|
9
|
+
const [progressData, setProgressData] = useState({});
|
|
8
10
|
const [name, setName] = useState('');
|
|
9
11
|
const [email, setEmail] = useState('');
|
|
10
12
|
const [isSaving, setIsSaving] = useState(false);
|
|
11
13
|
const [saved, setSaved] = useState(false);
|
|
12
14
|
useEffect(() => {
|
|
13
|
-
async function
|
|
15
|
+
async function loadData() {
|
|
14
16
|
const p = await storage.getUserProfile() || { id: '1', name: '', email: '', totalPoints: 0, badges: [], coursesProgress: {}, streak: { current: 0, longest: 0, lastActiveDate: '' }, achievements: [], createdAt: Date.now(), updatedAt: Date.now() };
|
|
17
|
+
setProfile(p);
|
|
15
18
|
setName(p.name || '');
|
|
16
19
|
setEmail(p.email || '');
|
|
20
|
+
const allProgress = await storage.getAllCourseProgress();
|
|
21
|
+
setProgressData(allProgress);
|
|
17
22
|
}
|
|
18
|
-
|
|
23
|
+
loadData();
|
|
19
24
|
}, [storage]);
|
|
20
25
|
const handleSave = async (e) => {
|
|
21
26
|
e.preventDefault();
|
|
27
|
+
if (!profile)
|
|
28
|
+
return;
|
|
22
29
|
setIsSaving(true);
|
|
23
|
-
const
|
|
24
|
-
await storage.saveUserProfile(
|
|
30
|
+
const updated = { ...profile, name, email };
|
|
31
|
+
await storage.saveUserProfile(updated);
|
|
32
|
+
setProfile(updated);
|
|
25
33
|
setIsSaving(false);
|
|
26
34
|
setSaved(true);
|
|
27
35
|
setTimeout(() => setSaved(false), 3000);
|
|
28
36
|
};
|
|
29
|
-
|
|
37
|
+
const handleDownloadCertificate = async (courseId) => {
|
|
38
|
+
if (!profile)
|
|
39
|
+
return;
|
|
40
|
+
await generateCertificate(profile, { courseTitle: courseId });
|
|
41
|
+
};
|
|
42
|
+
return (_jsxs("div", { className: "container mx-auto px-4 py-8 max-w-4xl text-left", children: [_jsx(Link, { to: "/", className: "inline-block mb-6 text-sm font-medium text-[rgb(var(--text-secondary))] hover:text-[rgb(var(--color-primary-500))] transition-colors", children: "\u00AB Back to Catalog" }), _jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-8", children: [_jsxs("div", { className: "bg-[rgb(var(--bg-secondary))] p-8 rounded-xl shadow-sm border border-[rgb(var(--border-color))] h-fit", children: [_jsxs("div", { className: "flex items-center gap-4 mb-8 border-b border-[rgb(var(--border-color))] pb-6", children: [_jsx("div", { className: "w-16 h-16 rounded-full bg-[rgb(var(--color-primary-100))] dark:bg-[rgb(var(--color-primary-900))] flex items-center justify-center text-[rgb(var(--color-primary-600))] dark:text-[rgb(var(--color-primary-400))] text-2xl font-bold", children: name ? name.charAt(0).toUpperCase() : '?' }), _jsxs("div", { children: [_jsx("h1", { className: "text-2xl font-bold text-[rgb(var(--text-primary))]", children: "Your Account" }), _jsx("p", { className: "text-[rgb(var(--text-secondary))] text-sm", children: "Update your basic information" })] })] }), _jsxs("form", { onSubmit: handleSave, className: "space-y-6", children: [_jsxs("div", { children: [_jsx("label", { htmlFor: "name", className: "block text-sm font-medium text-[rgb(var(--text-primary))] mb-2", children: "Full Name" }), _jsx("input", { type: "text", id: "name", value: name, onChange: (e) => setName(e.target.value), required: true, className: "w-full px-4 py-2 bg-[rgb(var(--bg-primary))] border border-[rgb(var(--border-color))] text-[rgb(var(--text-primary))] rounded-md focus:ring-2 focus:ring-[rgb(var(--color-primary-500))] focus:border-[rgb(var(--color-primary-500))] outline-none transition-shadow", placeholder: "John Doe" })] }), _jsxs("div", { children: [_jsx("label", { htmlFor: "email", className: "block text-sm font-medium text-[rgb(var(--text-primary))] mb-2", children: "Email Address" }), _jsx("input", { type: "email", id: "email", value: email, onChange: (e) => setEmail(e.target.value), className: "w-full px-4 py-2 bg-[rgb(var(--bg-primary))] border border-[rgb(var(--border-color))] text-[rgb(var(--text-primary))] rounded-md focus:ring-2 focus:ring-[rgb(var(--color-primary-500))] focus:border-[rgb(var(--color-primary-500))] outline-none transition-shadow", placeholder: "john@example.com" })] }), _jsxs("div", { className: "flex items-center justify-between pt-4", children: [_jsx("span", { className: `text-sm font-medium text-[rgb(var(--color-primary-500))] transition-opacity duration-300 ${saved ? 'opacity-100' : 'opacity-0'}`, children: "\u2705 Profile saved successfully!" }), _jsx("button", { type: "submit", disabled: isSaving, className: "px-6 py-2 bg-[rgb(var(--color-primary-500))] hover:bg-[rgb(var(--color-primary-600))] text-white font-medium rounded-md shadow-sm transition-colors disabled:opacity-50", children: isSaving ? 'Saving...' : 'Save Changes' })] })] })] }), _jsxs("div", { className: "space-y-8", children: [_jsxs("div", { className: "bg-[rgb(var(--bg-secondary))] p-8 rounded-xl shadow-sm border border-[rgb(var(--border-color))]", children: [_jsx("h2", { className: "text-xl font-bold mb-4 text-[rgb(var(--text-primary))]", children: "Metrics & History" }), _jsx("div", { className: "space-y-6", children: Object.keys(progressData || {}).length > 0 ? (Object.entries(progressData).map(([courseId, progress]) => {
|
|
43
|
+
const isCompleted = !!progress.completedAt;
|
|
44
|
+
return (_jsxs("div", { className: "border-b border-[rgb(var(--border-color))] pb-4 last:border-0 last:pb-0", children: [_jsxs("div", { className: "flex justify-between items-center mb-2", children: [_jsx("span", { className: "font-semibold text-[rgb(var(--text-primary))]", children: courseId }), isCompleted && (_jsx("span", { className: "text-xs px-2 py-1 bg-[rgb(var(--color-primary-100))] text-[rgb(var(--color-primary-800))] dark:text-white dark:bg-[rgb(var(--color-primary-900))] rounded-full font-medium", children: "In Progress / Completed" }))] }), _jsx("div", { className: "mb-2", children: _jsx("div", { className: "h-2 w-full bg-[rgb(var(--bg-tertiary))] rounded-full overflow-hidden", children: _jsx("div", { className: "h-full bg-[rgb(var(--color-primary-500))]", style: { width: `${Math.min(100, Math.max(10, progress.progressPercentage || (progress.completedAt ? 100 : (progress.completedLessons.length * 20))))}%` } }) }) }), _jsxs("div", { className: "flex justify-between items-center mt-3", children: [_jsxs("span", { className: "text-sm text-[rgb(var(--text-secondary))]", children: ["Points: ", progress.totalPoints || 0] }), isCompleted && (_jsx("button", { onClick: () => handleDownloadCertificate(courseId), className: "text-sm px-4 py-1.5 bg-[rgb(var(--color-primary-500))] hover:bg-[rgb(var(--color-primary-600))] text-white rounded transition-colors", children: "Download Certificate" }))] })] }, courseId));
|
|
45
|
+
})) : (_jsx("p", { className: "text-[rgb(var(--text-secondary))] text-sm", children: "No course progress yet." })) })] }), _jsxs("div", { className: "bg-[rgb(var(--bg-secondary))] p-8 rounded-xl shadow-sm border border-[rgb(var(--border-color))]", children: [_jsx("h2", { className: "text-xl font-bold mb-4 text-[rgb(var(--text-primary))]", children: "Badges Earned" }), profile?.badges && profile.badges.length > 0 ? (_jsx("div", { className: "grid grid-cols-2 md:grid-cols-3 gap-4", children: profile.badges.map((badge) => (_jsxs("div", { className: "flex flex-col items-center p-4 bg-[rgb(var(--bg-primary))] rounded-lg text-center border border-[rgb(var(--border-color))]", children: [_jsx("span", { className: "text-3xl mb-2", children: badge.icon || '🏆' }), _jsx("span", { className: "text-sm font-semibold text-[rgb(var(--text-primary))]", children: badge.name })] }, badge.id))) })) : (_jsx("p", { className: "text-[rgb(var(--text-secondary))] text-sm", children: "No badges earned yet. Keep learning!" }))] })] })] })] }));
|
|
30
46
|
}
|
|
31
47
|
//# sourceMappingURL=ProfileViewer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProfileViewer.js","sourceRoot":"","sources":["../../src/components/ProfileViewer.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"ProfileViewer.js","sourceRoot":"","sources":["../../src/components/ProfileViewer.tsx"],"names":[],"mappings":"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"}
|
|
@@ -17,6 +17,8 @@ export interface QuizProps {
|
|
|
17
17
|
allowRetry?: boolean;
|
|
18
18
|
showCorrectAnswers?: boolean;
|
|
19
19
|
onComplete?: (results: QuizResults) => void;
|
|
20
|
+
initialCompleted?: boolean;
|
|
21
|
+
initialScore?: number;
|
|
20
22
|
}
|
|
21
23
|
export interface QuizResults {
|
|
22
24
|
score: number;
|
|
@@ -29,6 +31,6 @@ export interface QuizAnswer {
|
|
|
29
31
|
selectedAnswer: string;
|
|
30
32
|
correct: boolean;
|
|
31
33
|
}
|
|
32
|
-
export declare function Quiz({ questions, passingScore, allowRetry, showCorrectAnswers, onComplete, }: QuizProps): import("react/jsx-runtime").JSX.Element;
|
|
34
|
+
export declare function Quiz({ questions, passingScore, allowRetry, showCorrectAnswers, onComplete, initialCompleted, initialScore, }: QuizProps): import("react/jsx-runtime").JSX.Element;
|
|
33
35
|
export default Quiz;
|
|
34
36
|
//# sourceMappingURL=Quiz.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Quiz.d.ts","sourceRoot":"","sources":["../../src/components/Quiz.tsx"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,iBAAiB,GAAG,YAAY,GAAG,OAAO,CAAC;IACjD,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,aAAa,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"Quiz.d.ts","sourceRoot":"","sources":["../../src/components/Quiz.tsx"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,iBAAiB,GAAG,YAAY,GAAG,OAAO,CAAC;IACjD,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,aAAa,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,CAAC;IAC5C,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,UAAU,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,IAAI,CAAC,EACnB,SAAS,EACT,YAAiB,EACjB,UAAiB,EACjB,kBAAyB,EACzB,UAAU,EACV,gBAAwB,EACxB,YAAkB,GACnB,EAAE,SAAS,2CAkQX;AAED,eAAe,IAAI,CAAC"}
|
package/dist/components/Quiz.js
CHANGED
|
@@ -2,15 +2,17 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import { useState, useCallback } from 'react';
|
|
3
3
|
import { getTranslatedString } from '@learnmd/core';
|
|
4
4
|
import { useI18n } from '../hooks';
|
|
5
|
-
export function Quiz({ questions, passingScore = 70, allowRetry = true, showCorrectAnswers = true, onComplete, }) {
|
|
5
|
+
export function Quiz({ questions, passingScore = 70, allowRetry = true, showCorrectAnswers = true, onComplete, initialCompleted = false, initialScore = 100, }) {
|
|
6
6
|
const { currentLanguage } = useI18n();
|
|
7
7
|
const [currentQuestionIndex, setCurrentQuestionIndex] = useState(0);
|
|
8
8
|
const [answers, setAnswers] = useState([]);
|
|
9
9
|
const [selectedAnswer, setSelectedAnswer] = useState(null);
|
|
10
10
|
const [showExplanation, setShowExplanation] = useState(false);
|
|
11
11
|
const [submitted, setSubmitted] = useState(false);
|
|
12
|
-
const [quizCompleted, setQuizCompleted] = useState(
|
|
13
|
-
const [results, setResults] = useState(
|
|
12
|
+
const [quizCompleted, setQuizCompleted] = useState(initialCompleted);
|
|
13
|
+
const [results, setResults] = useState(initialCompleted
|
|
14
|
+
? { score: initialScore, totalQuestions: questions.length, passed: initialScore >= passingScore, answers: [] }
|
|
15
|
+
: null);
|
|
14
16
|
const currentQuestion = questions[currentQuestionIndex];
|
|
15
17
|
const isLastQuestion = currentQuestionIndex === questions.length - 1;
|
|
16
18
|
const calculateScore = useCallback((quizAnswers) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Quiz.js","sourceRoot":"","sources":["../../src/components/Quiz.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"Quiz.js","sourceRoot":"","sources":["../../src/components/Quiz.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,EACL,SAAS,EACT,aAAa,EACb,aAAa,EACb,mBAAmB,GACpB,MAAM,gBAAgB,CAAC;AAExB,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,EACL,SAAS,EACT,aAAa,EACb,aAAa,EACb,mBAAmB,GACpB,MAAM,gBAAgB,CAAC;AAExB,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC"}
|
package/dist/components/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,EACL,SAAS,EACT,aAAa,EACb,aAAa,EACb,mBAAmB,GACpB,MAAM,gBAAgB,CAAC;AAExB,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,EACL,SAAS,EACT,aAAa,EACb,aAAa,EACb,mBAAmB,GACpB,MAAM,gBAAgB,CAAC;AAExB,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CourseLayout.d.ts","sourceRoot":"","sources":["../../src/layouts/CourseLayout.tsx"],"names":[],"mappings":"AAAA,OAAc,EAAE,KAAK,SAAS,EAAY,MAAM,OAAO,CAAC;AAIxD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,cAAc,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,SAAS,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,cAAc,EAAE,CAAC;IAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,MAAM,CAAC,EAAE,SAAS,CAAC;CACpB;
|
|
1
|
+
{"version":3,"file":"CourseLayout.d.ts","sourceRoot":"","sources":["../../src/layouts/CourseLayout.tsx"],"names":[],"mappings":"AAAA,OAAc,EAAE,KAAK,SAAS,EAAY,MAAM,OAAO,CAAC;AAIxD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,cAAc,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,SAAS,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,cAAc,EAAE,CAAC;IAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,MAAM,CAAC,EAAE,SAAS,CAAC;CACpB;AAED,wBAAgB,YAAY,CAAC,EAC3B,QAAQ,EACR,WAAW,EACX,UAAU,EACV,iBAAiB,EACjB,gBAAgB,EAChB,QAAQ,EACR,UAAU,EACV,kBAAyB,EACzB,YAAmB,EACnB,cAAqB,EACrB,MAAM,GACP,EAAE,iBAAiB,2CAmFnB;AA+DD,MAAM,WAAW,qBAAqB;IACpC,cAAc,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACjD,UAAU,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,cAAc,EACd,UAAU,EACV,UAAU,EACV,MAAM,GACP,EAAE,qBAAqB,2CAoCvB;AAED,eAAe,YAAY,CAAC"}
|
|
@@ -1,16 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { useState } from 'react';
|
|
3
3
|
import { Progress } from '../components';
|
|
4
|
-
import {
|
|
5
|
-
function ThemeToggle() {
|
|
6
|
-
const { resolvedTheme, setTheme } = useTheme();
|
|
7
|
-
const isDark = resolvedTheme === 'dark';
|
|
8
|
-
return (_jsx("button", { onClick: () => setTheme(isDark ? 'light' : 'dark'), className: "p-2 rounded-md hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors", "aria-label": "Toggle Dark Mode", children: isDark ? (
|
|
9
|
-
// Sun Icon
|
|
10
|
-
_jsx("svg", { className: "w-5 h-5 text-yellow-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16 12a4 4 0 11-8 0 4 4 0 018 0z" }) })) : (
|
|
11
|
-
// Moon Icon
|
|
12
|
-
_jsx("svg", { className: "w-5 h-5 text-slate-700", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M20.354 15.354A9 9 0 018.646 3.646 9.003 9.003 0 0012 21a9.003 9.003 0 008.354-5.646z" }) })) }));
|
|
13
|
-
}
|
|
4
|
+
import { Header } from './MainLayout';
|
|
14
5
|
export function CourseLayout({ children, courseTitle, navigation, currentLessonSlug, completedLessons, progress, onNavigate, sidebarCollapsible = true, showProgress = true, showNavigation = true, footer, }) {
|
|
15
6
|
const [isSidebarOpen, setIsSidebarOpen] = useState(true);
|
|
16
7
|
const [expandedModules, setExpandedModules] = useState(new Set(navigation.map((m) => m.id)));
|
|
@@ -26,7 +17,7 @@ export function CourseLayout({ children, courseTitle, navigation, currentLessonS
|
|
|
26
17
|
return next;
|
|
27
18
|
});
|
|
28
19
|
};
|
|
29
|
-
return (_jsxs("div", { className: "flex flex-col min-h-screen font-sans bg-
|
|
20
|
+
return (_jsxs("div", { className: "flex flex-col min-h-screen font-sans bg-[rgb(var(--bg-primary))] text-[rgb(var(--text-primary))] transition-colors duration-200", children: [_jsx(Header, { title: courseTitle, actions: _jsxs("div", { className: "flex items-center gap-4", children: [sidebarCollapsible && (_jsx("button", { onClick: () => setIsSidebarOpen(!isSidebarOpen), className: "xl:hidden p-2 -ml-2 rounded-md hover:bg-[rgb(var(--bg-secondary))] mr-2", children: _jsx("svg", { className: "w-6 h-6", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M4 6h16M4 12h16M4 18h16" }) }) })), showProgress && (_jsxs("div", { className: "hidden lg:flex items-center gap-3 w-48", children: [_jsx(Progress, { value: progress, size: "sm" }), _jsxs("span", { className: "text-sm font-medium text-[rgb(var(--text-secondary))]", children: [Math.round(progress), "%"] })] }))] }) }), _jsxs("div", { className: "flex flex-1 overflow-hidden", children: [showNavigation && (_jsx("aside", { className: `${isSidebarOpen ? 'w-72 translate-x-0' : 'w-0 -translate-x-full'} fixed inset-y-0 left-0 z-30 mt-16 xl:static xl:mt-0 flex-shrink-0 overflow-y-auto bg-[#f5f6f7] dark:bg-[#1c1e21] border-r border-gray-200 dark:border-gray-800 transition-all duration-300`, children: _jsx("nav", { className: "p-4 space-y-1", children: navigation.map((module) => (_jsx(ModuleItem, { module: module, isExpanded: expandedModules.has(module.id), currentLessonSlug: currentLessonSlug, completedLessons: completedLessons, onToggle: () => toggleModule(module.id), onNavigate: onNavigate }, module.id))) }) })), _jsx("main", { className: "flex-1 overflow-y-auto w-full", children: _jsxs("div", { className: "max-w-[800px] mx-auto px-6 py-10 lg:px-12 lg:py-16", children: [children, footer && (_jsx("div", { className: "mt-16", children: footer }))] }) })] })] }));
|
|
30
21
|
}
|
|
31
22
|
function ModuleItem({ module, isExpanded, currentLessonSlug, completedLessons, onToggle, onNavigate, }) {
|
|
32
23
|
return (_jsxs("div", { className: "mb-4", children: [_jsxs("button", { onClick: onToggle, className: "w-full flex items-center justify-between px-3 py-2 text-sm font-bold text-slate-900 dark:text-gray-100 uppercase tracking-wider hover:bg-gray-200 dark:hover:bg-gray-800 rounded-md transition-colors", children: [_jsx("span", { className: "truncate", children: module.title }), _jsx("svg", { className: `w-4 h-4 transition-transform duration-200 ${isExpanded ? 'rotate-90' : ''}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M9 5l7 7-7 7" }) })] }), isExpanded && module.children && module.children.length > 0 && (_jsx("ul", { className: "mt-2 space-y-1 border-l border-gray-200 dark:border-gray-700 ml-4 pl-1", children: module.children.map((lesson) => (_jsx("li", { children: _jsxs("button", { onClick: () => lesson.slug && onNavigate(lesson.slug), className: `w-full flex items-center gap-3 px-3 py-2 text-sm rounded-md transition-colors ${currentLessonSlug === lesson.id
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CourseLayout.js","sourceRoot":"","sources":["../../src/layouts/CourseLayout.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAkB,QAAQ,EAAE,MAAM,OAAO,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"CourseLayout.js","sourceRoot":"","sources":["../../src/layouts/CourseLayout.tsx"],"names":[],"mappings":"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"}
|
|
@@ -12,7 +12,11 @@ export interface HeaderProps {
|
|
|
12
12
|
showSearch?: boolean;
|
|
13
13
|
showLanguageSwitcher?: boolean;
|
|
14
14
|
actions?: ReactNode;
|
|
15
|
+
navigation?: {
|
|
16
|
+
label: string | Record<string, string>;
|
|
17
|
+
path: string;
|
|
18
|
+
}[];
|
|
15
19
|
}
|
|
16
|
-
export declare function Header({ logo, title, showThemeToggle, showLanguageSwitcher, actions, }: HeaderProps): import("react/jsx-runtime").JSX.Element;
|
|
20
|
+
export declare function Header({ logo, title, showThemeToggle, showLanguageSwitcher, actions, navigation: manualNavigation, }: HeaderProps): import("react/jsx-runtime").JSX.Element;
|
|
17
21
|
export default MainLayout;
|
|
18
22
|
//# sourceMappingURL=MainLayout.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MainLayout.d.ts","sourceRoot":"","sources":["../../src/layouts/MainLayout.tsx"],"names":[],"mappings":"AAAA,OAAc,EAAE,KAAK,SAAS,EAAY,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"MainLayout.d.ts","sourceRoot":"","sources":["../../src/layouts/MainLayout.tsx"],"names":[],"mappings":"AAAA,OAAc,EAAE,KAAK,SAAS,EAAY,MAAM,OAAO,CAAC;AAMxD,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,SAAS,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,UAAU,CAAC,EAAE,QAAQ,EAAE,EAAE,WAAW,2CAMnD;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,UAAU,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACzE;AAED,wBAAgB,MAAM,CAAC,EACrB,IAAI,EACJ,KAAK,EACL,eAAsB,EACtB,oBAA2B,EAC3B,OAAO,EACP,UAAU,EAAE,gBAAgB,GAC7B,EAAE,WAAW,2CAkGb;AA2CD,eAAe,UAAU,CAAC"}
|
|
@@ -1,12 +1,28 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import React, { useState } from 'react';
|
|
3
|
-
import { ThemeProvider, useTheme } from '../hooks';
|
|
3
|
+
import { ThemeProvider, useTheme, useI18n } from '../hooks';
|
|
4
|
+
import { LanguageSwitcher } from '../components/LanguageSwitcher';
|
|
5
|
+
import { useLearnMD } from '@learnmd/core';
|
|
6
|
+
import { Link } from 'react-router-dom';
|
|
4
7
|
export function MainLayout({ children }) {
|
|
5
8
|
return (_jsx(ThemeProvider, { children: _jsx("div", { className: "min-h-screen bg-[rgb(var(--bg-primary))]", children: children }) }));
|
|
6
9
|
}
|
|
7
|
-
export function Header({ logo, title, showThemeToggle = true, showLanguageSwitcher =
|
|
10
|
+
export function Header({ logo, title, showThemeToggle = true, showLanguageSwitcher = true, actions, navigation: manualNavigation, }) {
|
|
8
11
|
const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false);
|
|
9
|
-
|
|
12
|
+
const { currentLanguage } = useI18n();
|
|
13
|
+
const { config } = useLearnMD();
|
|
14
|
+
const navigation = manualNavigation || config.navigation || [];
|
|
15
|
+
return (_jsxs("header", { className: "sticky top-0 z-40 bg-[rgb(var(--bg-primary))]/95 backdrop-blur border-b border-[rgb(var(--border-color))]", children: [_jsx("div", { className: "container mx-auto px-4", children: _jsxs("div", { className: "flex items-center justify-between h-16", children: [_jsxs("div", { className: "flex items-center gap-4", children: [logo || (_jsxs(Link, { to: "/", className: "flex items-center gap-2", children: [_jsx("span", { className: "text-2xl", children: "\uD83D\uDCDA" }), _jsx("span", { className: "font-bold text-xl", children: "LearnMD" })] })), title && (_jsxs("span", { className: "hidden md:block text-[rgb(var(--text-secondary))]", children: ["/ ", title] })), navigation.length > 0 && (_jsx("nav", { className: "hidden md:flex items-center gap-6 ml-6 text-sm font-medium", children: navigation.map((item, idx) => {
|
|
16
|
+
const label = typeof item.label === 'string'
|
|
17
|
+
? item.label
|
|
18
|
+
: item.label[currentLanguage] || Object.values(item.label)[0];
|
|
19
|
+
return (_jsx(Link, { to: item.path, className: "text-[rgb(var(--text-secondary))] hover:text-[rgb(var(--text-primary))] transition-colors", children: label }, idx));
|
|
20
|
+
}) }))] }), _jsxs("div", { className: "flex items-center gap-2 md:gap-4", children: [actions, _jsx(Link, { to: "/profile", className: "p-2 rounded-lg flex items-center justify-center hover:bg-[rgb(var(--bg-tertiary))] text-[rgb(var(--text-secondary))] hover:text-[rgb(var(--text-primary))] transition-colors", title: "User Profile", children: _jsx("svg", { className: "w-5 h-5", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z" }) }) }), showLanguageSwitcher && (_jsx("div", { className: "hidden md:block", children: _jsx(LanguageSwitcher, {}) })), showThemeToggle && _jsx(ThemeToggle, {}), _jsx("button", { className: "md:hidden p-2", onClick: () => setIsMobileMenuOpen(!isMobileMenuOpen), children: _jsx("svg", { className: "w-6 h-6", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: isMobileMenuOpen ? (_jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" })) : (_jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M4 6h16M4 12h16M4 18h16" })) }) })] })] }) }), isMobileMenuOpen && (_jsx("div", { className: "md:hidden border-t border-[rgb(var(--border-color))]", children: _jsx("nav", { className: "px-4 py-4 space-y-2", children: navigation.map((item, idx) => {
|
|
21
|
+
const label = typeof item.label === 'string'
|
|
22
|
+
? item.label
|
|
23
|
+
: item.label[currentLanguage] || Object.values(item.label)[0];
|
|
24
|
+
return (_jsx(Link, { to: item.path, onClick: () => setIsMobileMenuOpen(false), className: "block py-2 text-[rgb(var(--text-secondary))] hover:text-[rgb(var(--text-primary))]", children: label }, idx));
|
|
25
|
+
}) }) }))] }));
|
|
10
26
|
}
|
|
11
27
|
function ThemeToggle() {
|
|
12
28
|
const [mounted, setMounted] = useState(false);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MainLayout.js","sourceRoot":"","sources":["../../src/layouts/MainLayout.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,EAAkB,QAAQ,EAAE,MAAM,OAAO,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"MainLayout.js","sourceRoot":"","sources":["../../src/layouts/MainLayout.tsx"],"names":[],"mappings":"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"}
|
package/dist/styles/output.css
CHANGED
|
@@ -859,6 +859,10 @@ body {
|
|
|
859
859
|
margin-bottom: 0.25rem;
|
|
860
860
|
}
|
|
861
861
|
|
|
862
|
+
.mb-12 {
|
|
863
|
+
margin-bottom: 3rem;
|
|
864
|
+
}
|
|
865
|
+
|
|
862
866
|
.mb-2 {
|
|
863
867
|
margin-bottom: 0.5rem;
|
|
864
868
|
}
|
|
@@ -891,8 +895,8 @@ body {
|
|
|
891
895
|
margin-left: 1rem;
|
|
892
896
|
}
|
|
893
897
|
|
|
894
|
-
.ml-
|
|
895
|
-
margin-left:
|
|
898
|
+
.ml-6 {
|
|
899
|
+
margin-left: 1.5rem;
|
|
896
900
|
}
|
|
897
901
|
|
|
898
902
|
.ml-auto {
|
|
@@ -923,6 +927,10 @@ body {
|
|
|
923
927
|
margin-top: 0.5rem;
|
|
924
928
|
}
|
|
925
929
|
|
|
930
|
+
.mt-3 {
|
|
931
|
+
margin-top: 0.75rem;
|
|
932
|
+
}
|
|
933
|
+
|
|
926
934
|
.line-clamp-2 {
|
|
927
935
|
overflow: hidden;
|
|
928
936
|
display: -webkit-box;
|
|
@@ -934,6 +942,10 @@ body {
|
|
|
934
942
|
display: block;
|
|
935
943
|
}
|
|
936
944
|
|
|
945
|
+
.inline-block {
|
|
946
|
+
display: inline-block;
|
|
947
|
+
}
|
|
948
|
+
|
|
937
949
|
.flex {
|
|
938
950
|
display: flex;
|
|
939
951
|
}
|
|
@@ -1022,6 +1034,11 @@ body {
|
|
|
1022
1034
|
height: 2rem;
|
|
1023
1035
|
}
|
|
1024
1036
|
|
|
1037
|
+
.h-fit {
|
|
1038
|
+
height: -moz-fit-content;
|
|
1039
|
+
height: fit-content;
|
|
1040
|
+
}
|
|
1041
|
+
|
|
1025
1042
|
.h-full {
|
|
1026
1043
|
height: 100%;
|
|
1027
1044
|
}
|
|
@@ -1106,8 +1123,8 @@ body {
|
|
|
1106
1123
|
min-width: 0px;
|
|
1107
1124
|
}
|
|
1108
1125
|
|
|
1109
|
-
.max-w-
|
|
1110
|
-
max-width:
|
|
1126
|
+
.max-w-4xl {
|
|
1127
|
+
max-width: 56rem;
|
|
1111
1128
|
}
|
|
1112
1129
|
|
|
1113
1130
|
.max-w-5xl {
|
|
@@ -1122,6 +1139,10 @@ body {
|
|
|
1122
1139
|
max-width: 100%;
|
|
1123
1140
|
}
|
|
1124
1141
|
|
|
1142
|
+
.max-w-none {
|
|
1143
|
+
max-width: none;
|
|
1144
|
+
}
|
|
1145
|
+
|
|
1125
1146
|
.flex-1 {
|
|
1126
1147
|
flex: 1 1 0%;
|
|
1127
1148
|
}
|
|
@@ -1204,6 +1225,14 @@ body {
|
|
|
1204
1225
|
cursor: zoom-out;
|
|
1205
1226
|
}
|
|
1206
1227
|
|
|
1228
|
+
.list-inside {
|
|
1229
|
+
list-style-position: inside;
|
|
1230
|
+
}
|
|
1231
|
+
|
|
1232
|
+
.list-disc {
|
|
1233
|
+
list-style-type: disc;
|
|
1234
|
+
}
|
|
1235
|
+
|
|
1207
1236
|
.grid-cols-1 {
|
|
1208
1237
|
grid-template-columns: repeat(1, minmax(0, 1fr));
|
|
1209
1238
|
}
|
|
@@ -1216,6 +1245,10 @@ body {
|
|
|
1216
1245
|
flex-direction: column;
|
|
1217
1246
|
}
|
|
1218
1247
|
|
|
1248
|
+
.flex-wrap {
|
|
1249
|
+
flex-wrap: wrap;
|
|
1250
|
+
}
|
|
1251
|
+
|
|
1219
1252
|
.items-start {
|
|
1220
1253
|
align-items: flex-start;
|
|
1221
1254
|
}
|
|
@@ -1256,6 +1289,10 @@ body {
|
|
|
1256
1289
|
gap: 1.5rem;
|
|
1257
1290
|
}
|
|
1258
1291
|
|
|
1292
|
+
.gap-8 {
|
|
1293
|
+
gap: 2rem;
|
|
1294
|
+
}
|
|
1295
|
+
|
|
1259
1296
|
.space-y-1 > :not([hidden]) ~ :not([hidden]) {
|
|
1260
1297
|
--tw-space-y-reverse: 0;
|
|
1261
1298
|
margin-top: calc(0.25rem * calc(1 - var(--tw-space-y-reverse)));
|
|
@@ -1286,6 +1323,12 @@ body {
|
|
|
1286
1323
|
margin-bottom: calc(1.5rem * var(--tw-space-y-reverse));
|
|
1287
1324
|
}
|
|
1288
1325
|
|
|
1326
|
+
.space-y-8 > :not([hidden]) ~ :not([hidden]) {
|
|
1327
|
+
--tw-space-y-reverse: 0;
|
|
1328
|
+
margin-top: calc(2rem * calc(1 - var(--tw-space-y-reverse)));
|
|
1329
|
+
margin-bottom: calc(2rem * var(--tw-space-y-reverse));
|
|
1330
|
+
}
|
|
1331
|
+
|
|
1289
1332
|
.overflow-hidden {
|
|
1290
1333
|
overflow: hidden;
|
|
1291
1334
|
}
|
|
@@ -1456,6 +1499,10 @@ body {
|
|
|
1456
1499
|
background-color: rgb(var(--bg-primary) / 0.95);
|
|
1457
1500
|
}
|
|
1458
1501
|
|
|
1502
|
+
.bg-\[rgb\(var\(--bg-secondary\)\)\] {
|
|
1503
|
+
background-color: rgb(var(--bg-secondary));
|
|
1504
|
+
}
|
|
1505
|
+
|
|
1459
1506
|
.bg-\[rgb\(var\(--bg-tertiary\)\)\] {
|
|
1460
1507
|
background-color: rgb(var(--bg-tertiary));
|
|
1461
1508
|
}
|
|
@@ -1464,6 +1511,10 @@ body {
|
|
|
1464
1511
|
background-color: rgb(var(--border-color));
|
|
1465
1512
|
}
|
|
1466
1513
|
|
|
1514
|
+
.bg-\[rgb\(var\(--color-primary-100\)\)\] {
|
|
1515
|
+
background-color: rgb(var(--color-primary-100));
|
|
1516
|
+
}
|
|
1517
|
+
|
|
1467
1518
|
.bg-\[rgb\(var\(--color-primary-50\)\)\] {
|
|
1468
1519
|
background-color: rgb(var(--color-primary-50));
|
|
1469
1520
|
}
|
|
@@ -1545,11 +1596,6 @@ body {
|
|
|
1545
1596
|
background-color: rgb(209 213 219 / var(--tw-bg-opacity, 1));
|
|
1546
1597
|
}
|
|
1547
1598
|
|
|
1548
|
-
.bg-gray-50 {
|
|
1549
|
-
--tw-bg-opacity: 1;
|
|
1550
|
-
background-color: rgb(249 250 251 / var(--tw-bg-opacity, 1));
|
|
1551
|
-
}
|
|
1552
|
-
|
|
1553
1599
|
.bg-rose-100 {
|
|
1554
1600
|
--tw-bg-opacity: 1;
|
|
1555
1601
|
background-color: rgb(255 228 230 / var(--tw-bg-opacity, 1));
|
|
@@ -1609,9 +1655,9 @@ body {
|
|
|
1609
1655
|
padding: 2rem;
|
|
1610
1656
|
}
|
|
1611
1657
|
|
|
1612
|
-
.px-
|
|
1613
|
-
padding-left: 0.
|
|
1614
|
-
padding-right: 0.
|
|
1658
|
+
.px-2 {
|
|
1659
|
+
padding-left: 0.5rem;
|
|
1660
|
+
padding-right: 0.5rem;
|
|
1615
1661
|
}
|
|
1616
1662
|
|
|
1617
1663
|
.px-3 {
|
|
@@ -1683,10 +1729,22 @@ body {
|
|
|
1683
1729
|
padding-bottom: 0.5rem;
|
|
1684
1730
|
}
|
|
1685
1731
|
|
|
1732
|
+
.pb-24 {
|
|
1733
|
+
padding-bottom: 6rem;
|
|
1734
|
+
}
|
|
1735
|
+
|
|
1736
|
+
.pb-4 {
|
|
1737
|
+
padding-bottom: 1rem;
|
|
1738
|
+
}
|
|
1739
|
+
|
|
1686
1740
|
.pb-6 {
|
|
1687
1741
|
padding-bottom: 1.5rem;
|
|
1688
1742
|
}
|
|
1689
1743
|
|
|
1744
|
+
.pb-8 {
|
|
1745
|
+
padding-bottom: 2rem;
|
|
1746
|
+
}
|
|
1747
|
+
|
|
1690
1748
|
.pl-1 {
|
|
1691
1749
|
padding-left: 0.25rem;
|
|
1692
1750
|
}
|
|
@@ -1695,10 +1753,6 @@ body {
|
|
|
1695
1753
|
padding-left: 2.5rem;
|
|
1696
1754
|
}
|
|
1697
1755
|
|
|
1698
|
-
.pl-4 {
|
|
1699
|
-
padding-left: 1rem;
|
|
1700
|
-
}
|
|
1701
|
-
|
|
1702
1756
|
.pr-4 {
|
|
1703
1757
|
padding-right: 1rem;
|
|
1704
1758
|
}
|
|
@@ -1707,6 +1761,10 @@ body {
|
|
|
1707
1761
|
padding-top: 1rem;
|
|
1708
1762
|
}
|
|
1709
1763
|
|
|
1764
|
+
.pt-8 {
|
|
1765
|
+
padding-top: 2rem;
|
|
1766
|
+
}
|
|
1767
|
+
|
|
1710
1768
|
.text-left {
|
|
1711
1769
|
text-align: left;
|
|
1712
1770
|
}
|
|
@@ -1733,6 +1791,11 @@ body {
|
|
|
1733
1791
|
line-height: 2.25rem;
|
|
1734
1792
|
}
|
|
1735
1793
|
|
|
1794
|
+
.text-4xl {
|
|
1795
|
+
font-size: 2.25rem;
|
|
1796
|
+
line-height: 2.5rem;
|
|
1797
|
+
}
|
|
1798
|
+
|
|
1736
1799
|
.text-5xl {
|
|
1737
1800
|
font-size: 3rem;
|
|
1738
1801
|
line-height: 1;
|
|
@@ -1814,6 +1877,14 @@ body {
|
|
|
1814
1877
|
color: rgb(var(--color-primary-500));
|
|
1815
1878
|
}
|
|
1816
1879
|
|
|
1880
|
+
.text-\[rgb\(var\(--color-primary-600\)\)\] {
|
|
1881
|
+
color: rgb(var(--color-primary-600));
|
|
1882
|
+
}
|
|
1883
|
+
|
|
1884
|
+
.text-\[rgb\(var\(--color-primary-800\)\)\] {
|
|
1885
|
+
color: rgb(var(--color-primary-800));
|
|
1886
|
+
}
|
|
1887
|
+
|
|
1817
1888
|
.text-\[rgb\(var\(--error\)\)\] {
|
|
1818
1889
|
color: rgb(var(--error));
|
|
1819
1890
|
}
|
|
@@ -1870,11 +1941,6 @@ body {
|
|
|
1870
1941
|
color: rgb(107 114 128 / var(--tw-text-opacity, 1));
|
|
1871
1942
|
}
|
|
1872
1943
|
|
|
1873
|
-
.text-gray-700 {
|
|
1874
|
-
--tw-text-opacity: 1;
|
|
1875
|
-
color: rgb(55 65 81 / var(--tw-text-opacity, 1));
|
|
1876
|
-
}
|
|
1877
|
-
|
|
1878
1944
|
.text-rose-600 {
|
|
1879
1945
|
--tw-text-opacity: 1;
|
|
1880
1946
|
color: rgb(225 29 72 / var(--tw-text-opacity, 1));
|
|
@@ -1915,11 +1981,6 @@ body {
|
|
|
1915
1981
|
color: rgb(255 255 255 / var(--tw-text-opacity, 1));
|
|
1916
1982
|
}
|
|
1917
1983
|
|
|
1918
|
-
.text-yellow-400 {
|
|
1919
|
-
--tw-text-opacity: 1;
|
|
1920
|
-
color: rgb(250 204 21 / var(--tw-text-opacity, 1));
|
|
1921
|
-
}
|
|
1922
|
-
|
|
1923
1984
|
.opacity-0 {
|
|
1924
1985
|
opacity: 0;
|
|
1925
1986
|
}
|
|
@@ -2177,16 +2238,28 @@ body {
|
|
|
2177
2238
|
font-weight: 600;
|
|
2178
2239
|
}
|
|
2179
2240
|
|
|
2241
|
+
.last\:border-0:last-child {
|
|
2242
|
+
border-width: 0px;
|
|
2243
|
+
}
|
|
2244
|
+
|
|
2180
2245
|
.last\:border-b-0:last-child {
|
|
2181
2246
|
border-bottom-width: 0px;
|
|
2182
2247
|
}
|
|
2183
2248
|
|
|
2249
|
+
.last\:pb-0:last-child {
|
|
2250
|
+
padding-bottom: 0px;
|
|
2251
|
+
}
|
|
2252
|
+
|
|
2184
2253
|
.hover\:scale-105:hover {
|
|
2185
2254
|
--tw-scale-x: 1.05;
|
|
2186
2255
|
--tw-scale-y: 1.05;
|
|
2187
2256
|
transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
|
|
2188
2257
|
}
|
|
2189
2258
|
|
|
2259
|
+
.hover\:border-\[rgb\(var\(--color-primary-500\)\)\]:hover {
|
|
2260
|
+
border-color: rgb(var(--color-primary-500));
|
|
2261
|
+
}
|
|
2262
|
+
|
|
2190
2263
|
.hover\:border-emerald-400:hover {
|
|
2191
2264
|
--tw-border-opacity: 1;
|
|
2192
2265
|
border-color: rgb(52 211 153 / var(--tw-border-opacity, 1));
|
|
@@ -2197,6 +2270,10 @@ body {
|
|
|
2197
2270
|
border-color: rgb(16 185 129 / var(--tw-border-opacity, 1));
|
|
2198
2271
|
}
|
|
2199
2272
|
|
|
2273
|
+
.hover\:bg-\[rgb\(var\(--bg-secondary\)\)\]:hover {
|
|
2274
|
+
background-color: rgb(var(--bg-secondary));
|
|
2275
|
+
}
|
|
2276
|
+
|
|
2200
2277
|
.hover\:bg-\[rgb\(var\(--bg-tertiary\)\)\]:hover {
|
|
2201
2278
|
background-color: rgb(var(--bg-tertiary));
|
|
2202
2279
|
}
|
|
@@ -2234,13 +2311,16 @@ body {
|
|
|
2234
2311
|
background-color: rgb(30 41 59 / var(--tw-bg-opacity, 1));
|
|
2235
2312
|
}
|
|
2236
2313
|
|
|
2237
|
-
.hover\:text-\[rgb\(var\(--
|
|
2238
|
-
color: rgb(var(--
|
|
2314
|
+
.hover\:text-\[rgb\(var\(--color-primary-500\)\)\]:hover {
|
|
2315
|
+
color: rgb(var(--color-primary-500));
|
|
2239
2316
|
}
|
|
2240
2317
|
|
|
2241
|
-
.hover\:text-
|
|
2242
|
-
--
|
|
2243
|
-
|
|
2318
|
+
.hover\:text-\[rgb\(var\(--text-primary\)\)\]:hover {
|
|
2319
|
+
color: rgb(var(--text-primary));
|
|
2320
|
+
}
|
|
2321
|
+
|
|
2322
|
+
.hover\:text-\[rgb\(var\(--text-secondary\)\)\]:hover {
|
|
2323
|
+
color: rgb(var(--text-secondary));
|
|
2244
2324
|
}
|
|
2245
2325
|
|
|
2246
2326
|
.hover\:text-slate-900:hover {
|
|
@@ -2258,9 +2338,8 @@ body {
|
|
|
2258
2338
|
box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
|
|
2259
2339
|
}
|
|
2260
2340
|
|
|
2261
|
-
.focus\:border-
|
|
2262
|
-
|
|
2263
|
-
border-color: rgb(16 185 129 / var(--tw-border-opacity, 1));
|
|
2341
|
+
.focus\:border-\[rgb\(var\(--color-primary-500\)\)\]:focus {
|
|
2342
|
+
border-color: rgb(var(--color-primary-500));
|
|
2264
2343
|
}
|
|
2265
2344
|
|
|
2266
2345
|
.focus\:ring-2:focus {
|
|
@@ -2269,9 +2348,8 @@ body {
|
|
|
2269
2348
|
box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
|
|
2270
2349
|
}
|
|
2271
2350
|
|
|
2272
|
-
.focus\:ring-
|
|
2273
|
-
--tw-ring-
|
|
2274
|
-
--tw-ring-color: rgb(16 185 129 / var(--tw-ring-opacity, 1));
|
|
2351
|
+
.focus\:ring-\[rgb\(var\(--color-primary-500\)\)\]:focus {
|
|
2352
|
+
--tw-ring-color: rgb(var(--color-primary-500));
|
|
2275
2353
|
}
|
|
2276
2354
|
|
|
2277
2355
|
.disabled\:cursor-not-allowed:disabled {
|
|
@@ -2338,11 +2416,6 @@ body {
|
|
|
2338
2416
|
border-color: rgb(159 18 57 / 0.5);
|
|
2339
2417
|
}
|
|
2340
2418
|
|
|
2341
|
-
.dark\:bg-\[\#1b1b1d\]:is(.dark *) {
|
|
2342
|
-
--tw-bg-opacity: 1;
|
|
2343
|
-
background-color: rgb(27 27 29 / var(--tw-bg-opacity, 1));
|
|
2344
|
-
}
|
|
2345
|
-
|
|
2346
2419
|
.dark\:bg-\[\#1c1e21\]:is(.dark *) {
|
|
2347
2420
|
--tw-bg-opacity: 1;
|
|
2348
2421
|
background-color: rgb(28 30 33 / var(--tw-bg-opacity, 1));
|
|
@@ -2353,9 +2426,8 @@ body {
|
|
|
2353
2426
|
background-color: rgb(32 33 36 / var(--tw-bg-opacity, 1));
|
|
2354
2427
|
}
|
|
2355
2428
|
|
|
2356
|
-
.dark\:bg-\[
|
|
2357
|
-
--
|
|
2358
|
-
background-color: rgb(36 37 38 / var(--tw-bg-opacity, 1));
|
|
2429
|
+
.dark\:bg-\[rgb\(var\(--color-primary-900\)\)\]:is(.dark *) {
|
|
2430
|
+
background-color: rgb(var(--color-primary-900));
|
|
2359
2431
|
}
|
|
2360
2432
|
|
|
2361
2433
|
.dark\:bg-\[rgb\(var\(--color-primary-900\)\)\]\/30:is(.dark *) {
|
|
@@ -2370,11 +2442,6 @@ body {
|
|
|
2370
2442
|
background-color: rgb(30 58 138 / 0.2);
|
|
2371
2443
|
}
|
|
2372
2444
|
|
|
2373
|
-
.dark\:bg-emerald-900:is(.dark *) {
|
|
2374
|
-
--tw-bg-opacity: 1;
|
|
2375
|
-
background-color: rgb(6 78 59 / var(--tw-bg-opacity, 1));
|
|
2376
|
-
}
|
|
2377
|
-
|
|
2378
2445
|
.dark\:bg-emerald-900\/10:is(.dark *) {
|
|
2379
2446
|
background-color: rgb(6 78 59 / 0.1);
|
|
2380
2447
|
}
|
|
@@ -2401,11 +2468,6 @@ body {
|
|
|
2401
2468
|
background-color: rgb(31 41 55 / var(--tw-bg-opacity, 1));
|
|
2402
2469
|
}
|
|
2403
2470
|
|
|
2404
|
-
.dark\:bg-gray-900:is(.dark *) {
|
|
2405
|
-
--tw-bg-opacity: 1;
|
|
2406
|
-
background-color: rgb(17 24 39 / var(--tw-bg-opacity, 1));
|
|
2407
|
-
}
|
|
2408
|
-
|
|
2409
2471
|
.dark\:bg-rose-900\/10:is(.dark *) {
|
|
2410
2472
|
background-color: rgb(136 19 55 / 0.1);
|
|
2411
2473
|
}
|
|
@@ -2423,6 +2485,10 @@ body {
|
|
|
2423
2485
|
background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1));
|
|
2424
2486
|
}
|
|
2425
2487
|
|
|
2488
|
+
.dark\:text-\[rgb\(var\(--color-primary-400\)\)\]:is(.dark *) {
|
|
2489
|
+
color: rgb(var(--color-primary-400));
|
|
2490
|
+
}
|
|
2491
|
+
|
|
2426
2492
|
.dark\:text-amber-400:is(.dark *) {
|
|
2427
2493
|
--tw-text-opacity: 1;
|
|
2428
2494
|
color: rgb(251 191 36 / var(--tw-text-opacity, 1));
|
|
@@ -2513,7 +2579,25 @@ body {
|
|
|
2513
2579
|
color: rgb(243 244 246 / var(--tw-text-opacity, 1));
|
|
2514
2580
|
}
|
|
2515
2581
|
|
|
2582
|
+
@media (min-width: 640px) {
|
|
2583
|
+
.sm\:w-auto {
|
|
2584
|
+
width: auto;
|
|
2585
|
+
}
|
|
2586
|
+
|
|
2587
|
+
.sm\:flex-row {
|
|
2588
|
+
flex-direction: row;
|
|
2589
|
+
}
|
|
2590
|
+
}
|
|
2591
|
+
|
|
2516
2592
|
@media (min-width: 768px) {
|
|
2593
|
+
.md\:col-span-1 {
|
|
2594
|
+
grid-column: span 1 / span 1;
|
|
2595
|
+
}
|
|
2596
|
+
|
|
2597
|
+
.md\:col-span-2 {
|
|
2598
|
+
grid-column: span 2 / span 2;
|
|
2599
|
+
}
|
|
2600
|
+
|
|
2517
2601
|
.md\:block {
|
|
2518
2602
|
display: block;
|
|
2519
2603
|
}
|
|
@@ -2537,6 +2621,10 @@ body {
|
|
|
2537
2621
|
.md\:grid-cols-4 {
|
|
2538
2622
|
grid-template-columns: repeat(4, minmax(0, 1fr));
|
|
2539
2623
|
}
|
|
2624
|
+
|
|
2625
|
+
.md\:gap-4 {
|
|
2626
|
+
gap: 1rem;
|
|
2627
|
+
}
|
|
2540
2628
|
}
|
|
2541
2629
|
|
|
2542
2630
|
@media (min-width: 1024px) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@learnmd/default-theme",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.2-beta.0",
|
|
4
4
|
"description": "Default theme for LearnMD courses",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -24,7 +24,8 @@
|
|
|
24
24
|
"react": ">=18.0.0",
|
|
25
25
|
"react-dom": ">=18.0.0",
|
|
26
26
|
"zustand": "^4.5.0",
|
|
27
|
-
"@learnmd/core": "0.0.
|
|
27
|
+
"@learnmd/core": "0.0.2-beta.0",
|
|
28
|
+
"@learnmd/plugin-pdf": "0.0.2-beta.0"
|
|
28
29
|
},
|
|
29
30
|
"devDependencies": {
|
|
30
31
|
"@testing-library/jest-dom": "^6.4.2",
|