@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.
- package/dist/bitcode-wallet/bitcode-wallet.service.d.ts +1 -0
- package/dist/bitcode-wallet/bitcode-wallet.service.d.ts.map +1 -1
- package/dist/bitcode-wallet/bitcode-wallet.service.js +22 -3
- package/dist/bitcode-wallet/bitcode-wallet.service.js.map +1 -1
- package/dist/class-group/class-group.controller.d.ts +1 -0
- package/dist/class-group/class-group.controller.d.ts.map +1 -1
- package/dist/class-group/class-group.service.d.ts +1 -0
- package/dist/class-group/class-group.service.d.ts.map +1 -1
- package/dist/course/course-export-scorm12-worker.service.d.ts +21 -0
- package/dist/course/course-export-scorm12-worker.service.d.ts.map +1 -0
- package/dist/course/course-export-scorm12-worker.service.js +109 -0
- package/dist/course/course-export-scorm12-worker.service.js.map +1 -0
- package/dist/course/course-export-scorm12.service.d.ts +42 -0
- package/dist/course/course-export-scorm12.service.d.ts.map +1 -0
- package/dist/course/course-export-scorm12.service.js +628 -0
- package/dist/course/course-export-scorm12.service.js.map +1 -0
- package/dist/course/course-export.service.d.ts +84 -0
- package/dist/course/course-export.service.d.ts.map +1 -0
- package/dist/course/course-export.service.js +237 -0
- package/dist/course/course-export.service.js.map +1 -0
- package/dist/course/course-structure.controller.d.ts +20 -10
- package/dist/course/course-structure.controller.d.ts.map +1 -1
- package/dist/course/course-structure.controller.js +20 -4
- package/dist/course/course-structure.controller.js.map +1 -1
- package/dist/course/course-structure.service.d.ts +12 -4
- package/dist/course/course-structure.service.d.ts.map +1 -1
- package/dist/course/course-structure.service.js +98 -23
- package/dist/course/course-structure.service.js.map +1 -1
- package/dist/course/course-video-agent-pipeline.service.d.ts +70 -0
- package/dist/course/course-video-agent-pipeline.service.d.ts.map +1 -0
- package/dist/course/course-video-agent-pipeline.service.js +398 -0
- package/dist/course/course-video-agent-pipeline.service.js.map +1 -0
- package/dist/course/course-video-hls.service.d.ts +71 -0
- package/dist/course/course-video-hls.service.d.ts.map +1 -0
- package/dist/course/course-video-hls.service.js +784 -0
- package/dist/course/course-video-hls.service.js.map +1 -0
- package/dist/course/course.controller.d.ts +47 -13
- package/dist/course/course.controller.d.ts.map +1 -1
- package/dist/course/course.controller.js +40 -26
- package/dist/course/course.controller.js.map +1 -1
- package/dist/course/course.mcp-tools.js +1 -1
- package/dist/course/course.mcp-tools.js.map +1 -1
- package/dist/course/course.module.d.ts.map +1 -1
- package/dist/course/course.module.js +16 -0
- package/dist/course/course.module.js.map +1 -1
- package/dist/course/course.service.d.ts +8 -9
- package/dist/course/course.service.d.ts.map +1 -1
- package/dist/course/course.service.js +93 -50
- package/dist/course/course.service.js.map +1 -1
- package/dist/course/dto/cleanup-course-storage.dto.d.ts +1 -1
- package/dist/course/dto/cleanup-course-storage.dto.d.ts.map +1 -1
- package/dist/course/dto/cleanup-course-storage.dto.js +1 -0
- package/dist/course/dto/cleanup-course-storage.dto.js.map +1 -1
- package/dist/course/dto/cleanup-upload-history.dto.d.ts +1 -1
- package/dist/course/dto/cleanup-upload-history.dto.d.ts.map +1 -1
- package/dist/course/dto/cleanup-upload-history.dto.js +1 -1
- package/dist/course/dto/cleanup-upload-history.dto.js.map +1 -1
- package/dist/course/dto/create-course-bulk-job.dto.d.ts +2 -1
- package/dist/course/dto/create-course-bulk-job.dto.d.ts.map +1 -1
- package/dist/course/dto/create-course-bulk-job.dto.js +6 -1
- package/dist/course/dto/create-course-bulk-job.dto.js.map +1 -1
- package/dist/course/dto/create-course-export.dto.d.ts +14 -0
- package/dist/course/dto/create-course-export.dto.d.ts.map +1 -0
- package/dist/course/dto/create-course-export.dto.js +71 -0
- package/dist/course/dto/create-course-export.dto.js.map +1 -0
- package/dist/course/dto/create-course-structure-lesson.dto.d.ts +2 -2
- package/dist/course/dto/create-course-structure-lesson.dto.d.ts.map +1 -1
- package/dist/course/dto/create-course-structure-lesson.dto.js +3 -2
- package/dist/course/dto/create-course-structure-lesson.dto.js.map +1 -1
- package/dist/course/ffmpeg.util.d.ts +10 -0
- package/dist/course/ffmpeg.util.d.ts.map +1 -0
- package/dist/course/ffmpeg.util.js +79 -0
- package/dist/course/ffmpeg.util.js.map +1 -0
- package/dist/course/lms-bulk-upload-automation.service.d.ts +18 -1
- package/dist/course/lms-bulk-upload-automation.service.d.ts.map +1 -1
- package/dist/course/lms-bulk-upload-automation.service.js +106 -8
- package/dist/course/lms-bulk-upload-automation.service.js.map +1 -1
- package/dist/course/lms-bulk-upload-infra.service.d.ts +1 -0
- package/dist/course/lms-bulk-upload-infra.service.d.ts.map +1 -1
- package/dist/course/lms-bulk-upload-infra.service.js +32 -8
- package/dist/course/lms-bulk-upload-infra.service.js.map +1 -1
- package/dist/course/lms-bulk-upload.controller.d.ts +30 -3
- package/dist/course/lms-bulk-upload.controller.d.ts.map +1 -1
- package/dist/course/lms-bulk-upload.controller.js +43 -2
- package/dist/course/lms-bulk-upload.controller.js.map +1 -1
- package/dist/course/lms-bulk-upload.service.d.ts +11 -0
- package/dist/course/lms-bulk-upload.service.d.ts.map +1 -1
- package/dist/course/lms-bulk-upload.service.js +59 -6
- package/dist/course/lms-bulk-upload.service.js.map +1 -1
- package/dist/course/lms-setting.controller.d.ts +2 -1
- package/dist/course/lms-setting.controller.d.ts.map +1 -1
- package/dist/course/lms-setting.controller.js +4 -2
- package/dist/course/lms-setting.controller.js.map +1 -1
- package/dist/course/scorm12-schemas.d.ts +4 -0
- package/dist/course/scorm12-schemas.d.ts.map +1 -0
- package/dist/course/scorm12-schemas.js +9 -0
- package/dist/course/scorm12-schemas.js.map +1 -0
- package/dist/enterprise/training/training-admin.controller.d.ts +2 -0
- package/dist/enterprise/training/training-admin.controller.d.ts.map +1 -1
- package/dist/enterprise/training/training-admin.service.d.ts +2 -0
- package/dist/enterprise/training/training-admin.service.d.ts.map +1 -1
- package/dist/enterprise/training/training-student.service.d.ts +51 -0
- package/dist/enterprise/training/training-student.service.d.ts.map +1 -1
- package/dist/enterprise/training/training-student.service.js +217 -4
- package/dist/enterprise/training/training-student.service.js.map +1 -1
- package/dist/evaluation/evaluation.service.d.ts +18 -0
- package/dist/evaluation/evaluation.service.d.ts.map +1 -1
- package/dist/evaluation/evaluation.service.js +125 -0
- package/dist/evaluation/evaluation.service.js.map +1 -1
- package/dist/exam/dto/create-standalone-question.dto.d.ts +12 -0
- package/dist/exam/dto/create-standalone-question.dto.d.ts.map +1 -0
- package/dist/exam/dto/create-standalone-question.dto.js +70 -0
- package/dist/exam/dto/create-standalone-question.dto.js.map +1 -0
- package/dist/exam/exam.module.d.ts.map +1 -1
- package/dist/exam/exam.module.js +2 -1
- package/dist/exam/exam.module.js.map +1 -1
- package/dist/exam/exam.service.d.ts +21 -0
- package/dist/exam/exam.service.d.ts.map +1 -1
- package/dist/exam/exam.service.js +80 -0
- package/dist/exam/exam.service.js.map +1 -1
- package/dist/exam/question.controller.d.ts +27 -0
- package/dist/exam/question.controller.d.ts.map +1 -0
- package/dist/exam/question.controller.js +53 -0
- package/dist/exam/question.controller.js.map +1 -0
- package/dist/lesson-xp-map/lesson-xp-ai-calculation.service.d.ts +4 -0
- package/dist/lesson-xp-map/lesson-xp-ai-calculation.service.d.ts.map +1 -1
- package/dist/lesson-xp-map/lesson-xp-ai-calculation.service.js +161 -25
- package/dist/lesson-xp-map/lesson-xp-ai-calculation.service.js.map +1 -1
- package/dist/libraries/lms/tsconfig.tsbuildinfo +1 -1
- package/dist/lms-commerce-access.subscriber.d.ts +11 -0
- package/dist/lms-commerce-access.subscriber.d.ts.map +1 -0
- package/dist/lms-commerce-access.subscriber.js +74 -0
- package/dist/lms-commerce-access.subscriber.js.map +1 -0
- package/dist/lms.module.d.ts.map +1 -1
- package/dist/lms.module.js +16 -5
- package/dist/lms.module.js.map +1 -1
- package/dist/platforma/dto/heartbeat.dto.d.ts +9 -0
- package/dist/platforma/dto/heartbeat.dto.d.ts.map +1 -0
- package/dist/platforma/dto/heartbeat.dto.js +50 -0
- package/dist/platforma/dto/heartbeat.dto.js.map +1 -0
- package/dist/platforma/handlers/emit-certificate.handler.d.ts +27 -0
- package/dist/platforma/handlers/emit-certificate.handler.d.ts.map +1 -0
- package/dist/platforma/handlers/emit-certificate.handler.js +117 -0
- package/dist/platforma/handlers/emit-certificate.handler.js.map +1 -0
- package/dist/platforma/handlers/lesson-heartbeat.handler.d.ts +31 -0
- package/dist/platforma/handlers/lesson-heartbeat.handler.d.ts.map +1 -0
- package/dist/platforma/handlers/lesson-heartbeat.handler.js +281 -0
- package/dist/platforma/handlers/lesson-heartbeat.handler.js.map +1 -0
- package/dist/platforma/platforma-heartbeat.service.d.ts +10 -0
- package/dist/platforma/platforma-heartbeat.service.d.ts.map +1 -0
- package/dist/platforma/platforma-heartbeat.service.js +50 -0
- package/dist/platforma/platforma-heartbeat.service.js.map +1 -0
- package/dist/platforma/platforma-performance.service.d.ts +121 -0
- package/dist/platforma/platforma-performance.service.d.ts.map +1 -0
- package/dist/platforma/platforma-performance.service.js +500 -0
- package/dist/platforma/platforma-performance.service.js.map +1 -0
- package/dist/platforma/platforma-search.service.d.ts +21 -0
- package/dist/platforma/platforma-search.service.d.ts.map +1 -0
- package/dist/platforma/platforma-search.service.js +64 -0
- package/dist/platforma/platforma-search.service.js.map +1 -0
- package/dist/platforma/platforma-video.service.d.ts +39 -0
- package/dist/platforma/platforma-video.service.d.ts.map +1 -0
- package/dist/platforma/platforma-video.service.js +301 -0
- package/dist/platforma/platforma-video.service.js.map +1 -0
- package/dist/platforma/platforma.controller.d.ts +209 -1
- package/dist/platforma/platforma.controller.d.ts.map +1 -1
- package/dist/platforma/platforma.controller.js +208 -2
- package/dist/platforma/platforma.controller.js.map +1 -1
- package/dist/realtime/lms-realtime.controller.d.ts +2 -0
- package/dist/realtime/lms-realtime.controller.d.ts.map +1 -1
- package/dist/realtime/lms-realtime.controller.js +31 -0
- package/dist/realtime/lms-realtime.controller.js.map +1 -1
- package/dist/realtime/lms-realtime.service.d.ts +1 -1
- package/dist/realtime/lms-realtime.service.d.ts.map +1 -1
- package/dist/realtime/lms-realtime.service.js.map +1 -1
- package/dist/student-xp/dto/grant-skill-card-xp.dto.d.ts +5 -0
- package/dist/student-xp/dto/grant-skill-card-xp.dto.d.ts.map +1 -0
- package/dist/student-xp/dto/grant-skill-card-xp.dto.js +26 -0
- package/dist/student-xp/dto/grant-skill-card-xp.dto.js.map +1 -0
- package/dist/student-xp/student-xp.controller.d.ts +15 -0
- package/dist/student-xp/student-xp.controller.d.ts.map +1 -1
- package/dist/student-xp/student-xp.controller.js +24 -0
- package/dist/student-xp/student-xp.controller.js.map +1 -1
- package/dist/student-xp/student-xp.service.d.ts +16 -0
- package/dist/student-xp/student-xp.service.d.ts.map +1 -1
- package/dist/student-xp/student-xp.service.js +51 -1
- package/dist/student-xp/student-xp.service.js.map +1 -1
- package/hedhog/data/evaluation_topic.yaml +17 -0
- package/hedhog/data/menu.yaml +0 -17
- package/hedhog/data/queue_definition.yaml +48 -0
- package/hedhog/data/route.yaml +94 -124
- package/hedhog/data/setting_group.yaml +19 -19
- package/hedhog/frontend/app/bulk-upload-sessions/page.tsx.ejs +337 -41
- package/hedhog/frontend/app/certificates/models/page.tsx.ejs +182 -29
- package/hedhog/frontend/app/classes/_components/classes-calendar-view.tsx.ejs +277 -0
- package/hedhog/frontend/app/classes/page.tsx.ejs +127 -20
- package/hedhog/frontend/app/courses/[id]/page.tsx.ejs +69 -4
- package/hedhog/frontend/app/courses/[id]/structure/_components/course-export-sheet.tsx.ejs +420 -0
- package/hedhog/frontend/app/courses/[id]/structure/_components/course-exports-tab.tsx.ejs +308 -0
- package/hedhog/frontend/app/courses/[id]/structure/_components/course-overview-tab.tsx.ejs +158 -45
- package/hedhog/frontend/app/courses/[id]/structure/_components/course-xp-overview-tab.tsx.ejs +13 -13
- package/hedhog/frontend/app/courses/[id]/structure/_components/detail-lesson-xp-tab.tsx.ejs +11 -23
- package/hedhog/frontend/app/courses/[id]/structure/_components/detail-lesson.tsx.ejs +51 -63
- package/hedhog/frontend/app/courses/[id]/structure/_components/detail-panel.tsx.ejs +8 -3
- package/hedhog/frontend/app/courses/[id]/structure/_components/detail-session.tsx.ejs +31 -8
- package/hedhog/frontend/app/courses/[id]/structure/_components/drag-overlay.tsx.ejs +16 -9
- package/hedhog/frontend/app/courses/[id]/structure/_components/editor-course.tsx.ejs +201 -401
- package/hedhog/frontend/app/courses/[id]/structure/_components/editor-lesson.tsx.ejs +378 -690
- package/hedhog/frontend/app/courses/[id]/structure/_components/mock-data.ts.ejs +1 -2
- package/hedhog/frontend/app/courses/[id]/structure/_components/tree-row-lesson.tsx.ejs +3 -9
- package/hedhog/frontend/app/courses/[id]/structure/_components/types.ts.ejs +1 -1
- package/hedhog/frontend/app/courses/[id]/structure/_components/xp-premium-pills.tsx.ejs +1 -8
- package/hedhog/frontend/app/courses/[id]/structure/_data/adapters/course-structure.adapter.ts.ejs +6 -10
- package/hedhog/frontend/app/courses/[id]/structure/_data/services/course-structure.service.ts.ejs +49 -0
- package/hedhog/frontend/app/courses/[id]/structure/_data/types/api-course.types.ts.ejs +4 -3
- package/hedhog/frontend/app/courses/[id]/structure/_data/use-course-content-overview.ts.ejs +2 -1
- package/hedhog/frontend/app/courses/[id]/structure/_data/use-course-exports.ts.ejs +106 -0
- package/hedhog/frontend/app/courses/[id]/structure/_data/use-course-structure-mutations.ts.ejs +28 -1
- package/hedhog/frontend/app/courses/[id]/structure/_data/use-lms-settings-query.ts.ejs +0 -2
- package/hedhog/frontend/app/courses/page.tsx.ejs +85 -9
- package/hedhog/frontend/app/enterprise/[id]/page.tsx.ejs +6 -0
- package/hedhog/frontend/app/enterprise/_components/enterprise-classes-calendar-tab.tsx.ejs +264 -0
- package/hedhog/frontend/app/enterprise/page.tsx.ejs +104 -47
- package/hedhog/frontend/app/exams/page.tsx.ejs +38 -4
- package/hedhog/frontend/app/instructors/page.tsx.ejs +87 -46
- package/hedhog/frontend/app/paths/page.tsx.ejs +38 -4
- package/hedhog/frontend/app/training/page.tsx.ejs +38 -4
- package/hedhog/frontend/messages/en.json +44 -28
- package/hedhog/frontend/messages/pt.json +47 -29
- package/hedhog/table/course_enrollment.yaml +3 -0
- package/hedhog/table/course_export.yaml +62 -0
- package/hedhog/table/lesson_view_event.yaml +66 -0
- package/package.json +14 -9
- package/src/bitcode-wallet/bitcode-wallet.service.ts +43 -4
- package/src/course/course-export-scorm12-worker.service.ts +124 -0
- package/src/course/course-export-scorm12.service.ts +668 -0
- package/src/course/course-export.service.ts +280 -0
- package/src/course/course-structure.controller.ts +16 -2
- package/src/course/course-structure.service.ts +100 -7
- package/src/course/course-video-agent-pipeline.service.ts +471 -0
- package/src/course/course-video-hls.service.ts +966 -0
- package/src/course/course.controller.ts +33 -19
- package/src/course/course.mcp-tools.ts +1 -1
- package/src/course/course.module.ts +16 -0
- package/src/course/course.service.ts +119 -61
- package/src/course/dto/cleanup-course-storage.dto.ts +1 -0
- package/src/course/dto/cleanup-upload-history.dto.ts +1 -1
- package/src/course/dto/create-course-bulk-job.dto.ts +7 -3
- package/src/course/dto/create-course-export.dto.ts +56 -0
- package/src/course/dto/create-course-structure-lesson.dto.ts +4 -3
- package/src/course/ffmpeg.util.ts +65 -0
- package/src/course/lms-bulk-upload-automation.service.ts +156 -6
- package/src/course/lms-bulk-upload-infra.service.ts +39 -6
- package/src/course/lms-bulk-upload.controller.ts +32 -2
- package/src/course/lms-bulk-upload.service.ts +70 -7
- package/src/course/lms-setting.controller.ts +4 -2
- package/src/course/scorm12-schemas.ts +9 -0
- package/src/enterprise/training/training-student.service.ts +221 -2
- package/src/evaluation/evaluation.service.ts +123 -0
- package/src/exam/dto/create-standalone-question.dto.ts +66 -0
- package/src/exam/exam.module.ts +2 -1
- package/src/exam/exam.service.ts +86 -0
- package/src/exam/question.controller.ts +28 -0
- package/src/lesson-xp-map/lesson-xp-ai-calculation.service.ts +205 -31
- package/src/lms-commerce-access.subscriber.ts +88 -0
- package/src/lms.module.ts +16 -5
- package/src/platforma/dto/heartbeat.dto.ts +30 -0
- package/src/platforma/handlers/emit-certificate.handler.ts +117 -0
- package/src/platforma/handlers/lesson-heartbeat.handler.ts +343 -0
- package/src/platforma/platforma-heartbeat.service.ts +33 -0
- package/src/platforma/platforma-performance.service.ts +606 -0
- package/src/platforma/platforma-search.service.ts +48 -0
- package/src/platforma/platforma-video.service.ts +346 -0
- package/src/platforma/platforma.controller.ts +137 -1
- package/src/platforma/platforma.service.ts +268 -268
- package/src/realtime/lms-realtime.controller.ts +27 -1
- package/src/realtime/lms-realtime.service.ts +2 -1
- package/src/student-xp/dto/grant-skill-card-xp.dto.ts +10 -0
- package/src/student-xp/student-xp.controller.ts +18 -2
- package/src/student-xp/student-xp.service.ts +84 -2
- package/hedhog/data/video_resolution_profile.yaml +0 -7
- package/hedhog/frontend/app/video-resolution-profiles/page.tsx.ejs +0 -607
- package/hedhog/table/course_video_resolution_profile.yaml +0 -22
- package/hedhog/table/video_resolution_profile.yaml +0 -18
- package/src/video-resolution-profile/dto/create-video-resolution-profile.dto.ts +0 -16
- package/src/video-resolution-profile/dto/update-video-resolution-profile.dto.ts +0 -16
- package/src/video-resolution-profile/video-resolution-profile.controller.ts +0 -62
- package/src/video-resolution-profile/video-resolution-profile.mcp-tools.ts +0 -128
- package/src/video-resolution-profile/video-resolution-profile.module.ts +0 -13
- 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
|
-
|
|
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
|
|
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'
|
|
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-
|
|
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
|
|
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-
|
|
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-
|
|
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-
|
|
637
|
-
<div className="text-[10px] font-semibold uppercase tracking-[0.18em] text-
|
|
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-
|
|
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
|
|
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-
|
|
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-
|
|
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-
|
|
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
|
|
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-
|
|
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-
|
|
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
|
|
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-
|
|
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-
|
|
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-
|
|
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
|
|
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-
|
|
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-
|
|
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-
|
|
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"
|
package/hedhog/frontend/app/courses/[id]/structure/_components/course-xp-overview-tab.tsx.ejs
CHANGED
|
@@ -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-
|
|
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
|
|
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-
|
|
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-
|
|
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-
|
|
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
|
|
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-
|
|
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-
|
|
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-
|
|
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
|
|
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-
|
|
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-
|
|
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-
|
|
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">
|