@hed-hog/lms 0.0.330 → 0.0.331

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 (31) hide show
  1. package/hedhog/frontend/app/_components/course-form-sheet.tsx.ejs +3 -3
  2. package/hedhog/frontend/app/certificates/models/page.tsx.ejs +1 -1
  3. package/hedhog/frontend/app/classes/[id]/page.tsx.ejs +17 -17
  4. package/hedhog/frontend/app/courses/[id]/_components/CourseMultiEntityPicker.tsx.ejs +2 -2
  5. package/hedhog/frontend/app/courses/[id]/page.tsx.ejs +3 -3
  6. package/hedhog/frontend/app/courses/[id]/structure/_components/course-tree-dnd.tsx.ejs +1 -1
  7. package/hedhog/frontend/app/courses/[id]/structure/_components/editor-lesson.tsx.ejs +228 -152
  8. package/hedhog/frontend/app/courses/[id]/structure/_components/shortcuts-help.tsx.ejs +71 -31
  9. package/hedhog/frontend/app/enterprise/[id]/page.tsx.ejs +37 -41
  10. package/hedhog/frontend/app/evaluations/_components/evaluation-topic-form-sheet.tsx.ejs +1 -1
  11. package/hedhog/frontend/app/exams/page.tsx.ejs +6 -2
  12. package/hedhog/frontend/app/instructors/_components/instructor-form-sheet.tsx.ejs +145 -119
  13. package/hedhog/frontend/app/instructors/page.tsx.ejs +71 -52
  14. package/hedhog/frontend/app/paths/page.tsx.ejs +11 -7
  15. package/hedhog/frontend/app/reports/courses/page.tsx.ejs +5 -5
  16. package/hedhog/frontend/app/reports/dashboard/page.tsx.ejs +8 -8
  17. package/hedhog/frontend/app/reports/page.tsx.ejs +7 -7
  18. package/hedhog/frontend/app/reports/students/page.tsx.ejs +6 -6
  19. package/hedhog/frontend/app/training/page.tsx.ejs +5 -5
  20. package/hedhog/frontend/messages/en.json +294 -46
  21. package/hedhog/frontend/messages/pt.json +289 -39
  22. package/hedhog/frontend/widgets/active-classes-kpi.tsx.ejs +1 -1
  23. package/hedhog/frontend/widgets/active-courses-kpi.tsx.ejs +1 -1
  24. package/hedhog/frontend/widgets/approval-rate-kpi.tsx.ejs +1 -1
  25. package/hedhog/frontend/widgets/class-calendar.tsx.ejs +2 -2
  26. package/hedhog/frontend/widgets/completion-rate-kpi.tsx.ejs +1 -1
  27. package/hedhog/frontend/widgets/issued-certificates-kpi.tsx.ejs +1 -1
  28. package/hedhog/frontend/widgets/total-students-kpi.tsx.ejs +1 -1
  29. package/hedhog/table/instructor_qualification.yaml +1 -1
  30. package/hedhog/table/instructor_skill.yaml +1 -1
  31. package/package.json +7 -7
@@ -73,6 +73,15 @@ const QUALIFICATION_LABELS: Record<string, string> = {
73
73
  'class-sessions': 'Sessões de turma',
74
74
  };
75
75
 
76
+ function getQualificationLabel(
77
+ slug: string,
78
+ t: (key: string) => string
79
+ ): string {
80
+ if (slug === 'course-lessons') return t('qualificationLabels.courseLessons');
81
+ if (slug === 'class-sessions') return t('qualificationLabels.classSessions');
82
+ return QUALIFICATION_LABELS[slug] ?? slug;
83
+ }
84
+
76
85
  function getInstructorInitials(name: string) {
77
86
  return name
78
87
  .split(' ')
@@ -239,7 +248,7 @@ export default function InstructorsPage() {
239
248
  const statsCards = [
240
249
  {
241
250
  key: 'total',
242
- title: 'Total de instrutores',
251
+ title: t('kpis.total'),
243
252
  value: stats.total,
244
253
  icon: Users,
245
254
  accentClassName: 'from-slate-500/20 via-slate-400/10 to-transparent',
@@ -247,7 +256,7 @@ export default function InstructorsPage() {
247
256
  },
248
257
  {
249
258
  key: 'active',
250
- title: 'Ativos',
259
+ title: t('kpis.active'),
251
260
  value: stats.active,
252
261
  icon: UserRoundPen,
253
262
  accentClassName: 'from-green-500/20 via-emerald-500/10 to-transparent',
@@ -255,7 +264,7 @@ export default function InstructorsPage() {
255
264
  },
256
265
  {
257
266
  key: 'inactive',
258
- title: 'Inativos',
267
+ title: t('kpis.inactive'),
259
268
  value: stats.inactive,
260
269
  icon: UserRoundPen,
261
270
  accentClassName: 'from-gray-500/20 via-gray-400/10 to-transparent',
@@ -272,11 +281,11 @@ export default function InstructorsPage() {
272
281
  setStatusFilter(value);
273
282
  setPage(1);
274
283
  },
275
- placeholder: 'Filtrar por status',
284
+ placeholder: t('filters.statusPlaceholder'),
276
285
  options: [
277
- { value: 'all', label: 'Todos os status' },
278
- { value: 'active', label: 'Ativo' },
279
- { value: 'inactive', label: 'Inativo' },
286
+ { value: 'all', label: t('filters.allStatuses') },
287
+ { value: 'active', label: t('form.fields.active') },
288
+ { value: 'inactive', label: t('form.fields.inactive') },
280
289
  ],
281
290
  },
282
291
  {
@@ -287,11 +296,17 @@ export default function InstructorsPage() {
287
296
  setQualificationFilter(value);
288
297
  setPage(1);
289
298
  },
290
- placeholder: 'Filtrar por qualificação',
299
+ placeholder: t('filters.qualificationPlaceholder'),
291
300
  options: [
292
- { value: 'all', label: 'Todas as qualificações' },
293
- { value: 'course-lessons', label: 'Aulas de curso' },
294
- { value: 'class-sessions', label: 'Sessões de turma' },
301
+ { value: 'all', label: t('filters.allQualifications') },
302
+ {
303
+ value: 'course-lessons',
304
+ label: t('qualificationLabels.courseLessons'),
305
+ },
306
+ {
307
+ value: 'class-sessions',
308
+ label: t('qualificationLabels.classSessions'),
309
+ },
295
310
  ],
296
311
  },
297
312
  ];
@@ -300,15 +315,15 @@ export default function InstructorsPage() {
300
315
  <Page>
301
316
  <PageHeader
302
317
  breadcrumbs={[
303
- { label: 'Home', href: '/' },
304
- { label: 'LMS', href: '/lms' },
305
- { label: 'Instrutores' },
318
+ { label: t('breadcrumbs.home'), href: '/' },
319
+ { label: t('breadcrumbs.lms'), href: '/lms' },
320
+ { label: t('breadcrumbs.instructors') },
306
321
  ]}
307
- title="Instrutores"
308
- description="Gerencie os perfis de instrutores da plataforma."
322
+ title={t('header.title')}
323
+ description={t('header.description')}
309
324
  actions={[
310
325
  {
311
- label: 'Novo Instrutor',
326
+ label: t('form.title'),
312
327
  onClick: openCreateSheet,
313
328
  icon: <Plus className="h-4 w-4" />,
314
329
  },
@@ -325,14 +340,14 @@ export default function InstructorsPage() {
325
340
  setSearchInput(value);
326
341
  }}
327
342
  onSearch={() => setPage(1)}
328
- placeholder="Buscar por nome ou e-mail..."
343
+ placeholder={t('search.placeholder')}
329
344
  controls={searchControls}
330
- />
345
+ />{' '}
331
346
  </div>
332
347
 
333
348
  <div className="flex items-center justify-between gap-3 sm:justify-start xl:justify-end">
334
349
  <span className="text-xs font-medium text-muted-foreground">
335
- Visualização
350
+ {t('viewMode.label')}
336
351
  </span>
337
352
  <ToggleGroup
338
353
  type="single"
@@ -340,23 +355,23 @@ export default function InstructorsPage() {
340
355
  onValueChange={handleViewModeChange}
341
356
  variant="outline"
342
357
  size="sm"
343
- aria-label="Modo de visualização"
358
+ aria-label={t('viewMode.ariaLabel')}
344
359
  >
345
360
  <ToggleGroupItem
346
361
  value="table"
347
362
  className="gap-1.5 px-2.5"
348
- aria-label="Tabela"
363
+ aria-label={t('viewMode.tableAriaLabel')}
349
364
  >
350
365
  <List className="h-4 w-4" />
351
- <span className="hidden sm:inline">Tabela</span>
366
+ <span className="hidden sm:inline">{t('viewMode.table')}</span>
352
367
  </ToggleGroupItem>
353
368
  <ToggleGroupItem
354
369
  value="cards"
355
370
  className="gap-1.5 px-2.5"
356
- aria-label="Cards"
371
+ aria-label={t('viewMode.cardsAriaLabel')}
357
372
  >
358
373
  <LayoutGrid className="h-4 w-4" />
359
- <span className="hidden sm:inline">Cards</span>
374
+ <span className="hidden sm:inline">{t('viewMode.cards')}</span>
360
375
  </ToggleGroupItem>
361
376
  </ToggleGroup>
362
377
  </div>
@@ -393,9 +408,9 @@ export default function InstructorsPage() {
393
408
  ) : paginate.data.length === 0 ? (
394
409
  <EmptyState
395
410
  icon={<UserRoundPen className="h-12 w-12" />}
396
- title="Nenhum instrutor encontrado"
397
- description="Crie um novo instrutor ou ajuste os filtros de busca."
398
- actionLabel="Novo Instrutor"
411
+ title={t('emptyState.title')}
412
+ description={t('emptyState.description')}
413
+ actionLabel={t('form.title')}
399
414
  actionIcon={<Plus className="mr-2 h-4 w-4" />}
400
415
  onAction={openCreateSheet}
401
416
  />
@@ -406,14 +421,14 @@ export default function InstructorsPage() {
406
421
  <Table>
407
422
  <TableHeader>
408
423
  <TableRow>
409
- <TableHead>Instrutor</TableHead>
410
- <TableHead>E-mail</TableHead>
411
- <TableHead>Telefone</TableHead>
412
- <TableHead>Qualificações</TableHead>
413
- <TableHead>Skills</TableHead>
414
- <TableHead>Valor/hora</TableHead>
415
- <TableHead>Training</TableHead>
416
- <TableHead>Status</TableHead>
424
+ <TableHead>{t('table.instructor')}</TableHead>
425
+ <TableHead>{t('table.email')}</TableHead>
426
+ <TableHead>{t('table.phone')}</TableHead>
427
+ <TableHead>{t('table.qualifications')}</TableHead>
428
+ <TableHead>{t('table.skills')}</TableHead>
429
+ <TableHead>{t('table.hourlyRate')}</TableHead>
430
+ <TableHead>{t('table.training')}</TableHead>
431
+ <TableHead>{t('table.status')}</TableHead>
417
432
  <TableHead className="w-10" />
418
433
  </TableRow>
419
434
  </TableHeader>
@@ -476,7 +491,7 @@ export default function InstructorsPage() {
476
491
  variant="outline"
477
492
  className="border-blue-500/20 bg-blue-500/10 px-2 py-0.5 text-[11px] font-medium text-blue-600"
478
493
  >
479
- {QUALIFICATION_LABELS[slug] ?? slug}
494
+ {getQualificationLabel(slug, t)}
480
495
  </Badge>
481
496
  )
482
497
  )}
@@ -518,14 +533,14 @@ export default function InstructorsPage() {
518
533
  variant="outline"
519
534
  className="border-amber-500/20 bg-amber-500/10 px-2.5 py-1 text-xs font-medium text-amber-600"
520
535
  >
521
- Ativo
536
+ {t('training.active')}
522
537
  </Badge>
523
538
  ) : instructor.userId ? (
524
539
  <Badge
525
540
  variant="outline"
526
541
  className="border-gray-500/20 bg-gray-500/10 px-2.5 py-1 text-xs font-medium text-gray-500"
527
542
  >
528
- Desabilitado
543
+ {t('training.disabled')}
529
544
  </Badge>
530
545
  ) : (
531
546
  <span className="text-xs text-muted-foreground">
@@ -543,7 +558,9 @@ export default function InstructorsPage() {
543
558
  : 'border-gray-500/20 bg-gray-500/10 text-gray-600'
544
559
  )}
545
560
  >
546
- {instructor.status === 'active' ? 'Ativo' : 'Inativo'}
561
+ {instructor.status === 'active'
562
+ ? t('form.fields.active')
563
+ : t('form.fields.inactive')}
547
564
  </Badge>
548
565
  </TableCell>
549
566
  <TableCell>
@@ -562,7 +579,7 @@ export default function InstructorsPage() {
562
579
  onClick={() => openEditSheet(instructor)}
563
580
  >
564
581
  <Pencil className="mr-2 h-4 w-4" />
565
- Editar
582
+ {t('actions.edit')}
566
583
  </DropdownMenuItem>
567
584
  <DropdownMenuSeparator />
568
585
  <DropdownMenuItem
@@ -573,7 +590,7 @@ export default function InstructorsPage() {
573
590
  }}
574
591
  >
575
592
  <Trash2 className="mr-2 h-4 w-4" />
576
- Excluir
593
+ {t('actions.delete')}
577
594
  </DropdownMenuItem>
578
595
  </DropdownMenuContent>
579
596
  </DropdownMenu>
@@ -641,7 +658,7 @@ export default function InstructorsPage() {
641
658
  onClick={() => openEditSheet(instructor)}
642
659
  >
643
660
  <Pencil className="mr-2 h-4 w-4" />
644
- Editar
661
+ {t('actions.edit')}
645
662
  </DropdownMenuItem>
646
663
  <DropdownMenuSeparator />
647
664
  <DropdownMenuItem
@@ -652,7 +669,7 @@ export default function InstructorsPage() {
652
669
  }}
653
670
  >
654
671
  <Trash2 className="mr-2 h-4 w-4" />
655
- Excluir
672
+ {t('actions.delete')}
656
673
  </DropdownMenuItem>
657
674
  </DropdownMenuContent>
658
675
  </DropdownMenu>
@@ -668,7 +685,9 @@ export default function InstructorsPage() {
668
685
  : 'border-gray-500/20 bg-gray-500/10 text-gray-600'
669
686
  )}
670
687
  >
671
- {instructor.status === 'active' ? 'Ativo' : 'Inativo'}
688
+ {instructor.status === 'active'
689
+ ? t('form.fields.active')
690
+ : t('form.fields.inactive')}
672
691
  </Badge>
673
692
  {instructor.qualificationSlugs.map((slug) => (
674
693
  <Badge
@@ -676,7 +695,7 @@ export default function InstructorsPage() {
676
695
  variant="outline"
677
696
  className="border-blue-500/20 bg-blue-500/10 px-2 py-0.5 text-[11px] font-medium text-blue-600"
678
697
  >
679
- {QUALIFICATION_LABELS[slug] ?? slug}
698
+ {getQualificationLabel(slug, t)}
680
699
  </Badge>
681
700
  ))}
682
701
  {(instructor.skills ?? []).map((skill) => (
@@ -723,23 +742,23 @@ export default function InstructorsPage() {
723
742
  <AlertDialog open={deleteDialogOpen} onOpenChange={setDeleteDialogOpen}>
724
743
  <AlertDialogContent>
725
744
  <AlertDialogHeader>
726
- <AlertDialogTitle>Excluir instrutor</AlertDialogTitle>
745
+ <AlertDialogTitle>{t('deleteDialog.title')}</AlertDialogTitle>
727
746
  <AlertDialogDescription>
728
- Tem certeza que deseja excluir o instrutor{' '}
729
- <strong>{instructorToDelete?.name}</strong>? Esta ação não pode
730
- ser desfeita.
747
+ {t('deleteDialog.description', {
748
+ name: instructorToDelete?.name ?? '',
749
+ })}
731
750
  </AlertDialogDescription>
732
751
  </AlertDialogHeader>
733
752
  <div className="flex justify-end gap-2">
734
753
  <AlertDialogCancel disabled={isDeleting}>
735
- Cancelar
754
+ {t('actions.cancel')}
736
755
  </AlertDialogCancel>
737
756
  <AlertDialogAction
738
757
  onClick={handleDeleteConfirm}
739
758
  disabled={isDeleting}
740
759
  className="bg-red-600 hover:bg-red-700"
741
760
  >
742
- {isDeleting ? 'Excluindo...' : 'Excluir'}
761
+ {isDeleting ? t('actions.deleting') : t('actions.delete')}
743
762
  </AlertDialogAction>
744
763
  </div>
745
764
  </AlertDialogContent>
@@ -1893,15 +1893,15 @@ export default function TrainingPage() {
1893
1893
  <FieldError>{form.formState.errors.nome?.message}</FieldError>
1894
1894
  </Field>
1895
1895
  <Field>
1896
- <FieldLabel htmlFor="descricao">
1897
- {t('form.fields.descricao.label')}{' '}
1896
+ <FieldLabel htmlFor="descricao">
1897
+ {t('form.fields.description.label')}{' '}
1898
1898
  <span className="text-destructive">*</span>
1899
1899
  </FieldLabel>
1900
1900
  <Textarea
1901
- id="descricao"
1901
+ id="descricao"
1902
1902
  rows={3}
1903
- placeholder={t('form.fields.descricao.placeholder')}
1904
- {...form.register('descricao')}
1903
+ placeholder={t('form.fields.description.placeholder')}
1904
+ {...form.register('descricao')}
1905
1905
  />
1906
1906
  <FieldError>
1907
1907
  {form.formState.errors.descricao?.message}
@@ -1984,7 +1984,9 @@ export default function TrainingPage() {
1984
1984
 
1985
1985
  <div className="grid grid-cols-1 gap-4 sm:grid-cols-2">
1986
1986
  <Field>
1987
- <FieldLabel htmlFor="primaryColor">Cor Primária</FieldLabel>
1987
+ <FieldLabel htmlFor="primaryColor">
1988
+ {t('form.fields.primaryColor.label')}
1989
+ </FieldLabel>
1988
1990
  <Controller
1989
1991
  name="primaryColor"
1990
1992
  control={form.control}
@@ -2011,7 +2013,9 @@ export default function TrainingPage() {
2011
2013
  </Field>
2012
2014
 
2013
2015
  <Field>
2014
- <FieldLabel htmlFor="secondaryColor">Cor Secundária</FieldLabel>
2016
+ <FieldLabel htmlFor="secondaryColor">
2017
+ {t('form.fields.secondaryColor.label')}
2018
+ </FieldLabel>
2015
2019
  <Controller
2016
2020
  name="secondaryColor"
2017
2021
  control={form.control}
@@ -429,7 +429,7 @@ export default function ReportCoursesPage() {
429
429
  }
430
430
  };
431
431
 
432
- const renderEmptyState = (className = 'min-h-[180px]') => (
432
+ const renderEmptyState = (className = 'min-h-45') => (
433
433
  <EmptyState
434
434
  icon={Inbox}
435
435
  title={t('emptyState.title')}
@@ -495,7 +495,7 @@ export default function ReportCoursesPage() {
495
495
  <div className="grid grid-cols-1 gap-4 sm:grid-cols-2 xl:grid-cols-4">
496
496
  {Array.from({ length: 4 }).map((_, i) => (
497
497
  <Card key={i} className="overflow-hidden border-border/70 py-0">
498
- <div className="h-1 w-full bg-gradient-to-r from-slate-300/70 via-slate-200 to-transparent" />
498
+ <div className="h-1 w-full bg-linear-to-r from-slate-300/70 via-slate-200 to-transparent" />
499
499
  <CardContent className="p-6">
500
500
  <Skeleton className="mb-3 h-4 w-28" />
501
501
  <Skeleton className="mb-2 h-8 w-24" />
@@ -544,7 +544,7 @@ export default function ReportCoursesPage() {
544
544
  <Card>
545
545
  <CardContent className="p-6">
546
546
  <Skeleton className="mb-4 h-5 w-40" />
547
- <Skeleton className="h-[240px] w-full" />
547
+ <Skeleton className="h-60 w-full" />
548
548
  </CardContent>
549
549
  </Card>
550
550
  <div className="grid grid-cols-1 gap-4 sm:grid-cols-2 xl:grid-cols-4">
@@ -664,7 +664,7 @@ export default function ReportCoursesPage() {
664
664
  <Table>
665
665
  <TableHeader>
666
666
  <TableRow>
667
- <TableHead className="w-[44px]">#</TableHead>
667
+ <TableHead className="w-11">#</TableHead>
668
668
  <TableHead>{t('table.course')}</TableHead>
669
669
  <TableHead>{t('table.students')}</TableHead>
670
670
  <TableHead className="hidden sm:table-cell">
@@ -789,7 +789,7 @@ export default function ReportCoursesPage() {
789
789
  {loading ? (
790
790
  <div className="p-6">
791
791
  <Skeleton className="mb-4 h-5 w-48" />
792
- <Skeleton className="h-[180px] w-full" />
792
+ <Skeleton className="h-45 w-full" />
793
793
  </div>
794
794
  ) : filteredCategoryPerformance.length === 0 ? (
795
795
  <div className="px-6 pb-6">
@@ -452,7 +452,7 @@ export default function ReportsDashboardPage() {
452
452
  }
453
453
  };
454
454
 
455
- const renderEmptyState = (className = 'min-h-[180px]') => (
455
+ const renderEmptyState = (className = 'min-h-45') => (
456
456
  <EmptyState
457
457
  icon={Inbox}
458
458
  title={t('emptyState.title')}
@@ -493,7 +493,7 @@ export default function ReportsDashboardPage() {
493
493
  <div className="grid grid-cols-1 gap-4 sm:grid-cols-2 xl:grid-cols-4">
494
494
  {Array.from({ length: 4 }).map((_, i) => (
495
495
  <Card key={i} className="overflow-hidden border-border/70 py-0">
496
- <div className="h-1 w-full bg-gradient-to-r from-slate-300/70 via-slate-200 to-transparent" />
496
+ <div className="h-1 w-full bg-linear-to-r from-slate-300/70 via-slate-200 to-transparent" />
497
497
  <CardContent className="p-6">
498
498
  <Skeleton className="mb-3 h-4 w-28" />
499
499
  <Skeleton className="mb-2 h-8 w-24" />
@@ -534,7 +534,7 @@ export default function ReportsDashboardPage() {
534
534
  <Card>
535
535
  <CardContent className="p-6">
536
536
  <Skeleton className="mb-4 h-5 w-44" />
537
- <Skeleton className="h-[240px] w-full" />
537
+ <Skeleton className="h-60 w-full" />
538
538
  </CardContent>
539
539
  </Card>
540
540
  <div className="grid grid-cols-1 gap-4 sm:grid-cols-2 xl:grid-cols-4">
@@ -626,13 +626,13 @@ export default function ReportsDashboardPage() {
626
626
  <Card>
627
627
  <CardContent className="p-6">
628
628
  <Skeleton className="mb-4 h-5 w-40" />
629
- <Skeleton className="h-[300px] w-full" />
629
+ <Skeleton className="h-75 w-full" />
630
630
  </CardContent>
631
631
  </Card>
632
632
  <Card>
633
633
  <CardContent className="p-6">
634
634
  <Skeleton className="mb-4 h-5 w-40" />
635
- <Skeleton className="h-[300px] w-full" />
635
+ <Skeleton className="h-75 w-full" />
636
636
  </CardContent>
637
637
  </Card>
638
638
  </>
@@ -654,7 +654,7 @@ export default function ReportsDashboardPage() {
654
654
  <Table>
655
655
  <TableHeader>
656
656
  <TableRow>
657
- <TableHead className="w-[44px]">#</TableHead>
657
+ <TableHead className="w-11">#</TableHead>
658
658
  <TableHead>{t('table.course')}</TableHead>
659
659
  <TableHead>{t('table.students')}</TableHead>
660
660
  <TableHead>{t('table.score')}</TableHead>
@@ -736,13 +736,13 @@ export default function ReportsDashboardPage() {
736
736
  <Card>
737
737
  <CardContent className="p-6">
738
738
  <Skeleton className="mb-4 h-5 w-44" />
739
- <Skeleton className="h-[260px] w-full" />
739
+ <Skeleton className="h-65 w-full" />
740
740
  </CardContent>
741
741
  </Card>
742
742
  <Card>
743
743
  <CardContent className="p-6">
744
744
  <Skeleton className="mb-4 h-5 w-44" />
745
- <Skeleton className="h-[260px] w-full" />
745
+ <Skeleton className="h-65 w-full" />
746
746
  </CardContent>
747
747
  </Card>
748
748
  </>
@@ -412,7 +412,7 @@ export default function ReportsDashboardPage() {
412
412
  }
413
413
  };
414
414
 
415
- const renderEmptyState = (className = 'min-h-[180px]') => (
415
+ const renderEmptyState = (className = 'min-h-45') => (
416
416
  <div
417
417
  className={`flex flex-col items-center justify-center rounded-lg border border-dashed bg-muted/20 px-6 py-10 text-center ${className}`}
418
418
  >
@@ -496,7 +496,7 @@ export default function ReportsDashboardPage() {
496
496
  <Card>
497
497
  <CardContent className="p-6">
498
498
  <Skeleton className="mb-4 h-5 w-44" />
499
- <Skeleton className="h-[240px] w-full" />
499
+ <Skeleton className="h-60 w-full" />
500
500
  </CardContent>
501
501
  </Card>
502
502
  <div className="grid grid-cols-1 gap-4 sm:grid-cols-2 xl:grid-cols-4">
@@ -640,13 +640,13 @@ export default function ReportsDashboardPage() {
640
640
  <Card>
641
641
  <CardContent className="p-6">
642
642
  <Skeleton className="mb-4 h-5 w-40" />
643
- <Skeleton className="h-[300px] w-full" />
643
+ <Skeleton className="h-75 w-full" />
644
644
  </CardContent>
645
645
  </Card>
646
646
  <Card>
647
647
  <CardContent className="p-6">
648
648
  <Skeleton className="mb-4 h-5 w-40" />
649
- <Skeleton className="h-[300px] w-full" />
649
+ <Skeleton className="h-75 w-full" />
650
650
  </CardContent>
651
651
  </Card>
652
652
  </>
@@ -668,7 +668,7 @@ export default function ReportsDashboardPage() {
668
668
  <Table>
669
669
  <TableHeader>
670
670
  <TableRow>
671
- <TableHead className="w-[44px]">#</TableHead>
671
+ <TableHead className="w-11">#</TableHead>
672
672
  <TableHead>{t('table.course')}</TableHead>
673
673
  <TableHead>{t('table.students')}</TableHead>
674
674
  <TableHead>{t('table.score')}</TableHead>
@@ -750,13 +750,13 @@ export default function ReportsDashboardPage() {
750
750
  <Card>
751
751
  <CardContent className="p-6">
752
752
  <Skeleton className="mb-4 h-5 w-44" />
753
- <Skeleton className="h-[260px] w-full" />
753
+ <Skeleton className="h-65 w-full" />
754
754
  </CardContent>
755
755
  </Card>
756
756
  <Card>
757
757
  <CardContent className="p-6">
758
758
  <Skeleton className="mb-4 h-5 w-44" />
759
- <Skeleton className="h-[260px] w-full" />
759
+ <Skeleton className="h-65 w-full" />
760
760
  </CardContent>
761
761
  </Card>
762
762
  </>
@@ -422,7 +422,7 @@ export default function ReportStudentsPage() {
422
422
  }
423
423
  };
424
424
 
425
- const renderEmptyState = (className = 'min-h-[180px]') => (
425
+ const renderEmptyState = (className = 'min-h-45') => (
426
426
  <EmptyState
427
427
  icon={Inbox}
428
428
  title={t('emptyState.title')}
@@ -480,7 +480,7 @@ export default function ReportStudentsPage() {
480
480
  <div className="grid grid-cols-1 gap-4 sm:grid-cols-2 xl:grid-cols-4">
481
481
  {Array.from({ length: 4 }).map((_, i) => (
482
482
  <Card key={i} className="overflow-hidden border-border/70 py-0">
483
- <div className="h-1 w-full bg-gradient-to-r from-slate-300/70 via-slate-200 to-transparent" />
483
+ <div className="h-1 w-full bg-linear-to-r from-slate-300/70 via-slate-200 to-transparent" />
484
484
  <CardContent className="p-6">
485
485
  <Skeleton className="mb-3 h-4 w-28" />
486
486
  <Skeleton className="mb-2 h-8 w-24" />
@@ -529,7 +529,7 @@ export default function ReportStudentsPage() {
529
529
  <Card>
530
530
  <CardContent className="p-6">
531
531
  <Skeleton className="mb-4 h-5 w-44" />
532
- <Skeleton className="h-[240px] w-full" />
532
+ <Skeleton className="h-60 w-full" />
533
533
  </CardContent>
534
534
  </Card>
535
535
  <div className="grid grid-cols-1 gap-4 sm:grid-cols-2 xl:grid-cols-4">
@@ -611,13 +611,13 @@ export default function ReportStudentsPage() {
611
611
  <Card>
612
612
  <CardContent className="p-6">
613
613
  <Skeleton className="mb-4 h-5 w-40" />
614
- <Skeleton className="h-[300px] w-full" />
614
+ <Skeleton className="h-75 w-full" />
615
615
  </CardContent>
616
616
  </Card>
617
617
  <Card>
618
618
  <CardContent className="p-6">
619
619
  <Skeleton className="mb-4 h-5 w-44" />
620
- <Skeleton className="h-[300px] w-full" />
620
+ <Skeleton className="h-75 w-full" />
621
621
  </CardContent>
622
622
  </Card>
623
623
  </>
@@ -718,7 +718,7 @@ export default function ReportStudentsPage() {
718
718
  {loading ? (
719
719
  <div className="p-6">
720
720
  <Skeleton className="mb-4 h-5 w-48" />
721
- <Skeleton className="h-[180px] w-full" />
721
+ <Skeleton className="h-45 w-full" />
722
722
  </div>
723
723
  ) : filteredCategoryPerformance.length === 0 ? (
724
724
  <div className="px-6 pb-6">
@@ -1886,15 +1886,15 @@ export default function TrainingPage() {
1886
1886
  <FieldError>{form.formState.errors.nome?.message}</FieldError>
1887
1887
  </Field>
1888
1888
  <Field>
1889
- <FieldLabel htmlFor="descricao">
1890
- {t('form.fields.descricao.label')}{' '}
1889
+ <FieldLabel htmlFor="descricao">
1890
+ {t('form.fields.description.label')}{' '}
1891
1891
  <span className="text-destructive">*</span>
1892
1892
  </FieldLabel>
1893
1893
  <Textarea
1894
- id="descricao"
1894
+ id="descricao"
1895
1895
  rows={3}
1896
- placeholder={t('form.fields.descricao.placeholder')}
1897
- {...form.register('descricao')}
1896
+ placeholder={t('form.fields.description.placeholder')}
1897
+ {...form.register('descricao')}
1898
1898
  />
1899
1899
  <FieldError>
1900
1900
  {form.formState.errors.descricao?.message}