@learnmd/default-theme 0.0.1-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.
Files changed (96) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +30 -0
  3. package/dist/components/Callout.d.ts +10 -0
  4. package/dist/components/Callout.d.ts.map +1 -0
  5. package/dist/components/Callout.js +44 -0
  6. package/dist/components/Callout.js.map +1 -0
  7. package/dist/components/Callout.test.d.ts +2 -0
  8. package/dist/components/Callout.test.d.ts.map +1 -0
  9. package/dist/components/Callout.test.js +24 -0
  10. package/dist/components/Callout.test.js.map +1 -0
  11. package/dist/components/CatalogViewer.d.ts +9 -0
  12. package/dist/components/CatalogViewer.d.ts.map +1 -0
  13. package/dist/components/CatalogViewer.js +24 -0
  14. package/dist/components/CatalogViewer.js.map +1 -0
  15. package/dist/components/CourseViewer.d.ts +11 -0
  16. package/dist/components/CourseViewer.d.ts.map +1 -0
  17. package/dist/components/CourseViewer.js +45 -0
  18. package/dist/components/CourseViewer.js.map +1 -0
  19. package/dist/components/Gamification.d.ts +32 -0
  20. package/dist/components/Gamification.d.ts.map +1 -0
  21. package/dist/components/Gamification.js +27 -0
  22. package/dist/components/Gamification.js.map +1 -0
  23. package/dist/components/ImageEmbed.d.ts +23 -0
  24. package/dist/components/ImageEmbed.d.ts.map +1 -0
  25. package/dist/components/ImageEmbed.js +39 -0
  26. package/dist/components/ImageEmbed.js.map +1 -0
  27. package/dist/components/LanguageSwitcher.d.ts +8 -0
  28. package/dist/components/LanguageSwitcher.d.ts.map +1 -0
  29. package/dist/components/LanguageSwitcher.js +61 -0
  30. package/dist/components/LanguageSwitcher.js.map +1 -0
  31. package/dist/components/Paragraph.d.ts +8 -0
  32. package/dist/components/Paragraph.d.ts.map +1 -0
  33. package/dist/components/Paragraph.js +23 -0
  34. package/dist/components/Paragraph.js.map +1 -0
  35. package/dist/components/ProfileViewer.d.ts +2 -0
  36. package/dist/components/ProfileViewer.d.ts.map +1 -0
  37. package/dist/components/ProfileViewer.js +31 -0
  38. package/dist/components/ProfileViewer.js.map +1 -0
  39. package/dist/components/Progress.d.ts +31 -0
  40. package/dist/components/Progress.d.ts.map +1 -0
  41. package/dist/components/Progress.js +41 -0
  42. package/dist/components/Progress.js.map +1 -0
  43. package/dist/components/Quiz.d.ts +34 -0
  44. package/dist/components/Quiz.d.ts.map +1 -0
  45. package/dist/components/Quiz.js +109 -0
  46. package/dist/components/Quiz.js.map +1 -0
  47. package/dist/components/Quiz.test.d.ts +2 -0
  48. package/dist/components/Quiz.test.d.ts.map +1 -0
  49. package/dist/components/Quiz.test.js +48 -0
  50. package/dist/components/Quiz.test.js.map +1 -0
  51. package/dist/components/Search.d.ts +17 -0
  52. package/dist/components/Search.d.ts.map +1 -0
  53. package/dist/components/Search.js +30 -0
  54. package/dist/components/Search.js.map +1 -0
  55. package/dist/components/VideoEmbed.d.ts +15 -0
  56. package/dist/components/VideoEmbed.d.ts.map +1 -0
  57. package/dist/components/VideoEmbed.js +83 -0
  58. package/dist/components/VideoEmbed.js.map +1 -0
  59. package/dist/components/index.d.ts +13 -0
  60. package/dist/components/index.d.ts.map +1 -0
  61. package/dist/components/index.js +13 -0
  62. package/dist/components/index.js.map +1 -0
  63. package/dist/hooks/index.d.ts +3 -0
  64. package/dist/hooks/index.d.ts.map +1 -0
  65. package/dist/hooks/index.js +3 -0
  66. package/dist/hooks/index.js.map +1 -0
  67. package/dist/hooks/useI18n.d.ts +11 -0
  68. package/dist/hooks/useI18n.d.ts.map +1 -0
  69. package/dist/hooks/useI18n.js +39 -0
  70. package/dist/hooks/useI18n.js.map +1 -0
  71. package/dist/hooks/useTheme.d.ts +13 -0
  72. package/dist/hooks/useTheme.d.ts.map +1 -0
  73. package/dist/hooks/useTheme.js +49 -0
  74. package/dist/hooks/useTheme.js.map +1 -0
  75. package/dist/index.d.ts +5 -0
  76. package/dist/index.d.ts.map +1 -0
  77. package/dist/index.js +5 -0
  78. package/dist/index.js.map +1 -0
  79. package/dist/layouts/CourseLayout.d.ts +40 -0
  80. package/dist/layouts/CourseLayout.d.ts.map +1 -0
  81. package/dist/layouts/CourseLayout.js +40 -0
  82. package/dist/layouts/CourseLayout.js.map +1 -0
  83. package/dist/layouts/MainLayout.d.ts +18 -0
  84. package/dist/layouts/MainLayout.d.ts.map +1 -0
  85. package/dist/layouts/MainLayout.js +23 -0
  86. package/dist/layouts/MainLayout.js.map +1 -0
  87. package/dist/layouts/index.d.ts +5 -0
  88. package/dist/layouts/index.d.ts.map +1 -0
  89. package/dist/layouts/index.js +3 -0
  90. package/dist/layouts/index.js.map +1 -0
  91. package/dist/styles/output.css +2586 -0
  92. package/dist/test/setup.d.ts +2 -0
  93. package/dist/test/setup.d.ts.map +1 -0
  94. package/dist/test/setup.js +22 -0
  95. package/dist/test/setup.js.map +1 -0
  96. package/package.json +68 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024 LearnMD Contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,30 @@
1
+ # 🎨 @learnmd/default-theme
2
+
3
+ A premium, Docusaurus-inspired UI theme for LearnMD courses. Built with **Tailwind CSS** and **React**, it provides a polished, interactive experience out of the box.
4
+
5
+ ## ✨ Highlights
6
+
7
+ - **Docusaurus-like Layout**: Clean header, collapsible sidebar, and intuitive lesson navigation.
8
+ - **Dark Mode**: High-contrast, elegant dark theme support.
9
+ - **Interactive Components**:
10
+ - `Quiz`: Beautifully styled emerald/rose feedback.
11
+ - `Callout`: Informational alerts (Info, Tip, Warning, Danger).
12
+ - `VideoEmbed`: Support for YouTube, Vimeo, and more.
13
+ - `Progress`: Visual completion tracking.
14
+ - **Tailwind Native**: Fully customizable via Tailwind configuration.
15
+
16
+ ## 🛠️ Integration
17
+
18
+ Import the styles and components in your React application:
19
+
20
+ ```tsx
21
+ import { CourseViewer } from '@learnmd/default-theme';
22
+ import '@learnmd/default-theme/styles';
23
+ ```
24
+
25
+ ## 📂 Components
26
+
27
+ - `CourseLayout`: The main shell for the course.
28
+ - `CourseViewer`: The orchestrator that renders lessons and navigation.
29
+ - `Quiz`: The assessment engine.
30
+ - `Callout`: The alert system.
@@ -0,0 +1,10 @@
1
+ import React from 'react';
2
+ export type CalloutType = 'info' | 'warning' | 'tip' | 'danger' | 'success';
3
+ export interface CalloutProps {
4
+ type?: CalloutType;
5
+ title?: string;
6
+ children: React.ReactNode;
7
+ }
8
+ export declare function Callout({ type, title, children }: CalloutProps): import("react/jsx-runtime").JSX.Element;
9
+ export default Callout;
10
+ //# sourceMappingURL=Callout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Callout.d.ts","sourceRoot":"","sources":["../../src/components/Callout.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,SAAS,CAAC;AAE5E,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AA2CD,wBAAgB,OAAO,CAAC,EAAE,IAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,YAAY,2CAwBvE;AAED,eAAe,OAAO,CAAC"}
@@ -0,0 +1,44 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ const calloutConfig = {
3
+ info: {
4
+ bg: 'bg-blue-50 dark:bg-blue-900/20',
5
+ border: 'border-blue-200 dark:border-blue-800/50 border-l-4 border-l-blue-500',
6
+ text: 'text-blue-700 dark:text-blue-400',
7
+ icon: 'M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z',
8
+ title: 'Info',
9
+ },
10
+ warning: {
11
+ bg: 'bg-amber-50 dark:bg-amber-900/20',
12
+ border: 'border-amber-200 dark:border-amber-800/50 border-l-4 border-l-amber-500',
13
+ text: 'text-amber-700 dark:text-amber-400',
14
+ icon: 'M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z',
15
+ title: 'Warning',
16
+ },
17
+ tip: {
18
+ bg: 'bg-emerald-50 dark:bg-emerald-900/20',
19
+ border: 'border-emerald-200 dark:border-emerald-800/50 border-l-4 border-l-emerald-500',
20
+ text: 'text-emerald-700 dark:text-emerald-400',
21
+ icon: 'M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z',
22
+ title: 'Tip',
23
+ },
24
+ danger: {
25
+ bg: 'bg-rose-50 dark:bg-rose-900/20',
26
+ border: 'border-rose-200 dark:border-rose-800/50 border-l-4 border-l-rose-500',
27
+ text: 'text-rose-700 dark:text-rose-400',
28
+ icon: 'M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z',
29
+ title: 'Danger',
30
+ },
31
+ success: {
32
+ bg: 'bg-emerald-50 dark:bg-emerald-900/20',
33
+ border: 'border-emerald-200 dark:border-emerald-800/50 border-l-4 border-l-emerald-500',
34
+ text: 'text-emerald-700 dark:text-emerald-400',
35
+ icon: 'M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z',
36
+ title: 'Success',
37
+ },
38
+ };
39
+ export function Callout({ type = 'info', title, children }) {
40
+ const config = calloutConfig[type];
41
+ return (_jsx("div", { className: `${config.bg} border-y border-r ${config.border} rounded-r-lg p-5 my-6 shadow-sm`, children: _jsxs("div", { className: "flex gap-4", children: [_jsx("svg", { className: `w-6 h-6 flex-shrink-0 ${config.text} mt-0.5`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: config.icon }) }), _jsxs("div", { className: "flex-1", children: [_jsx("h5", { className: `font-bold mb-2 ${config.text} text-lg tracking-tight`, children: title || config.title }), _jsx("div", { className: "text-[15px] leading-relaxed text-slate-700 dark:text-gray-300 [&>p]:mb-3 [&>p:last-child]:mb-0", children: children })] })] }) }));
42
+ }
43
+ export default Callout;
44
+ //# sourceMappingURL=Callout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Callout.js","sourceRoot":"","sources":["../../src/components/Callout.tsx"],"names":[],"mappings":";AAUA,MAAM,aAAa,GAGf;IACF,IAAI,EAAE;QACJ,EAAE,EAAE,gCAAgC;QACpC,MAAM,EAAE,sEAAsE;QAC9E,IAAI,EAAE,kCAAkC;QACxC,IAAI,EAAE,2DAA2D;QACjE,KAAK,EAAE,MAAM;KACd;IACD,OAAO,EAAE;QACP,EAAE,EAAE,kCAAkC;QACtC,MAAM,EAAE,yEAAyE;QACjF,IAAI,EAAE,oCAAoC;QAC1C,IAAI,EAAE,sIAAsI;QAC5I,KAAK,EAAE,SAAS;KACjB;IACD,GAAG,EAAE;QACH,EAAE,EAAE,sCAAsC;QAC1C,MAAM,EAAE,+EAA+E;QACvF,IAAI,EAAE,wCAAwC;QAC9C,IAAI,EAAE,kNAAkN;QACxN,KAAK,EAAE,KAAK;KACb;IACD,MAAM,EAAE;QACN,EAAE,EAAE,gCAAgC;QACpC,MAAM,EAAE,sEAAsE;QAC9E,IAAI,EAAE,kCAAkC;QACxC,IAAI,EAAE,mDAAmD;QACzD,KAAK,EAAE,QAAQ;KAChB;IACD,OAAO,EAAE;QACP,EAAE,EAAE,sCAAsC;QAC1C,MAAM,EAAE,+EAA+E;QACvF,IAAI,EAAE,wCAAwC;QAC9C,IAAI,EAAE,+CAA+C;QACrD,KAAK,EAAE,SAAS;KACjB;CACF,CAAC;AAEF,MAAM,UAAU,OAAO,CAAC,EAAE,IAAI,GAAG,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAgB;IACtE,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAEnC,OAAO,CACL,cAAK,SAAS,EAAE,GAAG,MAAM,CAAC,EAAE,sBAAsB,MAAM,CAAC,MAAM,kCAAkC,YAC/F,eAAK,SAAS,EAAC,YAAY,aACzB,cACE,SAAS,EAAE,yBAAyB,MAAM,CAAC,IAAI,SAAS,EACxD,IAAI,EAAC,MAAM,EACX,OAAO,EAAC,WAAW,EACnB,MAAM,EAAC,cAAc,EACrB,WAAW,EAAE,CAAC,YAEd,eAAM,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,EAAC,CAAC,EAAE,MAAM,CAAC,IAAI,GAAI,GACjE,EACN,eAAK,SAAS,EAAC,QAAQ,aACrB,aAAI,SAAS,EAAE,kBAAkB,MAAM,CAAC,IAAI,yBAAyB,YAAG,KAAK,IAAI,MAAM,CAAC,KAAK,GAAM,EACnG,cAAK,SAAS,EAAC,gGAAgG,YAC5G,QAAQ,GACL,IACF,IACF,GACF,CACP,CAAC;AACJ,CAAC;AAED,eAAe,OAAO,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=Callout.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Callout.test.d.ts","sourceRoot":"","sources":["../../src/components/Callout.test.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,24 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { render, screen } from '@testing-library/react';
3
+ import { describe, it, expect } from 'vitest';
4
+ import Callout from './Callout';
5
+ describe('Callout', () => {
6
+ it('should render children content', () => {
7
+ render(_jsx(Callout, { children: "Test Content" }));
8
+ expect(screen.getByText('Test Content')).toBeDefined();
9
+ });
10
+ it('should render with correct title', () => {
11
+ render(_jsx(Callout, { title: "Custom Title", children: "Content" }));
12
+ expect(screen.getByText('Custom Title')).toBeDefined();
13
+ });
14
+ it('should apply correct classes based on type', () => {
15
+ const { container } = render(_jsx(Callout, { type: "danger", children: "Danger Content" }));
16
+ // Check for rose classes (danger)
17
+ expect(container.firstChild).toHaveClass('bg-rose-50');
18
+ });
19
+ it('should render default title if none provided', () => {
20
+ render(_jsx(Callout, { type: "warning", children: "Warning Content" }));
21
+ expect(screen.getByText('Warning')).toBeDefined();
22
+ });
23
+ });
24
+ //# sourceMappingURL=Callout.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Callout.test.js","sourceRoot":"","sources":["../../src/components/Callout.test.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,OAAO,MAAM,WAAW,CAAC;AAEhC,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;IACvB,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,KAAC,OAAO,+BAAuB,CAAC,CAAC;QACxC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,KAAC,OAAO,IAAC,KAAK,EAAC,cAAc,wBAAkB,CAAC,CAAC;QACxD,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,KAAC,OAAO,IAAC,IAAI,EAAC,QAAQ,+BAAyB,CAAC,CAAC;QAC9E,kCAAkC;QAClC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,CAAC,KAAC,OAAO,IAAC,IAAI,EAAC,SAAS,gCAA0B,CAAC,CAAC;QAC1D,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IACpD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ export interface CatalogViewerProps {
2
+ courses: Array<{
3
+ courseSlug: string;
4
+ slug: string;
5
+ frontmatter: Record<string, unknown>;
6
+ }>;
7
+ }
8
+ export declare function CatalogViewer({ courses }: CatalogViewerProps): import("react/jsx-runtime").JSX.Element;
9
+ //# sourceMappingURL=CatalogViewer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CatalogViewer.d.ts","sourceRoot":"","sources":["../../src/components/CatalogViewer.tsx"],"names":[],"mappings":"AAIA,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;CAC5F;AAED,wBAAgB,aAAa,CAAC,EAAE,OAAO,EAAE,EAAE,kBAAkB,2CAkE5D"}
@@ -0,0 +1,24 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { MainLayout, Header } from '../layouts/MainLayout';
3
+ import { Link } from 'react-router-dom';
4
+ export function CatalogViewer({ courses }) {
5
+ // Remove unused storage
6
+ // Group lessons by courseSlug
7
+ const courseMap = new Map();
8
+ courses.forEach(lesson => {
9
+ if (!courseMap.has(lesson.courseSlug)) {
10
+ courseMap.set(lesson.courseSlug, {
11
+ id: lesson.courseSlug,
12
+ title: lesson.courseSlug.replace(/-/g, ' ').toUpperCase(),
13
+ totalLessons: 0,
14
+ });
15
+ }
16
+ const course = courseMap.get(lesson.courseSlug);
17
+ if (course) {
18
+ course.totalLessons += 1;
19
+ }
20
+ });
21
+ const uniqueCourses = Array.from(courseMap.values());
22
+ return (_jsxs(MainLayout, { children: [_jsx(Header, { title: "Course Catalog", actions: _jsx(Link, { to: "/profile", className: "text-sm font-medium hover:text-emerald-500", children: "Profile" }) }), _jsxs("div", { className: "container mx-auto px-4 py-8 max-w-5xl", children: [_jsx("h1", { className: "text-3xl font-bold mb-8", 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
+ }
24
+ //# sourceMappingURL=CatalogViewer.js.map
@@ -0,0 +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;AAMxC,MAAM,UAAU,aAAa,CAAC,EAAE,OAAO,EAAsB;IAC3D,wBAAwB;IAGxB,8BAA8B;IAC9B,MAAM,SAAS,GAAG,IAAI,GAAG,EAA+D,CAAC;IACzF,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;QACvB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;YACtC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE;gBAC/B,EAAE,EAAE,MAAM,CAAC,UAAU;gBACrB,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE;gBACzD,YAAY,EAAE,CAAC;aAChB,CAAC,CAAC;QACL,CAAC;QACD,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAChD,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,YAAY,IAAI,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;IAErD,OAAO,CACL,MAAC,UAAU,eACT,KAAC,MAAM,IACL,KAAK,EAAC,gBAAgB,EACtB,OAAO,EACL,KAAC,IAAI,IAAC,EAAE,EAAC,UAAU,EAAC,SAAS,EAAC,4CAA4C,wBAEnE,GAET,EACF,eAAK,SAAS,EAAC,uCAAuC,aACpD,aAAI,SAAS,EAAC,yBAAyB,kCAAuB,EAE7D,aAAa,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAC5B,cAAK,SAAS,EAAC,iCAAiC,qFAE1C,CACP,CAAC,CAAC,CAAC,CACF,cAAK,SAAS,EAAC,sDAAsD,YAClE,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAC3B,MAAC,IAAI,IAEH,EAAE,EAAE,YAAY,MAAM,CAAC,EAAE,EAAE,EAC3B,SAAS,EAAC,oKAAoK,aAE9K,aAAI,SAAS,EAAC,2EAA2E,YACtF,MAAM,CAAC,KAAK,GACV,EACL,aAAG,SAAS,EAAC,+CAA+C,aACzD,MAAM,CAAC,YAAY,uBAClB,EACJ,eAAK,SAAS,EAAC,8EAA8E,6BAE3F,cAAK,SAAS,EAAC,6DAA6D,EAAC,IAAI,EAAC,MAAM,EAAC,OAAO,EAAC,WAAW,EAAC,MAAM,EAAC,cAAc,YAChI,eAAM,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,EAAC,WAAW,EAAE,CAAC,EAAE,CAAC,EAAC,cAAc,GAAG,GAClF,IACF,KAfD,MAAM,CAAC,EAAE,CAgBT,CACR,CAAC,GACE,CACP,IACG,IACK,CACd,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ import React from 'react';
2
+ export interface CourseViewerProps {
3
+ allLessons: Array<{
4
+ courseSlug: string;
5
+ slug: string;
6
+ Component: React.ComponentType;
7
+ frontmatter: Record<string, unknown>;
8
+ }>;
9
+ }
10
+ export declare function CourseViewer({ allLessons }: CourseViewerProps): import("react/jsx-runtime").JSX.Element;
11
+ //# sourceMappingURL=CourseViewer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CourseViewer.d.ts","sourceRoot":"","sources":["../../src/components/CourseViewer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAe1B,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;CAC/H;AAWD,wBAAgB,YAAY,CAAC,EAAE,UAAU,EAAE,EAAE,iBAAiB,2CAiD7D"}
@@ -0,0 +1,45 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { ThemeProvider } from '../hooks';
3
+ import { CourseLayout } from '../layouts';
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
+ import { getTranslatedString } from '@learnmd/core';
13
+ import { useParams, useNavigate } from 'react-router-dom';
14
+ const components = {
15
+ Callout,
16
+ Quiz,
17
+ VideoEmbed,
18
+ Progress,
19
+ LanguageSwitcher,
20
+ Paragraph,
21
+ };
22
+ export function CourseViewer({ allLessons }) {
23
+ const { courseId, '*': pathLessonSlug } = useParams();
24
+ const navigate = useNavigate();
25
+ const courseLessons = allLessons.filter(l => l.courseSlug === courseId);
26
+ const currentSlug = pathLessonSlug || courseLessons[0]?.slug;
27
+ const currentLesson = courseLessons.find(l => l.slug === currentSlug) || courseLessons[0];
28
+ const Component = currentLesson?.Component;
29
+ const navigation = [{
30
+ type: 'module',
31
+ id: `module-${courseId}`,
32
+ title: String(courseId).replace(/-/g, ' ').toUpperCase(),
33
+ children: courseLessons.map(l => ({
34
+ type: 'lesson',
35
+ id: l.slug,
36
+ title: getTranslatedString(l.frontmatter?.title, 'en') || l.slug,
37
+ slug: l.slug,
38
+ }))
39
+ }];
40
+ const handleNavigate = (slug) => {
41
+ navigate(`/courses/${courseId}/${slug}`);
42
+ };
43
+ return (_jsx(ThemeProvider, { children: _jsx(CourseLayout, { courseTitle: String(courseId).replace(/-/g, ' ').toUpperCase(), navigation: navigation, currentLessonSlug: currentSlug, completedLessons: [], progress: 0, onNavigate: handleNavigate, children: _jsx("div", { className: "prose px-8 py-4", children: Component ? (_jsx(MDXProvider, { components: components, children: _jsx(Component, {}) })) : (_jsx("div", { className: "text-center p-8", children: _jsx("p", { className: "text-lg text-[rgb(var(--text-muted))]", children: "Add markdown lessons in the \\`lessons/\\` folder to get started." }) })) }) }) }));
44
+ }
45
+ //# sourceMappingURL=CourseViewer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CourseViewer.js","sourceRoot":"","sources":["../../src/components/CourseViewer.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ export interface BadgeProps {
2
+ id: string;
3
+ name: string;
4
+ description?: string;
5
+ icon?: string;
6
+ earnedAt?: number;
7
+ size?: 'sm' | 'md' | 'lg';
8
+ showTooltip?: boolean;
9
+ }
10
+ export declare function Badge({ name, description, icon, size, showTooltip }: BadgeProps): import("react/jsx-runtime").JSX.Element;
11
+ export declare function BadgeCard({ badge, earnedAt, }: {
12
+ badge: Omit<BadgeProps, 'size' | 'showTooltip'>;
13
+ earnedAt?: number;
14
+ }): import("react/jsx-runtime").JSX.Element;
15
+ export declare function PointsDisplay({ points, label, showAnimation, }: {
16
+ points: number;
17
+ label?: string;
18
+ showAnimation?: boolean;
19
+ }): import("react/jsx-runtime").JSX.Element;
20
+ export declare function StreakDisplay({ current, longest }: {
21
+ current: number;
22
+ longest: number;
23
+ }): import("react/jsx-runtime").JSX.Element;
24
+ export declare function GamificationSummary({ totalPoints, badgesEarned, totalBadges, currentStreak, longestStreak, }: {
25
+ totalPoints: number;
26
+ badgesEarned: number;
27
+ totalBadges: number;
28
+ currentStreak: number;
29
+ longestStreak: number;
30
+ }): import("react/jsx-runtime").JSX.Element;
31
+ export default Badge;
32
+ //# sourceMappingURL=Gamification.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Gamification.d.ts","sourceRoot":"","sources":["../../src/components/Gamification.tsx"],"names":[],"mappings":"AAEA,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,wBAAgB,KAAK,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,IAAW,EAAE,WAAkB,EAAE,EAAE,UAAU,2CAsB7F;AAED,wBAAgB,SAAS,CAAC,EACxB,KAAK,EACL,QAAQ,GACT,EAAE;IACD,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,aAAa,CAAC,CAAC;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,2CAuBA;AAED,wBAAgB,aAAa,CAAC,EAC5B,MAAM,EACN,KAAK,EACL,aAAqB,GACtB,EAAE;IACD,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,2CA6BA;AAED,wBAAgB,aAAa,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,2CAoBvF;AAED,wBAAgB,mBAAmB,CAAC,EAClC,WAAW,EACX,YAAY,EACZ,WAAW,EACX,aAAa,EACb,aAAa,GACd,EAAE;IACD,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;CACvB,2CAsBA;AAED,eAAe,KAAK,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ export function Badge({ name, description, icon, size = 'md', showTooltip = true }) {
3
+ const sizeClasses = {
4
+ sm: 'w-8 h-8 text-lg',
5
+ md: 'w-12 h-12 text-2xl',
6
+ lg: 'w-16 h-16 text-3xl',
7
+ };
8
+ const badge = (_jsx("div", { className: `${sizeClasses[size]} rounded-full bg-gradient-to-br from-[rgb(var(--color-primary-400))] to-[rgb(var(--color-primary-600))] flex items-center justify-center shadow-lg hover:scale-105 transition-transform cursor-pointer`, title: showTooltip ? description : undefined, children: icon || '🏆' }));
9
+ return (_jsxs("div", { className: "flex flex-col items-center gap-2", children: [badge, _jsx("span", { className: "text-sm font-medium text-center", children: name })] }));
10
+ }
11
+ export function BadgeCard({ badge, earnedAt, }) {
12
+ const formatDate = (timestamp) => {
13
+ return new Date(timestamp).toLocaleDateString();
14
+ };
15
+ return (_jsxs("div", { className: "card flex items-start gap-4 hover:shadow-md transition-shadow", children: [_jsx("div", { className: "w-14 h-14 rounded-full bg-gradient-to-br from-[rgb(var(--color-primary-400))] to-[rgb(var(--color-primary-600))] flex items-center justify-center text-2xl shadow-md flex-shrink-0", children: badge.icon || '🏆' }), _jsxs("div", { className: "flex-1 min-w-0", children: [_jsx("h4", { className: "font-semibold text-[rgb(var(--text-primary))]", children: badge.name }), badge.description && (_jsx("p", { className: "text-sm text-[rgb(var(--text-secondary))] mt-1", children: badge.description })), earnedAt && (_jsxs("p", { className: "text-xs text-[rgb(var(--text-muted))] mt-2", children: ["Earned on ", formatDate(earnedAt)] }))] })] }));
16
+ }
17
+ export function PointsDisplay({ points, label, showAnimation = false, }) {
18
+ return (_jsxs("div", { className: "flex items-center gap-2", children: [_jsxs("div", { className: "relative", children: [_jsx("svg", { className: "w-8 h-8 text-[rgb(var(--color-primary-500))]", viewBox: "0 0 24 24", fill: "currentColor", children: _jsx("path", { d: "M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z" }) }), showAnimation && (_jsx("span", { className: "absolute inset-0 animate-ping opacity-50", children: _jsx("svg", { className: "w-8 h-8 text-[rgb(var(--color-primary-500))]", viewBox: "0 0 24 24", fill: "currentColor", children: _jsx("path", { d: "M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z" }) }) }))] }), _jsxs("div", { children: [_jsx("span", { className: "text-xl font-bold", children: points.toLocaleString() }), label && _jsx("p", { className: "text-xs text-[rgb(var(--text-muted))]", children: label })] })] }));
19
+ }
20
+ export function StreakDisplay({ current, longest }) {
21
+ return (_jsxs("div", { className: "flex items-center gap-4", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "text-2xl", children: "\uD83D\uDD25" }), _jsxs("div", { children: [_jsx("span", { className: "text-2xl font-bold", children: current }), _jsx("p", { className: "text-xs text-[rgb(var(--text-muted))]", children: "Current Streak" })] })] }), _jsx("div", { className: "h-8 w-px bg-[rgb(var(--border-color))]" }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "text-2xl", children: "\uD83C\uDFC6" }), _jsxs("div", { children: [_jsx("span", { className: "text-xl font-bold", children: longest }), _jsx("p", { className: "text-xs text-[rgb(var(--text-muted))]", children: "Best Streak" })] })] })] }));
22
+ }
23
+ export function GamificationSummary({ totalPoints, badgesEarned, totalBadges, currentStreak, longestStreak, }) {
24
+ return (_jsxs("div", { className: "grid grid-cols-1 md:grid-cols-4 gap-4", children: [_jsx("div", { className: "card flex items-center gap-4", children: _jsx(PointsDisplay, { points: totalPoints, label: "Total Points" }) }), _jsx("div", { className: "card", children: _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "text-2xl", children: "\uD83C\uDFC5" }), _jsxs("div", { children: [_jsxs("span", { className: "text-xl font-bold", children: [badgesEarned, "/", totalBadges] }), _jsx("p", { className: "text-xs text-[rgb(var(--text-muted))]", children: "Badges Earned" })] })] }) }), _jsx("div", { className: "card", children: _jsx(StreakDisplay, { current: currentStreak, longest: longestStreak }) })] }));
25
+ }
26
+ export default Badge;
27
+ //# sourceMappingURL=Gamification.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Gamification.js","sourceRoot":"","sources":["../../src/components/Gamification.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ export interface ImageEmbedProps {
2
+ src: string;
3
+ alt: string;
4
+ caption?: string;
5
+ width?: number | string;
6
+ height?: number | string;
7
+ rounded?: boolean;
8
+ shadow?: boolean;
9
+ zoomable?: boolean;
10
+ fallbackSrc?: string;
11
+ }
12
+ export declare function ImageEmbed({ src, alt, caption, width, height, rounded, shadow, zoomable, fallbackSrc, }: ImageEmbedProps): import("react/jsx-runtime").JSX.Element;
13
+ export interface ImageGalleryProps {
14
+ images: Array<{
15
+ src: string;
16
+ alt: string;
17
+ caption?: string;
18
+ }>;
19
+ columns?: 2 | 3 | 4;
20
+ }
21
+ export declare function ImageGallery({ images, columns }: ImageGalleryProps): import("react/jsx-runtime").JSX.Element;
22
+ export default ImageEmbed;
23
+ //# sourceMappingURL=ImageEmbed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImageEmbed.d.ts","sourceRoot":"","sources":["../../src/components/ImageEmbed.tsx"],"names":[],"mappings":"AAEA,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,UAAU,CAAC,EACzB,GAAG,EACH,GAAG,EACH,OAAO,EACP,KAAK,EACL,MAAM,EACN,OAAc,EACd,MAAa,EACb,QAAe,EACf,WAAW,GACZ,EAAE,eAAe,2CAgGjB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,KAAK,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC;QACZ,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC,CAAC;IACH,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;CACrB;AAED,wBAAgB,YAAY,CAAC,EAAE,MAAM,EAAE,OAAW,EAAE,EAAE,iBAAiB,2CA0CtE;AAED,eAAe,UAAU,CAAC"}
@@ -0,0 +1,39 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ export function ImageEmbed({ src, alt, caption, width, height, rounded = true, shadow = true, zoomable = true, fallbackSrc, }) {
4
+ const [isLoading, setIsLoading] = useState(true);
5
+ const [hasError, setHasError] = useState(false);
6
+ const [isZoomed, setIsZoomed] = useState(false);
7
+ const handleError = () => {
8
+ if (fallbackSrc && !hasError) {
9
+ setHasError(true);
10
+ }
11
+ else {
12
+ setHasError(true);
13
+ }
14
+ setIsLoading(false);
15
+ };
16
+ const handleLoad = () => {
17
+ setIsLoading(false);
18
+ setHasError(false);
19
+ };
20
+ const displaySrc = hasError && fallbackSrc ? fallbackSrc : src;
21
+ const imageClasses = `
22
+ ${rounded ? 'rounded-lg' : ''}
23
+ ${shadow ? 'shadow-md' : ''}
24
+ ${isLoading ? 'opacity-0' : 'opacity-100'}
25
+ transition-opacity duration-300
26
+ `;
27
+ return (_jsxs(_Fragment, { children: [_jsxs("figure", { className: "my-6", children: [_jsxs("div", { className: "relative", children: [isLoading && (_jsx("div", { className: "absolute inset-0 flex items-center justify-center bg-[rgb(var(--bg-tertiary))] rounded-lg", children: _jsx("div", { className: "w-8 h-8 border-4 border-[rgb(var(--color-primary-500))] border-t-transparent rounded-full animate-spin" }) })), hasError ? (_jsxs("div", { className: "flex flex-col items-center justify-center p-8 bg-[rgb(var(--bg-tertiary))] rounded-lg text-[rgb(var(--text-muted))]", children: [_jsx("svg", { className: "w-12 h-12 mb-2", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z" }) }), _jsx("span", { className: "text-sm", children: "Failed to load image" })] })) : (_jsx("img", { src: displaySrc, alt: alt, width: width, height: height, className: `${imageClasses} ${zoomable ? 'cursor-zoom-in' : ''}`, onClick: () => zoomable && setIsZoomed(true), onLoad: handleLoad, onError: handleError }))] }), caption && (_jsx("figcaption", { className: "text-center text-sm text-[rgb(var(--text-muted))] mt-2", children: caption }))] }), isZoomed && (_jsxs("div", { className: "fixed inset-0 z-50 bg-black/90 flex items-center justify-center p-4 cursor-zoom-out", onClick: () => setIsZoomed(false), children: [_jsx("img", { src: displaySrc, alt: alt, className: "max-w-full max-h-full object-contain rounded-lg" }), _jsx("button", { className: "absolute top-4 right-4 text-white hover:text-[rgb(var(--text-secondary))] transition-colors", onClick: () => setIsZoomed(false), children: _jsx("svg", { className: "w-8 h-8", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" }) }) })] }))] }));
28
+ }
29
+ export function ImageGallery({ images, columns = 3 }) {
30
+ const [selectedImage, setSelectedImage] = useState(null);
31
+ const gridCols = {
32
+ 2: 'grid-cols-2',
33
+ 3: 'grid-cols-2 md:grid-cols-3',
34
+ 4: 'grid-cols-2 md:grid-cols-4',
35
+ };
36
+ return (_jsxs(_Fragment, { children: [_jsx("div", { className: `grid ${gridCols[columns]} gap-4 my-6`, children: images.map((image) => (_jsx(ImageEmbed, { src: image.src, alt: image.alt, caption: image.caption, zoomable: true }, image.src))) }), selectedImage !== null && (_jsxs("div", { className: "fixed inset-0 z-50 bg-black/90 flex items-center justify-center p-4 cursor-zoom-out", onClick: () => setSelectedImage(null), children: [_jsx("img", { src: images[selectedImage].src, alt: images[selectedImage].alt, className: "max-w-full max-h-full object-contain rounded-lg" }), images[selectedImage].caption && (_jsx("div", { className: "absolute bottom-4 left-1/2 -translate-x-1/2 bg-black/50 px-4 py-2 rounded-lg text-white text-sm", children: images[selectedImage].caption }))] }))] }));
37
+ }
38
+ export default ImageEmbed;
39
+ //# sourceMappingURL=ImageEmbed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImageEmbed.js","sourceRoot":"","sources":["../../src/components/ImageEmbed.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export interface LanguageSwitcherProps {
2
+ className?: string;
3
+ showLabel?: boolean;
4
+ variant?: 'dropdown' | 'buttons' | 'flags';
5
+ }
6
+ export declare function LanguageSwitcher({ className, showLabel, variant, }: LanguageSwitcherProps): import("react/jsx-runtime").JSX.Element;
7
+ export default LanguageSwitcher;
8
+ //# sourceMappingURL=LanguageSwitcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LanguageSwitcher.d.ts","sourceRoot":"","sources":["../../src/components/LanguageSwitcher.tsx"],"names":[],"mappings":"AAGA,MAAM,WAAW,qBAAqB;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,UAAU,GAAG,SAAS,GAAG,OAAO,CAAC;CAC5C;AAgCD,wBAAgB,gBAAgB,CAAC,EAC/B,SAAc,EACd,SAAgB,EAChB,OAAoB,GACrB,EAAE,qBAAqB,2CAwHvB;AAED,eAAe,gBAAgB,CAAC"}
@@ -0,0 +1,61 @@
1
+ import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useState, useRef, useEffect } from 'react';
3
+ import { useI18n } from '../hooks';
4
+ const languageFlags = {
5
+ en: '🇺🇸',
6
+ es: '🇪🇸',
7
+ fr: '🇫🇷',
8
+ de: '🇩🇪',
9
+ pt: '🇧🇷',
10
+ zh: '🇨🇳',
11
+ ja: '🇯🇵',
12
+ ko: '🇰🇷',
13
+ it: '🇮🇹',
14
+ ru: '🇷🇺',
15
+ ar: '🇸🇦',
16
+ hi: '🇮🇳',
17
+ };
18
+ const languageNames = {
19
+ en: 'English',
20
+ es: 'Español',
21
+ fr: 'Français',
22
+ de: 'Deutsch',
23
+ pt: 'Português',
24
+ zh: '中文',
25
+ ja: '日本語',
26
+ ko: '한국어',
27
+ it: 'Italiano',
28
+ ru: 'Русский',
29
+ ar: 'العربية',
30
+ hi: 'हिन्दी',
31
+ };
32
+ export function LanguageSwitcher({ className = '', showLabel = true, variant = 'dropdown', }) {
33
+ const { currentLanguage, availableLanguages, setLanguage } = useI18n();
34
+ const [isOpen, setIsOpen] = useState(false);
35
+ const dropdownRef = useRef(null);
36
+ useEffect(() => {
37
+ function handleClickOutside(event) {
38
+ if (dropdownRef.current && !dropdownRef.current.contains(event.target)) {
39
+ setIsOpen(false);
40
+ }
41
+ }
42
+ document.addEventListener('mousedown', handleClickOutside);
43
+ return () => document.removeEventListener('mousedown', handleClickOutside);
44
+ }, []);
45
+ if (variant === 'buttons') {
46
+ return (_jsx("div", { className: `flex gap-1 ${className}`, children: availableLanguages.map((lang) => (_jsxs("button", { onClick: () => setLanguage(lang), className: `px-3 py-1.5 rounded-md text-sm font-medium transition-colors ${currentLanguage === lang
47
+ ? 'bg-[rgb(var(--color-primary-500))] text-white'
48
+ : 'bg-[rgb(var(--bg-tertiary))] text-[rgb(var(--text-secondary))] hover:bg-[rgb(var(--border-color))]'}`, children: [languageFlags[lang], " ", showLabel && languageNames[lang]] }, lang))) }));
49
+ }
50
+ if (variant === 'flags') {
51
+ return (_jsx("div", { className: `flex gap-2 ${className}`, children: availableLanguages.map((lang) => (_jsx("button", { onClick: () => setLanguage(lang), className: `text-2xl transition-transform ${currentLanguage === lang ? 'scale-110' : 'opacity-50 hover:opacity-75'}`, title: languageNames[lang], children: languageFlags[lang] }, lang))) }));
52
+ }
53
+ return (_jsxs("div", { className: `relative ${className}`, ref: dropdownRef, children: [_jsxs("button", { onClick: () => setIsOpen(!isOpen), className: "flex items-center gap-2 px-3 py-2 rounded-lg bg-[rgb(var(--bg-tertiary))] hover:bg-[rgb(var(--border-color))] transition-colors", children: [_jsx("span", { className: "text-xl", children: languageFlags[currentLanguage] }), showLabel && (_jsxs(_Fragment, { children: [_jsx("span", { className: "text-sm font-medium", children: languageNames[currentLanguage] }), _jsx("svg", { className: `w-4 h-4 transition-transform ${isOpen ? 'rotate-180' : ''}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M19 9l-7 7-7-7" }) })] }))] }), isOpen && (_jsx("div", { className: "absolute right-0 mt-2 w-48 bg-[rgb(var(--bg-primary))] border border-[rgb(var(--border-color))] rounded-lg shadow-lg z-50 overflow-hidden", children: availableLanguages.map((lang) => (_jsxs("button", { onClick: () => {
54
+ setLanguage(lang);
55
+ setIsOpen(false);
56
+ }, className: `w-full flex items-center gap-3 px-4 py-2.5 text-left hover:bg-[rgb(var(--bg-tertiary))] transition-colors ${currentLanguage === lang
57
+ ? 'bg-[rgb(var(--color-primary-50))] dark:bg-[rgb(var(--color-primary-900))]/30'
58
+ : ''}`, children: [_jsx("span", { className: "text-xl", children: languageFlags[lang] }), _jsx("span", { className: "text-sm font-medium", children: languageNames[lang] }), currentLanguage === lang && (_jsx("svg", { className: "w-4 h-4 ml-auto text-[rgb(var(--color-primary-500))]", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M5 13l4 4L19 7" }) }))] }, lang))) }))] }));
59
+ }
60
+ export default LanguageSwitcher;
61
+ //# sourceMappingURL=LanguageSwitcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LanguageSwitcher.js","sourceRoot":"","sources":["../../src/components/LanguageSwitcher.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ export interface ParagraphProps {
3
+ i18n?: string;
4
+ children: React.ReactNode;
5
+ }
6
+ export declare function Paragraph({ children }: ParagraphProps): import("react/jsx-runtime").JSX.Element;
7
+ export default Paragraph;
8
+ //# sourceMappingURL=Paragraph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Paragraph.d.ts","sourceRoot":"","sources":["../../src/components/Paragraph.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED,wBAAgB,SAAS,CAAC,EAAE,QAAQ,EAAE,EAAE,cAAc,2CAqBrD;AAED,eAAe,SAAS,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import React from 'react';
3
+ import { useI18n } from '../hooks';
4
+ export function Paragraph({ children }) {
5
+ const { currentLanguage } = useI18n();
6
+ // If children is an array, try to find the one matching the current language tag
7
+ let matchedChild = null;
8
+ React.Children.forEach(children, (child) => {
9
+ if (React.isValidElement(child)) {
10
+ // For elements like <en> or <es>, the type is the string 'en' or 'es'
11
+ if (typeof child.type === 'string' && child.type === currentLanguage) {
12
+ matchedChild = child.props.children;
13
+ }
14
+ }
15
+ });
16
+ // Fallback to displaying all children if no specific language tag is found
17
+ if (!matchedChild) {
18
+ matchedChild = children;
19
+ }
20
+ return _jsx("div", { className: "mb-4", children: matchedChild });
21
+ }
22
+ export default Paragraph;
23
+ //# sourceMappingURL=Paragraph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Paragraph.js","sourceRoot":"","sources":["../../src/components/Paragraph.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAOnC,MAAM,UAAU,SAAS,CAAC,EAAE,QAAQ,EAAkB;IACpD,MAAM,EAAE,eAAe,EAAE,GAAG,OAAO,EAAE,CAAC;IAEtC,iFAAiF;IACjF,IAAI,YAAY,GAAoB,IAAI,CAAC;IAEzC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;QACzC,IAAI,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;YAChC,sEAAsE;YACtE,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;gBACrE,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC;YACtC,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,2EAA2E;IAC3E,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,YAAY,GAAG,QAAQ,CAAC;IAC1B,CAAC;IAED,OAAO,cAAK,SAAS,EAAC,MAAM,YAAE,YAAY,GAAO,CAAC;AACpD,CAAC;AAED,eAAe,SAAS,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function ProfileViewer(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=ProfileViewer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProfileViewer.d.ts","sourceRoot":"","sources":["../../src/components/ProfileViewer.tsx"],"names":[],"mappings":"AAKA,wBAAgB,aAAa,4CAkG5B"}