@telcomdev/ui 0.0.4 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +58 -0
- package/fesm2022/telcomdev-ui.mjs +1307 -4
- package/fesm2022/telcomdev-ui.mjs.map +1 -1
- package/package.json +6 -2
- package/types/telcomdev-ui.d.ts +236 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telcomdev-ui.mjs","sources":["../../../projects/telcomdev-ui/src/lib/telcomdev-ui.ts","../../../projects/telcomdev-ui/src/lib/alerta/td-alerta.ts","../../../projects/telcomdev-ui/src/lib/iconos/td-iconos.ts","../../../projects/telcomdev-ui/src/lib/iconos/td-icono-registry.ts","../../../projects/telcomdev-ui/src/lib/iconos/td-icon.ts","../../../projects/telcomdev-ui/src/lib/data-table/td-data-table.ts","../../../projects/telcomdev-ui/src/lib/data-table/td-data-table.html","../../../projects/telcomdev-ui/src/lib/footer/td-footer.ts","../../../projects/telcomdev-ui/src/lib/footer/td-footer.html","../../../projects/telcomdev-ui/src/lib/header/td-header.ts","../../../projects/telcomdev-ui/src/lib/header/td-header.html","../../../projects/telcomdev-ui/src/lib/sidebar/td-sidebar.ts","../../../projects/telcomdev-ui/src/lib/sidebar/td-sidebar.html","../../../projects/telcomdev-ui/src/public-api.ts","../../../projects/telcomdev-ui/src/telcomdev-ui.ts"],"sourcesContent":["import { Component } from '@angular/core';\n\n@Component({\n selector: 'td-telcomdev-ui',\n imports: [],\n template: ` <p>telcomdev-ui works!</p> `,\n styles: ``,\n})\nexport class TelcomdevUi {}\n","export type TdAlertaTipo = 'exito' | 'error' | 'advertencia' | 'info' | 'pregunta';\r\n\r\nexport interface TdAlertaOpciones {\r\n titulo?: string;\r\n mensaje?: string;\r\n tipo?: TdAlertaTipo;\r\n textoConfirmar?: string;\r\n textoCancelar?: string;\r\n mostrarCancelar?: boolean;\r\n cerrarConEscape?: boolean;\r\n cerrarConFondo?: boolean;\r\n}\r\n\r\nexport class TdAlerta {\r\n private static readonly estiloId = 'td-alerta-estilos';\r\n\r\n static exito(mensaje: string, titulo = '¡Operación exitosa!'): Promise<boolean> {\r\n return this.mostrar({\r\n titulo,\r\n mensaje,\r\n tipo: 'exito',\r\n textoConfirmar: 'Aceptar',\r\n });\r\n }\r\n\r\n static error(mensaje: string, titulo = '¡Error!'): Promise<boolean> {\r\n return this.mostrar({\r\n titulo,\r\n mensaje,\r\n tipo: 'error',\r\n textoConfirmar: 'Cerrar',\r\n });\r\n }\r\n\r\n static errorSistema(mensaje: string, titulo = '¡Error de Sistema!'): Promise<boolean> {\r\n return this.mostrar({\r\n titulo,\r\n mensaje,\r\n tipo: 'error',\r\n textoConfirmar: 'Cerrar',\r\n });\r\n }\r\n\r\n static advertencia(mensaje: string, titulo = '¡Advertencia!'): Promise<boolean> {\r\n return this.mostrar({\r\n titulo,\r\n mensaje,\r\n tipo: 'advertencia',\r\n textoConfirmar: 'Aceptar',\r\n });\r\n }\r\n\r\n static info(mensaje: string, titulo = 'Información'): Promise<boolean> {\r\n return this.mostrar({\r\n titulo,\r\n mensaje,\r\n tipo: 'info',\r\n textoConfirmar: 'Aceptar',\r\n });\r\n }\r\n\r\n static confirmar(\r\n mensaje: string,\r\n titulo = '¿Estás seguro?',\r\n textoConfirmar = 'Sí, continuar',\r\n textoCancelar = 'Cancelar'\r\n ): Promise<boolean> {\r\n return this.mostrar({\r\n titulo,\r\n mensaje,\r\n tipo: 'pregunta',\r\n textoConfirmar,\r\n textoCancelar,\r\n mostrarCancelar: true,\r\n });\r\n }\r\n\r\n static confirmarEliminar(\r\n mensaje = 'Esta acción no se puede deshacer.',\r\n titulo = '¿Eliminar registro?'\r\n ): Promise<boolean> {\r\n return this.mostrar({\r\n titulo,\r\n mensaje,\r\n tipo: 'advertencia',\r\n textoConfirmar: 'Sí, eliminar',\r\n textoCancelar: 'Cancelar',\r\n mostrarCancelar: true,\r\n });\r\n }\r\n\r\n static mostrar(opciones: TdAlertaOpciones): Promise<boolean> {\r\n if (typeof document === 'undefined') {\r\n return Promise.resolve(false);\r\n }\r\n\r\n this.inyectarEstilos();\r\n\r\n const config: Required<TdAlertaOpciones> = {\r\n titulo: opciones.titulo ?? '',\r\n mensaje: opciones.mensaje ?? '',\r\n tipo: opciones.tipo ?? 'info',\r\n textoConfirmar: opciones.textoConfirmar ?? 'Aceptar',\r\n textoCancelar: opciones.textoCancelar ?? 'Cancelar',\r\n mostrarCancelar: opciones.mostrarCancelar ?? false,\r\n cerrarConEscape: opciones.cerrarConEscape ?? true,\r\n cerrarConFondo: opciones.cerrarConFondo ?? false,\r\n };\r\n\r\n return new Promise<boolean>((resolve) => {\r\n const fondo = document.createElement('div');\r\n fondo.className = 'td-alerta-fondo';\r\n\r\n const modal = document.createElement('div');\r\n modal.className = 'td-alerta-modal';\r\n modal.setAttribute('role', 'dialog');\r\n modal.setAttribute('aria-modal', 'true');\r\n\r\n const icono = document.createElement('div');\r\n icono.className = `td-alerta-icono td-alerta-icono--${config.tipo}`;\r\n icono.textContent = this.obtenerIcono(config.tipo);\r\n\r\n const titulo = document.createElement('h2');\r\n titulo.className = 'td-alerta-titulo';\r\n titulo.textContent = config.titulo;\r\n\r\n const mensaje = document.createElement('p');\r\n mensaje.className = 'td-alerta-mensaje';\r\n mensaje.textContent = config.mensaje;\r\n\r\n const acciones = document.createElement('div');\r\n acciones.className = 'td-alerta-acciones';\r\n\r\n const botonConfirmar = document.createElement('button');\r\n botonConfirmar.type = 'button';\r\n botonConfirmar.className = `td-alerta-boton td-alerta-boton--${config.tipo}`;\r\n botonConfirmar.textContent = config.textoConfirmar;\r\n\r\n const botonCancelar = document.createElement('button');\r\n botonCancelar.type = 'button';\r\n botonCancelar.className = 'td-alerta-boton td-alerta-boton--cancelar';\r\n botonCancelar.textContent = config.textoCancelar;\r\n\r\n const cerrar = (resultado: boolean): void => {\r\n document.removeEventListener('keydown', onKeyDown);\r\n fondo.classList.add('td-alerta-saliendo');\r\n\r\n window.setTimeout(() => {\r\n fondo.remove();\r\n resolve(resultado);\r\n }, 140);\r\n };\r\n\r\n const onKeyDown = (event: KeyboardEvent): void => {\r\n if (event.key === 'Escape' && config.cerrarConEscape) {\r\n cerrar(false);\r\n }\r\n };\r\n\r\n botonConfirmar.addEventListener('click', () => cerrar(true));\r\n botonCancelar.addEventListener('click', () => cerrar(false));\r\n\r\n if (config.cerrarConFondo) {\r\n fondo.addEventListener('click', (event) => {\r\n if (event.target === fondo) {\r\n cerrar(false);\r\n }\r\n });\r\n }\r\n\r\n document.addEventListener('keydown', onKeyDown);\r\n\r\n if (config.mostrarCancelar) {\r\n acciones.appendChild(botonCancelar);\r\n }\r\n\r\n acciones.appendChild(botonConfirmar);\r\n\r\n modal.appendChild(icono);\r\n modal.appendChild(titulo);\r\n\r\n if (config.mensaje) {\r\n modal.appendChild(mensaje);\r\n }\r\n\r\n modal.appendChild(acciones);\r\n fondo.appendChild(modal);\r\n document.body.appendChild(fondo);\r\n\r\n botonConfirmar.focus();\r\n });\r\n }\r\n\r\n private static obtenerIcono(tipo: TdAlertaTipo): string {\r\n const iconos: Record<TdAlertaTipo, string> = {\r\n exito: '✓',\r\n error: '!',\r\n advertencia: '!',\r\n info: 'i',\r\n pregunta: '?',\r\n };\r\n\r\n return iconos[tipo];\r\n }\r\n\r\n private static inyectarEstilos(): void {\r\n if (document.getElementById(this.estiloId)) return;\r\n\r\n const style = document.createElement('style');\r\n style.id = this.estiloId;\r\n style.textContent = `\r\n .td-alerta-fondo {\r\n position: fixed;\r\n inset: 0;\r\n z-index: 99999;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n padding: 1rem;\r\n background: rgba(15, 23, 42, 0.52);\r\n animation: td-alerta-fondo-entrada 160ms ease-out;\r\n }\r\n\r\n .td-alerta-modal {\r\n width: min(100%, 430px);\r\n border-radius: 18px;\r\n background: #ffffff;\r\n padding: 1.75rem;\r\n text-align: center;\r\n box-shadow: 0 22px 70px rgba(15, 23, 42, 0.28);\r\n animation: td-alerta-modal-entrada 180ms ease-out;\r\n font-family: system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\r\n }\r\n\r\n .td-alerta-icono {\r\n width: 4.25rem;\r\n height: 4.25rem;\r\n margin: 0 auto 1rem;\r\n border-radius: 999px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n font-size: 2.1rem;\r\n font-weight: 800;\r\n }\r\n\r\n .td-alerta-icono--exito {\r\n color: #16a34a;\r\n background: #dcfce7;\r\n }\r\n\r\n .td-alerta-icono--error {\r\n color: #ef4444;\r\n background: #fee2e2;\r\n }\r\n\r\n .td-alerta-icono--advertencia {\r\n color: #f59e0b;\r\n background: #fef3c7;\r\n }\r\n\r\n .td-alerta-icono--info {\r\n color: #2563eb;\r\n background: #dbeafe;\r\n }\r\n\r\n .td-alerta-icono--pregunta {\r\n color: #7c3aed;\r\n background: #ede9fe;\r\n }\r\n\r\n .td-alerta-titulo {\r\n margin: 0;\r\n color: #111827;\r\n font-size: 1.35rem;\r\n line-height: 1.25;\r\n font-weight: 800;\r\n }\r\n\r\n .td-alerta-mensaje {\r\n margin: 0.75rem 0 0;\r\n color: #4b5563;\r\n font-size: 0.96rem;\r\n line-height: 1.55;\r\n }\r\n\r\n .td-alerta-acciones {\r\n display: flex;\r\n justify-content: center;\r\n gap: 0.75rem;\r\n margin-top: 1.5rem;\r\n }\r\n\r\n .td-alerta-boton {\r\n border: 0;\r\n border-radius: 10px;\r\n padding: 0.7rem 1.2rem;\r\n color: #ffffff;\r\n font-size: 0.93rem;\r\n font-weight: 700;\r\n cursor: pointer;\r\n transition: transform 120ms ease, filter 120ms ease, background 120ms ease;\r\n }\r\n\r\n .td-alerta-boton:hover {\r\n filter: brightness(0.96);\r\n }\r\n\r\n .td-alerta-boton:active {\r\n transform: scale(0.98);\r\n }\r\n\r\n .td-alerta-boton:focus {\r\n outline: 3px solid rgba(37, 99, 235, 0.25);\r\n outline-offset: 2px;\r\n }\r\n\r\n .td-alerta-boton--exito {\r\n background: #22c55e;\r\n }\r\n\r\n .td-alerta-boton--error {\r\n background: #ef4444;\r\n }\r\n\r\n .td-alerta-boton--advertencia {\r\n background: #f59e0b;\r\n }\r\n\r\n .td-alerta-boton--info {\r\n background: #2563eb;\r\n }\r\n\r\n .td-alerta-boton--pregunta {\r\n background: #7c3aed;\r\n }\r\n\r\n .td-alerta-boton--cancelar {\r\n background: #6b7280;\r\n }\r\n\r\n .td-alerta-saliendo {\r\n animation: td-alerta-fondo-salida 140ms ease-in forwards;\r\n }\r\n\r\n .td-alerta-saliendo .td-alerta-modal {\r\n animation: td-alerta-modal-salida 140ms ease-in forwards;\r\n }\r\n\r\n @keyframes td-alerta-fondo-entrada {\r\n from { opacity: 0; }\r\n to { opacity: 1; }\r\n }\r\n\r\n @keyframes td-alerta-modal-entrada {\r\n from {\r\n opacity: 0;\r\n transform: translateY(12px) scale(0.96);\r\n }\r\n to {\r\n opacity: 1;\r\n transform: translateY(0) scale(1);\r\n }\r\n }\r\n\r\n @keyframes td-alerta-fondo-salida {\r\n from { opacity: 1; }\r\n to { opacity: 0; }\r\n }\r\n\r\n @keyframes td-alerta-modal-salida {\r\n from {\r\n opacity: 1;\r\n transform: translateY(0) scale(1);\r\n }\r\n to {\r\n opacity: 0;\r\n transform: translateY(8px) scale(0.97);\r\n }\r\n }\r\n\r\n @media (max-width: 480px) {\r\n .td-alerta-modal {\r\n padding: 1.4rem;\r\n border-radius: 16px;\r\n }\r\n\r\n .td-alerta-acciones {\r\n flex-direction: column-reverse;\r\n }\r\n\r\n .td-alerta-boton {\r\n width: 100%;\r\n }\r\n }\r\n `;\r\n\r\n document.head.appendChild(style);\r\n }\r\n}","import { TdIconoDefinicion } from './td-icono.model';\n\nexport const TD_ICONOS = {\n home: {\n path: 'M3 10.5 12 3l9 7.5V21a1 1 0 0 1-1 1h-5v-7H9v7H4a1 1 0 0 1-1-1V10.5Z',\n },\n dashboard: {\n path: 'M4 3h6a1 1 0 0 1 1 1v6a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1Zm10 0h6a1 1 0 0 1 1 1v3a1 1 0 0 1-1 1h-6a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1Zm0 8h6a1 1 0 0 1 1 1v8a1 1 0 0 1-1 1h-6a1 1 0 0 1-1-1v-8a1 1 0 0 1 1-1ZM4 14h6a1 1 0 0 1 1 1v5a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1v-5a1 1 0 0 1 1-1Z',\n },\n folder: {\n path: 'M3 5a2 2 0 0 1 2-2h5l2 2h7a2 2 0 0 1 2 2v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5Z',\n },\n settings: {\n path: 'M12 8.5a3.5 3.5 0 1 0 0 7 3.5 3.5 0 0 0 0-7Zm8.5 3.5c0-.5-.05-.98-.14-1.45l2.02-1.57-2-3.46-2.47 1a8.7 8.7 0 0 0-2.5-1.45L15 2.5h-4l-.4 2.57a8.7 8.7 0 0 0-2.51 1.45l-2.47-1-2 3.46 2.02 1.57a7.7 7.7 0 0 0 0 2.9l-2.02 1.57 2 3.46 2.47-1a8.7 8.7 0 0 0 2.5 1.45L11 21.5h4l.4-2.57a8.7 8.7 0 0 0 2.51-1.45l2.47 1 2-3.46-2.02-1.57c.09-.47.14-.95.14-1.45Z',\n },\n people: {\n path: 'M16 11a4 4 0 1 0 0-8 4 4 0 0 0 0 8ZM6.5 12a3.5 3.5 0 1 0 0-7 3.5 3.5 0 0 0 0 7ZM16 13c-4 0-7 2-7 4.5V21h14v-3.5C23 15 20 13 16 13ZM6.5 14C2.9 14 1 15.8 1 18v3h6v-3.5c0-1.2.48-2.28 1.3-3.16A9.3 9.3 0 0 0 6.5 14Z',\n },\n person: {\n path: 'M12 12a5 5 0 1 0 0-10 5 5 0 0 0 0 10Zm0 2c-5 0-9 2.5-9 5.5V22h18v-2.5c0-3-4-5.5-9-5.5Z',\n },\n security: {\n path: 'M12 2 4 5v6c0 5.05 3.41 9.74 8 11 4.59-1.26 8-5.95 8-11V5l-8-3Zm-1 14-4-4 1.4-1.4 2.6 2.58 5.6-5.58L18 9l-7 7Z',\n },\n inventory: {\n path: 'm12 2 9 5-9 5-9-5 9-5Zm-7 8.5 6 3.33V22l-6-3.33V10.5Zm8 11.5v-8.17l6-3.33v8.17L13 22Z',\n },\n shopping_cart: {\n path: 'M7 18a2 2 0 1 0 0 4 2 2 0 0 0 0-4Zm10 0a2 2 0 1 0 0 4 2 2 0 0 0 0-4ZM6.2 6l.8 2h11.6l-1.9 5H8.1L4.3 3H1v2h2l3.6 9.6A2 2 0 0 0 8.5 16H19v-2H8.5l-.4-1H18a2 2 0 0 0 1.86-1.27L22 6H6.2Z',\n },\n receipt: {\n path: 'M5 2v20l3-2 4 2 4-2 3 2V2l-3 2-4-2-4 2-3-2Zm3 6h8v2H8V8Zm0 4h8v2H8v-2Z',\n },\n assessment: {\n path: 'M4 20h16v2H4a2 2 0 0 1-2-2V4h2v16Zm3-2H5v-6h2v6Zm4 0H9V7h2v11Zm4 0h-2V4h2v14Zm4 0h-2v-9h2v9Z',\n },\n description: {\n path: 'M6 2h8l5 5v15H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2Zm7 1.5V8h4.5L13 3.5ZM8 12v2h8v-2H8Zm0 4v2h8v-2H8Z',\n },\n business: {\n path: 'M3 21V3h10v5h8v13h-7v-4h-2v4H3Zm3-14h2V5H6v2Zm4 0h2V5h-2v2Zm-4 4h2V9H6v2Zm4 0h2V9h-2v2Zm6 1h2v-2h-2v2Zm0 4h2v-2h-2v2Z',\n },\n chevron_left: {\n path: 'M14.7 5.3a1 1 0 0 1 0 1.4L9.4 12l5.3 5.3a1 1 0 1 1-1.4 1.4l-6-6a1 1 0 0 1 0-1.4l6-6a1 1 0 0 1 1.4 0Z',\n },\n chevron_right: {\n path: 'M9.3 5.3a1 1 0 0 0 0 1.4l5.3 5.3-5.3 5.3a1 1 0 1 0 1.4 1.4l6-6a1 1 0 0 0 0-1.4l-6-6a1 1 0 0 0-1.4 0Z',\n },\n sun: {\n path: 'M12 7a5 5 0 1 0 0 10 5 5 0 0 0 0-10Zm0-5a1 1 0 0 1 1 1v2a1 1 0 1 1-2 0V3a1 1 0 0 1 1-1Zm0 17a1 1 0 0 1 1 1v2a1 1 0 1 1-2 0v-2a1 1 0 0 1 1-1ZM2 12a1 1 0 0 1 1-1h2a1 1 0 1 1 0 2H3a1 1 0 0 1-1-1Zm17 0a1 1 0 0 1 1-1h2a1 1 0 1 1 0 2h-2a1 1 0 0 1-1-1ZM4.22 4.22a1 1 0 0 1 1.42 0l1.41 1.42a1 1 0 0 1-1.41 1.41L4.22 5.64a1 1 0 0 1 0-1.42Zm12.73 12.73a1 1 0 0 1 1.41 0l1.42 1.41a1 1 0 0 1-1.42 1.42l-1.41-1.42a1 1 0 0 1 0-1.41Zm2.83-12.73a1 1 0 0 1 0 1.42l-1.42 1.41a1 1 0 0 1-1.41-1.41l1.41-1.42a1 1 0 0 1 1.42 0ZM7.05 16.95a1 1 0 0 1 0 1.41l-1.41 1.42a1 1 0 0 1-1.42-1.42l1.42-1.41a1 1 0 0 1 1.41 0Z',\n },\n moon: {\n path: 'M20.5 15.2A8.5 8.5 0 0 1 8.8 3.5 9 9 0 1 0 20.5 15.2Z',\n },\n alert: {\n path: 'M12 2 1 21h22L12 2Zm-1 7h2v6h-2V9Zm0 8h2v2h-2v-2Z',\n },\n check: {\n path: 'm9.2 16.2-4.4-4.4-1.6 1.6 6 6L21 7.6 19.4 6 9.2 16.2Z',\n },\n close: {\n path: 'M6.4 5 12 10.6 17.6 5 19 6.4 13.4 12l5.6 5.6-1.4 1.4-5.6-5.6L6.4 19 5 17.6l5.6-5.6L5 6.4 6.4 5Z',\n },\n menu: {\n path: 'M3 6h18v2H3V6Zm0 5h18v2H3v-2Zm0 5h18v2H3v-2Z',\n },\n search: {\n path: 'M10.5 3a7.5 7.5 0 1 0 4.73 13.32L20.91 22 22 20.91l-5.68-5.68A7.5 7.5 0 0 0 10.5 3Zm0 2a5.5 5.5 0 1 1 0 11 5.5 5.5 0 0 1 0-11Z',\n },\n notifications: {\n path: 'M12 22a2.5 2.5 0 0 0 2.45-2h-4.9A2.5 2.5 0 0 0 12 22Zm7-6v-5a7 7 0 0 0-5.5-6.84V3a1.5 1.5 0 0 0-3 0v1.16A7 7 0 0 0 5 11v5l-2 2v1h18v-1l-2-2Z',\n },\n chevron_down: {\n path: 'M5.3 8.3a1 1 0 0 1 1.4 0l5.3 5.3 5.3-5.3a1 1 0 1 1 1.4 1.4l-6 6a1 1 0 0 1-1.4 0l-6-6a1 1 0 0 1 0-1.4Z',\n },\n apps: {\n path: 'M4 3h4a1 1 0 0 1 1 1v4a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1Zm12 0h4a1 1 0 0 1 1 1v4a1 1 0 0 1-1 1h-4a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1ZM4 15h4a1 1 0 0 1 1 1v4a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1v-4a1 1 0 0 1 1-1Zm12 0h4a1 1 0 0 1 1 1v4a1 1 0 0 1-1 1h-4a1 1 0 0 1-1-1v-4a1 1 0 0 1 1-1Z',\n },\n help: {\n path: 'M12 2a10 10 0 1 0 0 20 10 10 0 0 0 0-20Zm0 18a8 8 0 1 1 0-16 8 8 0 0 1 0 16Zm0-4.5a1.25 1.25 0 1 0 0 2.5 1.25 1.25 0 0 0 0-2.5Zm.2-9.5c-2 0-3.37 1.03-3.7 2.75l1.95.4c.17-.84.77-1.3 1.67-1.3 1 0 1.63.52 1.63 1.35 0 .67-.33 1.03-1.27 1.58-1.12.65-1.48 1.27-1.48 2.47V14h2v-.55c0-.67.2-.94 1.12-1.5 1.18-.72 1.88-1.58 1.88-2.9C16 7.25 14.5 6 12.2 6Z',\n },\n add: {\n path: 'M11 5h2v6h6v2h-6v6h-2v-6H5v-2h6V5Z',\n },\n edit: {\n path: 'm16.86 3.49 3.65 3.65L8.65 19H5v-3.65L16.86 3.49ZM19.73 2.27a1.75 1.75 0 0 0-2.47 0l-1.35 1.35 3.65 3.65 1.35-1.35a1.75 1.75 0 0 0 0-2.47l-1.18-1.18Z',\n },\n delete: {\n path: 'M8 3h8l1 2h4v2H3V5h4l1-2Zm-2 6h12l-1 12H7L6 9Zm4 2v7h2v-7h-2Zm4 0v7h2v-7h-2Z',\n },\n toggle_on: {\n path: 'M17 6H7a6 6 0 0 0 0 12h10a6 6 0 0 0 0-12Zm0 10a4 4 0 1 1 0-8 4 4 0 0 1 0 8Z',\n },\n toggle_off: {\n path: 'M17 6H7a6 6 0 0 0 0 12h10a6 6 0 0 0 0-12ZM7 16a4 4 0 1 1 0-8 4 4 0 0 1 0 8Z',\n },\n inbox: {\n path: 'M4 3h16l3 11v7H1v-7L4 3Zm1.5 2L3 14h5l1 2h6l1-2h5l-2.5-9h-13Z',\n },\n pdf: {\n path: 'M6 2h9l5 5v15H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2Zm8 1.5V8h4.5L14 3.5ZM8 12v7h2v-2h1.2a2.5 2.5 0 0 0 0-5H8Zm2 2h1.2a.5.5 0 0 1 0 1H10v-1Zm4-2v7h2v-2h1v-2h-1v-1h2v-2h-4Z',\n },\n} satisfies Record<string, TdIconoDefinicion>;\n\nexport type TdIconoNombre = keyof typeof TD_ICONOS;\n\nexport const TD_ICONOS_NOMBRES = Object.freeze(\n Object.keys(TD_ICONOS) as TdIconoNombre[]\n);\n","import { Injectable } from '@angular/core';\nimport { TdIconoDefinicion, TdIconoPersonalizado } from './td-icono.model';\nimport { TD_ICONOS } from './td-iconos';\n\n@Injectable({ providedIn: 'root' })\nexport class TdIconoRegistry {\n private readonly iconos = new Map<string, TdIconoDefinicion>(\n Object.entries(TD_ICONOS)\n );\n\n registrar(iconos: TdIconoPersonalizado): void {\n for (const [nombre, definicion] of Object.entries(iconos)) {\n const clave = this.normalizar(nombre);\n if (!clave) continue;\n\n this.iconos.set(\n clave,\n typeof definicion === 'string' ? { path: definicion } : definicion\n );\n }\n }\n\n obtener(nombre: string | null | undefined): TdIconoDefinicion {\n return this.iconos.get(this.normalizar(nombre)) ?? this.iconos.get('folder')!;\n }\n\n existe(nombre: string): boolean {\n return this.iconos.has(this.normalizar(nombre));\n }\n\n nombres(): string[] {\n return [...this.iconos.keys()];\n }\n\n private normalizar(nombre: string | null | undefined): string {\n return (nombre ?? '').trim().toLowerCase();\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n HostBinding,\n Input,\n inject,\n} from '@angular/core';\nimport { TdIconoRegistry } from './td-icono-registry';\n\n@Component({\n selector: 'td-icon',\n template: `\n <svg\n [attr.viewBox]=\"definicion().viewBox || '0 0 24 24'\"\n [attr.aria-hidden]=\"titulo ? null : 'true'\"\n [attr.aria-label]=\"titulo || null\"\n [attr.role]=\"titulo ? 'img' : null\"\n focusable=\"false\"\n >\n <path [attr.d]=\"definicion().path\" />\n </svg>\n `,\n styles: `\n :host {\n display: inline-flex;\n width: var(--td-icon-size, 1.25rem);\n height: var(--td-icon-size, 1.25rem);\n flex: 0 0 auto;\n color: inherit;\n line-height: 0;\n vertical-align: middle;\n }\n svg { width: 100%; height: 100%; fill: currentColor; }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TdIcon {\n private readonly registry = inject(TdIconoRegistry);\n\n @Input() nombre = 'folder';\n @Input() titulo = '';\n\n @Input()\n set tamano(value: string | number) {\n this.tamanoCss = typeof value === 'number' ? `${value}px` : value;\n }\n\n protected tamanoCss = '1.25rem';\n\n @HostBinding('style.--td-icon-size')\n protected get tamanoHost(): string {\n return this.tamanoCss;\n }\n\n protected definicion() {\n return this.registry.obtener(this.nombre);\n }\n}\n","import { CdkVirtualScrollViewport, ScrollingModule } from '@angular/cdk/scrolling';\nimport {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n OnChanges,\n OnDestroy,\n Output,\n SimpleChanges,\n ViewChild,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { TdIcon } from '../iconos';\nimport {\n TdDataTableAccion,\n TdDataTableAccionEvento,\n TdDataTableBoton,\n TdDataTableColumna,\n TdDataTableTono,\n} from './td-data-table.model';\n\n@Component({\n selector: 'td-data-table',\n imports: [FormsModule, ScrollingModule, TdIcon],\n templateUrl: './td-data-table.html',\n styleUrl: './td-data-table.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TdDataTable<T extends object> implements OnChanges, OnDestroy {\n @ViewChild(CdkVirtualScrollViewport)\n private viewport?: CdkVirtualScrollViewport;\n\n @Input() datos: T[] = [];\n @Input() columnas: TdDataTableColumna<T>[] = [];\n @Input() acciones: TdDataTableAccion<T>[] = [];\n @Input() botones: TdDataTableBoton[] = [];\n @Input() total = 0;\n @Input() cargando = false;\n @Input() puedeCargarMas = false;\n @Input() itemSize = 65;\n @Input() filasAntesDeCargar = 2;\n @Input() altura = 'min(620px, calc(100dvh - 18rem))';\n @Input() campoId: keyof T & string = 'id' as keyof T & string;\n @Input() oscuro = false;\n @Input() mostrarBusqueda = true;\n @Input() placeholderBusqueda = 'Buscar...';\n @Input() textoVacio = 'No hay registros disponibles';\n @Input() descripcionVacio = 'Prueba cambiando los filtros o vuelve más tarde.';\n @Input() debounceBusqueda = 250;\n\n @Output() readonly busquedaChange = new EventEmitter<string>();\n @Output() readonly accion = new EventEmitter<TdDataTableAccionEvento<T>>();\n @Output() readonly botonClick = new EventEmitter<TdDataTableBoton>();\n @Output() readonly cargarMas = new EventEmitter<void>();\n\n protected busqueda = '';\n private timeoutBusqueda: ReturnType<typeof setTimeout> | null = null;\n private ultimaLongitudSolicitada = -1;\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['datos'] && this.datos.length !== this.ultimaLongitudSolicitada) {\n this.ultimaLongitudSolicitada = -1;\n }\n }\n\n ngOnDestroy(): void {\n if (this.timeoutBusqueda) clearTimeout(this.timeoutBusqueda);\n }\n\n protected columnasGrid(): string {\n const columnas = this.columnas.map((columna) => columna.ancho ?? 'minmax(10rem, 1fr)');\n if (this.acciones.length) columnas.push('minmax(9rem, auto)');\n return columnas.join(' ');\n }\n\n protected buscar(): void {\n if (this.timeoutBusqueda) clearTimeout(this.timeoutBusqueda);\n this.timeoutBusqueda = setTimeout(\n () => this.busquedaChange.emit(this.busqueda.trim()),\n this.debounceBusqueda\n );\n }\n\n protected limpiarBusqueda(): void {\n if (this.timeoutBusqueda) clearTimeout(this.timeoutBusqueda);\n this.busqueda = '';\n this.busquedaChange.emit('');\n }\n\n protected valor(fila: T, clave: keyof T & string): unknown {\n return (fila as Record<string, unknown>)[clave];\n }\n\n protected textoCelda(columna: TdDataTableColumna<T>, fila: T, indice: number): string {\n const valor = this.valor(fila, columna.clave);\n if (columna.formatear) return columna.formatear(valor, fila, indice);\n if (valor === null || valor === undefined || valor === '') return '—';\n if (columna.tipo === 'booleano') return valor ? 'Sí' : 'No';\n if (columna.tipo === 'estado') return valor ? 'Activo' : 'Inactivo';\n return String(valor);\n }\n\n protected tonoCelda(columna: TdDataTableColumna<T>, fila: T): TdDataTableTono {\n const valor = this.valor(fila, columna.clave);\n if (columna.tono) return columna.tono(valor, fila);\n if (columna.tipo === 'estado') return valor ? 'exito' : 'peligro';\n if (columna.tipo === 'booleano') return valor ? 'exito' : 'neutro';\n return 'neutro';\n }\n\n protected accionesVisibles(fila: T): TdDataTableAccion<T>[] {\n return this.acciones.filter((accion) => accion.visible?.(fila) ?? true);\n }\n\n protected iconoAccion(accion: TdDataTableAccion<T>, fila: T): string {\n return typeof accion.icono === 'function' ? accion.icono(fila) : accion.icono;\n }\n\n protected tonoAccion(accion: TdDataTableAccion<T>, fila: T): TdDataTableTono {\n if (typeof accion.tono === 'function') return accion.tono(fila);\n return accion.tono ?? 'neutro';\n }\n\n protected botonesVisibles(): TdDataTableBoton[] {\n return this.botones.filter((boton) => boton.visible ?? true);\n }\n\n protected ejecutarAccion(\n accion: TdDataTableAccion<T>,\n fila: T,\n indice: number\n ): void {\n if (accion.deshabilitada?.(fila)) return;\n this.accion.emit({ accion, fila, indice });\n }\n\n protected alCambiarIndice(): void {\n if (!this.viewport) return;\n\n const distanciaAlFinal = this.viewport.measureScrollOffset('bottom');\n const umbralPx = this.itemSize * Math.max(0, this.filasAntesDeCargar);\n\n if (\n distanciaAlFinal <= umbralPx &&\n this.datos.length > 0 &&\n this.puedeCargarMas &&\n !this.cargando &&\n this.ultimaLongitudSolicitada !== this.datos.length\n ) {\n this.ultimaLongitudSolicitada = this.datos.length;\n this.cargarMas.emit();\n }\n }\n\n protected readonly trackFila = (_indice: number, fila: T): unknown =>\n (fila as Record<string, unknown>)[this.campoId] ?? fila;\n}\n","<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úsqueda\" (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 @if (cargando) {\n <span class=\"td-tabla__cargando-inline\"><i></i> Cargando...</span>\n }\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\n class=\"td-tabla__encabezado\"\n role=\"row\"\n [style.grid-template-columns]=\"columnasGrid()\"\n >\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 <cdk-virtual-scroll-viewport\n class=\"td-tabla__viewport\"\n [itemSize]=\"itemSize\"\n [style.height]=\"altura\"\n (scrolledIndexChange)=\"alCambiarIndice()\"\n >\n <div\n *cdkVirtualFor=\"let fila of datos; let indice = index; trackBy: trackFila\"\n class=\"td-tabla__fila\"\n role=\"row\"\n [style.height.px]=\"itemSize\"\n [style.grid-template-columns]=\"columnasGrid()\"\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 (\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 [class.td-tabla__numero]=\"columna.tipo === 'numero'\">\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 @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 </div>\n }\n </div>\n </cdk-virtual-scroll-viewport>\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","import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\n\n@Component({\n selector: 'td-footer',\n templateUrl: './td-footer.html',\n styleUrl: './td-footer.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TdFooter {\n @Input() empresa = 'TelcomDev';\n @Input() texto = 'Todos los derechos reservados.';\n @Input() version = '';\n @Input() oscuro = false;\n @Input() compacto = false;\n @Input() anio = new Date().getFullYear();\n}\n","<footer\n class=\"td-footer\"\n [class.td-footer--oscuro]=\"oscuro\"\n [class.td-footer--compacto]=\"compacto\"\n>\n <div class=\"td-footer__identidad\">\n <span>© {{ anio }} {{ empresa }}</span>\n @if (texto) {\n <small>{{ texto }}</small>\n }\n </div>\n\n <nav class=\"td-footer__enlaces\" aria-label=\"Enlaces del pie de página\">\n <ng-content select=\"[tdFooterLinks]\" />\n </nav>\n\n <div class=\"td-footer__final\">\n <ng-content select=\"[tdFooterActions]\" />\n @if (version) {\n <span class=\"td-footer__version\">v{{ version }}</span>\n }\n </div>\n</footer>\n","import {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n HostListener,\n Input,\n Output,\n} from '@angular/core';\nimport { TdIcon } from '../iconos';\n\nexport interface TdHeaderNotificacion {\n id: string | number;\n titulo: string;\n descripcion?: string;\n fecha?: string;\n icono?: string;\n leida?: boolean;\n}\n\nexport type TdHeaderAccionPerfil = 'perfil' | 'configuracion' | 'salir';\n\n@Component({\n selector: 'td-header',\n imports: [TdIcon],\n templateUrl: './td-header.html',\n styleUrl: './td-header.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TdHeader {\n @Input() menuAbierto = true;\n @Input() mostrarMenu = true;\n @Input() usuario = '';\n @Input() cargo = '';\n @Input() avatarUrl = '';\n @Input() notificaciones: TdHeaderNotificacion[] = [];\n @Input() oscuro = false;\n @Input() fijo = true;\n\n @Output() readonly menuToggle = new EventEmitter<void>();\n @Output() readonly notificacionSeleccionada = new EventEmitter<TdHeaderNotificacion>();\n @Output() readonly verTodasNotificaciones = new EventEmitter<void>();\n @Output() readonly accionPerfil = new EventEmitter<TdHeaderAccionPerfil>();\n\n protected panelNotificacionesAbierto = false;\n protected panelPerfilAbierto = false;\n\n protected alternarMenu(): void {\n this.menuToggle.emit();\n }\n\n protected alternarNotificaciones(): void {\n this.panelNotificacionesAbierto = !this.panelNotificacionesAbierto;\n this.panelPerfilAbierto = false;\n }\n\n protected alternarPerfil(): void {\n this.panelPerfilAbierto = !this.panelPerfilAbierto;\n this.panelNotificacionesAbierto = false;\n }\n\n protected seleccionarNotificacion(notificacion: TdHeaderNotificacion): void {\n this.notificacionSeleccionada.emit(notificacion);\n this.panelNotificacionesAbierto = false;\n }\n\n protected emitirAccionPerfil(accion: TdHeaderAccionPerfil): void {\n this.accionPerfil.emit(accion);\n this.panelPerfilAbierto = false;\n }\n\n protected notificacionesNoLeidas(): number {\n return this.notificaciones.filter((item) => !item.leida).length;\n }\n\n protected inicialesUsuario(): string {\n const partes = this.usuario.trim().split(/\\s+/).filter(Boolean);\n return (\n partes\n .slice(0, 2)\n .map((parte) => parte.charAt(0))\n .join('') || 'U'\n ).toUpperCase();\n }\n\n @HostListener('document:keydown.escape')\n protected cerrarConEscape(): void {\n this.panelNotificacionesAbierto = false;\n this.panelPerfilAbierto = false;\n }\n}\n","<header\n class=\"td-header\"\n [class.td-header--oscuro]=\"oscuro\"\n [class.td-header--fijo]=\"fijo\"\n>\n <div class=\"td-header__inicio\">\n @if (mostrarMenu) {\n <button\n class=\"td-header__boton td-header__menu\"\n type=\"button\"\n [attr.aria-label]=\"menuAbierto ? 'Cerrar sidebar' : 'Abrir sidebar'\"\n [attr.aria-expanded]=\"menuAbierto\"\n (click)=\"alternarMenu()\"\n >\n <td-icon [nombre]=\"menuAbierto ? 'close' : 'menu'\" />\n </button>\n }\n\n <ng-content select=\"[tdHeaderStart]\" />\n </div>\n\n <div class=\"td-header__centro\">\n <ng-content select=\"[tdHeaderCenter]\" />\n </div>\n\n <div class=\"td-header__acciones\">\n <ng-content select=\"[tdHeaderActions]\" />\n\n <div class=\"td-header__desplegable\">\n <button\n class=\"td-header__boton td-header__notificaciones\"\n type=\"button\"\n aria-label=\"Notificaciones\"\n [attr.aria-expanded]=\"panelNotificacionesAbierto\"\n (click)=\"alternarNotificaciones()\"\n >\n <td-icon nombre=\"notifications\" />\n @if (notificacionesNoLeidas() > 0) {\n <span>{{ notificacionesNoLeidas() > 99 ? '99+' : notificacionesNoLeidas() }}</span>\n }\n </button>\n\n @if (panelNotificacionesAbierto) {\n <section class=\"td-header__panel td-header__panel--notificaciones\">\n <header>\n <div>\n <strong>Notificaciones</strong>\n <small>{{ notificacionesNoLeidas() }} sin leer</small>\n </div>\n <td-icon nombre=\"notifications\" />\n </header>\n\n <div class=\"td-header__lista-notificaciones\">\n @for (notificacion of notificaciones; track notificacion.id) {\n <button\n type=\"button\"\n [class.td-header__notificacion--nueva]=\"!notificacion.leida\"\n (click)=\"seleccionarNotificacion(notificacion)\"\n >\n <span class=\"td-header__notificacion-icono\">\n <td-icon [nombre]=\"notificacion.icono || 'notifications'\" />\n </span>\n <span>\n <strong>{{ notificacion.titulo }}</strong>\n @if (notificacion.descripcion) {\n <small>{{ notificacion.descripcion }}</small>\n }\n @if (notificacion.fecha) {\n <time>{{ notificacion.fecha }}</time>\n }\n </span>\n </button>\n } @empty {\n <p class=\"td-header__vacio\">No tienes notificaciones.</p>\n }\n </div>\n\n @if (notificaciones.length) {\n <button\n class=\"td-header__ver-todas\"\n type=\"button\"\n (click)=\"verTodasNotificaciones.emit(); panelNotificacionesAbierto = false\"\n >\n Ver todas las notificaciones\n </button>\n }\n </section>\n }\n </div>\n\n @if (usuario) {\n <span class=\"td-header__separador\" aria-hidden=\"true\"></span>\n\n <div class=\"td-header__desplegable\">\n <button\n class=\"td-header__perfil\"\n type=\"button\"\n aria-label=\"Abrir perfil de usuario\"\n [attr.aria-expanded]=\"panelPerfilAbierto\"\n (click)=\"alternarPerfil()\"\n >\n <span class=\"td-header__avatar\">\n @if (avatarUrl) {\n <img [src]=\"avatarUrl\" [alt]=\"usuario\" />\n } @else {\n {{ inicialesUsuario() }}\n }\n </span>\n <span class=\"td-header__usuario\">\n <strong>{{ usuario }}</strong>\n @if (cargo) {\n <small>{{ cargo }}</small>\n }\n </span>\n <td-icon nombre=\"chevron_down\" tamano=\"0.85rem\" />\n </button>\n\n @if (panelPerfilAbierto) {\n <section class=\"td-header__panel td-header__panel--perfil\">\n <div class=\"td-header__perfil-resumen\">\n <span class=\"td-header__avatar td-header__avatar--grande\">{{ inicialesUsuario() }}</span>\n <div>\n <strong>{{ usuario }}</strong>\n <small>{{ cargo || 'Usuario' }}</small>\n </div>\n </div>\n <div class=\"td-header__perfil-opciones\">\n <button type=\"button\" (click)=\"emitirAccionPerfil('perfil')\">\n <td-icon nombre=\"person\" /> Mi perfil\n </button>\n <button type=\"button\" (click)=\"emitirAccionPerfil('configuracion')\">\n <td-icon nombre=\"settings\" /> Configuración\n </button>\n <button class=\"td-header__salir\" type=\"button\" (click)=\"emitirAccionPerfil('salir')\">\n <td-icon nombre=\"close\" /> Cerrar sesión\n </button>\n </div>\n </section>\n }\n </div>\n }\n </div>\n</header>\n","import {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n Output,\n signal,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { RouterLink, RouterLinkActive } from '@angular/router';\nimport { TdIcon } from '../iconos';\nimport { MenuSidebar, TdSidebarSeleccion } from './menu-sidebar';\n\nexport type TdSidebarModoCerrado = 'compacto' | 'oculto';\n\n@Component({\n selector: 'td-sidebar',\n imports: [NgTemplateOutlet, RouterLink, RouterLinkActive, TdIcon],\n templateUrl: './td-sidebar.html',\n styleUrl: './td-sidebar.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TdSidebar {\n @Input() titulo = 'Gestión Corporativa';\n @Input() subtitulo = 'Central Platform';\n @Input() etiquetaNavegacion = 'Navegación';\n @Input() logoUrl = '';\n @Input() logoAlt = 'Logo';\n @Input() textoCarga = 'Cargando menú...';\n @Input() mensajeVacio = 'No hay opciones disponibles.';\n @Input() error = '';\n @Input() cargando = false;\n @Input() oscuro = false;\n @Input() modoCerrado: TdSidebarModoCerrado = 'compacto';\n\n @Input()\n set abierto(value: boolean) {\n this.abiertoInterno.set(value);\n }\n get abierto(): boolean {\n return this.abiertoInterno();\n }\n\n @Input()\n set menu(value: MenuSidebar[] | null | undefined) {\n this.menuNormalizado.set(this.normalizarMenu(value ?? []));\n }\n get menu(): MenuSidebar[] {\n return this.menuNormalizado();\n }\n\n @Output() readonly abiertoChange = new EventEmitter<boolean>();\n @Output() readonly seleccionar = new EventEmitter<TdSidebarSeleccion>();\n\n protected readonly abiertoInterno = signal(true);\n protected readonly menuNormalizado = signal<MenuSidebar[]>([]);\n protected readonly expandidos = signal<ReadonlySet<string>>(new Set<string>());\n\n protected alternarGrupo(clave: string): void {\n if (!this.abiertoInterno()) {\n this.abiertoInterno.set(true);\n this.abiertoChange.emit(true);\n }\n\n this.expandidos.update((actuales) => {\n const siguientes = new Set(actuales);\n siguientes.has(clave) ? siguientes.delete(clave) : siguientes.add(clave);\n return siguientes;\n });\n }\n\n protected estaExpandido(clave: string): boolean {\n return this.expandidos().has(clave);\n }\n\n protected seleccionarItem(item: MenuSidebar, nivel: number): void {\n this.seleccionar.emit({ item, nivel });\n }\n\n protected claveItem(item: MenuSidebar, padre: string, indice: number): string {\n return `${padre}/${item.nombre}-${indice}`;\n }\n\n protected inicialMarca(): string {\n return (this.titulo.trim().charAt(0) || 'T').toUpperCase();\n }\n\n private normalizarMenu(items: MenuSidebar[]): MenuSidebar[] {\n return [...items]\n .sort((a, b) => a.orden - b.orden)\n .map((item) => ({\n ...item,\n icono: item.icono?.trim() || 'folder',\n subMenus: this.normalizarMenu(item.subMenus ?? []),\n }));\n }\n}\n","<aside\n class=\"td-sidebar\"\n [class.td-sidebar--compacto]=\"!abiertoInterno() && modoCerrado === 'compacto'\"\n [class.td-sidebar--oculto]=\"!abiertoInterno() && modoCerrado === 'oculto'\"\n [class.td-sidebar--oscuro]=\"oscuro\"\n [attr.aria-hidden]=\"!abiertoInterno() && modoCerrado === 'oculto'\"\n>\n <header class=\"td-sidebar__marca\">\n <div class=\"td-sidebar__logo\">\n @if (logoUrl) {\n <img [src]=\"logoUrl\" [alt]=\"logoAlt\" />\n } @else {\n <span>{{ inicialMarca() }}</span>\n }\n </div>\n\n @if (abiertoInterno()) {\n <div class=\"td-sidebar__marca-texto\">\n <small>{{ subtitulo }}</small>\n <strong>{{ titulo }}</strong>\n </div>\n }\n\n </header>\n\n <div class=\"td-sidebar__encabezado\">\n @if (abiertoInterno()) {\n <span>{{ etiquetaNavegacion }}</span>\n } @else {\n <span aria-hidden=\"true\">•••</span>\n }\n </div>\n\n <nav class=\"td-sidebar__nav\" aria-label=\"Menú principal\">\n @if (cargando) {\n <p class=\"td-sidebar__estado\">{{ textoCarga }}</p>\n } @else if (error) {\n <p class=\"td-sidebar__estado td-sidebar__estado--error\">{{ error }}</p>\n } @else if (!menuNormalizado().length) {\n <p class=\"td-sidebar__estado\">{{ mensajeVacio }}</p>\n } @else {\n <ng-container\n [ngTemplateOutlet]=\"listaMenu\"\n [ngTemplateOutletContext]=\"{ items: menuNormalizado(), nivel: 0, padre: 'raiz' }\"\n />\n }\n </nav>\n</aside>\n\n<ng-template #listaMenu let-items=\"items\" let-nivel=\"nivel\" let-padre=\"padre\">\n <ul class=\"td-sidebar__lista\" [class.td-sidebar__lista--anidada]=\"nivel > 0\">\n @for (item of items; track item) {\n @let clave = claveItem(item, padre, $index);\n @let tieneHijos = item.subMenus.length > 0;\n\n <li class=\"td-sidebar__item\">\n @if (tieneHijos) {\n <button\n class=\"td-sidebar__enlace\"\n type=\"button\"\n [class.td-sidebar__enlace--activo]=\"estaExpandido(clave)\"\n [attr.aria-expanded]=\"estaExpandido(clave)\"\n [attr.title]=\"!abiertoInterno() ? item.nombre : null\"\n (click)=\"alternarGrupo(clave)\"\n >\n <td-icon class=\"td-sidebar__icono\" [nombre]=\"item.icono || 'folder'\" />\n @if (abiertoInterno()) {\n <span>{{ item.nombre }}</span>\n <td-icon\n class=\"td-sidebar__flecha\"\n [class.td-sidebar__flecha--abierta]=\"estaExpandido(clave)\"\n nombre=\"chevron_right\"\n />\n }\n </button>\n } @else {\n <a\n class=\"td-sidebar__enlace\"\n [routerLink]=\"item.ruta || '/'\"\n routerLinkActive=\"td-sidebar__enlace--ruta-activa\"\n [routerLinkActiveOptions]=\"{ exact: item.ruta === '/' }\"\n [attr.title]=\"!abiertoInterno() ? item.nombre : null\"\n (click)=\"seleccionarItem(item, nivel)\"\n >\n <td-icon class=\"td-sidebar__icono\" [nombre]=\"item.icono || 'folder'\" />\n @if (abiertoInterno()) {\n <span>{{ item.nombre }}</span>\n }\n </a>\n }\n\n @if (abiertoInterno() && tieneHijos && estaExpandido(clave)) {\n <ng-container\n [ngTemplateOutlet]=\"listaMenu\"\n [ngTemplateOutletContext]=\"{\n items: item.subMenus,\n nivel: nivel + 1,\n padre: clave\n }\"\n />\n }\n </li>\n }\n </ul>\n</ng-template>\n","/*\n * Public API Surface of telcomdev-ui\n */\n\nexport * from './lib/telcomdev-ui';\nexport * from './lib/alerta';\nexport * from './lib/data-table';\nexport * from './lib/footer';\nexport * from './lib/header';\nexport * from './lib/iconos';\nexport * from './lib/sidebar';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"telcomdev-ui.mjs","sources":["../../../projects/telcomdev-ui/src/lib/telcomdev-ui.ts","../../../projects/telcomdev-ui/src/lib/alerta/td-alerta.ts","../../../projects/telcomdev-ui/src/lib/iconos/td-iconos.ts","../../../projects/telcomdev-ui/src/lib/iconos/td-icono-registry.ts","../../../projects/telcomdev-ui/src/lib/iconos/td-icon.ts","../../../projects/telcomdev-ui/src/lib/data-table/td-data-table.ts","../../../projects/telcomdev-ui/src/lib/data-table/td-data-table.html","../../../projects/telcomdev-ui/src/lib/dialog/td-dialog.model.ts","../../../projects/telcomdev-ui/src/lib/dialog/td-dialog-ref.ts","../../../projects/telcomdev-ui/src/lib/dialog/td-dialog-panel.ts","../../../projects/telcomdev-ui/src/lib/dialog/td-dialog.ts","../../../projects/telcomdev-ui/src/lib/dialog/td-dialog-actions.ts","../../../projects/telcomdev-ui/src/lib/dialog/td-dialog-close.ts","../../../projects/telcomdev-ui/src/lib/footer/td-footer.ts","../../../projects/telcomdev-ui/src/lib/footer/td-footer.html","../../../projects/telcomdev-ui/src/lib/header/td-header.ts","../../../projects/telcomdev-ui/src/lib/header/td-header.html","../../../projects/telcomdev-ui/src/lib/input/td-input.ts","../../../projects/telcomdev-ui/src/lib/select/td-autocomplete-select.ts","../../../projects/telcomdev-ui/src/lib/select/td-select.ts","../../../projects/telcomdev-ui/src/lib/sidebar/td-sidebar.ts","../../../projects/telcomdev-ui/src/lib/sidebar/td-sidebar.html","../../../projects/telcomdev-ui/src/public-api.ts","../../../projects/telcomdev-ui/src/telcomdev-ui.ts"],"sourcesContent":["import { Component } from '@angular/core';\n\n@Component({\n selector: 'td-telcomdev-ui',\n imports: [],\n template: ` <p>telcomdev-ui works!</p> `,\n styles: ``,\n})\nexport class TelcomdevUi {}\n","export type TdAlertaTipo = 'exito' | 'error' | 'advertencia' | 'info' | 'pregunta';\r\n\r\nexport interface TdAlertaOpciones {\r\n titulo?: string;\r\n mensaje?: string;\r\n tipo?: TdAlertaTipo;\r\n textoConfirmar?: string;\r\n textoCancelar?: string;\r\n mostrarCancelar?: boolean;\r\n cerrarConEscape?: boolean;\r\n cerrarConFondo?: boolean;\r\n}\r\n\r\nexport class TdAlerta {\r\n private static readonly estiloId = 'td-alerta-estilos';\r\n\r\n static exito(mensaje: string, titulo = '¡Operación exitosa!'): Promise<boolean> {\r\n return this.mostrar({\r\n titulo,\r\n mensaje,\r\n tipo: 'exito',\r\n textoConfirmar: 'Aceptar',\r\n });\r\n }\r\n\r\n static error(mensaje: string, titulo = '¡Error!'): Promise<boolean> {\r\n return this.mostrar({\r\n titulo,\r\n mensaje,\r\n tipo: 'error',\r\n textoConfirmar: 'Cerrar',\r\n });\r\n }\r\n\r\n static errorSistema(mensaje: string, titulo = '¡Error de Sistema!'): Promise<boolean> {\r\n return this.mostrar({\r\n titulo,\r\n mensaje,\r\n tipo: 'error',\r\n textoConfirmar: 'Cerrar',\r\n });\r\n }\r\n\r\n static advertencia(mensaje: string, titulo = '¡Advertencia!'): Promise<boolean> {\r\n return this.mostrar({\r\n titulo,\r\n mensaje,\r\n tipo: 'advertencia',\r\n textoConfirmar: 'Aceptar',\r\n });\r\n }\r\n\r\n static info(mensaje: string, titulo = 'Información'): Promise<boolean> {\r\n return this.mostrar({\r\n titulo,\r\n mensaje,\r\n tipo: 'info',\r\n textoConfirmar: 'Aceptar',\r\n });\r\n }\r\n\r\n static confirmar(\r\n mensaje: string,\r\n titulo = '¿Estás seguro?',\r\n textoConfirmar = 'Sí, continuar',\r\n textoCancelar = 'Cancelar'\r\n ): Promise<boolean> {\r\n return this.mostrar({\r\n titulo,\r\n mensaje,\r\n tipo: 'pregunta',\r\n textoConfirmar,\r\n textoCancelar,\r\n mostrarCancelar: true,\r\n });\r\n }\r\n\r\n static confirmarEliminar(\r\n mensaje = 'Esta acción no se puede deshacer.',\r\n titulo = '¿Eliminar registro?'\r\n ): Promise<boolean> {\r\n return this.mostrar({\r\n titulo,\r\n mensaje,\r\n tipo: 'advertencia',\r\n textoConfirmar: 'Sí, eliminar',\r\n textoCancelar: 'Cancelar',\r\n mostrarCancelar: true,\r\n });\r\n }\r\n\r\n static mostrar(opciones: TdAlertaOpciones): Promise<boolean> {\r\n if (typeof document === 'undefined') {\r\n return Promise.resolve(false);\r\n }\r\n\r\n this.inyectarEstilos();\r\n\r\n const config: Required<TdAlertaOpciones> = {\r\n titulo: opciones.titulo ?? '',\r\n mensaje: opciones.mensaje ?? '',\r\n tipo: opciones.tipo ?? 'info',\r\n textoConfirmar: opciones.textoConfirmar ?? 'Aceptar',\r\n textoCancelar: opciones.textoCancelar ?? 'Cancelar',\r\n mostrarCancelar: opciones.mostrarCancelar ?? false,\r\n cerrarConEscape: opciones.cerrarConEscape ?? true,\r\n cerrarConFondo: opciones.cerrarConFondo ?? false,\r\n };\r\n\r\n return new Promise<boolean>((resolve) => {\r\n const fondo = document.createElement('div');\r\n fondo.className = 'td-alerta-fondo';\r\n\r\n const modal = document.createElement('div');\r\n modal.className = 'td-alerta-modal';\r\n modal.setAttribute('role', 'dialog');\r\n modal.setAttribute('aria-modal', 'true');\r\n\r\n const icono = document.createElement('div');\r\n icono.className = `td-alerta-icono td-alerta-icono--${config.tipo}`;\r\n icono.textContent = this.obtenerIcono(config.tipo);\r\n\r\n const titulo = document.createElement('h2');\r\n titulo.className = 'td-alerta-titulo';\r\n titulo.textContent = config.titulo;\r\n\r\n const mensaje = document.createElement('p');\r\n mensaje.className = 'td-alerta-mensaje';\r\n mensaje.textContent = config.mensaje;\r\n\r\n const acciones = document.createElement('div');\r\n acciones.className = 'td-alerta-acciones';\r\n\r\n const botonConfirmar = document.createElement('button');\r\n botonConfirmar.type = 'button';\r\n botonConfirmar.className = `td-alerta-boton td-alerta-boton--${config.tipo}`;\r\n botonConfirmar.textContent = config.textoConfirmar;\r\n\r\n const botonCancelar = document.createElement('button');\r\n botonCancelar.type = 'button';\r\n botonCancelar.className = 'td-alerta-boton td-alerta-boton--cancelar';\r\n botonCancelar.textContent = config.textoCancelar;\r\n\r\n const cerrar = (resultado: boolean): void => {\r\n document.removeEventListener('keydown', onKeyDown);\r\n fondo.classList.add('td-alerta-saliendo');\r\n\r\n window.setTimeout(() => {\r\n fondo.remove();\r\n resolve(resultado);\r\n }, 140);\r\n };\r\n\r\n const onKeyDown = (event: KeyboardEvent): void => {\r\n if (event.key === 'Escape' && config.cerrarConEscape) {\r\n cerrar(false);\r\n }\r\n };\r\n\r\n botonConfirmar.addEventListener('click', () => cerrar(true));\r\n botonCancelar.addEventListener('click', () => cerrar(false));\r\n\r\n if (config.cerrarConFondo) {\r\n fondo.addEventListener('click', (event) => {\r\n if (event.target === fondo) {\r\n cerrar(false);\r\n }\r\n });\r\n }\r\n\r\n document.addEventListener('keydown', onKeyDown);\r\n\r\n if (config.mostrarCancelar) {\r\n acciones.appendChild(botonCancelar);\r\n }\r\n\r\n acciones.appendChild(botonConfirmar);\r\n\r\n modal.appendChild(icono);\r\n modal.appendChild(titulo);\r\n\r\n if (config.mensaje) {\r\n modal.appendChild(mensaje);\r\n }\r\n\r\n modal.appendChild(acciones);\r\n fondo.appendChild(modal);\r\n document.body.appendChild(fondo);\r\n\r\n botonConfirmar.focus();\r\n });\r\n }\r\n\r\n private static obtenerIcono(tipo: TdAlertaTipo): string {\r\n const iconos: Record<TdAlertaTipo, string> = {\r\n exito: '✓',\r\n error: '!',\r\n advertencia: '!',\r\n info: 'i',\r\n pregunta: '?',\r\n };\r\n\r\n return iconos[tipo];\r\n }\r\n\r\n private static inyectarEstilos(): void {\r\n if (document.getElementById(this.estiloId)) return;\r\n\r\n const style = document.createElement('style');\r\n style.id = this.estiloId;\r\n style.textContent = `\r\n .td-alerta-fondo {\r\n position: fixed;\r\n inset: 0;\r\n z-index: 99999;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n padding: 1rem;\r\n background: rgba(15, 23, 42, 0.52);\r\n animation: td-alerta-fondo-entrada 160ms ease-out;\r\n }\r\n\r\n .td-alerta-modal {\r\n width: min(100%, 430px);\r\n border-radius: 18px;\r\n background: #ffffff;\r\n padding: 1.75rem;\r\n text-align: center;\r\n box-shadow: 0 22px 70px rgba(15, 23, 42, 0.28);\r\n animation: td-alerta-modal-entrada 180ms ease-out;\r\n font-family: system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\r\n }\r\n\r\n .td-alerta-icono {\r\n width: 4.25rem;\r\n height: 4.25rem;\r\n margin: 0 auto 1rem;\r\n border-radius: 999px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n font-size: 2.1rem;\r\n font-weight: 800;\r\n }\r\n\r\n .td-alerta-icono--exito {\r\n color: #16a34a;\r\n background: #dcfce7;\r\n }\r\n\r\n .td-alerta-icono--error {\r\n color: #ef4444;\r\n background: #fee2e2;\r\n }\r\n\r\n .td-alerta-icono--advertencia {\r\n color: #f59e0b;\r\n background: #fef3c7;\r\n }\r\n\r\n .td-alerta-icono--info {\r\n color: #2563eb;\r\n background: #dbeafe;\r\n }\r\n\r\n .td-alerta-icono--pregunta {\r\n color: #7c3aed;\r\n background: #ede9fe;\r\n }\r\n\r\n .td-alerta-titulo {\r\n margin: 0;\r\n color: #111827;\r\n font-size: 1.35rem;\r\n line-height: 1.25;\r\n font-weight: 800;\r\n }\r\n\r\n .td-alerta-mensaje {\r\n margin: 0.75rem 0 0;\r\n color: #4b5563;\r\n font-size: 0.96rem;\r\n line-height: 1.55;\r\n }\r\n\r\n .td-alerta-acciones {\r\n display: flex;\r\n justify-content: center;\r\n gap: 0.75rem;\r\n margin-top: 1.5rem;\r\n }\r\n\r\n .td-alerta-boton {\r\n border: 0;\r\n border-radius: 10px;\r\n padding: 0.7rem 1.2rem;\r\n color: #ffffff;\r\n font-size: 0.93rem;\r\n font-weight: 700;\r\n cursor: pointer;\r\n transition: transform 120ms ease, filter 120ms ease, background 120ms ease;\r\n }\r\n\r\n .td-alerta-boton:hover {\r\n filter: brightness(0.96);\r\n }\r\n\r\n .td-alerta-boton:active {\r\n transform: scale(0.98);\r\n }\r\n\r\n .td-alerta-boton:focus {\r\n outline: 3px solid rgba(37, 99, 235, 0.25);\r\n outline-offset: 2px;\r\n }\r\n\r\n .td-alerta-boton--exito {\r\n background: #22c55e;\r\n }\r\n\r\n .td-alerta-boton--error {\r\n background: #ef4444;\r\n }\r\n\r\n .td-alerta-boton--advertencia {\r\n background: #f59e0b;\r\n }\r\n\r\n .td-alerta-boton--info {\r\n background: #2563eb;\r\n }\r\n\r\n .td-alerta-boton--pregunta {\r\n background: #7c3aed;\r\n }\r\n\r\n .td-alerta-boton--cancelar {\r\n background: #6b7280;\r\n }\r\n\r\n .td-alerta-saliendo {\r\n animation: td-alerta-fondo-salida 140ms ease-in forwards;\r\n }\r\n\r\n .td-alerta-saliendo .td-alerta-modal {\r\n animation: td-alerta-modal-salida 140ms ease-in forwards;\r\n }\r\n\r\n @keyframes td-alerta-fondo-entrada {\r\n from { opacity: 0; }\r\n to { opacity: 1; }\r\n }\r\n\r\n @keyframes td-alerta-modal-entrada {\r\n from {\r\n opacity: 0;\r\n transform: translateY(12px) scale(0.96);\r\n }\r\n to {\r\n opacity: 1;\r\n transform: translateY(0) scale(1);\r\n }\r\n }\r\n\r\n @keyframes td-alerta-fondo-salida {\r\n from { opacity: 1; }\r\n to { opacity: 0; }\r\n }\r\n\r\n @keyframes td-alerta-modal-salida {\r\n from {\r\n opacity: 1;\r\n transform: translateY(0) scale(1);\r\n }\r\n to {\r\n opacity: 0;\r\n transform: translateY(8px) scale(0.97);\r\n }\r\n }\r\n\r\n @media (max-width: 480px) {\r\n .td-alerta-modal {\r\n padding: 1.4rem;\r\n border-radius: 16px;\r\n }\r\n\r\n .td-alerta-acciones {\r\n flex-direction: column-reverse;\r\n }\r\n\r\n .td-alerta-boton {\r\n width: 100%;\r\n }\r\n }\r\n `;\r\n\r\n document.head.appendChild(style);\r\n }\r\n}","import { TdIconoDefinicion } from './td-icono.model';\n\nexport const TD_ICONOS = {\n home: {\n path: 'M3 10.5 12 3l9 7.5V21a1 1 0 0 1-1 1h-5v-7H9v7H4a1 1 0 0 1-1-1V10.5Z',\n },\n dashboard: {\n path: 'M4 3h6a1 1 0 0 1 1 1v6a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1Zm10 0h6a1 1 0 0 1 1 1v3a1 1 0 0 1-1 1h-6a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1Zm0 8h6a1 1 0 0 1 1 1v8a1 1 0 0 1-1 1h-6a1 1 0 0 1-1-1v-8a1 1 0 0 1 1-1ZM4 14h6a1 1 0 0 1 1 1v5a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1v-5a1 1 0 0 1 1-1Z',\n },\n folder: {\n path: 'M3 5a2 2 0 0 1 2-2h5l2 2h7a2 2 0 0 1 2 2v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5Z',\n },\n settings: {\n path: 'M12 8.5a3.5 3.5 0 1 0 0 7 3.5 3.5 0 0 0 0-7Zm8.5 3.5c0-.5-.05-.98-.14-1.45l2.02-1.57-2-3.46-2.47 1a8.7 8.7 0 0 0-2.5-1.45L15 2.5h-4l-.4 2.57a8.7 8.7 0 0 0-2.51 1.45l-2.47-1-2 3.46 2.02 1.57a7.7 7.7 0 0 0 0 2.9l-2.02 1.57 2 3.46 2.47-1a8.7 8.7 0 0 0 2.5 1.45L11 21.5h4l.4-2.57a8.7 8.7 0 0 0 2.51-1.45l2.47 1 2-3.46-2.02-1.57c.09-.47.14-.95.14-1.45Z',\n },\n people: {\n path: 'M16 11a4 4 0 1 0 0-8 4 4 0 0 0 0 8ZM6.5 12a3.5 3.5 0 1 0 0-7 3.5 3.5 0 0 0 0 7ZM16 13c-4 0-7 2-7 4.5V21h14v-3.5C23 15 20 13 16 13ZM6.5 14C2.9 14 1 15.8 1 18v3h6v-3.5c0-1.2.48-2.28 1.3-3.16A9.3 9.3 0 0 0 6.5 14Z',\n },\n person: {\n path: 'M12 12a5 5 0 1 0 0-10 5 5 0 0 0 0 10Zm0 2c-5 0-9 2.5-9 5.5V22h18v-2.5c0-3-4-5.5-9-5.5Z',\n },\n security: {\n path: 'M12 2 4 5v6c0 5.05 3.41 9.74 8 11 4.59-1.26 8-5.95 8-11V5l-8-3Zm-1 14-4-4 1.4-1.4 2.6 2.58 5.6-5.58L18 9l-7 7Z',\n },\n inventory: {\n path: 'm12 2 9 5-9 5-9-5 9-5Zm-7 8.5 6 3.33V22l-6-3.33V10.5Zm8 11.5v-8.17l6-3.33v8.17L13 22Z',\n },\n shopping_cart: {\n path: 'M7 18a2 2 0 1 0 0 4 2 2 0 0 0 0-4Zm10 0a2 2 0 1 0 0 4 2 2 0 0 0 0-4ZM6.2 6l.8 2h11.6l-1.9 5H8.1L4.3 3H1v2h2l3.6 9.6A2 2 0 0 0 8.5 16H19v-2H8.5l-.4-1H18a2 2 0 0 0 1.86-1.27L22 6H6.2Z',\n },\n receipt: {\n path: 'M5 2v20l3-2 4 2 4-2 3 2V2l-3 2-4-2-4 2-3-2Zm3 6h8v2H8V8Zm0 4h8v2H8v-2Z',\n },\n assessment: {\n path: 'M4 20h16v2H4a2 2 0 0 1-2-2V4h2v16Zm3-2H5v-6h2v6Zm4 0H9V7h2v11Zm4 0h-2V4h2v14Zm4 0h-2v-9h2v9Z',\n },\n description: {\n path: 'M6 2h8l5 5v15H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2Zm7 1.5V8h4.5L13 3.5ZM8 12v2h8v-2H8Zm0 4v2h8v-2H8Z',\n },\n business: {\n path: 'M3 21V3h10v5h8v13h-7v-4h-2v4H3Zm3-14h2V5H6v2Zm4 0h2V5h-2v2Zm-4 4h2V9H6v2Zm4 0h2V9h-2v2Zm6 1h2v-2h-2v2Zm0 4h2v-2h-2v2Z',\n },\n chevron_left: {\n path: 'M14.7 5.3a1 1 0 0 1 0 1.4L9.4 12l5.3 5.3a1 1 0 1 1-1.4 1.4l-6-6a1 1 0 0 1 0-1.4l6-6a1 1 0 0 1 1.4 0Z',\n },\n chevron_right: {\n path: 'M9.3 5.3a1 1 0 0 0 0 1.4l5.3 5.3-5.3 5.3a1 1 0 1 0 1.4 1.4l6-6a1 1 0 0 0 0-1.4l-6-6a1 1 0 0 0-1.4 0Z',\n },\n sun: {\n path: 'M12 7a5 5 0 1 0 0 10 5 5 0 0 0 0-10Zm0-5a1 1 0 0 1 1 1v2a1 1 0 1 1-2 0V3a1 1 0 0 1 1-1Zm0 17a1 1 0 0 1 1 1v2a1 1 0 1 1-2 0v-2a1 1 0 0 1 1-1ZM2 12a1 1 0 0 1 1-1h2a1 1 0 1 1 0 2H3a1 1 0 0 1-1-1Zm17 0a1 1 0 0 1 1-1h2a1 1 0 1 1 0 2h-2a1 1 0 0 1-1-1ZM4.22 4.22a1 1 0 0 1 1.42 0l1.41 1.42a1 1 0 0 1-1.41 1.41L4.22 5.64a1 1 0 0 1 0-1.42Zm12.73 12.73a1 1 0 0 1 1.41 0l1.42 1.41a1 1 0 0 1-1.42 1.42l-1.41-1.42a1 1 0 0 1 0-1.41Zm2.83-12.73a1 1 0 0 1 0 1.42l-1.42 1.41a1 1 0 0 1-1.41-1.41l1.41-1.42a1 1 0 0 1 1.42 0ZM7.05 16.95a1 1 0 0 1 0 1.41l-1.41 1.42a1 1 0 0 1-1.42-1.42l1.42-1.41a1 1 0 0 1 1.41 0Z',\n },\n moon: {\n path: 'M20.5 15.2A8.5 8.5 0 0 1 8.8 3.5 9 9 0 1 0 20.5 15.2Z',\n },\n alert: {\n path: 'M12 2 1 21h22L12 2Zm-1 7h2v6h-2V9Zm0 8h2v2h-2v-2Z',\n },\n check: {\n path: 'm9.2 16.2-4.4-4.4-1.6 1.6 6 6L21 7.6 19.4 6 9.2 16.2Z',\n },\n close: {\n path: 'M6.4 5 12 10.6 17.6 5 19 6.4 13.4 12l5.6 5.6-1.4 1.4-5.6-5.6L6.4 19 5 17.6l5.6-5.6L5 6.4 6.4 5Z',\n },\n menu: {\n path: 'M3 6h18v2H3V6Zm0 5h18v2H3v-2Zm0 5h18v2H3v-2Z',\n },\n search: {\n path: 'M10.5 3a7.5 7.5 0 1 0 4.73 13.32L20.91 22 22 20.91l-5.68-5.68A7.5 7.5 0 0 0 10.5 3Zm0 2a5.5 5.5 0 1 1 0 11 5.5 5.5 0 0 1 0-11Z',\n },\n visibility: {\n path: 'M12 4.5C6.5 4.5 2.1 8 1 12c1.1 4 5.5 7.5 11 7.5S21.9 16 23 12c-1.1-4-5.5-7.5-11-7.5Zm0 12a4.5 4.5 0 1 1 0-9 4.5 4.5 0 0 1 0 9Zm0-2a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5Z',\n },\n visibility_off: {\n path: 'm3.3 2 18.7 18.7-1.3 1.3-3.15-3.15A12.2 12.2 0 0 1 12 20C6.5 20 2.1 16.5 1 12a11.6 11.6 0 0 1 3.4-5.2L2 4.3 3.3 2Zm4.42 7.02A4.5 4.5 0 0 0 14.98 16l-1.55-1.55a2.5 2.5 0 0 1-3.88-3.88L7.72 9.02ZM12 4c5.5 0 9.9 3.5 11 8a11.2 11.2 0 0 1-2.53 4.35l-3.3-3.3A5.5 5.5 0 0 0 10.95 6.83L8.58 4.46A13.4 13.4 0 0 1 12 4Z',\n },\n notifications: {\n path: 'M12 22a2.5 2.5 0 0 0 2.45-2h-4.9A2.5 2.5 0 0 0 12 22Zm7-6v-5a7 7 0 0 0-5.5-6.84V3a1.5 1.5 0 0 0-3 0v1.16A7 7 0 0 0 5 11v5l-2 2v1h18v-1l-2-2Z',\n },\n chevron_down: {\n path: 'M5.3 8.3a1 1 0 0 1 1.4 0l5.3 5.3 5.3-5.3a1 1 0 1 1 1.4 1.4l-6 6a1 1 0 0 1-1.4 0l-6-6a1 1 0 0 1 0-1.4Z',\n },\n apps: {\n path: 'M4 3h4a1 1 0 0 1 1 1v4a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1Zm12 0h4a1 1 0 0 1 1 1v4a1 1 0 0 1-1 1h-4a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1ZM4 15h4a1 1 0 0 1 1 1v4a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1v-4a1 1 0 0 1 1-1Zm12 0h4a1 1 0 0 1 1 1v4a1 1 0 0 1-1 1h-4a1 1 0 0 1-1-1v-4a1 1 0 0 1 1-1Z',\n },\n help: {\n path: 'M12 2a10 10 0 1 0 0 20 10 10 0 0 0 0-20Zm0 18a8 8 0 1 1 0-16 8 8 0 0 1 0 16Zm0-4.5a1.25 1.25 0 1 0 0 2.5 1.25 1.25 0 0 0 0-2.5Zm.2-9.5c-2 0-3.37 1.03-3.7 2.75l1.95.4c.17-.84.77-1.3 1.67-1.3 1 0 1.63.52 1.63 1.35 0 .67-.33 1.03-1.27 1.58-1.12.65-1.48 1.27-1.48 2.47V14h2v-.55c0-.67.2-.94 1.12-1.5 1.18-.72 1.88-1.58 1.88-2.9C16 7.25 14.5 6 12.2 6Z',\n },\n add: {\n path: 'M11 5h2v6h6v2h-6v6h-2v-6H5v-2h6V5Z',\n },\n edit: {\n path: 'm16.86 3.49 3.65 3.65L8.65 19H5v-3.65L16.86 3.49ZM19.73 2.27a1.75 1.75 0 0 0-2.47 0l-1.35 1.35 3.65 3.65 1.35-1.35a1.75 1.75 0 0 0 0-2.47l-1.18-1.18Z',\n },\n delete: {\n path: 'M8 3h8l1 2h4v2H3V5h4l1-2Zm-2 6h12l-1 12H7L6 9Zm4 2v7h2v-7h-2Zm4 0v7h2v-7h-2Z',\n },\n toggle_on: {\n path: 'M17 6H7a6 6 0 0 0 0 12h10a6 6 0 0 0 0-12Zm0 10a4 4 0 1 1 0-8 4 4 0 0 1 0 8Z',\n },\n toggle_off: {\n path: 'M17 6H7a6 6 0 0 0 0 12h10a6 6 0 0 0 0-12ZM7 16a4 4 0 1 1 0-8 4 4 0 0 1 0 8Z',\n },\n inbox: {\n path: 'M4 3h16l3 11v7H1v-7L4 3Zm1.5 2L3 14h5l1 2h6l1-2h5l-2.5-9h-13Z',\n },\n pdf: {\n path: 'M6 2h9l5 5v15H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2Zm8 1.5V8h4.5L14 3.5ZM8 12v7h2v-2h1.2a2.5 2.5 0 0 0 0-5H8Zm2 2h1.2a.5.5 0 0 1 0 1H10v-1Zm4-2v7h2v-2h1v-2h-1v-1h2v-2h-4Z',\n },\n} satisfies Record<string, TdIconoDefinicion>;\n\nexport type TdIconoNombre = keyof typeof TD_ICONOS;\n\nexport const TD_ICONOS_NOMBRES = Object.freeze(\n Object.keys(TD_ICONOS) as TdIconoNombre[]\n);\n","import { Injectable } from '@angular/core';\nimport { TdIconoDefinicion, TdIconoPersonalizado } from './td-icono.model';\nimport { TD_ICONOS } from './td-iconos';\n\n@Injectable({ providedIn: 'root' })\nexport class TdIconoRegistry {\n private readonly iconos = new Map<string, TdIconoDefinicion>(\n Object.entries(TD_ICONOS)\n );\n\n registrar(iconos: TdIconoPersonalizado): void {\n for (const [nombre, definicion] of Object.entries(iconos)) {\n const clave = this.normalizar(nombre);\n if (!clave) continue;\n\n this.iconos.set(\n clave,\n typeof definicion === 'string' ? { path: definicion } : definicion\n );\n }\n }\n\n obtener(nombre: string | null | undefined): TdIconoDefinicion {\n return this.iconos.get(this.normalizar(nombre)) ?? this.iconos.get('folder')!;\n }\n\n existe(nombre: string): boolean {\n return this.iconos.has(this.normalizar(nombre));\n }\n\n nombres(): string[] {\n return [...this.iconos.keys()];\n }\n\n private normalizar(nombre: string | null | undefined): string {\n return (nombre ?? '').trim().toLowerCase();\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n HostBinding,\n Input,\n inject,\n} from '@angular/core';\nimport { TdIconoRegistry } from './td-icono-registry';\n\n@Component({\n selector: 'td-icon',\n template: `\n <svg\n [attr.viewBox]=\"definicion().viewBox || '0 0 24 24'\"\n [attr.aria-hidden]=\"titulo ? null : 'true'\"\n [attr.aria-label]=\"titulo || null\"\n [attr.role]=\"titulo ? 'img' : null\"\n focusable=\"false\"\n >\n <path [attr.d]=\"definicion().path\" />\n </svg>\n `,\n styles: `\n :host {\n display: inline-flex;\n width: var(--td-icon-size, 1.25rem);\n height: var(--td-icon-size, 1.25rem);\n flex: 0 0 auto;\n color: inherit;\n line-height: 0;\n vertical-align: middle;\n }\n svg { width: 100%; height: 100%; fill: currentColor; }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TdIcon {\n private readonly registry = inject(TdIconoRegistry);\n\n @Input() nombre = 'folder';\n @Input() titulo = '';\n\n @Input()\n set tamano(value: string | number) {\n this.tamanoCss = typeof value === 'number' ? `${value}px` : value;\n }\n\n protected tamanoCss = '1.25rem';\n\n @HostBinding('style.--td-icon-size')\n protected get tamanoHost(): string {\n return this.tamanoCss;\n }\n\n protected definicion() {\n return this.registry.obtener(this.nombre);\n }\n}\n","import { CdkVirtualScrollViewport, ScrollingModule } from '@angular/cdk/scrolling';\nimport {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n OnChanges,\n OnDestroy,\n Output,\n SimpleChanges,\n ViewChild,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { TdIcon } from '../iconos';\nimport {\n TdDataTableAccion,\n TdDataTableAccionEvento,\n TdDataTableBoton,\n TdDataTableColumna,\n TdDataTableTono,\n} from './td-data-table.model';\n\n@Component({\n selector: 'td-data-table',\n imports: [FormsModule, ScrollingModule, TdIcon],\n templateUrl: './td-data-table.html',\n styleUrl: './td-data-table.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TdDataTable<T extends object> implements OnChanges, OnDestroy {\n @ViewChild(CdkVirtualScrollViewport)\n private viewport?: CdkVirtualScrollViewport;\n\n @Input() datos: T[] = [];\n @Input() columnas: TdDataTableColumna<T>[] = [];\n @Input() acciones: TdDataTableAccion<T>[] = [];\n @Input() botones: TdDataTableBoton[] = [];\n @Input() total = 0;\n @Input() cargando = false;\n @Input() puedeCargarMas = false;\n @Input() itemSize = 65;\n @Input() filasAntesDeCargar = 2;\n @Input() altura = 'min(620px, calc(100dvh - 18rem))';\n @Input() campoId: keyof T & string = 'id' as keyof T & string;\n @Input() oscuro = false;\n @Input() mostrarBusqueda = true;\n @Input() placeholderBusqueda = 'Buscar...';\n @Input() textoVacio = 'No hay registros disponibles';\n @Input() descripcionVacio = 'Prueba cambiando los filtros o vuelve más tarde.';\n @Input() debounceBusqueda = 250;\n\n @Output() readonly busquedaChange = new EventEmitter<string>();\n @Output() readonly accion = new EventEmitter<TdDataTableAccionEvento<T>>();\n @Output() readonly botonClick = new EventEmitter<TdDataTableBoton>();\n @Output() readonly cargarMas = new EventEmitter<void>();\n\n protected busqueda = '';\n private timeoutBusqueda: ReturnType<typeof setTimeout> | null = null;\n private ultimaLongitudSolicitada = -1;\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['datos'] && this.datos.length !== this.ultimaLongitudSolicitada) {\n this.ultimaLongitudSolicitada = -1;\n }\n }\n\n ngOnDestroy(): void {\n if (this.timeoutBusqueda) clearTimeout(this.timeoutBusqueda);\n }\n\n protected columnasGrid(): string {\n const columnas = this.columnas.map((columna) => columna.ancho ?? 'minmax(10rem, 1fr)');\n if (this.acciones.length) columnas.push('minmax(9rem, auto)');\n return columnas.join(' ');\n }\n\n protected buscar(): void {\n if (this.timeoutBusqueda) clearTimeout(this.timeoutBusqueda);\n this.timeoutBusqueda = setTimeout(\n () => this.busquedaChange.emit(this.busqueda.trim()),\n this.debounceBusqueda\n );\n }\n\n protected limpiarBusqueda(): void {\n if (this.timeoutBusqueda) clearTimeout(this.timeoutBusqueda);\n this.busqueda = '';\n this.busquedaChange.emit('');\n }\n\n protected valor(fila: T, clave: keyof T & string): unknown {\n return (fila as Record<string, unknown>)[clave];\n }\n\n protected textoCelda(columna: TdDataTableColumna<T>, fila: T, indice: number): string {\n const valor = this.valor(fila, columna.clave);\n if (columna.formatear) return columna.formatear(valor, fila, indice);\n if (valor === null || valor === undefined || valor === '') return '—';\n if (columna.tipo === 'booleano') return valor ? 'Sí' : 'No';\n if (columna.tipo === 'estado') return valor ? 'Activo' : 'Inactivo';\n return String(valor);\n }\n\n protected tonoCelda(columna: TdDataTableColumna<T>, fila: T): TdDataTableTono {\n const valor = this.valor(fila, columna.clave);\n if (columna.tono) return columna.tono(valor, fila);\n if (columna.tipo === 'estado') return valor ? 'exito' : 'peligro';\n if (columna.tipo === 'booleano') return valor ? 'exito' : 'neutro';\n return 'neutro';\n }\n\n protected accionesVisibles(fila: T): TdDataTableAccion<T>[] {\n return this.acciones.filter((accion) => accion.visible?.(fila) ?? true);\n }\n\n protected iconoAccion(accion: TdDataTableAccion<T>, fila: T): string {\n return typeof accion.icono === 'function' ? accion.icono(fila) : accion.icono;\n }\n\n protected tonoAccion(accion: TdDataTableAccion<T>, fila: T): TdDataTableTono {\n if (typeof accion.tono === 'function') return accion.tono(fila);\n return accion.tono ?? 'neutro';\n }\n\n protected botonesVisibles(): TdDataTableBoton[] {\n return this.botones.filter((boton) => boton.visible ?? true);\n }\n\n protected ejecutarAccion(\n accion: TdDataTableAccion<T>,\n fila: T,\n indice: number\n ): void {\n if (accion.deshabilitada?.(fila)) return;\n this.accion.emit({ accion, fila, indice });\n }\n\n protected alCambiarIndice(): void {\n if (!this.viewport) return;\n\n const distanciaAlFinal = this.viewport.measureScrollOffset('bottom');\n const umbralPx = this.itemSize * Math.max(0, this.filasAntesDeCargar);\n\n if (\n distanciaAlFinal <= umbralPx &&\n this.datos.length > 0 &&\n this.puedeCargarMas &&\n !this.cargando &&\n this.ultimaLongitudSolicitada !== this.datos.length\n ) {\n this.ultimaLongitudSolicitada = this.datos.length;\n this.cargarMas.emit();\n }\n }\n\n protected readonly trackFila = (_indice: number, fila: T): unknown =>\n (fila as Record<string, unknown>)[this.campoId] ?? fila;\n}\n","<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úsqueda\" (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 @if (cargando) {\n <span class=\"td-tabla__cargando-inline\"><i></i> Cargando...</span>\n }\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\n class=\"td-tabla__encabezado\"\n role=\"row\"\n [style.grid-template-columns]=\"columnasGrid()\"\n >\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 <cdk-virtual-scroll-viewport\n class=\"td-tabla__viewport\"\n [itemSize]=\"itemSize\"\n [style.height]=\"altura\"\n (scrolledIndexChange)=\"alCambiarIndice()\"\n >\n <div\n *cdkVirtualFor=\"let fila of datos; let indice = index; trackBy: trackFila\"\n class=\"td-tabla__fila\"\n role=\"row\"\n [style.height.px]=\"itemSize\"\n [style.grid-template-columns]=\"columnasGrid()\"\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 (\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 [class.td-tabla__numero]=\"columna.tipo === 'numero'\">\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 @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 </div>\n }\n </div>\n </cdk-virtual-scroll-viewport>\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","import { InjectionToken, Type } from '@angular/core';\nimport { Observable } from 'rxjs';\n\nexport type TdDialogTamano = 'pequeno' | 'mediano' | 'grande' | 'pantalla';\n\nexport interface TdDialogConfig<D = unknown> {\n data?: D;\n titulo?: string;\n subtitulo?: string;\n icono?: string;\n tamano?: TdDialogTamano;\n ancho?: string;\n alto?: string;\n maxAncho?: string;\n maxAlto?: string;\n mostrarCerrar?: boolean;\n cerrarAlNavegar?: boolean;\n deshabilitarCierre?: boolean;\n autoFocus?: 'dialog' | 'first-tabbable' | 'first-heading' | string | boolean;\n restaurarFoco?: boolean;\n oscuro?: boolean;\n panelClass?: string | string[];\n ariaLabel?: string;\n}\n\nexport interface TdDialogPanelData<D = unknown> {\n component: Type<unknown>;\n config: TdDialogConfig<D>;\n fullscreen: boolean;\n}\n\nexport const TD_DIALOG_DATA = new InjectionToken<unknown>('TD_DIALOG_DATA');\nexport const TD_DIALOG_CONFIG = new InjectionToken<TdDialogConfig>('TD_DIALOG_CONFIG');\n\nexport interface TdDialogRefLike<R = unknown> {\n readonly closed: Observable<R | undefined>;\n readonly id: string;\n close(result?: R): void;\n updateSize(width?: string | number, height?: string | number): this;\n}\n","import { DialogRef } from '@angular/cdk/dialog';\nimport { Observable } from 'rxjs';\nimport { TdDialogRefLike } from './td-dialog.model';\n\nexport class TdDialogRef<R = unknown> implements TdDialogRefLike<R> {\n readonly closed: Observable<R | undefined>;\n readonly id: string;\n\n constructor(private readonly ref: DialogRef<R, unknown>) {\n this.closed = ref.closed;\n this.id = ref.id;\n }\n\n close(result?: R): void {\n this.ref.close(result);\n }\n\n updateSize(width?: string | number, height?: string | number): this {\n this.ref.updateSize(width, height);\n return this;\n }\n}\n","import { DIALOG_DATA } from '@angular/cdk/dialog';\nimport { NgComponentOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { TdIcon } from '../iconos';\nimport { TdDialogPanelData } from './td-dialog.model';\nimport { TdDialogRef } from './td-dialog-ref';\n\n@Component({\n selector: 'td-dialog-panel',\n imports: [NgComponentOutlet, TdIcon],\n template: `\n <section\n class=\"td-dialog\"\n [class.td-dialog--oscuro]=\"payload.config.oscuro\"\n [class.td-dialog--pantalla]=\"payload.fullscreen\"\n [attr.aria-label]=\"payload.config.ariaLabel || payload.config.titulo || 'Diálogo'\"\n >\n @if (\n payload.config.titulo ||\n payload.config.subtitulo ||\n payload.config.icono ||\n payload.config.mostrarCerrar !== false\n ) {\n <header class=\"td-dialog__header\">\n @if (payload.config.icono) {\n <span class=\"td-dialog__icono\">\n <td-icon [nombre]=\"payload.config.icono\" tamano=\"1.25rem\" />\n </span>\n }\n <div class=\"td-dialog__titulos\">\n @if (payload.config.titulo) {\n <h2>{{ payload.config.titulo }}</h2>\n }\n @if (payload.config.subtitulo) {\n <p>{{ payload.config.subtitulo }}</p>\n }\n </div>\n @if (payload.config.mostrarCerrar !== false) {\n <button\n type=\"button\"\n class=\"td-dialog__cerrar\"\n aria-label=\"Cerrar diálogo\"\n title=\"Cerrar\"\n (click)=\"dialogRef.close()\"\n >\n <td-icon nombre=\"close\" />\n </button>\n }\n </header>\n }\n\n <div class=\"td-dialog__contenido\">\n <ng-container *ngComponentOutlet=\"payload.component\" />\n </div>\n </section>\n `,\n styleUrl: './td-dialog-panel.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TdDialogPanel {\n protected readonly payload = inject<TdDialogPanelData>(DIALOG_DATA);\n protected readonly dialogRef = inject(TdDialogRef);\n}\n","import { Dialog, DialogRef } from '@angular/cdk/dialog';\nimport { Injectable, Type, inject } from '@angular/core';\nimport { TD_DIALOG_CONFIG, TD_DIALOG_DATA, TdDialogConfig, TdDialogPanelData } from './td-dialog.model';\nimport { TdDialogPanel } from './td-dialog-panel';\nimport { TdDialogRef } from './td-dialog-ref';\n\n@Injectable({ providedIn: 'root' })\nexport class TdDialog {\n private readonly dialog = inject(Dialog);\n\n open<C, D = unknown, R = unknown>(\n component: Type<C>,\n config: TdDialogConfig<D> = {}\n ): TdDialogRef<R> {\n const size = config.tamano ?? 'mediano';\n const mobile =\n typeof window !== 'undefined' &&\n typeof window.matchMedia === 'function' &&\n window.matchMedia('(max-width: 600px)').matches;\n const fullscreen = size === 'pantalla' || (mobile && size !== 'pequeno');\n const width = fullscreen ? '100%' : config.ancho ?? this.widthFor(size);\n const maxWidth = fullscreen ? '100%' : config.maxAncho ?? 'calc(100vw - 2rem)';\n const maxHeight = fullscreen ? '100dvh' : config.maxAlto ?? 'calc(100dvh - 2rem)';\n let publicRef!: TdDialogRef<R>;\n\n const cdkRef = this.dialog.open<R, TdDialogPanelData<D>, TdDialogPanel>(\n TdDialogPanel,\n {\n data: { component, config, fullscreen },\n width,\n height: fullscreen ? '100dvh' : config.alto,\n maxWidth,\n maxHeight,\n hasBackdrop: true,\n backdropClass: 'cdk-overlay-dark-backdrop',\n panelClass: this.panelClasses(config, fullscreen),\n disableClose: config.deshabilitarCierre ?? false,\n closeOnNavigation: config.cerrarAlNavegar ?? true,\n autoFocus: config.autoFocus ?? 'first-tabbable',\n restoreFocus: config.restaurarFoco ?? true,\n ariaLabel: config.ariaLabel ?? config.titulo,\n ariaModal: true,\n providers: (ref: DialogRef<R, TdDialogPanel>) => {\n publicRef = new TdDialogRef<R>(ref as DialogRef<R, unknown>);\n return [\n { provide: TD_DIALOG_DATA, useValue: config.data },\n { provide: TD_DIALOG_CONFIG, useValue: config },\n { provide: TdDialogRef, useValue: publicRef },\n ];\n },\n }\n );\n\n return publicRef ?? new TdDialogRef<R>(cdkRef as DialogRef<R, unknown>);\n }\n\n closeAll(): void {\n this.dialog.closeAll();\n }\n\n private widthFor(size: TdDialogConfig['tamano']): string {\n const widths = {\n pequeno: 'min(28rem, calc(100vw - 2rem))',\n mediano: 'min(40rem, calc(100vw - 2rem))',\n grande: 'min(64rem, calc(100vw - 2rem))',\n pantalla: '100%',\n };\n return widths[size ?? 'mediano'];\n }\n\n private panelClasses(config: TdDialogConfig, fullscreen: boolean): string[] {\n const extra = Array.isArray(config.panelClass)\n ? config.panelClass\n : config.panelClass\n ? [config.panelClass]\n : [];\n return [\n 'td-dialog-overlay',\n `td-dialog-overlay--${config.tamano ?? 'mediano'}`,\n ...(fullscreen ? ['td-dialog-overlay--fullscreen'] : []),\n ...extra,\n ];\n }\n}\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\n\n@Component({\n selector: 'td-dialog-actions',\n template: `<ng-content />`,\n styles: `\n :host {\n display: flex;\n min-height: 3.7rem;\n flex: 0 0 auto;\n align-items: center;\n justify-content: flex-end;\n gap: .5rem;\n margin: auto -1.5rem -1.5rem;\n margin-top: auto;\n border-top: 1px solid var(--td-dialog-border, #e6e9f0);\n padding: .65rem 1.25rem;\n background: var(--td-dialog-footer, #fafbfc);\n box-shadow: 0 -8px 22px rgba(15, 23, 42, .035);\n }\n\n :host ::ng-deep button {\n display: inline-flex;\n min-height: 2.25rem;\n align-items: center;\n justify-content: center;\n gap: .45rem;\n border: 1px solid var(--td-dialog-border, #dfe3eb);\n border-radius: .6rem;\n padding: .5rem .85rem;\n color: var(--td-dialog-text, #263147);\n background: var(--td-dialog-surface, #fff);\n font: 750 .75rem/1 system-ui, sans-serif;\n cursor: pointer;\n }\n\n :host ::ng-deep button:hover { border-color: #9b91e3; background: #f7f5ff; }\n :host ::ng-deep button[tdDialogPrimary] {\n border-color: transparent;\n color: #fff;\n background: linear-gradient(135deg, #5746d8, #7657df);\n box-shadow: 0 7px 16px rgba(87, 70, 216, .2);\n }\n :host ::ng-deep button:disabled { opacity: .5; cursor: not-allowed; }\n\n @media (max-width: 520px) {\n :host {\n min-height: auto;\n align-items: stretch;\n flex-direction: column-reverse;\n margin-right: -1.1rem;\n margin-bottom: -1.1rem;\n margin-left: -1.1rem;\n padding: .7rem 1.1rem;\n }\n :host ::ng-deep button { width: 100%; }\n }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TdDialogActions {}\n","import { Directive, HostListener, Input, inject } from '@angular/core';\nimport { TdDialogRef } from './td-dialog-ref';\n\n@Directive({\n selector: '[tdDialogClose]',\n})\nexport class TdDialogClose {\n private readonly dialogRef = inject(TdDialogRef);\n\n @Input('tdDialogClose') result: unknown;\n\n @HostListener('click')\n protected close(): void {\n this.dialogRef.close(this.result);\n }\n}\n\n@Directive({\n selector: '[tdDialogPrimary]',\n})\nexport class TdDialogPrimary {}\n","import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\n\n@Component({\n selector: 'td-footer',\n templateUrl: './td-footer.html',\n styleUrl: './td-footer.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TdFooter {\n @Input() empresa = 'TelcomDev';\n @Input() texto = 'Todos los derechos reservados.';\n @Input() version = '';\n @Input() oscuro = false;\n @Input() compacto = false;\n @Input() anio = new Date().getFullYear();\n}\n","<footer\n class=\"td-footer\"\n [class.td-footer--oscuro]=\"oscuro\"\n [class.td-footer--compacto]=\"compacto\"\n>\n <div class=\"td-footer__identidad\">\n <span>© {{ anio }} {{ empresa }}</span>\n @if (texto) {\n <small>{{ texto }}</small>\n }\n </div>\n\n <nav class=\"td-footer__enlaces\" aria-label=\"Enlaces del pie de página\">\n <ng-content select=\"[tdFooterLinks]\" />\n </nav>\n\n <div class=\"td-footer__final\">\n <ng-content select=\"[tdFooterActions]\" />\n @if (version) {\n <span class=\"td-footer__version\">v{{ version }}</span>\n }\n </div>\n</footer>\n","import {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n HostListener,\n Input,\n Output,\n} from '@angular/core';\nimport { TdIcon } from '../iconos';\n\nexport interface TdHeaderNotificacion {\n id: string | number;\n titulo: string;\n descripcion?: string;\n fecha?: string;\n icono?: string;\n leida?: boolean;\n}\n\nexport type TdHeaderAccionPerfil = 'perfil' | 'configuracion' | 'salir';\n\n@Component({\n selector: 'td-header',\n imports: [TdIcon],\n templateUrl: './td-header.html',\n styleUrl: './td-header.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TdHeader {\n @Input() menuAbierto = true;\n @Input() mostrarMenu = true;\n @Input() usuario = '';\n @Input() cargo = '';\n @Input() avatarUrl = '';\n @Input() notificaciones: TdHeaderNotificacion[] = [];\n @Input() oscuro = false;\n @Input() fijo = true;\n\n @Output() readonly menuToggle = new EventEmitter<void>();\n @Output() readonly notificacionSeleccionada = new EventEmitter<TdHeaderNotificacion>();\n @Output() readonly verTodasNotificaciones = new EventEmitter<void>();\n @Output() readonly accionPerfil = new EventEmitter<TdHeaderAccionPerfil>();\n\n protected panelNotificacionesAbierto = false;\n protected panelPerfilAbierto = false;\n\n protected alternarMenu(): void {\n this.menuToggle.emit();\n }\n\n protected alternarNotificaciones(): void {\n this.panelNotificacionesAbierto = !this.panelNotificacionesAbierto;\n this.panelPerfilAbierto = false;\n }\n\n protected alternarPerfil(): void {\n this.panelPerfilAbierto = !this.panelPerfilAbierto;\n this.panelNotificacionesAbierto = false;\n }\n\n protected seleccionarNotificacion(notificacion: TdHeaderNotificacion): void {\n this.notificacionSeleccionada.emit(notificacion);\n this.panelNotificacionesAbierto = false;\n }\n\n protected emitirAccionPerfil(accion: TdHeaderAccionPerfil): void {\n this.accionPerfil.emit(accion);\n this.panelPerfilAbierto = false;\n }\n\n protected notificacionesNoLeidas(): number {\n return this.notificaciones.filter((item) => !item.leida).length;\n }\n\n protected inicialesUsuario(): string {\n const partes = this.usuario.trim().split(/\\s+/).filter(Boolean);\n return (\n partes\n .slice(0, 2)\n .map((parte) => parte.charAt(0))\n .join('') || 'U'\n ).toUpperCase();\n }\n\n @HostListener('document:keydown.escape')\n protected cerrarConEscape(): void {\n this.panelNotificacionesAbierto = false;\n this.panelPerfilAbierto = false;\n }\n}\n","<header\n class=\"td-header\"\n [class.td-header--oscuro]=\"oscuro\"\n [class.td-header--fijo]=\"fijo\"\n>\n <div class=\"td-header__inicio\">\n @if (mostrarMenu) {\n <button\n class=\"td-header__boton td-header__menu\"\n type=\"button\"\n [attr.aria-label]=\"menuAbierto ? 'Cerrar sidebar' : 'Abrir sidebar'\"\n [attr.aria-expanded]=\"menuAbierto\"\n (click)=\"alternarMenu()\"\n >\n <td-icon [nombre]=\"menuAbierto ? 'close' : 'menu'\" />\n </button>\n }\n\n <ng-content select=\"[tdHeaderStart]\" />\n </div>\n\n <div class=\"td-header__centro\">\n <ng-content select=\"[tdHeaderCenter]\" />\n </div>\n\n <div class=\"td-header__acciones\">\n <ng-content select=\"[tdHeaderActions]\" />\n\n <div class=\"td-header__desplegable\">\n <button\n class=\"td-header__boton td-header__notificaciones\"\n type=\"button\"\n aria-label=\"Notificaciones\"\n [attr.aria-expanded]=\"panelNotificacionesAbierto\"\n (click)=\"alternarNotificaciones()\"\n >\n <td-icon nombre=\"notifications\" />\n @if (notificacionesNoLeidas() > 0) {\n <span>{{ notificacionesNoLeidas() > 99 ? '99+' : notificacionesNoLeidas() }}</span>\n }\n </button>\n\n @if (panelNotificacionesAbierto) {\n <section class=\"td-header__panel td-header__panel--notificaciones\">\n <header>\n <div>\n <strong>Notificaciones</strong>\n <small>{{ notificacionesNoLeidas() }} sin leer</small>\n </div>\n <td-icon nombre=\"notifications\" />\n </header>\n\n <div class=\"td-header__lista-notificaciones\">\n @for (notificacion of notificaciones; track notificacion.id) {\n <button\n type=\"button\"\n [class.td-header__notificacion--nueva]=\"!notificacion.leida\"\n (click)=\"seleccionarNotificacion(notificacion)\"\n >\n <span class=\"td-header__notificacion-icono\">\n <td-icon [nombre]=\"notificacion.icono || 'notifications'\" />\n </span>\n <span>\n <strong>{{ notificacion.titulo }}</strong>\n @if (notificacion.descripcion) {\n <small>{{ notificacion.descripcion }}</small>\n }\n @if (notificacion.fecha) {\n <time>{{ notificacion.fecha }}</time>\n }\n </span>\n </button>\n } @empty {\n <p class=\"td-header__vacio\">No tienes notificaciones.</p>\n }\n </div>\n\n @if (notificaciones.length) {\n <button\n class=\"td-header__ver-todas\"\n type=\"button\"\n (click)=\"verTodasNotificaciones.emit(); panelNotificacionesAbierto = false\"\n >\n Ver todas las notificaciones\n </button>\n }\n </section>\n }\n </div>\n\n @if (usuario) {\n <span class=\"td-header__separador\" aria-hidden=\"true\"></span>\n\n <div class=\"td-header__desplegable\">\n <button\n class=\"td-header__perfil\"\n type=\"button\"\n aria-label=\"Abrir perfil de usuario\"\n [attr.aria-expanded]=\"panelPerfilAbierto\"\n (click)=\"alternarPerfil()\"\n >\n <span class=\"td-header__avatar\">\n @if (avatarUrl) {\n <img [src]=\"avatarUrl\" [alt]=\"usuario\" />\n } @else {\n {{ inicialesUsuario() }}\n }\n </span>\n <span class=\"td-header__usuario\">\n <strong>{{ usuario }}</strong>\n @if (cargo) {\n <small>{{ cargo }}</small>\n }\n </span>\n <td-icon nombre=\"chevron_down\" tamano=\"0.85rem\" />\n </button>\n\n @if (panelPerfilAbierto) {\n <section class=\"td-header__panel td-header__panel--perfil\">\n <div class=\"td-header__perfil-resumen\">\n <span class=\"td-header__avatar td-header__avatar--grande\">{{ inicialesUsuario() }}</span>\n <div>\n <strong>{{ usuario }}</strong>\n <small>{{ cargo || 'Usuario' }}</small>\n </div>\n </div>\n <div class=\"td-header__perfil-opciones\">\n <button type=\"button\" (click)=\"emitirAccionPerfil('perfil')\">\n <td-icon nombre=\"person\" /> Mi perfil\n </button>\n <button type=\"button\" (click)=\"emitirAccionPerfil('configuracion')\">\n <td-icon nombre=\"settings\" /> Configuración\n </button>\n <button class=\"td-header__salir\" type=\"button\" (click)=\"emitirAccionPerfil('salir')\">\n <td-icon nombre=\"close\" /> Cerrar sesión\n </button>\n </div>\n </section>\n }\n </div>\n }\n </div>\n</header>\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n forwardRef,\n inject,\n Input,\n Output,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { TdIcon } from '../iconos';\n\nlet inputSequence = 0;\n\n@Component({\n selector: 'td-input',\n imports: [TdIcon],\n template: `\n <div\n class=\"td-input\"\n [class.td-input--focused]=\"focused\"\n [class.td-input--error]=\"!!error\"\n [class.td-input--disabled]=\"disabled\"\n [class.td-input--dark]=\"dark\"\n >\n <label [for]=\"inputId\">{{ label }}</label>\n\n <div class=\"td-input__control\">\n @if (icon) {\n <td-icon class=\"td-input__icon\" [nombre]=\"icon\" />\n }\n\n <input\n [id]=\"inputId\"\n [name]=\"name\"\n [type]=\"resolvedType\"\n [value]=\"value\"\n [placeholder]=\"placeholder\"\n [autocomplete]=\"autocomplete\"\n [disabled]=\"disabled\"\n [readonly]=\"readonly\"\n [required]=\"required\"\n [min]=\"min\"\n [max]=\"max\"\n [step]=\"step\"\n [attr.minlength]=\"minlength\"\n [attr.maxlength]=\"maxlength\"\n [attr.aria-describedby]=\"descriptionId\"\n [attr.aria-invalid]=\"!!error\"\n (input)=\"handleInput($event)\"\n (focus)=\"focused = true\"\n (blur)=\"handleBlur()\"\n />\n\n @if (clearable && value && !disabled && !readonly) {\n <button type=\"button\" class=\"td-input__action\" title=\"Limpiar\" (click)=\"clear()\">\n <td-icon nombre=\"close\" tamano=\".95rem\" />\n </button>\n }\n\n @if (type === 'password') {\n <button\n type=\"button\"\n class=\"td-input__action\"\n [title]=\"passwordVisible ? 'Ocultar contraseña' : 'Mostrar contraseña'\"\n (click)=\"passwordVisible = !passwordVisible\"\n >\n <td-icon [nombre]=\"passwordVisible ? 'visibility_off' : 'visibility'\" />\n </button>\n }\n </div>\n </div>\n\n @if (error || hint) {\n <p\n class=\"td-input__message\"\n [class.td-input__message--error]=\"!!error\"\n [id]=\"descriptionId\"\n >\n {{ error || hint }}\n </p>\n }\n `,\n styleUrl: './td-input.scss',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => TdInput),\n multi: true,\n },\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TdInput implements ControlValueAccessor {\n private readonly cdr = inject(ChangeDetectorRef);\n private readonly generatedId = `td-input-${++inputSequence}`;\n\n @Input() id = '';\n @Input() name = '';\n @Input() label = 'Campo';\n @Input() type: 'text' | 'email' | 'password' | 'number' | 'tel' | 'url' | 'search' | 'date' | 'time' = 'text';\n @Input() placeholder = '';\n @Input() autocomplete = 'off';\n @Input() icon = '';\n @Input() hint = '';\n @Input() error = '';\n @Input() readonly = false;\n @Input() disabled = false;\n @Input() required = false;\n @Input() clearable = false;\n @Input() dark = false;\n @Input() min: string | number | null = null;\n @Input() max: string | number | null = null;\n @Input() step: string | number | null = null;\n @Input() minlength: number | null = null;\n @Input() maxlength: number | null = null;\n\n @Output() readonly valueChange = new EventEmitter<string>();\n\n @Input() value = '';\n protected focused = false;\n protected passwordVisible = false;\n\n protected get inputId(): string {\n return this.id || this.generatedId;\n }\n\n protected get descriptionId(): string | null {\n return this.error || this.hint ? `${this.inputId}-description` : null;\n }\n\n protected get resolvedType(): string {\n return this.type === 'password' && this.passwordVisible ? 'text' : this.type;\n }\n\n private onChange: (value: string) => void = () => undefined;\n private onTouched: () => void = () => undefined;\n\n writeValue(value: unknown): void {\n this.value = value === null || value === undefined ? '' : String(value);\n this.cdr.markForCheck();\n }\n\n registerOnChange(fn: (value: string) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(disabled: boolean): void {\n this.disabled = disabled;\n this.cdr.markForCheck();\n }\n\n protected handleInput(event: Event): void {\n this.setValue((event.target as HTMLInputElement).value);\n }\n\n protected handleBlur(): void {\n this.focused = false;\n this.onTouched();\n }\n\n protected clear(): void {\n this.setValue('');\n }\n\n private setValue(value: string): void {\n this.value = value;\n this.onChange(value);\n this.valueChange.emit(value);\n }\n}\n","import {\n CdkConnectedOverlay,\n CdkOverlayOrigin,\n ScrollStrategy,\n ScrollStrategyOptions,\n} from '@angular/cdk/overlay';\nimport { DOCUMENT } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n DestroyRef,\n ElementRef,\n EventEmitter,\n forwardRef,\n inject,\n Input,\n Output,\n ViewChild,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { TdIcon } from '../iconos';\nimport { TdSelectOption, TdSelectScrollBehavior } from './td-select.model';\n\nlet autocompleteSequence = 0;\n\n@Component({\n selector: 'td-autocomplete-select',\n imports: [CdkConnectedOverlay, CdkOverlayOrigin, TdIcon],\n template: `\n <div\n cdkOverlayOrigin\n #origin=\"cdkOverlayOrigin\"\n class=\"td-select td-select--autocomplete\"\n [class.td-select--open]=\"open\"\n [class.td-select--error]=\"!!error\"\n [class.td-select--disabled]=\"disabled\"\n [class.td-select--dark]=\"dark\"\n >\n <label [for]=\"inputId\">{{ label }}</label>\n <div class=\"td-select__trigger\">\n <td-icon class=\"td-select__leading\" nombre=\"search\" />\n <input\n #searchInput\n [id]=\"inputId\"\n type=\"search\"\n autocomplete=\"off\"\n role=\"combobox\"\n [value]=\"search\"\n [placeholder]=\"placeholder\"\n [disabled]=\"disabled\"\n [attr.aria-expanded]=\"open\"\n [attr.aria-controls]=\"listId\"\n (focus)=\"openPanel()\"\n (input)=\"handleInput($event)\"\n (keydown)=\"handleKeydown($event)\"\n (blur)=\"onTouched()\"\n />\n @if (clearable && (value !== null || search) && !disabled) {\n <button type=\"button\" class=\"td-select__clear\" title=\"Limpiar\" (click)=\"clear($event)\">\n <td-icon nombre=\"close\" tamano=\".95rem\" />\n </button>\n }\n <td-icon\n class=\"td-select__chevron\"\n [class.td-select__chevron--open]=\"open\"\n nombre=\"chevron_down\"\n />\n </div>\n </div>\n\n @if (error || hint) {\n <p class=\"td-select__message\" [class.td-select__message--error]=\"!!error\">\n {{ error || hint }}\n </p>\n }\n\n <ng-template\n cdkConnectedOverlay\n #connectedOverlay=\"cdkConnectedOverlay\"\n [cdkConnectedOverlayOrigin]=\"origin\"\n [cdkConnectedOverlayOpen]=\"open\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n [cdkConnectedOverlayMatchWidth]=\"true\"\n [cdkConnectedOverlayViewportMargin]=\"8\"\n [cdkConnectedOverlayPush]=\"true\"\n (overlayOutsideClick)=\"close()\"\n (overlayKeydown)=\"handleKeydown($event)\"\n (detach)=\"close()\"\n >\n <div\n class=\"td-select-panel\"\n [class.td-select-panel--dark]=\"dark\"\n [id]=\"listId\"\n role=\"listbox\"\n >\n @if (!filteredOptions.length) {\n <p class=\"td-select-panel__empty\">{{ emptyText }}</p>\n }\n @for (option of filteredOptions; track option.value; let index = $index) {\n <button\n type=\"button\"\n role=\"option\"\n [class.td-select-panel__option--active]=\"index === activeIndex\"\n [class.td-select-panel__option--selected]=\"compare(option.value, value)\"\n [disabled]=\"option.disabled\"\n (mousedown)=\"$event.preventDefault()\"\n (mouseenter)=\"activeIndex = index\"\n (click)=\"select(option)\"\n >\n @if (option.icon) {\n <td-icon [nombre]=\"option.icon\" />\n }\n <span>\n <strong>{{ option.label }}</strong>\n @if (option.description) {\n <small>{{ option.description }}</small>\n }\n </span>\n @if (compare(option.value, value)) {\n <td-icon class=\"td-select-panel__check\" nombre=\"check\" />\n }\n </button>\n }\n </div>\n </ng-template>\n `,\n styleUrl: './td-select.scss',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => TdAutocompleteSelect),\n multi: true,\n },\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TdAutocompleteSelect<T = unknown> implements ControlValueAccessor {\n private readonly cdr = inject(ChangeDetectorRef);\n private readonly document = inject(DOCUMENT);\n private readonly destroyRef = inject(DestroyRef);\n private readonly scrollStrategies = inject(ScrollStrategyOptions);\n private readonly generatedId = `td-autocomplete-${++autocompleteSequence}`;\n\n @ViewChild('searchInput') private searchInput?: ElementRef<HTMLInputElement>;\n @ViewChild(CdkConnectedOverlay) private connectedOverlay?: CdkConnectedOverlay;\n\n @Input() label = 'Buscar y seleccionar';\n @Input() placeholder = 'Escribe para buscar...';\n @Input() options: TdSelectOption<T>[] = [];\n @Input() hint = '';\n @Input() error = '';\n @Input() emptyText = 'No se encontraron resultados';\n @Input() clearable = true;\n @Input() dark = false;\n @Input() disabled = false;\n @Input() scrollBehavior: TdSelectScrollBehavior = 'reposition';\n @Input() minimumCharacters = 0;\n @Input() filterWith: (option: TdSelectOption<T>, search: string) => boolean =\n (option, search) =>\n `${option.label} ${option.description ?? ''}`.toLocaleLowerCase().includes(search);\n @Input() compareWith: (first: T | null, second: T | null) => boolean =\n (first, second) => Object.is(first, second);\n\n @Output() readonly selectionChange = new EventEmitter<T | null>();\n @Output() readonly searchChange = new EventEmitter<string>();\n\n protected value: T | null = null;\n protected search = '';\n protected open = false;\n protected activeIndex = -1;\n protected readonly scrollStrategy: ScrollStrategy = this.scrollStrategies.reposition();\n\n protected get inputId(): string {\n return `${this.generatedId}-input`;\n }\n\n protected get listId(): string {\n return `${this.generatedId}-list`;\n }\n\n protected get filteredOptions(): TdSelectOption<T>[] {\n const normalized = this.search.trim().toLocaleLowerCase();\n if (normalized.length < this.minimumCharacters) return [];\n return this.options.filter((option) => this.filterWith(option, normalized));\n }\n\n protected readonly onTouched = (): void => {\n this.touched();\n };\n\n private changed: (value: T | null) => void = () => undefined;\n private touched: () => void = () => undefined;\n\n constructor() {\n const scrollListener = (event: Event): void => {\n const target = event.target;\n if (target instanceof Element && target.closest('.td-select-panel')) return;\n if (this.open) {\n if (this.scrollBehavior === 'close') {\n this.close();\n } else {\n this.connectedOverlay?.overlayRef.updatePosition();\n }\n this.cdr.markForCheck();\n }\n };\n\n this.document.addEventListener('scroll', scrollListener, true);\n this.destroyRef.onDestroy(() =>\n this.document.removeEventListener('scroll', scrollListener, true)\n );\n }\n\n writeValue(value: T | null): void {\n this.value = value ?? null;\n this.search = this.options.find((option) => this.compare(option.value, this.value))?.label ?? '';\n this.cdr.markForCheck();\n }\n\n registerOnChange(fn: (value: T | null) => void): void {\n this.changed = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.touched = fn;\n }\n\n setDisabledState(disabled: boolean): void {\n this.disabled = disabled;\n this.cdr.markForCheck();\n }\n\n protected compare(first: T | null, second: T | null): boolean {\n return this.compareWith(first, second);\n }\n\n protected openPanel(): void {\n if (this.disabled) return;\n this.open = true;\n this.activeIndex = this.firstEnabledIndex();\n }\n\n protected close(): void {\n this.open = false;\n const selected = this.options.find((option) => this.compare(option.value, this.value));\n if (selected) this.search = selected.label;\n this.touched();\n }\n\n protected handleInput(event: Event): void {\n this.search = (event.target as HTMLInputElement).value;\n this.value = null;\n this.changed(null);\n this.searchChange.emit(this.search);\n this.openPanel();\n this.activeIndex = this.firstEnabledIndex();\n }\n\n protected select(option: TdSelectOption<T>): void {\n if (option.disabled) return;\n this.value = option.value;\n this.search = option.label;\n this.changed(option.value);\n this.selectionChange.emit(option.value);\n this.close();\n }\n\n protected clear(event: MouseEvent): void {\n event.stopPropagation();\n this.value = null;\n this.search = '';\n this.changed(null);\n this.selectionChange.emit(null);\n this.searchChange.emit('');\n this.openPanel();\n queueMicrotask(() => this.searchInput?.nativeElement.focus());\n }\n\n protected handleKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n event.preventDefault();\n this.close();\n } else if (event.key === 'ArrowDown') {\n event.preventDefault();\n this.openPanel();\n this.moveActive(1);\n } else if (event.key === 'ArrowUp') {\n event.preventDefault();\n this.openPanel();\n this.moveActive(-1);\n } else if (event.key === 'Enter' && this.open && this.activeIndex >= 0) {\n event.preventDefault();\n const option = this.filteredOptions[this.activeIndex];\n if (option) this.select(option);\n }\n }\n\n private moveActive(direction: number): void {\n const options = this.filteredOptions;\n if (!options.length) return;\n let next = this.activeIndex;\n for (let index = 0; index < options.length; index++) {\n next = (next + direction + options.length) % options.length;\n if (!options[next]?.disabled) {\n this.activeIndex = next;\n return;\n }\n }\n }\n\n private firstEnabledIndex(): number {\n return this.filteredOptions.findIndex((option) => !option.disabled);\n }\n}\n","import {\n CdkConnectedOverlay,\n CdkOverlayOrigin,\n ScrollStrategy,\n ScrollStrategyOptions,\n} from '@angular/cdk/overlay';\nimport { DOCUMENT } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n DestroyRef,\n EventEmitter,\n forwardRef,\n inject,\n Input,\n Output,\n ViewChild,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { TdIcon } from '../iconos';\nimport { TdSelectOption, TdSelectScrollBehavior } from './td-select.model';\n\nlet selectSequence = 0;\n\n@Component({\n selector: 'td-select',\n imports: [CdkConnectedOverlay, CdkOverlayOrigin, TdIcon],\n template: `\n <div\n cdkOverlayOrigin\n #origin=\"cdkOverlayOrigin\"\n class=\"td-select\"\n [class.td-select--open]=\"open\"\n [class.td-select--error]=\"!!error\"\n [class.td-select--disabled]=\"disabled\"\n [class.td-select--dark]=\"dark\"\n >\n <label [id]=\"labelId\">{{ label }}</label>\n <div\n class=\"td-select__trigger\"\n role=\"combobox\"\n [attr.tabindex]=\"disabled ? -1 : 0\"\n [attr.aria-disabled]=\"disabled\"\n [attr.aria-labelledby]=\"labelId\"\n [attr.aria-expanded]=\"open\"\n [attr.aria-controls]=\"listId\"\n (click)=\"toggle()\"\n (keydown)=\"handleKeydown($event)\"\n >\n @if (selectedOption?.icon) {\n <td-icon class=\"td-select__leading\" [nombre]=\"selectedOption!.icon!\" />\n }\n <span [class.td-select__placeholder]=\"!selectedOption\">\n {{ selectedOption?.label || placeholder }}\n </span>\n @if (clearable && selectedOption && !disabled) {\n <button\n type=\"button\"\n class=\"td-select__clear\"\n title=\"Limpiar selección\"\n (click)=\"clear($event)\"\n >\n <td-icon nombre=\"close\" tamano=\".95rem\" />\n </button>\n }\n <td-icon\n class=\"td-select__chevron\"\n [class.td-select__chevron--open]=\"open\"\n nombre=\"chevron_down\"\n />\n </div>\n </div>\n\n @if (error || hint) {\n <p class=\"td-select__message\" [class.td-select__message--error]=\"!!error\">\n {{ error || hint }}\n </p>\n }\n\n <ng-template\n cdkConnectedOverlay\n #connectedOverlay=\"cdkConnectedOverlay\"\n [cdkConnectedOverlayOrigin]=\"origin\"\n [cdkConnectedOverlayOpen]=\"open\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n [cdkConnectedOverlayMatchWidth]=\"true\"\n [cdkConnectedOverlayViewportMargin]=\"8\"\n [cdkConnectedOverlayPush]=\"true\"\n (overlayOutsideClick)=\"close()\"\n (overlayKeydown)=\"handleOverlayKeydown($event)\"\n (detach)=\"close()\"\n >\n <div\n class=\"td-select-panel\"\n [class.td-select-panel--dark]=\"dark\"\n [id]=\"listId\"\n role=\"listbox\"\n >\n @if (!options.length) {\n <p class=\"td-select-panel__empty\">{{ emptyText }}</p>\n }\n @for (option of options; track option.value; let index = $index) {\n <button\n type=\"button\"\n role=\"option\"\n [class.td-select-panel__option--active]=\"index === activeIndex\"\n [class.td-select-panel__option--selected]=\"compare(option.value, value)\"\n [attr.aria-selected]=\"compare(option.value, value)\"\n [disabled]=\"option.disabled\"\n (mouseenter)=\"activeIndex = index\"\n (click)=\"select(option)\"\n >\n @if (option.icon) {\n <td-icon [nombre]=\"option.icon\" />\n }\n <span>\n <strong>{{ option.label }}</strong>\n @if (option.description) {\n <small>{{ option.description }}</small>\n }\n </span>\n @if (compare(option.value, value)) {\n <td-icon class=\"td-select-panel__check\" nombre=\"check\" />\n }\n </button>\n }\n </div>\n </ng-template>\n `,\n styleUrl: './td-select.scss',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => TdSelect),\n multi: true,\n },\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TdSelect<T = unknown> implements ControlValueAccessor {\n private readonly cdr = inject(ChangeDetectorRef);\n private readonly document = inject(DOCUMENT);\n private readonly destroyRef = inject(DestroyRef);\n private readonly scrollStrategies = inject(ScrollStrategyOptions);\n private readonly generatedId = `td-select-${++selectSequence}`;\n\n @ViewChild(CdkConnectedOverlay) private connectedOverlay?: CdkConnectedOverlay;\n\n @Input() label = 'Seleccionar';\n @Input() placeholder = 'Selecciona una opción';\n @Input() options: TdSelectOption<T>[] = [];\n @Input() hint = '';\n @Input() error = '';\n @Input() emptyText = 'No hay opciones disponibles';\n @Input() clearable = false;\n @Input() dark = false;\n @Input() disabled = false;\n @Input() scrollBehavior: TdSelectScrollBehavior = 'reposition';\n @Input() compareWith: (first: T | null, second: T | null) => boolean =\n (first, second) => Object.is(first, second);\n\n @Output() readonly selectionChange = new EventEmitter<T | null>();\n\n protected value: T | null = null;\n protected open = false;\n protected activeIndex = -1;\n protected readonly scrollStrategy: ScrollStrategy = this.scrollStrategies.reposition();\n\n protected get labelId(): string {\n return `${this.generatedId}-label`;\n }\n\n protected get listId(): string {\n return `${this.generatedId}-list`;\n }\n\n protected get selectedOption(): TdSelectOption<T> | undefined {\n return this.options.find((option) => this.compare(option.value, this.value));\n }\n\n private onChange: (value: T | null) => void = () => undefined;\n private onTouched: () => void = () => undefined;\n\n constructor() {\n const scrollListener = (event: Event): void => {\n const target = event.target;\n if (target instanceof Element && target.closest('.td-select-panel')) return;\n if (this.open) {\n if (this.scrollBehavior === 'close') {\n this.close();\n } else {\n this.connectedOverlay?.overlayRef.updatePosition();\n }\n this.cdr.markForCheck();\n }\n };\n\n this.document.addEventListener('scroll', scrollListener, true);\n this.destroyRef.onDestroy(() =>\n this.document.removeEventListener('scroll', scrollListener, true)\n );\n }\n\n writeValue(value: T | null): void {\n this.value = value ?? null;\n this.cdr.markForCheck();\n }\n\n registerOnChange(fn: (value: T | null) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(disabled: boolean): void {\n this.disabled = disabled;\n this.cdr.markForCheck();\n }\n\n protected compare(first: T | null, second: T | null): boolean {\n return this.compareWith(first, second);\n }\n\n protected toggle(): void {\n if (this.disabled) return;\n this.open ? this.close() : this.openPanel();\n }\n\n protected close(): void {\n if (!this.open) return;\n this.open = false;\n this.onTouched();\n }\n\n protected select(option: TdSelectOption<T>): void {\n if (option.disabled) return;\n this.setValue(option.value);\n this.close();\n }\n\n protected clear(event: MouseEvent): void {\n event.stopPropagation();\n this.setValue(null);\n }\n\n protected handleKeydown(event: KeyboardEvent): void {\n if (event.key === 'ArrowDown' || event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.openPanel();\n }\n }\n\n protected handleOverlayKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n event.preventDefault();\n this.close();\n return;\n }\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n this.moveActive(1);\n } else if (event.key === 'ArrowUp') {\n event.preventDefault();\n this.moveActive(-1);\n } else if (event.key === 'Enter' && this.activeIndex >= 0) {\n event.preventDefault();\n const option = this.options[this.activeIndex];\n if (option) this.select(option);\n }\n }\n\n private openPanel(): void {\n this.open = true;\n const selectedIndex = this.options.findIndex((option) =>\n this.compare(option.value, this.value)\n );\n this.activeIndex = selectedIndex >= 0 ? selectedIndex : this.firstEnabledIndex();\n }\n\n private moveActive(direction: number): void {\n if (!this.options.length) return;\n let next = this.activeIndex;\n for (let index = 0; index < this.options.length; index++) {\n next = (next + direction + this.options.length) % this.options.length;\n if (!this.options[next]?.disabled) {\n this.activeIndex = next;\n return;\n }\n }\n }\n\n private firstEnabledIndex(): number {\n return this.options.findIndex((option) => !option.disabled);\n }\n\n private setValue(value: T | null): void {\n this.value = value;\n this.onChange(value);\n this.selectionChange.emit(value);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n Output,\n signal,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { RouterLink, RouterLinkActive } from '@angular/router';\nimport { TdIcon } from '../iconos';\nimport { MenuSidebar, TdSidebarSeleccion } from './menu-sidebar';\n\nexport type TdSidebarModoCerrado = 'compacto' | 'oculto';\n\n@Component({\n selector: 'td-sidebar',\n imports: [NgTemplateOutlet, RouterLink, RouterLinkActive, TdIcon],\n templateUrl: './td-sidebar.html',\n styleUrl: './td-sidebar.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TdSidebar {\n @Input() titulo = 'Gestión Corporativa';\n @Input() subtitulo = 'Central Platform';\n @Input() etiquetaNavegacion = 'Navegación';\n @Input() logoUrl = '';\n @Input() logoAlt = 'Logo';\n @Input() textoCarga = 'Cargando menú...';\n @Input() mensajeVacio = 'No hay opciones disponibles.';\n @Input() error = '';\n @Input() cargando = false;\n @Input() oscuro = false;\n @Input() modoCerrado: TdSidebarModoCerrado = 'compacto';\n\n @Input()\n set abierto(value: boolean) {\n this.abiertoInterno.set(value);\n }\n get abierto(): boolean {\n return this.abiertoInterno();\n }\n\n @Input()\n set menu(value: MenuSidebar[] | null | undefined) {\n this.menuNormalizado.set(this.normalizarMenu(value ?? []));\n }\n get menu(): MenuSidebar[] {\n return this.menuNormalizado();\n }\n\n @Output() readonly abiertoChange = new EventEmitter<boolean>();\n @Output() readonly seleccionar = new EventEmitter<TdSidebarSeleccion>();\n\n protected readonly abiertoInterno = signal(true);\n protected readonly menuNormalizado = signal<MenuSidebar[]>([]);\n protected readonly expandidos = signal<ReadonlySet<string>>(new Set<string>());\n\n protected alternarGrupo(clave: string): void {\n if (!this.abiertoInterno()) {\n this.abiertoInterno.set(true);\n this.abiertoChange.emit(true);\n }\n\n this.expandidos.update((actuales) => {\n const siguientes = new Set(actuales);\n siguientes.has(clave) ? siguientes.delete(clave) : siguientes.add(clave);\n return siguientes;\n });\n }\n\n protected estaExpandido(clave: string): boolean {\n return this.expandidos().has(clave);\n }\n\n protected seleccionarItem(item: MenuSidebar, nivel: number): void {\n this.seleccionar.emit({ item, nivel });\n }\n\n protected claveItem(item: MenuSidebar, padre: string, indice: number): string {\n return `${padre}/${item.nombre}-${indice}`;\n }\n\n protected inicialMarca(): string {\n return (this.titulo.trim().charAt(0) || 'T').toUpperCase();\n }\n\n private normalizarMenu(items: MenuSidebar[]): MenuSidebar[] {\n return [...items]\n .sort((a, b) => a.orden - b.orden)\n .map((item) => ({\n ...item,\n icono: item.icono?.trim() || 'folder',\n subMenus: this.normalizarMenu(item.subMenus ?? []),\n }));\n }\n}\n","<aside\n class=\"td-sidebar\"\n [class.td-sidebar--compacto]=\"!abiertoInterno() && modoCerrado === 'compacto'\"\n [class.td-sidebar--oculto]=\"!abiertoInterno() && modoCerrado === 'oculto'\"\n [class.td-sidebar--oscuro]=\"oscuro\"\n [attr.aria-hidden]=\"!abiertoInterno() && modoCerrado === 'oculto'\"\n>\n <header class=\"td-sidebar__marca\">\n <div class=\"td-sidebar__logo\">\n @if (logoUrl) {\n <img [src]=\"logoUrl\" [alt]=\"logoAlt\" />\n } @else {\n <span>{{ inicialMarca() }}</span>\n }\n </div>\n\n @if (abiertoInterno()) {\n <div class=\"td-sidebar__marca-texto\">\n <small>{{ subtitulo }}</small>\n <strong>{{ titulo }}</strong>\n </div>\n }\n\n </header>\n\n <div class=\"td-sidebar__encabezado\">\n @if (abiertoInterno()) {\n <span>{{ etiquetaNavegacion }}</span>\n } @else {\n <span aria-hidden=\"true\">•••</span>\n }\n </div>\n\n <nav class=\"td-sidebar__nav\" aria-label=\"Menú principal\">\n @if (cargando) {\n <p class=\"td-sidebar__estado\">{{ textoCarga }}</p>\n } @else if (error) {\n <p class=\"td-sidebar__estado td-sidebar__estado--error\">{{ error }}</p>\n } @else if (!menuNormalizado().length) {\n <p class=\"td-sidebar__estado\">{{ mensajeVacio }}</p>\n } @else {\n <ng-container\n [ngTemplateOutlet]=\"listaMenu\"\n [ngTemplateOutletContext]=\"{ items: menuNormalizado(), nivel: 0, padre: 'raiz' }\"\n />\n }\n </nav>\n</aside>\n\n<ng-template #listaMenu let-items=\"items\" let-nivel=\"nivel\" let-padre=\"padre\">\n <ul class=\"td-sidebar__lista\" [class.td-sidebar__lista--anidada]=\"nivel > 0\">\n @for (item of items; track item) {\n @let clave = claveItem(item, padre, $index);\n @let tieneHijos = item.subMenus.length > 0;\n\n <li class=\"td-sidebar__item\">\n @if (tieneHijos) {\n <button\n class=\"td-sidebar__enlace\"\n type=\"button\"\n [class.td-sidebar__enlace--activo]=\"estaExpandido(clave)\"\n [attr.aria-expanded]=\"estaExpandido(clave)\"\n [attr.title]=\"!abiertoInterno() ? item.nombre : null\"\n (click)=\"alternarGrupo(clave)\"\n >\n <td-icon class=\"td-sidebar__icono\" [nombre]=\"item.icono || 'folder'\" />\n @if (abiertoInterno()) {\n <span>{{ item.nombre }}</span>\n <td-icon\n class=\"td-sidebar__flecha\"\n [class.td-sidebar__flecha--abierta]=\"estaExpandido(clave)\"\n nombre=\"chevron_right\"\n />\n }\n </button>\n } @else {\n <a\n class=\"td-sidebar__enlace\"\n [routerLink]=\"item.ruta || '/'\"\n routerLinkActive=\"td-sidebar__enlace--ruta-activa\"\n [routerLinkActiveOptions]=\"{ exact: item.ruta === '/' }\"\n [attr.title]=\"!abiertoInterno() ? item.nombre : null\"\n (click)=\"seleccionarItem(item, nivel)\"\n >\n <td-icon class=\"td-sidebar__icono\" [nombre]=\"item.icono || 'folder'\" />\n @if (abiertoInterno()) {\n <span>{{ item.nombre }}</span>\n }\n </a>\n }\n\n @if (abiertoInterno() && tieneHijos && estaExpandido(clave)) {\n <ng-container\n [ngTemplateOutlet]=\"listaMenu\"\n [ngTemplateOutletContext]=\"{\n items: item.subMenus,\n nivel: nivel + 1,\n padre: clave\n }\"\n />\n }\n </li>\n }\n </ul>\n</ng-template>\n","/*\n * Public API Surface of telcomdev-ui\n */\n\nexport * from './lib/telcomdev-ui';\nexport * from './lib/alerta';\nexport * from './lib/data-table';\nexport * from './lib/dialog';\nexport * from './lib/footer';\nexport * from './lib/header';\nexport * from './lib/iconos';\nexport * from './lib/input';\nexport * from './lib/select';\nexport * from './lib/sidebar';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@telcomdev/ui",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.5",
|
|
4
4
|
"description": "Librería UI reutilizable para los sistemas TelcomDev.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"angular",
|
|
@@ -12,7 +12,10 @@
|
|
|
12
12
|
"header",
|
|
13
13
|
"footer",
|
|
14
14
|
"icons",
|
|
15
|
+
"input",
|
|
16
|
+
"select",
|
|
15
17
|
"data-table",
|
|
18
|
+
"dialog",
|
|
16
19
|
"virtual-scroll"
|
|
17
20
|
],
|
|
18
21
|
"author": "TelcomDev",
|
|
@@ -21,7 +24,8 @@
|
|
|
21
24
|
"@angular/cdk": "^21.2.0",
|
|
22
25
|
"@angular/common": "^21.2.0",
|
|
23
26
|
"@angular/core": "^21.2.0",
|
|
24
|
-
"@angular/router": "^21.2.0"
|
|
27
|
+
"@angular/router": "^21.2.0",
|
|
28
|
+
"rxjs": "~7.8.0"
|
|
25
29
|
},
|
|
26
30
|
"dependencies": {
|
|
27
31
|
"tslib": "^2.3.0"
|