@telcomdev/ui 0.1.24 → 0.1.25

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.
@@ -23,352 +23,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
23
23
  args: [{ selector: 'td-telcomdev-ui', imports: [], template: ` <p>telcomdev-ui works!</p> `, changeDetection: ChangeDetectionStrategy.Eager }]
24
24
  }] });
25
25
 
26
- class TdAlerta {
27
- static estiloId = 'td-alerta-estilos';
28
- static exito(mensaje, titulo = '¡Operación exitosa!') {
29
- return this.mostrar({
30
- titulo,
31
- mensaje,
32
- tipo: 'exito',
33
- textoConfirmar: 'Aceptar',
34
- });
35
- }
36
- static error(mensaje, titulo = '¡Error!') {
37
- return this.mostrar({
38
- titulo,
39
- mensaje,
40
- tipo: 'error',
41
- textoConfirmar: 'Cerrar',
42
- });
43
- }
44
- static errorSistema(mensaje, titulo = '¡Error de Sistema!') {
45
- return this.mostrar({
46
- titulo,
47
- mensaje,
48
- tipo: 'error',
49
- textoConfirmar: 'Cerrar',
50
- });
51
- }
52
- static advertencia(mensaje, titulo = '¡Advertencia!') {
53
- return this.mostrar({
54
- titulo,
55
- mensaje,
56
- tipo: 'advertencia',
57
- textoConfirmar: 'Aceptar',
58
- });
59
- }
60
- static info(mensaje, titulo = 'Información') {
61
- return this.mostrar({
62
- titulo,
63
- mensaje,
64
- tipo: 'info',
65
- textoConfirmar: 'Aceptar',
66
- });
67
- }
68
- static confirmar(mensaje, titulo = '¿Estás seguro?', textoConfirmar = 'Sí, continuar', textoCancelar = 'Cancelar') {
69
- return this.mostrar({
70
- titulo,
71
- mensaje,
72
- tipo: 'pregunta',
73
- textoConfirmar,
74
- textoCancelar,
75
- mostrarCancelar: true,
76
- });
77
- }
78
- static confirmarEliminar(mensaje = 'Esta acción no se puede deshacer.', titulo = '¿Eliminar registro?') {
79
- return this.mostrar({
80
- titulo,
81
- mensaje,
82
- tipo: 'advertencia',
83
- textoConfirmar: 'Sí, eliminar',
84
- textoCancelar: 'Cancelar',
85
- mostrarCancelar: true,
86
- });
87
- }
88
- static mostrar(opciones) {
89
- if (typeof document === 'undefined') {
90
- return Promise.resolve(false);
91
- }
92
- this.inyectarEstilos();
93
- const config = {
94
- titulo: opciones.titulo ?? '',
95
- mensaje: opciones.mensaje ?? '',
96
- tipo: opciones.tipo ?? 'info',
97
- textoConfirmar: opciones.textoConfirmar ?? 'Aceptar',
98
- textoCancelar: opciones.textoCancelar ?? 'Cancelar',
99
- mostrarCancelar: opciones.mostrarCancelar ?? false,
100
- cerrarConEscape: opciones.cerrarConEscape ?? true,
101
- cerrarConFondo: opciones.cerrarConFondo ?? false,
102
- };
103
- return new Promise((resolve) => {
104
- const fondo = document.createElement('div');
105
- fondo.className = 'td-alerta-fondo';
106
- const modal = document.createElement('div');
107
- modal.className = 'td-alerta-modal';
108
- modal.setAttribute('role', 'dialog');
109
- modal.setAttribute('aria-modal', 'true');
110
- const icono = document.createElement('div');
111
- icono.className = `td-alerta-icono td-alerta-icono--${config.tipo}`;
112
- icono.textContent = this.obtenerIcono(config.tipo);
113
- const titulo = document.createElement('h2');
114
- titulo.className = 'td-alerta-titulo';
115
- titulo.textContent = config.titulo;
116
- const mensaje = document.createElement('p');
117
- mensaje.className = 'td-alerta-mensaje';
118
- mensaje.textContent = config.mensaje;
119
- const acciones = document.createElement('div');
120
- acciones.className = 'td-alerta-acciones';
121
- const botonConfirmar = document.createElement('button');
122
- botonConfirmar.type = 'button';
123
- botonConfirmar.className = `td-alerta-boton td-alerta-boton--${config.tipo}`;
124
- botonConfirmar.textContent = config.textoConfirmar;
125
- const botonCancelar = document.createElement('button');
126
- botonCancelar.type = 'button';
127
- botonCancelar.className = 'td-alerta-boton td-alerta-boton--cancelar';
128
- botonCancelar.textContent = config.textoCancelar;
129
- const cerrar = (resultado) => {
130
- document.removeEventListener('keydown', onKeyDown);
131
- fondo.classList.add('td-alerta-saliendo');
132
- window.setTimeout(() => {
133
- fondo.remove();
134
- resolve(resultado);
135
- }, 140);
136
- };
137
- const onKeyDown = (event) => {
138
- if (event.key === 'Escape' && config.cerrarConEscape) {
139
- cerrar(false);
140
- }
141
- };
142
- botonConfirmar.addEventListener('click', () => cerrar(true));
143
- botonCancelar.addEventListener('click', () => cerrar(false));
144
- if (config.cerrarConFondo) {
145
- fondo.addEventListener('click', (event) => {
146
- if (event.target === fondo) {
147
- cerrar(false);
148
- }
149
- });
150
- }
151
- document.addEventListener('keydown', onKeyDown);
152
- if (config.mostrarCancelar) {
153
- acciones.appendChild(botonCancelar);
154
- }
155
- acciones.appendChild(botonConfirmar);
156
- modal.appendChild(icono);
157
- modal.appendChild(titulo);
158
- if (config.mensaje) {
159
- modal.appendChild(mensaje);
160
- }
161
- modal.appendChild(acciones);
162
- fondo.appendChild(modal);
163
- document.body.appendChild(fondo);
164
- botonConfirmar.focus();
165
- });
166
- }
167
- static obtenerIcono(tipo) {
168
- const iconos = {
169
- exito: '✓',
170
- error: '!',
171
- advertencia: '!',
172
- info: 'i',
173
- pregunta: '?',
174
- };
175
- return iconos[tipo];
176
- }
177
- static inyectarEstilos() {
178
- if (document.getElementById(this.estiloId))
179
- return;
180
- const style = document.createElement('style');
181
- style.id = this.estiloId;
182
- style.textContent = `
183
- .td-alerta-fondo {
184
- position: fixed;
185
- inset: 0;
186
- z-index: 99999;
187
- display: flex;
188
- align-items: center;
189
- justify-content: center;
190
- padding: 1rem;
191
- background: rgba(15, 23, 42, 0.52);
192
- animation: td-alerta-fondo-entrada 160ms ease-out;
193
- }
194
-
195
- .td-alerta-modal {
196
- width: min(100%, 430px);
197
- border-radius: 18px;
198
- background: #ffffff;
199
- padding: 1.75rem;
200
- text-align: center;
201
- box-shadow: 0 22px 70px rgba(15, 23, 42, 0.28);
202
- animation: td-alerta-modal-entrada 180ms ease-out;
203
- font-family: var(--td-font-family, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif);
204
- }
205
-
206
- .td-alerta-icono {
207
- width: 4.25rem;
208
- height: 4.25rem;
209
- margin: 0 auto 1rem;
210
- border-radius: 999px;
211
- display: flex;
212
- align-items: center;
213
- justify-content: center;
214
- font-size: 2.1rem;
215
- font-weight: 800;
216
- }
217
-
218
- .td-alerta-icono--exito {
219
- color: #16a34a;
220
- background: #dcfce7;
221
- }
222
-
223
- .td-alerta-icono--error {
224
- color: #ef4444;
225
- background: #fee2e2;
226
- }
227
-
228
- .td-alerta-icono--advertencia {
229
- color: #f59e0b;
230
- background: #fef3c7;
231
- }
232
-
233
- .td-alerta-icono--info {
234
- color: #2563eb;
235
- background: #dbeafe;
236
- }
237
-
238
- .td-alerta-icono--pregunta {
239
- color: #7c3aed;
240
- background: #ede9fe;
241
- }
242
-
243
- .td-alerta-titulo {
244
- margin: 0;
245
- color: #111827;
246
- font-size: 1.35rem;
247
- line-height: 1.25;
248
- font-weight: 800;
249
- }
250
-
251
- .td-alerta-mensaje {
252
- margin: 0.75rem 0 0;
253
- color: #4b5563;
254
- font-size: 0.96rem;
255
- line-height: 1.55;
256
- }
257
-
258
- .td-alerta-acciones {
259
- display: flex;
260
- justify-content: center;
261
- gap: 0.75rem;
262
- margin-top: 1.5rem;
263
- }
264
-
265
- .td-alerta-boton {
266
- border: 0;
267
- border-radius: 10px;
268
- padding: 0.7rem 1.2rem;
269
- color: #ffffff;
270
- font-size: 0.93rem;
271
- font-weight: 700;
272
- cursor: pointer;
273
- transition: transform 120ms ease, filter 120ms ease, background 120ms ease;
274
- }
275
-
276
- .td-alerta-boton:hover {
277
- filter: brightness(0.96);
278
- }
279
-
280
- .td-alerta-boton:active {
281
- transform: scale(0.98);
282
- }
283
-
284
- .td-alerta-boton:focus {
285
- outline: 3px solid rgba(37, 99, 235, 0.25);
286
- outline-offset: 2px;
287
- }
288
-
289
- .td-alerta-boton--exito {
290
- background: #22c55e;
291
- }
292
-
293
- .td-alerta-boton--error {
294
- background: #ef4444;
295
- }
296
-
297
- .td-alerta-boton--advertencia {
298
- background: #f59e0b;
299
- }
300
-
301
- .td-alerta-boton--info {
302
- background: #2563eb;
303
- }
304
-
305
- .td-alerta-boton--pregunta {
306
- background: #7c3aed;
307
- }
308
-
309
- .td-alerta-boton--cancelar {
310
- background: #6b7280;
311
- }
312
-
313
- .td-alerta-saliendo {
314
- animation: td-alerta-fondo-salida 140ms ease-in forwards;
315
- }
316
-
317
- .td-alerta-saliendo .td-alerta-modal {
318
- animation: td-alerta-modal-salida 140ms ease-in forwards;
319
- }
320
-
321
- @keyframes td-alerta-fondo-entrada {
322
- from { opacity: 0; }
323
- to { opacity: 1; }
324
- }
325
-
326
- @keyframes td-alerta-modal-entrada {
327
- from {
328
- opacity: 0;
329
- transform: translateY(12px) scale(0.96);
330
- }
331
- to {
332
- opacity: 1;
333
- transform: translateY(0) scale(1);
334
- }
335
- }
336
-
337
- @keyframes td-alerta-fondo-salida {
338
- from { opacity: 1; }
339
- to { opacity: 0; }
340
- }
341
-
342
- @keyframes td-alerta-modal-salida {
343
- from {
344
- opacity: 1;
345
- transform: translateY(0) scale(1);
346
- }
347
- to {
348
- opacity: 0;
349
- transform: translateY(8px) scale(0.97);
350
- }
351
- }
352
-
353
- @media (max-width: 480px) {
354
- .td-alerta-modal {
355
- padding: 1.4rem;
356
- border-radius: 16px;
357
- }
358
-
359
- .td-alerta-acciones {
360
- flex-direction: column-reverse;
361
- }
362
-
363
- .td-alerta-boton {
364
- width: 100%;
365
- }
366
- }
367
- `;
368
- document.head.appendChild(style);
369
- }
370
- }
371
-
372
26
  const TD_ICONOS = {
373
27
  home: {
374
28
  path: 'M3 10.5 12 3l9 7.5V21a1 1 0 0 1-1 1h-5v-7H9v7H4a1 1 0 0 1-1-1V10.5Z',
@@ -609,6 +263,1025 @@ const TD_ICONOS = {
609
263
  };
610
264
  const TD_ICONOS_NOMBRES = Object.freeze(Object.keys(TD_ICONOS));
611
265
 
266
+ class TdAlert {
267
+ static styleId = 'td-alert-styles';
268
+ static toastRootPrefix = 'td-toast-root';
269
+ static scrollLockCount = 0;
270
+ static previousBodyOverflow = '';
271
+ static success(message, title = 'Operación exitosa') {
272
+ return this.show({
273
+ title,
274
+ message,
275
+ type: 'success',
276
+ confirmText: 'Aceptar',
277
+ });
278
+ }
279
+ static error(message, title = 'Error') {
280
+ return this.show({
281
+ title,
282
+ message,
283
+ type: 'error',
284
+ confirmText: 'Cerrar',
285
+ });
286
+ }
287
+ static systemError(message, title = 'Error de sistema') {
288
+ return this.error(message, title);
289
+ }
290
+ static warning(message, title = 'Advertencia') {
291
+ return this.show({
292
+ title,
293
+ message,
294
+ type: 'warning',
295
+ confirmText: 'Aceptar',
296
+ });
297
+ }
298
+ static info(message, title = 'Información') {
299
+ return this.show({
300
+ title,
301
+ message,
302
+ type: 'info',
303
+ confirmText: 'Aceptar',
304
+ });
305
+ }
306
+ static confirm(message, title = '¿Estás seguro?', confirmText = 'Sí, continuar', cancelText = 'Cancelar') {
307
+ return this.show({
308
+ title,
309
+ message,
310
+ type: 'question',
311
+ confirmText,
312
+ cancelText,
313
+ showCancel: true,
314
+ });
315
+ }
316
+ static confirmDelete(message = 'Esta acción no se puede deshacer.', title = '¿Eliminar registro?') {
317
+ return this.show({
318
+ title,
319
+ message,
320
+ type: 'warning',
321
+ confirmText: 'Sí, eliminar',
322
+ cancelText: 'Cancelar',
323
+ showCancel: true,
324
+ });
325
+ }
326
+ static show(options) {
327
+ if (typeof document === 'undefined') {
328
+ return Promise.resolve(false);
329
+ }
330
+ this.injectStyles();
331
+ const config = this.normalizeAlertOptions(options);
332
+ const previouslyFocused = document.activeElement instanceof HTMLElement ? document.activeElement : null;
333
+ return new Promise((resolve) => {
334
+ this.lockBodyScroll();
335
+ const backdrop = document.createElement('div');
336
+ backdrop.className = 'td-alert-backdrop';
337
+ const modal = document.createElement('div');
338
+ modal.className = `td-alert-modal td-alert-modal--${config.type}`;
339
+ modal.setAttribute('role', 'dialog');
340
+ modal.setAttribute('aria-modal', 'true');
341
+ modal.setAttribute('aria-labelledby', 'td-alert-title');
342
+ const accent = document.createElement('span');
343
+ accent.className = 'td-alert-accent';
344
+ accent.setAttribute('aria-hidden', 'true');
345
+ const icon = document.createElement('div');
346
+ icon.className = `td-alert-icon td-alert-icon--${config.type}`;
347
+ icon.appendChild(this.createIcon(this.getAlertIcon(config.type)));
348
+ const title = document.createElement('h2');
349
+ title.id = 'td-alert-title';
350
+ title.className = 'td-alert-title';
351
+ title.textContent = config.title;
352
+ const message = document.createElement('p');
353
+ message.className = 'td-alert-message';
354
+ message.textContent = config.message;
355
+ const actions = document.createElement('div');
356
+ actions.className = 'td-alert-actions';
357
+ const confirmButton = document.createElement('button');
358
+ confirmButton.type = 'button';
359
+ confirmButton.className = `td-alert-button td-alert-button--${config.type}`;
360
+ confirmButton.textContent = config.confirmText;
361
+ const cancelButton = document.createElement('button');
362
+ cancelButton.type = 'button';
363
+ cancelButton.className = 'td-alert-button td-alert-button--cancel';
364
+ cancelButton.textContent = config.cancelText;
365
+ let closed = false;
366
+ const close = (result) => {
367
+ if (closed)
368
+ return;
369
+ closed = true;
370
+ document.removeEventListener('keydown', onKeyDown);
371
+ backdrop.classList.add('td-alert-backdrop--leaving');
372
+ window.setTimeout(() => {
373
+ backdrop.remove();
374
+ this.unlockBodyScroll();
375
+ previouslyFocused?.focus?.();
376
+ resolve(result);
377
+ }, 150);
378
+ };
379
+ const onKeyDown = (event) => {
380
+ if (event.key === 'Escape' && config.closeOnEscape) {
381
+ close(false);
382
+ }
383
+ if (event.key === 'Tab') {
384
+ this.keepFocusInside(event, modal);
385
+ }
386
+ };
387
+ confirmButton.addEventListener('click', () => close(true));
388
+ cancelButton.addEventListener('click', () => close(false));
389
+ if (config.closeOnBackdrop) {
390
+ backdrop.addEventListener('click', (event) => {
391
+ if (event.target === backdrop) {
392
+ close(false);
393
+ }
394
+ });
395
+ }
396
+ document.addEventListener('keydown', onKeyDown);
397
+ if (config.showCancel) {
398
+ actions.appendChild(cancelButton);
399
+ }
400
+ actions.appendChild(confirmButton);
401
+ const content = document.createElement('div');
402
+ content.className = 'td-alert-content';
403
+ content.appendChild(title);
404
+ if (config.message) {
405
+ content.appendChild(message);
406
+ }
407
+ content.appendChild(actions);
408
+ modal.appendChild(accent);
409
+ modal.appendChild(icon);
410
+ modal.appendChild(content);
411
+ backdrop.appendChild(modal);
412
+ document.body.appendChild(backdrop);
413
+ if (config.autoFocus) {
414
+ confirmButton.focus();
415
+ }
416
+ });
417
+ }
418
+ static notify(message, options = {}) {
419
+ return this.toast(message, options);
420
+ }
421
+ static toast(message, options = {}) {
422
+ if (typeof document === 'undefined') {
423
+ return Promise.resolve(false);
424
+ }
425
+ this.injectStyles();
426
+ const config = this.normalizeToastOptions({ ...options, message });
427
+ return new Promise((resolve) => {
428
+ const root = this.getToastRoot(config.position);
429
+ this.trimVisibleToasts(root, config.maxVisible);
430
+ const toast = document.createElement('section');
431
+ toast.className = `td-toast td-toast--${config.type}`;
432
+ toast.setAttribute('role', config.type === 'error' ? 'alert' : 'status');
433
+ toast.setAttribute('aria-live', config.type === 'error' ? 'assertive' : 'polite');
434
+ const icon = document.createElement('span');
435
+ icon.className = 'td-toast-icon';
436
+ icon.appendChild(this.createIcon(this.getToastIcon(config.type)));
437
+ const content = document.createElement('span');
438
+ content.className = 'td-toast-content';
439
+ if (config.title) {
440
+ const title = document.createElement('strong');
441
+ title.textContent = config.title;
442
+ content.appendChild(title);
443
+ }
444
+ const messageElement = document.createElement('small');
445
+ messageElement.textContent = config.message;
446
+ content.appendChild(messageElement);
447
+ const actions = document.createElement('span');
448
+ actions.className = 'td-toast-actions';
449
+ let timeoutId;
450
+ let remainingDuration = config.duration;
451
+ let timerStartedAt = 0;
452
+ let closed = false;
453
+ const close = (result) => {
454
+ if (closed)
455
+ return;
456
+ closed = true;
457
+ if (timeoutId !== undefined) {
458
+ window.clearTimeout(timeoutId);
459
+ }
460
+ toast.classList.add('td-toast--leaving');
461
+ window.setTimeout(() => {
462
+ toast.remove();
463
+ if (!root.childElementCount) {
464
+ root.remove();
465
+ }
466
+ resolve(result);
467
+ }, 160);
468
+ };
469
+ const pauseTimer = () => {
470
+ if (closed || config.duration <= 0 || timeoutId === undefined) {
471
+ return;
472
+ }
473
+ window.clearTimeout(timeoutId);
474
+ timeoutId = undefined;
475
+ remainingDuration = Math.max(0, remainingDuration - (Date.now() - timerStartedAt));
476
+ toast.classList.add('td-toast--paused');
477
+ };
478
+ const resumeTimer = () => {
479
+ if (closed || config.duration <= 0 || timeoutId !== undefined || remainingDuration <= 0) {
480
+ return;
481
+ }
482
+ timerStartedAt = Date.now();
483
+ timeoutId = window.setTimeout(() => close(false), remainingDuration);
484
+ toast.classList.remove('td-toast--paused');
485
+ };
486
+ if (config.actionText) {
487
+ const action = document.createElement('button');
488
+ action.type = 'button';
489
+ action.className = 'td-toast-action';
490
+ action.textContent = config.actionText;
491
+ action.addEventListener('click', () => close(true));
492
+ actions.appendChild(action);
493
+ }
494
+ if (config.dismissible) {
495
+ const dismiss = document.createElement('button');
496
+ dismiss.type = 'button';
497
+ dismiss.className = 'td-toast-dismiss';
498
+ dismiss.setAttribute('aria-label', 'Cerrar notificación');
499
+ dismiss.appendChild(this.createIcon('close'));
500
+ dismiss.addEventListener('click', () => close(false));
501
+ actions.appendChild(dismiss);
502
+ }
503
+ toast.appendChild(icon);
504
+ toast.appendChild(content);
505
+ toast.appendChild(actions);
506
+ if (config.showProgress && config.duration > 0) {
507
+ const progress = document.createElement('span');
508
+ progress.className = 'td-toast-progress';
509
+ progress.style.animationDuration = `${config.duration}ms`;
510
+ toast.appendChild(progress);
511
+ }
512
+ root.appendChild(toast);
513
+ if (config.duration > 0) {
514
+ toast.addEventListener('pointerenter', pauseTimer);
515
+ toast.addEventListener('pointerleave', resumeTimer);
516
+ toast.addEventListener('focusin', pauseTimer);
517
+ toast.addEventListener('focusout', resumeTimer);
518
+ resumeTimer();
519
+ }
520
+ });
521
+ }
522
+ static toastSuccess(message, title = 'Guardado') {
523
+ return this.toast(message, { title, type: 'success' });
524
+ }
525
+ static toastError(message, title = 'No se pudo completar') {
526
+ return this.toast(message, { title, type: 'error', duration: 6500 });
527
+ }
528
+ static toastWarning(message, title = 'Atención') {
529
+ return this.toast(message, { title, type: 'warning', duration: 5600 });
530
+ }
531
+ static toastInfo(message, title = 'Información') {
532
+ return this.toast(message, { title, type: 'info' });
533
+ }
534
+ static snackbar(message, options = {}) {
535
+ return this.toast(message, options);
536
+ }
537
+ static snackbarExito(message, titulo = 'Listo') {
538
+ return this.toastSuccess(message, titulo);
539
+ }
540
+ static snackbarError(message, titulo = 'No se pudo completar') {
541
+ return this.toastError(message, titulo);
542
+ }
543
+ static snackbarAdvertencia(message, titulo = 'Atención') {
544
+ return this.toastWarning(message, titulo);
545
+ }
546
+ static snackbarInfo(message, titulo = 'Información') {
547
+ return this.toastInfo(message, titulo);
548
+ }
549
+ static exito(mensaje, titulo = 'Operación exitosa') {
550
+ return this.success(mensaje, titulo);
551
+ }
552
+ static errorSistema(mensaje, titulo = 'Error de sistema') {
553
+ return this.systemError(mensaje, titulo);
554
+ }
555
+ static advertencia(mensaje, titulo = 'Advertencia') {
556
+ return this.warning(mensaje, titulo);
557
+ }
558
+ static confirmar(mensaje, titulo = '¿Estás seguro?', textoConfirmar = 'Sí, continuar', textoCancelar = 'Cancelar') {
559
+ return this.confirm(mensaje, titulo, textoConfirmar, textoCancelar);
560
+ }
561
+ static confirmarEliminar(mensaje = 'Esta acción no se puede deshacer.', titulo = '¿Eliminar registro?') {
562
+ return this.show({
563
+ title: titulo,
564
+ message: mensaje,
565
+ type: 'warning',
566
+ confirmText: 'Sí, eliminar',
567
+ cancelText: 'Cancelar',
568
+ showCancel: true,
569
+ });
570
+ }
571
+ static notificar(options) {
572
+ return this.toast(options.mensaje ?? '', options);
573
+ }
574
+ static normalizeAlertOptions(options) {
575
+ const legacy = options;
576
+ const modern = options;
577
+ return {
578
+ title: modern.title ?? legacy.titulo ?? '',
579
+ message: modern.message ?? legacy.mensaje ?? '',
580
+ type: this.normalizeAlertType(modern.type ?? legacy.tipo ?? 'info'),
581
+ confirmText: modern.confirmText ?? legacy.textoConfirmar ?? 'Aceptar',
582
+ cancelText: modern.cancelText ?? legacy.textoCancelar ?? 'Cancelar',
583
+ showCancel: modern.showCancel ?? legacy.mostrarCancelar ?? false,
584
+ closeOnEscape: modern.closeOnEscape ?? legacy.cerrarConEscape ?? true,
585
+ closeOnBackdrop: modern.closeOnBackdrop ?? legacy.cerrarConFondo ?? false,
586
+ autoFocus: modern.autoFocus ?? legacy.autoFocus ?? true,
587
+ };
588
+ }
589
+ static normalizeToastOptions(options) {
590
+ const legacy = options;
591
+ const modern = options;
592
+ return {
593
+ title: modern.title ?? legacy.titulo ?? '',
594
+ message: modern.message ?? legacy.mensaje ?? '',
595
+ type: this.normalizeToastType(modern.type ?? legacy.tipo ?? 'neutral'),
596
+ position: this.normalizeToastPosition(modern.position ?? legacy.posicion ?? 'bottom-left'),
597
+ duration: modern.duration ?? legacy.duracion ?? 4200,
598
+ actionText: modern.actionText ?? legacy.textoAccion ?? '',
599
+ dismissible: modern.dismissible ?? legacy.cerrable ?? true,
600
+ showProgress: modern.showProgress ?? legacy.mostrarProgreso ?? true,
601
+ maxVisible: modern.maxVisible ?? legacy.maximoVisible ?? 4,
602
+ };
603
+ }
604
+ static normalizeAlertType(type) {
605
+ const map = {
606
+ exito: 'success',
607
+ advertencia: 'warning',
608
+ pregunta: 'question',
609
+ success: 'success',
610
+ error: 'error',
611
+ warning: 'warning',
612
+ info: 'info',
613
+ question: 'question',
614
+ };
615
+ return map[type] ?? 'info';
616
+ }
617
+ static normalizeToastType(type) {
618
+ const map = {
619
+ exito: 'success',
620
+ advertencia: 'warning',
621
+ success: 'success',
622
+ error: 'error',
623
+ warning: 'warning',
624
+ info: 'info',
625
+ neutral: 'neutral',
626
+ };
627
+ return map[type] ?? 'neutral';
628
+ }
629
+ static normalizeToastPosition(position) {
630
+ const map = {
631
+ 'inferior-izquierda': 'bottom-left',
632
+ 'inferior-derecha': 'bottom-right',
633
+ 'superior-izquierda': 'top-left',
634
+ 'superior-derecha': 'top-right',
635
+ 'inferior-centro': 'bottom-center',
636
+ 'superior-centro': 'top-center',
637
+ 'bottom-left': 'bottom-left',
638
+ 'bottom-right': 'bottom-right',
639
+ 'top-left': 'top-left',
640
+ 'top-right': 'top-right',
641
+ 'bottom-center': 'bottom-center',
642
+ 'top-center': 'top-center',
643
+ };
644
+ return map[position] ?? 'bottom-left';
645
+ }
646
+ static getToastRoot(position) {
647
+ const id = `${this.toastRootPrefix}-${position}`;
648
+ const existing = document.getElementById(id);
649
+ if (existing)
650
+ return existing;
651
+ const root = document.createElement('div');
652
+ root.id = id;
653
+ root.className = `td-toast-root td-toast-root--${position}`;
654
+ document.body.appendChild(root);
655
+ return root;
656
+ }
657
+ static trimVisibleToasts(root, maxVisible) {
658
+ const max = Math.max(1, maxVisible);
659
+ while (root.childElementCount >= max) {
660
+ root.firstElementChild?.remove();
661
+ }
662
+ }
663
+ static getAlertIcon(type) {
664
+ const icons = {
665
+ success: 'check_circle',
666
+ error: 'error',
667
+ warning: 'warning',
668
+ info: 'info',
669
+ question: 'help',
670
+ };
671
+ return icons[type];
672
+ }
673
+ static getToastIcon(type) {
674
+ const icons = {
675
+ success: 'check_circle',
676
+ error: 'error',
677
+ warning: 'warning',
678
+ info: 'info',
679
+ neutral: 'notifications',
680
+ };
681
+ return icons[type];
682
+ }
683
+ static createIcon(name) {
684
+ const definition = TD_ICONOS[name];
685
+ const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
686
+ const path = document.createElementNS('http://www.w3.org/2000/svg', 'path');
687
+ svg.setAttribute('viewBox', definition.viewBox || '0 0 24 24');
688
+ svg.setAttribute('aria-hidden', 'true');
689
+ svg.setAttribute('focusable', 'false');
690
+ path.setAttribute('d', definition.path);
691
+ if (definition.estilo === 'linea') {
692
+ path.setAttribute('fill', 'none');
693
+ path.setAttribute('stroke', 'currentColor');
694
+ path.setAttribute('stroke-width', `${definition.grosor || 1.75}`);
695
+ path.setAttribute('stroke-linecap', 'round');
696
+ path.setAttribute('stroke-linejoin', 'round');
697
+ }
698
+ else {
699
+ path.setAttribute('fill', 'currentColor');
700
+ }
701
+ svg.appendChild(path);
702
+ return svg;
703
+ }
704
+ static keepFocusInside(event, container) {
705
+ const focusables = Array.from(container.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])')).filter((element) => !element.hasAttribute('disabled'));
706
+ if (!focusables.length)
707
+ return;
708
+ const first = focusables[0];
709
+ const last = focusables[focusables.length - 1];
710
+ const active = document.activeElement;
711
+ if (event.shiftKey && active === first) {
712
+ event.preventDefault();
713
+ last.focus();
714
+ }
715
+ else if (!event.shiftKey && active === last) {
716
+ event.preventDefault();
717
+ first.focus();
718
+ }
719
+ }
720
+ static lockBodyScroll() {
721
+ if (this.scrollLockCount === 0) {
722
+ this.previousBodyOverflow = document.body.style.overflow;
723
+ document.body.style.overflow = 'hidden';
724
+ }
725
+ this.scrollLockCount += 1;
726
+ }
727
+ static unlockBodyScroll() {
728
+ this.scrollLockCount = Math.max(0, this.scrollLockCount - 1);
729
+ if (this.scrollLockCount === 0) {
730
+ document.body.style.overflow = this.previousBodyOverflow;
731
+ }
732
+ }
733
+ static injectStyles() {
734
+ if (document.getElementById(this.styleId))
735
+ return;
736
+ const style = document.createElement('style');
737
+ style.id = this.styleId;
738
+ style.textContent = `
739
+ .td-alert-backdrop,
740
+ .td-toast-root {
741
+ --td-alert-z-index: var(--td-z-alert, 2147483000);
742
+ box-sizing: border-box;
743
+ font-family: var(--td-font-family, Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif);
744
+ }
745
+
746
+ .td-alert-backdrop *,
747
+ .td-toast-root * {
748
+ box-sizing: border-box;
749
+ }
750
+
751
+ .td-alert-backdrop {
752
+ position: fixed;
753
+ inset: 0;
754
+ z-index: var(--td-alert-z-index);
755
+ display: flex;
756
+ align-items: center;
757
+ justify-content: center;
758
+ padding: 1rem;
759
+ background: transparent;
760
+ backdrop-filter: none;
761
+ animation: td-alert-backdrop-in 160ms ease-out;
762
+ }
763
+
764
+ .td-alert-modal {
765
+ position: relative;
766
+ display: grid;
767
+ width: min(100%, 455px);
768
+ overflow: hidden;
769
+ border: 1px solid color-mix(in srgb, var(--td-alert-glow, var(--td-color-primary, #3157a4)) 18%, rgba(255, 255, 255, 0.82));
770
+ border-radius: 1.45rem;
771
+ padding: 1.35rem;
772
+ color: var(--td-color-text, #202b3d);
773
+ background:
774
+ linear-gradient(145deg, rgba(255, 255, 255, 0.78), rgba(255, 255, 255, 0.5)),
775
+ color-mix(in srgb, var(--td-color-surface, #fff) 60%, transparent);
776
+ text-align: center;
777
+ box-shadow:
778
+ 0 22px 58px rgba(15, 23, 42, 0.15),
779
+ 0 0 0 1px rgba(255, 255, 255, 0.76) inset;
780
+ backdrop-filter: blur(28px) saturate(155%);
781
+ -webkit-backdrop-filter: blur(28px) saturate(155%);
782
+ animation: td-alert-modal-in 210ms cubic-bezier(.16,1,.3,1);
783
+ }
784
+
785
+ .td-alert-modal::before {
786
+ position: absolute;
787
+ inset: 0;
788
+ z-index: 0;
789
+ border-radius: inherit;
790
+ background:
791
+ linear-gradient(180deg, rgba(255, 255, 255, 0.22), rgba(255, 255, 255, 0.06) 58%, rgba(255, 255, 255, 0.14));
792
+ opacity: 0.58;
793
+ pointer-events: none;
794
+ content: "";
795
+ }
796
+
797
+ .td-theme-dark .td-alert-modal {
798
+ border-color: color-mix(in srgb, var(--td-alert-glow, var(--td-color-primary, #8aa7e6)) 22%, rgba(255, 255, 255, 0.16));
799
+ background:
800
+ linear-gradient(145deg, rgba(32, 36, 45, 0.78), rgba(17, 20, 26, 0.54)),
801
+ color-mix(in srgb, var(--td-color-surface, #181b22) 66%, transparent);
802
+ box-shadow:
803
+ 0 24px 66px rgba(0, 0, 0, 0.34),
804
+ 0 0 0 1px rgba(255, 255, 255, 0.1) inset;
805
+ }
806
+
807
+ .td-theme-dark .td-alert-modal::before {
808
+ background:
809
+ linear-gradient(180deg, rgba(255, 255, 255, 0.05), rgba(255, 255, 255, 0.018) 58%, rgba(255, 255, 255, 0.035));
810
+ }
811
+
812
+ .td-alert-modal::after {
813
+ position: absolute;
814
+ inset: 1px;
815
+ z-index: 0;
816
+ border-radius: calc(1.45rem - 1px);
817
+ background:
818
+ linear-gradient(180deg, rgba(255, 255, 255, 0.18), transparent 46%);
819
+ opacity: 0.36;
820
+ pointer-events: none;
821
+ content: "";
822
+ }
823
+
824
+ .td-alert-accent {
825
+ display: none;
826
+ }
827
+
828
+ .td-alert-modal--success { --td-alert-glow: var(--td-color-success, #16784a); }
829
+ .td-alert-modal--error { --td-alert-glow: var(--td-color-danger, #b93a3a); }
830
+ .td-alert-modal--warning { --td-alert-glow: var(--td-color-warning, #a8660b); }
831
+ .td-alert-modal--info { --td-alert-glow: var(--td-color-info, #2563a8); }
832
+ .td-alert-modal--question { --td-alert-glow: var(--td-color-primary, #3157a4); }
833
+
834
+ .td-alert-content {
835
+ min-width: 0;
836
+ position: relative;
837
+ z-index: 1;
838
+ }
839
+
840
+ .td-alert-icon {
841
+ z-index: 1;
842
+ display: grid;
843
+ width: 3.45rem;
844
+ height: 3.45rem;
845
+ margin: 0 auto 0.9rem;
846
+ place-items: center;
847
+ border: 1px solid color-mix(in srgb, currentColor 12%, transparent);
848
+ border-radius: 1rem;
849
+ font-size: 1.45rem;
850
+ font-weight: 900;
851
+ box-shadow: none;
852
+ }
853
+
854
+ .td-alert-icon svg,
855
+ .td-toast-icon svg,
856
+ .td-toast-dismiss svg {
857
+ width: 1em;
858
+ height: 1em;
859
+ display: block;
860
+ }
861
+
862
+ .td-alert-icon--success {
863
+ color: var(--td-color-success, #16784a);
864
+ background: var(--td-color-success-soft, #e2f5eb);
865
+ }
866
+
867
+ .td-alert-icon--error {
868
+ color: var(--td-color-danger, #b93a3a);
869
+ background: var(--td-color-danger-soft, #fde7e7);
870
+ }
871
+
872
+ .td-alert-icon--warning {
873
+ color: var(--td-color-warning, #a8660b);
874
+ background: var(--td-color-warning-soft, #fff2d8);
875
+ }
876
+
877
+ .td-alert-icon--info {
878
+ color: var(--td-color-info, #2563a8);
879
+ background: var(--td-color-info-soft, #e4effb);
880
+ }
881
+
882
+ .td-alert-icon--question {
883
+ color: var(--td-color-primary, #3157a4);
884
+ background: var(--td-color-primary-soft, #eaf0fb);
885
+ }
886
+
887
+ .td-alert-title {
888
+ margin: 0;
889
+ color: var(--td-color-text, #202b3d);
890
+ font-size: 1.18rem;
891
+ line-height: 1.25;
892
+ font-weight: 850;
893
+ letter-spacing: -0.02em;
894
+ }
895
+
896
+ .td-alert-message {
897
+ max-width: 23rem;
898
+ margin: 0.55rem auto 0;
899
+ color: var(--td-color-text-muted, #66758b);
900
+ font-size: 0.88rem;
901
+ line-height: 1.55;
902
+ }
903
+
904
+ .td-alert-actions {
905
+ display: flex;
906
+ justify-content: center;
907
+ gap: 0.65rem;
908
+ margin-top: 1.45rem;
909
+ }
910
+
911
+ .td-alert-button {
912
+ min-height: 2.55rem;
913
+ border: 1px solid transparent;
914
+ border-radius: 0.9rem;
915
+ padding: 0.68rem 1.08rem;
916
+ color: var(--td-color-on-primary, #ffffff);
917
+ background: var(--td-color-primary, #3157a4);
918
+ font-size: 0.8rem;
919
+ font-weight: 800;
920
+ cursor: pointer;
921
+ box-shadow: 0 12px 24px color-mix(in srgb, var(--td-color-primary, #3157a4) 22%, transparent);
922
+ transition: transform 150ms ease, filter 150ms ease, background 150ms ease, box-shadow 150ms ease;
923
+ }
924
+
925
+ .td-alert-button:hover {
926
+ filter: brightness(1.02);
927
+ transform: translateY(-2px);
928
+ }
929
+
930
+ .td-alert-button:active {
931
+ transform: scale(0.98);
932
+ }
933
+
934
+ .td-alert-button:focus-visible {
935
+ outline: 0;
936
+ box-shadow: var(--td-focus-ring, 0 0 0 3px rgba(49, 87, 164, 0.18));
937
+ }
938
+
939
+ .td-alert-button--success { background: var(--td-color-success, #16784a); }
940
+ .td-alert-button--error { background: var(--td-color-danger, #b93a3a); }
941
+ .td-alert-button--warning { background: var(--td-color-warning, #a8660b); }
942
+ .td-alert-button--info { background: var(--td-color-info, #2563a8); }
943
+ .td-alert-button--question { background: var(--td-color-primary, #3157a4); }
944
+
945
+ .td-alert-button--cancel {
946
+ border-color: var(--td-color-border, #dde3ee);
947
+ color: var(--td-color-text, #202b3d);
948
+ background: var(--td-color-surface-soft, #f6f8fb);
949
+ box-shadow: none;
950
+ }
951
+
952
+ .td-alert-backdrop--leaving {
953
+ animation: td-alert-backdrop-out 150ms ease-in forwards;
954
+ }
955
+
956
+ .td-alert-backdrop--leaving .td-alert-modal {
957
+ animation: td-alert-modal-out 150ms ease-in forwards;
958
+ }
959
+
960
+ .td-toast-root {
961
+ position: fixed;
962
+ z-index: calc(var(--td-alert-z-index) + 1);
963
+ display: grid;
964
+ width: min(26rem, calc(100vw - 1.5rem));
965
+ gap: 0.65rem;
966
+ pointer-events: none;
967
+ }
968
+
969
+ .td-toast-root--bottom-left {
970
+ bottom: max(1rem, env(safe-area-inset-bottom));
971
+ left: max(1rem, env(safe-area-inset-left));
972
+ }
973
+
974
+ .td-toast-root--bottom-right {
975
+ right: max(1rem, env(safe-area-inset-right));
976
+ bottom: max(1rem, env(safe-area-inset-bottom));
977
+ }
978
+
979
+ .td-toast-root--top-left {
980
+ top: max(1rem, env(safe-area-inset-top));
981
+ left: max(1rem, env(safe-area-inset-left));
982
+ }
983
+
984
+ .td-toast-root--top-right {
985
+ top: max(1rem, env(safe-area-inset-top));
986
+ right: max(1rem, env(safe-area-inset-right));
987
+ }
988
+
989
+ .td-toast-root--bottom-center {
990
+ bottom: max(1rem, env(safe-area-inset-bottom));
991
+ left: 50%;
992
+ transform: translateX(-50%);
993
+ }
994
+
995
+ .td-toast-root--top-center {
996
+ top: max(1rem, env(safe-area-inset-top));
997
+ left: 50%;
998
+ transform: translateX(-50%);
999
+ }
1000
+
1001
+ .td-toast {
1002
+ --td-toast-glow: var(--td-color-primary, #3157a4);
1003
+ position: relative;
1004
+ display: grid;
1005
+ grid-template-columns: auto minmax(0, 1fr) auto;
1006
+ align-items: start;
1007
+ gap: 0.72rem;
1008
+ width: 100%;
1009
+ overflow: hidden;
1010
+ border: 1px solid color-mix(in srgb, var(--td-toast-glow) 16%, rgba(255, 255, 255, 0.76));
1011
+ border-radius: 1.05rem;
1012
+ padding: 0.82rem 0.85rem;
1013
+ color: var(--td-color-text, #202b3d);
1014
+ background:
1015
+ linear-gradient(145deg, rgba(255, 255, 255, 0.78), rgba(255, 255, 255, 0.52)),
1016
+ color-mix(in srgb, var(--td-color-surface, #fff) 62%, transparent);
1017
+ box-shadow:
1018
+ 0 18px 42px rgba(15, 23, 42, 0.14),
1019
+ 0 0 0 1px rgba(255, 255, 255, 0.7) inset;
1020
+ backdrop-filter: blur(22px) saturate(145%);
1021
+ -webkit-backdrop-filter: blur(22px) saturate(145%);
1022
+ pointer-events: auto;
1023
+ animation: td-toast-in 180ms cubic-bezier(.2,.8,.2,1);
1024
+ }
1025
+
1026
+ .td-toast::before {
1027
+ position: absolute;
1028
+ inset: 0;
1029
+ border-radius: inherit;
1030
+ background:
1031
+ linear-gradient(180deg, rgba(255, 255, 255, 0.2), transparent 58%);
1032
+ opacity: 0.56;
1033
+ pointer-events: none;
1034
+ content: "";
1035
+ }
1036
+
1037
+ .td-toast::after {
1038
+ position: absolute;
1039
+ inset: 0 auto 0 0;
1040
+ width: 3px;
1041
+ background: var(--td-toast-glow);
1042
+ opacity: 0.9;
1043
+ content: "";
1044
+ }
1045
+
1046
+ .td-toast--leaving {
1047
+ animation: td-toast-out 160ms ease-in forwards;
1048
+ }
1049
+
1050
+ .td-toast--paused .td-toast-progress {
1051
+ animation-play-state: paused;
1052
+ }
1053
+
1054
+ .td-toast--success { --td-toast-glow: var(--td-color-success, #16784a); }
1055
+ .td-toast--error { --td-toast-glow: var(--td-color-danger, #b93a3a); }
1056
+ .td-toast--warning { --td-toast-glow: var(--td-color-warning, #a8660b); }
1057
+ .td-toast--info { --td-toast-glow: var(--td-color-info, #2563a8); }
1058
+ .td-toast--neutral { --td-toast-glow: var(--td-color-primary, #3157a4); }
1059
+
1060
+ .td-toast-icon {
1061
+ position: relative;
1062
+ z-index: 1;
1063
+ display: grid;
1064
+ width: 1.9rem;
1065
+ height: 1.9rem;
1066
+ place-items: center;
1067
+ border-radius: var(--td-radius-md, 0.72rem);
1068
+ font-size: 0.92rem;
1069
+ font-weight: 900;
1070
+ }
1071
+
1072
+ .td-toast--success .td-toast-icon {
1073
+ color: var(--td-color-success, #16784a);
1074
+ background: var(--td-color-success-soft, #e2f5eb);
1075
+ }
1076
+ .td-toast--error .td-toast-icon {
1077
+ color: var(--td-color-danger, #b93a3a);
1078
+ background: var(--td-color-danger-soft, #fde7e7);
1079
+ }
1080
+ .td-toast--warning .td-toast-icon {
1081
+ color: var(--td-color-warning, #a8660b);
1082
+ background: var(--td-color-warning-soft, #fff2d8);
1083
+ }
1084
+ .td-toast--info .td-toast-icon {
1085
+ color: var(--td-color-info, #2563a8);
1086
+ background: var(--td-color-info-soft, #e4effb);
1087
+ }
1088
+ .td-toast--neutral .td-toast-icon {
1089
+ color: var(--td-color-primary, #3157a4);
1090
+ background: var(--td-color-primary-soft, #eaf0fb);
1091
+ }
1092
+
1093
+ .td-toast-content {
1094
+ position: relative;
1095
+ z-index: 1;
1096
+ display: grid;
1097
+ min-width: 0;
1098
+ gap: 0.18rem;
1099
+ padding-top: 0.12rem;
1100
+ }
1101
+
1102
+ .td-toast-content strong {
1103
+ overflow: hidden;
1104
+ color: var(--td-color-text, #202b3d);
1105
+ font-size: 0.8rem;
1106
+ font-weight: 850;
1107
+ line-height: 1.25;
1108
+ text-overflow: ellipsis;
1109
+ white-space: nowrap;
1110
+ }
1111
+
1112
+ .td-toast-content small {
1113
+ color: var(--td-color-text-muted, #66758b);
1114
+ font-size: 0.72rem;
1115
+ line-height: 1.45;
1116
+ }
1117
+
1118
+ .td-toast-actions {
1119
+ position: relative;
1120
+ z-index: 1;
1121
+ display: flex;
1122
+ align-items: center;
1123
+ gap: 0.3rem;
1124
+ }
1125
+
1126
+ .td-toast-action,
1127
+ .td-toast-dismiss {
1128
+ border: 0;
1129
+ border-radius: var(--td-radius-md, 0.75rem);
1130
+ color: var(--td-color-primary, #3157a4);
1131
+ background: transparent;
1132
+ font: inherit;
1133
+ font-weight: 800;
1134
+ cursor: pointer;
1135
+ }
1136
+
1137
+ .td-toast-action {
1138
+ padding: 0.44rem 0.54rem;
1139
+ font-size: 0.7rem;
1140
+ }
1141
+
1142
+ .td-toast-dismiss {
1143
+ display: grid;
1144
+ width: 1.7rem;
1145
+ height: 1.7rem;
1146
+ place-items: center;
1147
+ color: var(--td-color-text-muted, #66758b);
1148
+ font-size: 1.2rem;
1149
+ line-height: 1;
1150
+ }
1151
+
1152
+ .td-toast-action:hover,
1153
+ .td-toast-dismiss:hover {
1154
+ background: var(--td-color-surface-soft, #f6f8fb);
1155
+ }
1156
+
1157
+ .td-toast-action:focus-visible,
1158
+ .td-toast-dismiss:focus-visible {
1159
+ outline: 0;
1160
+ box-shadow: var(--td-focus-ring, 0 0 0 3px rgba(49, 87, 164, 0.18));
1161
+ }
1162
+
1163
+ .td-toast-progress {
1164
+ position: absolute;
1165
+ z-index: 1;
1166
+ right: 0;
1167
+ bottom: 0;
1168
+ left: 0;
1169
+ height: 2px;
1170
+ background: currentColor;
1171
+ opacity: 0.24;
1172
+ transform-origin: left;
1173
+ animation: td-toast-progress linear forwards;
1174
+ }
1175
+
1176
+ .td-theme-dark .td-toast {
1177
+ border-color: color-mix(in srgb, var(--td-toast-glow) 20%, rgba(255, 255, 255, 0.16));
1178
+ background:
1179
+ linear-gradient(145deg, rgba(32, 36, 45, 0.76), rgba(17, 20, 26, 0.52)),
1180
+ color-mix(in srgb, var(--td-color-surface, #181b22) 66%, transparent);
1181
+ box-shadow:
1182
+ 0 20px 48px rgba(0, 0, 0, 0.34),
1183
+ 0 0 0 1px rgba(255, 255, 255, 0.1) inset;
1184
+ }
1185
+
1186
+ .td-theme-dark .td-toast::before {
1187
+ background:
1188
+ linear-gradient(180deg, rgba(255, 255, 255, 0.04), transparent 58%);
1189
+ }
1190
+
1191
+ @keyframes td-alert-backdrop-in {
1192
+ from { opacity: 0; }
1193
+ to { opacity: 1; }
1194
+ }
1195
+
1196
+ @keyframes td-alert-modal-in {
1197
+ from {
1198
+ opacity: 0;
1199
+ transform: translateY(12px) scale(0.96);
1200
+ }
1201
+ to {
1202
+ opacity: 1;
1203
+ transform: translateY(0) scale(1);
1204
+ }
1205
+ }
1206
+
1207
+ @keyframes td-alert-backdrop-out {
1208
+ from { opacity: 1; }
1209
+ to { opacity: 0; }
1210
+ }
1211
+
1212
+ @keyframes td-alert-modal-out {
1213
+ from {
1214
+ opacity: 1;
1215
+ transform: translateY(0) scale(1);
1216
+ }
1217
+ to {
1218
+ opacity: 0;
1219
+ transform: translateY(8px) scale(0.97);
1220
+ }
1221
+ }
1222
+
1223
+ @keyframes td-toast-in {
1224
+ from {
1225
+ opacity: 0;
1226
+ transform: translateY(10px) scale(0.98);
1227
+ }
1228
+ to {
1229
+ opacity: 1;
1230
+ transform: translateY(0) scale(1);
1231
+ }
1232
+ }
1233
+
1234
+ @keyframes td-toast-out {
1235
+ from {
1236
+ opacity: 1;
1237
+ transform: translateY(0) scale(1);
1238
+ }
1239
+ to {
1240
+ opacity: 0;
1241
+ transform: translateY(8px) scale(0.98);
1242
+ }
1243
+ }
1244
+
1245
+ @keyframes td-toast-progress {
1246
+ from { transform: scaleX(1); }
1247
+ to { transform: scaleX(0); }
1248
+ }
1249
+
1250
+ @media (max-width: 520px) {
1251
+ .td-alert-modal {
1252
+ grid-template-columns: 1fr;
1253
+ border-radius: var(--td-radius-lg, 0.95rem);
1254
+ padding: 1.25rem;
1255
+ }
1256
+
1257
+ .td-alert-icon {
1258
+ width: 3.25rem;
1259
+ height: 3.25rem;
1260
+ }
1261
+
1262
+ .td-alert-actions {
1263
+ justify-content: stretch;
1264
+ flex-direction: column-reverse;
1265
+ }
1266
+
1267
+ .td-alert-button {
1268
+ width: 100%;
1269
+ }
1270
+
1271
+ .td-toast-root {
1272
+ right: 0.75rem;
1273
+ left: 0.75rem;
1274
+ width: auto;
1275
+ transform: none;
1276
+ }
1277
+ }
1278
+ `;
1279
+ document.head.appendChild(style);
1280
+ }
1281
+ }
1282
+ class TdAlerta extends TdAlert {
1283
+ }
1284
+
612
1285
  class TdIconoRegistry {
613
1286
  iconos = new Map(Object.entries(TD_ICONOS));
614
1287
  registrar(iconos) {
@@ -1639,7 +2312,7 @@ class TdDataTable {
1639
2312
  formatearFecha(valor, columna) {
1640
2313
  const fecha = this.normalizarFecha(valor);
1641
2314
  if (!fecha)
1642
- return '—';
2315
+ return '';
1643
2316
  const opcionesPorTipo = {
1644
2317
  fecha: { day: '2-digit', month: '2-digit', year: 'numeric' },
1645
2318
  fechaHora: {
@@ -1697,11 +2370,11 @@ class TdDataTable {
1697
2370
  }
1698
2371
  }
1699
2372
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: TdDataTable, deps: [], target: i0.ɵɵFactoryTarget.Component });
1700
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: TdDataTable, isStandalone: true, selector: "td-data-table", inputs: { datos: "datos", columnas: "columnas", acciones: "acciones", accionesPresentacion: "accionesPresentacion", botones: "botones", total: "total", cargando: "cargando", puedeCargarMas: "puedeCargarMas", virtualizar: "virtualizar", virtualizarDesde: "virtualizarDesde", itemSize: "itemSize", filasAntesDeCargar: "filasAntesDeCargar", altura: "altura", campoId: "campoId", oscuro: "oscuro", mostrarBusqueda: "mostrarBusqueda", placeholderBusqueda: "placeholderBusqueda", textoVacio: "textoVacio", descripcionVacio: "descripcionVacio", debounceBusqueda: "debounceBusqueda" }, outputs: { busquedaChange: "busquedaChange", accion: "accion", imagenClick: "imagenClick", botonClick: "botonClick", cargarMas: "cargarMas" }, viewQueries: [{ propertyName: "viewport", first: true, predicate: CdkVirtualScrollViewport, descendants: true }, { propertyName: "imagenDialog", first: true, predicate: ["imagenDialog"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<section class=\"td-tabla\" [class.td-tabla--oscura]=\"oscuro\">\n <div class=\"td-tabla__toolbar\">\n <div class=\"td-tabla__filtros\">\n @if (mostrarBusqueda) {\n <label class=\"td-tabla__busqueda\">\n <td-icon nombre=\"search\" />\n <input\n type=\"search\"\n [(ngModel)]=\"busqueda\"\n [placeholder]=\"placeholderBusqueda\"\n (input)=\"buscar()\"\n />\n @if (busqueda) {\n <button type=\"button\" title=\"Limpiar b\u00FAsqueda\" (click)=\"limpiarBusqueda()\">\n <td-icon nombre=\"close\" tamano=\"1rem\" />\n </button>\n }\n </label>\n }\n <ng-content select=\"[tdDataTableFilters]\" />\n </div>\n </div>\n\n <div class=\"td-tabla__superficie\">\n <div class=\"td-tabla__resumen\">\n <span><strong>{{ datos.length }}</strong> de {{ total || datos.length }} registros</span>\n <div class=\"td-tabla__resumen-acciones\">\n <ng-content select=\"[tdDataTableActions]\" />\n @for (boton of botonesVisibles(); track boton.id) {\n <button\n type=\"button\"\n [class]=\"'td-tabla__boton td-tabla__boton--' + (boton.tono || 'neutro')\"\n [disabled]=\"boton.deshabilitado\"\n (click)=\"botonClick.emit(boton)\"\n >\n <td-icon [nombre]=\"boton.icono\" />\n <span>{{ boton.etiqueta }}</span>\n </button>\n }\n </div>\n </div>\n\n @if (datos.length) {\n <div class=\"td-tabla__scroll-x\">\n <div class=\"td-tabla__contenido\" [style.--td-tabla-columnas]=\"columnasGrid()\">\n <div class=\"td-tabla__encabezado\" role=\"row\">\n @for (columna of columnas; track columna.clave) {\n <div\n role=\"columnheader\"\n [class]=\"'td-tabla__alinear--' + (columna.alineacion || 'inicio')\"\n >\n {{ columna.encabezado }}\n </div>\n }\n @if (acciones.length) {\n <div role=\"columnheader\" class=\"td-tabla__alinear--centro\">Acciones</div>\n }\n </div>\n\n @if (usaVirtualizacion()) {\n <cdk-virtual-scroll-viewport\n class=\"td-tabla__viewport\"\n [itemSize]=\"itemSize\"\n [style.height]=\"altura\"\n (scroll)=\"alDesplazarViewport()\"\n (wheel)=\"marcarScrollUsuario()\"\n (touchmove)=\"marcarScrollUsuario()\"\n (keydown.arrowdown)=\"marcarScrollUsuario()\"\n (keydown.pagedown)=\"marcarScrollUsuario()\"\n (keydown.end)=\"marcarScrollUsuario()\"\n >\n <ng-container\n *cdkVirtualFor=\"let fila of datos; let indice = index; trackBy: trackFila\"\n >\n <ng-container\n [ngTemplateOutlet]=\"filaTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: fila, indice: indice }\"\n />\n </ng-container>\n </cdk-virtual-scroll-viewport>\n } @else {\n <div\n class=\"td-tabla__viewport td-tabla__viewport--normal\"\n [style.height]=\"altura\"\n (scroll)=\"alDesplazarLista($event)\"\n (wheel)=\"marcarScrollUsuario()\"\n (touchmove)=\"marcarScrollUsuario()\"\n (keydown.arrowdown)=\"marcarScrollUsuario()\"\n (keydown.pagedown)=\"marcarScrollUsuario()\"\n (keydown.end)=\"marcarScrollUsuario()\"\n >\n @for (fila of datos; track trackFila($index, fila); let indice = $index) {\n <ng-container\n [ngTemplateOutlet]=\"filaTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: fila, indice: indice }\"\n />\n }\n </div>\n }\n </div>\n </div>\n\n <ng-template #filaTemplate let-fila let-indice=\"indice\">\n <div\n class=\"td-tabla__fila\"\n role=\"row\"\n [style.height.px]=\"itemSize\"\n >\n @for (columna of columnas; track columna.clave) {\n <div\n role=\"cell\"\n [class]=\"'td-tabla__celda td-tabla__alinear--' + (columna.alineacion || 'inicio')\"\n >\n @if (columna.tipo === 'imagen') {\n @if (imagenSrc(columna, fila, indice); as src) {\n <button\n type=\"button\"\n [class]=\"'td-tabla__imagen td-tabla__imagen--' + imagenForma(columna)\"\n [title]=\"imagenAlt(columna, fila, indice)\"\n (click)=\"abrirImagen(columna, fila, indice)\"\n >\n <img [src]=\"src\" [alt]=\"imagenAlt(columna, fila, indice)\" loading=\"lazy\" />\n </button>\n } @else {\n <span\n [class]=\"'td-tabla__imagen td-tabla__imagen--placeholder td-tabla__imagen--' + imagenForma(columna)\"\n >\n <td-icon [nombre]=\"columna.imagen?.placeholder || 'image'\" />\n </span>\n }\n } @else if (\n columna.tipo === 'estado' ||\n columna.tipo === 'booleano' ||\n columna.tipo === 'chip'\n ) {\n <span [class]=\"'td-tabla__chip td-tabla__chip--' + tonoCelda(columna, fila)\">\n {{ textoCelda(columna, fila, indice) }}\n </span>\n } @else {\n <span\n [class.td-tabla__numero]=\"\n columna.tipo === 'numero' ||\n columna.tipo === 'decimal' ||\n columna.tipo === 'moneda' ||\n columna.tipo === 'porcentaje'\n \"\n >\n {{ textoCelda(columna, fila, indice) }}\n </span>\n }\n </div>\n }\n\n @if (acciones.length) {\n <div class=\"td-tabla__acciones-fila\" role=\"cell\">\n @if (usarMenuAcciones(fila)) {\n <td-menu\n ariaLabel=\"Acciones de fila\"\n icono=\"more_vertical\"\n ancho=\"15rem\"\n [oscuro]=\"oscuro\"\n [items]=\"accionesMenu(fila)\"\n (seleccion)=\"ejecutarAccionMenu($event, fila, indice)\"\n />\n } @else {\n @for (accionFila of accionesVisibles(fila); track accionFila.id) {\n <button\n type=\"button\"\n [class]=\"'td-tabla__accion td-tabla__accion--' + tonoAccion(accionFila, fila)\"\n [title]=\"accionFila.etiqueta\"\n [disabled]=\"accionFila.deshabilitada?.(fila) ?? false\"\n (click)=\"ejecutarAccion(accionFila, fila, indice)\"\n >\n <td-icon [nombre]=\"iconoAccion(accionFila, fila)\" />\n <span class=\"td-tabla__sr-only\">{{ accionFila.etiqueta }}</span>\n </button>\n }\n }\n </div>\n }\n </div>\n </ng-template>\n\n @if (cargando) {\n <div class=\"td-tabla__cargando\" role=\"status\" aria-live=\"polite\">\n <i aria-hidden=\"true\"></i>\n <span>Cargando m\u00E1s registros...</span>\n </div>\n }\n } @else if (!cargando) {\n <div class=\"td-tabla__vacio\">\n <span><td-icon nombre=\"inbox\" tamano=\"2.4rem\" /></span>\n <h3>{{ textoVacio }}</h3>\n <p>{{ descripcionVacio }}</p>\n </div>\n }\n\n @if (cargando && !datos.length) {\n <div class=\"td-tabla__skeleton\">\n @for (item of [1, 2, 3, 4, 5]; track item) {\n <span></span>\n }\n </div>\n }\n </div>\n</section>\n\n@if (imagenActiva; as imagen) {\n <dialog\n #imagenDialog\n class=\"td-tabla-imagen\"\n [attr.aria-label]=\"imagen.alt\"\n (click)=\"cerrarImagenSiBackdrop($event)\"\n (cancel)=\"cerrarImagen()\"\n (close)=\"imagenActiva = null\"\n >\n <section class=\"td-tabla-imagen__panel\">\n <header>\n <span>{{ imagen.alt }}</span>\n <button type=\"button\" aria-label=\"Cerrar\" (click)=\"cerrarImagen()\">\n <td-icon nombre=\"close\" />\n </button>\n </header>\n <div>\n <img [src]=\"imagen.src\" [alt]=\"imagen.alt\" />\n </div>\n </section>\n </dialog>\n}\n", styles: [":host{display:block}*{box-sizing:border-box}.td-tabla{--fondo: var(--td-color-surface, #fff);--fondo-suave: var(--td-color-surface-soft, #f8fafc);--borde: var(--td-color-border, #e4e8f0);--texto: var(--td-color-text, #263147);--suave: var(--td-color-text-muted, #748096);--hover: var(--td-color-surface-soft, #f7f8fc);--acento: var(--td-color-primary, #5746d8);color:var(--texto);font-family:var(--td-font-family, Inter, ui-sans-serif, system-ui, sans-serif);position:relative;z-index:0;isolation:isolate;contain:layout paint style;overflow-anchor:none}.td-tabla--oscura{--fondo: var(--td-color-surface, #15151b);--fondo-suave: var(--td-color-surface-soft, #1b1b22);--borde: var(--td-color-border, #2d2d36);--texto: var(--td-color-text, #ededf0);--suave: var(--td-color-text-muted, #9393a0);--hover: var(--td-color-surface-muted, #202028);--acento: var(--td-color-primary, #a89cf7)}.td-tabla__toolbar{display:flex;align-items:flex-start;justify-content:space-between;gap:1rem;padding:.55rem 0 .95rem}.td-tabla__filtros{display:flex;min-width:0;flex:1;flex-wrap:wrap;align-items:flex-start;gap:.8rem .65rem}.td-tabla__busqueda{display:flex;width:min(22rem,100%);min-height:3.15rem;align-items:center;gap:.6rem;border:1px solid var(--borde);border-radius:var(--td-radius-md, .78rem);padding:0 .75rem;color:var(--suave);background:var(--fondo);transition:border-color .14s ease,box-shadow .14s ease}.td-tabla__busqueda:focus-within{border-color:var(--acento);box-shadow:var(--td-focus-ring, 0 0 0 3px color-mix(in srgb, var(--acento) 15%, transparent))}.td-tabla__busqueda input{min-width:0;flex:1;border:0;appearance:none;outline:0;color:var(--texto);background:transparent;font:inherit;font-size:.78rem}.td-tabla__busqueda input::-webkit-search-cancel-button,.td-tabla__busqueda input::-webkit-search-decoration{appearance:none;display:none}.td-tabla__busqueda input::-ms-clear,.td-tabla__busqueda input::-ms-reveal{display:none;width:0;height:0}.td-tabla__busqueda button{display:grid;place-items:center;border:0;padding:.2rem;color:var(--suave);background:transparent;cursor:pointer}.td-tabla__vacio button,.td-tabla__boton{display:inline-flex;height:2.55rem;align-items:center;gap:.45rem;border:0;border-radius:var(--td-radius-md, .7rem);padding:0 1rem;color:var(--td-color-on-primary, #fff);background:linear-gradient(135deg,var(--td-color-primary, #5746d8),var(--td-color-info, #7657df));box-shadow:var(--td-shadow-sm, 0 7px 16px rgba(87, 70, 216, .2));font-size:.75rem;font-weight:750;cursor:pointer}.td-tabla__resumen-acciones{display:flex;align-items:center;gap:.45rem}.td-tabla__boton{height:2.15rem;padding:0 .75rem;box-shadow:none;color:var(--td-color-text-muted, #526077);background:var(--td-color-surface-muted, #edf0f5)}.td-tabla__boton--primario{color:var(--td-color-on-primary, #fff);background:linear-gradient(135deg,var(--td-color-primary, #5746d8),var(--td-color-info, #7657df));box-shadow:var(--td-shadow-sm, 0 7px 16px rgba(87, 70, 216, .2))}.td-tabla__boton--exito{color:var(--td-color-on-primary, #fff);background:var(--td-color-success, #168447)}.td-tabla__boton--advertencia{color:var(--td-color-on-primary, #fff);background:var(--td-color-warning, #b66d05)}.td-tabla__boton--peligro{color:var(--td-color-on-primary, #fff);background:var(--td-color-danger, #d33f3f)}.td-tabla__boton:disabled{opacity:.45;cursor:not-allowed}.td-tabla__superficie{position:relative;z-index:0;overflow:hidden;border:1px solid var(--borde);border-radius:var(--td-radius-xl, 1rem);background:var(--fondo);box-shadow:var(--td-shadow-sm, 0 12px 32px rgba(31, 42, 68, .06))}.td-tabla__resumen{display:flex;min-height:3rem;align-items:center;justify-content:space-between;border-bottom:1px solid var(--borde);padding:.7rem 1rem;color:var(--suave);background:var(--fondo-suave);font-size:.7rem}.td-tabla__resumen strong{color:var(--texto)}.td-tabla__cargando{position:absolute;z-index:4;right:0;bottom:0;left:0;display:flex;min-height:2.75rem;align-items:center;justify-content:center;gap:.55rem;border-top:1px solid var(--borde);color:var(--suave);background:color-mix(in srgb,var(--fondo-suave) 94%,transparent);box-shadow:0 -8px 20px color-mix(in srgb,var(--texto) 8%,transparent);-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px);font-size:.7rem;font-weight:650;pointer-events:none}.td-tabla__cargando i{width:.85rem;height:.85rem;border:2px solid var(--borde);border-top-color:var(--acento);border-radius:var(--td-radius-pill, 50%);animation:td-tabla-girar .7s linear infinite}.td-tabla__encabezado,.td-tabla__fila{display:grid;align-items:center;grid-template-columns:var(--td-tabla-columnas)}.td-tabla__scroll-x{width:100%;overflow-x:auto;overflow-y:hidden;scrollbar-gutter:stable;scrollbar-width:thin;scrollbar-color:color-mix(in srgb,var(--suave) 42%,transparent) transparent}.td-tabla__contenido{display:grid;grid-template-columns:var(--td-tabla-columnas);min-width:max-content}.td-tabla__encabezado{position:relative;z-index:2;grid-column:1/-1;min-height:2.75rem;border-bottom:1px solid var(--borde);color:var(--suave);background:var(--fondo-suave);font-size:.62rem;font-weight:800;letter-spacing:.075em;text-transform:uppercase}.td-tabla__encabezado>div,.td-tabla__celda{padding:.6rem 1rem}.td-tabla__viewport{grid-column:1/-1;width:100%;min-width:0;min-height:12rem;overflow-x:hidden;overflow-anchor:none;scrollbar-gutter:stable;scrollbar-width:thin;scrollbar-color:color-mix(in srgb,var(--suave) 45%,transparent) transparent}.td-tabla__viewport--normal{overflow-x:hidden;overflow-y:auto}.td-tabla__fila{grid-column:1/-1;border-bottom:1px solid var(--borde);transition:background .12s ease}.td-tabla__fila:hover{background:var(--hover)}.td-tabla__celda{overflow:hidden;color:var(--texto);font-size:.75rem;text-overflow:ellipsis;white-space:nowrap}.td-tabla__numero{font-variant-numeric:tabular-nums}.td-tabla__alinear--inicio{text-align:left}.td-tabla__alinear--centro{text-align:center;justify-content:center}.td-tabla__alinear--fin{text-align:right;justify-content:flex-end}.td-tabla__imagen{display:inline-grid;width:2.35rem;height:2.35rem;place-items:center;overflow:hidden;border:1px solid var(--borde);padding:0;color:var(--suave);background:var(--fondo-suave);vertical-align:middle}button.td-tabla__imagen{cursor:zoom-in}button.td-tabla__imagen:hover{border-color:var(--acento);box-shadow:var(--td-focus-ring, 0 0 0 3px color-mix(in srgb, var(--acento) 14%, transparent))}.td-tabla__imagen img{width:100%;height:100%;object-fit:cover}.td-tabla__imagen--cuadrada{border-radius:var(--td-radius-sm, .55rem)}.td-tabla__imagen--redondeada{border-radius:var(--td-radius-md, .85rem)}.td-tabla__imagen--circular{border-radius:var(--td-radius-pill, 999px)}.td-tabla__imagen--placeholder{border-style:dashed}.td-tabla__chip{display:inline-flex;border-radius:var(--td-radius-pill, 999px);padding:.25rem .55rem;color:var(--td-color-text-muted, #526077);background:var(--td-color-surface-muted, #edf0f5);font-size:.65rem;font-weight:750}.td-tabla__chip--primario{color:var(--td-color-primary, #4f46e5);background:var(--td-color-primary-soft, #eeecff)}.td-tabla__chip--exito{color:var(--td-color-success, #13713a);background:var(--td-color-success-soft, #dff7e8)}.td-tabla__chip--advertencia{color:var(--td-color-warning, #9a5a05);background:var(--td-color-warning-soft, #fff0cf)}.td-tabla__chip--peligro{color:var(--td-color-danger, #b53434);background:var(--td-color-danger-soft, #fee5e5)}.td-tabla__acciones-fila{display:flex;align-items:center;justify-content:center;gap:.25rem;padding:0 .7rem}.td-tabla__acciones-fila td-menu{line-height:1}.td-tabla__accion{display:grid;width:2rem;height:2rem;place-items:center;border:0;border-radius:var(--td-radius-sm, .55rem);color:var(--suave);background:transparent;cursor:pointer}.td-tabla__accion:hover{background:var(--hover);color:var(--acento)}.td-tabla__accion--exito{color:var(--td-color-success, #168447)}.td-tabla__accion--peligro{color:var(--td-color-danger, #dc3e3e)}.td-tabla__accion--advertencia{color:var(--td-color-warning, #b66d05)}.td-tabla__accion:disabled{opacity:.35;cursor:not-allowed}.td-tabla__vacio{display:grid;min-height:21rem;place-items:center;align-content:center;padding:2rem;text-align:center}.td-tabla__vacio>span{display:grid;width:4.5rem;height:4.5rem;place-items:center;border-radius:var(--td-radius-xl, 1.2rem);color:var(--acento);background:color-mix(in srgb,var(--acento) 10%,transparent)}.td-tabla__vacio h3{margin:1rem 0 .3rem;font-size:1rem}.td-tabla__vacio p{margin:0 0 1.25rem;color:var(--suave);font-size:.75rem}.td-tabla__skeleton{padding:.5rem 1rem}.td-tabla__skeleton span{display:block;height:3.5rem;border-bottom:1px solid var(--borde);background:linear-gradient(90deg,transparent,var(--hover),transparent);background-size:200% 100%;animation:td-tabla-cargar 1.2s linear infinite}.td-tabla__sr-only{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap}@keyframes td-tabla-girar{to{transform:rotate(360deg)}}@keyframes td-tabla-cargar{to{background-position:-200% 0}}.td-tabla-imagen{position:fixed;inset:0;width:min(680px,100vw - 2rem);max-width:none;max-height:min(76dvh,620px);margin:auto;border:0;padding:0;overflow:visible;color:inherit;background:transparent}.td-tabla-imagen::backdrop{background:#0a101e80;-webkit-backdrop-filter:blur(7px);backdrop-filter:blur(7px)}.td-tabla-imagen__panel{display:grid;grid-template-rows:auto minmax(0,1fr);width:100%;max-height:min(76dvh,620px);overflow:hidden;border:1px solid var(--td-color-border, #e4e8f0);border-radius:var(--td-radius-xl, 1.15rem);background:var(--td-color-surface, #fff);box-shadow:var(--td-shadow-xl, 0 24px 72px rgba(15, 23, 42, .28))}.td-tabla-imagen__panel header{display:flex;align-items:center;justify-content:space-between;gap:1rem;border-bottom:1px solid var(--td-color-border, #e4e8f0);padding:.75rem .9rem;background:var(--td-color-surface, #fff)}.td-tabla-imagen__panel span{overflow:hidden;color:var(--td-color-text, #263147);font-size:.78rem;font-weight:800;text-overflow:ellipsis;white-space:nowrap}.td-tabla-imagen__panel button{display:grid;width:2.1rem;height:2.1rem;place-items:center;border:0;border-radius:var(--td-radius-sm, .55rem);color:var(--td-color-text-muted, #748096);background:var(--td-color-surface-soft, #f8fafc);cursor:pointer}.td-tabla-imagen__panel>div{display:grid;min-height:18rem;overflow:hidden;padding:1rem;background:var(--td-color-surface-soft, #f8fafc)}.td-tabla-imagen__panel img{display:block;width:auto;max-width:100%;max-height:min(58dvh,500px);margin:auto;border-radius:var(--td-radius-lg, 1rem);object-fit:contain;box-shadow:var(--td-shadow-md, 0 16px 42px rgba(15, 23, 42, .16))}@media(max-width:640px){.td-tabla__toolbar{align-items:stretch;flex-direction:column}.td-tabla__busqueda{width:100%}.td-tabla__resumen{align-items:flex-start;flex-direction:column}.td-tabla__resumen-acciones{width:100%;flex-wrap:wrap}.td-tabla-imagen{width:calc(100vw - 1.5rem);max-height:calc(100dvh - 1.5rem)}.td-tabla-imagen__panel{width:100%;max-height:calc(100dvh - 1.5rem);height:auto;border-radius:var(--td-radius-xl, 1rem)}.td-tabla-imagen__panel>div{min-height:14rem;padding:.75rem}.td-tabla-imagen__panel img{max-height:calc(100dvh - 7rem)}}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: ScrollingModule }, { kind: "directive", type: i2.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i2.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i2.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "component", type: TdIcon, selector: "td-icon", inputs: ["nombre", "titulo", "tamano"] }, { kind: "component", type: TdMenu, selector: "td-menu", inputs: ["items", "etiqueta", "icono", "posicion", "ancho", "disabled", "oscuro", "ariaLabel"], outputs: ["seleccion", "abiertoChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2373
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: TdDataTable, isStandalone: true, selector: "td-data-table", inputs: { datos: "datos", columnas: "columnas", acciones: "acciones", accionesPresentacion: "accionesPresentacion", botones: "botones", total: "total", cargando: "cargando", puedeCargarMas: "puedeCargarMas", virtualizar: "virtualizar", virtualizarDesde: "virtualizarDesde", itemSize: "itemSize", filasAntesDeCargar: "filasAntesDeCargar", altura: "altura", campoId: "campoId", oscuro: "oscuro", mostrarBusqueda: "mostrarBusqueda", placeholderBusqueda: "placeholderBusqueda", textoVacio: "textoVacio", descripcionVacio: "descripcionVacio", debounceBusqueda: "debounceBusqueda" }, outputs: { busquedaChange: "busquedaChange", accion: "accion", imagenClick: "imagenClick", botonClick: "botonClick", cargarMas: "cargarMas" }, viewQueries: [{ propertyName: "viewport", first: true, predicate: CdkVirtualScrollViewport, descendants: true }, { propertyName: "imagenDialog", first: true, predicate: ["imagenDialog"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<section class=\"td-tabla\" [class.td-tabla--oscura]=\"oscuro\">\n <div class=\"td-tabla__toolbar\">\n <div class=\"td-tabla__filtros\">\n @if (mostrarBusqueda) {\n <label class=\"td-tabla__busqueda\">\n <td-icon nombre=\"search\" />\n <input\n type=\"search\"\n [(ngModel)]=\"busqueda\"\n [placeholder]=\"placeholderBusqueda\"\n (input)=\"buscar()\"\n />\n @if (busqueda) {\n <button type=\"button\" title=\"Limpiar b\u00FAsqueda\" (click)=\"limpiarBusqueda()\">\n <td-icon nombre=\"close\" tamano=\"1rem\" />\n </button>\n }\n </label>\n }\n <ng-content select=\"[tdDataTableFilters]\" />\n </div>\n </div>\n\n <div class=\"td-tabla__superficie\">\n <div class=\"td-tabla__resumen\">\n <span><strong>{{ datos.length }}</strong> de {{ total || datos.length }} registros</span>\n <div class=\"td-tabla__resumen-acciones\">\n <ng-content select=\"[tdDataTableActions]\" />\n @for (boton of botonesVisibles(); track boton.id) {\n <button\n type=\"button\"\n [class]=\"'td-tabla__boton td-tabla__boton--' + (boton.tono || 'neutro')\"\n [disabled]=\"boton.deshabilitado\"\n (click)=\"botonClick.emit(boton)\"\n >\n <td-icon [nombre]=\"boton.icono\" />\n <span>{{ boton.etiqueta }}</span>\n </button>\n }\n </div>\n </div>\n\n @if (datos.length) {\n <div class=\"td-tabla__scroll-x\">\n <div class=\"td-tabla__contenido\" [style.--td-tabla-columnas]=\"columnasGrid()\">\n <div class=\"td-tabla__encabezado\" role=\"row\">\n @for (columna of columnas; track columna.clave) {\n <div\n role=\"columnheader\"\n [class]=\"'td-tabla__alinear--' + (columna.alineacion || 'inicio')\"\n >\n {{ columna.encabezado }}\n </div>\n }\n @if (acciones.length) {\n <div role=\"columnheader\" class=\"td-tabla__alinear--centro\">Acciones</div>\n }\n </div>\n\n @if (usaVirtualizacion()) {\n <cdk-virtual-scroll-viewport\n class=\"td-tabla__viewport\"\n [itemSize]=\"itemSize\"\n [style.height]=\"altura\"\n (scroll)=\"alDesplazarViewport()\"\n (wheel)=\"marcarScrollUsuario()\"\n (touchmove)=\"marcarScrollUsuario()\"\n (keydown.arrowdown)=\"marcarScrollUsuario()\"\n (keydown.pagedown)=\"marcarScrollUsuario()\"\n (keydown.end)=\"marcarScrollUsuario()\"\n >\n <ng-container\n *cdkVirtualFor=\"let fila of datos; let indice = index; trackBy: trackFila\"\n >\n <ng-container\n [ngTemplateOutlet]=\"filaTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: fila, indice: indice }\"\n />\n </ng-container>\n </cdk-virtual-scroll-viewport>\n } @else {\n <div\n class=\"td-tabla__viewport td-tabla__viewport--normal\"\n [style.height]=\"altura\"\n (scroll)=\"alDesplazarLista($event)\"\n (wheel)=\"marcarScrollUsuario()\"\n (touchmove)=\"marcarScrollUsuario()\"\n (keydown.arrowdown)=\"marcarScrollUsuario()\"\n (keydown.pagedown)=\"marcarScrollUsuario()\"\n (keydown.end)=\"marcarScrollUsuario()\"\n >\n @for (fila of datos; track trackFila($index, fila); let indice = $index) {\n <ng-container\n [ngTemplateOutlet]=\"filaTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: fila, indice: indice }\"\n />\n }\n </div>\n }\n </div>\n </div>\n\n <ng-template #filaTemplate let-fila let-indice=\"indice\">\n <div\n class=\"td-tabla__fila\"\n role=\"row\"\n [style.height.px]=\"itemSize\"\n >\n @for (columna of columnas; track columna.clave) {\n <div\n role=\"cell\"\n [class]=\"'td-tabla__celda td-tabla__alinear--' + (columna.alineacion || 'inicio')\"\n >\n @if (columna.tipo === 'imagen') {\n @if (imagenSrc(columna, fila, indice); as src) {\n <button\n type=\"button\"\n [class]=\"'td-tabla__imagen td-tabla__imagen--' + imagenForma(columna)\"\n [title]=\"imagenAlt(columna, fila, indice)\"\n (click)=\"abrirImagen(columna, fila, indice)\"\n >\n <img [src]=\"src\" [alt]=\"imagenAlt(columna, fila, indice)\" loading=\"lazy\" />\n </button>\n } @else {\n <span\n [class]=\"'td-tabla__imagen td-tabla__imagen--placeholder td-tabla__imagen--' + imagenForma(columna)\"\n >\n <td-icon [nombre]=\"columna.imagen?.placeholder || 'image'\" />\n </span>\n }\n } @else if (\n columna.tipo === 'estado' ||\n columna.tipo === 'booleano' ||\n columna.tipo === 'chip'\n ) {\n <span [class]=\"'td-tabla__chip td-tabla__chip--' + tonoCelda(columna, fila)\">\n {{ textoCelda(columna, fila, indice) }}\n </span>\n } @else {\n <span\n [class.td-tabla__numero]=\"\n columna.tipo === 'numero' ||\n columna.tipo === 'decimal' ||\n columna.tipo === 'moneda' ||\n columna.tipo === 'porcentaje'\n \"\n >\n {{ textoCelda(columna, fila, indice) }}\n </span>\n }\n </div>\n }\n\n @if (acciones.length) {\n <div class=\"td-tabla__acciones-fila\" role=\"cell\">\n @if (usarMenuAcciones(fila)) {\n <td-menu\n ariaLabel=\"Acciones de fila\"\n icono=\"more_vertical\"\n ancho=\"15rem\"\n [oscuro]=\"oscuro\"\n [items]=\"accionesMenu(fila)\"\n (seleccion)=\"ejecutarAccionMenu($event, fila, indice)\"\n />\n } @else {\n @for (accionFila of accionesVisibles(fila); track accionFila.id) {\n <button\n type=\"button\"\n [class]=\"'td-tabla__accion td-tabla__accion--' + tonoAccion(accionFila, fila)\"\n [title]=\"accionFila.etiqueta\"\n [disabled]=\"accionFila.deshabilitada?.(fila) ?? false\"\n (click)=\"ejecutarAccion(accionFila, fila, indice)\"\n >\n <td-icon [nombre]=\"iconoAccion(accionFila, fila)\" />\n <span class=\"td-tabla__sr-only\">{{ accionFila.etiqueta }}</span>\n </button>\n }\n }\n </div>\n }\n </div>\n </ng-template>\n\n @if (cargando) {\n <div class=\"td-tabla__cargando\" role=\"status\" aria-live=\"polite\">\n <i aria-hidden=\"true\"></i>\n <span>Cargando m\u00E1s registros...</span>\n </div>\n }\n } @else if (!cargando) {\n <div class=\"td-tabla__vacio\">\n <span><td-icon nombre=\"inbox\" tamano=\"2.4rem\" /></span>\n <h3>{{ textoVacio }}</h3>\n <p>{{ descripcionVacio }}</p>\n </div>\n }\n\n @if (cargando && !datos.length) {\n <div class=\"td-tabla__skeleton\">\n @for (item of [1, 2, 3, 4, 5]; track item) {\n <span></span>\n }\n </div>\n }\n </div>\n</section>\n\n@if (imagenActiva; as imagen) {\n <dialog\n #imagenDialog\n class=\"td-tabla-imagen\"\n [attr.aria-label]=\"imagen.alt\"\n (click)=\"cerrarImagenSiBackdrop($event)\"\n (cancel)=\"cerrarImagen()\"\n (close)=\"imagenActiva = null\"\n >\n <section class=\"td-tabla-imagen__panel\">\n <header>\n <span>{{ imagen.alt }}</span>\n <button type=\"button\" aria-label=\"Cerrar\" (click)=\"cerrarImagen()\">\n <td-icon nombre=\"close\" />\n </button>\n </header>\n <div>\n <img [src]=\"imagen.src\" [alt]=\"imagen.alt\" />\n </div>\n </section>\n </dialog>\n}\n", styles: [":host{display:block}*{box-sizing:border-box}.td-tabla{--fondo: var(--td-color-surface, #fff);--fondo-suave: var(--td-color-surface-soft, #f8fafc);--borde: var(--td-color-border, #e4e8f0);--texto: var(--td-color-text, #263147);--suave: var(--td-color-text-muted, #748096);--hover: var(--td-color-surface-soft, #f7f8fc);--acento: var(--td-color-primary, #5746d8);color:var(--texto);font-family:var(--td-font-family, Inter, ui-sans-serif, system-ui, sans-serif);position:relative;z-index:0;isolation:isolate;contain:layout paint style;overflow-anchor:none}.td-tabla--oscura{--fondo: var(--td-color-surface, #15151b);--fondo-suave: var(--td-color-surface-soft, #1b1b22);--borde: var(--td-color-border, #2d2d36);--texto: var(--td-color-text, #ededf0);--suave: var(--td-color-text-muted, #9393a0);--hover: var(--td-color-surface-muted, #202028);--acento: var(--td-color-primary, #a89cf7)}.td-tabla__toolbar{display:flex;align-items:flex-start;justify-content:space-between;gap:1rem;padding:.55rem 0 .95rem}.td-tabla__filtros{display:flex;min-width:0;flex:1;flex-wrap:wrap;align-items:flex-start;gap:.8rem .65rem}.td-tabla__busqueda{display:flex;width:min(22rem,100%);min-height:3.15rem;align-items:center;gap:.6rem;border:1px solid var(--borde);border-radius:var(--td-radius-md, .78rem);padding:0 .75rem;color:var(--suave);background:var(--fondo);transition:border-color .14s ease,box-shadow .14s ease}.td-tabla__busqueda:focus-within{border-color:var(--acento);box-shadow:var(--td-focus-ring, 0 0 0 3px color-mix(in srgb, var(--acento) 15%, transparent))}.td-tabla__busqueda input{min-width:0;flex:1;border:0;appearance:none;outline:0;color:var(--texto);background:transparent;font:inherit;font-size:.78rem}.td-tabla__busqueda input::-webkit-search-cancel-button,.td-tabla__busqueda input::-webkit-search-decoration{appearance:none;display:none}.td-tabla__busqueda input::-ms-clear,.td-tabla__busqueda input::-ms-reveal{display:none;width:0;height:0}.td-tabla__busqueda button{display:grid;place-items:center;border:0;padding:.2rem;color:var(--suave);background:transparent;cursor:pointer}.td-tabla__vacio button,.td-tabla__boton{display:inline-flex;height:2.55rem;align-items:center;gap:.45rem;border:0;border-radius:var(--td-radius-md, .7rem);padding:0 1rem;color:var(--td-color-on-primary, #fff);background:linear-gradient(135deg,var(--td-color-primary, #5746d8),var(--td-color-info, #7657df));box-shadow:var(--td-shadow-sm, 0 7px 16px rgba(87, 70, 216, .2));font-size:.75rem;font-weight:750;cursor:pointer}.td-tabla__resumen-acciones{display:flex;align-items:center;gap:.45rem}.td-tabla__boton{height:2.15rem;padding:0 .75rem;box-shadow:none;color:var(--td-color-text-muted, #526077);background:var(--td-color-surface-muted, #edf0f5)}.td-tabla__boton--primario{color:var(--td-color-on-primary, #fff);background:linear-gradient(135deg,var(--td-color-primary, #5746d8),var(--td-color-info, #7657df));box-shadow:var(--td-shadow-sm, 0 7px 16px rgba(87, 70, 216, .2))}.td-tabla__boton--exito{color:var(--td-color-on-primary, #fff);background:var(--td-color-success, #168447)}.td-tabla__boton--advertencia{color:var(--td-color-on-primary, #fff);background:var(--td-color-warning, #b66d05)}.td-tabla__boton--peligro{color:var(--td-color-on-primary, #fff);background:var(--td-color-danger, #d33f3f)}.td-tabla__boton:disabled{opacity:.45;cursor:not-allowed}.td-tabla__superficie{position:relative;z-index:0;overflow:hidden;border:1px solid var(--borde);border-radius:var(--td-radius-xl, 1rem);background:var(--fondo);box-shadow:var(--td-shadow-sm, 0 12px 32px rgba(31, 42, 68, .06))}.td-tabla__resumen{display:flex;min-height:3rem;align-items:center;justify-content:space-between;border-bottom:1px solid var(--borde);padding:.7rem 1rem;color:var(--suave);background:var(--fondo-suave);font-size:.7rem}.td-tabla__resumen strong{color:var(--texto)}.td-tabla__cargando{position:absolute;z-index:4;right:0;bottom:0;left:0;display:flex;min-height:2.75rem;align-items:center;justify-content:center;gap:.55rem;border-top:1px solid var(--borde);color:var(--suave);background:color-mix(in srgb,var(--fondo-suave) 94%,transparent);box-shadow:0 -8px 20px color-mix(in srgb,var(--texto) 8%,transparent);-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px);font-size:.7rem;font-weight:650;pointer-events:none}.td-tabla__cargando i{width:.85rem;height:.85rem;border:2px solid var(--borde);border-top-color:var(--acento);border-radius:var(--td-radius-pill, 50%);animation:td-tabla-girar .7s linear infinite}.td-tabla__encabezado,.td-tabla__fila{display:grid;align-items:center;grid-template-columns:var(--td-tabla-columnas)}.td-tabla__scroll-x{position:relative;width:100%;overflow-x:auto;overflow-y:hidden;overscroll-behavior-x:contain;scrollbar-gutter:stable;scrollbar-width:thin;scrollbar-color:color-mix(in srgb,var(--suave) 42%,transparent) transparent}.td-tabla__contenido{display:grid;grid-template-columns:var(--td-tabla-columnas);min-width:max-content}.td-tabla__encabezado{position:relative;z-index:2;grid-column:1/-1;min-height:2.75rem;border-bottom:1px solid var(--borde);color:var(--suave);background:var(--fondo-suave);font-size:.62rem;font-weight:800;letter-spacing:.075em;text-transform:uppercase}.td-tabla__encabezado>div,.td-tabla__celda{padding:.6rem 1rem}.td-tabla__viewport{grid-column:1/-1;width:100%;min-width:0;min-height:12rem;overflow-x:hidden;overflow-anchor:none;scrollbar-gutter:stable;scrollbar-width:thin;scrollbar-color:color-mix(in srgb,var(--suave) 45%,transparent) transparent}.td-tabla__viewport--normal{overflow-x:hidden;overflow-y:auto}.td-tabla__fila{grid-column:1/-1;border-bottom:1px solid var(--borde);transition:background .12s ease}.td-tabla__fila:hover{background:var(--hover)}.td-tabla__celda{overflow:hidden;color:var(--texto);font-size:.75rem;text-overflow:ellipsis;white-space:nowrap}.td-tabla__numero{font-variant-numeric:tabular-nums}.td-tabla__alinear--inicio{text-align:left}.td-tabla__alinear--centro{text-align:center;justify-content:center}.td-tabla__alinear--fin{text-align:right;justify-content:flex-end}.td-tabla__imagen{display:inline-grid;width:2.35rem;height:2.35rem;place-items:center;overflow:hidden;border:1px solid var(--borde);padding:0;color:var(--suave);background:var(--fondo-suave);vertical-align:middle}button.td-tabla__imagen{cursor:zoom-in}button.td-tabla__imagen:hover{border-color:var(--acento);box-shadow:var(--td-focus-ring, 0 0 0 3px color-mix(in srgb, var(--acento) 14%, transparent))}.td-tabla__imagen img{width:100%;height:100%;object-fit:cover}.td-tabla__imagen--cuadrada{border-radius:var(--td-radius-sm, .55rem)}.td-tabla__imagen--redondeada{border-radius:var(--td-radius-md, .85rem)}.td-tabla__imagen--circular{border-radius:var(--td-radius-pill, 999px)}.td-tabla__imagen--placeholder{border-style:dashed}.td-tabla__chip{display:inline-flex;border-radius:var(--td-radius-pill, 999px);padding:.25rem .55rem;color:var(--td-color-text-muted, #526077);background:var(--td-color-surface-muted, #edf0f5);font-size:.65rem;font-weight:750}.td-tabla__chip--primario{color:var(--td-color-primary, #4f46e5);background:var(--td-color-primary-soft, #eeecff)}.td-tabla__chip--exito{color:var(--td-color-success, #13713a);background:var(--td-color-success-soft, #dff7e8)}.td-tabla__chip--advertencia{color:var(--td-color-warning, #9a5a05);background:var(--td-color-warning-soft, #fff0cf)}.td-tabla__chip--peligro{color:var(--td-color-danger, #b53434);background:var(--td-color-danger-soft, #fee5e5)}.td-tabla__acciones-fila{display:flex;align-items:center;justify-content:center;gap:.25rem;padding:0 .7rem}.td-tabla__acciones-fila td-menu{line-height:1}.td-tabla__accion{display:grid;width:2rem;height:2rem;place-items:center;border:0;border-radius:var(--td-radius-sm, .55rem);color:var(--suave);background:transparent;cursor:pointer}.td-tabla__accion:hover{background:var(--hover);color:var(--acento)}.td-tabla__accion--exito{color:var(--td-color-success, #168447)}.td-tabla__accion--peligro{color:var(--td-color-danger, #dc3e3e)}.td-tabla__accion--advertencia{color:var(--td-color-warning, #b66d05)}.td-tabla__accion:disabled{opacity:.35;cursor:not-allowed}.td-tabla__vacio{display:grid;min-height:21rem;place-items:center;align-content:center;padding:2rem;text-align:center}.td-tabla__vacio>span{display:grid;width:4.5rem;height:4.5rem;place-items:center;border-radius:var(--td-radius-xl, 1.2rem);color:var(--acento);background:color-mix(in srgb,var(--acento) 10%,transparent)}.td-tabla__vacio h3{margin:1rem 0 .3rem;font-size:1rem}.td-tabla__vacio p{margin:0 0 1.25rem;color:var(--suave);font-size:.75rem}.td-tabla__skeleton{padding:.5rem 1rem}.td-tabla__skeleton span{display:block;height:3.5rem;border-bottom:1px solid var(--borde);background:linear-gradient(90deg,transparent,var(--hover),transparent);background-size:200% 100%;animation:td-tabla-cargar 1.2s linear infinite}.td-tabla__sr-only{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap}@keyframes td-tabla-girar{to{transform:rotate(360deg)}}@keyframes td-tabla-cargar{to{background-position:-200% 0}}.td-tabla-imagen{position:fixed;inset:0;width:min(680px,100vw - 2rem);max-width:none;max-height:min(76dvh,620px);margin:auto;border:0;padding:0;overflow:visible;color:inherit;background:transparent}.td-tabla-imagen::backdrop{background:#0a101e80;-webkit-backdrop-filter:blur(7px);backdrop-filter:blur(7px)}.td-tabla-imagen__panel{display:grid;grid-template-rows:auto minmax(0,1fr);width:100%;max-height:min(76dvh,620px);overflow:hidden;border:1px solid var(--td-color-border, #e4e8f0);border-radius:var(--td-radius-xl, 1.15rem);background:var(--td-color-surface, #fff);box-shadow:var(--td-shadow-xl, 0 24px 72px rgba(15, 23, 42, .28))}.td-tabla-imagen__panel header{display:flex;align-items:center;justify-content:space-between;gap:1rem;border-bottom:1px solid var(--td-color-border, #e4e8f0);padding:.75rem .9rem;background:var(--td-color-surface, #fff)}.td-tabla-imagen__panel span{overflow:hidden;color:var(--td-color-text, #263147);font-size:.78rem;font-weight:800;text-overflow:ellipsis;white-space:nowrap}.td-tabla-imagen__panel button{display:grid;width:2.1rem;height:2.1rem;place-items:center;border:0;border-radius:var(--td-radius-sm, .55rem);color:var(--td-color-text-muted, #748096);background:var(--td-color-surface-soft, #f8fafc);cursor:pointer}.td-tabla-imagen__panel>div{display:grid;min-height:18rem;overflow:hidden;padding:1rem;background:var(--td-color-surface-soft, #f8fafc)}.td-tabla-imagen__panel img{display:block;width:auto;max-width:100%;max-height:min(58dvh,500px);margin:auto;border-radius:var(--td-radius-lg, 1rem);object-fit:contain;box-shadow:var(--td-shadow-md, 0 16px 42px rgba(15, 23, 42, .16))}@media(max-width:640px){.td-tabla{contain:none}.td-tabla__toolbar{align-items:stretch;flex-direction:column;gap:.75rem;padding:.45rem 0 .85rem}.td-tabla__filtros{display:grid;grid-template-columns:minmax(0,1fr);gap:.7rem}.td-tabla__filtros ::ng-deep>*,.td-tabla__busqueda{width:100%;min-width:0}.td-tabla__busqueda{min-height:3rem;border-radius:var(--td-radius-lg, .9rem)}.td-tabla__superficie{border-radius:var(--td-radius-lg, .9rem)}.td-tabla__resumen{align-items:stretch;flex-direction:column;gap:.65rem;padding:.85rem}.td-tabla__resumen-acciones{display:grid;width:100%;grid-template-columns:repeat(2,minmax(0,1fr));align-items:stretch;gap:.55rem}.td-tabla__resumen-acciones ::ng-deep>*,.td-tabla__boton{width:100%;min-width:0}.td-tabla__boton{height:2.45rem;justify-content:center;padding:0 .75rem}.td-tabla__boton span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.td-tabla__scroll-x{box-shadow:inset -18px 0 18px -22px color-mix(in srgb,var(--texto) 45%,transparent)}.td-tabla__contenido{min-width:max(46rem,max-content)}.td-tabla__encabezado{min-height:2.6rem;font-size:.58rem;letter-spacing:.06em}.td-tabla__encabezado>div,.td-tabla__celda{padding-inline:.75rem}.td-tabla__viewport{min-height:18rem}.td-tabla-imagen{width:calc(100vw - 1.5rem);max-height:calc(100dvh - 1.5rem)}.td-tabla-imagen__panel{width:100%;max-height:calc(100dvh - 1.5rem);height:auto;border-radius:var(--td-radius-xl, 1rem)}.td-tabla-imagen__panel>div{min-height:14rem;padding:.75rem}.td-tabla-imagen__panel img{max-height:calc(100dvh - 7rem)}}@media(max-width:420px){.td-tabla__resumen-acciones{grid-template-columns:minmax(0,1fr)}.td-tabla__contenido{min-width:max(42rem,max-content)}}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: ScrollingModule }, { kind: "directive", type: i2.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i2.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i2.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "component", type: TdIcon, selector: "td-icon", inputs: ["nombre", "titulo", "tamano"] }, { kind: "component", type: TdMenu, selector: "td-menu", inputs: ["items", "etiqueta", "icono", "posicion", "ancho", "disabled", "oscuro", "ariaLabel"], outputs: ["seleccion", "abiertoChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1701
2374
  }
1702
2375
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: TdDataTable, decorators: [{
1703
2376
  type: Component,
1704
- args: [{ selector: 'td-data-table', imports: [FormsModule, NgTemplateOutlet, ScrollingModule, TdIcon, TdMenu], changeDetection: ChangeDetectionStrategy.OnPush, template: "<section class=\"td-tabla\" [class.td-tabla--oscura]=\"oscuro\">\n <div class=\"td-tabla__toolbar\">\n <div class=\"td-tabla__filtros\">\n @if (mostrarBusqueda) {\n <label class=\"td-tabla__busqueda\">\n <td-icon nombre=\"search\" />\n <input\n type=\"search\"\n [(ngModel)]=\"busqueda\"\n [placeholder]=\"placeholderBusqueda\"\n (input)=\"buscar()\"\n />\n @if (busqueda) {\n <button type=\"button\" title=\"Limpiar b\u00FAsqueda\" (click)=\"limpiarBusqueda()\">\n <td-icon nombre=\"close\" tamano=\"1rem\" />\n </button>\n }\n </label>\n }\n <ng-content select=\"[tdDataTableFilters]\" />\n </div>\n </div>\n\n <div class=\"td-tabla__superficie\">\n <div class=\"td-tabla__resumen\">\n <span><strong>{{ datos.length }}</strong> de {{ total || datos.length }} registros</span>\n <div class=\"td-tabla__resumen-acciones\">\n <ng-content select=\"[tdDataTableActions]\" />\n @for (boton of botonesVisibles(); track boton.id) {\n <button\n type=\"button\"\n [class]=\"'td-tabla__boton td-tabla__boton--' + (boton.tono || 'neutro')\"\n [disabled]=\"boton.deshabilitado\"\n (click)=\"botonClick.emit(boton)\"\n >\n <td-icon [nombre]=\"boton.icono\" />\n <span>{{ boton.etiqueta }}</span>\n </button>\n }\n </div>\n </div>\n\n @if (datos.length) {\n <div class=\"td-tabla__scroll-x\">\n <div class=\"td-tabla__contenido\" [style.--td-tabla-columnas]=\"columnasGrid()\">\n <div class=\"td-tabla__encabezado\" role=\"row\">\n @for (columna of columnas; track columna.clave) {\n <div\n role=\"columnheader\"\n [class]=\"'td-tabla__alinear--' + (columna.alineacion || 'inicio')\"\n >\n {{ columna.encabezado }}\n </div>\n }\n @if (acciones.length) {\n <div role=\"columnheader\" class=\"td-tabla__alinear--centro\">Acciones</div>\n }\n </div>\n\n @if (usaVirtualizacion()) {\n <cdk-virtual-scroll-viewport\n class=\"td-tabla__viewport\"\n [itemSize]=\"itemSize\"\n [style.height]=\"altura\"\n (scroll)=\"alDesplazarViewport()\"\n (wheel)=\"marcarScrollUsuario()\"\n (touchmove)=\"marcarScrollUsuario()\"\n (keydown.arrowdown)=\"marcarScrollUsuario()\"\n (keydown.pagedown)=\"marcarScrollUsuario()\"\n (keydown.end)=\"marcarScrollUsuario()\"\n >\n <ng-container\n *cdkVirtualFor=\"let fila of datos; let indice = index; trackBy: trackFila\"\n >\n <ng-container\n [ngTemplateOutlet]=\"filaTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: fila, indice: indice }\"\n />\n </ng-container>\n </cdk-virtual-scroll-viewport>\n } @else {\n <div\n class=\"td-tabla__viewport td-tabla__viewport--normal\"\n [style.height]=\"altura\"\n (scroll)=\"alDesplazarLista($event)\"\n (wheel)=\"marcarScrollUsuario()\"\n (touchmove)=\"marcarScrollUsuario()\"\n (keydown.arrowdown)=\"marcarScrollUsuario()\"\n (keydown.pagedown)=\"marcarScrollUsuario()\"\n (keydown.end)=\"marcarScrollUsuario()\"\n >\n @for (fila of datos; track trackFila($index, fila); let indice = $index) {\n <ng-container\n [ngTemplateOutlet]=\"filaTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: fila, indice: indice }\"\n />\n }\n </div>\n }\n </div>\n </div>\n\n <ng-template #filaTemplate let-fila let-indice=\"indice\">\n <div\n class=\"td-tabla__fila\"\n role=\"row\"\n [style.height.px]=\"itemSize\"\n >\n @for (columna of columnas; track columna.clave) {\n <div\n role=\"cell\"\n [class]=\"'td-tabla__celda td-tabla__alinear--' + (columna.alineacion || 'inicio')\"\n >\n @if (columna.tipo === 'imagen') {\n @if (imagenSrc(columna, fila, indice); as src) {\n <button\n type=\"button\"\n [class]=\"'td-tabla__imagen td-tabla__imagen--' + imagenForma(columna)\"\n [title]=\"imagenAlt(columna, fila, indice)\"\n (click)=\"abrirImagen(columna, fila, indice)\"\n >\n <img [src]=\"src\" [alt]=\"imagenAlt(columna, fila, indice)\" loading=\"lazy\" />\n </button>\n } @else {\n <span\n [class]=\"'td-tabla__imagen td-tabla__imagen--placeholder td-tabla__imagen--' + imagenForma(columna)\"\n >\n <td-icon [nombre]=\"columna.imagen?.placeholder || 'image'\" />\n </span>\n }\n } @else if (\n columna.tipo === 'estado' ||\n columna.tipo === 'booleano' ||\n columna.tipo === 'chip'\n ) {\n <span [class]=\"'td-tabla__chip td-tabla__chip--' + tonoCelda(columna, fila)\">\n {{ textoCelda(columna, fila, indice) }}\n </span>\n } @else {\n <span\n [class.td-tabla__numero]=\"\n columna.tipo === 'numero' ||\n columna.tipo === 'decimal' ||\n columna.tipo === 'moneda' ||\n columna.tipo === 'porcentaje'\n \"\n >\n {{ textoCelda(columna, fila, indice) }}\n </span>\n }\n </div>\n }\n\n @if (acciones.length) {\n <div class=\"td-tabla__acciones-fila\" role=\"cell\">\n @if (usarMenuAcciones(fila)) {\n <td-menu\n ariaLabel=\"Acciones de fila\"\n icono=\"more_vertical\"\n ancho=\"15rem\"\n [oscuro]=\"oscuro\"\n [items]=\"accionesMenu(fila)\"\n (seleccion)=\"ejecutarAccionMenu($event, fila, indice)\"\n />\n } @else {\n @for (accionFila of accionesVisibles(fila); track accionFila.id) {\n <button\n type=\"button\"\n [class]=\"'td-tabla__accion td-tabla__accion--' + tonoAccion(accionFila, fila)\"\n [title]=\"accionFila.etiqueta\"\n [disabled]=\"accionFila.deshabilitada?.(fila) ?? false\"\n (click)=\"ejecutarAccion(accionFila, fila, indice)\"\n >\n <td-icon [nombre]=\"iconoAccion(accionFila, fila)\" />\n <span class=\"td-tabla__sr-only\">{{ accionFila.etiqueta }}</span>\n </button>\n }\n }\n </div>\n }\n </div>\n </ng-template>\n\n @if (cargando) {\n <div class=\"td-tabla__cargando\" role=\"status\" aria-live=\"polite\">\n <i aria-hidden=\"true\"></i>\n <span>Cargando m\u00E1s registros...</span>\n </div>\n }\n } @else if (!cargando) {\n <div class=\"td-tabla__vacio\">\n <span><td-icon nombre=\"inbox\" tamano=\"2.4rem\" /></span>\n <h3>{{ textoVacio }}</h3>\n <p>{{ descripcionVacio }}</p>\n </div>\n }\n\n @if (cargando && !datos.length) {\n <div class=\"td-tabla__skeleton\">\n @for (item of [1, 2, 3, 4, 5]; track item) {\n <span></span>\n }\n </div>\n }\n </div>\n</section>\n\n@if (imagenActiva; as imagen) {\n <dialog\n #imagenDialog\n class=\"td-tabla-imagen\"\n [attr.aria-label]=\"imagen.alt\"\n (click)=\"cerrarImagenSiBackdrop($event)\"\n (cancel)=\"cerrarImagen()\"\n (close)=\"imagenActiva = null\"\n >\n <section class=\"td-tabla-imagen__panel\">\n <header>\n <span>{{ imagen.alt }}</span>\n <button type=\"button\" aria-label=\"Cerrar\" (click)=\"cerrarImagen()\">\n <td-icon nombre=\"close\" />\n </button>\n </header>\n <div>\n <img [src]=\"imagen.src\" [alt]=\"imagen.alt\" />\n </div>\n </section>\n </dialog>\n}\n", styles: [":host{display:block}*{box-sizing:border-box}.td-tabla{--fondo: var(--td-color-surface, #fff);--fondo-suave: var(--td-color-surface-soft, #f8fafc);--borde: var(--td-color-border, #e4e8f0);--texto: var(--td-color-text, #263147);--suave: var(--td-color-text-muted, #748096);--hover: var(--td-color-surface-soft, #f7f8fc);--acento: var(--td-color-primary, #5746d8);color:var(--texto);font-family:var(--td-font-family, Inter, ui-sans-serif, system-ui, sans-serif);position:relative;z-index:0;isolation:isolate;contain:layout paint style;overflow-anchor:none}.td-tabla--oscura{--fondo: var(--td-color-surface, #15151b);--fondo-suave: var(--td-color-surface-soft, #1b1b22);--borde: var(--td-color-border, #2d2d36);--texto: var(--td-color-text, #ededf0);--suave: var(--td-color-text-muted, #9393a0);--hover: var(--td-color-surface-muted, #202028);--acento: var(--td-color-primary, #a89cf7)}.td-tabla__toolbar{display:flex;align-items:flex-start;justify-content:space-between;gap:1rem;padding:.55rem 0 .95rem}.td-tabla__filtros{display:flex;min-width:0;flex:1;flex-wrap:wrap;align-items:flex-start;gap:.8rem .65rem}.td-tabla__busqueda{display:flex;width:min(22rem,100%);min-height:3.15rem;align-items:center;gap:.6rem;border:1px solid var(--borde);border-radius:var(--td-radius-md, .78rem);padding:0 .75rem;color:var(--suave);background:var(--fondo);transition:border-color .14s ease,box-shadow .14s ease}.td-tabla__busqueda:focus-within{border-color:var(--acento);box-shadow:var(--td-focus-ring, 0 0 0 3px color-mix(in srgb, var(--acento) 15%, transparent))}.td-tabla__busqueda input{min-width:0;flex:1;border:0;appearance:none;outline:0;color:var(--texto);background:transparent;font:inherit;font-size:.78rem}.td-tabla__busqueda input::-webkit-search-cancel-button,.td-tabla__busqueda input::-webkit-search-decoration{appearance:none;display:none}.td-tabla__busqueda input::-ms-clear,.td-tabla__busqueda input::-ms-reveal{display:none;width:0;height:0}.td-tabla__busqueda button{display:grid;place-items:center;border:0;padding:.2rem;color:var(--suave);background:transparent;cursor:pointer}.td-tabla__vacio button,.td-tabla__boton{display:inline-flex;height:2.55rem;align-items:center;gap:.45rem;border:0;border-radius:var(--td-radius-md, .7rem);padding:0 1rem;color:var(--td-color-on-primary, #fff);background:linear-gradient(135deg,var(--td-color-primary, #5746d8),var(--td-color-info, #7657df));box-shadow:var(--td-shadow-sm, 0 7px 16px rgba(87, 70, 216, .2));font-size:.75rem;font-weight:750;cursor:pointer}.td-tabla__resumen-acciones{display:flex;align-items:center;gap:.45rem}.td-tabla__boton{height:2.15rem;padding:0 .75rem;box-shadow:none;color:var(--td-color-text-muted, #526077);background:var(--td-color-surface-muted, #edf0f5)}.td-tabla__boton--primario{color:var(--td-color-on-primary, #fff);background:linear-gradient(135deg,var(--td-color-primary, #5746d8),var(--td-color-info, #7657df));box-shadow:var(--td-shadow-sm, 0 7px 16px rgba(87, 70, 216, .2))}.td-tabla__boton--exito{color:var(--td-color-on-primary, #fff);background:var(--td-color-success, #168447)}.td-tabla__boton--advertencia{color:var(--td-color-on-primary, #fff);background:var(--td-color-warning, #b66d05)}.td-tabla__boton--peligro{color:var(--td-color-on-primary, #fff);background:var(--td-color-danger, #d33f3f)}.td-tabla__boton:disabled{opacity:.45;cursor:not-allowed}.td-tabla__superficie{position:relative;z-index:0;overflow:hidden;border:1px solid var(--borde);border-radius:var(--td-radius-xl, 1rem);background:var(--fondo);box-shadow:var(--td-shadow-sm, 0 12px 32px rgba(31, 42, 68, .06))}.td-tabla__resumen{display:flex;min-height:3rem;align-items:center;justify-content:space-between;border-bottom:1px solid var(--borde);padding:.7rem 1rem;color:var(--suave);background:var(--fondo-suave);font-size:.7rem}.td-tabla__resumen strong{color:var(--texto)}.td-tabla__cargando{position:absolute;z-index:4;right:0;bottom:0;left:0;display:flex;min-height:2.75rem;align-items:center;justify-content:center;gap:.55rem;border-top:1px solid var(--borde);color:var(--suave);background:color-mix(in srgb,var(--fondo-suave) 94%,transparent);box-shadow:0 -8px 20px color-mix(in srgb,var(--texto) 8%,transparent);-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px);font-size:.7rem;font-weight:650;pointer-events:none}.td-tabla__cargando i{width:.85rem;height:.85rem;border:2px solid var(--borde);border-top-color:var(--acento);border-radius:var(--td-radius-pill, 50%);animation:td-tabla-girar .7s linear infinite}.td-tabla__encabezado,.td-tabla__fila{display:grid;align-items:center;grid-template-columns:var(--td-tabla-columnas)}.td-tabla__scroll-x{width:100%;overflow-x:auto;overflow-y:hidden;scrollbar-gutter:stable;scrollbar-width:thin;scrollbar-color:color-mix(in srgb,var(--suave) 42%,transparent) transparent}.td-tabla__contenido{display:grid;grid-template-columns:var(--td-tabla-columnas);min-width:max-content}.td-tabla__encabezado{position:relative;z-index:2;grid-column:1/-1;min-height:2.75rem;border-bottom:1px solid var(--borde);color:var(--suave);background:var(--fondo-suave);font-size:.62rem;font-weight:800;letter-spacing:.075em;text-transform:uppercase}.td-tabla__encabezado>div,.td-tabla__celda{padding:.6rem 1rem}.td-tabla__viewport{grid-column:1/-1;width:100%;min-width:0;min-height:12rem;overflow-x:hidden;overflow-anchor:none;scrollbar-gutter:stable;scrollbar-width:thin;scrollbar-color:color-mix(in srgb,var(--suave) 45%,transparent) transparent}.td-tabla__viewport--normal{overflow-x:hidden;overflow-y:auto}.td-tabla__fila{grid-column:1/-1;border-bottom:1px solid var(--borde);transition:background .12s ease}.td-tabla__fila:hover{background:var(--hover)}.td-tabla__celda{overflow:hidden;color:var(--texto);font-size:.75rem;text-overflow:ellipsis;white-space:nowrap}.td-tabla__numero{font-variant-numeric:tabular-nums}.td-tabla__alinear--inicio{text-align:left}.td-tabla__alinear--centro{text-align:center;justify-content:center}.td-tabla__alinear--fin{text-align:right;justify-content:flex-end}.td-tabla__imagen{display:inline-grid;width:2.35rem;height:2.35rem;place-items:center;overflow:hidden;border:1px solid var(--borde);padding:0;color:var(--suave);background:var(--fondo-suave);vertical-align:middle}button.td-tabla__imagen{cursor:zoom-in}button.td-tabla__imagen:hover{border-color:var(--acento);box-shadow:var(--td-focus-ring, 0 0 0 3px color-mix(in srgb, var(--acento) 14%, transparent))}.td-tabla__imagen img{width:100%;height:100%;object-fit:cover}.td-tabla__imagen--cuadrada{border-radius:var(--td-radius-sm, .55rem)}.td-tabla__imagen--redondeada{border-radius:var(--td-radius-md, .85rem)}.td-tabla__imagen--circular{border-radius:var(--td-radius-pill, 999px)}.td-tabla__imagen--placeholder{border-style:dashed}.td-tabla__chip{display:inline-flex;border-radius:var(--td-radius-pill, 999px);padding:.25rem .55rem;color:var(--td-color-text-muted, #526077);background:var(--td-color-surface-muted, #edf0f5);font-size:.65rem;font-weight:750}.td-tabla__chip--primario{color:var(--td-color-primary, #4f46e5);background:var(--td-color-primary-soft, #eeecff)}.td-tabla__chip--exito{color:var(--td-color-success, #13713a);background:var(--td-color-success-soft, #dff7e8)}.td-tabla__chip--advertencia{color:var(--td-color-warning, #9a5a05);background:var(--td-color-warning-soft, #fff0cf)}.td-tabla__chip--peligro{color:var(--td-color-danger, #b53434);background:var(--td-color-danger-soft, #fee5e5)}.td-tabla__acciones-fila{display:flex;align-items:center;justify-content:center;gap:.25rem;padding:0 .7rem}.td-tabla__acciones-fila td-menu{line-height:1}.td-tabla__accion{display:grid;width:2rem;height:2rem;place-items:center;border:0;border-radius:var(--td-radius-sm, .55rem);color:var(--suave);background:transparent;cursor:pointer}.td-tabla__accion:hover{background:var(--hover);color:var(--acento)}.td-tabla__accion--exito{color:var(--td-color-success, #168447)}.td-tabla__accion--peligro{color:var(--td-color-danger, #dc3e3e)}.td-tabla__accion--advertencia{color:var(--td-color-warning, #b66d05)}.td-tabla__accion:disabled{opacity:.35;cursor:not-allowed}.td-tabla__vacio{display:grid;min-height:21rem;place-items:center;align-content:center;padding:2rem;text-align:center}.td-tabla__vacio>span{display:grid;width:4.5rem;height:4.5rem;place-items:center;border-radius:var(--td-radius-xl, 1.2rem);color:var(--acento);background:color-mix(in srgb,var(--acento) 10%,transparent)}.td-tabla__vacio h3{margin:1rem 0 .3rem;font-size:1rem}.td-tabla__vacio p{margin:0 0 1.25rem;color:var(--suave);font-size:.75rem}.td-tabla__skeleton{padding:.5rem 1rem}.td-tabla__skeleton span{display:block;height:3.5rem;border-bottom:1px solid var(--borde);background:linear-gradient(90deg,transparent,var(--hover),transparent);background-size:200% 100%;animation:td-tabla-cargar 1.2s linear infinite}.td-tabla__sr-only{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap}@keyframes td-tabla-girar{to{transform:rotate(360deg)}}@keyframes td-tabla-cargar{to{background-position:-200% 0}}.td-tabla-imagen{position:fixed;inset:0;width:min(680px,100vw - 2rem);max-width:none;max-height:min(76dvh,620px);margin:auto;border:0;padding:0;overflow:visible;color:inherit;background:transparent}.td-tabla-imagen::backdrop{background:#0a101e80;-webkit-backdrop-filter:blur(7px);backdrop-filter:blur(7px)}.td-tabla-imagen__panel{display:grid;grid-template-rows:auto minmax(0,1fr);width:100%;max-height:min(76dvh,620px);overflow:hidden;border:1px solid var(--td-color-border, #e4e8f0);border-radius:var(--td-radius-xl, 1.15rem);background:var(--td-color-surface, #fff);box-shadow:var(--td-shadow-xl, 0 24px 72px rgba(15, 23, 42, .28))}.td-tabla-imagen__panel header{display:flex;align-items:center;justify-content:space-between;gap:1rem;border-bottom:1px solid var(--td-color-border, #e4e8f0);padding:.75rem .9rem;background:var(--td-color-surface, #fff)}.td-tabla-imagen__panel span{overflow:hidden;color:var(--td-color-text, #263147);font-size:.78rem;font-weight:800;text-overflow:ellipsis;white-space:nowrap}.td-tabla-imagen__panel button{display:grid;width:2.1rem;height:2.1rem;place-items:center;border:0;border-radius:var(--td-radius-sm, .55rem);color:var(--td-color-text-muted, #748096);background:var(--td-color-surface-soft, #f8fafc);cursor:pointer}.td-tabla-imagen__panel>div{display:grid;min-height:18rem;overflow:hidden;padding:1rem;background:var(--td-color-surface-soft, #f8fafc)}.td-tabla-imagen__panel img{display:block;width:auto;max-width:100%;max-height:min(58dvh,500px);margin:auto;border-radius:var(--td-radius-lg, 1rem);object-fit:contain;box-shadow:var(--td-shadow-md, 0 16px 42px rgba(15, 23, 42, .16))}@media(max-width:640px){.td-tabla__toolbar{align-items:stretch;flex-direction:column}.td-tabla__busqueda{width:100%}.td-tabla__resumen{align-items:flex-start;flex-direction:column}.td-tabla__resumen-acciones{width:100%;flex-wrap:wrap}.td-tabla-imagen{width:calc(100vw - 1.5rem);max-height:calc(100dvh - 1.5rem)}.td-tabla-imagen__panel{width:100%;max-height:calc(100dvh - 1.5rem);height:auto;border-radius:var(--td-radius-xl, 1rem)}.td-tabla-imagen__panel>div{min-height:14rem;padding:.75rem}.td-tabla-imagen__panel img{max-height:calc(100dvh - 7rem)}}\n"] }]
2377
+ args: [{ selector: 'td-data-table', imports: [FormsModule, NgTemplateOutlet, ScrollingModule, TdIcon, TdMenu], changeDetection: ChangeDetectionStrategy.OnPush, template: "<section class=\"td-tabla\" [class.td-tabla--oscura]=\"oscuro\">\n <div class=\"td-tabla__toolbar\">\n <div class=\"td-tabla__filtros\">\n @if (mostrarBusqueda) {\n <label class=\"td-tabla__busqueda\">\n <td-icon nombre=\"search\" />\n <input\n type=\"search\"\n [(ngModel)]=\"busqueda\"\n [placeholder]=\"placeholderBusqueda\"\n (input)=\"buscar()\"\n />\n @if (busqueda) {\n <button type=\"button\" title=\"Limpiar b\u00FAsqueda\" (click)=\"limpiarBusqueda()\">\n <td-icon nombre=\"close\" tamano=\"1rem\" />\n </button>\n }\n </label>\n }\n <ng-content select=\"[tdDataTableFilters]\" />\n </div>\n </div>\n\n <div class=\"td-tabla__superficie\">\n <div class=\"td-tabla__resumen\">\n <span><strong>{{ datos.length }}</strong> de {{ total || datos.length }} registros</span>\n <div class=\"td-tabla__resumen-acciones\">\n <ng-content select=\"[tdDataTableActions]\" />\n @for (boton of botonesVisibles(); track boton.id) {\n <button\n type=\"button\"\n [class]=\"'td-tabla__boton td-tabla__boton--' + (boton.tono || 'neutro')\"\n [disabled]=\"boton.deshabilitado\"\n (click)=\"botonClick.emit(boton)\"\n >\n <td-icon [nombre]=\"boton.icono\" />\n <span>{{ boton.etiqueta }}</span>\n </button>\n }\n </div>\n </div>\n\n @if (datos.length) {\n <div class=\"td-tabla__scroll-x\">\n <div class=\"td-tabla__contenido\" [style.--td-tabla-columnas]=\"columnasGrid()\">\n <div class=\"td-tabla__encabezado\" role=\"row\">\n @for (columna of columnas; track columna.clave) {\n <div\n role=\"columnheader\"\n [class]=\"'td-tabla__alinear--' + (columna.alineacion || 'inicio')\"\n >\n {{ columna.encabezado }}\n </div>\n }\n @if (acciones.length) {\n <div role=\"columnheader\" class=\"td-tabla__alinear--centro\">Acciones</div>\n }\n </div>\n\n @if (usaVirtualizacion()) {\n <cdk-virtual-scroll-viewport\n class=\"td-tabla__viewport\"\n [itemSize]=\"itemSize\"\n [style.height]=\"altura\"\n (scroll)=\"alDesplazarViewport()\"\n (wheel)=\"marcarScrollUsuario()\"\n (touchmove)=\"marcarScrollUsuario()\"\n (keydown.arrowdown)=\"marcarScrollUsuario()\"\n (keydown.pagedown)=\"marcarScrollUsuario()\"\n (keydown.end)=\"marcarScrollUsuario()\"\n >\n <ng-container\n *cdkVirtualFor=\"let fila of datos; let indice = index; trackBy: trackFila\"\n >\n <ng-container\n [ngTemplateOutlet]=\"filaTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: fila, indice: indice }\"\n />\n </ng-container>\n </cdk-virtual-scroll-viewport>\n } @else {\n <div\n class=\"td-tabla__viewport td-tabla__viewport--normal\"\n [style.height]=\"altura\"\n (scroll)=\"alDesplazarLista($event)\"\n (wheel)=\"marcarScrollUsuario()\"\n (touchmove)=\"marcarScrollUsuario()\"\n (keydown.arrowdown)=\"marcarScrollUsuario()\"\n (keydown.pagedown)=\"marcarScrollUsuario()\"\n (keydown.end)=\"marcarScrollUsuario()\"\n >\n @for (fila of datos; track trackFila($index, fila); let indice = $index) {\n <ng-container\n [ngTemplateOutlet]=\"filaTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: fila, indice: indice }\"\n />\n }\n </div>\n }\n </div>\n </div>\n\n <ng-template #filaTemplate let-fila let-indice=\"indice\">\n <div\n class=\"td-tabla__fila\"\n role=\"row\"\n [style.height.px]=\"itemSize\"\n >\n @for (columna of columnas; track columna.clave) {\n <div\n role=\"cell\"\n [class]=\"'td-tabla__celda td-tabla__alinear--' + (columna.alineacion || 'inicio')\"\n >\n @if (columna.tipo === 'imagen') {\n @if (imagenSrc(columna, fila, indice); as src) {\n <button\n type=\"button\"\n [class]=\"'td-tabla__imagen td-tabla__imagen--' + imagenForma(columna)\"\n [title]=\"imagenAlt(columna, fila, indice)\"\n (click)=\"abrirImagen(columna, fila, indice)\"\n >\n <img [src]=\"src\" [alt]=\"imagenAlt(columna, fila, indice)\" loading=\"lazy\" />\n </button>\n } @else {\n <span\n [class]=\"'td-tabla__imagen td-tabla__imagen--placeholder td-tabla__imagen--' + imagenForma(columna)\"\n >\n <td-icon [nombre]=\"columna.imagen?.placeholder || 'image'\" />\n </span>\n }\n } @else if (\n columna.tipo === 'estado' ||\n columna.tipo === 'booleano' ||\n columna.tipo === 'chip'\n ) {\n <span [class]=\"'td-tabla__chip td-tabla__chip--' + tonoCelda(columna, fila)\">\n {{ textoCelda(columna, fila, indice) }}\n </span>\n } @else {\n <span\n [class.td-tabla__numero]=\"\n columna.tipo === 'numero' ||\n columna.tipo === 'decimal' ||\n columna.tipo === 'moneda' ||\n columna.tipo === 'porcentaje'\n \"\n >\n {{ textoCelda(columna, fila, indice) }}\n </span>\n }\n </div>\n }\n\n @if (acciones.length) {\n <div class=\"td-tabla__acciones-fila\" role=\"cell\">\n @if (usarMenuAcciones(fila)) {\n <td-menu\n ariaLabel=\"Acciones de fila\"\n icono=\"more_vertical\"\n ancho=\"15rem\"\n [oscuro]=\"oscuro\"\n [items]=\"accionesMenu(fila)\"\n (seleccion)=\"ejecutarAccionMenu($event, fila, indice)\"\n />\n } @else {\n @for (accionFila of accionesVisibles(fila); track accionFila.id) {\n <button\n type=\"button\"\n [class]=\"'td-tabla__accion td-tabla__accion--' + tonoAccion(accionFila, fila)\"\n [title]=\"accionFila.etiqueta\"\n [disabled]=\"accionFila.deshabilitada?.(fila) ?? false\"\n (click)=\"ejecutarAccion(accionFila, fila, indice)\"\n >\n <td-icon [nombre]=\"iconoAccion(accionFila, fila)\" />\n <span class=\"td-tabla__sr-only\">{{ accionFila.etiqueta }}</span>\n </button>\n }\n }\n </div>\n }\n </div>\n </ng-template>\n\n @if (cargando) {\n <div class=\"td-tabla__cargando\" role=\"status\" aria-live=\"polite\">\n <i aria-hidden=\"true\"></i>\n <span>Cargando m\u00E1s registros...</span>\n </div>\n }\n } @else if (!cargando) {\n <div class=\"td-tabla__vacio\">\n <span><td-icon nombre=\"inbox\" tamano=\"2.4rem\" /></span>\n <h3>{{ textoVacio }}</h3>\n <p>{{ descripcionVacio }}</p>\n </div>\n }\n\n @if (cargando && !datos.length) {\n <div class=\"td-tabla__skeleton\">\n @for (item of [1, 2, 3, 4, 5]; track item) {\n <span></span>\n }\n </div>\n }\n </div>\n</section>\n\n@if (imagenActiva; as imagen) {\n <dialog\n #imagenDialog\n class=\"td-tabla-imagen\"\n [attr.aria-label]=\"imagen.alt\"\n (click)=\"cerrarImagenSiBackdrop($event)\"\n (cancel)=\"cerrarImagen()\"\n (close)=\"imagenActiva = null\"\n >\n <section class=\"td-tabla-imagen__panel\">\n <header>\n <span>{{ imagen.alt }}</span>\n <button type=\"button\" aria-label=\"Cerrar\" (click)=\"cerrarImagen()\">\n <td-icon nombre=\"close\" />\n </button>\n </header>\n <div>\n <img [src]=\"imagen.src\" [alt]=\"imagen.alt\" />\n </div>\n </section>\n </dialog>\n}\n", styles: [":host{display:block}*{box-sizing:border-box}.td-tabla{--fondo: var(--td-color-surface, #fff);--fondo-suave: var(--td-color-surface-soft, #f8fafc);--borde: var(--td-color-border, #e4e8f0);--texto: var(--td-color-text, #263147);--suave: var(--td-color-text-muted, #748096);--hover: var(--td-color-surface-soft, #f7f8fc);--acento: var(--td-color-primary, #5746d8);color:var(--texto);font-family:var(--td-font-family, Inter, ui-sans-serif, system-ui, sans-serif);position:relative;z-index:0;isolation:isolate;contain:layout paint style;overflow-anchor:none}.td-tabla--oscura{--fondo: var(--td-color-surface, #15151b);--fondo-suave: var(--td-color-surface-soft, #1b1b22);--borde: var(--td-color-border, #2d2d36);--texto: var(--td-color-text, #ededf0);--suave: var(--td-color-text-muted, #9393a0);--hover: var(--td-color-surface-muted, #202028);--acento: var(--td-color-primary, #a89cf7)}.td-tabla__toolbar{display:flex;align-items:flex-start;justify-content:space-between;gap:1rem;padding:.55rem 0 .95rem}.td-tabla__filtros{display:flex;min-width:0;flex:1;flex-wrap:wrap;align-items:flex-start;gap:.8rem .65rem}.td-tabla__busqueda{display:flex;width:min(22rem,100%);min-height:3.15rem;align-items:center;gap:.6rem;border:1px solid var(--borde);border-radius:var(--td-radius-md, .78rem);padding:0 .75rem;color:var(--suave);background:var(--fondo);transition:border-color .14s ease,box-shadow .14s ease}.td-tabla__busqueda:focus-within{border-color:var(--acento);box-shadow:var(--td-focus-ring, 0 0 0 3px color-mix(in srgb, var(--acento) 15%, transparent))}.td-tabla__busqueda input{min-width:0;flex:1;border:0;appearance:none;outline:0;color:var(--texto);background:transparent;font:inherit;font-size:.78rem}.td-tabla__busqueda input::-webkit-search-cancel-button,.td-tabla__busqueda input::-webkit-search-decoration{appearance:none;display:none}.td-tabla__busqueda input::-ms-clear,.td-tabla__busqueda input::-ms-reveal{display:none;width:0;height:0}.td-tabla__busqueda button{display:grid;place-items:center;border:0;padding:.2rem;color:var(--suave);background:transparent;cursor:pointer}.td-tabla__vacio button,.td-tabla__boton{display:inline-flex;height:2.55rem;align-items:center;gap:.45rem;border:0;border-radius:var(--td-radius-md, .7rem);padding:0 1rem;color:var(--td-color-on-primary, #fff);background:linear-gradient(135deg,var(--td-color-primary, #5746d8),var(--td-color-info, #7657df));box-shadow:var(--td-shadow-sm, 0 7px 16px rgba(87, 70, 216, .2));font-size:.75rem;font-weight:750;cursor:pointer}.td-tabla__resumen-acciones{display:flex;align-items:center;gap:.45rem}.td-tabla__boton{height:2.15rem;padding:0 .75rem;box-shadow:none;color:var(--td-color-text-muted, #526077);background:var(--td-color-surface-muted, #edf0f5)}.td-tabla__boton--primario{color:var(--td-color-on-primary, #fff);background:linear-gradient(135deg,var(--td-color-primary, #5746d8),var(--td-color-info, #7657df));box-shadow:var(--td-shadow-sm, 0 7px 16px rgba(87, 70, 216, .2))}.td-tabla__boton--exito{color:var(--td-color-on-primary, #fff);background:var(--td-color-success, #168447)}.td-tabla__boton--advertencia{color:var(--td-color-on-primary, #fff);background:var(--td-color-warning, #b66d05)}.td-tabla__boton--peligro{color:var(--td-color-on-primary, #fff);background:var(--td-color-danger, #d33f3f)}.td-tabla__boton:disabled{opacity:.45;cursor:not-allowed}.td-tabla__superficie{position:relative;z-index:0;overflow:hidden;border:1px solid var(--borde);border-radius:var(--td-radius-xl, 1rem);background:var(--fondo);box-shadow:var(--td-shadow-sm, 0 12px 32px rgba(31, 42, 68, .06))}.td-tabla__resumen{display:flex;min-height:3rem;align-items:center;justify-content:space-between;border-bottom:1px solid var(--borde);padding:.7rem 1rem;color:var(--suave);background:var(--fondo-suave);font-size:.7rem}.td-tabla__resumen strong{color:var(--texto)}.td-tabla__cargando{position:absolute;z-index:4;right:0;bottom:0;left:0;display:flex;min-height:2.75rem;align-items:center;justify-content:center;gap:.55rem;border-top:1px solid var(--borde);color:var(--suave);background:color-mix(in srgb,var(--fondo-suave) 94%,transparent);box-shadow:0 -8px 20px color-mix(in srgb,var(--texto) 8%,transparent);-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px);font-size:.7rem;font-weight:650;pointer-events:none}.td-tabla__cargando i{width:.85rem;height:.85rem;border:2px solid var(--borde);border-top-color:var(--acento);border-radius:var(--td-radius-pill, 50%);animation:td-tabla-girar .7s linear infinite}.td-tabla__encabezado,.td-tabla__fila{display:grid;align-items:center;grid-template-columns:var(--td-tabla-columnas)}.td-tabla__scroll-x{position:relative;width:100%;overflow-x:auto;overflow-y:hidden;overscroll-behavior-x:contain;scrollbar-gutter:stable;scrollbar-width:thin;scrollbar-color:color-mix(in srgb,var(--suave) 42%,transparent) transparent}.td-tabla__contenido{display:grid;grid-template-columns:var(--td-tabla-columnas);min-width:max-content}.td-tabla__encabezado{position:relative;z-index:2;grid-column:1/-1;min-height:2.75rem;border-bottom:1px solid var(--borde);color:var(--suave);background:var(--fondo-suave);font-size:.62rem;font-weight:800;letter-spacing:.075em;text-transform:uppercase}.td-tabla__encabezado>div,.td-tabla__celda{padding:.6rem 1rem}.td-tabla__viewport{grid-column:1/-1;width:100%;min-width:0;min-height:12rem;overflow-x:hidden;overflow-anchor:none;scrollbar-gutter:stable;scrollbar-width:thin;scrollbar-color:color-mix(in srgb,var(--suave) 45%,transparent) transparent}.td-tabla__viewport--normal{overflow-x:hidden;overflow-y:auto}.td-tabla__fila{grid-column:1/-1;border-bottom:1px solid var(--borde);transition:background .12s ease}.td-tabla__fila:hover{background:var(--hover)}.td-tabla__celda{overflow:hidden;color:var(--texto);font-size:.75rem;text-overflow:ellipsis;white-space:nowrap}.td-tabla__numero{font-variant-numeric:tabular-nums}.td-tabla__alinear--inicio{text-align:left}.td-tabla__alinear--centro{text-align:center;justify-content:center}.td-tabla__alinear--fin{text-align:right;justify-content:flex-end}.td-tabla__imagen{display:inline-grid;width:2.35rem;height:2.35rem;place-items:center;overflow:hidden;border:1px solid var(--borde);padding:0;color:var(--suave);background:var(--fondo-suave);vertical-align:middle}button.td-tabla__imagen{cursor:zoom-in}button.td-tabla__imagen:hover{border-color:var(--acento);box-shadow:var(--td-focus-ring, 0 0 0 3px color-mix(in srgb, var(--acento) 14%, transparent))}.td-tabla__imagen img{width:100%;height:100%;object-fit:cover}.td-tabla__imagen--cuadrada{border-radius:var(--td-radius-sm, .55rem)}.td-tabla__imagen--redondeada{border-radius:var(--td-radius-md, .85rem)}.td-tabla__imagen--circular{border-radius:var(--td-radius-pill, 999px)}.td-tabla__imagen--placeholder{border-style:dashed}.td-tabla__chip{display:inline-flex;border-radius:var(--td-radius-pill, 999px);padding:.25rem .55rem;color:var(--td-color-text-muted, #526077);background:var(--td-color-surface-muted, #edf0f5);font-size:.65rem;font-weight:750}.td-tabla__chip--primario{color:var(--td-color-primary, #4f46e5);background:var(--td-color-primary-soft, #eeecff)}.td-tabla__chip--exito{color:var(--td-color-success, #13713a);background:var(--td-color-success-soft, #dff7e8)}.td-tabla__chip--advertencia{color:var(--td-color-warning, #9a5a05);background:var(--td-color-warning-soft, #fff0cf)}.td-tabla__chip--peligro{color:var(--td-color-danger, #b53434);background:var(--td-color-danger-soft, #fee5e5)}.td-tabla__acciones-fila{display:flex;align-items:center;justify-content:center;gap:.25rem;padding:0 .7rem}.td-tabla__acciones-fila td-menu{line-height:1}.td-tabla__accion{display:grid;width:2rem;height:2rem;place-items:center;border:0;border-radius:var(--td-radius-sm, .55rem);color:var(--suave);background:transparent;cursor:pointer}.td-tabla__accion:hover{background:var(--hover);color:var(--acento)}.td-tabla__accion--exito{color:var(--td-color-success, #168447)}.td-tabla__accion--peligro{color:var(--td-color-danger, #dc3e3e)}.td-tabla__accion--advertencia{color:var(--td-color-warning, #b66d05)}.td-tabla__accion:disabled{opacity:.35;cursor:not-allowed}.td-tabla__vacio{display:grid;min-height:21rem;place-items:center;align-content:center;padding:2rem;text-align:center}.td-tabla__vacio>span{display:grid;width:4.5rem;height:4.5rem;place-items:center;border-radius:var(--td-radius-xl, 1.2rem);color:var(--acento);background:color-mix(in srgb,var(--acento) 10%,transparent)}.td-tabla__vacio h3{margin:1rem 0 .3rem;font-size:1rem}.td-tabla__vacio p{margin:0 0 1.25rem;color:var(--suave);font-size:.75rem}.td-tabla__skeleton{padding:.5rem 1rem}.td-tabla__skeleton span{display:block;height:3.5rem;border-bottom:1px solid var(--borde);background:linear-gradient(90deg,transparent,var(--hover),transparent);background-size:200% 100%;animation:td-tabla-cargar 1.2s linear infinite}.td-tabla__sr-only{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap}@keyframes td-tabla-girar{to{transform:rotate(360deg)}}@keyframes td-tabla-cargar{to{background-position:-200% 0}}.td-tabla-imagen{position:fixed;inset:0;width:min(680px,100vw - 2rem);max-width:none;max-height:min(76dvh,620px);margin:auto;border:0;padding:0;overflow:visible;color:inherit;background:transparent}.td-tabla-imagen::backdrop{background:#0a101e80;-webkit-backdrop-filter:blur(7px);backdrop-filter:blur(7px)}.td-tabla-imagen__panel{display:grid;grid-template-rows:auto minmax(0,1fr);width:100%;max-height:min(76dvh,620px);overflow:hidden;border:1px solid var(--td-color-border, #e4e8f0);border-radius:var(--td-radius-xl, 1.15rem);background:var(--td-color-surface, #fff);box-shadow:var(--td-shadow-xl, 0 24px 72px rgba(15, 23, 42, .28))}.td-tabla-imagen__panel header{display:flex;align-items:center;justify-content:space-between;gap:1rem;border-bottom:1px solid var(--td-color-border, #e4e8f0);padding:.75rem .9rem;background:var(--td-color-surface, #fff)}.td-tabla-imagen__panel span{overflow:hidden;color:var(--td-color-text, #263147);font-size:.78rem;font-weight:800;text-overflow:ellipsis;white-space:nowrap}.td-tabla-imagen__panel button{display:grid;width:2.1rem;height:2.1rem;place-items:center;border:0;border-radius:var(--td-radius-sm, .55rem);color:var(--td-color-text-muted, #748096);background:var(--td-color-surface-soft, #f8fafc);cursor:pointer}.td-tabla-imagen__panel>div{display:grid;min-height:18rem;overflow:hidden;padding:1rem;background:var(--td-color-surface-soft, #f8fafc)}.td-tabla-imagen__panel img{display:block;width:auto;max-width:100%;max-height:min(58dvh,500px);margin:auto;border-radius:var(--td-radius-lg, 1rem);object-fit:contain;box-shadow:var(--td-shadow-md, 0 16px 42px rgba(15, 23, 42, .16))}@media(max-width:640px){.td-tabla{contain:none}.td-tabla__toolbar{align-items:stretch;flex-direction:column;gap:.75rem;padding:.45rem 0 .85rem}.td-tabla__filtros{display:grid;grid-template-columns:minmax(0,1fr);gap:.7rem}.td-tabla__filtros ::ng-deep>*,.td-tabla__busqueda{width:100%;min-width:0}.td-tabla__busqueda{min-height:3rem;border-radius:var(--td-radius-lg, .9rem)}.td-tabla__superficie{border-radius:var(--td-radius-lg, .9rem)}.td-tabla__resumen{align-items:stretch;flex-direction:column;gap:.65rem;padding:.85rem}.td-tabla__resumen-acciones{display:grid;width:100%;grid-template-columns:repeat(2,minmax(0,1fr));align-items:stretch;gap:.55rem}.td-tabla__resumen-acciones ::ng-deep>*,.td-tabla__boton{width:100%;min-width:0}.td-tabla__boton{height:2.45rem;justify-content:center;padding:0 .75rem}.td-tabla__boton span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.td-tabla__scroll-x{box-shadow:inset -18px 0 18px -22px color-mix(in srgb,var(--texto) 45%,transparent)}.td-tabla__contenido{min-width:max(46rem,max-content)}.td-tabla__encabezado{min-height:2.6rem;font-size:.58rem;letter-spacing:.06em}.td-tabla__encabezado>div,.td-tabla__celda{padding-inline:.75rem}.td-tabla__viewport{min-height:18rem}.td-tabla-imagen{width:calc(100vw - 1.5rem);max-height:calc(100dvh - 1.5rem)}.td-tabla-imagen__panel{width:100%;max-height:calc(100dvh - 1.5rem);height:auto;border-radius:var(--td-radius-xl, 1rem)}.td-tabla-imagen__panel>div{min-height:14rem;padding:.75rem}.td-tabla-imagen__panel img{max-height:calc(100dvh - 7rem)}}@media(max-width:420px){.td-tabla__resumen-acciones{grid-template-columns:minmax(0,1fr)}.td-tabla__contenido{min-width:max(42rem,max-content)}}\n"] }]
1705
2378
  }], propDecorators: { viewport: [{
1706
2379
  type: ViewChild,
1707
2380
  args: [CdkVirtualScrollViewport]
@@ -2776,11 +3449,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
2776
3449
 
2777
3450
  class TdDialogActions {
2778
3451
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: TdDialogActions, deps: [], target: i0.ɵɵFactoryTarget.Component });
2779
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.4", type: TdDialogActions, isStandalone: true, selector: "td-dialog-actions", ngImport: i0, template: `<ng-content />`, isInline: true, styles: [":host{position:sticky;z-index:3;bottom:-1.5rem;display:flex;min-height:3.7rem;flex:0 0 auto;align-items:center;justify-content:flex-end;gap:.5rem;margin:auto -1.5rem -1.5rem;margin-top:auto;border-top:1px solid var(--td-dialog-border, #e6e9f0);padding:.65rem 1.25rem;background:var(--td-dialog-footer, #fafbfc);box-shadow:0 -8px 22px #0f172a09}:host ::ng-deep button{display:inline-flex;min-height:2.25rem;align-items:center;justify-content:center;gap:.45rem;border:1px solid var(--td-dialog-border, #dfe3eb);border-radius:.6rem;padding:.5rem .85rem;color:var(--td-dialog-text, #263147);background:var(--td-dialog-surface, #fff);font:750 .75rem/1 system-ui,sans-serif;cursor:pointer}:host ::ng-deep button:hover{border-color:#9b91e3;background:#f7f5ff}:host ::ng-deep button[tdDialogPrimary]{border-color:transparent;color:#fff;background:linear-gradient(135deg,#5746d8,#7657df);box-shadow:0 7px 16px #5746d833}:host ::ng-deep button:disabled{opacity:.5;cursor:not-allowed}@media(max-width:520px){:host{bottom:-1.1rem;min-height:auto;align-items:stretch;flex-direction:column-reverse;margin-right:-1.1rem;margin-bottom:-1.1rem;margin-left:-1.1rem;padding:.7rem 1.1rem}:host ::ng-deep button{width:100%}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3452
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.4", type: TdDialogActions, isStandalone: true, selector: "td-dialog-actions", ngImport: i0, template: `<ng-content />`, isInline: true, styles: [":host{position:sticky;z-index:3;bottom:-1.5rem;display:flex;min-height:3.7rem;flex:0 0 auto;align-items:center;justify-content:flex-end;gap:.5rem;margin:auto -1.5rem -1.5rem;margin-top:auto;border-top:1px solid var(--td-dialog-border, #e6e9f0);padding:.65rem 1.25rem;background:var(--td-dialog-footer, #fafbfc);box-shadow:0 -8px 22px #0f172a09}:host ::ng-deep td-button{display:inline-block;min-width:0}:host ::ng-deep button{display:inline-flex;min-height:2.25rem;align-items:center;justify-content:center;gap:.45rem;border:1px solid var(--td-dialog-border, #dfe3eb);border-radius:.6rem;padding:.5rem .85rem;color:var(--td-dialog-text, #263147);background:var(--td-dialog-surface, #fff);font:750 .75rem/1 system-ui,sans-serif;cursor:pointer}:host ::ng-deep button:hover{border-color:#9b91e3;background:#f7f5ff}:host ::ng-deep button[tdDialogPrimary]{border-color:transparent;color:#fff;background:linear-gradient(135deg,#5746d8,#7657df);box-shadow:0 7px 16px #5746d833}:host ::ng-deep button:disabled{opacity:.5;cursor:not-allowed}@media(max-width:520px){:host{bottom:-1.1rem;display:grid;grid-auto-flow:row;grid-auto-rows:minmax(2.45rem,auto);grid-template-columns:minmax(0,1fr);min-height:auto;align-items:stretch;justify-content:stretch;margin-right:-1.1rem;margin-bottom:-1.1rem;margin-left:-1.1rem;padding:.75rem 1.1rem;gap:.55rem}:host ::ng-deep td-button{display:block;width:100%}:host ::ng-deep td-button:last-of-type{order:-1}:host ::ng-deep button,:host ::ng-deep td-button .td-button{width:100%;min-height:2.45rem}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2780
3453
  }
2781
3454
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: TdDialogActions, decorators: [{
2782
3455
  type: Component,
2783
- args: [{ selector: 'td-dialog-actions', template: `<ng-content />`, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{position:sticky;z-index:3;bottom:-1.5rem;display:flex;min-height:3.7rem;flex:0 0 auto;align-items:center;justify-content:flex-end;gap:.5rem;margin:auto -1.5rem -1.5rem;margin-top:auto;border-top:1px solid var(--td-dialog-border, #e6e9f0);padding:.65rem 1.25rem;background:var(--td-dialog-footer, #fafbfc);box-shadow:0 -8px 22px #0f172a09}:host ::ng-deep button{display:inline-flex;min-height:2.25rem;align-items:center;justify-content:center;gap:.45rem;border:1px solid var(--td-dialog-border, #dfe3eb);border-radius:.6rem;padding:.5rem .85rem;color:var(--td-dialog-text, #263147);background:var(--td-dialog-surface, #fff);font:750 .75rem/1 system-ui,sans-serif;cursor:pointer}:host ::ng-deep button:hover{border-color:#9b91e3;background:#f7f5ff}:host ::ng-deep button[tdDialogPrimary]{border-color:transparent;color:#fff;background:linear-gradient(135deg,#5746d8,#7657df);box-shadow:0 7px 16px #5746d833}:host ::ng-deep button:disabled{opacity:.5;cursor:not-allowed}@media(max-width:520px){:host{bottom:-1.1rem;min-height:auto;align-items:stretch;flex-direction:column-reverse;margin-right:-1.1rem;margin-bottom:-1.1rem;margin-left:-1.1rem;padding:.7rem 1.1rem}:host ::ng-deep button{width:100%}}\n"] }]
3456
+ args: [{ selector: 'td-dialog-actions', template: `<ng-content />`, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{position:sticky;z-index:3;bottom:-1.5rem;display:flex;min-height:3.7rem;flex:0 0 auto;align-items:center;justify-content:flex-end;gap:.5rem;margin:auto -1.5rem -1.5rem;margin-top:auto;border-top:1px solid var(--td-dialog-border, #e6e9f0);padding:.65rem 1.25rem;background:var(--td-dialog-footer, #fafbfc);box-shadow:0 -8px 22px #0f172a09}:host ::ng-deep td-button{display:inline-block;min-width:0}:host ::ng-deep button{display:inline-flex;min-height:2.25rem;align-items:center;justify-content:center;gap:.45rem;border:1px solid var(--td-dialog-border, #dfe3eb);border-radius:.6rem;padding:.5rem .85rem;color:var(--td-dialog-text, #263147);background:var(--td-dialog-surface, #fff);font:750 .75rem/1 system-ui,sans-serif;cursor:pointer}:host ::ng-deep button:hover{border-color:#9b91e3;background:#f7f5ff}:host ::ng-deep button[tdDialogPrimary]{border-color:transparent;color:#fff;background:linear-gradient(135deg,#5746d8,#7657df);box-shadow:0 7px 16px #5746d833}:host ::ng-deep button:disabled{opacity:.5;cursor:not-allowed}@media(max-width:520px){:host{bottom:-1.1rem;display:grid;grid-auto-flow:row;grid-auto-rows:minmax(2.45rem,auto);grid-template-columns:minmax(0,1fr);min-height:auto;align-items:stretch;justify-content:stretch;margin-right:-1.1rem;margin-bottom:-1.1rem;margin-left:-1.1rem;padding:.75rem 1.1rem;gap:.55rem}:host ::ng-deep td-button{display:block;width:100%}:host ::ng-deep td-button:last-of-type{order:-1}:host ::ng-deep button,:host ::ng-deep td-button .td-button{width:100%;min-height:2.45rem}}\n"] }]
2784
3457
  }] });
2785
3458
 
2786
3459
  class TdDialogClose {
@@ -7089,5 +7762,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
7089
7762
  * Generated bundle index. Do not edit.
7090
7763
  */
7091
7764
 
7092
- export { TD_DIALOG_CONFIG, TD_DIALOG_DATA, TD_ICONOS, TD_ICONOS_NOMBRES, TD_THEME_DARK_COLORS, TD_THEME_LIGHT_COLORS, TdAlerta, TdAutocompleteSelect, TdBadge, TdButton, TdCheckbox, TdDataTable, TdDatePicker, TdDialog, TdDialogActions, TdDialogClose, TdDialogPrimary, TdDialogRef, TdFileUpload, TdFileViewer, TdFileViewerService, TdFooter, TdHeader, TdIcon, TdIconoRegistry, TdInput, TdMenu, TdRadioGroup, TdSelect, TdSidebar, TdTab, TdTabs, TdTextarea, TdThemeService, TdTooltip, TelcomdevUi, createTdFormControlBridge };
7765
+ export { TD_DIALOG_CONFIG, TD_DIALOG_DATA, TD_ICONOS, TD_ICONOS_NOMBRES, TD_THEME_DARK_COLORS, TD_THEME_LIGHT_COLORS, TdAlert, TdAlerta, TdAutocompleteSelect, TdBadge, TdButton, TdCheckbox, TdDataTable, TdDatePicker, TdDialog, TdDialogActions, TdDialogClose, TdDialogPrimary, TdDialogRef, TdFileUpload, TdFileViewer, TdFileViewerService, TdFooter, TdHeader, TdIcon, TdIconoRegistry, TdInput, TdMenu, TdRadioGroup, TdSelect, TdSidebar, TdTab, TdTabs, TdTextarea, TdThemeService, TdTooltip, TelcomdevUi, createTdFormControlBridge };
7093
7766
  //# sourceMappingURL=telcomdev-ui.mjs.map