utn-cli 2.1.45 → 2.1.47

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 (36) hide show
  1. package/package.json +1 -1
  2. package/templates/frontend/src/app/Componentes/Nucleo/calendario-publico/calendario-publico.component.css +44 -4
  3. package/templates/frontend/src/app/Componentes/Nucleo/calendario-publico/calendario-publico.component.html +10 -8
  4. package/templates/frontend/src/app/Componentes/Nucleo/calendario-publico/calendario-publico.component.ts +2 -2
  5. package/templates/frontend/src/app/Componentes/Nucleo/estadisticas-del-modulo/estadisticas-del-modulo.component.css +49 -2
  6. package/templates/frontend/src/app/Componentes/Nucleo/estadisticas-del-modulo/estadisticas-del-modulo.component.html +9 -2
  7. package/templates/frontend/src/app/Componentes/Nucleo/estadisticas-del-modulo/estadisticas-del-modulo.component.ts +2 -2
  8. package/templates/frontend/src/app/Componentes/Nucleo/gestion-actividad/gestion-actividad.component.css +10 -2
  9. package/templates/frontend/src/app/Componentes/Nucleo/manual/manual.component.css +76 -7
  10. package/templates/frontend/src/app/Componentes/Nucleo/manual/manual.component.html +25 -7
  11. package/templates/frontend/src/app/Componentes/Nucleo/manual/manual.component.ts +93 -16
  12. package/templates/frontend/src/app/Componentes/Nucleo/mensaje-confirmacion/mensaje-confirmacion.component.css +71 -3
  13. package/templates/frontend/src/app/Componentes/Nucleo/mensaje-confirmacion/mensaje-confirmacion.component.html +11 -8
  14. package/templates/frontend/src/app/Componentes/Nucleo/mensaje-confirmacion/mensaje-confirmacion.ts +3 -3
  15. package/templates/frontend/src/app/Componentes/Nucleo/mensajes/mensajes.component.css +67 -0
  16. package/templates/frontend/src/app/Componentes/Nucleo/mensajes/mensajes.component.html +21 -9
  17. package/templates/frontend/src/app/Componentes/Nucleo/mensajes/mensajes.component.ts +1 -2
  18. package/templates/frontend/src/app/Componentes/Nucleo/panel-notificaciones/panel-notificaciones.component.css +209 -0
  19. package/templates/frontend/src/app/Componentes/Nucleo/panel-notificaciones/panel-notificaciones.component.html +45 -0
  20. package/templates/frontend/src/app/Componentes/Nucleo/panel-notificaciones/panel-notificaciones.component.ts +53 -0
  21. package/templates/frontend/src/app/Componentes/Nucleo/reporte-de-incidencias/reporte-de-incidencias.component.css +106 -13
  22. package/templates/frontend/src/app/Componentes/Nucleo/reporte-de-incidencias/reporte-de-incidencias.component.html +43 -32
  23. package/templates/frontend/src/app/Componentes/Nucleo/reporte-de-incidencias/reporte-de-incidencias.component.ts +4 -3
  24. package/templates/frontend/src/app/Componentes/Nucleo/reporte-de-sugerencias/reporte-de-sugerencias.component.css +76 -21
  25. package/templates/frontend/src/app/Componentes/Nucleo/reporte-de-sugerencias/reporte-de-sugerencias.component.html +23 -14
  26. package/templates/frontend/src/app/Componentes/Nucleo/reporte-de-sugerencias/reporte-de-sugerencias.component.ts +4 -3
  27. package/templates/frontend/src/app/Componentes/Nucleo/tarjeta-modulo/tarjeta-modulo.component.css +20 -10
  28. package/templates/frontend/src/app/Componentes/Nucleo/tarjeta-modulo/tarjeta-modulo.component.html +17 -8
  29. package/templates/frontend/src/app/Paginas/Nucleo/accesibilidad/accesibilidad.component.css +20 -1
  30. package/templates/frontend/src/app/Paginas/Nucleo/contenedor-componentes/contenedor-componentes.component.css +143 -48
  31. package/templates/frontend/src/app/Paginas/Nucleo/contenedor-componentes/contenedor-componentes.component.html +60 -38
  32. package/templates/frontend/src/app/Paginas/Nucleo/contenedor-componentes/contenedor-componentes.component.ts +28 -6
  33. package/templates/frontend/src/app/Paginas/Nucleo/declaracion-ia/declaracion-ia.component.css +4 -4
  34. package/templates/frontend/src/app/datos-globales.service.ts +2 -1
  35. package/templates/frontend/src/index.html +7 -0
  36. package/templates/frontend/src/styles.css +14 -1
@@ -1,23 +1,26 @@
1
- <h3 mat-dialog-title>{{ data.titulo }}</h3>
1
+ <div class="dialogo-header">
2
+ <mat-icon class="dialogo-icono">help_outline</mat-icon>
3
+ <span class="dialogo-titulo">{{ data.titulo }}</span>
4
+ </div>
2
5
 
3
6
  <mat-dialog-content>
4
- <p>{{ data.mensaje }}</p>
7
+ <p class="dialogo-mensaje">{{ data.mensaje }}</p>
5
8
  @if(SolicitaMensaje){
6
- <mat-form-field class="mensaje">
9
+ <mat-form-field class="mensaje" appearance="outline">
7
10
  <mat-label>Agregar comentario</mat-label>
8
11
  <textarea matInput placeholder="Explicación del motivo de aprobación o rechazo"
9
12
  [(ngModel)]="MensajeBrindado"></textarea>
10
13
  </mat-form-field>
11
14
  }
12
-
13
15
  </mat-dialog-content>
14
16
 
15
17
  <mat-dialog-actions>
16
18
  @if(data.textoCerrar){
17
- <button mat-button (click)="onClose()">{{ data.textoCerrar }}</button>
19
+ <button mat-stroked-button class="btn-cancelar" (click)="onClose()">{{ data.textoCerrar }}</button>
18
20
  }
19
-
20
21
  @if(data.textoAceptar){
21
- <button mat-button (click)="onAccept()" cdkFocusInitial>{{ data.textoAceptar }}</button>
22
+ <button mat-flat-button class="btn-aceptar" (click)="onAccept()" cdkFocusInitial>{{ data.textoAceptar }}</button>
22
23
  }
23
- </mat-dialog-actions>
24
+ </mat-dialog-actions>
25
+
26
+ <div class="dialogo-pie"></div>
@@ -1,11 +1,11 @@
1
1
  import { Component, Inject } from '@angular/core';
2
2
  import { MatButtonModule } from '@angular/material/button';
3
+ import { MatIconModule } from '@angular/material/icon';
3
4
  import {
4
5
  MAT_DIALOG_DATA,
5
6
  MatDialogActions,
6
7
  MatDialogContent,
7
- MatDialogRef,
8
- MatDialogTitle
8
+ MatDialogRef
9
9
  } from '@angular/material/dialog';
10
10
  import { MatFormFieldModule } from '@angular/material/form-field';
11
11
  import { MatInputModule } from '@angular/material/input';
@@ -27,7 +27,7 @@ export interface DialogData {
27
27
  styleUrls: ['./mensaje-confirmacion.component.css'],
28
28
  imports: [
29
29
  MatButtonModule,
30
- MatDialogTitle,
30
+ MatIconModule,
31
31
  MatDialogContent,
32
32
  MatDialogActions,
33
33
  MatFormFieldModule,
@@ -1,3 +1,51 @@
1
+ /* Header */
2
+ .dialogo-header {
3
+ display: flex;
4
+ align-items: center;
5
+ gap: 10px;
6
+ background: linear-gradient(90deg, rgba(1, 33, 105, 1) 0%, rgba(63, 97, 171, 1) 100%);
7
+ color: white;
8
+ padding: 24px 20px 16px;
9
+ margin: -8px -8px 0;
10
+ }
11
+
12
+ .dialogo-icono {
13
+ font-size: 24px;
14
+ width: 24px;
15
+ height: 24px;
16
+ flex-shrink: 0;
17
+ }
18
+
19
+ .dialogo-titulo {
20
+ font-size: 1.1rem;
21
+ font-weight: 600;
22
+ font-family: 'Roboto', sans-serif;
23
+ letter-spacing: 0.2px;
24
+ }
25
+
26
+ /* Sin mensajes */
27
+ .sin-mensajes {
28
+ display: flex;
29
+ flex-direction: column;
30
+ align-items: center;
31
+ padding: 32px 16px;
32
+ color: #8fa0b4;
33
+ gap: 8px;
34
+ }
35
+
36
+ .sin-mensajes-icono {
37
+ font-size: 40px;
38
+ width: 40px;
39
+ height: 40px;
40
+ }
41
+
42
+ .sin-mensajes p {
43
+ font-size: 0.95rem;
44
+ font-family: 'Roboto', sans-serif;
45
+ margin: 0;
46
+ }
47
+
48
+ /* Líneas de mensajes */
1
49
  .linea {
2
50
  display: flex;
3
51
  justify-content: space-between;
@@ -9,3 +57,22 @@
9
57
  text-decoration: line-through;
10
58
  color: gray;
11
59
  }
60
+
61
+ /* Botones */
62
+ mat-dialog-actions {
63
+ padding: 8px 20px 16px;
64
+ }
65
+
66
+ .btn-cerrar {
67
+ color: #012169;
68
+ border-color: #012169;
69
+ font-family: 'Roboto', sans-serif;
70
+ font-weight: 500;
71
+ }
72
+
73
+ /* Pie */
74
+ .dialogo-pie {
75
+ height: 20px;
76
+ background: linear-gradient(90deg, rgba(1, 33, 105, 1) 0%, rgba(63, 97, 171, 1) 100%);
77
+ margin: 0 -8px;
78
+ }
@@ -1,17 +1,29 @@
1
- <h3 mat-dialog-title>Mensajes</h3>
1
+ <div class="dialogo-header">
2
+ <mat-icon class="dialogo-icono">mark_email_unread</mat-icon>
3
+ <span class="dialogo-titulo">Mensajes</span>
4
+ </div>
2
5
 
3
6
  <mat-dialog-content>
4
- @for (item of arregloDeDatos; track item.llave) {
5
- <div class="linea" [class.tachado]="item.tachado">
6
- <span [innerHTML]="item.valor"></span>
7
- <button mat-icon-button color="primary" (click)="enviar(item)">
8
- <mat-icon>beenhere</mat-icon>
9
- </button>
7
+ @if (arregloDeDatos.length === 0) {
8
+ <div class="sin-mensajes">
9
+ <mat-icon class="sin-mensajes-icono">inbox</mat-icon>
10
+ <p>No hay notificaciones actualmente</p>
10
11
  </div>
11
- <mat-divider></mat-divider>
12
+ } @else {
13
+ @for (item of arregloDeDatos; track item.llave) {
14
+ <div class="linea" [class.tachado]="item.tachado">
15
+ <span [innerHTML]="item.valor"></span>
16
+ <button mat-icon-button color="primary" (click)="enviar(item)">
17
+ <mat-icon>beenhere</mat-icon>
18
+ </button>
19
+ </div>
20
+ <mat-divider></mat-divider>
21
+ }
12
22
  }
13
23
  </mat-dialog-content>
14
24
 
15
25
  <mat-dialog-actions align="end">
16
- <button mat-button (click)="onClose()">Cerrar</button>
26
+ <button mat-stroked-button class="btn-cerrar" (click)="onClose()">Cerrar</button>
17
27
  </mat-dialog-actions>
28
+
29
+ <div class="dialogo-pie"></div>
@@ -4,7 +4,7 @@ import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
4
4
  import { MatIconModule } from '@angular/material/icon';
5
5
  import { MatButtonModule } from '@angular/material/button';
6
6
  import { MatDividerModule } from '@angular/material/divider';
7
- import { MatDialogContent, MatDialogActions, MatDialogTitle } from '@angular/material/dialog';
7
+ import { MatDialogContent, MatDialogActions } from '@angular/material/dialog';
8
8
  import { CommonModule } from '@angular/common';
9
9
  import { DatosGlobalesService } from '../../../datos-globales.service';
10
10
 
@@ -20,7 +20,6 @@ interface FilaMensaje { llave: string; valor: string; tachado: boolean }
20
20
  MatButtonModule,
21
21
  MatIconModule,
22
22
  MatDividerModule,
23
- MatDialogTitle,
24
23
  MatDialogContent,
25
24
  MatDialogActions
26
25
  ]
@@ -0,0 +1,209 @@
1
+ /* Overlay */
2
+ .panel-overlay {
3
+ position: fixed;
4
+ top: 52px;
5
+ left: 0;
6
+ right: 0;
7
+ bottom: 0;
8
+ background: rgba(0, 0, 0, 0.3);
9
+ z-index: 999;
10
+ animation: overlayEntrada 0.25s ease;
11
+ }
12
+
13
+ .panel-overlay-cerrando {
14
+ animation: overlaySalida 0.26s ease forwards;
15
+ pointer-events: none;
16
+ }
17
+
18
+ @keyframes overlayEntrada {
19
+ from { opacity: 0; }
20
+ to { opacity: 1; }
21
+ }
22
+
23
+ @keyframes overlaySalida {
24
+ from { opacity: 1; }
25
+ to { opacity: 0; }
26
+ }
27
+
28
+ /* Panel */
29
+ .panel {
30
+ position: fixed;
31
+ top: 52px;
32
+ right: 0;
33
+ height: calc(100vh - 52px);
34
+ width: 320px;
35
+ max-width: 100vw;
36
+ background: white;
37
+ z-index: 1000;
38
+ display: flex;
39
+ flex-direction: column;
40
+ box-shadow: -4px 0 20px rgba(0, 0, 0, 0.18);
41
+ animation: panelEntrada 0.28s cubic-bezier(0.25, 0.8, 0.25, 1);
42
+ }
43
+
44
+ .panel-cerrando {
45
+ animation: panelSalida 0.26s cubic-bezier(0.4, 0, 0.6, 1) forwards;
46
+ pointer-events: none;
47
+ }
48
+
49
+ @keyframes panelEntrada {
50
+ from { transform: translateX(100%); }
51
+ to { transform: translateX(0); }
52
+ }
53
+
54
+ @keyframes panelSalida {
55
+ from { transform: translateX(0); }
56
+ to { transform: translateX(100%); }
57
+ }
58
+
59
+ /* Header */
60
+ .panel-header {
61
+ display: flex;
62
+ align-items: center;
63
+ justify-content: space-between;
64
+ background: linear-gradient(90deg, rgba(1, 33, 105, 1) 0%, rgba(63, 97, 171, 1) 100%);
65
+ color: white;
66
+ padding: 18px 16px;
67
+ flex-shrink: 0;
68
+ }
69
+
70
+ .panel-header-izq {
71
+ display: flex;
72
+ align-items: center;
73
+ gap: 10px;
74
+ }
75
+
76
+ .panel-icono {
77
+ font-size: 22px;
78
+ width: 22px;
79
+ height: 22px;
80
+ }
81
+
82
+ .panel-titulo {
83
+ font-size: 1.05rem;
84
+ font-weight: 600;
85
+ font-family: 'Roboto', sans-serif;
86
+ }
87
+
88
+ .panel-btn-cerrar {
89
+ display: flex;
90
+ align-items: center;
91
+ background: none;
92
+ border: none;
93
+ color: white;
94
+ cursor: pointer;
95
+ padding: 4px;
96
+ border-radius: 50%;
97
+ transition: background 0.2s;
98
+ }
99
+
100
+ .panel-btn-cerrar:hover {
101
+ background: rgba(255, 255, 255, 0.15);
102
+ }
103
+
104
+ /* Contenido */
105
+ .panel-contenido {
106
+ flex: 1;
107
+ overflow-y: auto;
108
+ padding: 8px 16px;
109
+ }
110
+
111
+ /* Sin mensajes */
112
+ .sin-mensajes {
113
+ display: flex;
114
+ flex-direction: column;
115
+ align-items: center;
116
+ padding: 48px 16px;
117
+ color: #8fa0b4;
118
+ gap: 10px;
119
+ }
120
+
121
+ .sin-mensajes-icono {
122
+ font-size: 48px;
123
+ width: 48px;
124
+ height: 48px;
125
+ }
126
+
127
+ .sin-mensajes p {
128
+ font-size: 0.95rem;
129
+ font-family: 'Roboto', sans-serif;
130
+ margin: 0;
131
+ }
132
+
133
+ /* Barra de acciones */
134
+ .barra-acciones {
135
+ display: flex;
136
+ justify-content: center;
137
+ padding: 8px 0;
138
+ border-bottom: 1px solid #e0e0e0;
139
+ margin-bottom: 4px;
140
+ }
141
+
142
+ .link-borrar-todas {
143
+ font-size: 0.75rem;
144
+ font-family: 'Roboto', sans-serif;
145
+ color: #8fa0b4;
146
+ cursor: pointer;
147
+ transition: color 0.2s;
148
+ outline: none;
149
+ border-radius: 3px;
150
+ }
151
+
152
+ .link-borrar-todas:hover {
153
+ color: #d32f2f;
154
+ }
155
+
156
+ .link-borrar-todas:focus-visible {
157
+ outline: 2px solid #3F61AB;
158
+ outline-offset: 3px;
159
+ color: #3F61AB;
160
+ }
161
+
162
+ /* Líneas */
163
+ .linea {
164
+ display: flex;
165
+ justify-content: space-between;
166
+ align-items: center;
167
+ padding: 16px 0;
168
+ font-family: 'Roboto', sans-serif;
169
+ font-size: 0.9rem;
170
+ color: #333;
171
+ }
172
+
173
+
174
+ .tachado {
175
+ text-decoration: line-through;
176
+ color: #aaa;
177
+ }
178
+
179
+ .eliminando {
180
+ animation: deslizarIzquierda 0.35s cubic-bezier(0.4, 0, 0.6, 1) forwards;
181
+ pointer-events: none;
182
+ }
183
+
184
+ @keyframes deslizarIzquierda {
185
+ from {
186
+ transform: translateX(0);
187
+ opacity: 1;
188
+ max-height: 80px;
189
+ }
190
+ 60% {
191
+ transform: translateX(-110%);
192
+ opacity: 0;
193
+ max-height: 80px;
194
+ }
195
+ to {
196
+ transform: translateX(-110%);
197
+ opacity: 0;
198
+ max-height: 0;
199
+ padding: 0;
200
+ margin: 0;
201
+ }
202
+ }
203
+
204
+ /* Pie */
205
+ .panel-pie {
206
+ height: 18px;
207
+ background: linear-gradient(90deg, rgba(1, 33, 105, 1) 0%, rgba(63, 97, 171, 1) 100%);
208
+ flex-shrink: 0;
209
+ }
@@ -0,0 +1,45 @@
1
+ <div class="panel-overlay" [class.panel-overlay-cerrando]="cerrando" (click)="onCerrar()"></div>
2
+
3
+ <div class="panel" [class.panel-cerrando]="cerrando">
4
+ <div class="panel-header">
5
+ <div class="panel-header-izq">
6
+ <mat-icon class="panel-icono">mark_email_unread</mat-icon>
7
+ <span class="panel-titulo">Notificaciones</span>
8
+ </div>
9
+ <button class="panel-btn-cerrar" (click)="onCerrar()" matTooltip="Cerrar">
10
+ <mat-icon>close</mat-icon>
11
+ </button>
12
+ </div>
13
+
14
+ <div class="panel-contenido">
15
+ @if (datos.length === 0) {
16
+ <div class="sin-mensajes">
17
+ <mat-icon class="sin-mensajes-icono">inbox</mat-icon>
18
+ <p>No hay notificaciones actualmente</p>
19
+ </div>
20
+ } @else {
21
+ <div class="barra-acciones">
22
+ <span
23
+ class="link-borrar-todas"
24
+ (click)="eliminarTodas()"
25
+ (keydown.enter)="eliminarTodas()"
26
+ (keydown.space)="eliminarTodas()"
27
+ tabindex="0"
28
+ role="button"
29
+ aria-label="Borrar todas las notificaciones">Borrar todas</span>
30
+ </div>
31
+
32
+ @for (item of datos; track item.llave) {
33
+ <div class="linea" [class.eliminando]="item.eliminando">
34
+ <span [innerHTML]="item.valor"></span>
35
+ <button mat-icon-button (click)="eliminarNotificacion(item)" matTooltip="Eliminar notificación">
36
+ <mat-icon>delete</mat-icon>
37
+ </button>
38
+ </div>
39
+ <mat-divider></mat-divider>
40
+ }
41
+ }
42
+ </div>
43
+
44
+ <div class="panel-pie"></div>
45
+ </div>
@@ -0,0 +1,53 @@
1
+ import { Component, Input, Output, EventEmitter } from '@angular/core';
2
+ import { HttpClient } from '@angular/common/http';
3
+ import { MatIconModule } from '@angular/material/icon';
4
+ import { MatButtonModule } from '@angular/material/button';
5
+ import { MatDividerModule } from '@angular/material/divider';
6
+ import { MatTooltipModule } from '@angular/material/tooltip';
7
+ import { DatosGlobalesService } from '../../../datos-globales.service';
8
+
9
+ interface FilaMensaje { llave: string; valor: string; tachado: boolean; eliminando: boolean; }
10
+
11
+ @Component({
12
+ selector: 'app-panel-notificaciones',
13
+ templateUrl: './panel-notificaciones.component.html',
14
+ styleUrls: ['./panel-notificaciones.component.css'],
15
+ standalone: true,
16
+ imports: [MatIconModule, MatButtonModule, MatDividerModule, MatTooltipModule]
17
+ })
18
+ export class PanelNotificacionesComponent {
19
+ @Input() datos: FilaMensaje[] = [];
20
+ @Output() cerrar = new EventEmitter<void>();
21
+ public cerrando = false;
22
+
23
+ constructor(private http: HttpClient, private datosGlobalesService: DatosGlobalesService) {}
24
+
25
+ onCerrar(): void {
26
+ if (this.cerrando) return;
27
+ this.cerrando = true;
28
+ setTimeout(() => this.cerrar.emit(), 260);
29
+ }
30
+
31
+ eliminarNotificacion(item: FilaMensaje): void {
32
+ if (item.eliminando) return;
33
+ item.eliminando = true;
34
+ this.http.post(`${this.datosGlobalesService.ObtenerURL()}misc/actualizarNotificacion`, { FechaYHoraDeCreacion: item.llave }).subscribe();
35
+ setTimeout(() => {
36
+ const idx = this.datos.indexOf(item);
37
+ if (idx !== -1) this.datos.splice(idx, 1);
38
+ }, 380);
39
+ }
40
+
41
+ eliminarTodas(): void {
42
+ const pendientes = this.datos.filter(item => !item.eliminando);
43
+ pendientes.forEach((item, i) => {
44
+ setTimeout(() => {
45
+ item.eliminando = true;
46
+ this.http.post(`${this.datosGlobalesService.ObtenerURL()}misc/actualizarNotificacion`, { FechaYHoraDeCreacion: item.llave }).subscribe();
47
+ }, i * 60);
48
+ });
49
+ setTimeout(() => {
50
+ this.datos.splice(0, this.datos.length);
51
+ }, pendientes.length * 60 + 380);
52
+ }
53
+ }
@@ -1,36 +1,129 @@
1
- .contenedor {
1
+ /* Header */
2
+ .dialogo-header {
2
3
  display: flex;
3
- flex-wrap: wrap;
4
+ align-items: center;
5
+ gap: 10px;
6
+ background: linear-gradient(90deg, rgba(1, 33, 105, 1) 0%, rgba(63, 97, 171, 1) 100%);
7
+ color: white;
8
+ padding: 24px 20px 16px;
9
+ margin: -8px -8px 0;
4
10
  }
5
11
 
6
- .fila {
7
- width: 100%;
12
+ .dialogo-icono {
13
+ font-size: 24px;
14
+ width: 24px;
15
+ height: 24px;
16
+ flex-shrink: 0;
17
+ }
18
+
19
+ .dialogo-titulo {
20
+ font-size: 1.1rem;
21
+ font-weight: 600;
22
+ font-family: 'Roboto', sans-serif;
23
+ letter-spacing: 0.2px;
24
+ }
25
+
26
+ /* Frase destacada */
27
+ .dialogo-frase {
28
+ font-size: 1.05rem;
29
+ font-weight: 600;
30
+ color: #012169;
31
+ margin: 20px 0 6px;
32
+ font-family: 'Roboto', sans-serif;
33
+ line-height: 1.3;
34
+ }
35
+
36
+ /* Subtítulo */
37
+ .dialogo-subtitulo {
38
+ font-size: 0.875rem;
39
+ color: #5a6a7a;
40
+ margin: 0 0 20px;
41
+ font-family: 'Roboto', sans-serif;
42
+ line-height: 1.5;
8
43
  }
9
44
 
45
+ /* Campo */
10
46
  .campo {
11
47
  width: 100%;
12
48
  }
13
49
 
50
+ /* Zona de archivo */
14
51
  .zona-archivo {
15
- width: 90%;
16
- height: 10vh;
17
- margin-left: 4%;
18
- border: 2px dashed #3498db;
19
- padding: 1%;
20
- align-items: center;
52
+ width: 100%;
53
+ min-height: 72px;
54
+ border: 2px dashed #c4d0de;
55
+ border-radius: 8px;
56
+ padding: 12px 16px;
21
57
  display: flex;
58
+ align-items: center;
59
+ justify-content: center;
22
60
  cursor: pointer;
23
- transition: background 0.3s;
61
+ transition: background 0.2s, border-color 0.2s;
62
+ margin-bottom: 4px;
63
+ box-sizing: border-box;
64
+ }
65
+
66
+ .zona-archivo:hover,
67
+ .zona-archivo.arrastrar {
68
+ background: #eaf1fb;
69
+ border-color: #3f61ab;
24
70
  }
25
71
 
26
72
  .texto {
27
73
  width: 100%;
28
74
  text-align: center;
75
+ font-size: 0.875rem;
76
+ color: #5a6a7a;
77
+ margin: 0;
78
+ font-family: 'Roboto', sans-serif;
29
79
  }
30
80
 
31
81
  .texto-clic {
32
- color: #007bff;
33
- font-weight: bold;
82
+ color: #012169;
83
+ font-weight: 600;
34
84
  cursor: pointer;
35
85
  text-decoration: underline;
36
86
  }
87
+
88
+ /* Botones */
89
+ mat-dialog-actions {
90
+ display: flex;
91
+ justify-content: flex-end;
92
+ gap: 10px;
93
+ padding: 8px 20px 16px;
94
+ }
95
+
96
+ .btn-cancelar {
97
+ color: #012169;
98
+ border-color: #012169;
99
+ font-family: 'Roboto', sans-serif;
100
+ font-weight: 500;
101
+ }
102
+
103
+ .btn-enviar {
104
+ background-color: #012169;
105
+ color: white;
106
+ font-family: 'Roboto', sans-serif;
107
+ font-weight: 500;
108
+ display: flex;
109
+ align-items: center;
110
+ gap: 6px;
111
+ }
112
+
113
+ .btn-enviar mat-icon {
114
+ font-size: 18px;
115
+ width: 18px;
116
+ height: 18px;
117
+ }
118
+
119
+ .btn-enviar:disabled {
120
+ background-color: #a0b0c4;
121
+ color: white;
122
+ }
123
+
124
+ /* Pie */
125
+ .dialogo-pie {
126
+ height: 20px;
127
+ background: linear-gradient(90deg, rgba(1, 33, 105, 1) 0%, rgba(63, 97, 171, 1) 100%);
128
+ margin: 0 -8px;
129
+ }