@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
@@ -1,9 +1,5 @@
1
1
  'use client';
2
2
 
3
- import { useApp, useQuery } from '@hed-hog/next-app-provider';
4
- import { useQueryClient } from '@tanstack/react-query';
5
- import { Button } from '@/components/ui/button';
6
- import { Badge } from '@/components/ui/badge';
7
3
  import {
8
4
  AlertDialog,
9
5
  AlertDialogAction,
@@ -14,6 +10,8 @@ import {
14
10
  AlertDialogHeader,
15
11
  AlertDialogTitle,
16
12
  } from '@/components/ui/alert-dialog';
13
+ import { Badge } from '@/components/ui/badge';
14
+ import { Button } from '@/components/ui/button';
17
15
  import {
18
16
  Card,
19
17
  CardContent,
@@ -28,26 +26,29 @@ import {
28
26
  } from '@/components/ui/chart';
29
27
  import { KpiCardsGrid } from '@/components/ui/kpi-cards-grid';
30
28
  import { Skeleton } from '@/components/ui/skeleton';
29
+ import { useApp, useQuery } from '@hed-hog/next-app-provider';
30
+ import { useQueryClient } from '@tanstack/react-query';
31
31
  import {
32
- Download,
33
32
  BookOpen,
34
33
  Clapperboard,
35
- Loader2,
34
+ Download,
35
+ FileArchive,
36
36
  FileText,
37
37
  Film,
38
38
  HardDrive,
39
39
  Image,
40
40
  Layers,
41
+ Loader2,
41
42
  Mic,
42
43
  Paperclip,
43
44
  Sparkles,
44
45
  Target,
45
46
  Trash2,
46
- type LucideIcon,
47
47
  Zap,
48
+ type LucideIcon,
48
49
  } from 'lucide-react';
49
50
  import { useTranslations } from 'next-intl';
50
- import React, { useEffect, useMemo, useState } from 'react';
51
+ import { useEffect, useMemo, useState } from 'react';
51
52
  import { Cell, Pie, PieChart } from 'recharts';
52
53
  import { toast } from 'sonner';
53
54
  import { useCourseContentOverviewQuery } from '../_data/use-course-content-overview';
@@ -57,7 +58,6 @@ const TYPE_COLORS: Record<string, string> = {
57
58
  video: '#0ea5e9',
58
59
  questao: '#f97316',
59
60
  post: '#22c55e',
60
- exercicio: '#a855f7',
61
61
  };
62
62
 
63
63
  const TYPE_GRADIENTS: Record<
@@ -79,11 +79,6 @@ const TYPE_GRADIENTS: Record<
79
79
  icon: BookOpen,
80
80
  label: 'Post',
81
81
  },
82
- exercicio: {
83
- from: 'from-violet-500/12 via-fuchsia-500/6',
84
- icon: Target,
85
- label: 'Exercício',
86
- },
87
82
  };
88
83
 
89
84
  const AREA_COLORS = ['#0f766e', '#0ea5e9', '#14b8a6', '#38bdf8', '#0891b2'];
@@ -162,6 +157,13 @@ const STORAGE_CATEGORY_META: Record<
162
157
  iconClassName: 'text-muted-foreground',
163
158
  iconBackgroundClassName: 'bg-muted',
164
159
  },
160
+ course_export: {
161
+ label: 'Arquivos de exportação',
162
+ accentClassName: 'from-emerald-500/20 via-green-500/10 to-transparent',
163
+ icon: FileArchive,
164
+ iconClassName: 'text-emerald-600 dark:text-emerald-400',
165
+ iconBackgroundClassName: 'bg-emerald-500/10',
166
+ },
165
167
  };
166
168
 
167
169
  interface Props {
@@ -299,7 +301,7 @@ export function CourseOverviewTab({ courseId, locale }: Props) {
299
301
 
300
302
  const lessonTypeData = useMemo(() => {
301
303
  if (!data) return [];
302
- const types = ['video', 'questao', 'post', 'exercicio'] as const;
304
+ const types = ['video', 'questao', 'post'] as const;
303
305
  return types
304
306
  .map((type) => ({
305
307
  type,
@@ -412,8 +414,7 @@ export function CourseOverviewTab({ courseId, locale }: Props) {
412
414
  key: 'storage',
413
415
  label: 'Armazenamento',
414
416
  value: formatBytes(data.storage.totalBytes),
415
- toneClassName:
416
- 'border-cyan-500/15 bg-cyan-500/10 text-cyan-700 dark:text-cyan-300',
417
+ toneClassName: 'border-border/60 bg-muted/30 text-muted-foreground',
417
418
  },
418
419
  {
419
420
  key: 'coverage',
@@ -422,22 +423,19 @@ export function CourseOverviewTab({ courseId, locale }: Props) {
422
423
  totalLessons > 0
423
424
  ? `${Math.round((videoCount / totalLessons) * 100)}% das aulas`
424
425
  : '0% das aulas',
425
- toneClassName:
426
- 'border-teal-500/15 bg-teal-500/10 text-teal-700 dark:text-teal-300',
426
+ toneClassName: 'border-border/60 bg-muted/30 text-muted-foreground',
427
427
  },
428
428
  {
429
429
  key: 'images',
430
430
  label: 'Imagens extraídas',
431
431
  value: `${data.media.extractedImageCount}`,
432
- toneClassName:
433
- 'border-amber-500/15 bg-amber-500/10 text-amber-700 dark:text-amber-300',
432
+ toneClassName: 'border-border/60 bg-muted/30 text-muted-foreground',
434
433
  },
435
434
  {
436
435
  key: 'resources',
437
436
  label: 'Arquivos de apoio',
438
437
  value: `${data.resources.fileCount}`,
439
- toneClassName:
440
- 'border-violet-500/15 bg-violet-500/10 text-violet-700 dark:text-violet-300',
438
+ toneClassName: 'border-border/60 bg-muted/30 text-muted-foreground',
441
439
  },
442
440
  ];
443
441
 
@@ -567,7 +565,7 @@ export function CourseOverviewTab({ courseId, locale }: Props) {
567
565
  <div className="rounded-2xl border border-border/70 bg-linear-to-br from-background via-background to-muted/30 px-2.5 py-2 shadow-[0_14px_34px_-28px_rgba(15,23,42,0.45)] backdrop-blur-sm sm:px-3 sm:py-2.5">
568
566
  <div className="flex flex-wrap items-start justify-between gap-3 border-b border-border/50 pb-2">
569
567
  <div className="min-w-0">
570
- <div className="text-[10px] font-semibold uppercase tracking-[0.22em] text-cyan-700/80 dark:text-cyan-300/80">
568
+ <div className="text-[10px] font-semibold uppercase tracking-[0.22em] text-muted-foreground">
571
569
  Course overview
572
570
  </div>
573
571
  <div className="mt-1 text-sm font-semibold text-foreground">
@@ -607,14 +605,14 @@ export function CourseOverviewTab({ courseId, locale }: Props) {
607
605
  </div>
608
606
 
609
607
  <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)]">
610
- <CardHeader className="border-b border-border/70 bg-linear-to-r from-cyan-500/12 via-sky-500/6 to-transparent pt-2.5 pb-1.5!">
608
+ <CardHeader className="border-b border-border/70 pt-2.5 pb-1.5!">
611
609
  <div className="flex flex-wrap items-start justify-between gap-3">
612
610
  <div className="flex min-w-0 items-start gap-3">
613
611
  <div className="flex size-9 shrink-0 items-center justify-center rounded-2xl bg-cyan-500/10 text-cyan-600 ring-1 ring-inset ring-cyan-500/15 dark:text-cyan-400">
614
612
  <HardDrive className="size-4" />
615
613
  </div>
616
614
  <div className="min-w-0">
617
- <div className="text-[10px] font-semibold uppercase tracking-[0.22em] text-cyan-600/80 dark:text-cyan-400/80">
615
+ <div className="text-[10px] font-semibold uppercase tracking-[0.22em] text-muted-foreground">
618
616
  Storage footprint
619
617
  </div>
620
618
  <CardTitle className="mt-1 text-sm font-semibold">
@@ -626,15 +624,15 @@ export function CourseOverviewTab({ courseId, locale }: Props) {
626
624
  </CardDescription>
627
625
  </div>
628
626
  </div>
629
- <div className="rounded-full border border-cyan-500/15 bg-cyan-500/10 px-2.5 py-1 text-[10px] font-semibold text-cyan-700 shadow-sm transition-all duration-200 hover:-translate-y-0.5 hover:bg-cyan-500/15 hover:shadow-md dark:text-cyan-300">
627
+ <div className="rounded-full border border-border/60 bg-muted/30 px-2.5 py-1 text-[10px] font-semibold text-muted-foreground shadow-sm">
630
628
  {formatBytes(data.storage.totalBytes)}
631
629
  </div>
632
630
  </div>
633
631
  </CardHeader>
634
632
  <CardContent className="grid gap-3 px-2.5 py-2.5 sm:px-3 xl:grid-cols-[minmax(0,240px)_minmax(0,1fr)]">
635
633
  <div className="grid gap-2">
636
- <div className="rounded-2xl border border-cyan-500/15 bg-linear-to-br from-cyan-500/12 via-sky-500/6 to-transparent px-3 py-3 shadow-sm transition-all duration-200 hover:-translate-y-0.5 hover:shadow-md">
637
- <div className="text-[10px] font-semibold uppercase tracking-[0.18em] text-cyan-700/80 dark:text-cyan-300/80">
634
+ <div className="rounded-2xl border border-border/60 bg-muted/20 px-3 py-3 shadow-sm transition-all duration-200 hover:-translate-y-0.5 hover:shadow-md">
635
+ <div className="text-[10px] font-semibold uppercase tracking-[0.18em] text-muted-foreground">
638
636
  Total armazenado
639
637
  </div>
640
638
  <div className="mt-2 text-2xl font-semibold tracking-tight text-foreground">
@@ -673,7 +671,7 @@ export function CourseOverviewTab({ courseId, locale }: Props) {
673
671
  return (
674
672
  <div
675
673
  key={category.key}
676
- className="overflow-hidden rounded-2xl border border-border/60 bg-card/90 transition-all duration-200 hover:-translate-y-0.5 hover:border-cyan-500/20 hover:bg-background/95 hover:shadow-md"
674
+ className="overflow-hidden rounded-2xl border border-border/60 bg-card/90 transition-all duration-200 hover:-translate-y-0.5 hover:border-border/80 hover:bg-background/95 hover:shadow-md"
677
675
  >
678
676
  <div
679
677
  className={`h-1.5 w-full bg-linear-to-r ${category.accentClassName}`}
@@ -792,14 +790,14 @@ export function CourseOverviewTab({ courseId, locale }: Props) {
792
790
 
793
791
  <div className="grid gap-3 xl:grid-cols-2">
794
792
  <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)]">
795
- <CardHeader className="border-b border-border/70 bg-linear-to-r from-sky-500/12 via-blue-500/6 to-transparent pt-2.5 pb-1.5!">
793
+ <CardHeader className="border-b border-border/70 pt-2.5 pb-1.5!">
796
794
  <div className="flex flex-wrap items-start justify-between gap-3">
797
795
  <div className="flex min-w-0 items-start gap-3">
798
796
  <div className="flex size-9 shrink-0 items-center justify-center rounded-2xl bg-sky-500/10 text-sky-600 ring-1 ring-inset ring-sky-500/15 dark:text-sky-400">
799
797
  <Layers className="size-4" />
800
798
  </div>
801
799
  <div className="min-w-0">
802
- <div className="text-[10px] font-semibold uppercase tracking-[0.22em] text-sky-600/80 dark:text-sky-400/80">
800
+ <div className="text-[10px] font-semibold uppercase tracking-[0.22em] text-muted-foreground">
803
801
  Lesson mix
804
802
  </div>
805
803
  <CardTitle className="mt-1 text-sm font-semibold">
@@ -810,7 +808,7 @@ export function CourseOverviewTab({ courseId, locale }: Props) {
810
808
  </CardDescription>
811
809
  </div>
812
810
  </div>
813
- <div className="rounded-full border border-sky-500/15 bg-sky-500/10 px-2.5 py-1 text-[10px] font-semibold text-sky-700 shadow-sm transition-all duration-200 hover:-translate-y-0.5 hover:bg-sky-500/15 hover:shadow-md dark:text-sky-300">
811
+ <div className="rounded-full border border-border/60 bg-muted/30 px-2.5 py-1 text-[10px] font-semibold text-muted-foreground shadow-sm">
814
812
  {totalLessons} aulas
815
813
  </div>
816
814
  </div>
@@ -884,7 +882,7 @@ export function CourseOverviewTab({ courseId, locale }: Props) {
884
882
  return (
885
883
  <div
886
884
  key={item.type}
887
- className="flex items-center gap-3 rounded-xl border border-border/60 bg-muted/20 px-3 py-2.5 transition-all duration-200 hover:-translate-y-0.5 hover:border-sky-500/20 hover:bg-background/95 hover:shadow-md"
885
+ className="flex items-center gap-3 rounded-xl border border-border/60 bg-muted/20 px-3 py-2.5 transition-all duration-200 hover:-translate-y-0.5 hover:border-border/80 hover:bg-background/95 hover:shadow-md"
888
886
  >
889
887
  <div
890
888
  className="flex size-8 shrink-0 items-center justify-center rounded-lg"
@@ -924,16 +922,131 @@ export function CourseOverviewTab({ courseId, locale }: Props) {
924
922
  </CardContent>
925
923
  </Card>
926
924
 
925
+ {/* Video pipeline */}
926
+ {videoCount > 0 && (
927
+ <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)]">
928
+ <CardHeader className="border-b border-border/70 pt-2.5 pb-1.5!">
929
+ <div className="flex flex-wrap items-start justify-between gap-3">
930
+ <div className="flex min-w-0 items-start gap-3">
931
+ <div className="flex size-9 shrink-0 items-center justify-center rounded-2xl bg-violet-500/10 text-violet-600 ring-1 ring-inset ring-violet-500/15 dark:text-violet-400">
932
+ <Film className="size-4" />
933
+ </div>
934
+ <div className="min-w-0">
935
+ <div className="text-[10px] font-semibold uppercase tracking-[0.22em] text-muted-foreground">
936
+ Video pipeline
937
+ </div>
938
+ <CardTitle className="mt-1 text-sm font-semibold">
939
+ {t('videoPipeline.title')}
940
+ </CardTitle>
941
+ <CardDescription className="mt-0.5">
942
+ {t('videoPipeline.description')}
943
+ </CardDescription>
944
+ </div>
945
+ </div>
946
+ <div className="rounded-full border border-border/60 bg-muted/30 px-2.5 py-1 text-[10px] font-semibold text-muted-foreground shadow-sm">
947
+ {videoCount} vídeos
948
+ </div>
949
+ </div>
950
+ </CardHeader>
951
+ <CardContent className="flex flex-col gap-3 px-2.5 py-2.5 sm:px-3">
952
+ {(
953
+ [
954
+ {
955
+ key: 'total',
956
+ label: t('videoPipeline.total'),
957
+ value: videoCount,
958
+ total: videoCount,
959
+ color: '#8b5cf6',
960
+ bgColor: 'bg-violet-500/10',
961
+ textColor: 'text-violet-600 dark:text-violet-400',
962
+ icon: Clapperboard,
963
+ },
964
+ {
965
+ key: 'withVideo',
966
+ label: t('videoPipeline.withVideo'),
967
+ value: data.videos.withVideo,
968
+ total: videoCount,
969
+ color: '#a855f7',
970
+ bgColor: 'bg-purple-500/10',
971
+ textColor: 'text-purple-600 dark:text-purple-400',
972
+ icon: Film,
973
+ },
974
+ {
975
+ key: 'withProcessedVideo',
976
+ label: t('videoPipeline.withProcessedVideo'),
977
+ value: data.videos.withProcessedVideo,
978
+ total: videoCount,
979
+ color: '#d946ef',
980
+ bgColor: 'bg-fuchsia-500/10',
981
+ textColor: 'text-fuchsia-600 dark:text-fuchsia-400',
982
+ icon: Sparkles,
983
+ },
984
+ ] as const
985
+ ).map((stat) => {
986
+ const pct =
987
+ stat.total > 0
988
+ ? Math.round((stat.value / stat.total) * 100)
989
+ : stat.key === 'total'
990
+ ? 100
991
+ : 0;
992
+ const Icon = stat.icon;
993
+ return (
994
+ <div
995
+ key={stat.key}
996
+ className="flex flex-col gap-2 rounded-xl border border-transparent px-2 py-1 transition-all duration-200 hover:-translate-y-0.5 hover:border-border/60 hover:bg-background/70 hover:shadow-sm"
997
+ >
998
+ <div className="flex items-center gap-3">
999
+ <div
1000
+ className={`flex size-8 shrink-0 items-center justify-center rounded-lg ${stat.bgColor}`}
1001
+ >
1002
+ <Icon className={`size-4 ${stat.textColor}`} />
1003
+ </div>
1004
+ <div className="flex flex-1 items-center justify-between">
1005
+ <span className="text-sm font-medium text-foreground">
1006
+ {stat.label}
1007
+ </span>
1008
+ <div className="flex items-center gap-2">
1009
+ <span className="font-mono text-xs text-muted-foreground">
1010
+ {stat.value}/{stat.total}
1011
+ </span>
1012
+ <span
1013
+ className="rounded-full px-2 py-0.5 text-[10px] font-semibold transition-all duration-200 hover:shadow-sm"
1014
+ style={{
1015
+ backgroundColor: `${stat.color}20`,
1016
+ color: stat.color,
1017
+ }}
1018
+ >
1019
+ {pct}%
1020
+ </span>
1021
+ </div>
1022
+ </div>
1023
+ </div>
1024
+ <div className="ml-11 h-2 w-full overflow-hidden rounded-full bg-muted">
1025
+ <div
1026
+ className="h-full rounded-full transition-all duration-700 ease-out"
1027
+ style={{
1028
+ width: `${pct}%`,
1029
+ backgroundColor: stat.color,
1030
+ }}
1031
+ />
1032
+ </div>
1033
+ </div>
1034
+ );
1035
+ })}
1036
+ </CardContent>
1037
+ </Card>
1038
+ )}
1039
+
927
1040
  {/* Video coverage */}
928
1041
  <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)]">
929
- <CardHeader className="border-b border-border/70 bg-linear-to-r from-teal-500/12 via-cyan-500/6 to-transparent pt-2.5 pb-1.5!">
1042
+ <CardHeader className="border-b border-border/70 pt-2.5 pb-1.5!">
930
1043
  <div className="flex flex-wrap items-start justify-between gap-3">
931
1044
  <div className="flex min-w-0 items-start gap-3">
932
1045
  <div className="flex size-9 shrink-0 items-center justify-center rounded-2xl bg-teal-500/10 text-teal-600 ring-1 ring-inset ring-teal-500/15 dark:text-teal-400">
933
1046
  <Clapperboard className="size-4" />
934
1047
  </div>
935
1048
  <div className="min-w-0">
936
- <div className="text-[10px] font-semibold uppercase tracking-[0.22em] text-teal-600/80 dark:text-teal-400/80">
1049
+ <div className="text-[10px] font-semibold uppercase tracking-[0.22em] text-muted-foreground">
937
1050
  Video coverage
938
1051
  </div>
939
1052
  <CardTitle className="mt-1 text-sm font-semibold">
@@ -944,7 +1057,7 @@ export function CourseOverviewTab({ courseId, locale }: Props) {
944
1057
  </CardDescription>
945
1058
  </div>
946
1059
  </div>
947
- <div className="rounded-full border border-teal-500/15 bg-teal-500/10 px-2.5 py-1 text-[10px] font-semibold text-teal-700 shadow-sm transition-all duration-200 hover:-translate-y-0.5 hover:bg-teal-500/15 hover:shadow-md dark:text-teal-300">
1060
+ <div className="rounded-full border border-border/60 bg-muted/30 px-2.5 py-1 text-[10px] font-semibold text-muted-foreground shadow-sm">
948
1061
  {videoCount} vídeos
949
1062
  </div>
950
1063
  </div>
@@ -1049,14 +1162,14 @@ export function CourseOverviewTab({ courseId, locale }: Props) {
1049
1162
  <div className="grid gap-3 xl:grid-cols-2">
1050
1163
  {xpData.areas.length > 0 && (
1051
1164
  <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)]">
1052
- <CardHeader className="border-b border-border/70 bg-linear-to-r from-teal-500/10 via-cyan-500/5 to-transparent pt-2.5 pb-1.5!">
1165
+ <CardHeader className="border-b border-border/70 pt-2.5 pb-1.5!">
1053
1166
  <div className="flex flex-wrap items-start justify-between gap-3">
1054
1167
  <div className="flex min-w-0 items-start gap-3">
1055
1168
  <div className="flex size-9 shrink-0 items-center justify-center rounded-2xl bg-teal-500/10 text-teal-600 ring-1 ring-inset ring-teal-500/15 dark:text-teal-400">
1056
1169
  <Sparkles className="size-4" />
1057
1170
  </div>
1058
1171
  <div className="min-w-0">
1059
- <div className="text-[10px] font-semibold uppercase tracking-[0.22em] text-teal-600/80 dark:text-teal-400/80">
1172
+ <div className="text-[10px] font-semibold uppercase tracking-[0.22em] text-muted-foreground">
1060
1173
  Macro areas
1061
1174
  </div>
1062
1175
  <CardTitle className="mt-1 text-sm font-semibold">
@@ -1067,7 +1180,7 @@ export function CourseOverviewTab({ courseId, locale }: Props) {
1067
1180
  </CardDescription>
1068
1181
  </div>
1069
1182
  </div>
1070
- <div className="rounded-full border border-teal-500/15 bg-teal-500/10 px-2.5 py-1 text-[10px] font-semibold text-teal-700 shadow-sm transition-all duration-200 hover:-translate-y-0.5 hover:bg-teal-500/15 hover:shadow-md dark:text-teal-300">
1183
+ <div className="rounded-full border border-border/60 bg-muted/30 px-2.5 py-1 text-[10px] font-semibold text-muted-foreground shadow-sm">
1071
1184
  {xpData.areas.length} áreas
1072
1185
  </div>
1073
1186
  </div>
@@ -1076,7 +1189,7 @@ export function CourseOverviewTab({ courseId, locale }: Props) {
1076
1189
  {xpData.areas.map((area, index) => (
1077
1190
  <div
1078
1191
  key={area.xpAreaId}
1079
- className="flex items-center gap-3 rounded-xl border border-border/60 bg-muted/20 px-3 py-2.5 transition-all duration-200 hover:-translate-y-0.5 hover:border-teal-500/20 hover:bg-background/95 hover:shadow-md"
1192
+ className="flex items-center gap-3 rounded-xl border border-border/60 bg-muted/20 px-3 py-2.5 transition-all duration-200 hover:-translate-y-0.5 hover:border-border/80 hover:bg-background/95 hover:shadow-md"
1080
1193
  >
1081
1194
  <div
1082
1195
  className="flex size-6 shrink-0 items-center justify-center rounded-full text-[10px] font-bold text-white"
@@ -1107,14 +1220,14 @@ export function CourseOverviewTab({ courseId, locale }: Props) {
1107
1220
 
1108
1221
  {xpData.skills.length > 0 && (
1109
1222
  <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)]">
1110
- <CardHeader className="border-b border-border/70 bg-linear-to-r from-orange-500/10 via-amber-500/5 to-transparent pt-2.5 pb-1.5!">
1223
+ <CardHeader className="border-b border-border/70 pt-2.5 pb-1.5!">
1111
1224
  <div className="flex flex-wrap items-start justify-between gap-3">
1112
1225
  <div className="flex min-w-0 items-start gap-3">
1113
1226
  <div className="flex size-9 shrink-0 items-center justify-center rounded-2xl bg-orange-500/10 text-orange-600 ring-1 ring-inset ring-orange-500/15 dark:text-orange-400">
1114
1227
  <Target className="size-4" />
1115
1228
  </div>
1116
1229
  <div className="min-w-0">
1117
- <div className="text-[10px] font-semibold uppercase tracking-[0.22em] text-orange-600/80 dark:text-orange-400/80">
1230
+ <div className="text-[10px] font-semibold uppercase tracking-[0.22em] text-muted-foreground">
1118
1231
  Skills
1119
1232
  </div>
1120
1233
  <CardTitle className="mt-1 text-sm font-semibold">
@@ -1125,7 +1238,7 @@ export function CourseOverviewTab({ courseId, locale }: Props) {
1125
1238
  </CardDescription>
1126
1239
  </div>
1127
1240
  </div>
1128
- <div className="rounded-full border border-orange-500/15 bg-orange-500/10 px-2.5 py-1 text-[10px] font-semibold text-orange-700 shadow-sm transition-all duration-200 hover:-translate-y-0.5 hover:bg-orange-500/15 hover:shadow-md dark:text-orange-300">
1241
+ <div className="rounded-full border border-border/60 bg-muted/30 px-2.5 py-1 text-[10px] font-semibold text-muted-foreground shadow-sm">
1129
1242
  {xpData.skills.length} skills
1130
1243
  </div>
1131
1244
  </div>
@@ -1134,7 +1247,7 @@ export function CourseOverviewTab({ courseId, locale }: Props) {
1134
1247
  {xpData.skills.map((skill, index) => (
1135
1248
  <div
1136
1249
  key={skill.xpSkillId}
1137
- className="flex items-center gap-3 rounded-xl border border-border/60 bg-muted/20 px-3 py-2.5 transition-all duration-200 hover:-translate-y-0.5 hover:border-orange-500/20 hover:bg-background/95 hover:shadow-md"
1250
+ className="flex items-center gap-3 rounded-xl border border-border/60 bg-muted/20 px-3 py-2.5 transition-all duration-200 hover:-translate-y-0.5 hover:border-border/80 hover:bg-background/95 hover:shadow-md"
1138
1251
  >
1139
1252
  <div
1140
1253
  className="flex size-6 shrink-0 items-center justify-center rounded-full text-[10px] font-bold text-white"
@@ -262,7 +262,7 @@ export function CourseXpOverviewTab({ courseId, locale }: Props) {
262
262
  <div className="rounded-2xl border border-border/70 bg-linear-to-br from-background via-background to-muted/30 px-2.5 py-2 shadow-[0_14px_34px_-28px_rgba(15,23,42,0.45)] backdrop-blur-sm sm:px-3 sm:py-2.5">
263
263
  <div className="flex flex-wrap items-start justify-between gap-3 border-b border-border/50 pb-2">
264
264
  <div className="min-w-0">
265
- <div className="text-[10px] font-semibold uppercase tracking-[0.22em] text-cyan-700/80 dark:text-cyan-300/80">
265
+ <div className="text-[10px] font-semibold uppercase tracking-[0.22em] text-muted-foreground">
266
266
  Course XP overview
267
267
  </div>
268
268
  <div className="mt-1 text-sm font-semibold text-foreground">
@@ -301,14 +301,14 @@ export function CourseXpOverviewTab({ courseId, locale }: Props) {
301
301
 
302
302
  <div className="grid gap-3 xl:grid-cols-[minmax(0,1.06fr)_minmax(0,0.94fr)]">
303
303
  <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)]">
304
- <CardHeader className="border-b border-border/70 bg-linear-to-r from-teal-500/12 via-cyan-500/6 to-transparent pt-2.5 pb-1.5!">
304
+ <CardHeader className="border-b border-border/70 pt-2.5 pb-1.5!">
305
305
  <div className="flex flex-wrap items-start justify-between gap-3">
306
306
  <div className="flex min-w-0 items-start gap-3">
307
307
  <div className="flex size-9 shrink-0 items-center justify-center rounded-2xl bg-teal-500/10 text-teal-600 ring-1 ring-inset ring-teal-500/15 dark:text-teal-400">
308
308
  <ChartPie className="size-4" />
309
309
  </div>
310
310
  <div className="min-w-0">
311
- <div className="text-[10px] font-semibold uppercase tracking-[0.22em] text-teal-600/80 dark:text-teal-400/80">
311
+ <div className="text-[10px] font-semibold uppercase tracking-[0.22em] text-muted-foreground">
312
312
  Macro areas
313
313
  </div>
314
314
  <CardTitle className="mt-1 text-sm font-semibold">
@@ -319,7 +319,7 @@ export function CourseXpOverviewTab({ courseId, locale }: Props) {
319
319
  </CardDescription>
320
320
  </div>
321
321
  </div>
322
- <div className="rounded-full border border-teal-500/15 bg-teal-500/10 px-2.5 py-1 text-[10px] font-semibold text-teal-700 shadow-sm transition-all duration-200 hover:-translate-y-0.5 hover:bg-teal-500/15 hover:shadow-md dark:text-teal-300">
322
+ <div className="rounded-full border border-border/60 bg-muted/30 px-2.5 py-1 text-[10px] font-semibold text-muted-foreground shadow-sm">
323
323
  {data.areas.length} áreas
324
324
  </div>
325
325
  </div>
@@ -388,7 +388,7 @@ export function CourseXpOverviewTab({ courseId, locale }: Props) {
388
388
  {areaData.map((item, index) => (
389
389
  <div
390
390
  key={item.xpAreaId}
391
- className="rounded-2xl border border-border/60 bg-linear-to-br from-background via-background to-sky-500/5 px-3 py-2 shadow-[0_14px_28px_-24px_rgba(15,23,42,0.45)] transition-all duration-200 hover:-translate-y-0.5 hover:border-sky-500/20 hover:to-sky-500/10 hover:shadow-[0_18px_34px_-22px_rgba(15,23,42,0.5)]"
391
+ className="rounded-2xl border border-border/60 bg-card/90 px-3 py-2 shadow-[0_14px_28px_-24px_rgba(15,23,42,0.45)] transition-all duration-200 hover:-translate-y-0.5 hover:border-border/80 hover:shadow-[0_18px_34px_-22px_rgba(15,23,42,0.5)]"
392
392
  >
393
393
  <div className="flex items-center gap-2">
394
394
  <span
@@ -423,14 +423,14 @@ export function CourseXpOverviewTab({ courseId, locale }: Props) {
423
423
  </Card>
424
424
 
425
425
  <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)]">
426
- <CardHeader className="border-b border-border/70 bg-linear-to-r from-orange-500/12 via-amber-500/6 to-transparent pt-2.5 pb-1.5!">
426
+ <CardHeader className="border-b border-border/70 pt-2.5 pb-1.5!">
427
427
  <div className="flex flex-wrap items-start justify-between gap-3">
428
428
  <div className="flex min-w-0 items-start gap-3">
429
429
  <div className="flex size-9 shrink-0 items-center justify-center rounded-2xl bg-orange-500/10 text-orange-600 ring-1 ring-inset ring-orange-500/15 dark:text-orange-400">
430
430
  <BarChart3 className="size-4" />
431
431
  </div>
432
432
  <div className="min-w-0">
433
- <div className="text-[10px] font-semibold uppercase tracking-[0.22em] text-orange-600/80 dark:text-orange-400/80">
433
+ <div className="text-[10px] font-semibold uppercase tracking-[0.22em] text-muted-foreground">
434
434
  Skill density
435
435
  </div>
436
436
  <CardTitle className="mt-1 text-sm font-semibold">
@@ -441,7 +441,7 @@ export function CourseXpOverviewTab({ courseId, locale }: Props) {
441
441
  </CardDescription>
442
442
  </div>
443
443
  </div>
444
- <div className="rounded-full border border-orange-500/15 bg-orange-500/10 px-2.5 py-1 text-[10px] font-semibold text-orange-700 shadow-sm transition-all duration-200 hover:-translate-y-0.5 hover:bg-orange-500/15 hover:shadow-md dark:text-orange-300">
444
+ <div className="rounded-full border border-border/60 bg-muted/30 px-2.5 py-1 text-[10px] font-semibold text-muted-foreground shadow-sm">
445
445
  {data.skills.length} skills
446
446
  </div>
447
447
  </div>
@@ -518,7 +518,7 @@ export function CourseXpOverviewTab({ courseId, locale }: Props) {
518
518
  {skillData.map((item, index) => (
519
519
  <div
520
520
  key={item.xpSkillId}
521
- className="rounded-2xl border border-border/60 bg-linear-to-br from-background via-background to-orange-500/5 px-3 py-2 shadow-[0_14px_28px_-24px_rgba(15,23,42,0.45)] transition-all duration-200 hover:-translate-y-0.5 hover:border-orange-500/20 hover:to-orange-500/10 hover:shadow-[0_18px_34px_-22px_rgba(15,23,42,0.5)]"
521
+ className="rounded-2xl border border-border/60 bg-card/90 px-3 py-2 shadow-[0_14px_28px_-24px_rgba(15,23,42,0.45)] transition-all duration-200 hover:-translate-y-0.5 hover:border-border/80 hover:shadow-[0_18px_34px_-22px_rgba(15,23,42,0.5)]"
522
522
  >
523
523
  <div className="flex flex-wrap items-center justify-between gap-2">
524
524
  <div className="flex min-w-0 items-center gap-2">
@@ -556,14 +556,14 @@ export function CourseXpOverviewTab({ courseId, locale }: Props) {
556
556
 
557
557
  {learningTypeData.length > 0 && (
558
558
  <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)]">
559
- <CardHeader className="border-b border-border/70 bg-linear-to-r from-violet-500/10 via-fuchsia-500/5 to-transparent pt-2.5 pb-1.5!">
559
+ <CardHeader className="border-b border-border/70 pt-2.5 pb-1.5!">
560
560
  <div className="flex flex-wrap items-start justify-between gap-3">
561
561
  <div className="flex min-w-0 items-start gap-3">
562
562
  <div className="flex size-9 shrink-0 items-center justify-center rounded-2xl bg-violet-500/10 text-violet-600 ring-1 ring-inset ring-violet-500/15 dark:text-violet-400">
563
563
  <Sparkles className="size-4" />
564
564
  </div>
565
565
  <div className="min-w-0">
566
- <div className="text-[10px] font-semibold uppercase tracking-[0.22em] text-violet-600/80 dark:text-violet-400/80">
566
+ <div className="text-[10px] font-semibold uppercase tracking-[0.22em] text-muted-foreground">
567
567
  Learning mix
568
568
  </div>
569
569
  <CardTitle className="mt-1 text-sm font-semibold">
@@ -574,7 +574,7 @@ export function CourseXpOverviewTab({ courseId, locale }: Props) {
574
574
  </CardDescription>
575
575
  </div>
576
576
  </div>
577
- <div className="rounded-full border border-violet-500/15 bg-violet-500/10 px-2.5 py-1 text-[10px] font-semibold text-violet-700 shadow-sm transition-all duration-200 hover:-translate-y-0.5 hover:bg-violet-500/15 hover:shadow-md dark:text-violet-300">
577
+ <div className="rounded-full border border-border/60 bg-muted/30 px-2.5 py-1 text-[10px] font-semibold text-muted-foreground shadow-sm">
578
578
  {learningTypeData.length} tipos
579
579
  </div>
580
580
  </div>
@@ -583,7 +583,7 @@ export function CourseXpOverviewTab({ courseId, locale }: Props) {
583
583
  {learningTypeData.map((item, index) => (
584
584
  <div
585
585
  key={item.xpLearningTypeId}
586
- className="flex h-full flex-col justify-start gap-1.5 rounded-2xl border border-border/60 bg-linear-to-br from-background via-background to-violet-500/5 px-3 py-2 shadow-[0_14px_28px_-24px_rgba(15,23,42,0.45)] transition-all duration-200 hover:-translate-y-0.5 hover:border-violet-500/20 hover:to-violet-500/10 hover:shadow-[0_18px_34px_-22px_rgba(15,23,42,0.5)]"
586
+ className="flex h-full flex-col justify-start gap-1.5 rounded-2xl border border-border/60 bg-card/90 px-3 py-2 shadow-[0_14px_28px_-24px_rgba(15,23,42,0.45)] transition-all duration-200 hover:-translate-y-0.5 hover:border-border/80 hover:shadow-[0_18px_34px_-22px_rgba(15,23,42,0.5)]"
587
587
  >
588
588
  <div className="flex flex-wrap items-center gap-2">
589
589
  <div className="flex min-w-0 flex-1 items-center gap-2">