@academy-sdk/sdk 0.1.1 → 0.2.1

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 (239) hide show
  1. package/dist/academy-sdk-sdk-v1.0.0.zip +0 -0
  2. package/dist/bundle.js +70 -0
  3. package/dist/manifest.json +5 -0
  4. package/dist/styles.css +3307 -0
  5. package/package.json +41 -46
  6. package/src/components/atoms/Avatar.tsx +38 -0
  7. package/src/components/atoms/Badge.tsx +32 -0
  8. package/src/components/atoms/Button.tsx +48 -0
  9. package/src/components/atoms/Card.tsx +33 -0
  10. package/src/components/atoms/Input.tsx +39 -0
  11. package/src/components/atoms/ProgressBar.tsx +52 -0
  12. package/src/components/atoms/Tabs.tsx +47 -0
  13. package/{dist/components/atoms/index.d.ts → src/components/atoms/index.ts} +0 -1
  14. package/{dist/components/index.d.ts → src/components/index.ts} +7 -1
  15. package/src/components/molecules/CourseCard.tsx +215 -0
  16. package/src/components/molecules/EmptyState.tsx +23 -0
  17. package/src/components/molecules/LoadingSpinner.tsx +27 -0
  18. package/src/components/molecules/PageHeader.tsx +22 -0
  19. package/src/components/molecules/Pagination.tsx +82 -0
  20. package/src/components/molecules/SearchInput.tsx +35 -0
  21. package/{dist/components/molecules/index.d.ts → src/components/molecules/index.ts} +0 -1
  22. package/src/components/organisms/CourseSidebar.tsx +276 -0
  23. package/src/components/organisms/LearnerNavbar.tsx +129 -0
  24. package/src/components/organisms/LearnerSidebar.tsx +148 -0
  25. package/src/components/organisms/LessonBookmarks.tsx +128 -0
  26. package/src/components/organisms/LessonNotes.tsx +153 -0
  27. package/{dist/components/organisms/index.d.ts → src/components/organisms/index.ts} +0 -1
  28. package/src/components/pages/BundleDetailPage.tsx +388 -0
  29. package/src/components/pages/CatalogBundlesPage.tsx +96 -0
  30. package/src/components/pages/CatalogCoursesPage.tsx +299 -0
  31. package/src/components/pages/CourseDetailPage.tsx +582 -0
  32. package/src/components/pages/CoursePlayerPage.tsx +481 -0
  33. package/src/components/pages/CreatorProfilePage.tsx +161 -0
  34. package/src/components/pages/LearnerSettingsPage.tsx +58 -0
  35. package/src/components/pages/ManualReviewDetailPage.tsx +254 -0
  36. package/src/components/pages/ManualReviewPage.tsx +228 -0
  37. package/src/components/pages/MessagesPage.tsx +285 -0
  38. package/src/components/pages/MyLearningPage.tsx +239 -0
  39. package/src/components/pages/PaymentCancelPage.tsx +74 -0
  40. package/src/components/pages/PaymentSuccessPage.tsx +73 -0
  41. package/{dist/components/pages/index.d.ts → src/components/pages/index.ts} +0 -1
  42. package/src/components/utils.ts +6 -0
  43. package/src/contracts/components.contract.ts +89 -0
  44. package/{dist/contracts/index.d.ts → src/contracts/index.ts} +0 -1
  45. package/src/contracts/layout.contract.ts +36 -0
  46. package/src/contracts/pages.contract.ts +275 -0
  47. package/src/contracts/template.contract.ts +100 -0
  48. package/src/default-template.tsx +52 -0
  49. package/{dist/hooks/index.d.ts → src/hooks/index.ts} +15 -1
  50. package/src/hooks/sdk-context.tsx +152 -0
  51. package/src/hooks/useAiCoach.ts +27 -0
  52. package/src/hooks/useBookmarks.ts +35 -0
  53. package/{dist/hooks/useCourseSearch.d.ts → src/hooks/useCourseSearch.ts} +8 -5
  54. package/{dist/hooks/useDebounce.d.ts → src/hooks/useDebounce.ts} +8 -2
  55. package/{dist/hooks/useMyBundles.d.ts → src/hooks/useMyBundles.ts} +8 -6
  56. package/{dist/hooks/useMyCourses.d.ts → src/hooks/useMyCourses.ts} +8 -6
  57. package/src/hooks/useNotes.ts +35 -0
  58. package/src/hooks/useNotifications.ts +16 -0
  59. package/{dist/hooks/useTheme.d.ts → src/hooks/useTheme.ts} +8 -5
  60. package/src/hooks/useToast.ts +17 -0
  61. package/{dist/hooks/useUser.d.ts → src/hooks/useUser.ts} +13 -9
  62. package/src/index.ts +33 -0
  63. package/src/layouts/DefaultLayout.tsx +58 -0
  64. package/src/manifest.json +5 -0
  65. package/src/styles.css +43 -0
  66. package/src/types/ai-coach.ts +25 -0
  67. package/src/types/bookmarks.ts +20 -0
  68. package/src/types/bundle.ts +119 -0
  69. package/src/types/common.ts +24 -0
  70. package/src/types/course.ts +135 -0
  71. package/src/types/enrollment.ts +35 -0
  72. package/{dist/types/index.d.ts → src/types/index.ts} +0 -1
  73. package/src/types/lesson.ts +106 -0
  74. package/src/types/manual-review.ts +116 -0
  75. package/src/types/messaging.ts +109 -0
  76. package/src/types/notification.ts +30 -0
  77. package/src/types/payment.ts +40 -0
  78. package/src/types/progress.ts +19 -0
  79. package/src/types/rating.ts +20 -0
  80. package/src/types/search.ts +31 -0
  81. package/src/types/user.ts +16 -0
  82. package/src/utils/formatters.ts +74 -0
  83. package/src/utils/index.ts +8 -0
  84. package/dist/components/atoms/Avatar.d.ts +0 -9
  85. package/dist/components/atoms/Avatar.d.ts.map +0 -1
  86. package/dist/components/atoms/Badge.d.ts +0 -10
  87. package/dist/components/atoms/Badge.d.ts.map +0 -1
  88. package/dist/components/atoms/Button.d.ts +0 -11
  89. package/dist/components/atoms/Button.d.ts.map +0 -1
  90. package/dist/components/atoms/Card.d.ts +0 -11
  91. package/dist/components/atoms/Card.d.ts.map +0 -1
  92. package/dist/components/atoms/Input.d.ts +0 -7
  93. package/dist/components/atoms/Input.d.ts.map +0 -1
  94. package/dist/components/atoms/ProgressBar.d.ts +0 -11
  95. package/dist/components/atoms/ProgressBar.d.ts.map +0 -1
  96. package/dist/components/atoms/Tabs.d.ts +0 -16
  97. package/dist/components/atoms/Tabs.d.ts.map +0 -1
  98. package/dist/components/atoms/index.cjs +0 -318
  99. package/dist/components/atoms/index.d.ts.map +0 -1
  100. package/dist/components/atoms/index.js +0 -288
  101. package/dist/components/index.cjs +0 -1275
  102. package/dist/components/index.d.ts.map +0 -1
  103. package/dist/components/index.js +0 -1245
  104. package/dist/components/molecules/CourseCard.d.ts +0 -25
  105. package/dist/components/molecules/CourseCard.d.ts.map +0 -1
  106. package/dist/components/molecules/EmptyState.d.ts +0 -10
  107. package/dist/components/molecules/EmptyState.d.ts.map +0 -1
  108. package/dist/components/molecules/LoadingSpinner.d.ts +0 -7
  109. package/dist/components/molecules/LoadingSpinner.d.ts.map +0 -1
  110. package/dist/components/molecules/PageHeader.d.ts +0 -8
  111. package/dist/components/molecules/PageHeader.d.ts.map +0 -1
  112. package/dist/components/molecules/Pagination.d.ts +0 -13
  113. package/dist/components/molecules/Pagination.d.ts.map +0 -1
  114. package/dist/components/molecules/SearchInput.d.ts +0 -8
  115. package/dist/components/molecules/SearchInput.d.ts.map +0 -1
  116. package/dist/components/molecules/index.cjs +0 -334
  117. package/dist/components/molecules/index.d.ts.map +0 -1
  118. package/dist/components/molecules/index.js +0 -311
  119. package/dist/components/organisms/CourseSidebar.d.ts +0 -37
  120. package/dist/components/organisms/CourseSidebar.d.ts.map +0 -1
  121. package/dist/components/organisms/LearnerNavbar.d.ts +0 -8
  122. package/dist/components/organisms/LearnerNavbar.d.ts.map +0 -1
  123. package/dist/components/organisms/LearnerSidebar.d.ts +0 -16
  124. package/dist/components/organisms/LearnerSidebar.d.ts.map +0 -1
  125. package/dist/components/organisms/LessonBookmarks.d.ts +0 -8
  126. package/dist/components/organisms/LessonBookmarks.d.ts.map +0 -1
  127. package/dist/components/organisms/LessonNotes.d.ts +0 -8
  128. package/dist/components/organisms/LessonNotes.d.ts.map +0 -1
  129. package/dist/components/organisms/index.cjs +0 -855
  130. package/dist/components/organisms/index.d.ts.map +0 -1
  131. package/dist/components/organisms/index.js +0 -825
  132. package/dist/components/pages/BundleDetailPage.d.ts +0 -3
  133. package/dist/components/pages/BundleDetailPage.d.ts.map +0 -1
  134. package/dist/components/pages/CatalogBundlesPage.d.ts +0 -3
  135. package/dist/components/pages/CatalogBundlesPage.d.ts.map +0 -1
  136. package/dist/components/pages/CatalogCoursesPage.d.ts +0 -3
  137. package/dist/components/pages/CatalogCoursesPage.d.ts.map +0 -1
  138. package/dist/components/pages/CourseDetailPage.d.ts +0 -3
  139. package/dist/components/pages/CourseDetailPage.d.ts.map +0 -1
  140. package/dist/components/pages/CoursePlayerPage.d.ts +0 -8
  141. package/dist/components/pages/CoursePlayerPage.d.ts.map +0 -1
  142. package/dist/components/pages/CreatorProfilePage.d.ts +0 -3
  143. package/dist/components/pages/CreatorProfilePage.d.ts.map +0 -1
  144. package/dist/components/pages/LearnerSettingsPage.d.ts +0 -3
  145. package/dist/components/pages/LearnerSettingsPage.d.ts.map +0 -1
  146. package/dist/components/pages/ManualReviewDetailPage.d.ts +0 -3
  147. package/dist/components/pages/ManualReviewDetailPage.d.ts.map +0 -1
  148. package/dist/components/pages/ManualReviewPage.d.ts +0 -3
  149. package/dist/components/pages/ManualReviewPage.d.ts.map +0 -1
  150. package/dist/components/pages/MessagesPage.d.ts +0 -3
  151. package/dist/components/pages/MessagesPage.d.ts.map +0 -1
  152. package/dist/components/pages/MyLearningPage.d.ts +0 -3
  153. package/dist/components/pages/MyLearningPage.d.ts.map +0 -1
  154. package/dist/components/pages/PaymentCancelPage.d.ts +0 -3
  155. package/dist/components/pages/PaymentCancelPage.d.ts.map +0 -1
  156. package/dist/components/pages/PaymentSuccessPage.d.ts +0 -3
  157. package/dist/components/pages/PaymentSuccessPage.d.ts.map +0 -1
  158. package/dist/components/pages/index.cjs +0 -3306
  159. package/dist/components/pages/index.d.ts.map +0 -1
  160. package/dist/components/pages/index.js +0 -3315
  161. package/dist/components/utils.d.ts +0 -3
  162. package/dist/components/utils.d.ts.map +0 -1
  163. package/dist/contracts/components.contract.d.ts +0 -87
  164. package/dist/contracts/components.contract.d.ts.map +0 -1
  165. package/dist/contracts/index.cjs +0 -52
  166. package/dist/contracts/index.d.ts.map +0 -1
  167. package/dist/contracts/index.js +0 -29
  168. package/dist/contracts/layout.contract.d.ts +0 -35
  169. package/dist/contracts/layout.contract.d.ts.map +0 -1
  170. package/dist/contracts/pages.contract.d.ts +0 -192
  171. package/dist/contracts/pages.contract.d.ts.map +0 -1
  172. package/dist/contracts/template.contract.d.ts +0 -49
  173. package/dist/contracts/template.contract.d.ts.map +0 -1
  174. package/dist/hooks/index.cjs +0 -165
  175. package/dist/hooks/index.d.ts.map +0 -1
  176. package/dist/hooks/index.js +0 -142
  177. package/dist/hooks/sdk-context.d.ts +0 -125
  178. package/dist/hooks/sdk-context.d.ts.map +0 -1
  179. package/dist/hooks/useAiCoach.d.ts +0 -32
  180. package/dist/hooks/useAiCoach.d.ts.map +0 -1
  181. package/dist/hooks/useBookmarks.d.ts +0 -31
  182. package/dist/hooks/useBookmarks.d.ts.map +0 -1
  183. package/dist/hooks/useCourseSearch.d.ts.map +0 -1
  184. package/dist/hooks/useDebounce.d.ts.map +0 -1
  185. package/dist/hooks/useMyBundles.d.ts.map +0 -1
  186. package/dist/hooks/useMyCourses.d.ts.map +0 -1
  187. package/dist/hooks/useNotes.d.ts +0 -31
  188. package/dist/hooks/useNotes.d.ts.map +0 -1
  189. package/dist/hooks/useNotifications.d.ts +0 -19
  190. package/dist/hooks/useNotifications.d.ts.map +0 -1
  191. package/dist/hooks/useTheme.d.ts.map +0 -1
  192. package/dist/hooks/useToast.d.ts +0 -17
  193. package/dist/hooks/useToast.d.ts.map +0 -1
  194. package/dist/hooks/useUser.d.ts.map +0 -1
  195. package/dist/index.cjs +0 -630
  196. package/dist/index.d.ts +0 -17
  197. package/dist/index.d.ts.map +0 -1
  198. package/dist/index.js +0 -600
  199. package/dist/layouts/DefaultLayout.d.ts +0 -9
  200. package/dist/layouts/DefaultLayout.d.ts.map +0 -1
  201. package/dist/types/ai-coach.d.ts +0 -22
  202. package/dist/types/ai-coach.d.ts.map +0 -1
  203. package/dist/types/bookmarks.d.ts +0 -19
  204. package/dist/types/bookmarks.d.ts.map +0 -1
  205. package/dist/types/bundle.d.ts +0 -114
  206. package/dist/types/bundle.d.ts.map +0 -1
  207. package/dist/types/common.d.ts +0 -23
  208. package/dist/types/common.d.ts.map +0 -1
  209. package/dist/types/course.d.ts +0 -127
  210. package/dist/types/course.d.ts.map +0 -1
  211. package/dist/types/enrollment.d.ts +0 -34
  212. package/dist/types/enrollment.d.ts.map +0 -1
  213. package/dist/types/index.cjs +0 -18
  214. package/dist/types/index.d.ts.map +0 -1
  215. package/dist/types/index.js +0 -0
  216. package/dist/types/lesson.d.ts +0 -105
  217. package/dist/types/lesson.d.ts.map +0 -1
  218. package/dist/types/manual-review.d.ts +0 -123
  219. package/dist/types/manual-review.d.ts.map +0 -1
  220. package/dist/types/messaging.d.ts +0 -101
  221. package/dist/types/messaging.d.ts.map +0 -1
  222. package/dist/types/notification.d.ts +0 -28
  223. package/dist/types/notification.d.ts.map +0 -1
  224. package/dist/types/payment.d.ts +0 -38
  225. package/dist/types/payment.d.ts.map +0 -1
  226. package/dist/types/progress.d.ts +0 -18
  227. package/dist/types/progress.d.ts.map +0 -1
  228. package/dist/types/rating.d.ts +0 -20
  229. package/dist/types/rating.d.ts.map +0 -1
  230. package/dist/types/search.d.ts +0 -28
  231. package/dist/types/search.d.ts.map +0 -1
  232. package/dist/types/user.d.ts +0 -15
  233. package/dist/types/user.d.ts.map +0 -1
  234. package/dist/utils/formatters.d.ts +0 -25
  235. package/dist/utils/formatters.d.ts.map +0 -1
  236. package/dist/utils/index.cjs +0 -80
  237. package/dist/utils/index.d.ts +0 -2
  238. package/dist/utils/index.d.ts.map +0 -1
  239. package/dist/utils/index.js +0 -57
@@ -1,311 +0,0 @@
1
- // src/components/molecules/CourseCard.tsx
2
- import { useState } from "react";
3
- import { BookOpen, Clock, Grid2X2 } from "lucide-react";
4
-
5
- // src/components/utils.ts
6
- import { clsx } from "clsx";
7
- import { twMerge } from "tailwind-merge";
8
- function cn(...inputs) {
9
- return twMerge(clsx(inputs));
10
- }
11
-
12
- // src/components/molecules/CourseCard.tsx
13
- import { jsx, jsxs } from "react/jsx-runtime";
14
- function CourseCard({
15
- id,
16
- title,
17
- thumbnail,
18
- thumbnails,
19
- totalLessons,
20
- progress,
21
- status,
22
- isFree,
23
- price = 0,
24
- currency = "USD",
25
- description,
26
- showPrice = true,
27
- showProgress = true,
28
- category,
29
- duration,
30
- instructorName,
31
- instructorAvatar,
32
- originalPrice,
33
- isBundle = false,
34
- onClick,
35
- className
36
- }) {
37
- const [imageError, setImageError] = useState(false);
38
- const clampedProgress = Math.min(Math.max(progress, 0), 100);
39
- const stripHtml = (html) => {
40
- if (typeof document === "undefined") return html;
41
- const tmp = document.createElement("div");
42
- tmp.innerHTML = html;
43
- return tmp.textContent || tmp.innerText || "";
44
- };
45
- const displayCategory = category || "Design";
46
- const displayDuration = duration || "3 Month";
47
- const displayInstructorName = instructorName || (description ? stripHtml(description).slice(0, 15) : "Instructor");
48
- return /* @__PURE__ */ jsxs(
49
- "div",
50
- {
51
- className: cn(
52
- "group overflow-hidden rounded-2xl border border-gray-100 bg-white shadow-sm hover:shadow-lg transition-all duration-300 hover:-translate-y-1 h-full flex flex-col min-w-0 w-full cursor-pointer",
53
- className
54
- ),
55
- onClick,
56
- children: [
57
- /* @__PURE__ */ jsxs("div", { className: "relative h-[238.66px] w-full overflow-hidden mx-auto px-3 pt-3", children: [
58
- /* @__PURE__ */ jsx("div", { className: "relative w-full h-full rounded-xl overflow-hidden bg-gray-100", children: isBundle && thumbnails && thumbnails.length > 0 && !imageError ? /* @__PURE__ */ jsxs("div", { className: "relative w-full h-full flex", children: [
59
- /* @__PURE__ */ jsx("div", { className: "relative h-full w-1/2", children: /* @__PURE__ */ jsx(
60
- "img",
61
- {
62
- src: thumbnails[0],
63
- alt: `${title} - image 1`,
64
- className: "w-full h-full object-cover transition-transform duration-300 group-hover:scale-110",
65
- onError: () => setImageError(true)
66
- }
67
- ) }),
68
- /* @__PURE__ */ jsxs("div", { className: "flex flex-col w-1/2 h-full", children: [
69
- thumbnails[1] && /* @__PURE__ */ jsx("div", { className: cn("relative w-full overflow-hidden", thumbnails.length > 2 ? "h-1/2" : "h-full"), children: /* @__PURE__ */ jsx(
70
- "img",
71
- {
72
- src: thumbnails[1],
73
- alt: `${title} - image 2`,
74
- className: "w-full h-full object-cover transition-transform duration-300 group-hover:scale-110",
75
- onError: () => setImageError(true)
76
- }
77
- ) }),
78
- thumbnails.length > 2 && thumbnails[2] && /* @__PURE__ */ jsx("div", { className: "relative w-full h-1/2 overflow-hidden", children: /* @__PURE__ */ jsx(
79
- "img",
80
- {
81
- src: thumbnails[2],
82
- alt: `${title} - image 3`,
83
- className: "w-full h-full object-cover transition-transform duration-300 group-hover:scale-110",
84
- onError: () => setImageError(true)
85
- }
86
- ) })
87
- ] })
88
- ] }) : thumbnail && !imageError ? /* @__PURE__ */ jsx(
89
- "img",
90
- {
91
- src: thumbnail,
92
- alt: title,
93
- className: "w-full h-full object-cover transition-transform duration-300 group-hover:scale-110",
94
- onError: () => setImageError(true)
95
- }
96
- ) : /* @__PURE__ */ jsx("div", { className: "w-full h-full flex items-center justify-center bg-gray-200", children: /* @__PURE__ */ jsx(BookOpen, { className: "w-12 h-12 text-gray-400" }) }) }),
97
- status && /* @__PURE__ */ jsx("div", { className: "absolute right-6 top-5", children: /* @__PURE__ */ jsx(
98
- "span",
99
- {
100
- className: `rounded-full px-3 py-1.5 text-xs font-medium text-white shadow-md ${status === "completed" ? "bg-green-500" : "bg-[rgb(var(--accent-primary))]"}`,
101
- children: status
102
- }
103
- ) })
104
- ] }),
105
- /* @__PURE__ */ jsxs("div", { className: "p-5 space-y-3 flex-1 flex flex-col min-w-0", children: [
106
- (displayCategory || displayDuration) && /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between text-xs text-gray-500", children: [
107
- displayCategory && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1.5", children: [
108
- /* @__PURE__ */ jsx(Grid2X2, { className: "w-3.5 h-3.5 text-gray-400" }),
109
- /* @__PURE__ */ jsx("span", { children: displayCategory })
110
- ] }),
111
- displayDuration && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1.5", children: [
112
- /* @__PURE__ */ jsx(Clock, { className: "w-3.5 h-3.5 text-gray-400" }),
113
- /* @__PURE__ */ jsx("span", { children: displayDuration })
114
- ] })
115
- ] }),
116
- /* @__PURE__ */ jsx("h3", { className: "text-base font-bold text-gray-900 line-clamp-2 leading-snug", children: title }),
117
- description && /* @__PURE__ */ jsx("p", { className: "text-sm text-gray-500 line-clamp-3 leading-relaxed", children: stripHtml(description) }),
118
- /* @__PURE__ */ jsx("div", { className: "flex-1" }),
119
- showProgress && /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
120
- /* @__PURE__ */ jsx("div", { className: "h-2 overflow-hidden rounded-full bg-gray-100", children: /* @__PURE__ */ jsx(
121
- "div",
122
- {
123
- className: "h-full rounded-full bg-[rgb(var(--accent-primary))] transition-all duration-300",
124
- style: { width: `${clampedProgress}%` }
125
- }
126
- ) }),
127
- /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between text-xs", children: [
128
- /* @__PURE__ */ jsx("span", { className: "text-gray-400" }),
129
- /* @__PURE__ */ jsxs("span", { className: "text-gray-500", children: [
130
- isBundle ? "Course" : "Lesson",
131
- " ",
132
- Math.ceil(clampedProgress / 100 * totalLessons),
133
- " of ",
134
- totalLessons
135
- ] })
136
- ] })
137
- ] }),
138
- showPrice && /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between pt-3 border-t border-gray-100", children: [
139
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
140
- instructorAvatar ? /* @__PURE__ */ jsx("div", { className: "w-7 h-7 rounded-full overflow-hidden flex-shrink-0", children: /* @__PURE__ */ jsx("img", { src: instructorAvatar, alt: displayInstructorName, className: "w-full h-full object-cover" }) }) : /* @__PURE__ */ jsx("div", { className: "w-7 h-7 rounded-full bg-gray-200 flex items-center justify-center flex-shrink-0", children: /* @__PURE__ */ jsx("span", { className: "text-[10px] font-semibold text-gray-500", children: displayInstructorName.charAt(0).toUpperCase() }) }),
141
- /* @__PURE__ */ jsx("span", { className: "text-sm text-gray-600 font-medium truncate max-w-[80px]", children: displayInstructorName })
142
- ] }),
143
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
144
- !isFree && originalPrice && originalPrice > price && /* @__PURE__ */ jsxs("span", { className: "text-sm text-gray-400 line-through", children: [
145
- "$",
146
- originalPrice
147
- ] }),
148
- /* @__PURE__ */ jsx("span", { className: "text-lg font-bold text-[rgb(var(--accent-primary))]", children: isFree ? "Free" : `$${price}` })
149
- ] })
150
- ] })
151
- ] })
152
- ]
153
- }
154
- );
155
- }
156
-
157
- // src/components/molecules/Pagination.tsx
158
- import { ChevronLeft, ChevronRight } from "lucide-react";
159
- import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
160
- function Pagination({
161
- currentPage,
162
- totalPages,
163
- total,
164
- pageSize,
165
- hasNextPage,
166
- hasPreviousPage,
167
- onPageChange,
168
- maxVisiblePages = 5,
169
- className
170
- }) {
171
- const renderPageNumbers = () => {
172
- const pages = [];
173
- let startPage = Math.max(1, currentPage - Math.floor(maxVisiblePages / 2));
174
- let endPage = Math.min(totalPages, startPage + maxVisiblePages - 1);
175
- if (endPage - startPage < maxVisiblePages - 1) {
176
- startPage = Math.max(1, endPage - maxVisiblePages + 1);
177
- }
178
- for (let i = startPage; i <= endPage; i++) {
179
- pages.push(
180
- /* @__PURE__ */ jsx2(
181
- "button",
182
- {
183
- onClick: () => onPageChange(i),
184
- className: cn(
185
- "px-3 py-1 rounded cursor-pointer transition-colors",
186
- i === currentPage ? "bg-theme-accent-primary text-white" : "text-theme-text-primary border border-theme-border-primary hover:bg-theme-bg-tertiary"
187
- ),
188
- children: i
189
- },
190
- i
191
- )
192
- );
193
- }
194
- return pages;
195
- };
196
- return /* @__PURE__ */ jsxs2("div", { className: cn("flex items-center justify-between border-t border-theme-border-primary pt-4", className), children: [
197
- /* @__PURE__ */ jsxs2("div", { className: "text-sm text-theme-text-secondary", children: [
198
- "Showing ",
199
- (currentPage - 1) * pageSize + 1,
200
- " to ",
201
- Math.min(currentPage * pageSize, total),
202
- " of ",
203
- total,
204
- " results"
205
- ] }),
206
- /* @__PURE__ */ jsxs2("div", { className: "flex items-center gap-2", children: [
207
- /* @__PURE__ */ jsx2(
208
- "button",
209
- {
210
- onClick: () => onPageChange(currentPage - 1),
211
- disabled: !hasPreviousPage,
212
- className: "p-2 rounded border border-theme-border-primary hover:bg-theme-bg-tertiary disabled:opacity-50 disabled:cursor-not-allowed cursor-pointer transition-colors",
213
- "aria-label": "Previous page",
214
- children: /* @__PURE__ */ jsx2(ChevronLeft, { className: "h-4 w-4" })
215
- }
216
- ),
217
- renderPageNumbers(),
218
- /* @__PURE__ */ jsx2(
219
- "button",
220
- {
221
- onClick: () => onPageChange(currentPage + 1),
222
- disabled: !hasNextPage,
223
- className: "p-2 rounded border border-theme-border-primary hover:bg-theme-bg-tertiary disabled:opacity-50 disabled:cursor-not-allowed cursor-pointer transition-colors",
224
- "aria-label": "Next page",
225
- children: /* @__PURE__ */ jsx2(ChevronRight, { className: "h-4 w-4" })
226
- }
227
- )
228
- ] })
229
- ] });
230
- }
231
-
232
- // src/components/molecules/PageHeader.tsx
233
- import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
234
- function PageHeader({ title, description, actions, className }) {
235
- return /* @__PURE__ */ jsxs3("div", { className: cn("flex flex-col sm:flex-row sm:items-center justify-between gap-4 mb-6", className), children: [
236
- /* @__PURE__ */ jsxs3("div", { children: [
237
- /* @__PURE__ */ jsx3("h1", { className: "text-2xl font-bold text-theme-text-primary", children: title }),
238
- description && /* @__PURE__ */ jsx3("p", { className: "text-sm text-theme-text-secondary mt-1", children: description })
239
- ] }),
240
- actions && /* @__PURE__ */ jsx3("div", { className: "flex items-center gap-2", children: actions })
241
- ] });
242
- }
243
-
244
- // src/components/molecules/SearchInput.tsx
245
- import { Search, X } from "lucide-react";
246
- import { jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
247
- function SearchInput({ value, onChange, placeholder = "Search...", className }) {
248
- return /* @__PURE__ */ jsxs4("div", { className: cn("relative", className), children: [
249
- /* @__PURE__ */ jsx4(Search, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-theme-text-muted" }),
250
- /* @__PURE__ */ jsx4(
251
- "input",
252
- {
253
- type: "text",
254
- value,
255
- onChange: (e) => onChange(e.target.value),
256
- placeholder,
257
- className: "w-full pl-10 pr-10 py-2 text-sm rounded-lg border border-theme-border-primary bg-theme-bg-primary text-theme-text-primary placeholder:text-[rgb(var(--text-muted))] focus:outline-none focus:border-theme-accent-primary transition-colors"
258
- }
259
- ),
260
- value && /* @__PURE__ */ jsx4(
261
- "button",
262
- {
263
- onClick: () => onChange(""),
264
- className: "absolute right-3 top-1/2 -translate-y-1/2 text-theme-text-muted hover:text-theme-text-primary cursor-pointer",
265
- "aria-label": "Clear search",
266
- children: /* @__PURE__ */ jsx4(X, { className: "h-4 w-4" })
267
- }
268
- )
269
- ] });
270
- }
271
-
272
- // src/components/molecules/EmptyState.tsx
273
- import { jsx as jsx5, jsxs as jsxs5 } from "react/jsx-runtime";
274
- function EmptyState({ icon, title, description, action, className }) {
275
- return /* @__PURE__ */ jsxs5("div", { className: cn("flex flex-col items-center justify-center py-12 text-center", className), children: [
276
- icon && /* @__PURE__ */ jsx5("div", { className: "mb-4 text-theme-text-muted", children: icon }),
277
- /* @__PURE__ */ jsx5("h3", { className: "text-lg font-semibold text-theme-text-primary", children: title }),
278
- description && /* @__PURE__ */ jsx5("p", { className: "mt-2 text-sm text-theme-text-secondary max-w-md", children: description }),
279
- action && /* @__PURE__ */ jsx5("div", { className: "mt-4", children: action })
280
- ] });
281
- }
282
-
283
- // src/components/molecules/LoadingSpinner.tsx
284
- import { jsx as jsx6, jsxs as jsxs6 } from "react/jsx-runtime";
285
- var sizeClasses = {
286
- sm: "h-4 w-4",
287
- md: "h-8 w-8",
288
- lg: "h-12 w-12"
289
- };
290
- function LoadingSpinner({ size = "md", className, text }) {
291
- return /* @__PURE__ */ jsxs6("div", { className: cn("flex flex-col items-center justify-center gap-3", className), children: [
292
- /* @__PURE__ */ jsx6(
293
- "div",
294
- {
295
- className: cn(
296
- "animate-spin rounded-full border-2 border-theme-bg-tertiary border-t-theme-accent-primary",
297
- sizeClasses[size]
298
- )
299
- }
300
- ),
301
- text && /* @__PURE__ */ jsx6("p", { className: "text-sm text-theme-text-secondary", children: text })
302
- ] });
303
- }
304
- export {
305
- CourseCard,
306
- EmptyState,
307
- LoadingSpinner,
308
- PageHeader,
309
- Pagination,
310
- SearchInput
311
- };
@@ -1,37 +0,0 @@
1
- export interface CourseSidebarLesson {
2
- id: string;
3
- title: string;
4
- duration?: string;
5
- completed?: boolean;
6
- locked?: boolean;
7
- availableAt?: string;
8
- hasPrerequisite?: boolean;
9
- lessonIcon?: string;
10
- type?: string;
11
- }
12
- export interface CourseSidebarModule {
13
- id: string;
14
- title: string;
15
- lessons: CourseSidebarLesson[];
16
- }
17
- export interface CourseSidebarProps {
18
- courseTitle: string;
19
- modules: CourseSidebarModule[];
20
- currentLessonId: string;
21
- expandedModules: Set<string>;
22
- completedCount: number;
23
- totalCount: number;
24
- onToggleModule: (moduleId: string) => void;
25
- onSelectLesson: (lessonId: string) => void;
26
- hideProgress?: boolean;
27
- hideSearch?: boolean;
28
- certificateEnabled?: boolean;
29
- isCompleted?: boolean;
30
- onDownloadCertificate?: () => void;
31
- isDownloadingCertificate?: boolean;
32
- onBack?: () => void;
33
- showBackButton?: boolean;
34
- className?: string;
35
- }
36
- export declare function CourseSidebar({ courseTitle, modules, currentLessonId, expandedModules, completedCount, totalCount, onToggleModule, onSelectLesson, hideProgress, hideSearch, certificateEnabled, isCompleted, onDownloadCertificate, isDownloadingCertificate, onBack, showBackButton, className, }: CourseSidebarProps): import("react/jsx-runtime").JSX.Element;
37
- //# sourceMappingURL=CourseSidebar.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"CourseSidebar.d.ts","sourceRoot":"","sources":["../../../src/components/organisms/CourseSidebar.tsx"],"names":[],"mappings":"AAQA,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,mBAAmB,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC/B,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,cAAc,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,qBAAqB,CAAC,EAAE,MAAM,IAAI,CAAC;IACnC,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAQD,wBAAgB,aAAa,CAAC,EAC5B,WAAW,EACX,OAAO,EACP,eAAe,EACf,eAAe,EACf,cAAc,EACd,UAAU,EACV,cAAc,EACd,cAAc,EACd,YAAoB,EACpB,UAAkB,EAClB,kBAA0B,EAC1B,WAAmB,EACnB,qBAAqB,EACrB,wBAAgC,EAChC,MAAM,EACN,cAAqB,EACrB,SAAS,GACV,EAAE,kBAAkB,2CA6MpB"}
@@ -1,8 +0,0 @@
1
- export interface LearnerNavbarProps {
2
- hideMenuButton?: boolean;
3
- onMenuClick?: () => void;
4
- onProfileClick?: () => void;
5
- onLogoClick?: () => void;
6
- }
7
- export declare function LearnerNavbar({ hideMenuButton, onMenuClick, onProfileClick, onLogoClick }: LearnerNavbarProps): import("react/jsx-runtime").JSX.Element;
8
- //# sourceMappingURL=LearnerNavbar.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"LearnerNavbar.d.ts","sourceRoot":"","sources":["../../../src/components/organisms/LearnerNavbar.tsx"],"names":[],"mappings":"AAOA,MAAM,WAAW,kBAAkB;IACjC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;CAC1B;AAED,wBAAgB,aAAa,CAAC,EAAE,cAAsB,EAAE,WAAW,EAAE,cAAc,EAAE,WAAW,EAAE,EAAE,kBAAkB,2CAkHrH"}
@@ -1,16 +0,0 @@
1
- export interface SidebarItem {
2
- label: string;
3
- href: string;
4
- icon: React.ElementType;
5
- }
6
- export interface LearnerSidebarProps {
7
- isOpen: boolean;
8
- isCollapsed: boolean;
9
- onClose: () => void;
10
- onToggle: () => void;
11
- currentPath: string;
12
- onNavigate: (href: string) => void;
13
- items?: SidebarItem[];
14
- }
15
- export declare function LearnerSidebar({ isOpen, isCollapsed, onClose, onToggle, currentPath, onNavigate, items, }: LearnerSidebarProps): import("react/jsx-runtime").JSX.Element;
16
- //# sourceMappingURL=LearnerSidebar.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"LearnerSidebar.d.ts","sourceRoot":"","sources":["../../../src/components/organisms/LearnerSidebar.tsx"],"names":[],"mappings":"AAOA,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,KAAK,CAAC,WAAW,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,KAAK,CAAC,EAAE,WAAW,EAAE,CAAC;CACvB;AAUD,wBAAgB,cAAc,CAAC,EAC7B,MAAM,EACN,WAAW,EACX,OAAO,EACP,QAAQ,EACR,WAAW,EACX,UAAU,EACV,KAAoB,GACrB,EAAE,mBAAmB,2CA4GrB"}
@@ -1,8 +0,0 @@
1
- export interface LessonBookmarksProps {
2
- activityId: string;
3
- currentVideoTime?: number;
4
- getLiveCurrentTime?: () => number;
5
- onTimestampClick?: (time: number) => void;
6
- }
7
- export declare function LessonBookmarks({ activityId, currentVideoTime, getLiveCurrentTime, onTimestampClick }: LessonBookmarksProps): import("react/jsx-runtime").JSX.Element;
8
- //# sourceMappingURL=LessonBookmarks.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"LessonBookmarks.d.ts","sourceRoot":"","sources":["../../../src/components/organisms/LessonBookmarks.tsx"],"names":[],"mappings":"AASA,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,MAAM,CAAC;IAClC,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC3C;AAUD,wBAAgB,eAAe,CAAC,EAAE,UAAU,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,EAAE,oBAAoB,2CAuG3H"}
@@ -1,8 +0,0 @@
1
- export interface LessonNotesProps {
2
- activityId: string;
3
- currentVideoTime?: number;
4
- getLiveCurrentTime?: () => number;
5
- onTimestampClick?: (time: number) => void;
6
- }
7
- export declare function LessonNotes({ activityId, currentVideoTime, getLiveCurrentTime, onTimestampClick }: LessonNotesProps): import("react/jsx-runtime").JSX.Element;
8
- //# sourceMappingURL=LessonNotes.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"LessonNotes.d.ts","sourceRoot":"","sources":["../../../src/components/organisms/LessonNotes.tsx"],"names":[],"mappings":"AAQA,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,MAAM,CAAC;IAClC,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC3C;AAYD,wBAAgB,WAAW,CAAC,EAAE,UAAU,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,EAAE,gBAAgB,2CA+HnH"}