@hed-hog/lms 0.0.364 → 0.0.366

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 (290) hide show
  1. package/dist/bitcode-wallet/bitcode-wallet.service.d.ts +1 -0
  2. package/dist/bitcode-wallet/bitcode-wallet.service.d.ts.map +1 -1
  3. package/dist/bitcode-wallet/bitcode-wallet.service.js +22 -3
  4. package/dist/bitcode-wallet/bitcode-wallet.service.js.map +1 -1
  5. package/dist/class-group/class-group.controller.d.ts +1 -0
  6. package/dist/class-group/class-group.controller.d.ts.map +1 -1
  7. package/dist/class-group/class-group.service.d.ts +1 -0
  8. package/dist/class-group/class-group.service.d.ts.map +1 -1
  9. package/dist/course/course-export-scorm12-worker.service.d.ts +21 -0
  10. package/dist/course/course-export-scorm12-worker.service.d.ts.map +1 -0
  11. package/dist/course/course-export-scorm12-worker.service.js +109 -0
  12. package/dist/course/course-export-scorm12-worker.service.js.map +1 -0
  13. package/dist/course/course-export-scorm12.service.d.ts +42 -0
  14. package/dist/course/course-export-scorm12.service.d.ts.map +1 -0
  15. package/dist/course/course-export-scorm12.service.js +628 -0
  16. package/dist/course/course-export-scorm12.service.js.map +1 -0
  17. package/dist/course/course-export.service.d.ts +84 -0
  18. package/dist/course/course-export.service.d.ts.map +1 -0
  19. package/dist/course/course-export.service.js +237 -0
  20. package/dist/course/course-export.service.js.map +1 -0
  21. package/dist/course/course-structure.controller.d.ts +20 -10
  22. package/dist/course/course-structure.controller.d.ts.map +1 -1
  23. package/dist/course/course-structure.controller.js +20 -4
  24. package/dist/course/course-structure.controller.js.map +1 -1
  25. package/dist/course/course-structure.service.d.ts +12 -4
  26. package/dist/course/course-structure.service.d.ts.map +1 -1
  27. package/dist/course/course-structure.service.js +98 -23
  28. package/dist/course/course-structure.service.js.map +1 -1
  29. package/dist/course/course-video-agent-pipeline.service.d.ts +70 -0
  30. package/dist/course/course-video-agent-pipeline.service.d.ts.map +1 -0
  31. package/dist/course/course-video-agent-pipeline.service.js +398 -0
  32. package/dist/course/course-video-agent-pipeline.service.js.map +1 -0
  33. package/dist/course/course-video-hls.service.d.ts +71 -0
  34. package/dist/course/course-video-hls.service.d.ts.map +1 -0
  35. package/dist/course/course-video-hls.service.js +784 -0
  36. package/dist/course/course-video-hls.service.js.map +1 -0
  37. package/dist/course/course.controller.d.ts +47 -13
  38. package/dist/course/course.controller.d.ts.map +1 -1
  39. package/dist/course/course.controller.js +40 -26
  40. package/dist/course/course.controller.js.map +1 -1
  41. package/dist/course/course.mcp-tools.js +1 -1
  42. package/dist/course/course.mcp-tools.js.map +1 -1
  43. package/dist/course/course.module.d.ts.map +1 -1
  44. package/dist/course/course.module.js +16 -0
  45. package/dist/course/course.module.js.map +1 -1
  46. package/dist/course/course.service.d.ts +8 -9
  47. package/dist/course/course.service.d.ts.map +1 -1
  48. package/dist/course/course.service.js +93 -50
  49. package/dist/course/course.service.js.map +1 -1
  50. package/dist/course/dto/cleanup-course-storage.dto.d.ts +1 -1
  51. package/dist/course/dto/cleanup-course-storage.dto.d.ts.map +1 -1
  52. package/dist/course/dto/cleanup-course-storage.dto.js +1 -0
  53. package/dist/course/dto/cleanup-course-storage.dto.js.map +1 -1
  54. package/dist/course/dto/cleanup-upload-history.dto.d.ts +1 -1
  55. package/dist/course/dto/cleanup-upload-history.dto.d.ts.map +1 -1
  56. package/dist/course/dto/cleanup-upload-history.dto.js +1 -1
  57. package/dist/course/dto/cleanup-upload-history.dto.js.map +1 -1
  58. package/dist/course/dto/create-course-bulk-job.dto.d.ts +2 -1
  59. package/dist/course/dto/create-course-bulk-job.dto.d.ts.map +1 -1
  60. package/dist/course/dto/create-course-bulk-job.dto.js +6 -1
  61. package/dist/course/dto/create-course-bulk-job.dto.js.map +1 -1
  62. package/dist/course/dto/create-course-export.dto.d.ts +14 -0
  63. package/dist/course/dto/create-course-export.dto.d.ts.map +1 -0
  64. package/dist/course/dto/create-course-export.dto.js +71 -0
  65. package/dist/course/dto/create-course-export.dto.js.map +1 -0
  66. package/dist/course/dto/create-course-structure-lesson.dto.d.ts +2 -2
  67. package/dist/course/dto/create-course-structure-lesson.dto.d.ts.map +1 -1
  68. package/dist/course/dto/create-course-structure-lesson.dto.js +3 -2
  69. package/dist/course/dto/create-course-structure-lesson.dto.js.map +1 -1
  70. package/dist/course/ffmpeg.util.d.ts +10 -0
  71. package/dist/course/ffmpeg.util.d.ts.map +1 -0
  72. package/dist/course/ffmpeg.util.js +79 -0
  73. package/dist/course/ffmpeg.util.js.map +1 -0
  74. package/dist/course/lms-bulk-upload-automation.service.d.ts +18 -1
  75. package/dist/course/lms-bulk-upload-automation.service.d.ts.map +1 -1
  76. package/dist/course/lms-bulk-upload-automation.service.js +106 -8
  77. package/dist/course/lms-bulk-upload-automation.service.js.map +1 -1
  78. package/dist/course/lms-bulk-upload-infra.service.d.ts +1 -0
  79. package/dist/course/lms-bulk-upload-infra.service.d.ts.map +1 -1
  80. package/dist/course/lms-bulk-upload-infra.service.js +32 -8
  81. package/dist/course/lms-bulk-upload-infra.service.js.map +1 -1
  82. package/dist/course/lms-bulk-upload.controller.d.ts +30 -3
  83. package/dist/course/lms-bulk-upload.controller.d.ts.map +1 -1
  84. package/dist/course/lms-bulk-upload.controller.js +43 -2
  85. package/dist/course/lms-bulk-upload.controller.js.map +1 -1
  86. package/dist/course/lms-bulk-upload.service.d.ts +11 -0
  87. package/dist/course/lms-bulk-upload.service.d.ts.map +1 -1
  88. package/dist/course/lms-bulk-upload.service.js +59 -6
  89. package/dist/course/lms-bulk-upload.service.js.map +1 -1
  90. package/dist/course/lms-setting.controller.d.ts +2 -1
  91. package/dist/course/lms-setting.controller.d.ts.map +1 -1
  92. package/dist/course/lms-setting.controller.js +4 -2
  93. package/dist/course/lms-setting.controller.js.map +1 -1
  94. package/dist/course/scorm12-schemas.d.ts +4 -0
  95. package/dist/course/scorm12-schemas.d.ts.map +1 -0
  96. package/dist/course/scorm12-schemas.js +9 -0
  97. package/dist/course/scorm12-schemas.js.map +1 -0
  98. package/dist/enterprise/training/training-admin.controller.d.ts +2 -0
  99. package/dist/enterprise/training/training-admin.controller.d.ts.map +1 -1
  100. package/dist/enterprise/training/training-admin.service.d.ts +2 -0
  101. package/dist/enterprise/training/training-admin.service.d.ts.map +1 -1
  102. package/dist/enterprise/training/training-student.service.d.ts +51 -0
  103. package/dist/enterprise/training/training-student.service.d.ts.map +1 -1
  104. package/dist/enterprise/training/training-student.service.js +217 -4
  105. package/dist/enterprise/training/training-student.service.js.map +1 -1
  106. package/dist/evaluation/evaluation.service.d.ts +18 -0
  107. package/dist/evaluation/evaluation.service.d.ts.map +1 -1
  108. package/dist/evaluation/evaluation.service.js +125 -0
  109. package/dist/evaluation/evaluation.service.js.map +1 -1
  110. package/dist/exam/dto/create-standalone-question.dto.d.ts +12 -0
  111. package/dist/exam/dto/create-standalone-question.dto.d.ts.map +1 -0
  112. package/dist/exam/dto/create-standalone-question.dto.js +70 -0
  113. package/dist/exam/dto/create-standalone-question.dto.js.map +1 -0
  114. package/dist/exam/exam.module.d.ts.map +1 -1
  115. package/dist/exam/exam.module.js +2 -1
  116. package/dist/exam/exam.module.js.map +1 -1
  117. package/dist/exam/exam.service.d.ts +21 -0
  118. package/dist/exam/exam.service.d.ts.map +1 -1
  119. package/dist/exam/exam.service.js +80 -0
  120. package/dist/exam/exam.service.js.map +1 -1
  121. package/dist/exam/question.controller.d.ts +27 -0
  122. package/dist/exam/question.controller.d.ts.map +1 -0
  123. package/dist/exam/question.controller.js +53 -0
  124. package/dist/exam/question.controller.js.map +1 -0
  125. package/dist/lesson-xp-map/lesson-xp-ai-calculation.service.d.ts +4 -0
  126. package/dist/lesson-xp-map/lesson-xp-ai-calculation.service.d.ts.map +1 -1
  127. package/dist/lesson-xp-map/lesson-xp-ai-calculation.service.js +161 -25
  128. package/dist/lesson-xp-map/lesson-xp-ai-calculation.service.js.map +1 -1
  129. package/dist/libraries/lms/tsconfig.tsbuildinfo +1 -1
  130. package/dist/lms-commerce-access.subscriber.d.ts +11 -0
  131. package/dist/lms-commerce-access.subscriber.d.ts.map +1 -0
  132. package/dist/lms-commerce-access.subscriber.js +74 -0
  133. package/dist/lms-commerce-access.subscriber.js.map +1 -0
  134. package/dist/lms.module.d.ts.map +1 -1
  135. package/dist/lms.module.js +16 -5
  136. package/dist/lms.module.js.map +1 -1
  137. package/dist/platforma/dto/heartbeat.dto.d.ts +9 -0
  138. package/dist/platforma/dto/heartbeat.dto.d.ts.map +1 -0
  139. package/dist/platforma/dto/heartbeat.dto.js +50 -0
  140. package/dist/platforma/dto/heartbeat.dto.js.map +1 -0
  141. package/dist/platforma/handlers/emit-certificate.handler.d.ts +27 -0
  142. package/dist/platforma/handlers/emit-certificate.handler.d.ts.map +1 -0
  143. package/dist/platforma/handlers/emit-certificate.handler.js +117 -0
  144. package/dist/platforma/handlers/emit-certificate.handler.js.map +1 -0
  145. package/dist/platforma/handlers/lesson-heartbeat.handler.d.ts +31 -0
  146. package/dist/platforma/handlers/lesson-heartbeat.handler.d.ts.map +1 -0
  147. package/dist/platforma/handlers/lesson-heartbeat.handler.js +281 -0
  148. package/dist/platforma/handlers/lesson-heartbeat.handler.js.map +1 -0
  149. package/dist/platforma/platforma-heartbeat.service.d.ts +10 -0
  150. package/dist/platforma/platforma-heartbeat.service.d.ts.map +1 -0
  151. package/dist/platforma/platforma-heartbeat.service.js +50 -0
  152. package/dist/platforma/platforma-heartbeat.service.js.map +1 -0
  153. package/dist/platforma/platforma-performance.service.d.ts +121 -0
  154. package/dist/platforma/platforma-performance.service.d.ts.map +1 -0
  155. package/dist/platforma/platforma-performance.service.js +500 -0
  156. package/dist/platforma/platforma-performance.service.js.map +1 -0
  157. package/dist/platforma/platforma-search.service.d.ts +21 -0
  158. package/dist/platforma/platforma-search.service.d.ts.map +1 -0
  159. package/dist/platforma/platforma-search.service.js +64 -0
  160. package/dist/platforma/platforma-search.service.js.map +1 -0
  161. package/dist/platforma/platforma-video.service.d.ts +39 -0
  162. package/dist/platforma/platforma-video.service.d.ts.map +1 -0
  163. package/dist/platforma/platforma-video.service.js +301 -0
  164. package/dist/platforma/platforma-video.service.js.map +1 -0
  165. package/dist/platforma/platforma.controller.d.ts +209 -1
  166. package/dist/platforma/platforma.controller.d.ts.map +1 -1
  167. package/dist/platforma/platforma.controller.js +208 -2
  168. package/dist/platforma/platforma.controller.js.map +1 -1
  169. package/dist/realtime/lms-realtime.controller.d.ts +2 -0
  170. package/dist/realtime/lms-realtime.controller.d.ts.map +1 -1
  171. package/dist/realtime/lms-realtime.controller.js +31 -0
  172. package/dist/realtime/lms-realtime.controller.js.map +1 -1
  173. package/dist/realtime/lms-realtime.service.d.ts +1 -1
  174. package/dist/realtime/lms-realtime.service.d.ts.map +1 -1
  175. package/dist/realtime/lms-realtime.service.js.map +1 -1
  176. package/dist/student-xp/dto/grant-skill-card-xp.dto.d.ts +5 -0
  177. package/dist/student-xp/dto/grant-skill-card-xp.dto.d.ts.map +1 -0
  178. package/dist/student-xp/dto/grant-skill-card-xp.dto.js +26 -0
  179. package/dist/student-xp/dto/grant-skill-card-xp.dto.js.map +1 -0
  180. package/dist/student-xp/student-xp.controller.d.ts +15 -0
  181. package/dist/student-xp/student-xp.controller.d.ts.map +1 -1
  182. package/dist/student-xp/student-xp.controller.js +24 -0
  183. package/dist/student-xp/student-xp.controller.js.map +1 -1
  184. package/dist/student-xp/student-xp.service.d.ts +16 -0
  185. package/dist/student-xp/student-xp.service.d.ts.map +1 -1
  186. package/dist/student-xp/student-xp.service.js +51 -1
  187. package/dist/student-xp/student-xp.service.js.map +1 -1
  188. package/hedhog/data/evaluation_topic.yaml +17 -0
  189. package/hedhog/data/menu.yaml +0 -17
  190. package/hedhog/data/queue_definition.yaml +48 -0
  191. package/hedhog/data/route.yaml +94 -124
  192. package/hedhog/data/setting_group.yaml +19 -19
  193. package/hedhog/frontend/app/bulk-upload-sessions/page.tsx.ejs +337 -41
  194. package/hedhog/frontend/app/certificates/models/page.tsx.ejs +182 -29
  195. package/hedhog/frontend/app/classes/_components/classes-calendar-view.tsx.ejs +277 -0
  196. package/hedhog/frontend/app/classes/page.tsx.ejs +127 -20
  197. package/hedhog/frontend/app/courses/[id]/page.tsx.ejs +69 -4
  198. package/hedhog/frontend/app/courses/[id]/structure/_components/course-export-sheet.tsx.ejs +420 -0
  199. package/hedhog/frontend/app/courses/[id]/structure/_components/course-exports-tab.tsx.ejs +308 -0
  200. package/hedhog/frontend/app/courses/[id]/structure/_components/course-overview-tab.tsx.ejs +158 -45
  201. package/hedhog/frontend/app/courses/[id]/structure/_components/course-xp-overview-tab.tsx.ejs +13 -13
  202. package/hedhog/frontend/app/courses/[id]/structure/_components/detail-lesson-xp-tab.tsx.ejs +11 -23
  203. package/hedhog/frontend/app/courses/[id]/structure/_components/detail-lesson.tsx.ejs +51 -63
  204. package/hedhog/frontend/app/courses/[id]/structure/_components/detail-panel.tsx.ejs +8 -3
  205. package/hedhog/frontend/app/courses/[id]/structure/_components/detail-session.tsx.ejs +31 -8
  206. package/hedhog/frontend/app/courses/[id]/structure/_components/drag-overlay.tsx.ejs +16 -9
  207. package/hedhog/frontend/app/courses/[id]/structure/_components/editor-course.tsx.ejs +201 -401
  208. package/hedhog/frontend/app/courses/[id]/structure/_components/editor-lesson.tsx.ejs +378 -690
  209. package/hedhog/frontend/app/courses/[id]/structure/_components/mock-data.ts.ejs +1 -2
  210. package/hedhog/frontend/app/courses/[id]/structure/_components/tree-row-lesson.tsx.ejs +3 -9
  211. package/hedhog/frontend/app/courses/[id]/structure/_components/types.ts.ejs +1 -1
  212. package/hedhog/frontend/app/courses/[id]/structure/_components/xp-premium-pills.tsx.ejs +1 -8
  213. package/hedhog/frontend/app/courses/[id]/structure/_data/adapters/course-structure.adapter.ts.ejs +6 -10
  214. package/hedhog/frontend/app/courses/[id]/structure/_data/services/course-structure.service.ts.ejs +49 -0
  215. package/hedhog/frontend/app/courses/[id]/structure/_data/types/api-course.types.ts.ejs +4 -3
  216. package/hedhog/frontend/app/courses/[id]/structure/_data/use-course-content-overview.ts.ejs +2 -1
  217. package/hedhog/frontend/app/courses/[id]/structure/_data/use-course-exports.ts.ejs +106 -0
  218. package/hedhog/frontend/app/courses/[id]/structure/_data/use-course-structure-mutations.ts.ejs +28 -1
  219. package/hedhog/frontend/app/courses/[id]/structure/_data/use-lms-settings-query.ts.ejs +0 -2
  220. package/hedhog/frontend/app/courses/page.tsx.ejs +85 -9
  221. package/hedhog/frontend/app/enterprise/[id]/page.tsx.ejs +6 -0
  222. package/hedhog/frontend/app/enterprise/_components/enterprise-classes-calendar-tab.tsx.ejs +264 -0
  223. package/hedhog/frontend/app/enterprise/page.tsx.ejs +104 -47
  224. package/hedhog/frontend/app/exams/page.tsx.ejs +38 -4
  225. package/hedhog/frontend/app/instructors/page.tsx.ejs +87 -46
  226. package/hedhog/frontend/app/paths/page.tsx.ejs +38 -4
  227. package/hedhog/frontend/app/training/page.tsx.ejs +38 -4
  228. package/hedhog/frontend/messages/en.json +44 -28
  229. package/hedhog/frontend/messages/pt.json +47 -29
  230. package/hedhog/table/course_enrollment.yaml +3 -0
  231. package/hedhog/table/course_export.yaml +62 -0
  232. package/hedhog/table/lesson_view_event.yaml +66 -0
  233. package/package.json +14 -9
  234. package/src/bitcode-wallet/bitcode-wallet.service.ts +43 -4
  235. package/src/course/course-export-scorm12-worker.service.ts +124 -0
  236. package/src/course/course-export-scorm12.service.ts +668 -0
  237. package/src/course/course-export.service.ts +280 -0
  238. package/src/course/course-structure.controller.ts +16 -2
  239. package/src/course/course-structure.service.ts +100 -7
  240. package/src/course/course-video-agent-pipeline.service.ts +471 -0
  241. package/src/course/course-video-hls.service.ts +966 -0
  242. package/src/course/course.controller.ts +33 -19
  243. package/src/course/course.mcp-tools.ts +1 -1
  244. package/src/course/course.module.ts +16 -0
  245. package/src/course/course.service.ts +119 -61
  246. package/src/course/dto/cleanup-course-storage.dto.ts +1 -0
  247. package/src/course/dto/cleanup-upload-history.dto.ts +1 -1
  248. package/src/course/dto/create-course-bulk-job.dto.ts +7 -3
  249. package/src/course/dto/create-course-export.dto.ts +56 -0
  250. package/src/course/dto/create-course-structure-lesson.dto.ts +4 -3
  251. package/src/course/ffmpeg.util.ts +65 -0
  252. package/src/course/lms-bulk-upload-automation.service.ts +156 -6
  253. package/src/course/lms-bulk-upload-infra.service.ts +39 -6
  254. package/src/course/lms-bulk-upload.controller.ts +32 -2
  255. package/src/course/lms-bulk-upload.service.ts +70 -7
  256. package/src/course/lms-setting.controller.ts +4 -2
  257. package/src/course/scorm12-schemas.ts +9 -0
  258. package/src/enterprise/training/training-student.service.ts +221 -2
  259. package/src/evaluation/evaluation.service.ts +123 -0
  260. package/src/exam/dto/create-standalone-question.dto.ts +66 -0
  261. package/src/exam/exam.module.ts +2 -1
  262. package/src/exam/exam.service.ts +86 -0
  263. package/src/exam/question.controller.ts +28 -0
  264. package/src/lesson-xp-map/lesson-xp-ai-calculation.service.ts +205 -31
  265. package/src/lms-commerce-access.subscriber.ts +88 -0
  266. package/src/lms.module.ts +16 -5
  267. package/src/platforma/dto/heartbeat.dto.ts +30 -0
  268. package/src/platforma/handlers/emit-certificate.handler.ts +117 -0
  269. package/src/platforma/handlers/lesson-heartbeat.handler.ts +343 -0
  270. package/src/platforma/platforma-heartbeat.service.ts +33 -0
  271. package/src/platforma/platforma-performance.service.ts +606 -0
  272. package/src/platforma/platforma-search.service.ts +48 -0
  273. package/src/platforma/platforma-video.service.ts +346 -0
  274. package/src/platforma/platforma.controller.ts +137 -1
  275. package/src/platforma/platforma.service.ts +268 -268
  276. package/src/realtime/lms-realtime.controller.ts +27 -1
  277. package/src/realtime/lms-realtime.service.ts +2 -1
  278. package/src/student-xp/dto/grant-skill-card-xp.dto.ts +10 -0
  279. package/src/student-xp/student-xp.controller.ts +18 -2
  280. package/src/student-xp/student-xp.service.ts +84 -2
  281. package/hedhog/data/video_resolution_profile.yaml +0 -7
  282. package/hedhog/frontend/app/video-resolution-profiles/page.tsx.ejs +0 -607
  283. package/hedhog/table/course_video_resolution_profile.yaml +0 -22
  284. package/hedhog/table/video_resolution_profile.yaml +0 -18
  285. package/src/video-resolution-profile/dto/create-video-resolution-profile.dto.ts +0 -16
  286. package/src/video-resolution-profile/dto/update-video-resolution-profile.dto.ts +0 -16
  287. package/src/video-resolution-profile/video-resolution-profile.controller.ts +0 -62
  288. package/src/video-resolution-profile/video-resolution-profile.mcp-tools.ts +0 -128
  289. package/src/video-resolution-profile/video-resolution-profile.module.ts +0 -13
  290. package/src/video-resolution-profile/video-resolution-profile.service.ts +0 -117
@@ -435,7 +435,7 @@ export function LessonXpTab({
435
435
  icon={<Cpu className="size-4 text-sky-600" />}
436
436
  total={xpMap.totalXp}
437
437
  items={areaDistribution}
438
- toneClassName="bg-linear-to-r from-sky-500/10 via-sky-500/5 to-transparent"
438
+ toneClassName=""
439
439
  />
440
440
  <DistributionCard
441
441
  title="Skills"
@@ -443,7 +443,7 @@ export function LessonXpTab({
443
443
  icon={<Zap className="size-4 text-emerald-600" />}
444
444
  total={xpMap.totalXp}
445
445
  items={skillDistribution}
446
- toneClassName="bg-linear-to-r from-emerald-500/10 via-emerald-500/5 to-transparent"
446
+ toneClassName=""
447
447
  />
448
448
  <TimelineCard
449
449
  segmentViews={segmentViews}
@@ -670,7 +670,7 @@ function TimelineCard({
670
670
 
671
671
  return (
672
672
  <Card className="min-w-0 overflow-hidden border-border/70 bg-card/95 py-0 gap-0! shadow-[0_18px_40px_-32px_rgba(15,23,42,0.45)] xl:col-span-2">
673
- <CardHeader className="border-b border-border/60 bg-linear-to-r from-slate-500/10 via-slate-500/5 to-transparent pt-3 pb-1.5!">
673
+ <CardHeader className="border-b border-border/60 pt-3 pb-1.5!">
674
674
  <div className="flex items-center justify-between gap-3">
675
675
  <div>
676
676
  <CardTitle className="text-sm font-semibold">
@@ -761,7 +761,7 @@ function LearningTypesCard({ items }: { items: DistributionItem[] }) {
761
761
 
762
762
  return (
763
763
  <Card className="min-w-0 overflow-hidden border-border/70 bg-card/95 py-0 gap-0! shadow-[0_18px_40px_-32px_rgba(15,23,42,0.45)] xl:col-span-2">
764
- <CardHeader className="border-b border-border/60 bg-linear-to-r from-violet-500/10 via-violet-500/5 to-transparent pt-3 pb-1.5!">
764
+ <CardHeader className="border-b border-border/60 pt-3 pb-1.5!">
765
765
  <div className="flex items-center justify-between gap-3">
766
766
  <CardTitle className="text-sm font-semibold">
767
767
  Tipos de aprendizado
@@ -775,7 +775,7 @@ function LearningTypesCard({ items }: { items: DistributionItem[] }) {
775
775
  {items.map((item) => (
776
776
  <div
777
777
  key={item.id}
778
- className="flex h-full flex-col justify-start gap-1.5 rounded-xl border border-border/60 bg-muted/20 px-2.5 py-2 text-xs shadow-sm transition-all duration-200 hover:-translate-y-0.5 hover:border-violet-500/20 hover:bg-background/95 hover:shadow-md"
778
+ className="flex h-full flex-col justify-start gap-1.5 rounded-xl border border-border/60 bg-muted/20 px-2.5 py-2 text-xs shadow-sm transition-all duration-200 hover:-translate-y-0.5 hover:border-border/80 hover:bg-background/95 hover:shadow-md"
779
779
  >
780
780
  <div className="flex flex-wrap items-center justify-between gap-2">
781
781
  <span className="min-w-0 flex-1 font-medium">{item.label}</span>
@@ -813,7 +813,7 @@ function SegmentsSection({
813
813
  }) {
814
814
  return (
815
815
  <Card className="min-w-0 overflow-hidden border-border/70 bg-card/95 py-0 gap-0! shadow-[0_18px_40px_-32px_rgba(15,23,42,0.45)]">
816
- <CardHeader className="border-b border-border/60 bg-linear-to-r from-cyan-500/10 via-cyan-500/5 to-transparent pt-3 pb-1.5!">
816
+ <CardHeader className="border-b border-border/60 pt-3 pb-1.5!">
817
817
  <div className="flex items-center justify-between gap-3">
818
818
  <CardTitle className="text-sm font-semibold">
819
819
  Segmentos ({segments.length})
@@ -829,14 +829,14 @@ function SegmentsSection({
829
829
  <div
830
830
  key={segment.id}
831
831
  className={cn(
832
- 'flex flex-col gap-2 rounded-2xl border border-border/60 bg-linear-to-br from-background via-background to-muted/25 px-3 py-2.5 text-xs shadow-[0_16px_30px_-24px_rgba(15,23,42,0.45)] transition-all duration-200 hover:-translate-y-0.5 hover:border-cyan-500/15 hover:to-muted/35 hover:shadow-[0_20px_36px_-24px_rgba(15,23,42,0.52)]',
832
+ 'flex flex-col gap-2 rounded-2xl border border-border/60 bg-card/90 px-3 py-2.5 text-xs shadow-[0_16px_30px_-24px_rgba(15,23,42,0.45)] transition-all duration-200 hover:-translate-y-0.5 hover:border-border/80 hover:shadow-[0_20px_36px_-24px_rgba(15,23,42,0.52)]',
833
833
  !segment.shouldGrantXp && 'opacity-50'
834
834
  )}
835
835
  >
836
836
  <div className="flex flex-wrap items-start justify-between gap-2">
837
837
  <div className="flex min-w-0 flex-col gap-1">
838
838
  <div className="flex flex-wrap items-center gap-1.5">
839
- <span className="rounded-full border border-cyan-500/15 bg-cyan-500/10 px-2 py-0.5 text-[10px] font-semibold uppercase tracking-[0.14em] text-cyan-700 transition-all duration-200 hover:bg-cyan-500/15 hover:shadow-sm dark:text-cyan-300">
839
+ <span className="rounded-full border border-border/60 bg-muted/30 px-2 py-0.5 text-[10px] font-semibold uppercase tracking-[0.14em] text-muted-foreground">
840
840
  {segment.label}
841
841
  </span>
842
842
  <span className="rounded-full border border-border/60 bg-background/90 px-2 py-0.5 font-mono text-[10px] text-muted-foreground shadow-sm transition-all duration-200 hover:border-border hover:bg-background hover:text-foreground hover:shadow-md">
@@ -856,7 +856,7 @@ function SegmentsSection({
856
856
  </div>
857
857
 
858
858
  <div className="flex flex-wrap items-center justify-end gap-1.5">
859
- <span className="rounded-full border border-amber-500/15 bg-amber-500/10 px-2 py-0.5 text-[10px] font-semibold uppercase tracking-[0.14em] text-amber-700 dark:text-amber-300">
859
+ <span className="rounded-full border border-border/60 bg-muted/30 px-2 py-0.5 text-[10px] font-semibold uppercase tracking-[0.14em] text-muted-foreground">
860
860
  {segment.xpValue} XP
861
861
  </span>
862
862
  <DifficultyBadge difficulty={segment.difficulty} />
@@ -1031,14 +1031,7 @@ function MetricPill({
1031
1031
  value: string;
1032
1032
  tone?: 'default' | 'sky' | 'emerald' | 'violet';
1033
1033
  }) {
1034
- const toneClassName =
1035
- tone === 'sky'
1036
- ? 'border-sky-500/15 bg-sky-500/10 text-sky-700 dark:text-sky-300'
1037
- : tone === 'emerald'
1038
- ? 'border-emerald-500/15 bg-emerald-500/10 text-emerald-700 dark:text-emerald-300'
1039
- : tone === 'violet'
1040
- ? 'border-violet-500/15 bg-violet-500/10 text-violet-700 dark:text-violet-300'
1041
- : 'border-border/60 bg-muted/40 text-foreground';
1034
+ const toneClassName = 'border-border/60 bg-muted/40 text-foreground';
1042
1035
 
1043
1036
  return (
1044
1037
  <div
@@ -1069,12 +1062,7 @@ function SegmentBreakdownGroup({
1069
1062
  color: string;
1070
1063
  }>;
1071
1064
  }) {
1072
- const toneClassName =
1073
- tone === 'sky'
1074
- ? 'border-sky-500/15 bg-sky-500/8'
1075
- : tone === 'emerald'
1076
- ? 'border-emerald-500/15 bg-emerald-500/8'
1077
- : 'border-violet-500/15 bg-violet-500/8';
1065
+ const toneClassName = 'border-border/60 bg-muted/20';
1078
1066
 
1079
1067
  if (!items.length) {
1080
1068
  return null;
@@ -11,7 +11,6 @@ import {
11
11
  ExternalLink,
12
12
  FileText,
13
13
  HelpCircle,
14
- Layers,
15
14
  Loader2,
16
15
  Mic,
17
16
  Paperclip,
@@ -25,8 +24,8 @@ import {
25
24
  useStartTranscriptionMutation,
26
25
  useTranscriptionSegmentsQuery,
27
26
  } from '../_data/use-transcription-segments';
28
- import { useStructureStore } from './store';
29
27
  import { LessonXpTab } from './detail-lesson-xp-tab';
28
+ import { useStructureStore } from './store';
30
29
  import type { LessonType } from './types';
31
30
 
32
31
  const LESSON_TYPE_CONFIG: Record<
@@ -51,12 +50,6 @@ const LESSON_TYPE_CONFIG: Record<
51
50
  bg: 'bg-amber-500/10',
52
51
  label: 'Quiz',
53
52
  },
54
- exercicio: {
55
- icon: Layers,
56
- color: 'text-rose-500',
57
- bg: 'bg-rose-500/10',
58
- label: 'Exercício',
59
- },
60
53
  };
61
54
 
62
55
  const VIDEO_PROVIDER_LABELS: Record<string, string> = {
@@ -86,7 +79,9 @@ export function DetailLesson({ lessonId }: DetailLessonProps) {
86
79
 
87
80
  const { data: segments = [], isLoading: segmentsLoading } =
88
81
  useTranscriptionSegmentsQuery(
89
- activeTab === 'transcription' || activeTab === 'xp' ? (lesson?.id ?? null) : null
82
+ activeTab === 'transcription' || activeTab === 'xp'
83
+ ? (lesson?.id ?? null)
84
+ : null
90
85
  );
91
86
 
92
87
  const queryClient = useQueryClient();
@@ -97,7 +92,9 @@ export function DetailLesson({ lessonId }: DetailLessonProps) {
97
92
  startTranscription({
98
93
  onSuccess: () => {
99
94
  toast.success('Transcrição iniciada!');
100
- queryClient.invalidateQueries({ queryKey: ['lesson-transcription-segments', lesson?.id] });
95
+ queryClient.invalidateQueries({
96
+ queryKey: ['lesson-transcription-segments', lesson?.id],
97
+ });
101
98
  },
102
99
  onError: (err) => {
103
100
  toast.error(err.message || 'Erro ao iniciar a transcrição.');
@@ -243,64 +240,55 @@ export function DetailLesson({ lessonId }: DetailLessonProps) {
243
240
  </Section>
244
241
  </>
245
242
  )}
246
-
247
- {!lesson.publicDescription &&
248
- !lesson.privateDescription &&
249
- lesson.type === 'exercicio' && (
250
- <div className="flex flex-col items-center gap-2 py-8 text-center">
251
- <Layers className="size-8 text-muted-foreground/40" />
252
- <p className="text-sm text-muted-foreground">
253
- Sem informações adicionais nesta aula.
254
- </p>
255
- </div>
256
- )}
257
243
  </div>
258
244
  </TabsContent>
259
245
 
260
246
  {/* ── Transcrição ───────────────────────────────────────────────────── */}
261
- {lmsSettings.transcriptionEnabled && <TabsContent
262
- value="transcription"
263
- className="flex-1 overflow-y-auto px-4 pb-4 mt-3"
264
- >
265
- <div className="flex justify-end mb-3">
266
- <Button
267
- size="sm"
268
- variant="outline"
269
- onClick={handleStartTranscription}
270
- disabled={isStarting}
271
- >
272
- {isStarting ? (
273
- <Loader2 className="size-4 mr-2 animate-spin" />
274
- ) : (
275
- <Mic className="size-4 mr-2" />
276
- )}
277
- Iniciar transcrição
278
- </Button>
279
- </div>
280
- {segmentsLoading ? (
281
- <div className="p-4 text-sm text-muted-foreground">
282
- Carregando transcrição...
247
+ {lmsSettings.transcriptionEnabled && (
248
+ <TabsContent
249
+ value="transcription"
250
+ className="flex-1 overflow-y-auto px-4 pb-4 mt-3"
251
+ >
252
+ <div className="flex justify-end mb-3">
253
+ <Button
254
+ size="sm"
255
+ variant="outline"
256
+ onClick={handleStartTranscription}
257
+ disabled={isStarting}
258
+ >
259
+ {isStarting ? (
260
+ <Loader2 className="size-4 mr-2 animate-spin" />
261
+ ) : (
262
+ <Mic className="size-4 mr-2" />
263
+ )}
264
+ Iniciar transcrição
265
+ </Button>
283
266
  </div>
284
- ) : segments.length ? (
285
- <div className="space-y-1.5 p-3">
286
- {segments.map((seg) => (
287
- <div key={seg.id} className="flex gap-3 text-sm">
288
- <span className="shrink-0 font-mono text-xs text-muted-foreground w-24">
289
- [{formatSeconds(seg.startSeconds)} –{' '}
290
- {formatSeconds(seg.endSeconds)}]
291
- </span>
292
- <span className="leading-relaxed">{seg.text}</span>
293
- </div>
294
- ))}
295
- </div>
296
- ) : (
297
- <EmptyState
298
- icon={<FileText className="size-8 text-muted-foreground/40" />}
299
- >
300
- Transcrição não disponível para esta aula.
301
- </EmptyState>
302
- )}
303
- </TabsContent>}
267
+ {segmentsLoading ? (
268
+ <div className="p-4 text-sm text-muted-foreground">
269
+ Carregando transcrição...
270
+ </div>
271
+ ) : segments.length ? (
272
+ <div className="space-y-1.5 p-3">
273
+ {segments.map((seg) => (
274
+ <div key={seg.id} className="flex gap-3 text-sm">
275
+ <span className="shrink-0 font-mono text-xs text-muted-foreground w-24">
276
+ [{formatSeconds(seg.startSeconds)} –{' '}
277
+ {formatSeconds(seg.endSeconds)}]
278
+ </span>
279
+ <span className="leading-relaxed">{seg.text}</span>
280
+ </div>
281
+ ))}
282
+ </div>
283
+ ) : (
284
+ <EmptyState
285
+ icon={<FileText className="size-8 text-muted-foreground/40" />}
286
+ >
287
+ Transcrição não disponível para esta aula.
288
+ </EmptyState>
289
+ )}
290
+ </TabsContent>
291
+ )}
304
292
 
305
293
  {/* ── XP da Aula ────────────────────────────────────────────────────── */}
306
294
  <TabsContent
@@ -10,7 +10,12 @@ import { EditorLesson } from './editor-lesson';
10
10
  import { EditorSession } from './editor-session';
11
11
  import { useStructureStore } from './store';
12
12
 
13
- export const DetailPanel = memo(function DetailPanel() {
13
+ interface DetailPanelProps {
14
+ defaultTab?: string;
15
+ onTabChange?: (tab: string) => void;
16
+ }
17
+
18
+ export const DetailPanel = memo(function DetailPanel({ defaultTab, onTabChange }: DetailPanelProps) {
14
19
  const t = useTranslations('lms.CoursesPage.StructurePage');
15
20
  const { activeItemId, activeItemType, selectedIds } = useStructureStore();
16
21
 
@@ -47,7 +52,7 @@ export const DetailPanel = memo(function DetailPanel() {
47
52
  }
48
53
 
49
54
  if (activeItemType === 'course') {
50
- return <EditorCourse />;
55
+ return <EditorCourse defaultTab={defaultTab} onTabChange={onTabChange} />;
51
56
  }
52
57
 
53
58
  if (activeItemType === 'session') {
@@ -55,7 +60,7 @@ export const DetailPanel = memo(function DetailPanel() {
55
60
  }
56
61
 
57
62
  if (activeItemType === 'lesson') {
58
- return <EditorLesson lessonId={activeItemId} />;
63
+ return <EditorLesson lessonId={activeItemId} defaultTab={defaultTab} onTabChange={onTabChange} />;
59
64
  }
60
65
 
61
66
  return null;
@@ -18,10 +18,24 @@ const LESSON_TYPE_CONFIG: Record<
18
18
  LessonType,
19
19
  { icon: LucideIcon; color: string; label: string; bg: string }
20
20
  > = {
21
- video: { icon: Video, color: 'text-blue-500', label: 'Vídeo', bg: 'bg-blue-500/10' },
22
- post: { icon: FileText, color: 'text-emerald-500', label: 'Post', bg: 'bg-emerald-500/10' },
23
- questao: { icon: HelpCircle, color: 'text-amber-500', label: 'Quiz', bg: 'bg-amber-500/10' },
24
- exercicio: { icon: Layers, color: 'text-rose-500', label: 'Exercício', bg: 'bg-rose-500/10' },
21
+ video: {
22
+ icon: Video,
23
+ color: 'text-blue-500',
24
+ label: 'Vídeo',
25
+ bg: 'bg-blue-500/10',
26
+ },
27
+ post: {
28
+ icon: FileText,
29
+ color: 'text-emerald-500',
30
+ label: 'Post',
31
+ bg: 'bg-emerald-500/10',
32
+ },
33
+ questao: {
34
+ icon: HelpCircle,
35
+ color: 'text-amber-500',
36
+ label: 'Quiz',
37
+ bg: 'bg-amber-500/10',
38
+ },
25
39
  };
26
40
 
27
41
  interface DetailSessionProps {
@@ -29,8 +43,14 @@ interface DetailSessionProps {
29
43
  }
30
44
 
31
45
  export function DetailSession({ sessionId }: DetailSessionProps) {
32
- const session = useStructureStore((s) => s.sessions.find((ss) => ss.id === sessionId));
33
- const lessons = useStructureStore((s) => s.lessons.filter((l) => l.sessionId === sessionId).sort((a, b) => a.order - b.order));
46
+ const session = useStructureStore((s) =>
47
+ s.sessions.find((ss) => ss.id === sessionId)
48
+ );
49
+ const lessons = useStructureStore((s) =>
50
+ s.lessons
51
+ .filter((l) => l.sessionId === sessionId)
52
+ .sort((a, b) => a.order - b.order)
53
+ );
34
54
  const selectItem = useStructureStore((s) => s.selectItem);
35
55
 
36
56
  if (!session) return null;
@@ -157,7 +177,10 @@ function LessonListItem({
157
177
  {lesson.duration}min
158
178
  </span>
159
179
  </div>
160
- <Badge variant="outline" className="text-[0.55rem] px-1 py-0 h-4 shrink-0">
180
+ <Badge
181
+ variant="outline"
182
+ className="text-[0.55rem] px-1 py-0 h-4 shrink-0"
183
+ >
161
184
  {lesson.code}
162
185
  </Badge>
163
186
  </button>
@@ -171,4 +194,4 @@ function StatCard({ label, value }: { label: string; value: string | number }) {
171
194
  <span className="text-[0.65rem] text-muted-foreground">{label}</span>
172
195
  </div>
173
196
  );
174
- }
197
+ }
@@ -1,8 +1,14 @@
1
1
  'use client';
2
2
 
3
- import { DragOverlay as DndDragOverlay } from '@dnd-kit/core';
4
3
  import { cn } from '@/lib/utils';
5
- import { GripVertical, Layers, Video, FileText, HelpCircle } from 'lucide-react';
4
+ import { DragOverlay as DndDragOverlay } from '@dnd-kit/core';
5
+ import {
6
+ FileText,
7
+ GripVertical,
8
+ HelpCircle,
9
+ Layers,
10
+ Video,
11
+ } from 'lucide-react';
6
12
  import type { FlatItem } from './types';
7
13
 
8
14
  interface DragOverlayContentProps {
@@ -11,13 +17,12 @@ interface DragOverlayContentProps {
11
17
 
12
18
  function DragOverlayContent({ item }: DragOverlayContentProps) {
13
19
  const isSession = item.type === 'session';
14
- const isLesson = item.type === 'lesson';
20
+ const isLesson = item.type === 'lesson';
15
21
 
16
22
  const lessonIconMap = {
17
- video: <Video className="size-3.5 text-blue-500 shrink-0" />,
18
- post: <FileText className="size-3.5 text-emerald-500 shrink-0" />,
19
- questao: <HelpCircle className="size-3.5 text-amber-500 shrink-0" />,
20
- exercicio: <Layers className="size-3.5 text-rose-500 shrink-0" />,
23
+ video: <Video className="size-3.5 text-blue-500 shrink-0" />,
24
+ post: <FileText className="size-3.5 text-emerald-500 shrink-0" />,
25
+ questao: <HelpCircle className="size-3.5 text-amber-500 shrink-0" />,
21
26
  } as const;
22
27
 
23
28
  return (
@@ -31,7 +36,9 @@ function DragOverlayContent({ item }: DragOverlayContentProps) {
31
36
  >
32
37
  <GripVertical className="size-3.5 text-muted-foreground/60 shrink-0" />
33
38
 
34
- {isSession && <Layers className="size-3.5 text-muted-foreground shrink-0" />}
39
+ {isSession && (
40
+ <Layers className="size-3.5 text-muted-foreground shrink-0" />
41
+ )}
35
42
  {isLesson && item.type === 'lesson' && lessonIconMap[item.data.type]}
36
43
 
37
44
  <span className="truncate font-medium text-xs">{item.data.title}</span>
@@ -49,4 +56,4 @@ export function TreeDragOverlay({ activeItem }: TreeDragOverlayProps) {
49
56
  {activeItem ? <DragOverlayContent item={activeItem} /> : null}
50
57
  </DndDragOverlay>
51
58
  );
52
- }
59
+ }