@telcomdev/ui 0.0.1
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 +54 -0
- package/fesm2022/telcomdev-ui.mjs +490 -0
- package/fesm2022/telcomdev-ui.mjs.map +1 -0
- package/package.json +36 -0
- package/types/telcomdev-ui.d.ts +79 -0
package/README.md
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# Telcomdev UI
|
|
2
|
+
|
|
3
|
+
## Sidebar
|
|
4
|
+
|
|
5
|
+
`TdSidebar` es standalone y no depende de Angular Material ni Tailwind.
|
|
6
|
+
|
|
7
|
+
```ts
|
|
8
|
+
import { MenuSidebar, TdSidebar } from 'telcomdev-ui';
|
|
9
|
+
|
|
10
|
+
@Component({
|
|
11
|
+
imports: [TdSidebar],
|
|
12
|
+
})
|
|
13
|
+
export class App {
|
|
14
|
+
abierto = true;
|
|
15
|
+
oscuro = false;
|
|
16
|
+
|
|
17
|
+
menu: MenuSidebar[] = [
|
|
18
|
+
{
|
|
19
|
+
nombre: 'Inicio',
|
|
20
|
+
ruta: '/',
|
|
21
|
+
icono: 'home',
|
|
22
|
+
orden: 1,
|
|
23
|
+
subMenus: [],
|
|
24
|
+
},
|
|
25
|
+
];
|
|
26
|
+
}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
```html
|
|
30
|
+
<td-sidebar
|
|
31
|
+
titulo="Gestión Corporativa"
|
|
32
|
+
subtitulo="Central Platform"
|
|
33
|
+
[menu]="menu"
|
|
34
|
+
[(abierto)]="abierto"
|
|
35
|
+
[oscuro]="oscuro"
|
|
36
|
+
[cargando]="false"
|
|
37
|
+
error=""
|
|
38
|
+
(seleccionar)="onSeleccionar($event)"
|
|
39
|
+
/>
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
La aplicación consumidora obtiene el menú desde su propia API. El componente ordena cada
|
|
43
|
+
nivel por `orden`, usa `folder` cuando no recibe icono y renderiza los submenús
|
|
44
|
+
recursivamente.
|
|
45
|
+
|
|
46
|
+
Iconos incluidos: `home`, `dashboard`, `folder`, `settings`, `people`, `person`,
|
|
47
|
+
`security`, `inventory`, `shopping_cart`, `receipt`, `assessment`, `description` y
|
|
48
|
+
`business`.
|
|
49
|
+
|
|
50
|
+
## Build
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
ng build telcomdev-ui
|
|
54
|
+
```
|
|
@@ -0,0 +1,490 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { Component, EventEmitter, signal, Output, Input, ChangeDetectionStrategy } from '@angular/core';
|
|
3
|
+
import { NgTemplateOutlet } from '@angular/common';
|
|
4
|
+
import { RouterLink, RouterLinkActive } from '@angular/router';
|
|
5
|
+
|
|
6
|
+
class TelcomdevUi {
|
|
7
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TelcomdevUi, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
8
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.17", type: TelcomdevUi, isStandalone: true, selector: "td-telcomdev-ui", ngImport: i0, template: ` <p>telcomdev-ui works!</p> `, isInline: true, styles: [""] });
|
|
9
|
+
}
|
|
10
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TelcomdevUi, decorators: [{
|
|
11
|
+
type: Component,
|
|
12
|
+
args: [{ selector: 'td-telcomdev-ui', imports: [], template: ` <p>telcomdev-ui works!</p> ` }]
|
|
13
|
+
}] });
|
|
14
|
+
|
|
15
|
+
class TdAlerta {
|
|
16
|
+
static estiloId = 'td-alerta-estilos';
|
|
17
|
+
static exito(mensaje, titulo = '¡Operación exitosa!') {
|
|
18
|
+
return this.mostrar({
|
|
19
|
+
titulo,
|
|
20
|
+
mensaje,
|
|
21
|
+
tipo: 'exito',
|
|
22
|
+
textoConfirmar: 'Aceptar',
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
static error(mensaje, titulo = '¡Error!') {
|
|
26
|
+
return this.mostrar({
|
|
27
|
+
titulo,
|
|
28
|
+
mensaje,
|
|
29
|
+
tipo: 'error',
|
|
30
|
+
textoConfirmar: 'Cerrar',
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
static errorSistema(mensaje, titulo = '¡Error de Sistema!') {
|
|
34
|
+
return this.mostrar({
|
|
35
|
+
titulo,
|
|
36
|
+
mensaje,
|
|
37
|
+
tipo: 'error',
|
|
38
|
+
textoConfirmar: 'Cerrar',
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
static advertencia(mensaje, titulo = '¡Advertencia!') {
|
|
42
|
+
return this.mostrar({
|
|
43
|
+
titulo,
|
|
44
|
+
mensaje,
|
|
45
|
+
tipo: 'advertencia',
|
|
46
|
+
textoConfirmar: 'Aceptar',
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
static info(mensaje, titulo = 'Información') {
|
|
50
|
+
return this.mostrar({
|
|
51
|
+
titulo,
|
|
52
|
+
mensaje,
|
|
53
|
+
tipo: 'info',
|
|
54
|
+
textoConfirmar: 'Aceptar',
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
static confirmar(mensaje, titulo = '¿Estás seguro?', textoConfirmar = 'Sí, continuar', textoCancelar = 'Cancelar') {
|
|
58
|
+
return this.mostrar({
|
|
59
|
+
titulo,
|
|
60
|
+
mensaje,
|
|
61
|
+
tipo: 'pregunta',
|
|
62
|
+
textoConfirmar,
|
|
63
|
+
textoCancelar,
|
|
64
|
+
mostrarCancelar: true,
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
static confirmarEliminar(mensaje = 'Esta acción no se puede deshacer.', titulo = '¿Eliminar registro?') {
|
|
68
|
+
return this.mostrar({
|
|
69
|
+
titulo,
|
|
70
|
+
mensaje,
|
|
71
|
+
tipo: 'advertencia',
|
|
72
|
+
textoConfirmar: 'Sí, eliminar',
|
|
73
|
+
textoCancelar: 'Cancelar',
|
|
74
|
+
mostrarCancelar: true,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
static mostrar(opciones) {
|
|
78
|
+
if (typeof document === 'undefined') {
|
|
79
|
+
return Promise.resolve(false);
|
|
80
|
+
}
|
|
81
|
+
this.inyectarEstilos();
|
|
82
|
+
const config = {
|
|
83
|
+
titulo: opciones.titulo ?? '',
|
|
84
|
+
mensaje: opciones.mensaje ?? '',
|
|
85
|
+
tipo: opciones.tipo ?? 'info',
|
|
86
|
+
textoConfirmar: opciones.textoConfirmar ?? 'Aceptar',
|
|
87
|
+
textoCancelar: opciones.textoCancelar ?? 'Cancelar',
|
|
88
|
+
mostrarCancelar: opciones.mostrarCancelar ?? false,
|
|
89
|
+
cerrarConEscape: opciones.cerrarConEscape ?? true,
|
|
90
|
+
cerrarConFondo: opciones.cerrarConFondo ?? false,
|
|
91
|
+
};
|
|
92
|
+
return new Promise((resolve) => {
|
|
93
|
+
const fondo = document.createElement('div');
|
|
94
|
+
fondo.className = 'td-alerta-fondo';
|
|
95
|
+
const modal = document.createElement('div');
|
|
96
|
+
modal.className = 'td-alerta-modal';
|
|
97
|
+
modal.setAttribute('role', 'dialog');
|
|
98
|
+
modal.setAttribute('aria-modal', 'true');
|
|
99
|
+
const icono = document.createElement('div');
|
|
100
|
+
icono.className = `td-alerta-icono td-alerta-icono--${config.tipo}`;
|
|
101
|
+
icono.textContent = this.obtenerIcono(config.tipo);
|
|
102
|
+
const titulo = document.createElement('h2');
|
|
103
|
+
titulo.className = 'td-alerta-titulo';
|
|
104
|
+
titulo.textContent = config.titulo;
|
|
105
|
+
const mensaje = document.createElement('p');
|
|
106
|
+
mensaje.className = 'td-alerta-mensaje';
|
|
107
|
+
mensaje.textContent = config.mensaje;
|
|
108
|
+
const acciones = document.createElement('div');
|
|
109
|
+
acciones.className = 'td-alerta-acciones';
|
|
110
|
+
const botonConfirmar = document.createElement('button');
|
|
111
|
+
botonConfirmar.type = 'button';
|
|
112
|
+
botonConfirmar.className = `td-alerta-boton td-alerta-boton--${config.tipo}`;
|
|
113
|
+
botonConfirmar.textContent = config.textoConfirmar;
|
|
114
|
+
const botonCancelar = document.createElement('button');
|
|
115
|
+
botonCancelar.type = 'button';
|
|
116
|
+
botonCancelar.className = 'td-alerta-boton td-alerta-boton--cancelar';
|
|
117
|
+
botonCancelar.textContent = config.textoCancelar;
|
|
118
|
+
const cerrar = (resultado) => {
|
|
119
|
+
document.removeEventListener('keydown', onKeyDown);
|
|
120
|
+
fondo.classList.add('td-alerta-saliendo');
|
|
121
|
+
window.setTimeout(() => {
|
|
122
|
+
fondo.remove();
|
|
123
|
+
resolve(resultado);
|
|
124
|
+
}, 140);
|
|
125
|
+
};
|
|
126
|
+
const onKeyDown = (event) => {
|
|
127
|
+
if (event.key === 'Escape' && config.cerrarConEscape) {
|
|
128
|
+
cerrar(false);
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
botonConfirmar.addEventListener('click', () => cerrar(true));
|
|
132
|
+
botonCancelar.addEventListener('click', () => cerrar(false));
|
|
133
|
+
if (config.cerrarConFondo) {
|
|
134
|
+
fondo.addEventListener('click', (event) => {
|
|
135
|
+
if (event.target === fondo) {
|
|
136
|
+
cerrar(false);
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
document.addEventListener('keydown', onKeyDown);
|
|
141
|
+
if (config.mostrarCancelar) {
|
|
142
|
+
acciones.appendChild(botonCancelar);
|
|
143
|
+
}
|
|
144
|
+
acciones.appendChild(botonConfirmar);
|
|
145
|
+
modal.appendChild(icono);
|
|
146
|
+
modal.appendChild(titulo);
|
|
147
|
+
if (config.mensaje) {
|
|
148
|
+
modal.appendChild(mensaje);
|
|
149
|
+
}
|
|
150
|
+
modal.appendChild(acciones);
|
|
151
|
+
fondo.appendChild(modal);
|
|
152
|
+
document.body.appendChild(fondo);
|
|
153
|
+
botonConfirmar.focus();
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
static obtenerIcono(tipo) {
|
|
157
|
+
const iconos = {
|
|
158
|
+
exito: '✓',
|
|
159
|
+
error: '!',
|
|
160
|
+
advertencia: '!',
|
|
161
|
+
info: 'i',
|
|
162
|
+
pregunta: '?',
|
|
163
|
+
};
|
|
164
|
+
return iconos[tipo];
|
|
165
|
+
}
|
|
166
|
+
static inyectarEstilos() {
|
|
167
|
+
if (document.getElementById(this.estiloId))
|
|
168
|
+
return;
|
|
169
|
+
const style = document.createElement('style');
|
|
170
|
+
style.id = this.estiloId;
|
|
171
|
+
style.textContent = `
|
|
172
|
+
.td-alerta-fondo {
|
|
173
|
+
position: fixed;
|
|
174
|
+
inset: 0;
|
|
175
|
+
z-index: 99999;
|
|
176
|
+
display: flex;
|
|
177
|
+
align-items: center;
|
|
178
|
+
justify-content: center;
|
|
179
|
+
padding: 1rem;
|
|
180
|
+
background: rgba(15, 23, 42, 0.52);
|
|
181
|
+
animation: td-alerta-fondo-entrada 160ms ease-out;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
.td-alerta-modal {
|
|
185
|
+
width: min(100%, 430px);
|
|
186
|
+
border-radius: 18px;
|
|
187
|
+
background: #ffffff;
|
|
188
|
+
padding: 1.75rem;
|
|
189
|
+
text-align: center;
|
|
190
|
+
box-shadow: 0 22px 70px rgba(15, 23, 42, 0.28);
|
|
191
|
+
animation: td-alerta-modal-entrada 180ms ease-out;
|
|
192
|
+
font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
.td-alerta-icono {
|
|
196
|
+
width: 4.25rem;
|
|
197
|
+
height: 4.25rem;
|
|
198
|
+
margin: 0 auto 1rem;
|
|
199
|
+
border-radius: 999px;
|
|
200
|
+
display: flex;
|
|
201
|
+
align-items: center;
|
|
202
|
+
justify-content: center;
|
|
203
|
+
font-size: 2.1rem;
|
|
204
|
+
font-weight: 800;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
.td-alerta-icono--exito {
|
|
208
|
+
color: #16a34a;
|
|
209
|
+
background: #dcfce7;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
.td-alerta-icono--error {
|
|
213
|
+
color: #ef4444;
|
|
214
|
+
background: #fee2e2;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
.td-alerta-icono--advertencia {
|
|
218
|
+
color: #f59e0b;
|
|
219
|
+
background: #fef3c7;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
.td-alerta-icono--info {
|
|
223
|
+
color: #2563eb;
|
|
224
|
+
background: #dbeafe;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
.td-alerta-icono--pregunta {
|
|
228
|
+
color: #7c3aed;
|
|
229
|
+
background: #ede9fe;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
.td-alerta-titulo {
|
|
233
|
+
margin: 0;
|
|
234
|
+
color: #111827;
|
|
235
|
+
font-size: 1.35rem;
|
|
236
|
+
line-height: 1.25;
|
|
237
|
+
font-weight: 800;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
.td-alerta-mensaje {
|
|
241
|
+
margin: 0.75rem 0 0;
|
|
242
|
+
color: #4b5563;
|
|
243
|
+
font-size: 0.96rem;
|
|
244
|
+
line-height: 1.55;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
.td-alerta-acciones {
|
|
248
|
+
display: flex;
|
|
249
|
+
justify-content: center;
|
|
250
|
+
gap: 0.75rem;
|
|
251
|
+
margin-top: 1.5rem;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
.td-alerta-boton {
|
|
255
|
+
border: 0;
|
|
256
|
+
border-radius: 10px;
|
|
257
|
+
padding: 0.7rem 1.2rem;
|
|
258
|
+
color: #ffffff;
|
|
259
|
+
font-size: 0.93rem;
|
|
260
|
+
font-weight: 700;
|
|
261
|
+
cursor: pointer;
|
|
262
|
+
transition: transform 120ms ease, filter 120ms ease, background 120ms ease;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
.td-alerta-boton:hover {
|
|
266
|
+
filter: brightness(0.96);
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
.td-alerta-boton:active {
|
|
270
|
+
transform: scale(0.98);
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
.td-alerta-boton:focus {
|
|
274
|
+
outline: 3px solid rgba(37, 99, 235, 0.25);
|
|
275
|
+
outline-offset: 2px;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
.td-alerta-boton--exito {
|
|
279
|
+
background: #22c55e;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
.td-alerta-boton--error {
|
|
283
|
+
background: #ef4444;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
.td-alerta-boton--advertencia {
|
|
287
|
+
background: #f59e0b;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
.td-alerta-boton--info {
|
|
291
|
+
background: #2563eb;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
.td-alerta-boton--pregunta {
|
|
295
|
+
background: #7c3aed;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
.td-alerta-boton--cancelar {
|
|
299
|
+
background: #6b7280;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
.td-alerta-saliendo {
|
|
303
|
+
animation: td-alerta-fondo-salida 140ms ease-in forwards;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
.td-alerta-saliendo .td-alerta-modal {
|
|
307
|
+
animation: td-alerta-modal-salida 140ms ease-in forwards;
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
@keyframes td-alerta-fondo-entrada {
|
|
311
|
+
from { opacity: 0; }
|
|
312
|
+
to { opacity: 1; }
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
@keyframes td-alerta-modal-entrada {
|
|
316
|
+
from {
|
|
317
|
+
opacity: 0;
|
|
318
|
+
transform: translateY(12px) scale(0.96);
|
|
319
|
+
}
|
|
320
|
+
to {
|
|
321
|
+
opacity: 1;
|
|
322
|
+
transform: translateY(0) scale(1);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
@keyframes td-alerta-fondo-salida {
|
|
327
|
+
from { opacity: 1; }
|
|
328
|
+
to { opacity: 0; }
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
@keyframes td-alerta-modal-salida {
|
|
332
|
+
from {
|
|
333
|
+
opacity: 1;
|
|
334
|
+
transform: translateY(0) scale(1);
|
|
335
|
+
}
|
|
336
|
+
to {
|
|
337
|
+
opacity: 0;
|
|
338
|
+
transform: translateY(8px) scale(0.97);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
@media (max-width: 480px) {
|
|
343
|
+
.td-alerta-modal {
|
|
344
|
+
padding: 1.4rem;
|
|
345
|
+
border-radius: 16px;
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
.td-alerta-acciones {
|
|
349
|
+
flex-direction: column-reverse;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
.td-alerta-boton {
|
|
353
|
+
width: 100%;
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
`;
|
|
357
|
+
document.head.appendChild(style);
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
class TdSidebar {
|
|
362
|
+
titulo = 'Gestión Corporativa';
|
|
363
|
+
subtitulo = 'Central Platform';
|
|
364
|
+
etiquetaNavegacion = 'Navegación';
|
|
365
|
+
logoUrl = '';
|
|
366
|
+
logoAlt = 'Logo';
|
|
367
|
+
textoCarga = 'Cargando menú...';
|
|
368
|
+
mensajeVacio = 'No hay opciones disponibles.';
|
|
369
|
+
error = '';
|
|
370
|
+
cargando = false;
|
|
371
|
+
oscuro = false;
|
|
372
|
+
set abierto(value) {
|
|
373
|
+
this.abiertoInterno.set(value);
|
|
374
|
+
}
|
|
375
|
+
get abierto() {
|
|
376
|
+
return this.abiertoInterno();
|
|
377
|
+
}
|
|
378
|
+
set menu(value) {
|
|
379
|
+
this.menuNormalizado.set(this.normalizarMenu(value ?? []));
|
|
380
|
+
}
|
|
381
|
+
get menu() {
|
|
382
|
+
return this.menuNormalizado();
|
|
383
|
+
}
|
|
384
|
+
abiertoChange = new EventEmitter();
|
|
385
|
+
seleccionar = new EventEmitter();
|
|
386
|
+
abiertoInterno = signal(true, ...(ngDevMode ? [{ debugName: "abiertoInterno" }] : /* istanbul ignore next */ []));
|
|
387
|
+
menuNormalizado = signal([], ...(ngDevMode ? [{ debugName: "menuNormalizado" }] : /* istanbul ignore next */ []));
|
|
388
|
+
expandidos = signal(new Set(), ...(ngDevMode ? [{ debugName: "expandidos" }] : /* istanbul ignore next */ []));
|
|
389
|
+
alternarSidebar() {
|
|
390
|
+
const siguiente = !this.abiertoInterno();
|
|
391
|
+
this.abiertoInterno.set(siguiente);
|
|
392
|
+
this.abiertoChange.emit(siguiente);
|
|
393
|
+
}
|
|
394
|
+
alternarGrupo(clave) {
|
|
395
|
+
if (!this.abiertoInterno()) {
|
|
396
|
+
this.abiertoInterno.set(true);
|
|
397
|
+
this.abiertoChange.emit(true);
|
|
398
|
+
}
|
|
399
|
+
this.expandidos.update((actuales) => {
|
|
400
|
+
const siguientes = new Set(actuales);
|
|
401
|
+
siguientes.has(clave) ? siguientes.delete(clave) : siguientes.add(clave);
|
|
402
|
+
return siguientes;
|
|
403
|
+
});
|
|
404
|
+
}
|
|
405
|
+
estaExpandido(clave) {
|
|
406
|
+
return this.expandidos().has(clave);
|
|
407
|
+
}
|
|
408
|
+
seleccionarItem(item, nivel) {
|
|
409
|
+
this.seleccionar.emit({ item, nivel });
|
|
410
|
+
}
|
|
411
|
+
claveItem(item, padre, indice) {
|
|
412
|
+
return `${padre}/${item.nombre}-${indice}`;
|
|
413
|
+
}
|
|
414
|
+
inicialMarca() {
|
|
415
|
+
return (this.titulo.trim().charAt(0) || 'T').toUpperCase();
|
|
416
|
+
}
|
|
417
|
+
iconoPath(icono) {
|
|
418
|
+
const nombre = (icono ?? '').trim().toLowerCase();
|
|
419
|
+
return ICONOS[nombre] ?? ICONOS['folder'];
|
|
420
|
+
}
|
|
421
|
+
normalizarMenu(items) {
|
|
422
|
+
return [...items]
|
|
423
|
+
.sort((a, b) => a.orden - b.orden)
|
|
424
|
+
.map((item) => ({
|
|
425
|
+
...item,
|
|
426
|
+
icono: item.icono?.trim() || 'folder',
|
|
427
|
+
subMenus: this.normalizarMenu(item.subMenus ?? []),
|
|
428
|
+
}));
|
|
429
|
+
}
|
|
430
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TdSidebar, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
431
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: TdSidebar, isStandalone: true, selector: "td-sidebar", inputs: { titulo: "titulo", subtitulo: "subtitulo", etiquetaNavegacion: "etiquetaNavegacion", logoUrl: "logoUrl", logoAlt: "logoAlt", textoCarga: "textoCarga", mensajeVacio: "mensajeVacio", error: "error", cargando: "cargando", oscuro: "oscuro", abierto: "abierto", menu: "menu" }, outputs: { abiertoChange: "abiertoChange", seleccionar: "seleccionar" }, ngImport: i0, template: "<aside class=\"td-sidebar\" [class.td-sidebar--compacto]=\"!abiertoInterno()\" [class.td-sidebar--oscuro]=\"oscuro\">\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 <button\n class=\"td-sidebar__alternador\"\n type=\"button\"\n [attr.aria-label]=\"abiertoInterno() ? 'Contraer men\u00FA' : 'Expandir men\u00FA'\"\n [attr.title]=\"abiertoInterno() ? 'Contraer men\u00FA' : 'Expandir men\u00FA'\"\n (click)=\"alternarSidebar()\"\n >\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path d=\"m14.5 6-6 6 6 6\" />\n </svg>\n </button>\n </header>\n\n <div class=\"td-sidebar__encabezado\">\n @if (abiertoInterno()) {\n <span>{{ etiquetaNavegacion }}</span>\n } @else {\n <span aria-hidden=\"true\">\u2022\u2022\u2022</span>\n }\n </div>\n\n <nav class=\"td-sidebar__nav\" aria-label=\"Men\u00FA 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 <svg class=\"td-sidebar__icono\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path [attr.d]=\"iconoPath(item.icono)\" />\n </svg>\n @if (abiertoInterno()) {\n <span>{{ item.nombre }}</span>\n <svg\n class=\"td-sidebar__flecha\"\n [class.td-sidebar__flecha--abierta]=\"estaExpandido(clave)\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path d=\"m9 6 6 6-6 6\" />\n </svg>\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 <svg class=\"td-sidebar__icono\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path [attr.d]=\"iconoPath(item.icono)\" />\n </svg>\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", styles: [":host{display:block;height:100%}*{box-sizing:border-box}.td-sidebar{--td-fondo: #fff;--td-borde: #e2e8f0;--td-texto: #334155;--td-texto-suave: #64748b;--td-hover: #f1f5f9;--td-activo: #e8efff;--td-acento: #2563eb;display:flex;width:18rem;height:100%;min-height:28rem;flex-direction:column;overflow:hidden;border-right:1px solid var(--td-borde);color:var(--td-texto);background:var(--td-fondo);font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;transition:width .2s ease,background .2s ease,border-color .2s ease}.td-sidebar--oscuro{--td-fondo: #09090b;--td-borde: #27272a;--td-texto: #d4d4d8;--td-texto-suave: #71717a;--td-hover: #18181b;--td-activo: #172554;--td-acento: #60a5fa}.td-sidebar--compacto{width:5rem}.td-sidebar__marca{display:flex;min-height:5rem;align-items:center;gap:.75rem;border-bottom:1px solid var(--td-borde);padding:1rem}.td-sidebar__logo{display:grid;width:2.75rem;height:2.75rem;flex:0 0 2.75rem;place-items:center;overflow:hidden;border:1px solid var(--td-borde);border-radius:.75rem;color:#fff;background:linear-gradient(135deg,#2563eb,#6d28d9);font-size:1.15rem;font-weight:800}.td-sidebar__logo img{width:75%;height:75%;object-fit:contain}.td-sidebar__marca-texto{min-width:0;flex:1}.td-sidebar__marca-texto small,.td-sidebar__marca-texto strong{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.td-sidebar__marca-texto small{color:var(--td-acento);font-size:.64rem;font-weight:750;letter-spacing:.12em;text-transform:uppercase}.td-sidebar__marca-texto strong{margin-top:.18rem;font-size:.84rem}.td-sidebar__alternador{display:grid;width:1.75rem;height:1.75rem;flex:0 0 1.75rem;place-items:center;border:0;border-radius:.45rem;color:var(--td-texto-suave);background:transparent;cursor:pointer}.td-sidebar__alternador:hover{color:var(--td-texto);background:var(--td-hover)}.td-sidebar__alternador svg{width:1rem;fill:none;stroke:currentColor;stroke-linecap:round;stroke-linejoin:round;stroke-width:2;transition:transform .2s ease}.td-sidebar--compacto .td-sidebar__alternador{display:none}.td-sidebar__encabezado{min-height:3.35rem;padding:1.25rem 1rem .65rem;color:var(--td-texto-suave);font-size:.66rem;font-weight:750;letter-spacing:.12em;text-transform:uppercase}.td-sidebar--compacto .td-sidebar__encabezado{text-align:center}.td-sidebar__nav{min-height:0;flex:1;overflow-x:hidden;overflow-y:auto;padding:0 .7rem 1rem;scrollbar-width:thin;scrollbar-color:var(--td-borde) transparent}.td-sidebar__lista{margin:0;padding:0;list-style:none}.td-sidebar__lista--anidada{position:relative;margin:.2rem 0 .35rem 1.25rem;padding-left:.7rem}.td-sidebar__lista--anidada:before{position:absolute;inset:0 auto 0 0;width:1px;background:var(--td-borde);content:\"\"}.td-sidebar__item+.td-sidebar__item{margin-top:.2rem}.td-sidebar__enlace{display:flex;width:100%;min-width:0;min-height:2.5rem;align-items:center;gap:.7rem;border:0;border-radius:.55rem;padding:.55rem .7rem;color:var(--td-texto);background:transparent;font:inherit;font-size:.82rem;font-weight:600;text-align:left;text-decoration:none;cursor:pointer;transition:color .12s ease,background .12s ease}.td-sidebar__enlace:hover{background:var(--td-hover)}.td-sidebar__enlace--activo,.td-sidebar__enlace--ruta-activa{color:var(--td-acento);background:var(--td-activo)}.td-sidebar__enlace span{overflow:hidden;flex:1;text-overflow:ellipsis;white-space:nowrap}.td-sidebar__icono{width:1.15rem;height:1.15rem;flex:0 0 1.15rem;fill:currentColor}.td-sidebar__flecha{width:.9rem;height:.9rem;flex:0 0 .9rem;fill:none;stroke:currentColor;stroke-linecap:round;stroke-linejoin:round;stroke-width:2;transition:transform .16s ease}.td-sidebar__flecha--abierta{transform:rotate(90deg)}.td-sidebar--compacto .td-sidebar__marca{justify-content:center;padding-inline:.7rem}.td-sidebar--compacto .td-sidebar__nav{padding-inline:.65rem}.td-sidebar--compacto .td-sidebar__enlace{justify-content:center;padding-inline:0}.td-sidebar__lista--anidada .td-sidebar__enlace{min-height:2.2rem;font-size:.75rem;font-weight:500}.td-sidebar__lista--anidada .td-sidebar__lista--anidada .td-sidebar__enlace{min-height:2rem;color:var(--td-texto-suave);font-size:.7rem}.td-sidebar__estado{margin:0;padding:.75rem;color:var(--td-texto-suave);font-size:.75rem;line-height:1.45}.td-sidebar__estado--error{color:#d97706}@media(prefers-reduced-motion:reduce){.td-sidebar,.td-sidebar__flecha{transition:none}}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
432
|
+
}
|
|
433
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TdSidebar, decorators: [{
|
|
434
|
+
type: Component,
|
|
435
|
+
args: [{ selector: 'td-sidebar', imports: [NgTemplateOutlet, RouterLink, RouterLinkActive], changeDetection: ChangeDetectionStrategy.OnPush, template: "<aside class=\"td-sidebar\" [class.td-sidebar--compacto]=\"!abiertoInterno()\" [class.td-sidebar--oscuro]=\"oscuro\">\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 <button\n class=\"td-sidebar__alternador\"\n type=\"button\"\n [attr.aria-label]=\"abiertoInterno() ? 'Contraer men\u00FA' : 'Expandir men\u00FA'\"\n [attr.title]=\"abiertoInterno() ? 'Contraer men\u00FA' : 'Expandir men\u00FA'\"\n (click)=\"alternarSidebar()\"\n >\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path d=\"m14.5 6-6 6 6 6\" />\n </svg>\n </button>\n </header>\n\n <div class=\"td-sidebar__encabezado\">\n @if (abiertoInterno()) {\n <span>{{ etiquetaNavegacion }}</span>\n } @else {\n <span aria-hidden=\"true\">\u2022\u2022\u2022</span>\n }\n </div>\n\n <nav class=\"td-sidebar__nav\" aria-label=\"Men\u00FA 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 <svg class=\"td-sidebar__icono\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path [attr.d]=\"iconoPath(item.icono)\" />\n </svg>\n @if (abiertoInterno()) {\n <span>{{ item.nombre }}</span>\n <svg\n class=\"td-sidebar__flecha\"\n [class.td-sidebar__flecha--abierta]=\"estaExpandido(clave)\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path d=\"m9 6 6 6-6 6\" />\n </svg>\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 <svg class=\"td-sidebar__icono\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path [attr.d]=\"iconoPath(item.icono)\" />\n </svg>\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", styles: [":host{display:block;height:100%}*{box-sizing:border-box}.td-sidebar{--td-fondo: #fff;--td-borde: #e2e8f0;--td-texto: #334155;--td-texto-suave: #64748b;--td-hover: #f1f5f9;--td-activo: #e8efff;--td-acento: #2563eb;display:flex;width:18rem;height:100%;min-height:28rem;flex-direction:column;overflow:hidden;border-right:1px solid var(--td-borde);color:var(--td-texto);background:var(--td-fondo);font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;transition:width .2s ease,background .2s ease,border-color .2s ease}.td-sidebar--oscuro{--td-fondo: #09090b;--td-borde: #27272a;--td-texto: #d4d4d8;--td-texto-suave: #71717a;--td-hover: #18181b;--td-activo: #172554;--td-acento: #60a5fa}.td-sidebar--compacto{width:5rem}.td-sidebar__marca{display:flex;min-height:5rem;align-items:center;gap:.75rem;border-bottom:1px solid var(--td-borde);padding:1rem}.td-sidebar__logo{display:grid;width:2.75rem;height:2.75rem;flex:0 0 2.75rem;place-items:center;overflow:hidden;border:1px solid var(--td-borde);border-radius:.75rem;color:#fff;background:linear-gradient(135deg,#2563eb,#6d28d9);font-size:1.15rem;font-weight:800}.td-sidebar__logo img{width:75%;height:75%;object-fit:contain}.td-sidebar__marca-texto{min-width:0;flex:1}.td-sidebar__marca-texto small,.td-sidebar__marca-texto strong{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.td-sidebar__marca-texto small{color:var(--td-acento);font-size:.64rem;font-weight:750;letter-spacing:.12em;text-transform:uppercase}.td-sidebar__marca-texto strong{margin-top:.18rem;font-size:.84rem}.td-sidebar__alternador{display:grid;width:1.75rem;height:1.75rem;flex:0 0 1.75rem;place-items:center;border:0;border-radius:.45rem;color:var(--td-texto-suave);background:transparent;cursor:pointer}.td-sidebar__alternador:hover{color:var(--td-texto);background:var(--td-hover)}.td-sidebar__alternador svg{width:1rem;fill:none;stroke:currentColor;stroke-linecap:round;stroke-linejoin:round;stroke-width:2;transition:transform .2s ease}.td-sidebar--compacto .td-sidebar__alternador{display:none}.td-sidebar__encabezado{min-height:3.35rem;padding:1.25rem 1rem .65rem;color:var(--td-texto-suave);font-size:.66rem;font-weight:750;letter-spacing:.12em;text-transform:uppercase}.td-sidebar--compacto .td-sidebar__encabezado{text-align:center}.td-sidebar__nav{min-height:0;flex:1;overflow-x:hidden;overflow-y:auto;padding:0 .7rem 1rem;scrollbar-width:thin;scrollbar-color:var(--td-borde) transparent}.td-sidebar__lista{margin:0;padding:0;list-style:none}.td-sidebar__lista--anidada{position:relative;margin:.2rem 0 .35rem 1.25rem;padding-left:.7rem}.td-sidebar__lista--anidada:before{position:absolute;inset:0 auto 0 0;width:1px;background:var(--td-borde);content:\"\"}.td-sidebar__item+.td-sidebar__item{margin-top:.2rem}.td-sidebar__enlace{display:flex;width:100%;min-width:0;min-height:2.5rem;align-items:center;gap:.7rem;border:0;border-radius:.55rem;padding:.55rem .7rem;color:var(--td-texto);background:transparent;font:inherit;font-size:.82rem;font-weight:600;text-align:left;text-decoration:none;cursor:pointer;transition:color .12s ease,background .12s ease}.td-sidebar__enlace:hover{background:var(--td-hover)}.td-sidebar__enlace--activo,.td-sidebar__enlace--ruta-activa{color:var(--td-acento);background:var(--td-activo)}.td-sidebar__enlace span{overflow:hidden;flex:1;text-overflow:ellipsis;white-space:nowrap}.td-sidebar__icono{width:1.15rem;height:1.15rem;flex:0 0 1.15rem;fill:currentColor}.td-sidebar__flecha{width:.9rem;height:.9rem;flex:0 0 .9rem;fill:none;stroke:currentColor;stroke-linecap:round;stroke-linejoin:round;stroke-width:2;transition:transform .16s ease}.td-sidebar__flecha--abierta{transform:rotate(90deg)}.td-sidebar--compacto .td-sidebar__marca{justify-content:center;padding-inline:.7rem}.td-sidebar--compacto .td-sidebar__nav{padding-inline:.65rem}.td-sidebar--compacto .td-sidebar__enlace{justify-content:center;padding-inline:0}.td-sidebar__lista--anidada .td-sidebar__enlace{min-height:2.2rem;font-size:.75rem;font-weight:500}.td-sidebar__lista--anidada .td-sidebar__lista--anidada .td-sidebar__enlace{min-height:2rem;color:var(--td-texto-suave);font-size:.7rem}.td-sidebar__estado{margin:0;padding:.75rem;color:var(--td-texto-suave);font-size:.75rem;line-height:1.45}.td-sidebar__estado--error{color:#d97706}@media(prefers-reduced-motion:reduce){.td-sidebar,.td-sidebar__flecha{transition:none}}\n"] }]
|
|
436
|
+
}], propDecorators: { titulo: [{
|
|
437
|
+
type: Input
|
|
438
|
+
}], subtitulo: [{
|
|
439
|
+
type: Input
|
|
440
|
+
}], etiquetaNavegacion: [{
|
|
441
|
+
type: Input
|
|
442
|
+
}], logoUrl: [{
|
|
443
|
+
type: Input
|
|
444
|
+
}], logoAlt: [{
|
|
445
|
+
type: Input
|
|
446
|
+
}], textoCarga: [{
|
|
447
|
+
type: Input
|
|
448
|
+
}], mensajeVacio: [{
|
|
449
|
+
type: Input
|
|
450
|
+
}], error: [{
|
|
451
|
+
type: Input
|
|
452
|
+
}], cargando: [{
|
|
453
|
+
type: Input
|
|
454
|
+
}], oscuro: [{
|
|
455
|
+
type: Input
|
|
456
|
+
}], abierto: [{
|
|
457
|
+
type: Input
|
|
458
|
+
}], menu: [{
|
|
459
|
+
type: Input
|
|
460
|
+
}], abiertoChange: [{
|
|
461
|
+
type: Output
|
|
462
|
+
}], seleccionar: [{
|
|
463
|
+
type: Output
|
|
464
|
+
}] } });
|
|
465
|
+
const ICONOS = {
|
|
466
|
+
home: 'M3 10.5 12 3l9 7.5V21a1 1 0 0 1-1 1h-5v-7H9v7H4a1 1 0 0 1-1-1V10.5Z',
|
|
467
|
+
dashboard: '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',
|
|
468
|
+
folder: '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',
|
|
469
|
+
settings: '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',
|
|
470
|
+
people: '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',
|
|
471
|
+
person: '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',
|
|
472
|
+
security: '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',
|
|
473
|
+
inventory: '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',
|
|
474
|
+
shopping_cart: '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',
|
|
475
|
+
receipt: 'M5 2v20l3-2 4 2 4-2 3 2V2l-3 2-4-2-4 2-3-2Zm3 6h8v2H8V8Zm0 4h8v2H8v-2Z',
|
|
476
|
+
assessment: 'M4 20h16v2H4a2 2 0 0 1-2-2V4h2v16Zm3-2H5v-6h2v6Zm4 0H9V7h2v11Zm4 0h-2V4h2v14Zm4 0h-2v-9h2v9Z',
|
|
477
|
+
description: 'M6 2h8l5 5v15H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2Zm7 1.5V8h4.5L13 3.5ZM8 12v2h8v-2H8Zm0 4v2h8v-2H8Z',
|
|
478
|
+
business: 'M3 21V3h10v5h8v13h-7v-4h-2v4H3Zm3-14h2V5H6v2Zm4 0h2V5h-2v2Zm-4 4h2V9H6v2Zm4 0h2V9h-2v2Zm6 1h2v-2h-2v2Zm0 4h2v-2h-2v2Z',
|
|
479
|
+
};
|
|
480
|
+
|
|
481
|
+
/*
|
|
482
|
+
* Public API Surface of telcomdev-ui
|
|
483
|
+
*/
|
|
484
|
+
|
|
485
|
+
/**
|
|
486
|
+
* Generated bundle index. Do not edit.
|
|
487
|
+
*/
|
|
488
|
+
|
|
489
|
+
export { TdAlerta, TdSidebar, TelcomdevUi };
|
|
490
|
+
//# sourceMappingURL=telcomdev-ui.mjs.map
|
|
@@ -0,0 +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/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 {\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 { MenuSidebar, TdSidebarSeleccion } from './menu-sidebar';\n\n@Component({\n selector: 'td-sidebar',\n imports: [NgTemplateOutlet, RouterLink, RouterLinkActive],\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\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 alternarSidebar(): void {\n const siguiente = !this.abiertoInterno();\n this.abiertoInterno.set(siguiente);\n this.abiertoChange.emit(siguiente);\n }\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 protected iconoPath(icono: string | null): string {\n const nombre = (icono ?? '').trim().toLowerCase();\n return ICONOS[nombre] ?? ICONOS['folder'];\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\nconst ICONOS: Record<string, string> = {\n home: 'M3 10.5 12 3l9 7.5V21a1 1 0 0 1-1 1h-5v-7H9v7H4a1 1 0 0 1-1-1V10.5Z',\n dashboard:\n '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 folder:\n '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 settings:\n '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 people:\n '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 person:\n '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 security:\n '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 inventory:\n '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 shopping_cart:\n '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 receipt: 'M5 2v20l3-2 4 2 4-2 3 2V2l-3 2-4-2-4 2-3-2Zm3 6h8v2H8V8Zm0 4h8v2H8v-2Z',\n assessment:\n 'M4 20h16v2H4a2 2 0 0 1-2-2V4h2v16Zm3-2H5v-6h2v6Zm4 0H9V7h2v11Zm4 0h-2V4h2v14Zm4 0h-2v-9h2v9Z',\n description:\n '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 business:\n 'M3 21V3h10v5h8v13h-7v-4h-2v4H3Zm3-14h2V5H6v2Zm4 0h2V5h-2v2Zm-4 4h2V9H6v2Zm4 0h2V9h-2v2Zm6 1h2v-2h-2v2Zm0 4h2v-2h-2v2Z',\n};\n","<aside class=\"td-sidebar\" [class.td-sidebar--compacto]=\"!abiertoInterno()\" [class.td-sidebar--oscuro]=\"oscuro\">\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 <button\n class=\"td-sidebar__alternador\"\n type=\"button\"\n [attr.aria-label]=\"abiertoInterno() ? 'Contraer menú' : 'Expandir menú'\"\n [attr.title]=\"abiertoInterno() ? 'Contraer menú' : 'Expandir menú'\"\n (click)=\"alternarSidebar()\"\n >\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path d=\"m14.5 6-6 6 6 6\" />\n </svg>\n </button>\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 <svg class=\"td-sidebar__icono\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path [attr.d]=\"iconoPath(item.icono)\" />\n </svg>\n @if (abiertoInterno()) {\n <span>{{ item.nombre }}</span>\n <svg\n class=\"td-sidebar__flecha\"\n [class.td-sidebar__flecha--abierta]=\"estaExpandido(clave)\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path d=\"m9 6 6 6-6 6\" />\n </svg>\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 <svg class=\"td-sidebar__icono\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path [attr.d]=\"iconoPath(item.icono)\" />\n </svg>\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/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
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@telcomdev/ui",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Librería UI reutilizable para los sistemas TelcomDev.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"angular",
|
|
7
|
+
"ui",
|
|
8
|
+
"components",
|
|
9
|
+
"telcomdev",
|
|
10
|
+
"alerts",
|
|
11
|
+
"sidebar"
|
|
12
|
+
],
|
|
13
|
+
"author": "TelcomDev",
|
|
14
|
+
"license": "MIT",
|
|
15
|
+
"peerDependencies": {
|
|
16
|
+
"@angular/common": "^21.2.0",
|
|
17
|
+
"@angular/core": "^21.2.0",
|
|
18
|
+
"@angular/router": "^21.2.0"
|
|
19
|
+
},
|
|
20
|
+
"dependencies": {
|
|
21
|
+
"tslib": "^2.3.0"
|
|
22
|
+
},
|
|
23
|
+
"sideEffects": false,
|
|
24
|
+
"module": "fesm2022/telcomdev-ui.mjs",
|
|
25
|
+
"typings": "types/telcomdev-ui.d.ts",
|
|
26
|
+
"exports": {
|
|
27
|
+
"./package.json": {
|
|
28
|
+
"default": "./package.json"
|
|
29
|
+
},
|
|
30
|
+
".": {
|
|
31
|
+
"types": "./types/telcomdev-ui.d.ts",
|
|
32
|
+
"default": "./fesm2022/telcomdev-ui.mjs"
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
"type": "module"
|
|
36
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { EventEmitter } from '@angular/core';
|
|
3
|
+
|
|
4
|
+
declare class TelcomdevUi {
|
|
5
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<TelcomdevUi, never>;
|
|
6
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<TelcomdevUi, "td-telcomdev-ui", never, {}, {}, never, never, true, never>;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
type TdAlertaTipo = 'exito' | 'error' | 'advertencia' | 'info' | 'pregunta';
|
|
10
|
+
interface TdAlertaOpciones {
|
|
11
|
+
titulo?: string;
|
|
12
|
+
mensaje?: string;
|
|
13
|
+
tipo?: TdAlertaTipo;
|
|
14
|
+
textoConfirmar?: string;
|
|
15
|
+
textoCancelar?: string;
|
|
16
|
+
mostrarCancelar?: boolean;
|
|
17
|
+
cerrarConEscape?: boolean;
|
|
18
|
+
cerrarConFondo?: boolean;
|
|
19
|
+
}
|
|
20
|
+
declare class TdAlerta {
|
|
21
|
+
private static readonly estiloId;
|
|
22
|
+
static exito(mensaje: string, titulo?: string): Promise<boolean>;
|
|
23
|
+
static error(mensaje: string, titulo?: string): Promise<boolean>;
|
|
24
|
+
static errorSistema(mensaje: string, titulo?: string): Promise<boolean>;
|
|
25
|
+
static advertencia(mensaje: string, titulo?: string): Promise<boolean>;
|
|
26
|
+
static info(mensaje: string, titulo?: string): Promise<boolean>;
|
|
27
|
+
static confirmar(mensaje: string, titulo?: string, textoConfirmar?: string, textoCancelar?: string): Promise<boolean>;
|
|
28
|
+
static confirmarEliminar(mensaje?: string, titulo?: string): Promise<boolean>;
|
|
29
|
+
static mostrar(opciones: TdAlertaOpciones): Promise<boolean>;
|
|
30
|
+
private static obtenerIcono;
|
|
31
|
+
private static inyectarEstilos;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
interface MenuSidebar {
|
|
35
|
+
nombre: string;
|
|
36
|
+
ruta: string | null;
|
|
37
|
+
icono: string | null;
|
|
38
|
+
orden: number;
|
|
39
|
+
subMenus: MenuSidebar[];
|
|
40
|
+
}
|
|
41
|
+
interface TdSidebarSeleccion {
|
|
42
|
+
item: MenuSidebar;
|
|
43
|
+
nivel: number;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
declare class TdSidebar {
|
|
47
|
+
titulo: string;
|
|
48
|
+
subtitulo: string;
|
|
49
|
+
etiquetaNavegacion: string;
|
|
50
|
+
logoUrl: string;
|
|
51
|
+
logoAlt: string;
|
|
52
|
+
textoCarga: string;
|
|
53
|
+
mensajeVacio: string;
|
|
54
|
+
error: string;
|
|
55
|
+
cargando: boolean;
|
|
56
|
+
oscuro: boolean;
|
|
57
|
+
set abierto(value: boolean);
|
|
58
|
+
get abierto(): boolean;
|
|
59
|
+
set menu(value: MenuSidebar[] | null | undefined);
|
|
60
|
+
get menu(): MenuSidebar[];
|
|
61
|
+
readonly abiertoChange: EventEmitter<boolean>;
|
|
62
|
+
readonly seleccionar: EventEmitter<TdSidebarSeleccion>;
|
|
63
|
+
protected readonly abiertoInterno: i0.WritableSignal<boolean>;
|
|
64
|
+
protected readonly menuNormalizado: i0.WritableSignal<MenuSidebar[]>;
|
|
65
|
+
protected readonly expandidos: i0.WritableSignal<ReadonlySet<string>>;
|
|
66
|
+
protected alternarSidebar(): void;
|
|
67
|
+
protected alternarGrupo(clave: string): void;
|
|
68
|
+
protected estaExpandido(clave: string): boolean;
|
|
69
|
+
protected seleccionarItem(item: MenuSidebar, nivel: number): void;
|
|
70
|
+
protected claveItem(item: MenuSidebar, padre: string, indice: number): string;
|
|
71
|
+
protected inicialMarca(): string;
|
|
72
|
+
protected iconoPath(icono: string | null): string;
|
|
73
|
+
private normalizarMenu;
|
|
74
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<TdSidebar, never>;
|
|
75
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<TdSidebar, "td-sidebar", never, { "titulo": { "alias": "titulo"; "required": false; }; "subtitulo": { "alias": "subtitulo"; "required": false; }; "etiquetaNavegacion": { "alias": "etiquetaNavegacion"; "required": false; }; "logoUrl": { "alias": "logoUrl"; "required": false; }; "logoAlt": { "alias": "logoAlt"; "required": false; }; "textoCarga": { "alias": "textoCarga"; "required": false; }; "mensajeVacio": { "alias": "mensajeVacio"; "required": false; }; "error": { "alias": "error"; "required": false; }; "cargando": { "alias": "cargando"; "required": false; }; "oscuro": { "alias": "oscuro"; "required": false; }; "abierto": { "alias": "abierto"; "required": false; }; "menu": { "alias": "menu"; "required": false; }; }, { "abiertoChange": "abiertoChange"; "seleccionar": "seleccionar"; }, never, never, true, never>;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export { TdAlerta, TdSidebar, TelcomdevUi };
|
|
79
|
+
export type { MenuSidebar, TdAlertaOpciones, TdAlertaTipo, TdSidebarSeleccion };
|