@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,25 +0,0 @@
1
- export interface CourseCardProps {
2
- id: string;
3
- title: string;
4
- thumbnail?: string;
5
- thumbnails?: string[];
6
- totalLessons: number;
7
- progress: number;
8
- status?: 'in-progress' | 'completed';
9
- isFree: boolean;
10
- price?: number;
11
- currency?: string;
12
- description?: string;
13
- showPrice?: boolean;
14
- showProgress?: boolean;
15
- category?: string;
16
- duration?: string;
17
- instructorName?: string;
18
- instructorAvatar?: string;
19
- originalPrice?: number;
20
- isBundle?: boolean;
21
- onClick?: () => void;
22
- className?: string;
23
- }
24
- export declare function CourseCard({ id, title, thumbnail, thumbnails, totalLessons, progress, status, isFree, price, currency, description, showPrice, showProgress, category, duration, instructorName, instructorAvatar, originalPrice, isBundle, onClick, className, }: CourseCardProps): import("react/jsx-runtime").JSX.Element;
25
- //# sourceMappingURL=CourseCard.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"CourseCard.d.ts","sourceRoot":"","sources":["../../../src/components/molecules/CourseCard.tsx"],"names":[],"mappings":"AAKA,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,aAAa,GAAG,WAAW,CAAC;IACrC,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,UAAU,CAAC,EACzB,EAAE,EACF,KAAK,EACL,SAAS,EACT,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,MAAM,EACN,MAAM,EACN,KAAS,EACT,QAAgB,EAChB,WAAW,EACX,SAAgB,EAChB,YAAmB,EACnB,QAAQ,EACR,QAAQ,EACR,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,QAAgB,EAChB,OAAO,EACP,SAAS,GACV,EAAE,eAAe,2CAmKjB"}
@@ -1,10 +0,0 @@
1
- import type { ReactNode } from 'react';
2
- export interface EmptyStateProps {
3
- icon?: ReactNode;
4
- title: string;
5
- description?: string;
6
- action?: ReactNode;
7
- className?: string;
8
- }
9
- export declare function EmptyState({ icon, title, description, action, className }: EmptyStateProps): import("react/jsx-runtime").JSX.Element;
10
- //# sourceMappingURL=EmptyState.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"EmptyState.d.ts","sourceRoot":"","sources":["../../../src/components/molecules/EmptyState.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,UAAU,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,eAAe,2CAW1F"}
@@ -1,7 +0,0 @@
1
- export interface LoadingSpinnerProps {
2
- size?: 'sm' | 'md' | 'lg';
3
- className?: string;
4
- text?: string;
5
- }
6
- export declare function LoadingSpinner({ size, className, text }: LoadingSpinnerProps): import("react/jsx-runtime").JSX.Element;
7
- //# sourceMappingURL=LoadingSpinner.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"LoadingSpinner.d.ts","sourceRoot":"","sources":["../../../src/components/molecules/LoadingSpinner.tsx"],"names":[],"mappings":"AAEA,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAQD,wBAAgB,cAAc,CAAC,EAAE,IAAW,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,mBAAmB,2CAYnF"}
@@ -1,8 +0,0 @@
1
- export interface PageHeaderProps {
2
- title: string;
3
- description?: string;
4
- actions?: React.ReactNode;
5
- className?: string;
6
- }
7
- export declare function PageHeader({ title, description, actions, className }: PageHeaderProps): import("react/jsx-runtime").JSX.Element;
8
- //# sourceMappingURL=PageHeader.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"PageHeader.d.ts","sourceRoot":"","sources":["../../../src/components/molecules/PageHeader.tsx"],"names":[],"mappings":"AAEA,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,eAAe,2CAYrF"}
@@ -1,13 +0,0 @@
1
- export interface PaginationProps {
2
- currentPage: number;
3
- totalPages: number;
4
- total: number;
5
- pageSize: number;
6
- hasNextPage: boolean;
7
- hasPreviousPage: boolean;
8
- onPageChange: (page: number) => void;
9
- maxVisiblePages?: number;
10
- className?: string;
11
- }
12
- export declare function Pagination({ currentPage, totalPages, total, pageSize, hasNextPage, hasPreviousPage, onPageChange, maxVisiblePages, className, }: PaginationProps): import("react/jsx-runtime").JSX.Element;
13
- //# sourceMappingURL=Pagination.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Pagination.d.ts","sourceRoot":"","sources":["../../../src/components/molecules/Pagination.tsx"],"names":[],"mappings":"AAGA,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB,eAAe,EAAE,OAAO,CAAC;IACzB,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,UAAU,CAAC,EACzB,WAAW,EACX,UAAU,EACV,KAAK,EACL,QAAQ,EACR,WAAW,EACX,eAAe,EACf,YAAY,EACZ,eAAmB,EACnB,SAAS,GACV,EAAE,eAAe,2CAwDjB"}
@@ -1,8 +0,0 @@
1
- export interface SearchInputProps {
2
- value: string;
3
- onChange: (value: string) => void;
4
- placeholder?: string;
5
- className?: string;
6
- }
7
- export declare function SearchInput({ value, onChange, placeholder, className }: SearchInputProps): import("react/jsx-runtime").JSX.Element;
8
- //# sourceMappingURL=SearchInput.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SearchInput.d.ts","sourceRoot":"","sources":["../../../src/components/molecules/SearchInput.tsx"],"names":[],"mappings":"AAKA,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAyB,EAAE,SAAS,EAAE,EAAE,gBAAgB,2CAsBtG"}
@@ -1,334 +0,0 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
-
20
- // src/components/molecules/index.ts
21
- var molecules_exports = {};
22
- __export(molecules_exports, {
23
- CourseCard: () => CourseCard,
24
- EmptyState: () => EmptyState,
25
- LoadingSpinner: () => LoadingSpinner,
26
- PageHeader: () => PageHeader,
27
- Pagination: () => Pagination,
28
- SearchInput: () => SearchInput
29
- });
30
- module.exports = __toCommonJS(molecules_exports);
31
-
32
- // src/components/molecules/CourseCard.tsx
33
- var import_react = require("react");
34
- var import_lucide_react = require("lucide-react");
35
-
36
- // src/components/utils.ts
37
- var import_clsx = require("clsx");
38
- var import_tailwind_merge = require("tailwind-merge");
39
- function cn(...inputs) {
40
- return (0, import_tailwind_merge.twMerge)((0, import_clsx.clsx)(inputs));
41
- }
42
-
43
- // src/components/molecules/CourseCard.tsx
44
- var import_jsx_runtime = require("react/jsx-runtime");
45
- function CourseCard({
46
- id,
47
- title,
48
- thumbnail,
49
- thumbnails,
50
- totalLessons,
51
- progress,
52
- status,
53
- isFree,
54
- price = 0,
55
- currency = "USD",
56
- description,
57
- showPrice = true,
58
- showProgress = true,
59
- category,
60
- duration,
61
- instructorName,
62
- instructorAvatar,
63
- originalPrice,
64
- isBundle = false,
65
- onClick,
66
- className
67
- }) {
68
- const [imageError, setImageError] = (0, import_react.useState)(false);
69
- const clampedProgress = Math.min(Math.max(progress, 0), 100);
70
- const stripHtml = (html) => {
71
- if (typeof document === "undefined") return html;
72
- const tmp = document.createElement("div");
73
- tmp.innerHTML = html;
74
- return tmp.textContent || tmp.innerText || "";
75
- };
76
- const displayCategory = category || "Design";
77
- const displayDuration = duration || "3 Month";
78
- const displayInstructorName = instructorName || (description ? stripHtml(description).slice(0, 15) : "Instructor");
79
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
80
- "div",
81
- {
82
- className: cn(
83
- "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",
84
- className
85
- ),
86
- onClick,
87
- children: [
88
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "relative h-[238.66px] w-full overflow-hidden mx-auto px-3 pt-3", children: [
89
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "relative w-full h-full rounded-xl overflow-hidden bg-gray-100", children: isBundle && thumbnails && thumbnails.length > 0 && !imageError ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "relative w-full h-full flex", children: [
90
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "relative h-full w-1/2", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
91
- "img",
92
- {
93
- src: thumbnails[0],
94
- alt: `${title} - image 1`,
95
- className: "w-full h-full object-cover transition-transform duration-300 group-hover:scale-110",
96
- onError: () => setImageError(true)
97
- }
98
- ) }),
99
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex flex-col w-1/2 h-full", children: [
100
- thumbnails[1] && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: cn("relative w-full overflow-hidden", thumbnails.length > 2 ? "h-1/2" : "h-full"), children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
101
- "img",
102
- {
103
- src: thumbnails[1],
104
- alt: `${title} - image 2`,
105
- className: "w-full h-full object-cover transition-transform duration-300 group-hover:scale-110",
106
- onError: () => setImageError(true)
107
- }
108
- ) }),
109
- thumbnails.length > 2 && thumbnails[2] && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "relative w-full h-1/2 overflow-hidden", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
110
- "img",
111
- {
112
- src: thumbnails[2],
113
- alt: `${title} - image 3`,
114
- className: "w-full h-full object-cover transition-transform duration-300 group-hover:scale-110",
115
- onError: () => setImageError(true)
116
- }
117
- ) })
118
- ] })
119
- ] }) : thumbnail && !imageError ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
120
- "img",
121
- {
122
- src: thumbnail,
123
- alt: title,
124
- className: "w-full h-full object-cover transition-transform duration-300 group-hover:scale-110",
125
- onError: () => setImageError(true)
126
- }
127
- ) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "w-full h-full flex items-center justify-center bg-gray-200", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.BookOpen, { className: "w-12 h-12 text-gray-400" }) }) }),
128
- status && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "absolute right-6 top-5", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
129
- "span",
130
- {
131
- 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))]"}`,
132
- children: status
133
- }
134
- ) })
135
- ] }),
136
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "p-5 space-y-3 flex-1 flex flex-col min-w-0", children: [
137
- (displayCategory || displayDuration) && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center justify-between text-xs text-gray-500", children: [
138
- displayCategory && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center gap-1.5", children: [
139
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Grid2X2, { className: "w-3.5 h-3.5 text-gray-400" }),
140
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: displayCategory })
141
- ] }),
142
- displayDuration && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center gap-1.5", children: [
143
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Clock, { className: "w-3.5 h-3.5 text-gray-400" }),
144
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: displayDuration })
145
- ] })
146
- ] }),
147
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h3", { className: "text-base font-bold text-gray-900 line-clamp-2 leading-snug", children: title }),
148
- description && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-sm text-gray-500 line-clamp-3 leading-relaxed", children: stripHtml(description) }),
149
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "flex-1" }),
150
- showProgress && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "space-y-2", children: [
151
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "h-2 overflow-hidden rounded-full bg-gray-100", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
152
- "div",
153
- {
154
- className: "h-full rounded-full bg-[rgb(var(--accent-primary))] transition-all duration-300",
155
- style: { width: `${clampedProgress}%` }
156
- }
157
- ) }),
158
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center justify-between text-xs", children: [
159
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-gray-400" }),
160
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: "text-gray-500", children: [
161
- isBundle ? "Course" : "Lesson",
162
- " ",
163
- Math.ceil(clampedProgress / 100 * totalLessons),
164
- " of ",
165
- totalLessons
166
- ] })
167
- ] })
168
- ] }),
169
- showPrice && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center justify-between pt-3 border-t border-gray-100", children: [
170
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center gap-2", children: [
171
- instructorAvatar ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "w-7 h-7 rounded-full overflow-hidden flex-shrink-0", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("img", { src: instructorAvatar, alt: displayInstructorName, className: "w-full h-full object-cover" }) }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "w-7 h-7 rounded-full bg-gray-200 flex items-center justify-center flex-shrink-0", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-[10px] font-semibold text-gray-500", children: displayInstructorName.charAt(0).toUpperCase() }) }),
172
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-sm text-gray-600 font-medium truncate max-w-[80px]", children: displayInstructorName })
173
- ] }),
174
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center gap-2", children: [
175
- !isFree && originalPrice && originalPrice > price && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: "text-sm text-gray-400 line-through", children: [
176
- "$",
177
- originalPrice
178
- ] }),
179
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-lg font-bold text-[rgb(var(--accent-primary))]", children: isFree ? "Free" : `$${price}` })
180
- ] })
181
- ] })
182
- ] })
183
- ]
184
- }
185
- );
186
- }
187
-
188
- // src/components/molecules/Pagination.tsx
189
- var import_lucide_react2 = require("lucide-react");
190
- var import_jsx_runtime2 = require("react/jsx-runtime");
191
- function Pagination({
192
- currentPage,
193
- totalPages,
194
- total,
195
- pageSize,
196
- hasNextPage,
197
- hasPreviousPage,
198
- onPageChange,
199
- maxVisiblePages = 5,
200
- className
201
- }) {
202
- const renderPageNumbers = () => {
203
- const pages = [];
204
- let startPage = Math.max(1, currentPage - Math.floor(maxVisiblePages / 2));
205
- let endPage = Math.min(totalPages, startPage + maxVisiblePages - 1);
206
- if (endPage - startPage < maxVisiblePages - 1) {
207
- startPage = Math.max(1, endPage - maxVisiblePages + 1);
208
- }
209
- for (let i = startPage; i <= endPage; i++) {
210
- pages.push(
211
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
212
- "button",
213
- {
214
- onClick: () => onPageChange(i),
215
- className: cn(
216
- "px-3 py-1 rounded cursor-pointer transition-colors",
217
- i === currentPage ? "bg-theme-accent-primary text-white" : "text-theme-text-primary border border-theme-border-primary hover:bg-theme-bg-tertiary"
218
- ),
219
- children: i
220
- },
221
- i
222
- )
223
- );
224
- }
225
- return pages;
226
- };
227
- return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: cn("flex items-center justify-between border-t border-theme-border-primary pt-4", className), children: [
228
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "text-sm text-theme-text-secondary", children: [
229
- "Showing ",
230
- (currentPage - 1) * pageSize + 1,
231
- " to ",
232
- Math.min(currentPage * pageSize, total),
233
- " of ",
234
- total,
235
- " results"
236
- ] }),
237
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center gap-2", children: [
238
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
239
- "button",
240
- {
241
- onClick: () => onPageChange(currentPage - 1),
242
- disabled: !hasPreviousPage,
243
- 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",
244
- "aria-label": "Previous page",
245
- children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_lucide_react2.ChevronLeft, { className: "h-4 w-4" })
246
- }
247
- ),
248
- renderPageNumbers(),
249
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
250
- "button",
251
- {
252
- onClick: () => onPageChange(currentPage + 1),
253
- disabled: !hasNextPage,
254
- 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",
255
- "aria-label": "Next page",
256
- children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_lucide_react2.ChevronRight, { className: "h-4 w-4" })
257
- }
258
- )
259
- ] })
260
- ] });
261
- }
262
-
263
- // src/components/molecules/PageHeader.tsx
264
- var import_jsx_runtime3 = require("react/jsx-runtime");
265
- function PageHeader({ title, description, actions, className }) {
266
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: cn("flex flex-col sm:flex-row sm:items-center justify-between gap-4 mb-6", className), children: [
267
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { children: [
268
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("h1", { className: "text-2xl font-bold text-theme-text-primary", children: title }),
269
- description && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("p", { className: "text-sm text-theme-text-secondary mt-1", children: description })
270
- ] }),
271
- actions && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "flex items-center gap-2", children: actions })
272
- ] });
273
- }
274
-
275
- // src/components/molecules/SearchInput.tsx
276
- var import_lucide_react3 = require("lucide-react");
277
- var import_jsx_runtime4 = require("react/jsx-runtime");
278
- function SearchInput({ value, onChange, placeholder = "Search...", className }) {
279
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: cn("relative", className), children: [
280
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_lucide_react3.Search, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-theme-text-muted" }),
281
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
282
- "input",
283
- {
284
- type: "text",
285
- value,
286
- onChange: (e) => onChange(e.target.value),
287
- placeholder,
288
- 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"
289
- }
290
- ),
291
- value && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
292
- "button",
293
- {
294
- onClick: () => onChange(""),
295
- className: "absolute right-3 top-1/2 -translate-y-1/2 text-theme-text-muted hover:text-theme-text-primary cursor-pointer",
296
- "aria-label": "Clear search",
297
- children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_lucide_react3.X, { className: "h-4 w-4" })
298
- }
299
- )
300
- ] });
301
- }
302
-
303
- // src/components/molecules/EmptyState.tsx
304
- var import_jsx_runtime5 = require("react/jsx-runtime");
305
- function EmptyState({ icon, title, description, action, className }) {
306
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: cn("flex flex-col items-center justify-center py-12 text-center", className), children: [
307
- icon && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "mb-4 text-theme-text-muted", children: icon }),
308
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("h3", { className: "text-lg font-semibold text-theme-text-primary", children: title }),
309
- description && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "mt-2 text-sm text-theme-text-secondary max-w-md", children: description }),
310
- action && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "mt-4", children: action })
311
- ] });
312
- }
313
-
314
- // src/components/molecules/LoadingSpinner.tsx
315
- var import_jsx_runtime6 = require("react/jsx-runtime");
316
- var sizeClasses = {
317
- sm: "h-4 w-4",
318
- md: "h-8 w-8",
319
- lg: "h-12 w-12"
320
- };
321
- function LoadingSpinner({ size = "md", className, text }) {
322
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: cn("flex flex-col items-center justify-center gap-3", className), children: [
323
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
324
- "div",
325
- {
326
- className: cn(
327
- "animate-spin rounded-full border-2 border-theme-bg-tertiary border-t-theme-accent-primary",
328
- sizeClasses[size]
329
- )
330
- }
331
- ),
332
- text && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "text-sm text-theme-text-secondary", children: text })
333
- ] });
334
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/molecules/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,YAAY,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC"}