@hydralms/components 0.1.3 → 0.3.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 (344) hide show
  1. package/dist/StudentProfile-BVfZMbnV.cjs +1 -0
  2. package/dist/StudentProfile-DeMxdrL3.js +3275 -0
  3. package/dist/assessment-toolbar/assessment-toolbar.d.ts +1 -1
  4. package/dist/assessment-toolbar/index.d.ts +5 -1
  5. package/dist/assessment-toolbar/question-header-bar.d.ts +2 -0
  6. package/dist/assessment-toolbar/question-materials-drawer.d.ts +2 -0
  7. package/dist/assessment-toolbar/question-navigator.d.ts +1 -1
  8. package/dist/assessment-toolbar/timer-display.d.ts +1 -1
  9. package/dist/assessment-toolbar/types.d.ts +52 -4
  10. package/dist/assessment-toolbar/use-countdown.d.ts +43 -0
  11. package/dist/common/index.d.ts +3 -1
  12. package/dist/common/pagination.d.ts +26 -0
  13. package/dist/common/stepper.d.ts +6 -0
  14. package/dist/common/types.d.ts +38 -0
  15. package/dist/components.css +1 -1
  16. package/dist/content/attachment-list.d.ts +6 -0
  17. package/dist/content/audio-player.d.ts +22 -0
  18. package/dist/content/code-block.d.ts +30 -0
  19. package/dist/content/content-block.d.ts +1 -1
  20. package/dist/content/embed-block.d.ts +28 -0
  21. package/dist/content/index.d.ts +8 -1
  22. package/dist/content/types.d.ts +63 -0
  23. package/dist/curriculum/course-card.d.ts +51 -0
  24. package/dist/curriculum/curriculum-item.d.ts +1 -1
  25. package/dist/curriculum/index.d.ts +2 -0
  26. package/dist/curriculum/types.d.ts +2 -2
  27. package/dist/index.cjs +1 -1
  28. package/dist/index.d.ts +1 -0
  29. package/dist/index.js +597 -308
  30. package/dist/license/HydraContext.d.ts +16 -0
  31. package/dist/license/ProBadge.d.ts +6 -0
  32. package/dist/license/index.d.ts +7 -0
  33. package/dist/license/tiers.d.ts +3 -0
  34. package/dist/license/useHydraLicense.d.ts +6 -0
  35. package/dist/license/validate.d.ts +13 -0
  36. package/dist/license/withProGate.d.ts +6 -0
  37. package/dist/modules/AssignmentModule/AssignmentModule.d.ts +5 -0
  38. package/dist/modules/AssignmentModule/types.d.ts +69 -0
  39. package/dist/modules/CertificateModule/CertificateModule.d.ts +5 -0
  40. package/dist/modules/CertificateModule/types.d.ts +51 -0
  41. package/dist/modules/CourseCatalogModule/CourseCatalogModule.d.ts +5 -0
  42. package/dist/modules/CourseCatalogModule/types.d.ts +43 -0
  43. package/dist/modules/CoursePlayer/CoursePlayer.d.ts +4 -1
  44. package/dist/modules/DiscussionModule/DiscussionModule.d.ts +5 -0
  45. package/dist/modules/DiscussionModule/types.d.ts +47 -0
  46. package/dist/modules/ExamModule/ExamModule.d.ts +5 -0
  47. package/dist/modules/ExamModule/types.d.ts +55 -0
  48. package/dist/modules/FlashcardLab/FlashcardLab.d.ts +4 -1
  49. package/dist/modules/FlashcardLab/types.d.ts +2 -0
  50. package/dist/modules/GradeCenterModule/GradeCenterModule.d.ts +5 -0
  51. package/dist/modules/GradeCenterModule/types.d.ts +56 -0
  52. package/dist/modules/QuizModule/QuizModule.d.ts +4 -1
  53. package/dist/modules/QuizModule/types.d.ts +10 -14
  54. package/dist/modules/StudentDashboardModule/StudentDashboardModule.d.ts +5 -0
  55. package/dist/modules/StudentDashboardModule/types.d.ts +54 -0
  56. package/dist/modules/StudentProfileModule/StudentProfileModule.d.ts +5 -0
  57. package/dist/modules/StudentProfileModule/types.d.ts +43 -0
  58. package/dist/modules/SurveyModule/SurveyModule.d.ts +5 -0
  59. package/dist/modules/SurveyModule/types.d.ts +51 -0
  60. package/dist/modules/_shared/assessment-intro.d.ts +16 -0
  61. package/dist/modules/_shared/assessment-results.d.ts +23 -0
  62. package/dist/modules/_shared/types.d.ts +10 -0
  63. package/dist/modules/_shared/use-timer.d.ts +9 -0
  64. package/dist/modules/index.d.ts +18 -0
  65. package/dist/modules.cjs +1 -0
  66. package/dist/modules.js +1834 -0
  67. package/dist/progress/achievement-badge.d.ts +6 -0
  68. package/dist/progress/activity-timeline.d.ts +6 -0
  69. package/dist/progress/index.d.ts +4 -1
  70. package/dist/progress/stat-card.d.ts +1 -1
  71. package/dist/progress/streak-badge.d.ts +6 -0
  72. package/dist/progress/types.d.ts +99 -0
  73. package/dist/provider/HydraProvider.d.ts +5 -1
  74. package/dist/questions/choice.d.ts +1 -1
  75. package/dist/questions/confidence-indicator.d.ts +37 -0
  76. package/dist/questions/essay.d.ts +2 -2
  77. package/dist/questions/fill-in-the-blank.d.ts +1 -1
  78. package/dist/questions/hotspot.d.ts +21 -0
  79. package/dist/questions/index.d.ts +11 -1
  80. package/dist/questions/inline-choice.d.ts +21 -0
  81. package/dist/questions/matching.d.ts +22 -0
  82. package/dist/questions/multiple-choice.d.ts +1 -1
  83. package/dist/questions/numeric.d.ts +11 -0
  84. package/dist/questions/ordering.d.ts +12 -0
  85. package/dist/questions/question-renderer.d.ts +1 -1
  86. package/dist/questions/scenario.d.ts +23 -0
  87. package/dist/questions/scoring.d.ts +22 -0
  88. package/dist/questions/spreadsheet.d.ts +29 -0
  89. package/dist/questions/true-false.d.ts +1 -1
  90. package/dist/questions/types.d.ts +106 -1
  91. package/dist/questions/use-drag-reorder.d.ts +17 -0
  92. package/dist/sections/AnnouncementFeed/AnnouncementFeed.d.ts +1 -1
  93. package/dist/sections/AnnouncementFeed/types.d.ts +15 -1
  94. package/dist/sections/AssessmentReview/AssessmentReview.d.ts +1 -1
  95. package/dist/sections/AssessmentReview/types.d.ts +6 -0
  96. package/dist/sections/AssignmentSubmission/AssignmentSubmission.d.ts +1 -1
  97. package/dist/sections/AssignmentSubmission/types.d.ts +6 -0
  98. package/dist/sections/CertificateViewer/CertificateViewer.d.ts +1 -1
  99. package/dist/sections/CertificateViewer/certificate-variants.d.ts +42 -0
  100. package/dist/sections/CertificateViewer/types.d.ts +13 -5
  101. package/dist/sections/CourseCatalog/CourseCatalog.d.ts +2 -0
  102. package/dist/sections/CourseCatalog/types.d.ts +80 -0
  103. package/dist/sections/CourseOutline/CourseOutline.d.ts +1 -1
  104. package/dist/sections/CourseOutline/types.d.ts +6 -0
  105. package/dist/sections/DiscussionThread/DiscussionThread.d.ts +1 -1
  106. package/dist/sections/DiscussionThread/types.d.ts +6 -0
  107. package/dist/sections/EnrollmentWizard/EnrollmentWizard.d.ts +2 -0
  108. package/dist/sections/EnrollmentWizard/types.d.ts +66 -0
  109. package/dist/sections/ExamSession/ExamSession.d.ts +1 -1
  110. package/dist/sections/ExamSession/types.d.ts +12 -1
  111. package/dist/sections/FlashcardStudySession/FlashcardStudySession.d.ts +1 -1
  112. package/dist/sections/FlashcardStudySession/types.d.ts +6 -0
  113. package/dist/sections/ForumBoard/ForumBoard.d.ts +8 -0
  114. package/dist/sections/ForumBoard/types.d.ts +78 -0
  115. package/dist/sections/GradebookTable/GradebookTable.d.ts +1 -1
  116. package/dist/sections/GradebookTable/types.d.ts +14 -0
  117. package/dist/sections/LecturePlayer/LecturePlayer.d.ts +1 -1
  118. package/dist/sections/LecturePlayer/types.d.ts +8 -0
  119. package/dist/sections/LessonPage/LessonPage.d.ts +1 -1
  120. package/dist/sections/LessonPage/types.d.ts +6 -0
  121. package/dist/sections/PracticeQuiz/PracticeQuiz.d.ts +1 -1
  122. package/dist/sections/PracticeQuiz/types.d.ts +6 -0
  123. package/dist/sections/ProgressDashboard/ProgressDashboard.d.ts +1 -1
  124. package/dist/sections/ProgressDashboard/types.d.ts +6 -0
  125. package/dist/sections/QuizSession/QuizSession.d.ts +1 -1
  126. package/dist/sections/QuizSession/types.d.ts +12 -1
  127. package/dist/sections/RequirementsChecklist/RequirementsChecklist.d.ts +8 -0
  128. package/dist/sections/RequirementsChecklist/types.d.ts +43 -0
  129. package/dist/sections/ResourceLibrary/ResourceLibrary.d.ts +1 -1
  130. package/dist/sections/ResourceLibrary/types.d.ts +15 -1
  131. package/dist/sections/RubricView/RubricView.d.ts +9 -0
  132. package/dist/sections/RubricView/types.d.ts +56 -0
  133. package/dist/sections/ScrollableQuiz/ScrollableQuiz.d.ts +1 -1
  134. package/dist/sections/ScrollableQuiz/types.d.ts +6 -0
  135. package/dist/sections/StudentProfile/StudentProfile.d.ts +2 -0
  136. package/dist/sections/StudentProfile/types.d.ts +98 -0
  137. package/dist/sections/SurveyForm/SurveyForm.d.ts +1 -1
  138. package/dist/sections/SurveyForm/types.d.ts +6 -0
  139. package/dist/sections/_shared/merge-answers.d.ts +9 -0
  140. package/dist/sections/_shared/section-shell.d.ts +20 -0
  141. package/dist/sections/_shared/use-assessment-session.d.ts +30 -0
  142. package/dist/sections/index.d.ts +13 -1
  143. package/dist/sections.cjs +1 -1
  144. package/dist/sections.js +282 -1786
  145. package/dist/social/post-card.d.ts +1 -1
  146. package/dist/tabs-BsfVo2Bl.cjs +173 -0
  147. package/dist/tabs-BuY1iNJE.js +22305 -0
  148. package/dist/ui/alert.d.ts +1 -1
  149. package/dist/ui/badge.d.ts +1 -1
  150. package/dist/ui/button.d.ts +1 -1
  151. package/dist/ui/drawer.d.ts +84 -0
  152. package/dist/ui/index.d.ts +5 -0
  153. package/dist/ui/progress.d.ts +1 -1
  154. package/dist/ui/rich-text-editor.d.ts +32 -0
  155. package/dist/ui/rich-text-toolbar.d.ts +8 -0
  156. package/dist/ui/toast.d.ts +43 -0
  157. package/dist/utils/array-utils.d.ts +4 -0
  158. package/dist/utils/debounce.d.ts +5 -1
  159. package/dist/utils/flatten-leaves.d.ts +6 -0
  160. package/dist/utils/format-file-size.d.ts +1 -0
  161. package/dist/utils/format-timestamp.d.ts +1 -0
  162. package/dist/utils/is-empty-html.d.ts +5 -0
  163. package/dist/utils/pick-palette-color.d.ts +19 -0
  164. package/dist/utils/shuffle.d.ts +1 -0
  165. package/dist/utils/string-utils.d.ts +12 -0
  166. package/dist/video/types.d.ts +15 -0
  167. package/dist/video/video-bookmark.d.ts +1 -1
  168. package/dist/video/video-player.d.ts +1 -1
  169. package/dist/video/video-playlist-item.d.ts +1 -1
  170. package/dist/withProGate-BWqcKdPM.js +137 -0
  171. package/dist/withProGate-DX6XqKLp.cjs +1 -0
  172. package/package.json +40 -137
  173. package/src/assessment-toolbar/assessment-toolbar.tsx +54 -49
  174. package/src/assessment-toolbar/index.ts +6 -0
  175. package/src/assessment-toolbar/question-header-bar.tsx +61 -0
  176. package/src/assessment-toolbar/question-materials-drawer.tsx +55 -0
  177. package/src/assessment-toolbar/question-navigator.tsx +13 -36
  178. package/src/assessment-toolbar/timer-display.tsx +6 -5
  179. package/src/assessment-toolbar/types.ts +54 -4
  180. package/src/assessment-toolbar/use-countdown.ts +153 -0
  181. package/src/common/empty-state.tsx +1 -0
  182. package/src/common/index.ts +5 -0
  183. package/src/common/pagination.tsx +135 -0
  184. package/src/common/search-input.tsx +8 -6
  185. package/src/common/stepper.tsx +100 -0
  186. package/src/common/types.ts +41 -0
  187. package/src/content/attachment-list.tsx +92 -0
  188. package/src/content/audio-player.tsx +196 -0
  189. package/src/content/code-block.tsx +113 -0
  190. package/src/content/content-block.tsx +68 -2
  191. package/src/content/embed-block.tsx +78 -0
  192. package/src/content/file-upload-zone.tsx +11 -6
  193. package/src/content/index.ts +9 -0
  194. package/src/content/types.ts +46 -0
  195. package/src/curriculum/course-card.tsx +199 -0
  196. package/src/curriculum/curriculum-item.tsx +9 -5
  197. package/src/curriculum/curriculum-tree.tsx +20 -13
  198. package/src/curriculum/index.ts +2 -0
  199. package/src/curriculum/types.ts +2 -2
  200. package/src/feedback/feedback-banner.tsx +12 -14
  201. package/src/flashcards/flashcard-deck.tsx +1 -9
  202. package/src/flashcards/flashcard.tsx +29 -9
  203. package/src/index.ts +3 -0
  204. package/src/license/HydraContext.tsx +62 -0
  205. package/src/license/ProBadge.tsx +43 -0
  206. package/src/license/index.ts +7 -0
  207. package/src/license/tiers.ts +24 -0
  208. package/src/license/useHydraLicense.ts +10 -0
  209. package/src/license/validate.ts +90 -0
  210. package/src/license/withProGate.tsx +21 -0
  211. package/src/modules/AssignmentModule/AssignmentModule.tsx +314 -0
  212. package/src/modules/AssignmentModule/types.ts +77 -0
  213. package/src/modules/CertificateModule/CertificateModule.tsx +173 -0
  214. package/src/modules/CertificateModule/types.ts +49 -0
  215. package/src/modules/CourseCatalogModule/CourseCatalogModule.tsx +126 -0
  216. package/src/modules/CourseCatalogModule/types.ts +47 -0
  217. package/src/modules/CoursePlayer/CoursePlayer.tsx +80 -69
  218. package/src/modules/DiscussionModule/DiscussionModule.tsx +145 -0
  219. package/src/modules/DiscussionModule/types.ts +54 -0
  220. package/src/modules/ExamModule/ExamModule.tsx +151 -0
  221. package/src/modules/ExamModule/types.ts +57 -0
  222. package/src/modules/FlashcardLab/FlashcardLab.tsx +39 -21
  223. package/src/modules/FlashcardLab/types.ts +2 -0
  224. package/src/modules/GradeCenterModule/GradeCenterModule.tsx +174 -0
  225. package/src/modules/GradeCenterModule/types.ts +65 -0
  226. package/src/modules/QuizModule/QuizModule.tsx +58 -178
  227. package/src/modules/QuizModule/types.ts +10 -15
  228. package/src/modules/StudentDashboardModule/StudentDashboardModule.tsx +117 -0
  229. package/src/modules/StudentDashboardModule/types.ts +56 -0
  230. package/src/modules/StudentProfileModule/StudentProfileModule.tsx +289 -0
  231. package/src/modules/StudentProfileModule/types.ts +45 -0
  232. package/src/modules/SurveyModule/SurveyModule.tsx +185 -0
  233. package/src/modules/SurveyModule/types.ts +53 -0
  234. package/src/modules/_shared/assessment-intro.tsx +75 -0
  235. package/src/modules/_shared/assessment-results.tsx +133 -0
  236. package/src/modules/_shared/types.ts +11 -0
  237. package/src/modules/_shared/use-timer.ts +49 -0
  238. package/src/modules/index.ts +33 -0
  239. package/src/progress/achievement-badge.tsx +52 -0
  240. package/src/progress/activity-timeline.tsx +84 -0
  241. package/src/progress/grade-indicator.tsx +9 -1
  242. package/src/progress/index.ts +7 -0
  243. package/src/progress/progress-ring.tsx +2 -1
  244. package/src/progress/stat-card.tsx +37 -18
  245. package/src/progress/streak-badge.tsx +35 -0
  246. package/src/progress/types.ts +103 -0
  247. package/src/provider/HydraProvider.tsx +15 -6
  248. package/src/questions/choice.tsx +19 -14
  249. package/src/questions/confidence-indicator.tsx +107 -0
  250. package/src/questions/essay.tsx +28 -28
  251. package/src/questions/fill-in-the-blank.tsx +20 -19
  252. package/src/questions/hotspot.tsx +154 -0
  253. package/src/questions/index.ts +18 -0
  254. package/src/questions/inline-choice.tsx +152 -0
  255. package/src/questions/matching.tsx +229 -0
  256. package/src/questions/multiple-choice.tsx +19 -14
  257. package/src/questions/numeric.tsx +106 -0
  258. package/src/questions/ordering.tsx +167 -0
  259. package/src/questions/question-renderer.tsx +24 -2
  260. package/src/questions/scenario.tsx +140 -0
  261. package/src/questions/scoring.ts +201 -0
  262. package/src/questions/spreadsheet.tsx +260 -0
  263. package/src/questions/true-false.tsx +19 -14
  264. package/src/questions/types.ts +123 -1
  265. package/src/questions/use-drag-reorder.ts +80 -0
  266. package/src/sections/AnnouncementFeed/AnnouncementFeed.tsx +66 -23
  267. package/src/sections/AnnouncementFeed/types.ts +15 -1
  268. package/src/sections/AssessmentReview/AssessmentReview.tsx +50 -2
  269. package/src/sections/AssessmentReview/types.ts +6 -0
  270. package/src/sections/AssignmentSubmission/AssignmentSubmission.tsx +44 -6
  271. package/src/sections/AssignmentSubmission/types.ts +6 -0
  272. package/src/sections/CertificateViewer/CertificateViewer.tsx +215 -60
  273. package/src/sections/CertificateViewer/certificate-variants.tsx +170 -0
  274. package/src/sections/CertificateViewer/types.ts +19 -5
  275. package/src/sections/CourseCatalog/CourseCatalog.tsx +220 -0
  276. package/src/sections/CourseCatalog/types.ts +76 -0
  277. package/src/sections/CourseOutline/CourseOutline.tsx +45 -14
  278. package/src/sections/CourseOutline/types.ts +6 -0
  279. package/src/sections/DiscussionThread/DiscussionThread.tsx +55 -11
  280. package/src/sections/DiscussionThread/types.ts +6 -0
  281. package/src/sections/EnrollmentWizard/EnrollmentWizard.tsx +343 -0
  282. package/src/sections/EnrollmentWizard/types.ts +65 -0
  283. package/src/sections/ExamSession/ExamSession.tsx +125 -82
  284. package/src/sections/ExamSession/types.ts +12 -1
  285. package/src/sections/FlashcardStudySession/FlashcardStudySession.tsx +53 -36
  286. package/src/sections/FlashcardStudySession/types.ts +6 -0
  287. package/src/sections/ForumBoard/ForumBoard.tsx +342 -0
  288. package/src/sections/ForumBoard/types.ts +81 -0
  289. package/src/sections/GradebookTable/GradebookTable.tsx +55 -2
  290. package/src/sections/GradebookTable/types.ts +14 -0
  291. package/src/sections/LecturePlayer/LecturePlayer.tsx +63 -37
  292. package/src/sections/LecturePlayer/types.ts +8 -0
  293. package/src/sections/LessonPage/LessonPage.tsx +40 -13
  294. package/src/sections/LessonPage/types.ts +6 -0
  295. package/src/sections/PracticeQuiz/PracticeQuiz.tsx +119 -98
  296. package/src/sections/PracticeQuiz/types.ts +6 -0
  297. package/src/sections/ProgressDashboard/ProgressDashboard.tsx +121 -67
  298. package/src/sections/ProgressDashboard/types.ts +6 -0
  299. package/src/sections/QuizSession/QuizSession.tsx +115 -67
  300. package/src/sections/QuizSession/types.ts +12 -1
  301. package/src/sections/RequirementsChecklist/RequirementsChecklist.tsx +147 -0
  302. package/src/sections/RequirementsChecklist/types.ts +44 -0
  303. package/src/sections/ResourceLibrary/ResourceLibrary.tsx +68 -17
  304. package/src/sections/ResourceLibrary/types.ts +15 -1
  305. package/src/sections/RubricView/RubricView.tsx +174 -0
  306. package/src/sections/RubricView/types.ts +58 -0
  307. package/src/sections/ScrollableQuiz/ScrollableQuiz.tsx +58 -23
  308. package/src/sections/ScrollableQuiz/types.ts +6 -0
  309. package/src/sections/StudentProfile/StudentProfile.tsx +279 -0
  310. package/src/sections/StudentProfile/types.ts +99 -0
  311. package/src/sections/SurveyForm/SurveyForm.tsx +40 -10
  312. package/src/sections/SurveyForm/types.ts +6 -0
  313. package/src/sections/_shared/merge-answers.ts +22 -0
  314. package/src/sections/_shared/section-shell.tsx +64 -0
  315. package/src/sections/_shared/use-assessment-session.ts +125 -0
  316. package/src/sections/index.ts +42 -1
  317. package/src/social/post-card.tsx +8 -19
  318. package/src/social/user-avatar.tsx +10 -5
  319. package/src/styles/globals.css +52 -41
  320. package/src/ui/badge.tsx +8 -0
  321. package/src/ui/drawer.tsx +600 -0
  322. package/src/ui/index.ts +21 -0
  323. package/src/ui/progress.tsx +4 -0
  324. package/src/ui/rich-text-editor.tsx +119 -0
  325. package/src/ui/rich-text-toolbar.tsx +157 -0
  326. package/src/ui/toast.tsx +170 -0
  327. package/src/utils/array-utils.ts +17 -0
  328. package/src/utils/debounce.ts +8 -2
  329. package/src/utils/flatten-leaves.ts +17 -0
  330. package/src/utils/format-file-size.ts +5 -0
  331. package/src/utils/format-timestamp.ts +13 -0
  332. package/src/utils/is-empty-html.ts +7 -0
  333. package/src/utils/pick-palette-color.ts +33 -0
  334. package/src/utils/shuffle.ts +8 -0
  335. package/src/utils/string-utils.ts +30 -0
  336. package/src/video/types.ts +16 -0
  337. package/src/video/video-bookmark.tsx +4 -3
  338. package/src/video/video-chapter-list.tsx +9 -4
  339. package/src/video/video-player.tsx +24 -5
  340. package/src/video/video-playlist-item.tsx +8 -3
  341. package/src/video/video-thumbnail-card.tsx +4 -0
  342. package/src/video/video-transcript.tsx +8 -5
  343. package/dist/table-BrS5cDQu.js +0 -2510
  344. package/dist/table-D6AkBBEo.cjs +0 -1
@@ -0,0 +1,51 @@
1
+ import { SurveyQuestion, SurveyAnswer } from '../../sections/SurveyForm/types';
2
+ /**
3
+ * SurveyModule — a complete survey experience with intro, form, and thank-you steps.
4
+ *
5
+ * Wraps SurveyForm with a welcoming intro screen and a thank-you completion
6
+ * screen showing response stats.
7
+ *
8
+ * @example
9
+ * <SurveyModule
10
+ * title="Course Evaluation"
11
+ * description="Help us improve this course."
12
+ * questions={surveyQuestions}
13
+ * onComplete={(result) => submitSurvey(result)}
14
+ * />
15
+ */
16
+ export interface SurveyModuleProps {
17
+ /** Survey title displayed on the intro and form screens */
18
+ title: string;
19
+ /** Survey description displayed on the intro screen */
20
+ description?: string;
21
+ /** Survey questions */
22
+ questions: SurveyQuestion[];
23
+ /** Whether all questions must be answered before submit. @default false */
24
+ requireAll?: boolean;
25
+ /** Whether to show a progress indicator in the survey form. @default true */
26
+ showProgress?: boolean;
27
+ /** Custom title for the thank-you screen. @default "Thank You!" */
28
+ thankYouTitle?: string;
29
+ /** Custom message for the thank-you screen */
30
+ thankYouMessage?: string;
31
+ /** Called when the survey is completed */
32
+ onComplete?: (result: SurveyModuleResult) => void;
33
+ /** Allow restarting the survey from the thank-you screen. @default false */
34
+ allowRestart?: boolean;
35
+ /** When true, disables interactions for preview/demo mode. @default false */
36
+ readOnly?: boolean;
37
+ /** CSS class name for the root element */
38
+ className?: string;
39
+ /** Inline styles for the root element */
40
+ style?: React.CSSProperties;
41
+ }
42
+ export interface SurveyModuleResult {
43
+ /** The user's submitted answers */
44
+ answers: SurveyAnswer[];
45
+ /** Total number of questions */
46
+ totalQuestions: number;
47
+ /** Number of questions answered */
48
+ answeredCount: number;
49
+ /** Total time taken in seconds */
50
+ timeElapsedSeconds: number;
51
+ }
@@ -0,0 +1,16 @@
1
+ import { ReactNode } from 'react';
2
+ export interface AssessmentIntroProps {
3
+ icon: ReactNode;
4
+ title: string;
5
+ description?: string;
6
+ questionCount: number;
7
+ timeLimitSeconds?: number;
8
+ passingScore?: number;
9
+ startLabel: string;
10
+ onStart: () => void;
11
+ /** Extra content rendered between the description and metadata badges. */
12
+ children?: ReactNode;
13
+ /** When true, disables interactions for preview/demo mode. @default false */
14
+ readOnly?: boolean;
15
+ }
16
+ export declare function AssessmentIntro({ icon, title, description, questionCount, timeLimitSeconds, passingScore, startLabel, onStart, children, readOnly, }: AssessmentIntroProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,23 @@
1
+ import { ReactNode } from 'react';
2
+ import { QuestionData, SessionAnswer } from '../../questions/types';
3
+ export interface AssessmentResultsProps {
4
+ title: string;
5
+ percentage: number;
6
+ passed: boolean;
7
+ correct: number;
8
+ total: number;
9
+ timeElapsedSeconds: number;
10
+ answers: SessionAnswer[];
11
+ questions: QuestionData[];
12
+ /** Allow retaking the assessment. */
13
+ allowRetake?: boolean;
14
+ onRetake?: () => void;
15
+ retakeLabel?: string;
16
+ /** Show per-question review below the summary. */
17
+ showReview?: boolean;
18
+ /** Extra badges shown next to the pass/fail badge (e.g., "Auto-submitted"). */
19
+ extraBadges?: ReactNode;
20
+ /** When true, disables interactions for preview/demo mode. @default false */
21
+ readOnly?: boolean;
22
+ }
23
+ export declare function AssessmentResults({ title, percentage, passed, correct, total, timeElapsedSeconds, answers, questions, allowRetake, onRetake, retakeLabel, showReview, extraBadges, readOnly, }: AssessmentResultsProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,10 @@
1
+ import { SessionAnswer } from '../../questions/types';
2
+ /** Shared result shape for scored assessment modules. */
3
+ export interface AssessmentResult {
4
+ answers: SessionAnswer[];
5
+ correct: number;
6
+ total: number;
7
+ percentage: number;
8
+ passed: boolean;
9
+ timeElapsedSeconds: number;
10
+ }
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Manages an interval-based timer that runs while `active` is true.
3
+ * Returns elapsed seconds and a reset function.
4
+ */
5
+ export declare function useTimer(active: boolean): {
6
+ timeElapsed: number;
7
+ getFinalElapsed: () => number;
8
+ reset: () => void;
9
+ };
@@ -4,3 +4,21 @@ export { FlashcardLab } from './FlashcardLab/FlashcardLab';
4
4
  export type { FlashcardLabProps, FlashcardDeckOption, FlashcardLabResult, } from './FlashcardLab/types';
5
5
  export { CoursePlayer } from './CoursePlayer/CoursePlayer';
6
6
  export type { CoursePlayerProps, CoursePlayerItem } from './CoursePlayer/types';
7
+ export { ExamModule } from './ExamModule/ExamModule';
8
+ export type { ExamModuleProps, ExamModuleResult } from './ExamModule/types';
9
+ export { SurveyModule } from './SurveyModule/SurveyModule';
10
+ export type { SurveyModuleProps, SurveyModuleResult, } from './SurveyModule/types';
11
+ export { GradeCenterModule } from './GradeCenterModule/GradeCenterModule';
12
+ export type { GradeCenterModuleProps } from './GradeCenterModule/types';
13
+ export { AssignmentModule } from './AssignmentModule/AssignmentModule';
14
+ export type { AssignmentModuleProps, AssignmentModuleResult, } from './AssignmentModule/types';
15
+ export { CertificateModule } from './CertificateModule/CertificateModule';
16
+ export type { CertificateModuleProps } from './CertificateModule/types';
17
+ export { DiscussionModule } from './DiscussionModule/DiscussionModule';
18
+ export type { DiscussionModuleProps } from './DiscussionModule/types';
19
+ export { StudentDashboardModule } from './StudentDashboardModule/StudentDashboardModule';
20
+ export type { StudentDashboardModuleProps } from './StudentDashboardModule/types';
21
+ export { CourseCatalogModule } from './CourseCatalogModule/CourseCatalogModule';
22
+ export type { CourseCatalogModuleProps } from './CourseCatalogModule/types';
23
+ export { StudentProfileModule } from './StudentProfileModule/StudentProfileModule';
24
+ export type { StudentProfileModuleProps } from './StudentProfileModule/types';
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),t=require("react"),i=require("lucide-react"),A=require("./StudentProfile-BVfZMbnV.cjs"),s=require("./tabs-BsfVo2Bl.cjs"),L=require("./withProGate-DX6XqKLp.cjs");function q(d){const[N,x]=t.useState(0),l=t.useRef(null),j=t.useRef(null),o=t.useRef(0);t.useEffect(()=>(d?(l.current=Date.now(),j.current=setInterval(()=>{if(l.current){const c=Math.floor((Date.now()-l.current)/1e3);c!==o.current&&(o.current=c,x(c))}},1e3)):j.current&&(clearInterval(j.current),j.current=null),()=>{j.current&&clearInterval(j.current)}),[d]);const a=t.useCallback(()=>l.current?Math.floor((Date.now()-l.current)/1e3):o.current,[]),f=t.useCallback(()=>{o.current=0,x(0),l.current=null},[]);return{timeElapsed:N,getFinalElapsed:a,reset:f}}function V({icon:d,title:N,description:x,questionCount:l,timeLimitSeconds:j,passingScore:o,startLabel:a,onStart:f,children:c,readOnly:m=!1}){return e.jsx(s.Card,{children:e.jsxs(s.CardContent,{className:"pt-8 pb-8 text-center",children:[e.jsx("div",{className:"mx-auto mb-4 w-14 h-14 rounded-full bg-primary/10 flex items-center justify-center",children:d}),e.jsx("h2",{className:"text-2xl font-bold text-foreground mb-2",children:N}),x&&e.jsx("p",{className:"text-muted-foreground mb-6 max-w-md mx-auto",children:x}),c,e.jsxs("div",{className:"flex flex-wrap justify-center gap-2 mb-8",children:[e.jsxs(s.Badge,{variant:"outline",className:"gap-1.5",children:[e.jsx(i.HelpCircle,{className:"size-3.5"}),l," questions"]}),j!=null&&e.jsxs(s.Badge,{variant:"outline",className:"gap-1.5",children:[e.jsx(i.Clock,{className:"size-3.5"}),s.formatDuration(j)," time limit"]}),o!==void 0&&e.jsxs(s.Badge,{variant:"outline",className:"gap-1.5",children:[e.jsx(i.CheckCircle2,{className:"size-3.5"}),o,"% to pass"]})]}),e.jsxs(s.Button,{size:"lg",onClick:f,disabled:m,children:[e.jsx(i.Play,{className:"size-4 mr-2"}),a]})]})})}function Y({title:d,percentage:N,passed:x,correct:l,total:j,timeElapsedSeconds:o,answers:a,questions:f,allowRetake:c,onRetake:m,retakeLabel:g="Retake",showReview:C=!0,extraBadges:r,readOnly:S=!1}){return e.jsxs(e.Fragment,{children:[e.jsx(s.Card,{children:e.jsxs(s.CardContent,{className:"pt-8 pb-8",children:[e.jsxs("div",{className:"text-center mb-8",children:[e.jsx(s.ProgressRing,{value:N,size:140,strokeWidth:10,color:x?"var(--success)":"var(--destructive)",className:"mx-auto mb-4 text-foreground"}),e.jsx(s.Badge,{variant:x?"success":"destructive",className:"text-sm px-3 py-1 mb-2",children:x?"Passed":"Failed"}),r,e.jsx("h2",{className:"text-xl font-bold text-foreground",children:d})]}),e.jsxs("div",{className:"grid grid-cols-2 sm:grid-cols-4 gap-3 mb-8",children:[e.jsx(s.StatCard,{icon:e.jsx(i.CheckCircle2,{}),label:"Correct",description:"Questions answered right",value:`${l}/${j}`,accent:"var(--success)"}),e.jsx(s.StatCard,{icon:e.jsx(i.XCircle,{}),label:"Incorrect",description:"Questions to review",value:`${j-l}/${j}`,accent:"var(--destructive)"}),e.jsx(s.StatCard,{icon:e.jsx(i.Trophy,{}),label:"Score",description:"Overall percentage",value:`${N}%`,accent:"var(--palette-3)"}),e.jsx(s.StatCard,{icon:e.jsx(i.Clock,{}),label:"Time",description:"Total elapsed",value:s.formatDuration(o),accent:"var(--palette-1)"})]}),c&&m&&!S&&e.jsx("div",{className:"flex justify-center mb-8",children:e.jsxs(s.Button,{variant:"outline",onClick:m,children:[e.jsx(i.RotateCcw,{className:"size-4 mr-2"}),g]})})]})}),C&&e.jsxs(e.Fragment,{children:[e.jsx(s.Separator,{className:"my-6"}),e.jsx("h3",{className:"text-lg font-semibold text-foreground mb-4",children:"Question Review"}),e.jsx(A.AssessmentReview,{questions:f,sessionAnswers:a,showCorrectAnswers:!0})]})]})}function D({title:d,description:N,questions:x,timeLimitSeconds:l,passingScore:j,allowRetake:o=!0,onComplete:a,showReview:f=!0,questionMaterials:c,readOnly:m=!1,className:g,style:C}){const[r,S]=t.useState({tag:"intro"}),h=t.useRef(null),{timeElapsed:b,getFinalElapsed:v,reset:n}=q(r.tag==="quiz"),z=t.useRef(a);z.current=a,t.useEffect(()=>{var u;(u=h.current)==null||u.focus({preventScroll:!0})},[r.tag]);const R=t.useCallback(u=>{var M;const{correct:p,total:w,percentage:k}=s.scoreAssessment(x,u),E={answers:u,correct:p,total:w,percentage:k,passed:j!==void 0?k>=j:!0,timeElapsedSeconds:v()};S({tag:"results",result:E}),(M=z.current)==null||M.call(z,E)},[x,j,v]),B=t.useCallback(()=>{n(),S({tag:"intro"})},[n]);if(r.tag==="intro")return e.jsx("div",{ref:h,tabIndex:-1,className:s.cn("max-w-2xl mx-auto outline-none",g),style:C,children:e.jsx(V,{icon:e.jsx(i.Trophy,{className:"size-7 text-primary"}),title:d,description:N,questionCount:x.length,timeLimitSeconds:l,passingScore:j,startLabel:"Start Quiz",onStart:()=>S({tag:"quiz"}),readOnly:m})});if(r.tag==="quiz")return e.jsx("div",{ref:h,tabIndex:-1,className:s.cn("outline-none",g),style:C,children:e.jsx(A.QuizSession,{questions:x,onSubmit:R,timeElapsedSeconds:b,timeLimitSeconds:l,questionMaterials:c,readOnly:m})});const{result:T}=r;return e.jsx("div",{ref:h,tabIndex:-1,className:s.cn("max-w-2xl mx-auto outline-none",g),style:C,children:e.jsx(Y,{title:d,percentage:T.percentage,passed:T.passed,correct:T.correct,total:T.total,timeElapsedSeconds:T.timeElapsedSeconds,answers:T.answers,questions:x,allowRetake:o,onRetake:B,retakeLabel:"Retake Quiz",showReview:f,readOnly:m})})}const _=L.withProGate(D,"QuizModule");function X({decks:d=[],showShuffleToggle:N=!0,defaultShuffled:x=!1,allowMultiSelect:l=!0,onComplete:j,readOnly:o=!1,className:a,style:f}){const[c,m]=t.useState({tag:"setup"}),[g,C]=t.useState(new Set),[r,S]=t.useState(x),h=t.useRef(null),b=t.useRef(null);t.useEffect(()=>{var u;(u=b.current)==null||u.focus({preventScroll:!0})},[c.tag]);function v(u){C(p=>{const w=new Set(p);return w.has(u)?w.delete(u):(l||w.clear(),w.add(u)),w})}function n(){const u=d.filter(w=>g.has(w.uid)),p=u.flatMap(w=>w.cards);h.current=Date.now(),m({tag:"study",cards:p,deckUids:u.map(w=>w.uid),shuffled:r})}function z(){if(c.tag!=="study")return;const u=h.current?Math.floor((Date.now()-h.current)/1e3):0,p={totalCards:c.cards.length,decksStudied:c.deckUids.length,deckUids:c.deckUids,wasShuffled:c.shuffled,timeElapsedSeconds:u};m({tag:"completion",result:p}),j==null||j(p)}function R(){if(c.tag!=="completion")return;const p=d.filter(w=>c.result.deckUids.includes(w.uid)).flatMap(w=>w.cards);h.current=Date.now(),m({tag:"study",cards:p,deckUids:c.result.deckUids,shuffled:c.result.wasShuffled})}function B(){C(new Set),S(x),m({tag:"setup"})}if(c.tag==="setup")return e.jsx("div",{ref:b,tabIndex:-1,className:s.cn("max-w-2xl mx-auto outline-none",a),style:f,children:e.jsx(s.Card,{children:e.jsxs(s.CardContent,{className:"pt-8 pb-8",children:[e.jsxs("div",{className:"text-center mb-6",children:[e.jsx("div",{className:"mx-auto mb-4 w-14 h-14 rounded-full bg-primary/10 flex items-center justify-center",children:e.jsx(i.BookOpen,{className:"size-7 text-primary"})}),e.jsx("h2",{className:"text-2xl font-bold text-foreground mb-2",children:"Choose Your Decks"}),e.jsx("p",{className:"text-muted-foreground text-sm",children:l?"Select one or more decks to study":"Select a deck to study"})]}),e.jsx("div",{className:"grid sm:grid-cols-2 lg:grid-cols-3 gap-3 mb-6",children:d.map(u=>{const p=g.has(u.uid);return e.jsx(s.Card,{className:s.cn("cursor-pointer transition-all py-0",p?"border-primary ring-1 ring-primary":"hover:border-muted-foreground/30"),onClick:()=>v(u.uid),children:e.jsxs(s.CardContent,{className:"py-4",children:[e.jsxs("div",{className:"flex items-start justify-between mb-2",children:[e.jsx("h3",{className:"font-semibold text-foreground text-sm",children:u.title}),e.jsxs(s.Badge,{variant:"secondary",className:"text-xs shrink-0",children:[u.cards.length," cards"]})]}),u.description&&e.jsx("p",{className:"text-xs text-muted-foreground line-clamp-2",children:u.description})]})},u.uid)})}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[N&&e.jsxs(s.Button,{variant:r?"secondary":"outline",size:"sm",className:"gap-1.5",onClick:()=>S(u=>!u),children:[e.jsx(i.Shuffle,{className:"size-3.5"}),"Shuffle"]}),g.size>0&&e.jsxs("span",{className:"text-xs text-muted-foreground",children:[d.filter(u=>g.has(u.uid)).reduce((u,p)=>u+p.cards.length,0)," ","cards selected"]})]}),e.jsx(s.Button,{onClick:n,disabled:g.size===0||o,children:"Start Studying"})]})]})})});if(c.tag==="study"){const u=d.filter(p=>c.deckUids.includes(p.uid)).map(p=>p.title).join(", ");return e.jsx("div",{ref:b,tabIndex:-1,className:s.cn("outline-none",a),style:f,children:e.jsx(A.FlashcardStudySession,{cards:c.cards,title:u,shuffled:c.shuffled,onComplete:z,readOnly:o})})}const{result:T}=c;return e.jsx("div",{ref:b,tabIndex:-1,className:s.cn("max-w-2xl mx-auto outline-none",a),style:f,children:e.jsx(s.Card,{children:e.jsxs(s.CardContent,{className:"pt-8 pb-8",children:[e.jsxs("div",{className:"text-center mb-8",children:[e.jsxs("div",{className:"relative mx-auto mb-4",children:[e.jsx(s.ProgressRing,{value:100,size:120,strokeWidth:10,color:"var(--success)",className:"text-foreground",label:""}),e.jsx(i.CheckCircle2,{className:"size-8 text-success absolute inset-0 m-auto"})]}),e.jsx("h2",{className:"text-xl font-bold text-foreground mb-2",children:"Study Session Complete"}),e.jsx("p",{className:"text-muted-foreground text-sm",children:"Great work! Here's your session summary."})]}),e.jsxs("div",{className:"grid grid-cols-2 sm:grid-cols-4 gap-3 mb-8",children:[e.jsx(s.StatCard,{icon:e.jsx(i.Layers,{}),label:"Cards Studied",description:"Total cards reviewed",value:String(T.totalCards)}),e.jsx(s.StatCard,{icon:e.jsx(i.BookOpen,{}),label:"Decks",description:"Decks completed",value:String(T.decksStudied)}),e.jsx(s.StatCard,{icon:e.jsx(i.Clock,{}),label:"Time Spent",description:"Session duration",value:s.formatDuration(T.timeElapsedSeconds)}),e.jsx(s.StatCard,{icon:e.jsx(i.Shuffle,{}),label:"Shuffled",description:"Card order randomized",value:T.wasShuffled?"Yes":"No"})]}),e.jsxs("div",{className:"flex justify-center gap-3",children:[e.jsxs(s.Button,{variant:"outline",onClick:B,disabled:o,children:[e.jsx(i.ArrowLeft,{className:"size-4 mr-2"}),"Pick New Deck"]}),e.jsxs(s.Button,{onClick:R,disabled:o,children:[e.jsx(i.RotateCcw,{className:"size-4 mr-2"}),"Study Again"]})]})]})})})}const J=L.withProGate(X,"FlashcardLab");function K({courseTitle:d,curriculum:N,progress:x,items:l,initialItemUid:j,onItemComplete:o,onItemChange:a,sidebarCollapsed:f=!1,readOnly:c=!1,className:m,style:g}){const C=t.useRef(null),r=t.useMemo(()=>A.flattenLeaves(N),[N]),S=t.useMemo(()=>new Map(l.map(y=>[y.uid,y])),[l]),[h,b]=t.useState(j??r[0]??""),[v,n]=t.useState(!f),[z,R]=t.useState(()=>x?new Set(x.filter(y=>y.isCompleted).map(y=>y.resourceUid)):new Set),B=r.indexOf(h),T=B>0,u=B<r.length-1,p=z.has(h),w=r.length>0?Math.round(r.filter(y=>z.has(y)).length/r.length*100):0,k=S.get(h),E=t.useMemo(()=>(k==null?void 0:k.type)==="video"?{src:k.src,poster:k.poster,title:k.title}:null,[k]);t.useEffect(()=>{var y;(y=C.current)==null||y.focus({preventScroll:!0})},[h]);const M=t.useRef(a);M.current=a;const U=t.useRef(o);U.current=o;const I=t.useCallback(y=>{var P;b(y),(P=M.current)==null||P.call(M,y)},[]),G=t.useCallback(y=>{(!y.children||y.children.length===0)&&I(y.uid)},[I]),F=t.useCallback(()=>{var y;R(P=>new Set(P).add(h)),(y=U.current)==null||y.call(U,h)},[h]),Q=t.useCallback(()=>{const y=r.indexOf(h);y<r.length-1&&I(r[y+1])},[r,h,I]),$=t.useCallback(()=>{const y=r.indexOf(h);y>0&&I(r[y-1])},[r,h,I]),W=t.useMemo(()=>{const y=new Map((x??[]).map(P=>[P.resourceUid,P]));for(const P of z)y.has(P)?y.set(P,{...y.get(P),isCompleted:!0}):y.set(P,{resourceUid:P,isCompleted:!0});return Array.from(y.values())},[x,z]),H=u?S.get(r[B+1]):null;return e.jsxs("div",{className:s.cn("flex h-full overflow-hidden",m),style:g,children:[e.jsx(s.Drawer,{open:v,onOpenChange:n,side:"left",children:e.jsxs(s.DrawerContent,{size:"sm",scrollLock:!1,children:[e.jsxs(s.DrawerHeader,{className:"flex-row items-center justify-between",children:[e.jsx(s.DrawerTitle,{className:"text-xs font-semibold text-muted-foreground uppercase tracking-wide",children:"Course"}),e.jsx(s.DrawerClose,{})]}),e.jsx(s.DrawerBody,{className:"px-2 pb-2",children:e.jsx(A.CourseOutline,{items:N,progress:W,courseTitle:d,activeItemUid:h,onItemClick:G,readOnly:c})})]})}),e.jsxs("div",{className:"flex-1 flex flex-col min-w-0 overflow-hidden",children:[e.jsxs("div",{className:"flex items-center gap-2 px-4 py-2 border-b border-border bg-background shrink-0",children:[e.jsx(s.Button,{variant:"ghost",size:"sm",className:"size-7 p-0 mr-1",onClick:()=>n(!0),children:e.jsx(i.PanelLeft,{className:"size-4"})}),e.jsx("div",{className:"flex-1 min-w-0",children:e.jsx("span",{className:"text-sm font-semibold text-foreground truncate block",children:(k==null?void 0:k.title)??"Select an item"})}),e.jsxs("span",{className:"text-xs text-muted-foreground shrink-0",children:[B+1," / ",r.length]})]}),e.jsx("div",{ref:C,tabIndex:-1,className:"flex-1 overflow-y-auto p-6 outline-none",children:k?Z(k,c,F,p,Q,u,H,E):e.jsx(s.EmptyState,{title:"No content selected",description:"Select an item from the course outline to get started."})}),e.jsx("div",{className:"shrink-0 border-t border-border bg-background px-4 py-3",children:e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("div",{className:"flex items-center gap-2 mb-1",children:e.jsxs("span",{className:"text-xs text-muted-foreground",children:[w,"% complete"]})}),e.jsx(s.Progress,{value:w,size:"sm"})]}),e.jsxs("div",{className:"flex items-center gap-2 shrink-0",children:[!p&&k&&e.jsxs(s.Button,{size:"sm",variant:"outline",onClick:F,disabled:c,children:[e.jsx(i.Check,{className:"size-3.5 mr-1"}),"Complete"]}),e.jsx(s.Button,{size:"sm",variant:"ghost",onClick:$,disabled:!T,children:e.jsx(i.ChevronLeft,{className:"size-4"})}),e.jsx(s.Button,{size:"sm",variant:"ghost",onClick:Q,disabled:!u,children:e.jsx(i.ChevronRight,{className:"size-4"})})]})]})})]})]})}function Z(d,N,x,l,j,o,a,f){switch(d.type){case"lesson":return e.jsx(A.LessonPage,{title:d.title,blocks:d.blocks,isCompleted:l,onMarkComplete:x,onNextLesson:o?j:void 0,nextLessonTitle:a==null?void 0:a.title,readOnly:N});case"video":return e.jsx(A.LecturePlayer,{video:f??{src:"",title:d.title},onComplete:l?void 0:x});case"quiz":return e.jsx(A.PracticeQuiz,{questions:d.questions,instantFeedback:!0,allowRetry:!0,readOnly:N});default:return e.jsx(s.EmptyState,{title:"Unknown content type",description:"This content type is not supported."})}}const O=L.withProGate(K,"CoursePlayer");function ee({title:d,description:N,instructions:x,questions:l=[],timeLimitSeconds:j,passingScore:o,allowBackNavigation:a=!0,autoSubmitOnTimeout:f=!0,timeWarningThreshold:c,allowRetake:m=!1,showReview:g=!0,onComplete:C,readOnly:r=!1,className:S,style:h}){const[b,v]=t.useState({tag:"intro"}),n=t.useRef(null),{timeElapsed:z,reset:R}=q(b.tag==="exam"),B=t.useRef(C);B.current=C,t.useEffect(()=>{var w;(w=n.current)==null||w.focus({preventScroll:!0})},[b.tag]);const T=t.useCallback((w,k)=>{var G;const{correct:E,total:M,percentage:U}=s.scoreAssessment(l,w),I={answers:w,correct:E,total:M,percentage:U,passed:o!==void 0?U>=o:!0,timeElapsedSeconds:k.timeElapsedSeconds,wasAutoSubmitted:k.wasAutoSubmitted};v({tag:"results",result:I}),(G=B.current)==null||G.call(B,I)},[l,o]),u=t.useCallback(()=>{R(),v({tag:"intro"})},[R]);if(b.tag==="intro")return e.jsx("div",{ref:n,tabIndex:-1,className:s.cn("max-w-2xl mx-auto outline-none",S),style:h,children:e.jsx(V,{icon:e.jsx(i.ShieldCheck,{className:"size-7 text-primary"}),title:d,description:N,questionCount:l.length,timeLimitSeconds:j,passingScore:o,startLabel:"Begin Exam",onStart:()=>v({tag:"exam"}),readOnly:r,children:x&&e.jsx(s.Alert,{className:"text-left mb-6",children:e.jsx(s.AlertDescription,{children:x})})})});if(b.tag==="exam")return e.jsx("div",{ref:n,tabIndex:-1,className:s.cn("outline-none",S),style:h,children:e.jsx(A.ExamSession,{questions:l,timeLimitSeconds:j,timeElapsedSeconds:z,autoSubmitOnTimeout:f,timeWarningThreshold:c,allowBackNavigation:a,confirmBeforeSubmit:!0,examTitle:d,onSubmit:T,readOnly:r})});const{result:p}=b;return e.jsx("div",{ref:n,tabIndex:-1,className:s.cn("max-w-2xl mx-auto outline-none",S),style:h,children:e.jsx(Y,{title:d,percentage:p.percentage,passed:p.passed,correct:p.correct,total:p.total,timeElapsedSeconds:p.timeElapsedSeconds,answers:p.answers,questions:l,allowRetake:m,onRetake:u,retakeLabel:"Retake Exam",showReview:g,readOnly:r,extraBadges:p.wasAutoSubmitted?e.jsx(s.Badge,{variant:"outline",className:"text-sm px-3 py-1 mb-2 ml-2",children:"Auto-submitted"}):null})})}const se=L.withProGate(ee,"ExamModule");function te({title:d,description:N,questions:x=[],requireAll:l=!1,showProgress:j=!0,thankYouTitle:o="Thank You!",thankYouMessage:a,onComplete:f,allowRestart:c=!1,readOnly:m=!1,className:g,style:C}){const[r,S]=t.useState({tag:"intro"}),h=t.useRef(null),b=t.useRef(null);t.useEffect(()=>{var B;(B=b.current)==null||B.focus({preventScroll:!0})},[r.tag]);function v(B){const T=h.current?Math.floor((Date.now()-h.current)/1e3):0,u={answers:B,totalQuestions:x.length,answeredCount:B.length,timeElapsedSeconds:T};S({tag:"thankYou",result:u}),f==null||f(u)}function n(){h.current=null,S({tag:"intro"})}function z(){h.current=Date.now(),S({tag:"survey"})}if(r.tag==="intro")return e.jsx("div",{ref:b,tabIndex:-1,className:s.cn("max-w-2xl mx-auto outline-none",g),style:C,children:e.jsx(s.Card,{children:e.jsxs(s.CardContent,{className:"pt-8 pb-8 text-center",children:[e.jsx("div",{className:"mx-auto mb-4 w-14 h-14 rounded-full bg-primary/10 flex items-center justify-center",children:e.jsx(i.ClipboardList,{className:"size-7 text-primary"})}),e.jsx("h2",{className:"text-2xl font-bold text-foreground mb-2",children:d}),N&&e.jsx("p",{className:"text-muted-foreground mb-6 max-w-md mx-auto",children:N}),e.jsx("div",{className:"flex flex-wrap justify-center gap-2 mb-8",children:e.jsxs(s.Badge,{variant:"outline",className:"gap-1.5",children:[e.jsx(i.HelpCircle,{className:"size-3.5"}),x.length," questions"]})}),e.jsxs(s.Button,{size:"lg",onClick:z,disabled:m,children:[e.jsx(i.Play,{className:"size-4 mr-2"}),"Begin Survey"]})]})})});if(r.tag==="survey")return e.jsx("div",{ref:b,tabIndex:-1,className:s.cn("outline-none",g),style:C,children:e.jsx(A.SurveyForm,{title:d,questions:x,requireAll:l,showProgress:j,onSubmit:v,readOnly:m})});const{result:R}=r;return e.jsx("div",{ref:b,tabIndex:-1,className:s.cn("max-w-2xl mx-auto outline-none",g),style:C,children:e.jsx(s.Card,{children:e.jsxs(s.CardContent,{className:"pt-8 pb-8 text-center",children:[e.jsx("div",{className:"mx-auto mb-4 w-14 h-14 rounded-full bg-success/10 flex items-center justify-center",children:e.jsx(i.CheckCircle2,{className:"size-7 text-success"})}),e.jsx("h2",{className:"text-2xl font-bold text-foreground mb-2",children:o}),e.jsx("p",{className:"text-muted-foreground mb-6 max-w-md mx-auto",children:a??"Your responses have been recorded. Thank you for your feedback!"}),e.jsxs("div",{className:"grid grid-cols-2 gap-3 max-w-sm mx-auto mb-6",children:[e.jsx(s.StatCard,{icon:e.jsx(i.HelpCircle,{}),label:"Answered",description:"Questions completed",value:`${R.answeredCount}/${R.totalQuestions}`}),e.jsx(s.StatCard,{icon:e.jsx(i.Clock,{}),label:"Time",description:"Total elapsed",value:s.formatDuration(R.timeElapsedSeconds)})]}),c&&e.jsxs(s.Button,{variant:"outline",onClick:n,disabled:m,children:[e.jsx(i.RotateCcw,{className:"size-4 mr-2"}),"Take Again"]})]})})})}const re=L.withProGate(te,"SurveyModule");function ne({courseTitle:d,gradeItems:N=[],categories:x,overallGrade:l,showWeights:j,progressData:o,reviewData:a,readOnly:f=!1,className:c,style:m}){const[g,C]=t.useState(null),r=t.useRef(null);t.useEffect(()=>{var n;(n=r.current)==null||n.focus({preventScroll:!0})},[g]);function S(n){a!=null&&a[n.uid]&&C(n.uid)}function h(){C(null)}const b=g?N.find(n=>n.uid===g):null,v=g?a==null?void 0:a[g]:null;return e.jsxs("div",{ref:r,tabIndex:-1,className:s.cn("outline-none",c),style:m,children:[e.jsxs("div",{className:"flex items-center justify-between mb-6",children:[e.jsxs("div",{children:[d&&e.jsx("h2",{className:"text-xl font-bold text-foreground",children:d}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Grade Center"})]}),l&&e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(s.GradeIndicator,{percentage:l.percentage,letterGrade:l.letterGrade,size:"medium"}),e.jsxs("div",{className:"text-right",children:[e.jsxs("div",{className:"text-sm font-medium text-foreground",children:[l.pointsEarned,"/",l.pointsPossible," pts"]}),l.letterGrade&&e.jsx("div",{className:"text-xs text-muted-foreground",children:l.letterGrade})]})]})]}),e.jsx(s.Separator,{className:"mb-6"}),b&&v?e.jsxs("div",{children:[e.jsxs(s.Button,{variant:"ghost",size:"sm",onClick:h,className:"mb-4",children:[e.jsx(i.ArrowLeft,{className:"size-4 mr-1.5"}),"Back to Grades"]}),e.jsx(s.Card,{className:"mb-4",children:e.jsxs(s.CardContent,{className:"py-3 px-4",children:[e.jsx("h3",{className:"font-semibold text-foreground",children:b.name}),b.score!==null&&e.jsxs("p",{className:"text-sm text-muted-foreground",children:["Score: ",b.score,"/",b.maxScore," (",Math.round(b.score/b.maxScore*100),"%)"]})]})}),e.jsx(A.AssessmentReview,{questions:v.questions,sessionAnswers:v.sessionAnswers,score:v.score,showCorrectAnswers:!0})]}):e.jsxs(s.Tabs,{defaultValue:"grades",children:[o&&e.jsxs(s.TabsList,{className:"mb-6",children:[e.jsxs(s.TabsTrigger,{value:"grades",children:[e.jsx(i.BookOpen,{className:"size-4 mr-1.5"}),"Grades"]}),e.jsxs(s.TabsTrigger,{value:"progress",children:[e.jsx(i.BarChart3,{className:"size-4 mr-1.5"}),"Progress"]})]}),e.jsx(s.TabsContent,{value:"grades",children:e.jsx(A.GradebookTable,{items:N,categories:x,overallGrade:l,showWeights:j,onItemClick:S,readOnly:f})}),o&&e.jsx(s.TabsContent,{value:"progress",children:e.jsx(A.ProgressDashboard,{overallProgress:o.overallProgress,totalTimeSpent:o.totalTimeSpent,modules:o.modules,recentActivity:o.recentActivity,streak:o.streak,achievements:o.achievements})})]})]})}const ae=L.withProGate(ne,"GradeCenterModule"),le={text:"Text Entry",file:"File Upload",url:"URL Submission"};function ie({title:d,instructions:N,dueDate:x,maxScore:l,submissionTypes:j=["text","file"],fileConstraints:o,rubric:a,existingSubmission:f,status:c="not_started",grade:m,onSubmit:g,onComplete:C,onSaveDraft:r,readOnly:S=!1,className:h,style:b}){const v=c==="submitted"||c==="graded"?{tag:"confirmation",submission:f??{}}:{tag:"instructions"},[n,z]=t.useState(v),R=t.useRef(null);t.useEffect(()=>{var k;(k=R.current)==null||k.focus({preventScroll:!0})},[n.tag]);const B=t.useMemo(()=>Array.isArray(a)?a.reduce((k,E)=>k+Math.max(...E.levels.map(M=>M.points)),0):0,[a]);function T(k){g==null||g(k),C==null||C({submission:k,status:"submitted"}),z({tag:"confirmation",submission:k})}function u(k){r==null||r(k),C==null||C({submission:k,status:"draft"})}const p=c==="not_started"||c==="draft"||c==="resubmit";if(n.tag==="instructions")return e.jsx("div",{ref:R,tabIndex:-1,className:s.cn("max-w-2xl mx-auto outline-none",h),style:b,children:e.jsx(s.Card,{children:e.jsxs(s.CardContent,{className:"pt-8 pb-8",children:[e.jsxs("div",{className:"text-center mb-6",children:[e.jsx("div",{className:"mx-auto mb-4 w-14 h-14 rounded-full bg-primary/10 flex items-center justify-center",children:e.jsx(i.FileEdit,{className:"size-7 text-primary"})}),e.jsx("h2",{className:"text-2xl font-bold text-foreground mb-2",children:d})]}),e.jsxs("div",{className:"flex flex-wrap justify-center gap-2 mb-6",children:[x&&e.jsx(s.DueDateDisplay,{dueDate:x,size:"small"}),l!==void 0&&e.jsxs(s.Badge,{variant:"outline",className:"gap-1.5",children:[e.jsx(i.CheckCircle2,{className:"size-3.5"}),l," points"]}),e.jsxs(s.Badge,{variant:"outline",className:"gap-1.5",children:[e.jsx(i.Paperclip,{className:"size-3.5"}),j.map(k=>le[k]).join(", ")]}),e.jsx(s.StatusBadge,{status:c})]}),e.jsx(s.Separator,{className:"my-6"}),e.jsx("div",{className:"prose prose-sm text-foreground mb-6",children:N}),Array.isArray(a)&&a.length>0&&e.jsxs(e.Fragment,{children:[e.jsx(s.Separator,{className:"my-6"}),e.jsx(A.RubricView,{criteria:a,maxScore:B})]}),p&&!S&&e.jsx("div",{className:"text-center mt-8",children:e.jsxs(s.Button,{size:"lg",onClick:()=>z({tag:"work"}),disabled:S,children:[e.jsx(i.Play,{className:"size-4 mr-2"}),"Start Assignment"]})})]})})});if(n.tag==="work")return e.jsxs("div",{ref:R,tabIndex:-1,className:s.cn("outline-none",h),style:b,children:[e.jsxs(s.Button,{variant:"ghost",size:"sm",onClick:()=>z({tag:"instructions"}),className:"mb-4",children:[e.jsx(i.ArrowLeft,{className:"size-4 mr-1.5"}),"Back to Instructions"]}),e.jsx(A.AssignmentSubmission,{title:d,instructions:N,dueDate:x,maxScore:l,status:c,submissionTypes:j,existingSubmission:f,fileConstraints:o,grade:m,onSubmit:T,onSaveDraft:u,readOnly:S})]});const{submission:w}=n;return e.jsx("div",{ref:R,tabIndex:-1,className:s.cn("max-w-2xl mx-auto outline-none",h),style:b,children:e.jsx(s.Card,{children:e.jsxs(s.CardContent,{className:"pt-8 pb-8",children:[e.jsxs("div",{className:"text-center mb-6",children:[e.jsx("div",{className:"mx-auto mb-4 w-14 h-14 rounded-full bg-success/10 flex items-center justify-center",children:e.jsx(i.CheckCircle2,{className:"size-7 text-success"})}),e.jsx("h2",{className:"text-xl font-bold text-foreground mb-2",children:c==="graded"?"Assignment Graded":"Submission Received"}),e.jsxs("div",{className:"flex justify-center gap-2 mb-4",children:[e.jsx(s.StatusBadge,{status:c}),x&&e.jsx(s.DueDateDisplay,{dueDate:x,size:"small"})]})]}),c==="graded"&&m&&e.jsxs("div",{className:"text-center mb-6",children:[e.jsx(s.GradeIndicator,{percentage:l?Math.round(m.score/l*100):0,size:"large"}),e.jsxs("p",{className:"text-sm text-muted-foreground mt-2",children:[m.score,"/",l," points"]}),m.feedback&&e.jsx(s.Alert,{className:"text-left mt-4",children:e.jsx(s.AlertDescription,{children:m.feedback})}),Array.isArray(a)&&m.rubricLevels&&e.jsxs(e.Fragment,{children:[e.jsx(s.Separator,{className:"my-6"}),e.jsx(A.RubricView,{criteria:a,selectedLevels:m.rubricLevels,totalScore:m.score,maxScore:B})]})]}),e.jsx(s.Separator,{className:"my-6"}),e.jsx("h3",{className:"text-sm font-semibold text-foreground mb-3",children:"What You Submitted"}),e.jsxs("div",{className:"space-y-2 text-sm text-muted-foreground",children:[w.textContent&&e.jsxs("div",{className:"flex items-start gap-2",children:[e.jsx(i.FileText,{className:"size-4 mt-0.5 shrink-0"}),e.jsx("span",{className:"line-clamp-2",children:w.textContent.replace(/<[^>]*>/g,"")})]}),w.files&&w.files.length>0&&e.jsxs("div",{className:"flex items-start gap-2",children:[e.jsx(i.Paperclip,{className:"size-4 mt-0.5 shrink-0"}),e.jsxs("span",{children:[w.files.length," file",w.files.length!==1?"s":""," uploaded"]})]}),w.url&&e.jsxs("div",{className:"flex items-start gap-2",children:[e.jsx(i.Link,{className:"size-4 mt-0.5 shrink-0"}),e.jsx("span",{className:"truncate",children:w.url})]})]}),p&&!S&&e.jsx("div",{className:"text-center mt-8",children:e.jsxs(s.Button,{variant:"outline",onClick:()=>z({tag:"work"}),children:[e.jsx(i.FileEdit,{className:"size-4 mr-2"}),"Edit Submission"]})})]})})})}const ce=L.withProGate(ie,"AssignmentModule");function oe({courseTitle:d,recipientName:N,organizationName:x,organizationLogo:l,signatory:j,completionDate:o,certificateVariant:a="modern",requirements:f,overallProgress:c,onRequirementClick:m,onComplete:g,readOnly:C=!1,className:r,style:S}){const{allComplete:h,completedCount:b,derivedProgress:v}=t.useMemo(()=>{const p=f.filter(E=>E.completed).length,w=f.length,k=w>0?Math.round(p/w*100):0;return{allComplete:p===w,completedCount:p,derivedProgress:k}},[f]),n=c??v,[z,R]=t.useState({tag:"requirements"}),B=t.useRef(null),T=t.useRef(!1);t.useEffect(()=>{var p;(p=B.current)==null||p.focus({preventScroll:!0})},[z.tag]);const u=t.useRef(g);return u.current=g,t.useEffect(()=>{var p;z.tag==="certificate"&&!T.current&&(T.current=!0,(p=u.current)==null||p.call(u))},[z.tag]),z.tag==="requirements"?e.jsx("div",{ref:B,tabIndex:-1,className:s.cn("max-w-2xl mx-auto outline-none",r),style:S,children:e.jsx(s.Card,{children:e.jsxs(s.CardContent,{className:"pt-8 pb-8",children:[e.jsxs("div",{className:"text-center mb-6",children:[e.jsx(s.ProgressRing,{value:n,size:100,strokeWidth:8,color:h?"var(--success)":"var(--primary)",className:"mx-auto mb-4 text-foreground"}),e.jsx("h2",{className:"text-xl font-bold text-foreground mb-2",children:d}),e.jsx("p",{className:"text-sm text-muted-foreground",children:h?"All requirements met — your certificate is ready!":`${b} of ${f.length} requirements complete`})]}),e.jsx(A.RequirementsChecklist,{requirements:f,onRequirementClick:C?void 0:m,className:"mb-6"}),h&&e.jsx("div",{className:"text-center mt-6",children:e.jsxs(s.Button,{size:"lg",onClick:()=>R({tag:"certificate"}),disabled:C,children:[e.jsx(i.Award,{className:"size-4 mr-2"}),"View Certificate"]})})]})})}):e.jsxs("div",{ref:B,tabIndex:-1,className:s.cn("outline-none",r),style:S,children:[e.jsxs(s.Button,{variant:"ghost",size:"sm",onClick:()=>R({tag:"requirements"}),className:"mb-4",children:[e.jsx(i.ArrowLeft,{className:"size-4 mr-1.5"}),"Back to Requirements"]}),e.jsxs("div",{className:"text-center mb-8",children:[e.jsx("div",{className:"mx-auto mb-4 w-14 h-14 rounded-full bg-success/10 flex items-center justify-center",children:e.jsx(i.PartyPopper,{className:"size-7 text-success"})}),e.jsx("h2",{className:"text-2xl font-bold text-foreground mb-2",children:"Congratulations!"}),e.jsxs("p",{className:"text-muted-foreground",children:["You've completed all requirements for"," ",e.jsx("span",{className:"font-medium text-foreground",children:d})]})]}),e.jsx(A.CertificateViewer,{recipientName:N,courseTitle:d,completionDate:o??new Date().toISOString().split("T")[0],organizationName:x,organizationLogo:l,signatory:j,variant:a,showActions:!0})]})}const de=L.withProGate(oe,"CertificateModule");function ue({forumTitle:d,topics:N=[],currentUser:x,threads:l={},onCreateTopic:j,onReply:o,onToggleLike:a,onMarkAnswer:f,onTopicOpen:c,readOnly:m,className:g,style:C}){const[r,S]=t.useState(null),[h,b]=t.useState(""),[v,n]=t.useState("newest"),z=t.useRef(null);t.useEffect(()=>{var M;(M=z.current)==null||M.focus({preventScroll:!0})},[r]);const R=t.useRef(c);R.current=c;const B=t.useCallback(M=>{var U;S(M),(U=R.current)==null||U.call(R,M)},[]),T=t.useCallback(()=>{S(null)},[]),u=r?l[r]:null,p=r?N.find(M=>M.uid===r):null,w=t.useCallback((M,U)=>{r&&(o==null||o(r,M,U))},[r,o]),k=t.useCallback(M=>{r&&(a==null||a(r,M))},[r,a]),E=t.useCallback(M=>{r&&(f==null||f(r,M))},[r,f]);return e.jsx("div",{ref:z,tabIndex:-1,className:s.cn("outline-none",g),style:C,children:r&&u?e.jsxs("div",{children:[e.jsxs(s.Button,{variant:"ghost",size:"sm",onClick:T,className:"mb-4",children:[e.jsx(i.ArrowLeft,{className:"size-4 mr-1.5"}),"Back to Topics"]}),e.jsx(A.DiscussionThread,{title:(p==null?void 0:p.title)??"",rootPost:u.rootPost,replies:u.replies,currentUser:x,onReply:w,onToggleLike:a?k:void 0,onMarkAnswer:f?E:void 0,readOnly:m})]}):r&&!u?e.jsxs("div",{children:[e.jsxs(s.Button,{variant:"ghost",size:"sm",onClick:T,className:"mb-4",children:[e.jsx(i.ArrowLeft,{className:"size-4 mr-1.5"}),"Back to Topics"]}),e.jsx(s.EmptyState,{title:"No discussion yet",description:"Be the first to start this conversation."})]}):e.jsx(A.ForumBoard,{title:d,topics:N,currentUser:x,onTopicClick:B,onCreateTopic:j,sortOrder:v,onSortChange:n,searchQuery:h,onSearchChange:b,readOnly:m})})}const xe=L.withProGate(ue,"DiscussionModule");function me({studentName:d,overallProgress:N,totalTimeSpent:x,modules:l,recentActivity:j,streak:o,achievements:a,enrolledCourses:f,onCourseClick:c,announcements:m=[],onAnnouncementSelect:g,onMarkRead:C,readOnly:r=!1,className:S,style:h}){const b=t.useRef(null);t.useEffect(()=>{var n;(n=b.current)==null||n.focus({preventScroll:!0})},[]);const v=m.filter(n=>!n.isRead).length;return e.jsxs("div",{ref:b,tabIndex:-1,className:s.cn("outline-none",S),style:h,children:[e.jsxs("div",{className:"flex items-center justify-between mb-6",children:[e.jsxs("h2",{className:"text-xl font-bold text-foreground",children:["Welcome back, ",d]}),e.jsx(s.ProgressRing,{value:N,size:48,strokeWidth:4})]}),e.jsx(s.Separator,{className:"mb-6"}),e.jsxs(s.Tabs,{defaultValue:"overview",children:[e.jsxs(s.TabsList,{className:"mb-6",children:[e.jsxs(s.TabsTrigger,{value:"overview",children:[e.jsx(i.BarChart3,{className:"size-4 mr-1.5"}),"Overview"]}),e.jsxs(s.TabsTrigger,{value:"courses",children:[e.jsx(i.BookOpen,{className:"size-4 mr-1.5"}),"My Courses"]}),e.jsxs(s.TabsTrigger,{value:"announcements",children:[e.jsx(i.Bell,{className:"size-4 mr-1.5"}),"Announcements",v>0&&e.jsx("span",{className:"ml-1.5 inline-flex items-center justify-center rounded-full bg-primary text-primary-foreground text-xs font-medium min-w-5 h-5 px-1.5",children:v})]})]}),e.jsx(s.TabsContent,{value:"overview",children:e.jsx(A.ProgressDashboard,{overallProgress:N,totalTimeSpent:x,modules:l,recentActivity:j,streak:o,achievements:a})}),e.jsx(s.TabsContent,{value:"courses",children:e.jsx(A.CourseCatalog,{courses:f,onCourseClick:n=>!r&&c(n.uid),showSearch:!0,viewMode:"grid",readOnly:r})}),e.jsx(s.TabsContent,{value:"announcements",children:e.jsx(A.AnnouncementFeed,{announcements:m,onSelect:g,onMarkRead:C,readOnly:r})})]})]})}const he=L.withProGate(me,"StudentDashboardModule");function fe({title:d,courses:N=[],categories:x=[],enrollmentData:l,onEnroll:j,onCourseOpen:o,readOnly:a=!1,className:f,style:c}){var b;const[m,g]=t.useState({tag:"browse"}),C=t.useRef(null);t.useEffect(()=>{var v;(v=C.current)==null||v.focus({preventScroll:!0})},[m.tag]);function r(v){l!=null&&l[v]?g({tag:"enroll",courseUid:v}):o==null||o(v)}function S(){g({tag:"browse"})}function h(v){j(v),g({tag:"browse"})}return e.jsxs("div",{ref:C,tabIndex:-1,className:s.cn("outline-none",f),style:c,children:[d&&m.tag==="browse"&&e.jsx("h2",{className:"text-xl font-bold text-foreground mb-4",children:d}),m.tag==="enroll"?e.jsxs("div",{children:[e.jsxs(s.Button,{variant:"ghost",size:"sm",onClick:S,className:"mb-4",children:[e.jsx(i.ArrowLeft,{className:"size-4 mr-1.5"}),"Back to Catalog"]}),l!=null&&l[m.courseUid]?e.jsx(A.EnrollmentWizard,{course:l[m.courseUid].course,prerequisites:l[m.courseUid].prerequisites,onEnroll:h,onCancel:S}):e.jsx(s.Card,{children:e.jsxs(s.CardContent,{className:"pt-6",children:[e.jsx("h3",{className:"text-lg font-semibold text-foreground mb-2",children:((b=N.find(v=>v.uid===m.courseUid))==null?void 0:b.title)??"Course"}),e.jsx("p",{className:"text-sm text-muted-foreground mb-4",children:"Enrollment details are loading. You can enroll directly below."}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(s.Button,{variant:"outline",onClick:S,children:"Cancel"}),e.jsx(s.Button,{onClick:()=>h(m.courseUid),disabled:a,children:"Enroll Now"})]})]})})]}):e.jsx(A.CourseCatalog,{courses:N,categories:x,onCourseClick:v=>r(v.uid),onEnroll:v=>r(v.uid),readOnly:a})]})}const je=L.withProGate(fe,"CourseCatalogModule");function ge({student:d,enrolledCourses:N=[],achievements:x=[],certificates:l=[],stats:j,onCourseClick:o,certificateData:a,readOnly:f=!1,className:c,style:m}){const[g,C]=t.useState(null),r=t.useRef(null);t.useEffect(()=>{var n;(n=r.current)==null||n.focus({preventScroll:!0})},[g]);function S(n){f||a!=null&&a[n]&&C(n)}function h(){C(null)}const b=g?a==null?void 0:a[g]:null,v=g?l.find(n=>n.uid===g):null;return e.jsxs("div",{ref:r,tabIndex:-1,className:s.cn("outline-none",c),style:m,children:[e.jsxs("div",{className:"flex items-center gap-4 mb-6",children:[e.jsx(s.UserAvatar,{displayName:d.displayName,avatarUrl:d.avatarUrl,size:"medium"}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[e.jsx("h2",{className:"text-xl font-bold text-foreground",children:d.displayName}),d.role&&e.jsx(s.Badge,{variant:"secondary",children:d.role})]}),d.email&&e.jsx("p",{className:"text-sm text-muted-foreground",children:d.email})]})]}),e.jsx(s.Separator,{className:"mb-6"}),v&&b?e.jsxs("div",{children:[e.jsxs(s.Button,{variant:"ghost",size:"sm",onClick:h,className:"mb-4",children:[e.jsx(i.ArrowLeft,{className:"size-4 mr-1.5"}),"Back to Profile"]}),e.jsx(A.CertificateViewer,{...b,showActions:!0})]}):e.jsxs(s.Tabs,{defaultValue:"profile",children:[e.jsxs(s.TabsList,{className:"mb-6",children:[e.jsxs(s.TabsTrigger,{value:"profile",children:[e.jsx(i.User,{className:"size-4 mr-1.5"}),"Profile"]}),e.jsxs(s.TabsTrigger,{value:"courses",children:[e.jsx(i.BookOpen,{className:"size-4 mr-1.5"}),"Courses"]}),e.jsxs(s.TabsTrigger,{value:"achievements",children:[e.jsx(i.Trophy,{className:"size-4 mr-1.5"}),"Achievements"]}),e.jsxs(s.TabsTrigger,{value:"certificates",children:[e.jsx(i.Award,{className:"size-4 mr-1.5"}),"Certificates"]})]}),e.jsx(s.TabsContent,{value:"profile",children:e.jsx(A.StudentProfile,{student:d,enrolledCourses:N,achievements:x,stats:j,onCourseClick:o,showCourses:!1,showAchievements:!1,readOnly:!0})}),e.jsx(s.TabsContent,{value:"courses",children:N.length>0?e.jsx(s.Card,{children:e.jsx(s.CardContent,{className:"p-0 divide-y divide-border",children:N.map(n=>e.jsxs("div",{className:s.cn("flex items-center gap-3 px-4 py-3 transition-colors",o&&!f&&"cursor-pointer hover:bg-muted/50"),onClick:o&&!f?()=>o(n.uid):void 0,children:[e.jsx(s.ProgressRing,{value:n.progress,size:32,strokeWidth:3}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("p",{className:"text-sm font-medium text-foreground truncate",children:n.title}),n.lastAccessedAt&&e.jsx("p",{className:"text-xs text-muted-foreground",children:s.formatTimestamp(n.lastAccessedAt)})]}),e.jsxs("span",{className:"text-xs text-muted-foreground whitespace-nowrap",children:[Math.round(n.progress),"%"]})]},n.uid))})}):e.jsxs("div",{className:"py-12 text-center",children:[e.jsx(i.BookOpen,{className:"size-10 text-muted-foreground mx-auto mb-3"}),e.jsx("p",{className:"text-sm font-medium text-foreground",children:"No courses yet"}),e.jsx("p",{className:"text-xs text-muted-foreground mt-1",children:"Enrolled courses will appear here."})]})}),e.jsx(s.TabsContent,{value:"achievements",children:x.length>0?e.jsx("div",{className:"grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-4 gap-2",children:x.map(n=>e.jsx(s.AchievementBadge,{title:n.name,description:n.description,icon:n.iconUrl?e.jsx("img",{src:n.iconUrl,alt:n.name,className:"w-12 h-12"}):void 0,earnedDate:n.earnedAt},n.uid))}):e.jsxs("div",{className:"py-12 text-center",children:[e.jsx(i.Trophy,{className:"size-10 text-muted-foreground mx-auto mb-3"}),e.jsx("p",{className:"text-sm font-medium text-foreground",children:"No achievements yet"}),e.jsx("p",{className:"text-xs text-muted-foreground mt-1",children:"Achievements will appear here as they are earned."})]})}),e.jsx(s.TabsContent,{value:"certificates",children:l.length>0?e.jsx(s.Card,{children:e.jsx(s.CardContent,{className:"p-0 divide-y divide-border",children:l.map(n=>e.jsxs("div",{className:s.cn("flex items-center gap-3 px-4 py-3 transition-colors",(a==null?void 0:a[n.uid])&&!f&&"cursor-pointer hover:bg-muted/50"),onClick:a!=null&&a[n.uid]&&!f?()=>S(n.uid):void 0,children:[e.jsx("div",{className:"w-9 h-9 rounded-lg bg-primary/10 flex items-center justify-center text-primary",children:e.jsx(i.Award,{size:20})}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("p",{className:"text-sm font-medium text-foreground truncate",children:n.courseName}),e.jsxs("p",{className:"text-xs text-muted-foreground",children:["Issued"," ",new Date(n.issuedAt).toLocaleDateString()]})]}),(a==null?void 0:a[n.uid])&&e.jsx(s.Badge,{variant:"secondary",className:"text-xs",children:"View"})]},n.uid))})}):e.jsxs("div",{className:"py-12 text-center",children:[e.jsx(i.Award,{className:"size-10 text-muted-foreground mx-auto mb-3"}),e.jsx("p",{className:"text-sm font-medium text-foreground",children:"No certificates yet"}),e.jsx("p",{className:"text-xs text-muted-foreground mt-1",children:"Certificates will appear here once courses are completed."})]})})]})]})}const pe=L.withProGate(ge,"StudentProfileModule");exports.AssignmentModule=ce;exports.CertificateModule=de;exports.CourseCatalogModule=je;exports.CoursePlayer=O;exports.DiscussionModule=xe;exports.ExamModule=se;exports.FlashcardLab=J;exports.GradeCenterModule=ae;exports.QuizModule=_;exports.StudentDashboardModule=he;exports.StudentProfileModule=pe;exports.SurveyModule=re;