ng-comps 0.2.0

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.
@@ -0,0 +1,2479 @@
1
+ import * as i0 from '@angular/core';
2
+ import { input, computed, ChangeDetectionStrategy, Component, output, effect, signal, inject, Injectable } from '@angular/core';
3
+ import * as i1 from '@angular/material/expansion';
4
+ import { MatExpansionModule } from '@angular/material/expansion';
5
+ import * as i1$1 from '@angular/material/icon';
6
+ import { MatIconModule } from '@angular/material/icon';
7
+ import * as i1$2 from '@angular/forms';
8
+ import { FormsModule } from '@angular/forms';
9
+ import * as i2 from '@angular/material/autocomplete';
10
+ import { MatAutocompleteModule } from '@angular/material/autocomplete';
11
+ import * as i1$3 from '@angular/material/form-field';
12
+ import { MatFormFieldModule } from '@angular/material/form-field';
13
+ import * as i5 from '@angular/material/input';
14
+ import { MatInputModule } from '@angular/material/input';
15
+ import * as i1$4 from '@angular/material/badge';
16
+ import { MatBadgeModule } from '@angular/material/badge';
17
+ import * as i1$5 from '@angular/material/button';
18
+ import { MatButtonModule } from '@angular/material/button';
19
+ import * as i1$6 from '@angular/material/card';
20
+ import { MatCardModule } from '@angular/material/card';
21
+ import * as i1$7 from '@angular/material/checkbox';
22
+ import { MatCheckboxModule } from '@angular/material/checkbox';
23
+ import * as i1$8 from '@angular/material/chips';
24
+ import { MatChipsModule } from '@angular/material/chips';
25
+ import * as i1$9 from '@angular/material/datepicker';
26
+ import { MatDatepickerModule } from '@angular/material/datepicker';
27
+ import { MatNativeDateModule } from '@angular/material/core';
28
+ import { MatDialogRef, MatDialogModule } from '@angular/material/dialog';
29
+ import * as i1$a from '@angular/material/divider';
30
+ import { MatDividerModule } from '@angular/material/divider';
31
+ import * as i1$b from '@angular/material/grid-list';
32
+ import { MatGridListModule } from '@angular/material/grid-list';
33
+ import * as i1$c from '@angular/material/menu';
34
+ import { MatMenuModule } from '@angular/material/menu';
35
+ import * as i1$d from '@angular/material/paginator';
36
+ import { MatPaginatorModule } from '@angular/material/paginator';
37
+ import * as i1$e from '@angular/material/progress-bar';
38
+ import { MatProgressBarModule } from '@angular/material/progress-bar';
39
+ import * as i1$f from '@angular/material/progress-spinner';
40
+ import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
41
+ import * as i1$g from '@angular/material/radio';
42
+ import { MatRadioModule } from '@angular/material/radio';
43
+ import * as i2$1 from '@angular/material/select';
44
+ import { MatSelectModule } from '@angular/material/select';
45
+ import * as i1$h from '@angular/material/sidenav';
46
+ import { MatSidenavModule } from '@angular/material/sidenav';
47
+ import * as i1$i from '@angular/material/slide-toggle';
48
+ import { MatSlideToggleModule } from '@angular/material/slide-toggle';
49
+ import { MatSnackBar } from '@angular/material/snack-bar';
50
+ import * as i1$j from '@angular/material/table';
51
+ import { MatTableModule } from '@angular/material/table';
52
+ import * as i2$2 from '@angular/material/sort';
53
+ import { MatSortModule } from '@angular/material/sort';
54
+ import * as i1$k from '@angular/material/tabs';
55
+ import { MatTabsModule } from '@angular/material/tabs';
56
+ import * as i1$l from '@angular/material/toolbar';
57
+ import { MatToolbarModule } from '@angular/material/toolbar';
58
+ import * as i1$m from '@angular/material/tooltip';
59
+ import { MatTooltipModule } from '@angular/material/tooltip';
60
+
61
+ /**
62
+ * Accordion de la librería ng-comps.
63
+ * Envuelve Angular Material `mat-accordion` / `mat-expansion-panel` y expone
64
+ * una API uniforme con look and feel de marca.
65
+ */
66
+ class MfAccordionComponent {
67
+ /** Paneles del accordion */
68
+ panels = input.required(...(ngDevMode ? [{ debugName: "panels" }] : /* istanbul ignore next */ []));
69
+ /** Permite múltiples paneles abiertos */
70
+ multi = input(false, ...(ngDevMode ? [{ debugName: "multi" }] : /* istanbul ignore next */ []));
71
+ hostClasses = computed(() => 'mf-accordion', ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
72
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: MfAccordionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
73
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.4", type: MfAccordionComponent, isStandalone: true, selector: "mf-accordion", inputs: { panels: { classPropertyName: "panels", publicName: "panels", isSignal: true, isRequired: true, transformFunction: null }, multi: { classPropertyName: "multi", publicName: "multi", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
74
+ <mat-accordion [multi]="multi()" [class]="hostClasses()">
75
+ @for (panel of panels(); track panel.title) {
76
+ <mat-expansion-panel
77
+ [expanded]="panel.expanded ?? false"
78
+ [disabled]="panel.disabled ?? false"
79
+ >
80
+ <mat-expansion-panel-header>
81
+ <mat-panel-title>{{ panel.title }}</mat-panel-title>
82
+ @if (panel.description) {
83
+ <mat-panel-description>{{ panel.description }}</mat-panel-description>
84
+ }
85
+ </mat-expansion-panel-header>
86
+ <p>{{ panel.content }}</p>
87
+ </mat-expansion-panel>
88
+ }
89
+ </mat-accordion>
90
+ `, isInline: true, styles: [":host{display:block}.mf-accordion .mat-expansion-panel{font-family:var(--mf-font-base)!important;border-radius:var(--mf-radius-md)!important;box-shadow:var(--mf-shadow-none)!important;border:1px solid var(--mf-color-border);margin-bottom:var(--mf-space-2)}.mf-accordion .mat-expansion-panel-header{font-family:var(--mf-font-base)!important}.mf-accordion .mat-expansion-panel-header-title{font-weight:var(--mf-weight-bold)!important;color:var(--mf-color-on-surface)!important}.mf-accordion .mat-expansion-panel-header-description{color:var(--mf-color-neutral-400)!important}.mf-accordion .mat-expansion-panel-body{font-size:var(--mf-text-sm)!important;color:var(--mf-color-neutral-600)!important;line-height:var(--mf-leading-normal)}.mf-accordion .mat-expansion-indicator:after{color:var(--mf-color-brand)!important}.mf-accordion .mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:hover{background-color:var(--mf-color-brand-light)!important}\n"], dependencies: [{ kind: "ngmodule", type: MatExpansionModule }, { kind: "directive", type: i1.MatAccordion, selector: "mat-accordion", inputs: ["hideToggle", "displayMode", "togglePosition"], exportAs: ["matAccordion"] }, { kind: "component", type: i1.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i1.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["expandedHeight", "collapsedHeight", "tabIndex"] }, { kind: "directive", type: i1.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "directive", type: i1.MatExpansionPanelDescription, selector: "mat-panel-description" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
91
+ }
92
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: MfAccordionComponent, decorators: [{
93
+ type: Component,
94
+ args: [{ selector: 'mf-accordion', imports: [MatExpansionModule], template: `
95
+ <mat-accordion [multi]="multi()" [class]="hostClasses()">
96
+ @for (panel of panels(); track panel.title) {
97
+ <mat-expansion-panel
98
+ [expanded]="panel.expanded ?? false"
99
+ [disabled]="panel.disabled ?? false"
100
+ >
101
+ <mat-expansion-panel-header>
102
+ <mat-panel-title>{{ panel.title }}</mat-panel-title>
103
+ @if (panel.description) {
104
+ <mat-panel-description>{{ panel.description }}</mat-panel-description>
105
+ }
106
+ </mat-expansion-panel-header>
107
+ <p>{{ panel.content }}</p>
108
+ </mat-expansion-panel>
109
+ }
110
+ </mat-accordion>
111
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block}.mf-accordion .mat-expansion-panel{font-family:var(--mf-font-base)!important;border-radius:var(--mf-radius-md)!important;box-shadow:var(--mf-shadow-none)!important;border:1px solid var(--mf-color-border);margin-bottom:var(--mf-space-2)}.mf-accordion .mat-expansion-panel-header{font-family:var(--mf-font-base)!important}.mf-accordion .mat-expansion-panel-header-title{font-weight:var(--mf-weight-bold)!important;color:var(--mf-color-on-surface)!important}.mf-accordion .mat-expansion-panel-header-description{color:var(--mf-color-neutral-400)!important}.mf-accordion .mat-expansion-panel-body{font-size:var(--mf-text-sm)!important;color:var(--mf-color-neutral-600)!important;line-height:var(--mf-leading-normal)}.mf-accordion .mat-expansion-indicator:after{color:var(--mf-color-brand)!important}.mf-accordion .mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:hover{background-color:var(--mf-color-brand-light)!important}\n"] }]
112
+ }], propDecorators: { panels: [{ type: i0.Input, args: [{ isSignal: true, alias: "panels", required: true }] }], multi: [{ type: i0.Input, args: [{ isSignal: true, alias: "multi", required: false }] }] } });
113
+
114
+ /**
115
+ * Alerta de la librería ng-comps.
116
+ * Componente de banner para mensajes de sistema, alertas y notificaciones.
117
+ * Ideal para dashboards y paneles administrativos.
118
+ */
119
+ class MfAlertComponent {
120
+ /** Mensaje principal */
121
+ message = input.required(...(ngDevMode ? [{ debugName: "message" }] : /* istanbul ignore next */ []));
122
+ /** Título opcional */
123
+ title = input(undefined, ...(ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []));
124
+ /** Severidad de la alerta */
125
+ severity = input('info', ...(ngDevMode ? [{ debugName: "severity" }] : /* istanbul ignore next */ []));
126
+ /** Se puede cerrar */
127
+ dismissible = input(false, ...(ngDevMode ? [{ debugName: "dismissible" }] : /* istanbul ignore next */ []));
128
+ mfDismiss = output();
129
+ iconName = computed(() => {
130
+ const map = {
131
+ info: 'info',
132
+ success: 'check_circle',
133
+ warning: 'warning',
134
+ error: 'error',
135
+ };
136
+ return map[this.severity()];
137
+ }, ...(ngDevMode ? [{ debugName: "iconName" }] : /* istanbul ignore next */ []));
138
+ hostClasses = computed(() => {
139
+ return ['mf-alert', `mf-alert--${this.severity()}`].join(' ');
140
+ }, ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
141
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: MfAlertComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
142
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.4", type: MfAlertComponent, isStandalone: true, selector: "mf-alert", inputs: { message: { classPropertyName: "message", publicName: "message", isSignal: true, isRequired: true, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, severity: { classPropertyName: "severity", publicName: "severity", isSignal: true, isRequired: false, transformFunction: null }, dismissible: { classPropertyName: "dismissible", publicName: "dismissible", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { mfDismiss: "mfDismiss" }, ngImport: i0, template: `
143
+ <div [class]="hostClasses()" role="alert">
144
+ <mat-icon class="mf-alert__icon" aria-hidden="true">{{ iconName() }}</mat-icon>
145
+ <div class="mf-alert__content">
146
+ @if (title()) {
147
+ <strong class="mf-alert__title">{{ title() }}</strong>
148
+ }
149
+ <span class="mf-alert__message">{{ message() }}</span>
150
+ </div>
151
+ @if (dismissible()) {
152
+ <button
153
+ class="mf-alert__close"
154
+ (click)="mfDismiss.emit()"
155
+ [attr.aria-label]="'Cerrar alerta'"
156
+ >
157
+ <mat-icon aria-hidden="true">close</mat-icon>
158
+ </button>
159
+ }
160
+ </div>
161
+ `, isInline: true, styles: [":host{display:block}.mf-alert{display:flex;align-items:flex-start;gap:var(--mf-space-3);padding:var(--mf-space-3) var(--mf-space-4);border-radius:var(--mf-radius-md);font-family:var(--mf-font-base);font-size:var(--mf-text-sm);line-height:var(--mf-leading-normal)}.mf-alert--info{background-color:var(--mf-color-secondary-50);border-left:4px solid var(--mf-color-secondary-500);color:var(--mf-color-secondary-900)}.mf-alert--info .mf-alert__icon{color:var(--mf-color-secondary-500)}.mf-alert--success{background-color:var(--mf-color-primary-50);border-left:4px solid var(--mf-color-primary-500);color:var(--mf-color-primary-900)}.mf-alert--success .mf-alert__icon{color:var(--mf-color-primary-500)}.mf-alert--warning{background-color:#fffbeb;border-left:4px solid var(--mf-color-accent-500);color:var(--mf-color-accent-700)}.mf-alert--warning .mf-alert__icon{color:var(--mf-color-accent-500)}.mf-alert--error{background-color:#fef2f2;border-left:4px solid var(--mf-color-error-500);color:var(--mf-color-error-700)}.mf-alert--error .mf-alert__icon{color:var(--mf-color-error-500)}.mf-alert__content{flex:1;display:flex;flex-direction:column;gap:var(--mf-space-1)}.mf-alert__title{font-weight:var(--mf-weight-bold)}.mf-alert__icon{flex-shrink:0;margin-top:1px}.mf-alert__close{display:inline-flex;align-items:center;justify-content:center;border:none;background:none;cursor:pointer;padding:var(--mf-space-1);border-radius:var(--mf-radius-sm);color:inherit;opacity:.6;transition:opacity var(--mf-duration-fast) var(--mf-ease-standard)}.mf-alert__close:hover{opacity:1}.mf-alert__close .mat-icon{font-size:18px;width:18px;height:18px}\n"], dependencies: [{ kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
162
+ }
163
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: MfAlertComponent, decorators: [{
164
+ type: Component,
165
+ args: [{ selector: 'mf-alert', imports: [MatIconModule], template: `
166
+ <div [class]="hostClasses()" role="alert">
167
+ <mat-icon class="mf-alert__icon" aria-hidden="true">{{ iconName() }}</mat-icon>
168
+ <div class="mf-alert__content">
169
+ @if (title()) {
170
+ <strong class="mf-alert__title">{{ title() }}</strong>
171
+ }
172
+ <span class="mf-alert__message">{{ message() }}</span>
173
+ </div>
174
+ @if (dismissible()) {
175
+ <button
176
+ class="mf-alert__close"
177
+ (click)="mfDismiss.emit()"
178
+ [attr.aria-label]="'Cerrar alerta'"
179
+ >
180
+ <mat-icon aria-hidden="true">close</mat-icon>
181
+ </button>
182
+ }
183
+ </div>
184
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block}.mf-alert{display:flex;align-items:flex-start;gap:var(--mf-space-3);padding:var(--mf-space-3) var(--mf-space-4);border-radius:var(--mf-radius-md);font-family:var(--mf-font-base);font-size:var(--mf-text-sm);line-height:var(--mf-leading-normal)}.mf-alert--info{background-color:var(--mf-color-secondary-50);border-left:4px solid var(--mf-color-secondary-500);color:var(--mf-color-secondary-900)}.mf-alert--info .mf-alert__icon{color:var(--mf-color-secondary-500)}.mf-alert--success{background-color:var(--mf-color-primary-50);border-left:4px solid var(--mf-color-primary-500);color:var(--mf-color-primary-900)}.mf-alert--success .mf-alert__icon{color:var(--mf-color-primary-500)}.mf-alert--warning{background-color:#fffbeb;border-left:4px solid var(--mf-color-accent-500);color:var(--mf-color-accent-700)}.mf-alert--warning .mf-alert__icon{color:var(--mf-color-accent-500)}.mf-alert--error{background-color:#fef2f2;border-left:4px solid var(--mf-color-error-500);color:var(--mf-color-error-700)}.mf-alert--error .mf-alert__icon{color:var(--mf-color-error-500)}.mf-alert__content{flex:1;display:flex;flex-direction:column;gap:var(--mf-space-1)}.mf-alert__title{font-weight:var(--mf-weight-bold)}.mf-alert__icon{flex-shrink:0;margin-top:1px}.mf-alert__close{display:inline-flex;align-items:center;justify-content:center;border:none;background:none;cursor:pointer;padding:var(--mf-space-1);border-radius:var(--mf-radius-sm);color:inherit;opacity:.6;transition:opacity var(--mf-duration-fast) var(--mf-ease-standard)}.mf-alert__close:hover{opacity:1}.mf-alert__close .mat-icon{font-size:18px;width:18px;height:18px}\n"] }]
185
+ }], propDecorators: { message: [{ type: i0.Input, args: [{ isSignal: true, alias: "message", required: true }] }], title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: false }] }], severity: [{ type: i0.Input, args: [{ isSignal: true, alias: "severity", required: false }] }], dismissible: [{ type: i0.Input, args: [{ isSignal: true, alias: "dismissible", required: false }] }], mfDismiss: [{ type: i0.Output, args: ["mfDismiss"] }] } });
186
+
187
+ /**
188
+ * Autocompletar de la librería ng-comps.
189
+ * Envuelve Angular Material `mat-autocomplete` y expone una API uniforme
190
+ * con look and feel de marca.
191
+ *
192
+ * El panel desplegable se estiliza con la clase global `mf-autocomplete-panel`.
193
+ * Puedes añadir clases adicionales con `panelClass`.
194
+ */
195
+ class MfAutocompleteComponent {
196
+ /** Lista completa de opciones */
197
+ options = input.required(...(ngDevMode ? [{ debugName: "options" }] : /* istanbul ignore next */ []));
198
+ /** Etiqueta flotante del campo */
199
+ label = input(undefined, ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
200
+ /** Placeholder del input */
201
+ placeholder = input('', ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
202
+ /** Valor actual (texto en el campo) */
203
+ value = input('', ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
204
+ /** Deshabilitado */
205
+ disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
206
+ /** Tamaño del campo */
207
+ size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
208
+ /** Ancho completo */
209
+ fullWidth = input(false, ...(ngDevMode ? [{ debugName: "fullWidth" }] : /* istanbul ignore next */ []));
210
+ /** Texto de ayuda debajo del campo */
211
+ hint = input(undefined, ...(ngDevMode ? [{ debugName: "hint" }] : /* istanbul ignore next */ []));
212
+ /** Mensaje de error */
213
+ error = input(undefined, ...(ngDevMode ? [{ debugName: "error" }] : /* istanbul ignore next */ []));
214
+ /** Icono al inicio del campo */
215
+ leadingIcon = input(undefined, ...(ngDevMode ? [{ debugName: "leadingIcon" }] : /* istanbul ignore next */ []));
216
+ /** Icono al final del campo */
217
+ trailingIcon = input(undefined, ...(ngDevMode ? [{ debugName: "trailingIcon" }] : /* istanbul ignore next */ []));
218
+ /**
219
+ * Ancho del panel del autocomplete.
220
+ * Por defecto `''`: el panel toma el mismo ancho que el campo.
221
+ * Acepta cualquier valor CSS válido ('300px', '80vw', etc.) para sobreescribirlo.
222
+ */
223
+ panelWidth = input('', ...(ngDevMode ? [{ debugName: "panelWidth" }] : /* istanbul ignore next */ []));
224
+ /**
225
+ * Clases extra que se añaden al panel del autocomplete (overlay).
226
+ * La clase `mf-autocomplete-panel` siempre está presente.
227
+ */
228
+ panelClass = input('', ...(ngDevMode ? [{ debugName: "panelClass" }] : /* istanbul ignore next */ []));
229
+ /** Emite el texto escrito en el campo */
230
+ mfInput = output();
231
+ /** Emite el valor de la opción seleccionada */
232
+ mfOptionSelected = output();
233
+ mfBlur = output();
234
+ inputValue = '';
235
+ hostClasses = computed(() => {
236
+ const classes = ['mf-autocomplete', `mf-autocomplete--${this.size()}`];
237
+ if (this.fullWidth())
238
+ classes.push('mf-autocomplete--full');
239
+ if (this.error())
240
+ classes.push('mf-autocomplete--error');
241
+ return classes.join(' ');
242
+ }, ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
243
+ autocompletePanelClasses = computed(() => {
244
+ const base = ['mf-autocomplete-panel'];
245
+ const extra = this.panelClass();
246
+ if (Array.isArray(extra)) {
247
+ base.push(...extra.filter(Boolean));
248
+ }
249
+ else if (extra) {
250
+ base.push(extra);
251
+ }
252
+ return base.join(' ');
253
+ }, ...(ngDevMode ? [{ debugName: "autocompletePanelClasses" }] : /* istanbul ignore next */ []));
254
+ filteredOptions = computed(() => {
255
+ const query = this.inputValue.toLowerCase().trim();
256
+ if (!query)
257
+ return this.options();
258
+ return this.options().filter((o) => o.label.toLowerCase().includes(query));
259
+ }, ...(ngDevMode ? [{ debugName: "filteredOptions" }] : /* istanbul ignore next */ []));
260
+ constructor() {
261
+ effect(() => {
262
+ this.inputValue = this.value();
263
+ });
264
+ }
265
+ onInputChange(value) {
266
+ this.mfInput.emit(value);
267
+ }
268
+ onOptionSelected(event) {
269
+ const label = event.option.value;
270
+ const match = this.options().find((o) => o.label === label);
271
+ if (match) {
272
+ this.mfOptionSelected.emit(match);
273
+ }
274
+ }
275
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: MfAutocompleteComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
276
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.4", type: MfAutocompleteComponent, isStandalone: true, selector: "mf-autocomplete", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: true, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, fullWidth: { classPropertyName: "fullWidth", publicName: "fullWidth", isSignal: true, isRequired: false, transformFunction: null }, hint: { classPropertyName: "hint", publicName: "hint", isSignal: true, isRequired: false, transformFunction: null }, error: { classPropertyName: "error", publicName: "error", isSignal: true, isRequired: false, transformFunction: null }, leadingIcon: { classPropertyName: "leadingIcon", publicName: "leadingIcon", isSignal: true, isRequired: false, transformFunction: null }, trailingIcon: { classPropertyName: "trailingIcon", publicName: "trailingIcon", isSignal: true, isRequired: false, transformFunction: null }, panelWidth: { classPropertyName: "panelWidth", publicName: "panelWidth", isSignal: true, isRequired: false, transformFunction: null }, panelClass: { classPropertyName: "panelClass", publicName: "panelClass", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { mfInput: "mfInput", mfOptionSelected: "mfOptionSelected", mfBlur: "mfBlur" }, ngImport: i0, template: `
277
+ <mat-form-field [appearance]="'outline'" [class]="hostClasses()">
278
+ @if (label()) {
279
+ <mat-label>{{ label() }}</mat-label>
280
+ }
281
+ @if (leadingIcon()) {
282
+ <mat-icon matPrefix aria-hidden="true">{{ leadingIcon() }}</mat-icon>
283
+ }
284
+ <input
285
+ matInput
286
+ [placeholder]="placeholder()"
287
+ [disabled]="disabled()"
288
+ [matAutocomplete]="auto"
289
+ [(ngModel)]="inputValue"
290
+ (ngModelChange)="onInputChange($event)"
291
+ (blur)="mfBlur.emit()"
292
+ />
293
+ @if (trailingIcon()) {
294
+ <mat-icon matSuffix aria-hidden="true">{{ trailingIcon() }}</mat-icon>
295
+ }
296
+ @if (hint()) {
297
+ <mat-hint>{{ hint() }}</mat-hint>
298
+ }
299
+ @if (error()) {
300
+ <mat-error>{{ error() }}</mat-error>
301
+ }
302
+ <mat-autocomplete
303
+ #auto
304
+ [panelWidth]="panelWidth()"
305
+ [class]="autocompletePanelClasses()"
306
+ (optionSelected)="onOptionSelected($event)"
307
+ >
308
+ @for (option of filteredOptions(); track option.value) {
309
+ <mat-option [value]="option.label" [disabled]="option.disabled ?? false">
310
+ {{ option.label }}
311
+ </mat-option>
312
+ }
313
+ </mat-autocomplete>
314
+ </mat-form-field>
315
+ `, isInline: true, styles: [":host{display:inline-block}.mf-autocomplete{font-family:var(--mf-font-base)!important;width:100%}.mf-autocomplete--full{width:100%}.mf-autocomplete .mat-mdc-text-field-wrapper{border-radius:var(--mf-radius-md)!important}.mf-autocomplete .mdc-notched-outline__leading,.mf-autocomplete .mdc-notched-outline__notch,.mf-autocomplete .mdc-notched-outline__trailing{border-color:var(--mf-color-border)!important;transition:border-color var(--mf-duration-base) var(--mf-ease-standard)}.mf-autocomplete .mat-mdc-form-field-focus-overlay{background-color:transparent!important}.mf-autocomplete.mat-focused .mdc-notched-outline__leading,.mf-autocomplete.mat-focused .mdc-notched-outline__notch,.mf-autocomplete.mat-focused .mdc-notched-outline__trailing{border-color:var(--mf-color-brand)!important;border-width:1.5px!important}.mf-autocomplete--error .mdc-notched-outline__leading,.mf-autocomplete--error .mdc-notched-outline__notch,.mf-autocomplete--error .mdc-notched-outline__trailing{border-color:var(--mf-color-error-500)!important}.mf-autocomplete .mat-mdc-floating-label{font-family:var(--mf-font-base)!important;font-weight:var(--mf-weight-medium)!important;color:var(--mf-color-neutral-400)!important}.mf-autocomplete.mat-focused .mat-mdc-floating-label{color:var(--mf-color-brand)!important}.mf-autocomplete .mat-mdc-input-element{font-family:var(--mf-font-base)!important;color:var(--mf-color-on-surface)!important;caret-color:var(--mf-color-brand)}.mf-autocomplete .mat-mdc-form-field-hint{font-size:var(--mf-text-xs)!important;color:var(--mf-color-neutral-400)!important}.mf-autocomplete .mat-mdc-form-field-error{font-size:var(--mf-text-xs)!important}.mf-autocomplete .mat-icon{color:var(--mf-color-neutral-400)!important;font-size:20px;width:20px;height:20px;transition:color var(--mf-duration-base) var(--mf-ease-standard)}.mf-autocomplete.mat-focused .mat-icon{color:var(--mf-color-brand)!important}.mf-autocomplete--sm .mat-mdc-input-element{font-size:var(--mf-text-sm)!important}.mf-autocomplete--md .mat-mdc-input-element{font-size:var(--mf-text-base)!important}.mf-autocomplete--lg .mat-mdc-input-element{font-size:var(--mf-text-lg)!important;padding-top:var(--mf-space-1)!important;padding-bottom:var(--mf-space-1)!important}.mf-autocomplete .mat-mdc-input-element:disabled{color:var(--mf-color-neutral-300)!important}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatAutocompleteModule }, { kind: "component", type: i2.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i2.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: i2.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i1$3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i1$3.MatLabel, selector: "mat-label" }, { kind: "directive", type: i1$3.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i1$3.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i1$3.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i1$3.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
316
+ }
317
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: MfAutocompleteComponent, decorators: [{
318
+ type: Component,
319
+ args: [{ selector: 'mf-autocomplete', imports: [
320
+ FormsModule,
321
+ MatAutocompleteModule,
322
+ MatFormFieldModule,
323
+ MatIconModule,
324
+ MatInputModule,
325
+ ], template: `
326
+ <mat-form-field [appearance]="'outline'" [class]="hostClasses()">
327
+ @if (label()) {
328
+ <mat-label>{{ label() }}</mat-label>
329
+ }
330
+ @if (leadingIcon()) {
331
+ <mat-icon matPrefix aria-hidden="true">{{ leadingIcon() }}</mat-icon>
332
+ }
333
+ <input
334
+ matInput
335
+ [placeholder]="placeholder()"
336
+ [disabled]="disabled()"
337
+ [matAutocomplete]="auto"
338
+ [(ngModel)]="inputValue"
339
+ (ngModelChange)="onInputChange($event)"
340
+ (blur)="mfBlur.emit()"
341
+ />
342
+ @if (trailingIcon()) {
343
+ <mat-icon matSuffix aria-hidden="true">{{ trailingIcon() }}</mat-icon>
344
+ }
345
+ @if (hint()) {
346
+ <mat-hint>{{ hint() }}</mat-hint>
347
+ }
348
+ @if (error()) {
349
+ <mat-error>{{ error() }}</mat-error>
350
+ }
351
+ <mat-autocomplete
352
+ #auto
353
+ [panelWidth]="panelWidth()"
354
+ [class]="autocompletePanelClasses()"
355
+ (optionSelected)="onOptionSelected($event)"
356
+ >
357
+ @for (option of filteredOptions(); track option.value) {
358
+ <mat-option [value]="option.label" [disabled]="option.disabled ?? false">
359
+ {{ option.label }}
360
+ </mat-option>
361
+ }
362
+ </mat-autocomplete>
363
+ </mat-form-field>
364
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:inline-block}.mf-autocomplete{font-family:var(--mf-font-base)!important;width:100%}.mf-autocomplete--full{width:100%}.mf-autocomplete .mat-mdc-text-field-wrapper{border-radius:var(--mf-radius-md)!important}.mf-autocomplete .mdc-notched-outline__leading,.mf-autocomplete .mdc-notched-outline__notch,.mf-autocomplete .mdc-notched-outline__trailing{border-color:var(--mf-color-border)!important;transition:border-color var(--mf-duration-base) var(--mf-ease-standard)}.mf-autocomplete .mat-mdc-form-field-focus-overlay{background-color:transparent!important}.mf-autocomplete.mat-focused .mdc-notched-outline__leading,.mf-autocomplete.mat-focused .mdc-notched-outline__notch,.mf-autocomplete.mat-focused .mdc-notched-outline__trailing{border-color:var(--mf-color-brand)!important;border-width:1.5px!important}.mf-autocomplete--error .mdc-notched-outline__leading,.mf-autocomplete--error .mdc-notched-outline__notch,.mf-autocomplete--error .mdc-notched-outline__trailing{border-color:var(--mf-color-error-500)!important}.mf-autocomplete .mat-mdc-floating-label{font-family:var(--mf-font-base)!important;font-weight:var(--mf-weight-medium)!important;color:var(--mf-color-neutral-400)!important}.mf-autocomplete.mat-focused .mat-mdc-floating-label{color:var(--mf-color-brand)!important}.mf-autocomplete .mat-mdc-input-element{font-family:var(--mf-font-base)!important;color:var(--mf-color-on-surface)!important;caret-color:var(--mf-color-brand)}.mf-autocomplete .mat-mdc-form-field-hint{font-size:var(--mf-text-xs)!important;color:var(--mf-color-neutral-400)!important}.mf-autocomplete .mat-mdc-form-field-error{font-size:var(--mf-text-xs)!important}.mf-autocomplete .mat-icon{color:var(--mf-color-neutral-400)!important;font-size:20px;width:20px;height:20px;transition:color var(--mf-duration-base) var(--mf-ease-standard)}.mf-autocomplete.mat-focused .mat-icon{color:var(--mf-color-brand)!important}.mf-autocomplete--sm .mat-mdc-input-element{font-size:var(--mf-text-sm)!important}.mf-autocomplete--md .mat-mdc-input-element{font-size:var(--mf-text-base)!important}.mf-autocomplete--lg .mat-mdc-input-element{font-size:var(--mf-text-lg)!important;padding-top:var(--mf-space-1)!important;padding-bottom:var(--mf-space-1)!important}.mf-autocomplete .mat-mdc-input-element:disabled{color:var(--mf-color-neutral-300)!important}\n"] }]
365
+ }], ctorParameters: () => [], propDecorators: { options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: true }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], fullWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "fullWidth", required: false }] }], hint: [{ type: i0.Input, args: [{ isSignal: true, alias: "hint", required: false }] }], error: [{ type: i0.Input, args: [{ isSignal: true, alias: "error", required: false }] }], leadingIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "leadingIcon", required: false }] }], trailingIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "trailingIcon", required: false }] }], panelWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelWidth", required: false }] }], panelClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelClass", required: false }] }], mfInput: [{ type: i0.Output, args: ["mfInput"] }], mfOptionSelected: [{ type: i0.Output, args: ["mfOptionSelected"] }], mfBlur: [{ type: i0.Output, args: ["mfBlur"] }] } });
366
+
367
+ /**
368
+ * Avatar de la librería ng-comps.
369
+ * Muestra una imagen de perfil, iniciales o un icono.
370
+ * Componente puro sin dependencia de Angular Material.
371
+ */
372
+ class MfAvatarComponent {
373
+ /** URL de la imagen */
374
+ src = input(undefined, ...(ngDevMode ? [{ debugName: "src" }] : /* istanbul ignore next */ []));
375
+ /** Texto alternativo */
376
+ alt = input('', ...(ngDevMode ? [{ debugName: "alt" }] : /* istanbul ignore next */ []));
377
+ /** Nombre completo para generar iniciales */
378
+ name = input('', ...(ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []));
379
+ /** Tamaño */
380
+ size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
381
+ /** Forma */
382
+ variant = input('circle', ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
383
+ initials = computed(() => {
384
+ const n = this.name();
385
+ if (!n)
386
+ return '?';
387
+ const parts = n.trim().split(/\s+/);
388
+ if (parts.length === 1)
389
+ return parts[0].charAt(0).toUpperCase();
390
+ return (parts[0].charAt(0) + parts[parts.length - 1].charAt(0)).toUpperCase();
391
+ }, ...(ngDevMode ? [{ debugName: "initials" }] : /* istanbul ignore next */ []));
392
+ hostClasses = computed(() => {
393
+ return ['mf-avatar', `mf-avatar--${this.size()}`, `mf-avatar--${this.variant()}`].join(' ');
394
+ }, ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
395
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: MfAvatarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
396
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.4", type: MfAvatarComponent, isStandalone: true, selector: "mf-avatar", inputs: { src: { classPropertyName: "src", publicName: "src", isSignal: true, isRequired: false, transformFunction: null }, alt: { classPropertyName: "alt", publicName: "alt", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
397
+ @if (src()) {
398
+ <img
399
+ [src]="src()"
400
+ [alt]="alt()"
401
+ [class]="hostClasses()"
402
+ />
403
+ } @else {
404
+ <span [class]="hostClasses()" [attr.aria-label]="alt()">
405
+ {{ initials() }}
406
+ </span>
407
+ }
408
+ `, isInline: true, styles: [":host{display:inline-block}.mf-avatar{display:inline-flex;align-items:center;justify-content:center;overflow:hidden;object-fit:cover;background-color:var(--mf-color-primary-100);color:var(--mf-color-primary-800);font-family:var(--mf-font-base);font-weight:var(--mf-weight-bold);-webkit-user-select:none;user-select:none}.mf-avatar--xs{width:24px;height:24px;font-size:var(--mf-text-xs)}.mf-avatar--sm{width:32px;height:32px;font-size:var(--mf-text-sm)}.mf-avatar--md{width:40px;height:40px;font-size:var(--mf-text-base)}.mf-avatar--lg{width:56px;height:56px;font-size:var(--mf-text-xl)}.mf-avatar--xl{width:80px;height:80px;font-size:var(--mf-text-3xl)}.mf-avatar--circle{border-radius:var(--mf-radius-full)}.mf-avatar--rounded{border-radius:var(--mf-radius-md)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
409
+ }
410
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: MfAvatarComponent, decorators: [{
411
+ type: Component,
412
+ args: [{ selector: 'mf-avatar', imports: [], template: `
413
+ @if (src()) {
414
+ <img
415
+ [src]="src()"
416
+ [alt]="alt()"
417
+ [class]="hostClasses()"
418
+ />
419
+ } @else {
420
+ <span [class]="hostClasses()" [attr.aria-label]="alt()">
421
+ {{ initials() }}
422
+ </span>
423
+ }
424
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:inline-block}.mf-avatar{display:inline-flex;align-items:center;justify-content:center;overflow:hidden;object-fit:cover;background-color:var(--mf-color-primary-100);color:var(--mf-color-primary-800);font-family:var(--mf-font-base);font-weight:var(--mf-weight-bold);-webkit-user-select:none;user-select:none}.mf-avatar--xs{width:24px;height:24px;font-size:var(--mf-text-xs)}.mf-avatar--sm{width:32px;height:32px;font-size:var(--mf-text-sm)}.mf-avatar--md{width:40px;height:40px;font-size:var(--mf-text-base)}.mf-avatar--lg{width:56px;height:56px;font-size:var(--mf-text-xl)}.mf-avatar--xl{width:80px;height:80px;font-size:var(--mf-text-3xl)}.mf-avatar--circle{border-radius:var(--mf-radius-full)}.mf-avatar--rounded{border-radius:var(--mf-radius-md)}\n"] }]
425
+ }], propDecorators: { src: [{ type: i0.Input, args: [{ isSignal: true, alias: "src", required: false }] }], alt: [{ type: i0.Input, args: [{ isSignal: true, alias: "alt", required: false }] }], name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }] } });
426
+
427
+ /**
428
+ * Badge de la librería ng-comps.
429
+ * Envuelve Angular Material `matBadge` y expone una API uniforme
430
+ * con look and feel de marca.
431
+ */
432
+ class MfBadgeComponent {
433
+ /** Contenido del badge (texto o número) */
434
+ content = input('', ...(ngDevMode ? [{ debugName: "content" }] : /* istanbul ignore next */ []));
435
+ /** Color semántico */
436
+ color = input('brand', ...(ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []));
437
+ /** Tamaño del badge */
438
+ size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
439
+ /** Posición del badge */
440
+ position = input('above-after', ...(ngDevMode ? [{ debugName: "position" }] : /* istanbul ignore next */ []));
441
+ /** Ocultar el badge */
442
+ hidden = input(false, ...(ngDevMode ? [{ debugName: "hidden" }] : /* istanbul ignore next */ []));
443
+ /** Deshabilitado */
444
+ disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
445
+ /** Superponer sobre el contenido */
446
+ overlap = input(true, ...(ngDevMode ? [{ debugName: "overlap" }] : /* istanbul ignore next */ []));
447
+ matPosition = computed(() => {
448
+ const pos = this.position();
449
+ const map = {
450
+ 'above-after': 'above after',
451
+ 'above-before': 'above before',
452
+ 'below-after': 'below after',
453
+ 'below-before': 'below before',
454
+ };
455
+ return map[pos];
456
+ }, ...(ngDevMode ? [{ debugName: "matPosition" }] : /* istanbul ignore next */ []));
457
+ matSize = computed(() => {
458
+ const map = { sm: 'small', md: 'medium', lg: 'large' };
459
+ return map[this.size()];
460
+ }, ...(ngDevMode ? [{ debugName: "matSize" }] : /* istanbul ignore next */ []));
461
+ hostClasses = computed(() => {
462
+ return ['mf-badge', `mf-badge--${this.color()}`].join(' ');
463
+ }, ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
464
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: MfBadgeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
465
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.4", type: MfBadgeComponent, isStandalone: true, selector: "mf-badge", inputs: { content: { classPropertyName: "content", publicName: "content", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null }, hidden: { classPropertyName: "hidden", publicName: "hidden", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, overlap: { classPropertyName: "overlap", publicName: "overlap", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
466
+ <span
467
+ [matBadge]="content()"
468
+ [matBadgeHidden]="hidden()"
469
+ [matBadgeDisabled]="disabled()"
470
+ [matBadgeOverlap]="overlap()"
471
+ [matBadgePosition]="matPosition()"
472
+ [matBadgeSize]="matSize()"
473
+ [class]="hostClasses()"
474
+ >
475
+ <ng-content />
476
+ </span>
477
+ `, isInline: true, styles: [":host{display:inline-block}.mf-badge--brand .mat-badge-content{background-color:var(--mf-color-brand)!important;color:var(--mf-color-on-brand)!important}.mf-badge--accent .mat-badge-content{background-color:var(--mf-color-accent-500)!important;color:var(--mf-color-neutral-900)!important}.mf-badge--error .mat-badge-content{background-color:var(--mf-color-error-500)!important;color:var(--mf-color-neutral-0)!important}.mf-badge--neutral .mat-badge-content{background-color:var(--mf-color-neutral-400)!important;color:var(--mf-color-neutral-0)!important}.mat-badge-content{font-family:var(--mf-font-base)!important;font-weight:var(--mf-weight-bold)!important}\n"], dependencies: [{ kind: "ngmodule", type: MatBadgeModule }, { kind: "directive", type: i1$4.MatBadge, selector: "[matBadge]", inputs: ["matBadgeColor", "matBadgeOverlap", "matBadgeDisabled", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
478
+ }
479
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: MfBadgeComponent, decorators: [{
480
+ type: Component,
481
+ args: [{ selector: 'mf-badge', imports: [MatBadgeModule], template: `
482
+ <span
483
+ [matBadge]="content()"
484
+ [matBadgeHidden]="hidden()"
485
+ [matBadgeDisabled]="disabled()"
486
+ [matBadgeOverlap]="overlap()"
487
+ [matBadgePosition]="matPosition()"
488
+ [matBadgeSize]="matSize()"
489
+ [class]="hostClasses()"
490
+ >
491
+ <ng-content />
492
+ </span>
493
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:inline-block}.mf-badge--brand .mat-badge-content{background-color:var(--mf-color-brand)!important;color:var(--mf-color-on-brand)!important}.mf-badge--accent .mat-badge-content{background-color:var(--mf-color-accent-500)!important;color:var(--mf-color-neutral-900)!important}.mf-badge--error .mat-badge-content{background-color:var(--mf-color-error-500)!important;color:var(--mf-color-neutral-0)!important}.mf-badge--neutral .mat-badge-content{background-color:var(--mf-color-neutral-400)!important;color:var(--mf-color-neutral-0)!important}.mat-badge-content{font-family:var(--mf-font-base)!important;font-weight:var(--mf-weight-bold)!important}\n"] }]
494
+ }], propDecorators: { content: [{ type: i0.Input, args: [{ isSignal: true, alias: "content", required: false }] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], position: [{ type: i0.Input, args: [{ isSignal: true, alias: "position", required: false }] }], hidden: [{ type: i0.Input, args: [{ isSignal: true, alias: "hidden", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], overlap: [{ type: i0.Input, args: [{ isSignal: true, alias: "overlap", required: false }] }] } });
495
+
496
+ /**
497
+ * Breadcrumb de la librería ng-comps.
498
+ * Componente de navegación jerárquica para indicar la ubicación
499
+ * del usuario en la aplicación.
500
+ */
501
+ class MfBreadcrumbComponent {
502
+ /** Items del breadcrumb */
503
+ items = input.required(...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
504
+ /** Icono separador */
505
+ separator = input('chevron_right', ...(ngDevMode ? [{ debugName: "separator" }] : /* istanbul ignore next */ []));
506
+ /** Label de accesibilidad */
507
+ ariaLabel = input('Breadcrumb', ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
508
+ mfItemClick = output();
509
+ hostClasses = computed(() => 'mf-breadcrumb', ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
510
+ onItemClick(event, item) {
511
+ event.preventDefault();
512
+ this.mfItemClick.emit(item);
513
+ }
514
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: MfBreadcrumbComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
515
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.4", type: MfBreadcrumbComponent, isStandalone: true, selector: "mf-breadcrumb", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: true, transformFunction: null }, separator: { classPropertyName: "separator", publicName: "separator", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { mfItemClick: "mfItemClick" }, ngImport: i0, template: `
516
+ <nav [attr.aria-label]="ariaLabel()" [class]="hostClasses()">
517
+ <ol class="mf-breadcrumb__list">
518
+ @for (item of items(); track item.label; let last = $last) {
519
+ <li class="mf-breadcrumb__item">
520
+ @if (!last && item.href) {
521
+ <a
522
+ class="mf-breadcrumb__link"
523
+ [href]="item.href"
524
+ (click)="onItemClick($event, item)"
525
+ >
526
+ @if (item.icon) {
527
+ <mat-icon class="mf-breadcrumb__icon" aria-hidden="true">{{ item.icon }}</mat-icon>
528
+ }
529
+ {{ item.label }}
530
+ </a>
531
+ } @else {
532
+ <span class="mf-breadcrumb__current" [attr.aria-current]="last ? 'page' : null">
533
+ @if (item.icon) {
534
+ <mat-icon class="mf-breadcrumb__icon" aria-hidden="true">{{ item.icon }}</mat-icon>
535
+ }
536
+ {{ item.label }}
537
+ </span>
538
+ }
539
+ @if (!last) {
540
+ <mat-icon class="mf-breadcrumb__separator" aria-hidden="true">{{ separator() }}</mat-icon>
541
+ }
542
+ </li>
543
+ }
544
+ </ol>
545
+ </nav>
546
+ `, isInline: true, styles: [":host{display:block}.mf-breadcrumb__list{display:flex;align-items:center;flex-wrap:wrap;list-style:none;margin:0;padding:0;gap:var(--mf-space-1)}.mf-breadcrumb__item{display:flex;align-items:center;gap:var(--mf-space-1)}.mf-breadcrumb__link{display:inline-flex;align-items:center;gap:var(--mf-space-1);color:var(--mf-color-brand);text-decoration:none;font-family:var(--mf-font-base);font-size:var(--mf-text-sm);font-weight:var(--mf-weight-medium);padding:var(--mf-space-1) var(--mf-space-2);border-radius:var(--mf-radius-sm);transition:background-color var(--mf-duration-fast) var(--mf-ease-standard)}.mf-breadcrumb__link:hover{background-color:var(--mf-color-brand-light)}.mf-breadcrumb__current{display:inline-flex;align-items:center;gap:var(--mf-space-1);color:var(--mf-color-neutral-400);font-family:var(--mf-font-base);font-size:var(--mf-text-sm);font-weight:var(--mf-weight-medium);padding:var(--mf-space-1) var(--mf-space-2)}.mf-breadcrumb__separator{font-size:18px!important;width:18px!important;height:18px!important;color:var(--mf-color-neutral-300)}.mf-breadcrumb__icon{font-size:16px!important;width:16px!important;height:16px!important}\n"], dependencies: [{ kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
547
+ }
548
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: MfBreadcrumbComponent, decorators: [{
549
+ type: Component,
550
+ args: [{ selector: 'mf-breadcrumb', imports: [MatIconModule], template: `
551
+ <nav [attr.aria-label]="ariaLabel()" [class]="hostClasses()">
552
+ <ol class="mf-breadcrumb__list">
553
+ @for (item of items(); track item.label; let last = $last) {
554
+ <li class="mf-breadcrumb__item">
555
+ @if (!last && item.href) {
556
+ <a
557
+ class="mf-breadcrumb__link"
558
+ [href]="item.href"
559
+ (click)="onItemClick($event, item)"
560
+ >
561
+ @if (item.icon) {
562
+ <mat-icon class="mf-breadcrumb__icon" aria-hidden="true">{{ item.icon }}</mat-icon>
563
+ }
564
+ {{ item.label }}
565
+ </a>
566
+ } @else {
567
+ <span class="mf-breadcrumb__current" [attr.aria-current]="last ? 'page' : null">
568
+ @if (item.icon) {
569
+ <mat-icon class="mf-breadcrumb__icon" aria-hidden="true">{{ item.icon }}</mat-icon>
570
+ }
571
+ {{ item.label }}
572
+ </span>
573
+ }
574
+ @if (!last) {
575
+ <mat-icon class="mf-breadcrumb__separator" aria-hidden="true">{{ separator() }}</mat-icon>
576
+ }
577
+ </li>
578
+ }
579
+ </ol>
580
+ </nav>
581
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block}.mf-breadcrumb__list{display:flex;align-items:center;flex-wrap:wrap;list-style:none;margin:0;padding:0;gap:var(--mf-space-1)}.mf-breadcrumb__item{display:flex;align-items:center;gap:var(--mf-space-1)}.mf-breadcrumb__link{display:inline-flex;align-items:center;gap:var(--mf-space-1);color:var(--mf-color-brand);text-decoration:none;font-family:var(--mf-font-base);font-size:var(--mf-text-sm);font-weight:var(--mf-weight-medium);padding:var(--mf-space-1) var(--mf-space-2);border-radius:var(--mf-radius-sm);transition:background-color var(--mf-duration-fast) var(--mf-ease-standard)}.mf-breadcrumb__link:hover{background-color:var(--mf-color-brand-light)}.mf-breadcrumb__current{display:inline-flex;align-items:center;gap:var(--mf-space-1);color:var(--mf-color-neutral-400);font-family:var(--mf-font-base);font-size:var(--mf-text-sm);font-weight:var(--mf-weight-medium);padding:var(--mf-space-1) var(--mf-space-2)}.mf-breadcrumb__separator{font-size:18px!important;width:18px!important;height:18px!important;color:var(--mf-color-neutral-300)}.mf-breadcrumb__icon{font-size:16px!important;width:16px!important;height:16px!important}\n"] }]
582
+ }], propDecorators: { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: true }] }], separator: [{ type: i0.Input, args: [{ isSignal: true, alias: "separator", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], mfItemClick: [{ type: i0.Output, args: ["mfItemClick"] }] } });
583
+
584
+ /**
585
+ * Botón de la librería ng-comps.
586
+ * Envuelve Angular Material `mat-button` / `mat-flat-button` / `mat-stroked-button`
587
+ * y expone una API uniforme con look and feel de marca.
588
+ */
589
+ class MfButtonComponent {
590
+ label = input.required(...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
591
+ variant = input('filled', ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
592
+ size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
593
+ type = input('button', ...(ngDevMode ? [{ debugName: "type" }] : /* istanbul ignore next */ []));
594
+ disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
595
+ leadingIcon = input(undefined, ...(ngDevMode ? [{ debugName: "leadingIcon" }] : /* istanbul ignore next */ []));
596
+ trailingIcon = input(undefined, ...(ngDevMode ? [{ debugName: "trailingIcon" }] : /* istanbul ignore next */ []));
597
+ fullWidth = input(false, ...(ngDevMode ? [{ debugName: "fullWidth" }] : /* istanbul ignore next */ []));
598
+ mfClick = output();
599
+ hostClasses = computed(() => {
600
+ const classes = ['mf-btn', `mf-btn--${this.variant()}`, `mf-btn--${this.size()}`];
601
+ if (this.fullWidth())
602
+ classes.push('mf-btn--full');
603
+ return classes.join(' ');
604
+ }, ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
605
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: MfButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
606
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.4", type: MfButtonComponent, isStandalone: true, selector: "mf-button", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, leadingIcon: { classPropertyName: "leadingIcon", publicName: "leadingIcon", isSignal: true, isRequired: false, transformFunction: null }, trailingIcon: { classPropertyName: "trailingIcon", publicName: "trailingIcon", isSignal: true, isRequired: false, transformFunction: null }, fullWidth: { classPropertyName: "fullWidth", publicName: "fullWidth", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { mfClick: "mfClick" }, ngImport: i0, template: `
607
+ @if (variant() === 'filled') {
608
+ <button
609
+ mat-flat-button
610
+ [type]="type()"
611
+ [disabled]="disabled()"
612
+ [class]="hostClasses()"
613
+ (click)="mfClick.emit($event)"
614
+ >
615
+ @if (leadingIcon()) {
616
+ <mat-icon aria-hidden="true">{{ leadingIcon() }}</mat-icon>
617
+ }
618
+ <span>{{ label() }}</span>
619
+ @if (trailingIcon()) {
620
+ <mat-icon aria-hidden="true">{{ trailingIcon() }}</mat-icon>
621
+ }
622
+ </button>
623
+ } @else if (variant() === 'outlined') {
624
+ <button
625
+ mat-stroked-button
626
+ [type]="type()"
627
+ [disabled]="disabled()"
628
+ [class]="hostClasses()"
629
+ (click)="mfClick.emit($event)"
630
+ >
631
+ @if (leadingIcon()) {
632
+ <mat-icon aria-hidden="true">{{ leadingIcon() }}</mat-icon>
633
+ }
634
+ <span>{{ label() }}</span>
635
+ @if (trailingIcon()) {
636
+ <mat-icon aria-hidden="true">{{ trailingIcon() }}</mat-icon>
637
+ }
638
+ </button>
639
+ } @else {
640
+ <button
641
+ mat-button
642
+ [type]="type()"
643
+ [disabled]="disabled()"
644
+ [class]="hostClasses()"
645
+ (click)="mfClick.emit($event)"
646
+ >
647
+ @if (leadingIcon()) {
648
+ <mat-icon aria-hidden="true">{{ leadingIcon() }}</mat-icon>
649
+ }
650
+ <span>{{ label() }}</span>
651
+ @if (trailingIcon()) {
652
+ <mat-icon aria-hidden="true">{{ trailingIcon() }}</mat-icon>
653
+ }
654
+ </button>
655
+ }
656
+ `, isInline: true, styles: [":host{display:inline-block}:host([fullWidth]),:host-context(.mf-btn--full){display:block}.mf-btn{border-radius:var(--mf-radius-full)!important;font-family:var(--mf-font-base)!important;font-weight:var(--mf-weight-bold)!important;letter-spacing:.01em;transition:background-color var(--mf-duration-base) var(--mf-ease-standard),box-shadow var(--mf-duration-base) var(--mf-ease-standard),opacity var(--mf-duration-fast) var(--mf-ease-standard)}.mf-btn.mf-btn--full{width:100%}.mf-btn--filled.mdc-button,.mf-btn--filled.mat-mdc-unelevated-button{background-color:var(--mf-color-brand)!important;color:var(--mf-color-on-brand)!important}.mf-btn--filled.mdc-button:hover:not([disabled]),.mf-btn--filled.mat-mdc-unelevated-button:hover:not([disabled]){background-color:var(--mf-color-brand-hover)!important;box-shadow:var(--mf-shadow-md)}.mf-btn--outlined.mdc-button,.mf-btn--outlined.mat-mdc-outlined-button{color:var(--mf-color-secondary-900)!important;border-color:var(--mf-color-border)!important;background-color:var(--mf-color-surface)}.mf-btn--outlined.mdc-button:hover:not([disabled]),.mf-btn--outlined.mat-mdc-outlined-button:hover:not([disabled]){background-color:var(--mf-color-surface-raised);box-shadow:var(--mf-shadow-sm)}.mf-btn--text.mdc-button,.mf-btn--text.mat-mdc-button{color:var(--mf-color-brand)!important}.mf-btn--text.mdc-button:hover:not([disabled]),.mf-btn--text.mat-mdc-button:hover:not([disabled]){background-color:var(--mf-color-brand-light)}.mf-btn--sm.mdc-button{height:34px!important;padding:0 var(--mf-space-4)!important;font-size:var(--mf-text-sm)!important}.mf-btn--md.mdc-button{height:40px!important;padding:0 var(--mf-space-5)!important;font-size:var(--mf-text-sm)!important}.mf-btn--lg.mdc-button{height:48px!important;padding:0 var(--mf-space-6)!important;font-size:var(--mf-text-base)!important}.mf-btn[disabled],.mf-btn.mdc-button:disabled{opacity:.42;cursor:default;pointer-events:none}.mf-btn .mat-icon{font-size:1.1em;height:1.1em;width:1.1em;vertical-align:middle;line-height:1}\n"], dependencies: [{ kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1$5.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
657
+ }
658
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: MfButtonComponent, decorators: [{
659
+ type: Component,
660
+ args: [{ selector: 'mf-button', imports: [MatButtonModule, MatIconModule], template: `
661
+ @if (variant() === 'filled') {
662
+ <button
663
+ mat-flat-button
664
+ [type]="type()"
665
+ [disabled]="disabled()"
666
+ [class]="hostClasses()"
667
+ (click)="mfClick.emit($event)"
668
+ >
669
+ @if (leadingIcon()) {
670
+ <mat-icon aria-hidden="true">{{ leadingIcon() }}</mat-icon>
671
+ }
672
+ <span>{{ label() }}</span>
673
+ @if (trailingIcon()) {
674
+ <mat-icon aria-hidden="true">{{ trailingIcon() }}</mat-icon>
675
+ }
676
+ </button>
677
+ } @else if (variant() === 'outlined') {
678
+ <button
679
+ mat-stroked-button
680
+ [type]="type()"
681
+ [disabled]="disabled()"
682
+ [class]="hostClasses()"
683
+ (click)="mfClick.emit($event)"
684
+ >
685
+ @if (leadingIcon()) {
686
+ <mat-icon aria-hidden="true">{{ leadingIcon() }}</mat-icon>
687
+ }
688
+ <span>{{ label() }}</span>
689
+ @if (trailingIcon()) {
690
+ <mat-icon aria-hidden="true">{{ trailingIcon() }}</mat-icon>
691
+ }
692
+ </button>
693
+ } @else {
694
+ <button
695
+ mat-button
696
+ [type]="type()"
697
+ [disabled]="disabled()"
698
+ [class]="hostClasses()"
699
+ (click)="mfClick.emit($event)"
700
+ >
701
+ @if (leadingIcon()) {
702
+ <mat-icon aria-hidden="true">{{ leadingIcon() }}</mat-icon>
703
+ }
704
+ <span>{{ label() }}</span>
705
+ @if (trailingIcon()) {
706
+ <mat-icon aria-hidden="true">{{ trailingIcon() }}</mat-icon>
707
+ }
708
+ </button>
709
+ }
710
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:inline-block}:host([fullWidth]),:host-context(.mf-btn--full){display:block}.mf-btn{border-radius:var(--mf-radius-full)!important;font-family:var(--mf-font-base)!important;font-weight:var(--mf-weight-bold)!important;letter-spacing:.01em;transition:background-color var(--mf-duration-base) var(--mf-ease-standard),box-shadow var(--mf-duration-base) var(--mf-ease-standard),opacity var(--mf-duration-fast) var(--mf-ease-standard)}.mf-btn.mf-btn--full{width:100%}.mf-btn--filled.mdc-button,.mf-btn--filled.mat-mdc-unelevated-button{background-color:var(--mf-color-brand)!important;color:var(--mf-color-on-brand)!important}.mf-btn--filled.mdc-button:hover:not([disabled]),.mf-btn--filled.mat-mdc-unelevated-button:hover:not([disabled]){background-color:var(--mf-color-brand-hover)!important;box-shadow:var(--mf-shadow-md)}.mf-btn--outlined.mdc-button,.mf-btn--outlined.mat-mdc-outlined-button{color:var(--mf-color-secondary-900)!important;border-color:var(--mf-color-border)!important;background-color:var(--mf-color-surface)}.mf-btn--outlined.mdc-button:hover:not([disabled]),.mf-btn--outlined.mat-mdc-outlined-button:hover:not([disabled]){background-color:var(--mf-color-surface-raised);box-shadow:var(--mf-shadow-sm)}.mf-btn--text.mdc-button,.mf-btn--text.mat-mdc-button{color:var(--mf-color-brand)!important}.mf-btn--text.mdc-button:hover:not([disabled]),.mf-btn--text.mat-mdc-button:hover:not([disabled]){background-color:var(--mf-color-brand-light)}.mf-btn--sm.mdc-button{height:34px!important;padding:0 var(--mf-space-4)!important;font-size:var(--mf-text-sm)!important}.mf-btn--md.mdc-button{height:40px!important;padding:0 var(--mf-space-5)!important;font-size:var(--mf-text-sm)!important}.mf-btn--lg.mdc-button{height:48px!important;padding:0 var(--mf-space-6)!important;font-size:var(--mf-text-base)!important}.mf-btn[disabled],.mf-btn.mdc-button:disabled{opacity:.42;cursor:default;pointer-events:none}.mf-btn .mat-icon{font-size:1.1em;height:1.1em;width:1.1em;vertical-align:middle;line-height:1}\n"] }]
711
+ }], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: true }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], type: [{ type: i0.Input, args: [{ isSignal: true, alias: "type", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], leadingIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "leadingIcon", required: false }] }], trailingIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "trailingIcon", required: false }] }], fullWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "fullWidth", required: false }] }], mfClick: [{ type: i0.Output, args: ["mfClick"] }] } });
712
+
713
+ /**
714
+ * Card de la librería ng-comps.
715
+ * Envuelve Angular Material `mat-card` y expone una API uniforme
716
+ * con look and feel de marca. Admite contenido proyectado mediante slots.
717
+ */
718
+ class MfCardComponent {
719
+ /** Título de la card */
720
+ title = input(undefined, ...(ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []));
721
+ /** Subtítulo de la card */
722
+ subtitle = input(undefined, ...(ngDevMode ? [{ debugName: "subtitle" }] : /* istanbul ignore next */ []));
723
+ /** Variante visual */
724
+ variant = input('elevated', ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
725
+ /** Padding interno */
726
+ padding = input('md', ...(ngDevMode ? [{ debugName: "padding" }] : /* istanbul ignore next */ []));
727
+ /** Interactiva (hover effect) */
728
+ interactive = input(false, ...(ngDevMode ? [{ debugName: "interactive" }] : /* istanbul ignore next */ []));
729
+ hasHeader = computed(() => !!this.title() || !!this.subtitle(), ...(ngDevMode ? [{ debugName: "hasHeader" }] : /* istanbul ignore next */ []));
730
+ hostClasses = computed(() => {
731
+ const classes = ['mf-card', `mf-card--${this.variant()}`, `mf-card--pad-${this.padding()}`];
732
+ if (this.interactive())
733
+ classes.push('mf-card--interactive');
734
+ return classes.join(' ');
735
+ }, ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
736
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: MfCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
737
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.4", type: MfCardComponent, isStandalone: true, selector: "mf-card", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, subtitle: { classPropertyName: "subtitle", publicName: "subtitle", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, padding: { classPropertyName: "padding", publicName: "padding", isSignal: true, isRequired: false, transformFunction: null }, interactive: { classPropertyName: "interactive", publicName: "interactive", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
738
+ <mat-card [class]="hostClasses()">
739
+ @if (hasHeader()) {
740
+ <mat-card-header>
741
+ @if (title()) {
742
+ <mat-card-title class="mf-card__title">{{ title() }}</mat-card-title>
743
+ }
744
+ @if (subtitle()) {
745
+ <mat-card-subtitle class="mf-card__subtitle">{{ subtitle() }}</mat-card-subtitle>
746
+ }
747
+ </mat-card-header>
748
+ }
749
+ <mat-card-content>
750
+ <ng-content />
751
+ </mat-card-content>
752
+ <ng-content select="[mfCardFooter]" />
753
+ </mat-card>
754
+ `, isInline: true, styles: [":host{display:block}.mf-card{font-family:var(--mf-font-base)!important;border-radius:var(--mf-radius-xl)!important;overflow:hidden;transition:box-shadow var(--mf-duration-base) var(--mf-ease-standard),transform var(--mf-duration-base) var(--mf-ease-standard)}.mf-card--elevated{background-color:var(--mf-color-surface)!important;box-shadow:var(--mf-shadow-md)!important;border:none!important}.mf-card--outlined{background-color:var(--mf-color-surface)!important;box-shadow:none!important;border:1px solid var(--mf-color-border)!important}.mf-card--flat{background-color:var(--mf-color-surface-raised)!important;box-shadow:none!important;border:none!important}.mf-card--interactive{cursor:pointer}.mf-card--interactive:hover{box-shadow:var(--mf-shadow-lg)!important;transform:translateY(-2px)}.mf-card--interactive:active{transform:translateY(0)}.mf-card--pad-none .mat-mdc-card-content{padding:0!important}.mf-card--pad-sm .mat-mdc-card-content{padding:var(--mf-space-3)!important}.mf-card--pad-md .mat-mdc-card-content{padding:var(--mf-space-5)!important}.mf-card--pad-lg .mat-mdc-card-content{padding:var(--mf-space-8)!important}.mf-card .mat-mdc-card-header{padding:var(--mf-space-5) var(--mf-space-5) 0!important}.mf-card__title{font-family:var(--mf-font-display)!important;font-size:var(--mf-text-lg)!important;font-weight:var(--mf-weight-bold)!important;color:var(--mf-color-on-surface)!important;margin:0!important}.mf-card__subtitle{font-size:var(--mf-text-sm)!important;color:var(--mf-color-neutral-400)!important;margin-top:var(--mf-space-1)!important}\n"], dependencies: [{ kind: "ngmodule", type: MatCardModule }, { kind: "component", type: i1$6.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i1$6.MatCardContent, selector: "mat-card-content" }, { kind: "component", type: i1$6.MatCardHeader, selector: "mat-card-header" }, { kind: "directive", type: i1$6.MatCardSubtitle, selector: "mat-card-subtitle, [mat-card-subtitle], [matCardSubtitle]" }, { kind: "directive", type: i1$6.MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
755
+ }
756
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: MfCardComponent, decorators: [{
757
+ type: Component,
758
+ args: [{ selector: 'mf-card', imports: [MatCardModule], template: `
759
+ <mat-card [class]="hostClasses()">
760
+ @if (hasHeader()) {
761
+ <mat-card-header>
762
+ @if (title()) {
763
+ <mat-card-title class="mf-card__title">{{ title() }}</mat-card-title>
764
+ }
765
+ @if (subtitle()) {
766
+ <mat-card-subtitle class="mf-card__subtitle">{{ subtitle() }}</mat-card-subtitle>
767
+ }
768
+ </mat-card-header>
769
+ }
770
+ <mat-card-content>
771
+ <ng-content />
772
+ </mat-card-content>
773
+ <ng-content select="[mfCardFooter]" />
774
+ </mat-card>
775
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block}.mf-card{font-family:var(--mf-font-base)!important;border-radius:var(--mf-radius-xl)!important;overflow:hidden;transition:box-shadow var(--mf-duration-base) var(--mf-ease-standard),transform var(--mf-duration-base) var(--mf-ease-standard)}.mf-card--elevated{background-color:var(--mf-color-surface)!important;box-shadow:var(--mf-shadow-md)!important;border:none!important}.mf-card--outlined{background-color:var(--mf-color-surface)!important;box-shadow:none!important;border:1px solid var(--mf-color-border)!important}.mf-card--flat{background-color:var(--mf-color-surface-raised)!important;box-shadow:none!important;border:none!important}.mf-card--interactive{cursor:pointer}.mf-card--interactive:hover{box-shadow:var(--mf-shadow-lg)!important;transform:translateY(-2px)}.mf-card--interactive:active{transform:translateY(0)}.mf-card--pad-none .mat-mdc-card-content{padding:0!important}.mf-card--pad-sm .mat-mdc-card-content{padding:var(--mf-space-3)!important}.mf-card--pad-md .mat-mdc-card-content{padding:var(--mf-space-5)!important}.mf-card--pad-lg .mat-mdc-card-content{padding:var(--mf-space-8)!important}.mf-card .mat-mdc-card-header{padding:var(--mf-space-5) var(--mf-space-5) 0!important}.mf-card__title{font-family:var(--mf-font-display)!important;font-size:var(--mf-text-lg)!important;font-weight:var(--mf-weight-bold)!important;color:var(--mf-color-on-surface)!important;margin:0!important}.mf-card__subtitle{font-size:var(--mf-text-sm)!important;color:var(--mf-color-neutral-400)!important;margin-top:var(--mf-space-1)!important}\n"] }]
776
+ }], propDecorators: { title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: false }] }], subtitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "subtitle", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], padding: [{ type: i0.Input, args: [{ isSignal: true, alias: "padding", required: false }] }], interactive: [{ type: i0.Input, args: [{ isSignal: true, alias: "interactive", required: false }] }] } });
777
+
778
+ /**
779
+ * Checkbox de la librería ng-comps.
780
+ * Envuelve Angular Material `mat-checkbox` y expone una API uniforme
781
+ * con look and feel de marca.
782
+ */
783
+ class MfCheckboxComponent {
784
+ /** Texto del checkbox */
785
+ label = input.required(...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
786
+ /** Estado marcado */
787
+ checked = input(false, ...(ngDevMode ? [{ debugName: "checked" }] : /* istanbul ignore next */ []));
788
+ /** Estado indeterminado */
789
+ indeterminate = input(false, ...(ngDevMode ? [{ debugName: "indeterminate" }] : /* istanbul ignore next */ []));
790
+ /** Deshabilitado */
791
+ disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
792
+ mfChange = output();
793
+ hostClasses = computed(() => {
794
+ const classes = ['mf-checkbox'];
795
+ if (this.disabled())
796
+ classes.push('mf-checkbox--disabled');
797
+ return classes.join(' ');
798
+ }, ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
799
+ onChange(event) {
800
+ this.mfChange.emit(event.checked);
801
+ }
802
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: MfCheckboxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
803
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.4", type: MfCheckboxComponent, isStandalone: true, selector: "mf-checkbox", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, checked: { classPropertyName: "checked", publicName: "checked", isSignal: true, isRequired: false, transformFunction: null }, indeterminate: { classPropertyName: "indeterminate", publicName: "indeterminate", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { mfChange: "mfChange" }, ngImport: i0, template: `
804
+ <mat-checkbox
805
+ [checked]="checked()"
806
+ [disabled]="disabled()"
807
+ [indeterminate]="indeterminate()"
808
+ [class]="hostClasses()"
809
+ (change)="onChange($event)"
810
+ >
811
+ {{ label() }}
812
+ </mat-checkbox>
813
+ `, isInline: true, styles: [":host{display:inline-block}.mf-checkbox{font-family:var(--mf-font-base)!important}.mf-checkbox .mdc-label,.mf-checkbox .mat-mdc-checkbox-label{font-family:var(--mf-font-base)!important;font-size:var(--mf-text-sm)!important;color:var(--mf-color-on-surface)!important;cursor:pointer}.mf-checkbox .mdc-checkbox__background{border-color:var(--mf-color-neutral-300)!important;border-radius:var(--mf-radius-sm)!important;border-width:1.5px!important;transition:border-color var(--mf-duration-base) var(--mf-ease-standard),background-color var(--mf-duration-base) var(--mf-ease-standard)}.mf-checkbox .mdc-checkbox__native-control:checked~.mdc-checkbox__background,.mf-checkbox .mdc-checkbox__native-control:indeterminate~.mdc-checkbox__background{background-color:var(--mf-color-brand)!important;border-color:var(--mf-color-brand)!important}.mf-checkbox:hover .mdc-checkbox__background{border-color:var(--mf-color-brand)!important}.mf-checkbox .mat-mdc-checkbox-ripple,.mf-checkbox .mdc-checkbox__ripple{display:none!important}.mf-checkbox .mdc-checkbox__native-control:focus~.mdc-checkbox__background{box-shadow:0 0 0 3px var(--mf-color-primary-100)}.mf-checkbox--disabled{opacity:.42;pointer-events:none}\n"], dependencies: [{ kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i1$7.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "aria-expanded", "aria-controls", "aria-owns", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
814
+ }
815
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: MfCheckboxComponent, decorators: [{
816
+ type: Component,
817
+ args: [{ selector: 'mf-checkbox', imports: [MatCheckboxModule], template: `
818
+ <mat-checkbox
819
+ [checked]="checked()"
820
+ [disabled]="disabled()"
821
+ [indeterminate]="indeterminate()"
822
+ [class]="hostClasses()"
823
+ (change)="onChange($event)"
824
+ >
825
+ {{ label() }}
826
+ </mat-checkbox>
827
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:inline-block}.mf-checkbox{font-family:var(--mf-font-base)!important}.mf-checkbox .mdc-label,.mf-checkbox .mat-mdc-checkbox-label{font-family:var(--mf-font-base)!important;font-size:var(--mf-text-sm)!important;color:var(--mf-color-on-surface)!important;cursor:pointer}.mf-checkbox .mdc-checkbox__background{border-color:var(--mf-color-neutral-300)!important;border-radius:var(--mf-radius-sm)!important;border-width:1.5px!important;transition:border-color var(--mf-duration-base) var(--mf-ease-standard),background-color var(--mf-duration-base) var(--mf-ease-standard)}.mf-checkbox .mdc-checkbox__native-control:checked~.mdc-checkbox__background,.mf-checkbox .mdc-checkbox__native-control:indeterminate~.mdc-checkbox__background{background-color:var(--mf-color-brand)!important;border-color:var(--mf-color-brand)!important}.mf-checkbox:hover .mdc-checkbox__background{border-color:var(--mf-color-brand)!important}.mf-checkbox .mat-mdc-checkbox-ripple,.mf-checkbox .mdc-checkbox__ripple{display:none!important}.mf-checkbox .mdc-checkbox__native-control:focus~.mdc-checkbox__background{box-shadow:0 0 0 3px var(--mf-color-primary-100)}.mf-checkbox--disabled{opacity:.42;pointer-events:none}\n"] }]
828
+ }], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: true }] }], checked: [{ type: i0.Input, args: [{ isSignal: true, alias: "checked", required: false }] }], indeterminate: [{ type: i0.Input, args: [{ isSignal: true, alias: "indeterminate", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], mfChange: [{ type: i0.Output, args: ["mfChange"] }] } });
829
+
830
+ /**
831
+ * Chip de la librería ng-comps.
832
+ * Envuelve Angular Material `mat-chip` y expone una API uniforme
833
+ * con look and feel de marca. Ideal para tags, filtros y etiquetas.
834
+ */
835
+ class MfChipComponent {
836
+ /** Texto del chip */
837
+ label = input.required(...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
838
+ /** Variante visual */
839
+ variant = input('filled', ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
840
+ /** Color semántico */
841
+ color = input('brand', ...(ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []));
842
+ /** Seleccionado */
843
+ selected = input(false, ...(ngDevMode ? [{ debugName: "selected" }] : /* istanbul ignore next */ []));
844
+ /** Puede ser removido */
845
+ removable = input(false, ...(ngDevMode ? [{ debugName: "removable" }] : /* istanbul ignore next */ []));
846
+ /** Deshabilitado */
847
+ disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
848
+ /** Icono inicial */
849
+ leadingIcon = input(undefined, ...(ngDevMode ? [{ debugName: "leadingIcon" }] : /* istanbul ignore next */ []));
850
+ mfRemoved = output();
851
+ hostClasses = computed(() => {
852
+ const classes = ['mf-chip', `mf-chip--${this.variant()}`, `mf-chip--${this.color()}`];
853
+ if (this.selected())
854
+ classes.push('mf-chip--selected');
855
+ return classes.join(' ');
856
+ }, ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
857
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: MfChipComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
858
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.4", type: MfChipComponent, isStandalone: true, selector: "mf-chip", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, selected: { classPropertyName: "selected", publicName: "selected", isSignal: true, isRequired: false, transformFunction: null }, removable: { classPropertyName: "removable", publicName: "removable", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, leadingIcon: { classPropertyName: "leadingIcon", publicName: "leadingIcon", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { mfRemoved: "mfRemoved" }, ngImport: i0, template: `
859
+ @if (removable()) {
860
+ <mat-chip
861
+ [highlighted]="selected()"
862
+ [disabled]="disabled()"
863
+ [class]="hostClasses()"
864
+ (removed)="mfRemoved.emit()"
865
+ >
866
+ @if (leadingIcon()) {
867
+ <mat-icon matChipAvatar aria-hidden="true">{{ leadingIcon() }}</mat-icon>
868
+ }
869
+ {{ label() }}
870
+ <button matChipRemove [attr.aria-label]="'Eliminar ' + label()">
871
+ <mat-icon>cancel</mat-icon>
872
+ </button>
873
+ </mat-chip>
874
+ } @else {
875
+ <mat-chip
876
+ [highlighted]="selected()"
877
+ [disabled]="disabled()"
878
+ [class]="hostClasses()"
879
+ >
880
+ @if (leadingIcon()) {
881
+ <mat-icon matChipAvatar aria-hidden="true">{{ leadingIcon() }}</mat-icon>
882
+ }
883
+ {{ label() }}
884
+ </mat-chip>
885
+ }
886
+ `, isInline: true, styles: [":host{display:inline-block}.mf-chip.mat-mdc-chip{font-family:var(--mf-font-base)!important;font-size:var(--mf-text-sm)!important;font-weight:var(--mf-weight-medium)!important;border-radius:var(--mf-radius-full)!important;transition:background-color var(--mf-duration-base) var(--mf-ease-standard),box-shadow var(--mf-duration-base) var(--mf-ease-standard)}.mf-chip--filled.mf-chip--brand.mat-mdc-chip{background-color:var(--mf-color-primary-100)!important;color:var(--mf-color-primary-800)!important}.mf-chip--filled.mf-chip--accent.mat-mdc-chip{background-color:var(--mf-color-accent-300)!important;color:var(--mf-color-accent-700)!important}.mf-chip--filled.mf-chip--error.mat-mdc-chip{background-color:#fee2e2!important;color:var(--mf-color-error-700)!important}.mf-chip--filled.mf-chip--neutral.mat-mdc-chip{background-color:var(--mf-color-neutral-100)!important;color:var(--mf-color-neutral-600)!important}.mf-chip--outlined.mat-mdc-chip{background-color:transparent!important;border:1px solid var(--mf-color-border)!important}.mf-chip--outlined.mf-chip--brand.mat-mdc-chip{color:var(--mf-color-primary-700)!important;border-color:var(--mf-color-primary-200)!important}.mf-chip--outlined.mf-chip--accent.mat-mdc-chip{color:var(--mf-color-accent-700)!important;border-color:var(--mf-color-accent-300)!important}.mf-chip--outlined.mf-chip--error.mat-mdc-chip{color:var(--mf-color-error-700)!important;border-color:var(--mf-color-error-500)!important}.mf-chip--selected.mat-mdc-chip{box-shadow:var(--mf-shadow-sm)}.mf-chip.mat-mdc-chip.mat-mdc-chip-disabled{opacity:.42}\n"], dependencies: [{ kind: "ngmodule", type: MatChipsModule }, { kind: "component", type: i1$8.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["role", "id", "aria-label", "aria-description", "value", "color", "removable", "highlighted", "disableRipple", "disabled"], outputs: ["removed", "destroyed"], exportAs: ["matChip"] }, { kind: "directive", type: i1$8.MatChipAvatar, selector: "mat-chip-avatar, [matChipAvatar]" }, { kind: "directive", type: i1$8.MatChipRemove, selector: "[matChipRemove]" }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
887
+ }
888
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: MfChipComponent, decorators: [{
889
+ type: Component,
890
+ args: [{ selector: 'mf-chip', imports: [MatChipsModule, MatIconModule], template: `
891
+ @if (removable()) {
892
+ <mat-chip
893
+ [highlighted]="selected()"
894
+ [disabled]="disabled()"
895
+ [class]="hostClasses()"
896
+ (removed)="mfRemoved.emit()"
897
+ >
898
+ @if (leadingIcon()) {
899
+ <mat-icon matChipAvatar aria-hidden="true">{{ leadingIcon() }}</mat-icon>
900
+ }
901
+ {{ label() }}
902
+ <button matChipRemove [attr.aria-label]="'Eliminar ' + label()">
903
+ <mat-icon>cancel</mat-icon>
904
+ </button>
905
+ </mat-chip>
906
+ } @else {
907
+ <mat-chip
908
+ [highlighted]="selected()"
909
+ [disabled]="disabled()"
910
+ [class]="hostClasses()"
911
+ >
912
+ @if (leadingIcon()) {
913
+ <mat-icon matChipAvatar aria-hidden="true">{{ leadingIcon() }}</mat-icon>
914
+ }
915
+ {{ label() }}
916
+ </mat-chip>
917
+ }
918
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:inline-block}.mf-chip.mat-mdc-chip{font-family:var(--mf-font-base)!important;font-size:var(--mf-text-sm)!important;font-weight:var(--mf-weight-medium)!important;border-radius:var(--mf-radius-full)!important;transition:background-color var(--mf-duration-base) var(--mf-ease-standard),box-shadow var(--mf-duration-base) var(--mf-ease-standard)}.mf-chip--filled.mf-chip--brand.mat-mdc-chip{background-color:var(--mf-color-primary-100)!important;color:var(--mf-color-primary-800)!important}.mf-chip--filled.mf-chip--accent.mat-mdc-chip{background-color:var(--mf-color-accent-300)!important;color:var(--mf-color-accent-700)!important}.mf-chip--filled.mf-chip--error.mat-mdc-chip{background-color:#fee2e2!important;color:var(--mf-color-error-700)!important}.mf-chip--filled.mf-chip--neutral.mat-mdc-chip{background-color:var(--mf-color-neutral-100)!important;color:var(--mf-color-neutral-600)!important}.mf-chip--outlined.mat-mdc-chip{background-color:transparent!important;border:1px solid var(--mf-color-border)!important}.mf-chip--outlined.mf-chip--brand.mat-mdc-chip{color:var(--mf-color-primary-700)!important;border-color:var(--mf-color-primary-200)!important}.mf-chip--outlined.mf-chip--accent.mat-mdc-chip{color:var(--mf-color-accent-700)!important;border-color:var(--mf-color-accent-300)!important}.mf-chip--outlined.mf-chip--error.mat-mdc-chip{color:var(--mf-color-error-700)!important;border-color:var(--mf-color-error-500)!important}.mf-chip--selected.mat-mdc-chip{box-shadow:var(--mf-shadow-sm)}.mf-chip.mat-mdc-chip.mat-mdc-chip-disabled{opacity:.42}\n"] }]
919
+ }], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: true }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], selected: [{ type: i0.Input, args: [{ isSignal: true, alias: "selected", required: false }] }], removable: [{ type: i0.Input, args: [{ isSignal: true, alias: "removable", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], leadingIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "leadingIcon", required: false }] }], mfRemoved: [{ type: i0.Output, args: ["mfRemoved"] }] } });
920
+
921
+ /**
922
+ * Selector de fecha de la librería ng-comps.
923
+ * Envuelve Angular Material `mat-datepicker` y expone una API uniforme
924
+ * con look and feel de marca.
925
+ */
926
+ class MfDatepickerComponent {
927
+ /** Etiqueta flotante del campo */
928
+ label = input(undefined, ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
929
+ /** Placeholder del input */
930
+ placeholder = input('DD/MM/YYYY', ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
931
+ /** Tamaño del campo */
932
+ size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
933
+ /** Deshabilitado */
934
+ disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
935
+ /** Valor inicial del datepicker */
936
+ value = input(null, ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
937
+ /** Texto de ayuda debajo del campo */
938
+ hint = input(undefined, ...(ngDevMode ? [{ debugName: "hint" }] : /* istanbul ignore next */ []));
939
+ /** Mensaje de error */
940
+ error = input(undefined, ...(ngDevMode ? [{ debugName: "error" }] : /* istanbul ignore next */ []));
941
+ /** Fecha mínima seleccionable */
942
+ min = input(null, ...(ngDevMode ? [{ debugName: "min" }] : /* istanbul ignore next */ []));
943
+ /** Fecha máxima seleccionable */
944
+ max = input(null, ...(ngDevMode ? [{ debugName: "max" }] : /* istanbul ignore next */ []));
945
+ /** Ancho completo */
946
+ fullWidth = input(false, ...(ngDevMode ? [{ debugName: "fullWidth" }] : /* istanbul ignore next */ []));
947
+ mfChange = output();
948
+ mfBlur = output();
949
+ currentValue = signal(null, ...(ngDevMode ? [{ debugName: "currentValue" }] : /* istanbul ignore next */ []));
950
+ constructor() {
951
+ effect(() => {
952
+ this.currentValue.set(this.value());
953
+ });
954
+ }
955
+ hostClasses = computed(() => {
956
+ const classes = ['mf-datepicker', `mf-datepicker--${this.size()}`];
957
+ if (this.fullWidth())
958
+ classes.push('mf-datepicker--full');
959
+ if (this.error())
960
+ classes.push('mf-datepicker--error');
961
+ return classes.join(' ');
962
+ }, ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
963
+ onDateChange(event) {
964
+ this.currentValue.set(event.value);
965
+ this.mfChange.emit(event.value);
966
+ }
967
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: MfDatepickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
968
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.4", type: MfDatepickerComponent, isStandalone: true, selector: "mf-datepicker", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, hint: { classPropertyName: "hint", publicName: "hint", isSignal: true, isRequired: false, transformFunction: null }, error: { classPropertyName: "error", publicName: "error", isSignal: true, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, fullWidth: { classPropertyName: "fullWidth", publicName: "fullWidth", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { mfChange: "mfChange", mfBlur: "mfBlur" }, ngImport: i0, template: `
969
+ <mat-form-field [appearance]="'outline'" [class]="hostClasses()">
970
+ @if (label()) {
971
+ <mat-label>{{ label() }}</mat-label>
972
+ }
973
+ <input
974
+ matInput
975
+ [matDatepicker]="picker"
976
+ [placeholder]="placeholder()"
977
+ [disabled]="disabled()"
978
+ [min]="min()"
979
+ [max]="max()"
980
+ [ngModel]="currentValue()"
981
+ (dateChange)="onDateChange($event)"
982
+ (blur)="mfBlur.emit()"
983
+ />
984
+ <mat-datepicker-toggle matIconSuffix [for]="picker" [disabled]="disabled()">
985
+ <mat-icon matDatepickerToggleIcon aria-hidden="true">calendar_month</mat-icon>
986
+ </mat-datepicker-toggle>
987
+ <mat-datepicker #picker />
988
+ @if (hint()) {
989
+ <mat-hint>{{ hint() }}</mat-hint>
990
+ }
991
+ @if (error()) {
992
+ <mat-error>{{ error() }}</mat-error>
993
+ }
994
+ </mat-form-field>
995
+ `, isInline: true, styles: [":host{display:inline-block}.mf-datepicker{font-family:var(--mf-font-base)!important;width:100%}.mf-datepicker--full{width:100%}.mf-datepicker .mat-mdc-text-field-wrapper{border-radius:var(--mf-radius-md)!important}.mf-datepicker .mdc-notched-outline__leading,.mf-datepicker .mdc-notched-outline__notch,.mf-datepicker .mdc-notched-outline__trailing{border-color:var(--mf-color-border)!important;transition:border-color var(--mf-duration-base) var(--mf-ease-standard)}.mf-datepicker .mat-mdc-form-field-focus-overlay{background-color:transparent!important}.mf-datepicker.mat-focused .mdc-notched-outline__leading,.mf-datepicker.mat-focused .mdc-notched-outline__notch,.mf-datepicker.mat-focused .mdc-notched-outline__trailing{border-color:var(--mf-color-brand)!important;border-width:1.5px!important}.mf-datepicker--error .mdc-notched-outline__leading,.mf-datepicker--error .mdc-notched-outline__notch,.mf-datepicker--error .mdc-notched-outline__trailing{border-color:var(--mf-color-error-500)!important}.mf-datepicker .mat-mdc-floating-label{font-family:var(--mf-font-base)!important;font-weight:var(--mf-weight-medium)!important;color:var(--mf-color-neutral-400)!important}.mf-datepicker.mat-focused .mat-mdc-floating-label{color:var(--mf-color-brand)!important}.mf-datepicker .mat-mdc-input-element{font-family:var(--mf-font-base)!important;color:var(--mf-color-on-surface)!important;caret-color:var(--mf-color-brand)}.mf-datepicker .mat-datepicker-toggle .mat-icon{color:var(--mf-color-neutral-400)!important;transition:color var(--mf-duration-base) var(--mf-ease-standard)}.mf-datepicker.mat-focused .mat-datepicker-toggle .mat-icon{color:var(--mf-color-brand)!important}.mf-datepicker .mat-mdc-form-field-hint{font-size:var(--mf-text-xs)!important;color:var(--mf-color-neutral-400)!important}.mf-datepicker .mat-mdc-form-field-error{font-size:var(--mf-text-xs)!important}.mf-datepicker--sm .mat-mdc-input-element{font-size:var(--mf-text-sm)!important}.mf-datepicker--md .mat-mdc-input-element{font-size:var(--mf-text-base)!important}.mf-datepicker--lg .mat-mdc-input-element{font-size:var(--mf-text-lg)!important;padding-top:var(--mf-space-1)!important;padding-bottom:var(--mf-space-1)!important}.mf-datepicker .mat-mdc-input-element:disabled{color:var(--mf-color-neutral-300)!important}\n"], dependencies: [{ kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i1$9.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i1$9.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i1$9.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "directive", type: i1$9.MatDatepickerToggleIcon, selector: "[matDatepickerToggleIcon]" }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i1$3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i1$3.MatLabel, selector: "mat-label" }, { kind: "directive", type: i1$3.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i1$3.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i1$3.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatNativeDateModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
996
+ }
997
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: MfDatepickerComponent, decorators: [{
998
+ type: Component,
999
+ args: [{ selector: 'mf-datepicker', imports: [
1000
+ MatDatepickerModule,
1001
+ MatFormFieldModule,
1002
+ MatInputModule,
1003
+ MatNativeDateModule,
1004
+ MatIconModule,
1005
+ FormsModule,
1006
+ ], template: `
1007
+ <mat-form-field [appearance]="'outline'" [class]="hostClasses()">
1008
+ @if (label()) {
1009
+ <mat-label>{{ label() }}</mat-label>
1010
+ }
1011
+ <input
1012
+ matInput
1013
+ [matDatepicker]="picker"
1014
+ [placeholder]="placeholder()"
1015
+ [disabled]="disabled()"
1016
+ [min]="min()"
1017
+ [max]="max()"
1018
+ [ngModel]="currentValue()"
1019
+ (dateChange)="onDateChange($event)"
1020
+ (blur)="mfBlur.emit()"
1021
+ />
1022
+ <mat-datepicker-toggle matIconSuffix [for]="picker" [disabled]="disabled()">
1023
+ <mat-icon matDatepickerToggleIcon aria-hidden="true">calendar_month</mat-icon>
1024
+ </mat-datepicker-toggle>
1025
+ <mat-datepicker #picker />
1026
+ @if (hint()) {
1027
+ <mat-hint>{{ hint() }}</mat-hint>
1028
+ }
1029
+ @if (error()) {
1030
+ <mat-error>{{ error() }}</mat-error>
1031
+ }
1032
+ </mat-form-field>
1033
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:inline-block}.mf-datepicker{font-family:var(--mf-font-base)!important;width:100%}.mf-datepicker--full{width:100%}.mf-datepicker .mat-mdc-text-field-wrapper{border-radius:var(--mf-radius-md)!important}.mf-datepicker .mdc-notched-outline__leading,.mf-datepicker .mdc-notched-outline__notch,.mf-datepicker .mdc-notched-outline__trailing{border-color:var(--mf-color-border)!important;transition:border-color var(--mf-duration-base) var(--mf-ease-standard)}.mf-datepicker .mat-mdc-form-field-focus-overlay{background-color:transparent!important}.mf-datepicker.mat-focused .mdc-notched-outline__leading,.mf-datepicker.mat-focused .mdc-notched-outline__notch,.mf-datepicker.mat-focused .mdc-notched-outline__trailing{border-color:var(--mf-color-brand)!important;border-width:1.5px!important}.mf-datepicker--error .mdc-notched-outline__leading,.mf-datepicker--error .mdc-notched-outline__notch,.mf-datepicker--error .mdc-notched-outline__trailing{border-color:var(--mf-color-error-500)!important}.mf-datepicker .mat-mdc-floating-label{font-family:var(--mf-font-base)!important;font-weight:var(--mf-weight-medium)!important;color:var(--mf-color-neutral-400)!important}.mf-datepicker.mat-focused .mat-mdc-floating-label{color:var(--mf-color-brand)!important}.mf-datepicker .mat-mdc-input-element{font-family:var(--mf-font-base)!important;color:var(--mf-color-on-surface)!important;caret-color:var(--mf-color-brand)}.mf-datepicker .mat-datepicker-toggle .mat-icon{color:var(--mf-color-neutral-400)!important;transition:color var(--mf-duration-base) var(--mf-ease-standard)}.mf-datepicker.mat-focused .mat-datepicker-toggle .mat-icon{color:var(--mf-color-brand)!important}.mf-datepicker .mat-mdc-form-field-hint{font-size:var(--mf-text-xs)!important;color:var(--mf-color-neutral-400)!important}.mf-datepicker .mat-mdc-form-field-error{font-size:var(--mf-text-xs)!important}.mf-datepicker--sm .mat-mdc-input-element{font-size:var(--mf-text-sm)!important}.mf-datepicker--md .mat-mdc-input-element{font-size:var(--mf-text-base)!important}.mf-datepicker--lg .mat-mdc-input-element{font-size:var(--mf-text-lg)!important;padding-top:var(--mf-space-1)!important;padding-bottom:var(--mf-space-1)!important}.mf-datepicker .mat-mdc-input-element:disabled{color:var(--mf-color-neutral-300)!important}\n"] }]
1034
+ }], ctorParameters: () => [], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], hint: [{ type: i0.Input, args: [{ isSignal: true, alias: "hint", required: false }] }], error: [{ type: i0.Input, args: [{ isSignal: true, alias: "error", required: false }] }], min: [{ type: i0.Input, args: [{ isSignal: true, alias: "min", required: false }] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], fullWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "fullWidth", required: false }] }], mfChange: [{ type: i0.Output, args: ["mfChange"] }], mfBlur: [{ type: i0.Output, args: ["mfBlur"] }] } });
1035
+
1036
+ /**
1037
+ * Contenido de diálogo de la librería ng-comps.
1038
+ * Envuelve las directivas de Angular Material `mat-dialog-*` y expone
1039
+ * una API uniforme con look and feel de marca.
1040
+ *
1041
+ * Uso:
1042
+ * ```
1043
+ * dialog.open(MfDialogComponent, {
1044
+ * data: { title: 'Confirmar', message: '¿Deseas continuar?' }
1045
+ * });
1046
+ * ```
1047
+ */
1048
+ class MfDialogComponent {
1049
+ dialogRef = inject((MatDialogRef), {
1050
+ optional: true,
1051
+ });
1052
+ /** Título del diálogo */
1053
+ title = input.required(...(ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []));
1054
+ /** Mensaje descriptivo */
1055
+ message = input(undefined, ...(ngDevMode ? [{ debugName: "message" }] : /* istanbul ignore next */ []));
1056
+ /** Mostrar botón de cerrar */
1057
+ showClose = input(true, ...(ngDevMode ? [{ debugName: "showClose" }] : /* istanbul ignore next */ []));
1058
+ /** Mostrar área de acciones (footer) */
1059
+ showActions = input(true, ...(ngDevMode ? [{ debugName: "showActions" }] : /* istanbul ignore next */ []));
1060
+ mfClose = output();
1061
+ hostClasses = computed(() => {
1062
+ return 'mf-dialog';
1063
+ }, ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
1064
+ onClose() {
1065
+ this.mfClose.emit();
1066
+ this.dialogRef?.close();
1067
+ }
1068
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: MfDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1069
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.4", type: MfDialogComponent, isStandalone: true, selector: "mf-dialog", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: true, transformFunction: null }, message: { classPropertyName: "message", publicName: "message", isSignal: true, isRequired: false, transformFunction: null }, showClose: { classPropertyName: "showClose", publicName: "showClose", isSignal: true, isRequired: false, transformFunction: null }, showActions: { classPropertyName: "showActions", publicName: "showActions", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { mfClose: "mfClose" }, ngImport: i0, template: `
1070
+ <div [class]="hostClasses()">
1071
+ <div class="mf-dialog__header">
1072
+ <h2 class="mf-dialog__title">{{ title() }}</h2>
1073
+ @if (showClose()) {
1074
+ <button
1075
+ class="mf-dialog__close"
1076
+ (click)="onClose()"
1077
+ aria-label="Cerrar diálogo"
1078
+ type="button"
1079
+ >
1080
+ <mat-icon>close</mat-icon>
1081
+ </button>
1082
+ }
1083
+ </div>
1084
+
1085
+ @if (message()) {
1086
+ <div class="mf-dialog__body">
1087
+ <p class="mf-dialog__message">{{ message() }}</p>
1088
+ </div>
1089
+ }
1090
+
1091
+ <div class="mf-dialog__content">
1092
+ <ng-content />
1093
+ </div>
1094
+
1095
+ @if (showActions()) {
1096
+ <div class="mf-dialog__actions">
1097
+ <ng-content select="[mfDialogActions]" />
1098
+ </div>
1099
+ }
1100
+ </div>
1101
+ `, isInline: true, styles: [".mf-dialog{font-family:var(--mf-font-base);min-width:360px;max-width:560px}.mf-dialog__header{display:flex;align-items:center;justify-content:space-between;padding:var(--mf-space-6) var(--mf-space-6) var(--mf-space-3)}.mf-dialog__title{font-family:var(--mf-font-display);font-size:var(--mf-text-xl);font-weight:var(--mf-weight-bold);color:var(--mf-color-on-surface);margin:0;line-height:var(--mf-leading-tight)}.mf-dialog__close{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;border:none;background:transparent;border-radius:var(--mf-radius-sm, 6px);color:var(--mf-color-neutral-400);cursor:pointer;transition:background-color var(--mf-duration-fast) var(--mf-ease-standard),color var(--mf-duration-fast) var(--mf-ease-standard)}.mf-dialog__close:hover{background-color:var(--mf-color-neutral-100);color:var(--mf-color-on-surface)}.mf-dialog__close .mat-icon{font-size:20px;width:20px;height:20px}.mf-dialog__body{padding:0 var(--mf-space-6)}.mf-dialog__message{font-size:var(--mf-text-sm);color:var(--mf-color-neutral-600);line-height:var(--mf-leading-normal);margin:0}.mf-dialog__content{padding:var(--mf-space-3) var(--mf-space-6)}.mf-dialog__content:empty{display:none}\n"], dependencies: [{ kind: "ngmodule", type: MatDialogModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1102
+ }
1103
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: MfDialogComponent, decorators: [{
1104
+ type: Component,
1105
+ args: [{ selector: 'mf-dialog', imports: [MatDialogModule, MatIconModule], template: `
1106
+ <div [class]="hostClasses()">
1107
+ <div class="mf-dialog__header">
1108
+ <h2 class="mf-dialog__title">{{ title() }}</h2>
1109
+ @if (showClose()) {
1110
+ <button
1111
+ class="mf-dialog__close"
1112
+ (click)="onClose()"
1113
+ aria-label="Cerrar diálogo"
1114
+ type="button"
1115
+ >
1116
+ <mat-icon>close</mat-icon>
1117
+ </button>
1118
+ }
1119
+ </div>
1120
+
1121
+ @if (message()) {
1122
+ <div class="mf-dialog__body">
1123
+ <p class="mf-dialog__message">{{ message() }}</p>
1124
+ </div>
1125
+ }
1126
+
1127
+ <div class="mf-dialog__content">
1128
+ <ng-content />
1129
+ </div>
1130
+
1131
+ @if (showActions()) {
1132
+ <div class="mf-dialog__actions">
1133
+ <ng-content select="[mfDialogActions]" />
1134
+ </div>
1135
+ }
1136
+ </div>
1137
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".mf-dialog{font-family:var(--mf-font-base);min-width:360px;max-width:560px}.mf-dialog__header{display:flex;align-items:center;justify-content:space-between;padding:var(--mf-space-6) var(--mf-space-6) var(--mf-space-3)}.mf-dialog__title{font-family:var(--mf-font-display);font-size:var(--mf-text-xl);font-weight:var(--mf-weight-bold);color:var(--mf-color-on-surface);margin:0;line-height:var(--mf-leading-tight)}.mf-dialog__close{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;border:none;background:transparent;border-radius:var(--mf-radius-sm, 6px);color:var(--mf-color-neutral-400);cursor:pointer;transition:background-color var(--mf-duration-fast) var(--mf-ease-standard),color var(--mf-duration-fast) var(--mf-ease-standard)}.mf-dialog__close:hover{background-color:var(--mf-color-neutral-100);color:var(--mf-color-on-surface)}.mf-dialog__close .mat-icon{font-size:20px;width:20px;height:20px}.mf-dialog__body{padding:0 var(--mf-space-6)}.mf-dialog__message{font-size:var(--mf-text-sm);color:var(--mf-color-neutral-600);line-height:var(--mf-leading-normal);margin:0}.mf-dialog__content{padding:var(--mf-space-3) var(--mf-space-6)}.mf-dialog__content:empty{display:none}\n"] }]
1138
+ }], propDecorators: { title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: true }] }], message: [{ type: i0.Input, args: [{ isSignal: true, alias: "message", required: false }] }], showClose: [{ type: i0.Input, args: [{ isSignal: true, alias: "showClose", required: false }] }], showActions: [{ type: i0.Input, args: [{ isSignal: true, alias: "showActions", required: false }] }], mfClose: [{ type: i0.Output, args: ["mfClose"] }] } });
1139
+
1140
+ /**
1141
+ * Divider de la librería ng-comps.
1142
+ * Envuelve Angular Material `mat-divider` y expone una API uniforme
1143
+ * con look and feel de marca.
1144
+ */
1145
+ class MfDividerComponent {
1146
+ /** Orientación vertical */
1147
+ vertical = input(false, ...(ngDevMode ? [{ debugName: "vertical" }] : /* istanbul ignore next */ []));
1148
+ /** Variante visual */
1149
+ variant = input('full', ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
1150
+ /** Espaciado extra arriba y abajo */
1151
+ spacing = input('none', ...(ngDevMode ? [{ debugName: "spacing" }] : /* istanbul ignore next */ []));
1152
+ insetValue = computed(() => this.variant() === 'inset', ...(ngDevMode ? [{ debugName: "insetValue" }] : /* istanbul ignore next */ []));
1153
+ hostClasses = computed(() => {
1154
+ const classes = ['mf-divider', `mf-divider--${this.variant()}`, `mf-divider--spacing-${this.spacing()}`];
1155
+ if (this.vertical())
1156
+ classes.push('mf-divider--vertical');
1157
+ return classes.join(' ');
1158
+ }, ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
1159
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: MfDividerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1160
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.4", type: MfDividerComponent, isStandalone: true, selector: "mf-divider", inputs: { vertical: { classPropertyName: "vertical", publicName: "vertical", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, spacing: { classPropertyName: "spacing", publicName: "spacing", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
1161
+ <mat-divider
1162
+ [vertical]="vertical()"
1163
+ [inset]="insetValue()"
1164
+ [class]="hostClasses()"
1165
+ />
1166
+ `, isInline: true, styles: [":host{display:block}:host:has(.mf-divider--vertical){display:inline-block;height:100%}.mf-divider .mat-divider{border-top-color:var(--mf-color-border)!important}.mf-divider--vertical .mat-divider{border-left-color:var(--mf-color-border)!important}.mf-divider--middle .mat-divider{margin-left:var(--mf-space-4)!important;margin-right:var(--mf-space-4)!important}.mf-divider--spacing-sm{padding-top:var(--mf-space-2);padding-bottom:var(--mf-space-2)}.mf-divider--spacing-md{padding-top:var(--mf-space-4);padding-bottom:var(--mf-space-4)}.mf-divider--spacing-lg{padding-top:var(--mf-space-6);padding-bottom:var(--mf-space-6)}\n"], dependencies: [{ kind: "ngmodule", type: MatDividerModule }, { kind: "component", type: i1$a.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1167
+ }
1168
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: MfDividerComponent, decorators: [{
1169
+ type: Component,
1170
+ args: [{ selector: 'mf-divider', imports: [MatDividerModule], template: `
1171
+ <mat-divider
1172
+ [vertical]="vertical()"
1173
+ [inset]="insetValue()"
1174
+ [class]="hostClasses()"
1175
+ />
1176
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block}:host:has(.mf-divider--vertical){display:inline-block;height:100%}.mf-divider .mat-divider{border-top-color:var(--mf-color-border)!important}.mf-divider--vertical .mat-divider{border-left-color:var(--mf-color-border)!important}.mf-divider--middle .mat-divider{margin-left:var(--mf-space-4)!important;margin-right:var(--mf-space-4)!important}.mf-divider--spacing-sm{padding-top:var(--mf-space-2);padding-bottom:var(--mf-space-2)}.mf-divider--spacing-md{padding-top:var(--mf-space-4);padding-bottom:var(--mf-space-4)}.mf-divider--spacing-lg{padding-top:var(--mf-space-6);padding-bottom:var(--mf-space-6)}\n"] }]
1177
+ }], propDecorators: { vertical: [{ type: i0.Input, args: [{ isSignal: true, alias: "vertical", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], spacing: [{ type: i0.Input, args: [{ isSignal: true, alias: "spacing", required: false }] }] } });
1178
+
1179
+ /**
1180
+ * Contenedor de campo de formulario de la librería ng-comps.
1181
+ * Proporciona estructura de layout consistente con label, contenido proyectado,
1182
+ * y mensajes opcionales de ayuda o error.
1183
+ */
1184
+ class MfFormFieldComponent {
1185
+ /** Etiqueta del campo */
1186
+ label = input(undefined, ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
1187
+ /** ID para asociar el label con el control */
1188
+ fieldId = input(undefined, ...(ngDevMode ? [{ debugName: "fieldId" }] : /* istanbul ignore next */ []));
1189
+ /** Texto de ayuda */
1190
+ hint = input(undefined, ...(ngDevMode ? [{ debugName: "hint" }] : /* istanbul ignore next */ []));
1191
+ /** Mensaje de error */
1192
+ error = input(undefined, ...(ngDevMode ? [{ debugName: "error" }] : /* istanbul ignore next */ []));
1193
+ /** Campo requerido (muestra asterisco) */
1194
+ required = input(false, ...(ngDevMode ? [{ debugName: "required" }] : /* istanbul ignore next */ []));
1195
+ labelClasses = computed(() => {
1196
+ const classes = ['mf-form-field__label'];
1197
+ if (this.error())
1198
+ classes.push('mf-form-field__label--error');
1199
+ return classes.join(' ');
1200
+ }, ...(ngDevMode ? [{ debugName: "labelClasses" }] : /* istanbul ignore next */ []));
1201
+ hostClasses = computed(() => {
1202
+ const classes = ['mf-form-field'];
1203
+ if (this.error())
1204
+ classes.push('mf-form-field--error');
1205
+ return classes.join(' ');
1206
+ }, ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
1207
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: MfFormFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1208
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.4", type: MfFormFieldComponent, isStandalone: true, selector: "mf-form-field", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, fieldId: { classPropertyName: "fieldId", publicName: "fieldId", isSignal: true, isRequired: false, transformFunction: null }, hint: { classPropertyName: "hint", publicName: "hint", isSignal: true, isRequired: false, transformFunction: null }, error: { classPropertyName: "error", publicName: "error", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "hostClasses()" } }, ngImport: i0, template: `
1209
+ @if (label()) {
1210
+ <label [class]="labelClasses()" [attr.for]="fieldId()">{{ label() }}
1211
+ @if (required()) {
1212
+ <span class="mf-form-field__required" aria-hidden="true"> *</span>
1213
+ }
1214
+ </label>
1215
+ }
1216
+ <div class="mf-form-field__control">
1217
+ <ng-content />
1218
+ </div>
1219
+ @if (error()) {
1220
+ <p class="mf-form-field__error" role="alert">{{ error() }}</p>
1221
+ } @else if (hint()) {
1222
+ <p class="mf-form-field__hint">{{ hint() }}</p>
1223
+ }
1224
+ `, isInline: true, styles: [":host{display:block}.mf-form-field{display:flex;flex-direction:column;gap:var(--mf-space-1)}.mf-form-field__label{font-family:var(--mf-font-base);font-size:var(--mf-text-sm);font-weight:var(--mf-weight-medium);color:var(--mf-color-on-surface);line-height:var(--mf-leading-normal);cursor:default}.mf-form-field__label--error,.mf-form-field__required{color:var(--mf-color-error-500)}.mf-form-field__control{width:100%}.mf-form-field__hint{font-family:var(--mf-font-base);font-size:var(--mf-text-xs);color:var(--mf-color-neutral-400);margin:0;padding-left:var(--mf-space-1)}.mf-form-field__error{font-family:var(--mf-font-base);font-size:var(--mf-text-xs);color:var(--mf-color-error-500);margin:0;padding-left:var(--mf-space-1)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1225
+ }
1226
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: MfFormFieldComponent, decorators: [{
1227
+ type: Component,
1228
+ args: [{ selector: 'mf-form-field', imports: [], template: `
1229
+ @if (label()) {
1230
+ <label [class]="labelClasses()" [attr.for]="fieldId()">{{ label() }}
1231
+ @if (required()) {
1232
+ <span class="mf-form-field__required" aria-hidden="true"> *</span>
1233
+ }
1234
+ </label>
1235
+ }
1236
+ <div class="mf-form-field__control">
1237
+ <ng-content />
1238
+ </div>
1239
+ @if (error()) {
1240
+ <p class="mf-form-field__error" role="alert">{{ error() }}</p>
1241
+ } @else if (hint()) {
1242
+ <p class="mf-form-field__hint">{{ hint() }}</p>
1243
+ }
1244
+ `, changeDetection: ChangeDetectionStrategy.OnPush, host: {
1245
+ '[class]': 'hostClasses()',
1246
+ }, styles: [":host{display:block}.mf-form-field{display:flex;flex-direction:column;gap:var(--mf-space-1)}.mf-form-field__label{font-family:var(--mf-font-base);font-size:var(--mf-text-sm);font-weight:var(--mf-weight-medium);color:var(--mf-color-on-surface);line-height:var(--mf-leading-normal);cursor:default}.mf-form-field__label--error,.mf-form-field__required{color:var(--mf-color-error-500)}.mf-form-field__control{width:100%}.mf-form-field__hint{font-family:var(--mf-font-base);font-size:var(--mf-text-xs);color:var(--mf-color-neutral-400);margin:0;padding-left:var(--mf-space-1)}.mf-form-field__error{font-family:var(--mf-font-base);font-size:var(--mf-text-xs);color:var(--mf-color-error-500);margin:0;padding-left:var(--mf-space-1)}\n"] }]
1247
+ }], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], fieldId: [{ type: i0.Input, args: [{ isSignal: true, alias: "fieldId", required: false }] }], hint: [{ type: i0.Input, args: [{ isSignal: true, alias: "hint", required: false }] }], error: [{ type: i0.Input, args: [{ isSignal: true, alias: "error", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }] } });
1248
+
1249
+ /**
1250
+ * Lista en cuadrícula de la librería ng-comps.
1251
+ * Envuelve Angular Material `mat-grid-list` y expone una API uniforme
1252
+ * con look and feel de marca. Soporta tiles estáticas y content projection.
1253
+ */
1254
+ class MfGridListComponent {
1255
+ /** Número de columnas */
1256
+ cols = input(2, ...(ngDevMode ? [{ debugName: "cols" }] : /* istanbul ignore next */ []));
1257
+ /** Altura de cada fila */
1258
+ rowHeight = input('1:1', ...(ngDevMode ? [{ debugName: "rowHeight" }] : /* istanbul ignore next */ []));
1259
+ /** Espacio entre tiles */
1260
+ gutterSize = input('8px', ...(ngDevMode ? [{ debugName: "gutterSize" }] : /* istanbul ignore next */ []));
1261
+ /** Tiles a renderizar */
1262
+ tiles = input([], ...(ngDevMode ? [{ debugName: "tiles" }] : /* istanbul ignore next */ []));
1263
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: MfGridListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1264
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.4", type: MfGridListComponent, isStandalone: true, selector: "mf-grid-list", inputs: { cols: { classPropertyName: "cols", publicName: "cols", isSignal: true, isRequired: false, transformFunction: null }, rowHeight: { classPropertyName: "rowHeight", publicName: "rowHeight", isSignal: true, isRequired: false, transformFunction: null }, gutterSize: { classPropertyName: "gutterSize", publicName: "gutterSize", isSignal: true, isRequired: false, transformFunction: null }, tiles: { classPropertyName: "tiles", publicName: "tiles", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
1265
+ <mat-grid-list
1266
+ class="mf-grid-list"
1267
+ [cols]="cols()"
1268
+ [rowHeight]="rowHeight()"
1269
+ [gutterSize]="gutterSize()"
1270
+ >
1271
+ @for (tile of tiles(); track $index) {
1272
+ <mat-grid-tile
1273
+ class="mf-grid-list__tile"
1274
+ [colspan]="tile.colspan ?? 1"
1275
+ [rowspan]="tile.rowspan ?? 1"
1276
+ [style.background]="tile.background || null"
1277
+ >
1278
+ <mat-grid-tile-header>
1279
+ @if (tile.title) {
1280
+ <span class="mf-grid-list__tile-title">{{ tile.title }}</span>
1281
+ }
1282
+ @if (tile.subtitle) {
1283
+ <span class="mf-grid-list__tile-subtitle">{{ tile.subtitle }}</span>
1284
+ }
1285
+ </mat-grid-tile-header>
1286
+ </mat-grid-tile>
1287
+ }
1288
+ <ng-content />
1289
+ </mat-grid-list>
1290
+ `, isInline: true, styles: [":host{display:block}.mf-grid-list{font-family:var(--mf-font-base)!important}.mf-grid-list__tile{background-color:var(--mf-color-surface-raised);border-radius:var(--mf-radius-md)!important;overflow:hidden;transition:box-shadow var(--mf-duration-base) var(--mf-ease-standard)}.mf-grid-list__tile:hover{box-shadow:var(--mf-shadow-md)}.mf-grid-list__tile mat-grid-tile-header,.mf-grid-list__tile .mat-grid-tile-header{background:linear-gradient(to top,#0f172aa3,#0f172a00)!important;padding:var(--mf-space-3) var(--mf-space-4)!important}.mf-grid-list__tile-title{font-family:var(--mf-font-base);font-size:var(--mf-text-sm);font-weight:var(--mf-weight-bold);color:var(--mf-color-neutral-0);display:block}.mf-grid-list__tile-subtitle{font-family:var(--mf-font-base);font-size:var(--mf-text-xs);font-weight:var(--mf-weight-regular);color:var(--mf-color-neutral-200);display:block}\n"], dependencies: [{ kind: "ngmodule", type: MatGridListModule }, { kind: "component", type: i1$b.MatGridList, selector: "mat-grid-list", inputs: ["cols", "gutterSize", "rowHeight"], exportAs: ["matGridList"] }, { kind: "component", type: i1$b.MatGridTile, selector: "mat-grid-tile", inputs: ["rowspan", "colspan"], exportAs: ["matGridTile"] }, { kind: "component", type: i1$b.MatGridTileText, selector: "mat-grid-tile-header, mat-grid-tile-footer" }, { kind: "directive", type: i1$b.MatGridTileHeaderCssMatStyler, selector: "mat-grid-tile-header" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1291
+ }
1292
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: MfGridListComponent, decorators: [{
1293
+ type: Component,
1294
+ args: [{ selector: 'mf-grid-list', imports: [MatGridListModule], template: `
1295
+ <mat-grid-list
1296
+ class="mf-grid-list"
1297
+ [cols]="cols()"
1298
+ [rowHeight]="rowHeight()"
1299
+ [gutterSize]="gutterSize()"
1300
+ >
1301
+ @for (tile of tiles(); track $index) {
1302
+ <mat-grid-tile
1303
+ class="mf-grid-list__tile"
1304
+ [colspan]="tile.colspan ?? 1"
1305
+ [rowspan]="tile.rowspan ?? 1"
1306
+ [style.background]="tile.background || null"
1307
+ >
1308
+ <mat-grid-tile-header>
1309
+ @if (tile.title) {
1310
+ <span class="mf-grid-list__tile-title">{{ tile.title }}</span>
1311
+ }
1312
+ @if (tile.subtitle) {
1313
+ <span class="mf-grid-list__tile-subtitle">{{ tile.subtitle }}</span>
1314
+ }
1315
+ </mat-grid-tile-header>
1316
+ </mat-grid-tile>
1317
+ }
1318
+ <ng-content />
1319
+ </mat-grid-list>
1320
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block}.mf-grid-list{font-family:var(--mf-font-base)!important}.mf-grid-list__tile{background-color:var(--mf-color-surface-raised);border-radius:var(--mf-radius-md)!important;overflow:hidden;transition:box-shadow var(--mf-duration-base) var(--mf-ease-standard)}.mf-grid-list__tile:hover{box-shadow:var(--mf-shadow-md)}.mf-grid-list__tile mat-grid-tile-header,.mf-grid-list__tile .mat-grid-tile-header{background:linear-gradient(to top,#0f172aa3,#0f172a00)!important;padding:var(--mf-space-3) var(--mf-space-4)!important}.mf-grid-list__tile-title{font-family:var(--mf-font-base);font-size:var(--mf-text-sm);font-weight:var(--mf-weight-bold);color:var(--mf-color-neutral-0);display:block}.mf-grid-list__tile-subtitle{font-family:var(--mf-font-base);font-size:var(--mf-text-xs);font-weight:var(--mf-weight-regular);color:var(--mf-color-neutral-200);display:block}\n"] }]
1321
+ }], propDecorators: { cols: [{ type: i0.Input, args: [{ isSignal: true, alias: "cols", required: false }] }], rowHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowHeight", required: false }] }], gutterSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "gutterSize", required: false }] }], tiles: [{ type: i0.Input, args: [{ isSignal: true, alias: "tiles", required: false }] }] } });
1322
+
1323
+ /**
1324
+ * Icono de la librería ng-comps.
1325
+ * Envuelve Angular Material `mat-icon` y expone una API uniforme
1326
+ * con tamaños y colores de marca.
1327
+ */
1328
+ class MfIconComponent {
1329
+ /** Nombre del icono de Material Symbols / Material Icons */
1330
+ name = input.required(...(ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []));
1331
+ /** Tamaño visual del icono */
1332
+ size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
1333
+ /** Color semántico del icono */
1334
+ color = input('default', ...(ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []));
1335
+ /** Etiqueta accesible. Si se omite, el icono será decorativo (aria-hidden) */
1336
+ label = input(undefined, ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
1337
+ ariaHidden = computed(() => (this.label() ? 'false' : 'true'), ...(ngDevMode ? [{ debugName: "ariaHidden" }] : /* istanbul ignore next */ []));
1338
+ hostClasses = computed(() => {
1339
+ return ['mf-icon', `mf-icon--${this.size()}`, `mf-icon--${this.color()}`].join(' ');
1340
+ }, ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
1341
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: MfIconComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1342
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.4", type: MfIconComponent, isStandalone: true, selector: "mf-icon", inputs: { name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: true, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
1343
+ <mat-icon [class]="hostClasses()" [attr.aria-hidden]="ariaHidden()" [attr.aria-label]="label()">{{ name() }}</mat-icon>
1344
+ `, isInline: true, styles: [":host{display:inline-flex;align-items:center;justify-content:center}.mf-icon{transition:color var(--mf-duration-base) var(--mf-ease-standard)}.mf-icon--sm{font-size:16px!important;width:16px!important;height:16px!important}.mf-icon--md{font-size:20px!important;width:20px!important;height:20px!important}.mf-icon--lg{font-size:24px!important;width:24px!important;height:24px!important}.mf-icon--xl{font-size:32px!important;width:32px!important;height:32px!important}.mf-icon--default{color:var(--mf-color-on-surface)}.mf-icon--brand{color:var(--mf-color-brand)}.mf-icon--muted{color:var(--mf-color-neutral-400)}.mf-icon--error{color:var(--mf-color-error-500)}.mf-icon--inherit{color:inherit}\n"], dependencies: [{ kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1345
+ }
1346
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: MfIconComponent, decorators: [{
1347
+ type: Component,
1348
+ args: [{ selector: 'mf-icon', imports: [MatIconModule], template: `
1349
+ <mat-icon [class]="hostClasses()" [attr.aria-hidden]="ariaHidden()" [attr.aria-label]="label()">{{ name() }}</mat-icon>
1350
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:inline-flex;align-items:center;justify-content:center}.mf-icon{transition:color var(--mf-duration-base) var(--mf-ease-standard)}.mf-icon--sm{font-size:16px!important;width:16px!important;height:16px!important}.mf-icon--md{font-size:20px!important;width:20px!important;height:20px!important}.mf-icon--lg{font-size:24px!important;width:24px!important;height:24px!important}.mf-icon--xl{font-size:32px!important;width:32px!important;height:32px!important}.mf-icon--default{color:var(--mf-color-on-surface)}.mf-icon--brand{color:var(--mf-color-brand)}.mf-icon--muted{color:var(--mf-color-neutral-400)}.mf-icon--error{color:var(--mf-color-error-500)}.mf-icon--inherit{color:inherit}\n"] }]
1351
+ }], propDecorators: { name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: true }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }] } });
1352
+
1353
+ /**
1354
+ * Campo de texto de la librería ng-comps.
1355
+ * Envuelve Angular Material `mat-form-field` + `matInput`
1356
+ * y expone una API uniforme con look and feel de marca.
1357
+ */
1358
+ class MfInputComponent {
1359
+ /** Etiqueta flotante del campo */
1360
+ label = input(undefined, ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
1361
+ /** Placeholder del input */
1362
+ placeholder = input('', ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
1363
+ /** Tipo de input HTML */
1364
+ type = input('text', ...(ngDevMode ? [{ debugName: "type" }] : /* istanbul ignore next */ []));
1365
+ /** Tamaño del campo */
1366
+ size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
1367
+ /** Valor actual del campo */
1368
+ value = input('', ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
1369
+ /** Deshabilitado */
1370
+ disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
1371
+ /** Solo lectura */
1372
+ readonly = input(false, ...(ngDevMode ? [{ debugName: "readonly" }] : /* istanbul ignore next */ []));
1373
+ /** Texto de ayuda debajo del campo */
1374
+ hint = input(undefined, ...(ngDevMode ? [{ debugName: "hint" }] : /* istanbul ignore next */ []));
1375
+ /** Mensaje de error */
1376
+ error = input(undefined, ...(ngDevMode ? [{ debugName: "error" }] : /* istanbul ignore next */ []));
1377
+ /** Icono al inicio */
1378
+ leadingIcon = input(undefined, ...(ngDevMode ? [{ debugName: "leadingIcon" }] : /* istanbul ignore next */ []));
1379
+ /** Icono al final */
1380
+ trailingIcon = input(undefined, ...(ngDevMode ? [{ debugName: "trailingIcon" }] : /* istanbul ignore next */ []));
1381
+ /** Ancho completo */
1382
+ fullWidth = input(false, ...(ngDevMode ? [{ debugName: "fullWidth" }] : /* istanbul ignore next */ []));
1383
+ mfInput = output();
1384
+ mfBlur = output();
1385
+ hostClasses = computed(() => {
1386
+ const classes = ['mf-input', `mf-input--${this.size()}`];
1387
+ if (this.fullWidth())
1388
+ classes.push('mf-input--full');
1389
+ if (this.error())
1390
+ classes.push('mf-input--error');
1391
+ return classes.join(' ');
1392
+ }, ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
1393
+ onInput(event) {
1394
+ const target = event.target;
1395
+ this.mfInput.emit(target.value);
1396
+ }
1397
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: MfInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1398
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.4", type: MfInputComponent, isStandalone: true, selector: "mf-input", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, hint: { classPropertyName: "hint", publicName: "hint", isSignal: true, isRequired: false, transformFunction: null }, error: { classPropertyName: "error", publicName: "error", isSignal: true, isRequired: false, transformFunction: null }, leadingIcon: { classPropertyName: "leadingIcon", publicName: "leadingIcon", isSignal: true, isRequired: false, transformFunction: null }, trailingIcon: { classPropertyName: "trailingIcon", publicName: "trailingIcon", isSignal: true, isRequired: false, transformFunction: null }, fullWidth: { classPropertyName: "fullWidth", publicName: "fullWidth", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { mfInput: "mfInput", mfBlur: "mfBlur" }, ngImport: i0, template: `
1399
+ <mat-form-field [appearance]="'outline'" [class]="hostClasses()">
1400
+ @if (label()) {
1401
+ <mat-label>{{ label() }}</mat-label>
1402
+ }
1403
+ @if (leadingIcon()) {
1404
+ <mat-icon matPrefix aria-hidden="true">{{ leadingIcon() }}</mat-icon>
1405
+ }
1406
+ <input
1407
+ matInput
1408
+ [type]="type()"
1409
+ [placeholder]="placeholder()"
1410
+ [disabled]="disabled()"
1411
+ [readonly]="readonly()"
1412
+ [value]="value()"
1413
+ (input)="onInput($event)"
1414
+ (blur)="mfBlur.emit()"
1415
+ />
1416
+ @if (trailingIcon()) {
1417
+ <mat-icon matSuffix aria-hidden="true">{{ trailingIcon() }}</mat-icon>
1418
+ }
1419
+ @if (hint()) {
1420
+ <mat-hint>{{ hint() }}</mat-hint>
1421
+ }
1422
+ @if (error()) {
1423
+ <mat-error>{{ error() }}</mat-error>
1424
+ }
1425
+ </mat-form-field>
1426
+ `, isInline: true, styles: [":host{display:inline-block}.mf-input{font-family:var(--mf-font-base)!important;width:100%}.mf-input--full{width:100%}.mf-input .mat-mdc-text-field-wrapper{border-radius:var(--mf-radius-md)!important}.mf-input .mdc-notched-outline__leading,.mf-input .mdc-notched-outline__notch,.mf-input .mdc-notched-outline__trailing{border-color:var(--mf-color-border)!important;transition:border-color var(--mf-duration-base) var(--mf-ease-standard)}.mf-input .mat-mdc-form-field-focus-overlay{background-color:transparent!important}.mf-input.mat-focused .mdc-notched-outline__leading,.mf-input.mat-focused .mdc-notched-outline__notch,.mf-input.mat-focused .mdc-notched-outline__trailing{border-color:var(--mf-color-brand)!important;border-width:1.5px!important}.mf-input--error .mdc-notched-outline__leading,.mf-input--error .mdc-notched-outline__notch,.mf-input--error .mdc-notched-outline__trailing{border-color:var(--mf-color-error-500)!important}.mf-input .mat-mdc-floating-label{font-family:var(--mf-font-base)!important;font-weight:var(--mf-weight-medium)!important;color:var(--mf-color-neutral-400)!important}.mf-input.mat-focused .mat-mdc-floating-label{color:var(--mf-color-brand)!important}.mf-input .mat-mdc-input-element{font-family:var(--mf-font-base)!important;color:var(--mf-color-on-surface)!important;caret-color:var(--mf-color-brand)}.mf-input .mat-mdc-form-field-hint{font-size:var(--mf-text-xs)!important;color:var(--mf-color-neutral-400)!important}.mf-input .mat-mdc-form-field-error{font-size:var(--mf-text-xs)!important}.mf-input--sm .mat-mdc-input-element{font-size:var(--mf-text-sm)!important}.mf-input--md .mat-mdc-input-element{font-size:var(--mf-text-base)!important}.mf-input--lg .mat-mdc-input-element{font-size:var(--mf-text-lg)!important;padding-top:var(--mf-space-1)!important;padding-bottom:var(--mf-space-1)!important}.mf-input .mat-icon{color:var(--mf-color-neutral-400)!important;font-size:20px;width:20px;height:20px;transition:color var(--mf-duration-base) var(--mf-ease-standard)}.mf-input.mat-focused .mat-icon{color:var(--mf-color-brand)!important}.mf-input .mat-mdc-input-element:disabled{color:var(--mf-color-neutral-300)!important}\n"], dependencies: [{ kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i1$3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i1$3.MatLabel, selector: "mat-label" }, { kind: "directive", type: i1$3.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i1$3.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i1$3.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i1$3.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1427
+ }
1428
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: MfInputComponent, decorators: [{
1429
+ type: Component,
1430
+ args: [{ selector: 'mf-input', imports: [MatFormFieldModule, MatInputModule, MatIconModule], template: `
1431
+ <mat-form-field [appearance]="'outline'" [class]="hostClasses()">
1432
+ @if (label()) {
1433
+ <mat-label>{{ label() }}</mat-label>
1434
+ }
1435
+ @if (leadingIcon()) {
1436
+ <mat-icon matPrefix aria-hidden="true">{{ leadingIcon() }}</mat-icon>
1437
+ }
1438
+ <input
1439
+ matInput
1440
+ [type]="type()"
1441
+ [placeholder]="placeholder()"
1442
+ [disabled]="disabled()"
1443
+ [readonly]="readonly()"
1444
+ [value]="value()"
1445
+ (input)="onInput($event)"
1446
+ (blur)="mfBlur.emit()"
1447
+ />
1448
+ @if (trailingIcon()) {
1449
+ <mat-icon matSuffix aria-hidden="true">{{ trailingIcon() }}</mat-icon>
1450
+ }
1451
+ @if (hint()) {
1452
+ <mat-hint>{{ hint() }}</mat-hint>
1453
+ }
1454
+ @if (error()) {
1455
+ <mat-error>{{ error() }}</mat-error>
1456
+ }
1457
+ </mat-form-field>
1458
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:inline-block}.mf-input{font-family:var(--mf-font-base)!important;width:100%}.mf-input--full{width:100%}.mf-input .mat-mdc-text-field-wrapper{border-radius:var(--mf-radius-md)!important}.mf-input .mdc-notched-outline__leading,.mf-input .mdc-notched-outline__notch,.mf-input .mdc-notched-outline__trailing{border-color:var(--mf-color-border)!important;transition:border-color var(--mf-duration-base) var(--mf-ease-standard)}.mf-input .mat-mdc-form-field-focus-overlay{background-color:transparent!important}.mf-input.mat-focused .mdc-notched-outline__leading,.mf-input.mat-focused .mdc-notched-outline__notch,.mf-input.mat-focused .mdc-notched-outline__trailing{border-color:var(--mf-color-brand)!important;border-width:1.5px!important}.mf-input--error .mdc-notched-outline__leading,.mf-input--error .mdc-notched-outline__notch,.mf-input--error .mdc-notched-outline__trailing{border-color:var(--mf-color-error-500)!important}.mf-input .mat-mdc-floating-label{font-family:var(--mf-font-base)!important;font-weight:var(--mf-weight-medium)!important;color:var(--mf-color-neutral-400)!important}.mf-input.mat-focused .mat-mdc-floating-label{color:var(--mf-color-brand)!important}.mf-input .mat-mdc-input-element{font-family:var(--mf-font-base)!important;color:var(--mf-color-on-surface)!important;caret-color:var(--mf-color-brand)}.mf-input .mat-mdc-form-field-hint{font-size:var(--mf-text-xs)!important;color:var(--mf-color-neutral-400)!important}.mf-input .mat-mdc-form-field-error{font-size:var(--mf-text-xs)!important}.mf-input--sm .mat-mdc-input-element{font-size:var(--mf-text-sm)!important}.mf-input--md .mat-mdc-input-element{font-size:var(--mf-text-base)!important}.mf-input--lg .mat-mdc-input-element{font-size:var(--mf-text-lg)!important;padding-top:var(--mf-space-1)!important;padding-bottom:var(--mf-space-1)!important}.mf-input .mat-icon{color:var(--mf-color-neutral-400)!important;font-size:20px;width:20px;height:20px;transition:color var(--mf-duration-base) var(--mf-ease-standard)}.mf-input.mat-focused .mat-icon{color:var(--mf-color-brand)!important}.mf-input .mat-mdc-input-element:disabled{color:var(--mf-color-neutral-300)!important}\n"] }]
1459
+ }], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], type: [{ type: i0.Input, args: [{ isSignal: true, alias: "type", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], hint: [{ type: i0.Input, args: [{ isSignal: true, alias: "hint", required: false }] }], error: [{ type: i0.Input, args: [{ isSignal: true, alias: "error", required: false }] }], leadingIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "leadingIcon", required: false }] }], trailingIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "trailingIcon", required: false }] }], fullWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "fullWidth", required: false }] }], mfInput: [{ type: i0.Output, args: ["mfInput"] }], mfBlur: [{ type: i0.Output, args: ["mfBlur"] }] } });
1460
+
1461
+ /**
1462
+ * Menu de la librería ng-comps.
1463
+ * Envuelve Angular Material `mat-menu` y expone una API uniforme
1464
+ * con look and feel de marca.
1465
+ */
1466
+ class MfMenuComponent {
1467
+ /** Items del menú */
1468
+ items = input.required(...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
1469
+ /** Icono del trigger */
1470
+ triggerIcon = input('more_vert', ...(ngDevMode ? [{ debugName: "triggerIcon" }] : /* istanbul ignore next */ []));
1471
+ /** Label accesible del trigger */
1472
+ triggerLabel = input('Abrir menú', ...(ngDevMode ? [{ debugName: "triggerLabel" }] : /* istanbul ignore next */ []));
1473
+ mfItemClick = output();
1474
+ hostClasses = computed(() => 'mf-menu', ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
1475
+ triggerClasses = computed(() => 'mf-menu__trigger', ...(ngDevMode ? [{ debugName: "triggerClasses" }] : /* istanbul ignore next */ []));
1476
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: MfMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1477
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.4", type: MfMenuComponent, isStandalone: true, selector: "mf-menu", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: true, transformFunction: null }, triggerIcon: { classPropertyName: "triggerIcon", publicName: "triggerIcon", isSignal: true, isRequired: false, transformFunction: null }, triggerLabel: { classPropertyName: "triggerLabel", publicName: "triggerLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { mfItemClick: "mfItemClick" }, ngImport: i0, template: `
1478
+ <button
1479
+ mat-icon-button
1480
+ [matMenuTriggerFor]="menu"
1481
+ [class]="triggerClasses()"
1482
+ [attr.aria-label]="triggerLabel()"
1483
+ >
1484
+ <mat-icon>{{ triggerIcon() }}</mat-icon>
1485
+ </button>
1486
+ <mat-menu #menu="matMenu" [class]="hostClasses()">
1487
+ @for (item of items(); track item.value) {
1488
+ <button
1489
+ mat-menu-item
1490
+ [disabled]="item.disabled ?? false"
1491
+ (click)="mfItemClick.emit(item.value)"
1492
+ >
1493
+ @if (item.icon) {
1494
+ <mat-icon aria-hidden="true">{{ item.icon }}</mat-icon>
1495
+ }
1496
+ <span>{{ item.label }}</span>
1497
+ </button>
1498
+ }
1499
+ </mat-menu>
1500
+ `, isInline: true, styles: [":host{display:inline-block}.mf-menu__trigger{color:var(--mf-color-neutral-600)!important}.mf-menu__trigger:hover{color:var(--mf-color-brand)!important}.mf-menu .mat-mdc-menu-panel{border-radius:var(--mf-radius-md)!important;box-shadow:var(--mf-shadow-lg)!important}.mf-menu .mat-mdc-menu-item{font-family:var(--mf-font-base)!important;font-size:var(--mf-text-sm)!important;color:var(--mf-color-on-surface)!important}.mf-menu .mat-mdc-menu-item:hover{background-color:var(--mf-color-brand-light)!important}.mf-menu .mat-mdc-menu-item .mat-icon{color:var(--mf-color-neutral-400)!important;margin-right:var(--mf-space-2)!important}\n"], dependencies: [{ kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i1$c.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i1$c.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i1$c.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1$5.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1501
+ }
1502
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: MfMenuComponent, decorators: [{
1503
+ type: Component,
1504
+ args: [{ selector: 'mf-menu', imports: [MatMenuModule, MatButtonModule, MatIconModule], template: `
1505
+ <button
1506
+ mat-icon-button
1507
+ [matMenuTriggerFor]="menu"
1508
+ [class]="triggerClasses()"
1509
+ [attr.aria-label]="triggerLabel()"
1510
+ >
1511
+ <mat-icon>{{ triggerIcon() }}</mat-icon>
1512
+ </button>
1513
+ <mat-menu #menu="matMenu" [class]="hostClasses()">
1514
+ @for (item of items(); track item.value) {
1515
+ <button
1516
+ mat-menu-item
1517
+ [disabled]="item.disabled ?? false"
1518
+ (click)="mfItemClick.emit(item.value)"
1519
+ >
1520
+ @if (item.icon) {
1521
+ <mat-icon aria-hidden="true">{{ item.icon }}</mat-icon>
1522
+ }
1523
+ <span>{{ item.label }}</span>
1524
+ </button>
1525
+ }
1526
+ </mat-menu>
1527
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:inline-block}.mf-menu__trigger{color:var(--mf-color-neutral-600)!important}.mf-menu__trigger:hover{color:var(--mf-color-brand)!important}.mf-menu .mat-mdc-menu-panel{border-radius:var(--mf-radius-md)!important;box-shadow:var(--mf-shadow-lg)!important}.mf-menu .mat-mdc-menu-item{font-family:var(--mf-font-base)!important;font-size:var(--mf-text-sm)!important;color:var(--mf-color-on-surface)!important}.mf-menu .mat-mdc-menu-item:hover{background-color:var(--mf-color-brand-light)!important}.mf-menu .mat-mdc-menu-item .mat-icon{color:var(--mf-color-neutral-400)!important;margin-right:var(--mf-space-2)!important}\n"] }]
1528
+ }], propDecorators: { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: true }] }], triggerIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "triggerIcon", required: false }] }], triggerLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "triggerLabel", required: false }] }], mfItemClick: [{ type: i0.Output, args: ["mfItemClick"] }] } });
1529
+
1530
+ /**
1531
+ * Paginator de la librería ng-comps.
1532
+ * Envuelve Angular Material `mat-paginator` y expone una API uniforme
1533
+ * con look and feel de marca.
1534
+ */
1535
+ class MfPaginatorComponent {
1536
+ /** Total de elementos */
1537
+ length = input.required(...(ngDevMode ? [{ debugName: "length" }] : /* istanbul ignore next */ []));
1538
+ /** Tamaño de página */
1539
+ pageSize = input(10, ...(ngDevMode ? [{ debugName: "pageSize" }] : /* istanbul ignore next */ []));
1540
+ /** Índice de página actual */
1541
+ pageIndex = input(0, ...(ngDevMode ? [{ debugName: "pageIndex" }] : /* istanbul ignore next */ []));
1542
+ /** Opciones de tamaño de página */
1543
+ pageSizeOptions = input([5, 10, 25, 50], ...(ngDevMode ? [{ debugName: "pageSizeOptions" }] : /* istanbul ignore next */ []));
1544
+ /** Mostrar botones de primera/última página */
1545
+ showFirstLastButtons = input(true, ...(ngDevMode ? [{ debugName: "showFirstLastButtons" }] : /* istanbul ignore next */ []));
1546
+ /** Ocultar selector de tamaño de página */
1547
+ hidePageSize = input(false, ...(ngDevMode ? [{ debugName: "hidePageSize" }] : /* istanbul ignore next */ []));
1548
+ mfPageChange = output();
1549
+ hostClasses = computed(() => {
1550
+ return 'mf-paginator';
1551
+ }, ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
1552
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: MfPaginatorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1553
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.4", type: MfPaginatorComponent, isStandalone: true, selector: "mf-paginator", inputs: { length: { classPropertyName: "length", publicName: "length", isSignal: true, isRequired: true, transformFunction: null }, pageSize: { classPropertyName: "pageSize", publicName: "pageSize", isSignal: true, isRequired: false, transformFunction: null }, pageIndex: { classPropertyName: "pageIndex", publicName: "pageIndex", isSignal: true, isRequired: false, transformFunction: null }, pageSizeOptions: { classPropertyName: "pageSizeOptions", publicName: "pageSizeOptions", isSignal: true, isRequired: false, transformFunction: null }, showFirstLastButtons: { classPropertyName: "showFirstLastButtons", publicName: "showFirstLastButtons", isSignal: true, isRequired: false, transformFunction: null }, hidePageSize: { classPropertyName: "hidePageSize", publicName: "hidePageSize", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { mfPageChange: "mfPageChange" }, ngImport: i0, template: `
1554
+ <mat-paginator
1555
+ [length]="length()"
1556
+ [pageSize]="pageSize()"
1557
+ [pageIndex]="pageIndex()"
1558
+ [pageSizeOptions]="pageSizeOptions()"
1559
+ [showFirstLastButtons]="showFirstLastButtons()"
1560
+ [hidePageSize]="hidePageSize()"
1561
+ [class]="hostClasses()"
1562
+ (page)="mfPageChange.emit($event)"
1563
+ />
1564
+ `, isInline: true, styles: [":host{display:block}.mf-paginator.mat-mdc-paginator{font-family:var(--mf-font-base)!important;font-size:var(--mf-text-sm)!important;background-color:transparent!important}.mf-paginator .mat-mdc-paginator-container{padding:var(--mf-space-2) 0!important}.mf-paginator .mat-mdc-paginator-range-label{color:var(--mf-color-neutral-600)!important;font-family:var(--mf-font-base)!important}.mf-paginator .mat-mdc-paginator-navigation-previous,.mf-paginator .mat-mdc-paginator-navigation-next,.mf-paginator .mat-mdc-paginator-navigation-first,.mf-paginator .mat-mdc-paginator-navigation-last{color:var(--mf-color-brand)!important}.mf-paginator .mat-mdc-paginator-navigation-previous:disabled,.mf-paginator .mat-mdc-paginator-navigation-next:disabled,.mf-paginator .mat-mdc-paginator-navigation-first:disabled,.mf-paginator .mat-mdc-paginator-navigation-last:disabled{color:var(--mf-color-neutral-300)!important}\n"], dependencies: [{ kind: "ngmodule", type: MatPaginatorModule }, { kind: "component", type: i1$d.MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1565
+ }
1566
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: MfPaginatorComponent, decorators: [{
1567
+ type: Component,
1568
+ args: [{ selector: 'mf-paginator', imports: [MatPaginatorModule], template: `
1569
+ <mat-paginator
1570
+ [length]="length()"
1571
+ [pageSize]="pageSize()"
1572
+ [pageIndex]="pageIndex()"
1573
+ [pageSizeOptions]="pageSizeOptions()"
1574
+ [showFirstLastButtons]="showFirstLastButtons()"
1575
+ [hidePageSize]="hidePageSize()"
1576
+ [class]="hostClasses()"
1577
+ (page)="mfPageChange.emit($event)"
1578
+ />
1579
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block}.mf-paginator.mat-mdc-paginator{font-family:var(--mf-font-base)!important;font-size:var(--mf-text-sm)!important;background-color:transparent!important}.mf-paginator .mat-mdc-paginator-container{padding:var(--mf-space-2) 0!important}.mf-paginator .mat-mdc-paginator-range-label{color:var(--mf-color-neutral-600)!important;font-family:var(--mf-font-base)!important}.mf-paginator .mat-mdc-paginator-navigation-previous,.mf-paginator .mat-mdc-paginator-navigation-next,.mf-paginator .mat-mdc-paginator-navigation-first,.mf-paginator .mat-mdc-paginator-navigation-last{color:var(--mf-color-brand)!important}.mf-paginator .mat-mdc-paginator-navigation-previous:disabled,.mf-paginator .mat-mdc-paginator-navigation-next:disabled,.mf-paginator .mat-mdc-paginator-navigation-first:disabled,.mf-paginator .mat-mdc-paginator-navigation-last:disabled{color:var(--mf-color-neutral-300)!important}\n"] }]
1580
+ }], propDecorators: { length: [{ type: i0.Input, args: [{ isSignal: true, alias: "length", required: true }] }], pageSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageSize", required: false }] }], pageIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageIndex", required: false }] }], pageSizeOptions: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageSizeOptions", required: false }] }], showFirstLastButtons: [{ type: i0.Input, args: [{ isSignal: true, alias: "showFirstLastButtons", required: false }] }], hidePageSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "hidePageSize", required: false }] }], mfPageChange: [{ type: i0.Output, args: ["mfPageChange"] }] } });
1581
+
1582
+ /**
1583
+ * Barra de progreso de la librería ng-comps.
1584
+ * Envuelve Angular Material `mat-progress-bar` y expone una API uniforme
1585
+ * con look and feel de marca.
1586
+ */
1587
+ class MfProgressBarComponent {
1588
+ /** Modo de la barra de progreso */
1589
+ mode = input('determinate', ...(ngDevMode ? [{ debugName: "mode" }] : /* istanbul ignore next */ []));
1590
+ /** Valor actual (0–100) */
1591
+ value = input(0, ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
1592
+ /** Valor del buffer (0–100, solo en modo buffer) */
1593
+ bufferValue = input(0, ...(ngDevMode ? [{ debugName: "bufferValue" }] : /* istanbul ignore next */ []));
1594
+ /** Color de la barra */
1595
+ color = input('brand', ...(ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []));
1596
+ /** Etiqueta accesible */
1597
+ label = input(undefined, ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
1598
+ /** Muestra el porcentaje junto a la barra */
1599
+ showValue = input(false, ...(ngDevMode ? [{ debugName: "showValue" }] : /* istanbul ignore next */ []));
1600
+ /** Altura de la barra en px */
1601
+ height = input(4, ...(ngDevMode ? [{ debugName: "height" }] : /* istanbul ignore next */ []));
1602
+ hostClasses = computed(() => {
1603
+ return `mf-progress-bar mf-progress-bar--${this.color()}`;
1604
+ }, ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
1605
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: MfProgressBarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1606
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.4", type: MfProgressBarComponent, isStandalone: true, selector: "mf-progress-bar", inputs: { mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, bufferValue: { classPropertyName: "bufferValue", publicName: "bufferValue", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, showValue: { classPropertyName: "showValue", publicName: "showValue", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
1607
+ <div class="mf-progress-bar__wrapper" [attr.aria-label]="label() || null">
1608
+ @if (label()) {
1609
+ <span class="mf-progress-bar__label">{{ label() }}</span>
1610
+ }
1611
+ <mat-progress-bar
1612
+ [class]="hostClasses()"
1613
+ [mode]="mode()"
1614
+ [value]="value()"
1615
+ [bufferValue]="bufferValue()"
1616
+ />
1617
+ @if (showValue() && mode() === 'determinate') {
1618
+ <span class="mf-progress-bar__value" aria-hidden="true">{{ value() }}%</span>
1619
+ }
1620
+ </div>
1621
+ `, isInline: true, styles: [":host{display:block}.mf-progress-bar__wrapper{display:flex;flex-direction:column;gap:var(--mf-space-2)}.mf-progress-bar__label{font-family:var(--mf-font-base);font-size:var(--mf-text-sm);font-weight:var(--mf-weight-medium);color:var(--mf-color-on-surface)}.mf-progress-bar__value{font-family:var(--mf-font-base);font-size:var(--mf-text-xs);font-weight:var(--mf-weight-medium);color:var(--mf-color-neutral-600);align-self:flex-end}.mf-progress-bar{border-radius:var(--mf-radius-full)!important;overflow:hidden}.mf-progress-bar.mat-mdc-progress-bar{--mdc-linear-progress-track-shape: 9999px}.mf-progress-bar--brand.mat-mdc-progress-bar{--mdc-linear-progress-active-indicator-color: var(--mf-color-brand) !important;--mdc-linear-progress-track-color: var(--mf-color-primary-100) !important}.mf-progress-bar--accent.mat-mdc-progress-bar{--mdc-linear-progress-active-indicator-color: var(--mf-color-accent-500) !important;--mdc-linear-progress-track-color: var(--mf-color-accent-300) !important}.mf-progress-bar--warn.mat-mdc-progress-bar{--mdc-linear-progress-active-indicator-color: var(--mf-color-error-500) !important;--mdc-linear-progress-track-color: #fecaca !important}\n"], dependencies: [{ kind: "ngmodule", type: MatProgressBarModule }, { kind: "component", type: i1$e.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1622
+ }
1623
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: MfProgressBarComponent, decorators: [{
1624
+ type: Component,
1625
+ args: [{ selector: 'mf-progress-bar', imports: [MatProgressBarModule], template: `
1626
+ <div class="mf-progress-bar__wrapper" [attr.aria-label]="label() || null">
1627
+ @if (label()) {
1628
+ <span class="mf-progress-bar__label">{{ label() }}</span>
1629
+ }
1630
+ <mat-progress-bar
1631
+ [class]="hostClasses()"
1632
+ [mode]="mode()"
1633
+ [value]="value()"
1634
+ [bufferValue]="bufferValue()"
1635
+ />
1636
+ @if (showValue() && mode() === 'determinate') {
1637
+ <span class="mf-progress-bar__value" aria-hidden="true">{{ value() }}%</span>
1638
+ }
1639
+ </div>
1640
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block}.mf-progress-bar__wrapper{display:flex;flex-direction:column;gap:var(--mf-space-2)}.mf-progress-bar__label{font-family:var(--mf-font-base);font-size:var(--mf-text-sm);font-weight:var(--mf-weight-medium);color:var(--mf-color-on-surface)}.mf-progress-bar__value{font-family:var(--mf-font-base);font-size:var(--mf-text-xs);font-weight:var(--mf-weight-medium);color:var(--mf-color-neutral-600);align-self:flex-end}.mf-progress-bar{border-radius:var(--mf-radius-full)!important;overflow:hidden}.mf-progress-bar.mat-mdc-progress-bar{--mdc-linear-progress-track-shape: 9999px}.mf-progress-bar--brand.mat-mdc-progress-bar{--mdc-linear-progress-active-indicator-color: var(--mf-color-brand) !important;--mdc-linear-progress-track-color: var(--mf-color-primary-100) !important}.mf-progress-bar--accent.mat-mdc-progress-bar{--mdc-linear-progress-active-indicator-color: var(--mf-color-accent-500) !important;--mdc-linear-progress-track-color: var(--mf-color-accent-300) !important}.mf-progress-bar--warn.mat-mdc-progress-bar{--mdc-linear-progress-active-indicator-color: var(--mf-color-error-500) !important;--mdc-linear-progress-track-color: #fecaca !important}\n"] }]
1641
+ }], propDecorators: { mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], bufferValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "bufferValue", required: false }] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], showValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "showValue", required: false }] }], height: [{ type: i0.Input, args: [{ isSignal: true, alias: "height", required: false }] }] } });
1642
+
1643
+ /**
1644
+ * Spinner de progreso de la librería ng-comps.
1645
+ * Envuelve Angular Material `mat-progress-spinner` y expone una API uniforme
1646
+ * con look and feel de marca.
1647
+ */
1648
+ class MfProgressSpinnerComponent {
1649
+ /** Modo del spinner */
1650
+ mode = input('indeterminate', ...(ngDevMode ? [{ debugName: "mode" }] : /* istanbul ignore next */ []));
1651
+ /** Valor actual (0–100, solo en modo determinate) */
1652
+ value = input(0, ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
1653
+ /** Diámetro en px */
1654
+ diameter = input(40, ...(ngDevMode ? [{ debugName: "diameter" }] : /* istanbul ignore next */ []));
1655
+ /** Grosor del trazo en px */
1656
+ strokeWidth = input(4, ...(ngDevMode ? [{ debugName: "strokeWidth" }] : /* istanbul ignore next */ []));
1657
+ /** Color del spinner */
1658
+ color = input('brand', ...(ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []));
1659
+ /** Etiqueta accesible y visible */
1660
+ label = input(undefined, ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
1661
+ hostClasses = computed(() => {
1662
+ return `mf-progress-spinner mf-progress-spinner--${this.color()}`;
1663
+ }, ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
1664
+ wrapperClasses = computed(() => {
1665
+ const classes = ['mf-progress-spinner__wrapper'];
1666
+ if (this.label())
1667
+ classes.push('mf-progress-spinner__wrapper--labeled');
1668
+ return classes.join(' ');
1669
+ }, ...(ngDevMode ? [{ debugName: "wrapperClasses" }] : /* istanbul ignore next */ []));
1670
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: MfProgressSpinnerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1671
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.4", type: MfProgressSpinnerComponent, isStandalone: true, selector: "mf-progress-spinner", inputs: { mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, diameter: { classPropertyName: "diameter", publicName: "diameter", isSignal: true, isRequired: false, transformFunction: null }, strokeWidth: { classPropertyName: "strokeWidth", publicName: "strokeWidth", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
1672
+ <div [class]="wrapperClasses()" [attr.aria-label]="label() || 'Cargando'">
1673
+ <mat-progress-spinner
1674
+ [class]="hostClasses()"
1675
+ [mode]="mode()"
1676
+ [value]="value()"
1677
+ [diameter]="diameter()"
1678
+ [strokeWidth]="strokeWidth()"
1679
+ />
1680
+ @if (label()) {
1681
+ <span class="mf-progress-spinner__label">{{ label() }}</span>
1682
+ }
1683
+ </div>
1684
+ `, isInline: true, styles: [":host{display:inline-flex;align-items:center;justify-content:center}.mf-progress-spinner__wrapper{display:inline-flex;align-items:center;gap:var(--mf-space-3)}.mf-progress-spinner__wrapper--labeled{flex-direction:row}.mf-progress-spinner__label{font-family:var(--mf-font-base);font-size:var(--mf-text-sm);font-weight:var(--mf-weight-medium);color:var(--mf-color-on-surface)}.mf-progress-spinner--brand.mat-mdc-progress-spinner{--mdc-circular-progress-active-indicator-color: var(--mf-color-brand) !important}.mf-progress-spinner--accent.mat-mdc-progress-spinner{--mdc-circular-progress-active-indicator-color: var(--mf-color-accent-500) !important}.mf-progress-spinner--warn.mat-mdc-progress-spinner{--mdc-circular-progress-active-indicator-color: var(--mf-color-error-500) !important}\n"], dependencies: [{ kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i1$f.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1685
+ }
1686
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: MfProgressSpinnerComponent, decorators: [{
1687
+ type: Component,
1688
+ args: [{ selector: 'mf-progress-spinner', imports: [MatProgressSpinnerModule], template: `
1689
+ <div [class]="wrapperClasses()" [attr.aria-label]="label() || 'Cargando'">
1690
+ <mat-progress-spinner
1691
+ [class]="hostClasses()"
1692
+ [mode]="mode()"
1693
+ [value]="value()"
1694
+ [diameter]="diameter()"
1695
+ [strokeWidth]="strokeWidth()"
1696
+ />
1697
+ @if (label()) {
1698
+ <span class="mf-progress-spinner__label">{{ label() }}</span>
1699
+ }
1700
+ </div>
1701
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:inline-flex;align-items:center;justify-content:center}.mf-progress-spinner__wrapper{display:inline-flex;align-items:center;gap:var(--mf-space-3)}.mf-progress-spinner__wrapper--labeled{flex-direction:row}.mf-progress-spinner__label{font-family:var(--mf-font-base);font-size:var(--mf-text-sm);font-weight:var(--mf-weight-medium);color:var(--mf-color-on-surface)}.mf-progress-spinner--brand.mat-mdc-progress-spinner{--mdc-circular-progress-active-indicator-color: var(--mf-color-brand) !important}.mf-progress-spinner--accent.mat-mdc-progress-spinner{--mdc-circular-progress-active-indicator-color: var(--mf-color-accent-500) !important}.mf-progress-spinner--warn.mat-mdc-progress-spinner{--mdc-circular-progress-active-indicator-color: var(--mf-color-error-500) !important}\n"] }]
1702
+ }], propDecorators: { mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], diameter: [{ type: i0.Input, args: [{ isSignal: true, alias: "diameter", required: false }] }], strokeWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "strokeWidth", required: false }] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }] } });
1703
+
1704
+ /**
1705
+ * Grupo de radio buttons de la librería ng-comps.
1706
+ * Envuelve Angular Material `mat-radio-group` + `mat-radio-button`
1707
+ * y expone una API uniforme con look and feel de marca.
1708
+ */
1709
+ class MfRadioButtonComponent {
1710
+ /** Opciones del grupo */
1711
+ options = input.required(...(ngDevMode ? [{ debugName: "options" }] : /* istanbul ignore next */ []));
1712
+ /** Valor seleccionado */
1713
+ value = input(undefined, ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
1714
+ /** Deshabilitado */
1715
+ disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
1716
+ /** Dirección del grupo */
1717
+ direction = input('vertical', ...(ngDevMode ? [{ debugName: "direction" }] : /* istanbul ignore next */ []));
1718
+ /** Etiqueta accesible para el grupo */
1719
+ ariaLabel = input(undefined, ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
1720
+ mfChange = output();
1721
+ currentValue = signal(undefined, ...(ngDevMode ? [{ debugName: "currentValue" }] : /* istanbul ignore next */ []));
1722
+ constructor() {
1723
+ effect(() => {
1724
+ this.currentValue.set(this.value());
1725
+ });
1726
+ }
1727
+ hostClasses = computed(() => {
1728
+ return `mf-radio mf-radio--${this.direction()}`;
1729
+ }, ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
1730
+ onChange(event) {
1731
+ this.currentValue.set(event.value);
1732
+ this.mfChange.emit(event.value);
1733
+ }
1734
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: MfRadioButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1735
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.4", type: MfRadioButtonComponent, isStandalone: true, selector: "mf-radio-button", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: true, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, direction: { classPropertyName: "direction", publicName: "direction", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { mfChange: "mfChange" }, ngImport: i0, template: `
1736
+ <mat-radio-group
1737
+ [class]="hostClasses()"
1738
+ [disabled]="disabled()"
1739
+ [ngModel]="currentValue()"
1740
+ (change)="onChange($event)"
1741
+ [attr.aria-label]="ariaLabel() || null"
1742
+ >
1743
+ @for (option of options(); track option.value) {
1744
+ <mat-radio-button
1745
+ class="mf-radio__option"
1746
+ [value]="option.value"
1747
+ [disabled]="option.disabled ?? false"
1748
+ >
1749
+ {{ option.label }}
1750
+ </mat-radio-button>
1751
+ }
1752
+ </mat-radio-group>
1753
+ `, isInline: true, styles: [":host{display:block}.mf-radio{display:flex}.mf-radio--vertical{flex-direction:column;gap:var(--mf-space-2)}.mf-radio--horizontal{flex-direction:row;flex-wrap:wrap;gap:var(--mf-space-4)}.mf-radio__option{font-family:var(--mf-font-base)!important;font-size:var(--mf-text-sm)!important;color:var(--mf-color-on-surface)!important}.mf-radio__option .mdc-radio .mdc-radio__outer-circle{border-color:var(--mf-color-border)!important;transition:border-color var(--mf-duration-base) var(--mf-ease-standard)}.mf-radio__option.mat-mdc-radio-checked .mdc-radio .mdc-radio__outer-circle,.mf-radio__option.mat-mdc-radio-checked .mdc-radio .mdc-radio__inner-circle{border-color:var(--mf-color-brand)!important}.mf-radio__option .mat-ripple-element{background-color:var(--mf-color-brand-light)!important}.mf-radio__option .mdc-label{font-family:var(--mf-font-base)!important;color:var(--mf-color-on-surface)!important;cursor:pointer}.mf-radio__option.mat-mdc-radio-disabled .mdc-label{color:var(--mf-color-neutral-400)!important;cursor:default}\n"], dependencies: [{ kind: "ngmodule", type: MatRadioModule }, { kind: "directive", type: i1$g.MatRadioGroup, selector: "mat-radio-group", inputs: ["color", "name", "labelPosition", "value", "selected", "disabled", "required", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioGroup"] }, { kind: "component", type: i1$g.MatRadioButton, selector: "mat-radio-button", inputs: ["id", "name", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "checked", "value", "labelPosition", "disabled", "required", "color", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioButton"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1754
+ }
1755
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: MfRadioButtonComponent, decorators: [{
1756
+ type: Component,
1757
+ args: [{ selector: 'mf-radio-button', imports: [MatRadioModule, FormsModule], template: `
1758
+ <mat-radio-group
1759
+ [class]="hostClasses()"
1760
+ [disabled]="disabled()"
1761
+ [ngModel]="currentValue()"
1762
+ (change)="onChange($event)"
1763
+ [attr.aria-label]="ariaLabel() || null"
1764
+ >
1765
+ @for (option of options(); track option.value) {
1766
+ <mat-radio-button
1767
+ class="mf-radio__option"
1768
+ [value]="option.value"
1769
+ [disabled]="option.disabled ?? false"
1770
+ >
1771
+ {{ option.label }}
1772
+ </mat-radio-button>
1773
+ }
1774
+ </mat-radio-group>
1775
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block}.mf-radio{display:flex}.mf-radio--vertical{flex-direction:column;gap:var(--mf-space-2)}.mf-radio--horizontal{flex-direction:row;flex-wrap:wrap;gap:var(--mf-space-4)}.mf-radio__option{font-family:var(--mf-font-base)!important;font-size:var(--mf-text-sm)!important;color:var(--mf-color-on-surface)!important}.mf-radio__option .mdc-radio .mdc-radio__outer-circle{border-color:var(--mf-color-border)!important;transition:border-color var(--mf-duration-base) var(--mf-ease-standard)}.mf-radio__option.mat-mdc-radio-checked .mdc-radio .mdc-radio__outer-circle,.mf-radio__option.mat-mdc-radio-checked .mdc-radio .mdc-radio__inner-circle{border-color:var(--mf-color-brand)!important}.mf-radio__option .mat-ripple-element{background-color:var(--mf-color-brand-light)!important}.mf-radio__option .mdc-label{font-family:var(--mf-font-base)!important;color:var(--mf-color-on-surface)!important;cursor:pointer}.mf-radio__option.mat-mdc-radio-disabled .mdc-label{color:var(--mf-color-neutral-400)!important;cursor:default}\n"] }]
1776
+ }], ctorParameters: () => [], propDecorators: { options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: true }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], direction: [{ type: i0.Input, args: [{ isSignal: true, alias: "direction", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], mfChange: [{ type: i0.Output, args: ["mfChange"] }] } });
1777
+
1778
+ /**
1779
+ * Select de la librería ng-comps.
1780
+ * Envuelve Angular Material `mat-select` y expone una API uniforme
1781
+ * con look and feel de marca.
1782
+ *
1783
+ * El dropdown se estiliza mediante la clase global `mf-select-panel` que se
1784
+ * inserta en el overlay. Puedes añadir clases adicionales con `panelClass`.
1785
+ */
1786
+ class MfSelectComponent {
1787
+ /** Opciones del select */
1788
+ options = input.required(...(ngDevMode ? [{ debugName: "options" }] : /* istanbul ignore next */ []));
1789
+ /** Etiqueta flotante */
1790
+ label = input(undefined, ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
1791
+ /** Placeholder */
1792
+ placeholder = input('', ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
1793
+ /** Valor actual */
1794
+ value = input(undefined, ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
1795
+ /** Selección múltiple */
1796
+ multiple = input(false, ...(ngDevMode ? [{ debugName: "multiple" }] : /* istanbul ignore next */ []));
1797
+ /** Deshabilitado */
1798
+ disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
1799
+ /** Texto de ayuda */
1800
+ hint = input(undefined, ...(ngDevMode ? [{ debugName: "hint" }] : /* istanbul ignore next */ []));
1801
+ /** Mensaje de error */
1802
+ error = input(undefined, ...(ngDevMode ? [{ debugName: "error" }] : /* istanbul ignore next */ []));
1803
+ /** Tamaño del campo */
1804
+ size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
1805
+ /** Ancho completo */
1806
+ fullWidth = input(false, ...(ngDevMode ? [{ debugName: "fullWidth" }] : /* istanbul ignore next */ []));
1807
+ /** Icono al inicio del campo */
1808
+ leadingIcon = input(undefined, ...(ngDevMode ? [{ debugName: "leadingIcon" }] : /* istanbul ignore next */ []));
1809
+ /** Icono al final del campo */
1810
+ trailingIcon = input(undefined, ...(ngDevMode ? [{ debugName: "trailingIcon" }] : /* istanbul ignore next */ []));
1811
+ /**
1812
+ * Clases extra que se añaden al panel del dropdown (overlay).
1813
+ * La clase `mf-select-panel` siempre está presente para los estilos base.
1814
+ */
1815
+ panelClass = input('', ...(ngDevMode ? [{ debugName: "panelClass" }] : /* istanbul ignore next */ []));
1816
+ mfSelectionChange = output();
1817
+ hostClasses = computed(() => {
1818
+ const classes = ['mf-select', `mf-select--${this.size()}`];
1819
+ if (this.fullWidth())
1820
+ classes.push('mf-select--full');
1821
+ if (this.error())
1822
+ classes.push('mf-select--error');
1823
+ return classes.join(' ');
1824
+ }, ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
1825
+ panelClasses = computed(() => {
1826
+ const base = ['mf-select-panel'];
1827
+ const extra = this.panelClass();
1828
+ if (Array.isArray(extra)) {
1829
+ base.push(...extra.filter(Boolean));
1830
+ }
1831
+ else if (extra) {
1832
+ base.push(extra);
1833
+ }
1834
+ return base;
1835
+ }, ...(ngDevMode ? [{ debugName: "panelClasses" }] : /* istanbul ignore next */ []));
1836
+ onSelectionChange(event) {
1837
+ this.mfSelectionChange.emit(event.value);
1838
+ }
1839
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: MfSelectComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1840
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.4", type: MfSelectComponent, isStandalone: true, selector: "mf-select", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: true, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, hint: { classPropertyName: "hint", publicName: "hint", isSignal: true, isRequired: false, transformFunction: null }, error: { classPropertyName: "error", publicName: "error", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, fullWidth: { classPropertyName: "fullWidth", publicName: "fullWidth", isSignal: true, isRequired: false, transformFunction: null }, leadingIcon: { classPropertyName: "leadingIcon", publicName: "leadingIcon", isSignal: true, isRequired: false, transformFunction: null }, trailingIcon: { classPropertyName: "trailingIcon", publicName: "trailingIcon", isSignal: true, isRequired: false, transformFunction: null }, panelClass: { classPropertyName: "panelClass", publicName: "panelClass", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { mfSelectionChange: "mfSelectionChange" }, ngImport: i0, template: `
1841
+ <mat-form-field [appearance]="'outline'" [class]="hostClasses()">
1842
+ @if (label()) {
1843
+ <mat-label>{{ label() }}</mat-label>
1844
+ }
1845
+ @if (leadingIcon()) {
1846
+ <mat-icon matPrefix aria-hidden="true">{{ leadingIcon() }}</mat-icon>
1847
+ }
1848
+ <mat-select
1849
+ [value]="value()"
1850
+ [disabled]="disabled()"
1851
+ [multiple]="multiple()"
1852
+ [placeholder]="placeholder()"
1853
+ [panelClass]="panelClasses()"
1854
+ (selectionChange)="onSelectionChange($event)"
1855
+ >
1856
+ @for (option of options(); track option.value) {
1857
+ <mat-option [value]="option.value" [disabled]="option.disabled ?? false">
1858
+ {{ option.label }}
1859
+ </mat-option>
1860
+ }
1861
+ </mat-select>
1862
+ @if (trailingIcon()) {
1863
+ <mat-icon matSuffix aria-hidden="true">{{ trailingIcon() }}</mat-icon>
1864
+ }
1865
+ @if (hint()) {
1866
+ <mat-hint>{{ hint() }}</mat-hint>
1867
+ }
1868
+ @if (error()) {
1869
+ <mat-error>{{ error() }}</mat-error>
1870
+ }
1871
+ </mat-form-field>
1872
+ `, isInline: true, styles: [":host{display:inline-block}.mf-select{font-family:var(--mf-font-base)!important;width:100%}.mf-select--full{width:100%}.mf-select .mat-mdc-text-field-wrapper,.mf-select .mdc-notched-outline{border-radius:var(--mf-radius-md)!important}.mf-select .mdc-notched-outline__leading,.mf-select .mdc-notched-outline__notch,.mf-select .mdc-notched-outline__trailing{border-color:var(--mf-color-border)!important;transition:border-color var(--mf-duration-base) var(--mf-ease-standard)}.mf-select .mat-mdc-form-field-focus-overlay{background-color:transparent!important}.mf-select.mat-focused .mdc-notched-outline__leading,.mf-select.mat-focused .mdc-notched-outline__notch,.mf-select.mat-focused .mdc-notched-outline__trailing{border-color:var(--mf-color-brand)!important;border-width:1.5px!important}.mf-select--error .mdc-notched-outline__leading,.mf-select--error .mdc-notched-outline__notch,.mf-select--error .mdc-notched-outline__trailing{border-color:var(--mf-color-error-500)!important}.mf-select .mat-mdc-floating-label{font-family:var(--mf-font-base)!important;font-weight:var(--mf-weight-medium)!important;color:var(--mf-color-neutral-400)!important}.mf-select.mat-focused .mat-mdc-floating-label{color:var(--mf-color-brand)!important}.mf-select .mat-mdc-select-trigger{font-family:var(--mf-font-base)!important;color:var(--mf-color-on-surface)!important}.mf-select .mat-mdc-select-placeholder{color:var(--mf-color-neutral-400)!important}.mf-select .mat-mdc-select-arrow{color:var(--mf-color-neutral-400)!important;transition:color var(--mf-duration-base) var(--mf-ease-standard)}.mf-select.mat-focused .mat-mdc-select-arrow{color:var(--mf-color-brand)!important}.mf-select .mat-icon{color:var(--mf-color-neutral-400)!important;font-size:20px;width:20px;height:20px;transition:color var(--mf-duration-base) var(--mf-ease-standard)}.mf-select.mat-focused .mat-icon{color:var(--mf-color-brand)!important}.mf-select .mat-mdc-form-field-hint{font-size:var(--mf-text-xs)!important;color:var(--mf-color-neutral-400)!important}.mf-select .mat-mdc-form-field-error{font-size:var(--mf-text-xs)!important}.mf-select--sm .mat-mdc-select-trigger{font-size:var(--mf-text-sm)!important}.mf-select--md .mat-mdc-select-trigger{font-size:var(--mf-text-base)!important}.mf-select--lg .mat-mdc-select-trigger{font-size:var(--mf-text-lg)!important}.mf-select .mat-mdc-select-trigger[aria-disabled=true],.mf-select .mat-mdc-select-trigger.mat-mdc-select-disabled{color:var(--mf-color-neutral-300)!important}\n"], dependencies: [{ kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i1$3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i1$3.MatLabel, selector: "mat-label" }, { kind: "directive", type: i1$3.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i1$3.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i1$3.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i1$3.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i2$1.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i2.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1873
+ }
1874
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: MfSelectComponent, decorators: [{
1875
+ type: Component,
1876
+ args: [{ selector: 'mf-select', imports: [MatSelectModule, MatFormFieldModule, MatIconModule], template: `
1877
+ <mat-form-field [appearance]="'outline'" [class]="hostClasses()">
1878
+ @if (label()) {
1879
+ <mat-label>{{ label() }}</mat-label>
1880
+ }
1881
+ @if (leadingIcon()) {
1882
+ <mat-icon matPrefix aria-hidden="true">{{ leadingIcon() }}</mat-icon>
1883
+ }
1884
+ <mat-select
1885
+ [value]="value()"
1886
+ [disabled]="disabled()"
1887
+ [multiple]="multiple()"
1888
+ [placeholder]="placeholder()"
1889
+ [panelClass]="panelClasses()"
1890
+ (selectionChange)="onSelectionChange($event)"
1891
+ >
1892
+ @for (option of options(); track option.value) {
1893
+ <mat-option [value]="option.value" [disabled]="option.disabled ?? false">
1894
+ {{ option.label }}
1895
+ </mat-option>
1896
+ }
1897
+ </mat-select>
1898
+ @if (trailingIcon()) {
1899
+ <mat-icon matSuffix aria-hidden="true">{{ trailingIcon() }}</mat-icon>
1900
+ }
1901
+ @if (hint()) {
1902
+ <mat-hint>{{ hint() }}</mat-hint>
1903
+ }
1904
+ @if (error()) {
1905
+ <mat-error>{{ error() }}</mat-error>
1906
+ }
1907
+ </mat-form-field>
1908
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:inline-block}.mf-select{font-family:var(--mf-font-base)!important;width:100%}.mf-select--full{width:100%}.mf-select .mat-mdc-text-field-wrapper,.mf-select .mdc-notched-outline{border-radius:var(--mf-radius-md)!important}.mf-select .mdc-notched-outline__leading,.mf-select .mdc-notched-outline__notch,.mf-select .mdc-notched-outline__trailing{border-color:var(--mf-color-border)!important;transition:border-color var(--mf-duration-base) var(--mf-ease-standard)}.mf-select .mat-mdc-form-field-focus-overlay{background-color:transparent!important}.mf-select.mat-focused .mdc-notched-outline__leading,.mf-select.mat-focused .mdc-notched-outline__notch,.mf-select.mat-focused .mdc-notched-outline__trailing{border-color:var(--mf-color-brand)!important;border-width:1.5px!important}.mf-select--error .mdc-notched-outline__leading,.mf-select--error .mdc-notched-outline__notch,.mf-select--error .mdc-notched-outline__trailing{border-color:var(--mf-color-error-500)!important}.mf-select .mat-mdc-floating-label{font-family:var(--mf-font-base)!important;font-weight:var(--mf-weight-medium)!important;color:var(--mf-color-neutral-400)!important}.mf-select.mat-focused .mat-mdc-floating-label{color:var(--mf-color-brand)!important}.mf-select .mat-mdc-select-trigger{font-family:var(--mf-font-base)!important;color:var(--mf-color-on-surface)!important}.mf-select .mat-mdc-select-placeholder{color:var(--mf-color-neutral-400)!important}.mf-select .mat-mdc-select-arrow{color:var(--mf-color-neutral-400)!important;transition:color var(--mf-duration-base) var(--mf-ease-standard)}.mf-select.mat-focused .mat-mdc-select-arrow{color:var(--mf-color-brand)!important}.mf-select .mat-icon{color:var(--mf-color-neutral-400)!important;font-size:20px;width:20px;height:20px;transition:color var(--mf-duration-base) var(--mf-ease-standard)}.mf-select.mat-focused .mat-icon{color:var(--mf-color-brand)!important}.mf-select .mat-mdc-form-field-hint{font-size:var(--mf-text-xs)!important;color:var(--mf-color-neutral-400)!important}.mf-select .mat-mdc-form-field-error{font-size:var(--mf-text-xs)!important}.mf-select--sm .mat-mdc-select-trigger{font-size:var(--mf-text-sm)!important}.mf-select--md .mat-mdc-select-trigger{font-size:var(--mf-text-base)!important}.mf-select--lg .mat-mdc-select-trigger{font-size:var(--mf-text-lg)!important}.mf-select .mat-mdc-select-trigger[aria-disabled=true],.mf-select .mat-mdc-select-trigger.mat-mdc-select-disabled{color:var(--mf-color-neutral-300)!important}\n"] }]
1909
+ }], propDecorators: { options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: true }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], hint: [{ type: i0.Input, args: [{ isSignal: true, alias: "hint", required: false }] }], error: [{ type: i0.Input, args: [{ isSignal: true, alias: "error", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], fullWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "fullWidth", required: false }] }], leadingIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "leadingIcon", required: false }] }], trailingIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "trailingIcon", required: false }] }], panelClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelClass", required: false }] }], mfSelectionChange: [{ type: i0.Output, args: ["mfSelectionChange"] }] } });
1910
+
1911
+ /**
1912
+ * Panel lateral de la librería ng-comps.
1913
+ * Envuelve Angular Material `mat-sidenav-container` y expone una API uniforme
1914
+ * con look and feel de marca.
1915
+ *
1916
+ * Dos formas de uso:
1917
+ * 1. **Navitems declarativos** — Proporciona `navItems`, `headerTitle` e icono.
1918
+ * 2. **Content projection** — Proyecta `[mfSidenavContent]` para control total.
1919
+ *
1920
+ * El contenido principal se proyecta sin atributo.
1921
+ */
1922
+ class MfSidenavComponent {
1923
+ /** Abierto o cerrado */
1924
+ opened = input(false, ...(ngDevMode ? [{ debugName: "opened" }] : /* istanbul ignore next */ []));
1925
+ /** Modo de apertura */
1926
+ mode = input('side', ...(ngDevMode ? [{ debugName: "mode" }] : /* istanbul ignore next */ []));
1927
+ /** Posición del panel */
1928
+ position = input('start', ...(ngDevMode ? [{ debugName: "position" }] : /* istanbul ignore next */ []));
1929
+ /** Muestra backdrop al abrir */
1930
+ hasBackdrop = input(null, ...(ngDevMode ? [{ debugName: "hasBackdrop" }] : /* istanbul ignore next */ []));
1931
+ /** Ancho del panel lateral */
1932
+ sidenavWidth = input('260px', ...(ngDevMode ? [{ debugName: "sidenavWidth" }] : /* istanbul ignore next */ []));
1933
+ /** Ítems de navegación declarativos */
1934
+ navItems = input([], ...(ngDevMode ? [{ debugName: "navItems" }] : /* istanbul ignore next */ []));
1935
+ /** Título de la cabecera del sidenav */
1936
+ headerTitle = input(undefined, ...(ngDevMode ? [{ debugName: "headerTitle" }] : /* istanbul ignore next */ []));
1937
+ /** Icono Material de la cabecera */
1938
+ headerIcon = input(undefined, ...(ngDevMode ? [{ debugName: "headerIcon" }] : /* istanbul ignore next */ []));
1939
+ /** Aria-label del elemento nav */
1940
+ navAriaLabel = input('Navegación principal', ...(ngDevMode ? [{ debugName: "navAriaLabel" }] : /* istanbul ignore next */ []));
1941
+ mfOpenedChange = output();
1942
+ /** Emite el ítem de navegación pulsado */
1943
+ mfNavItemClick = output();
1944
+ containerClasses = computed(() => 'mf-sidenav-container', ...(ngDevMode ? [{ debugName: "containerClasses" }] : /* istanbul ignore next */ []));
1945
+ sidenavClasses = computed(() => {
1946
+ return `mf-sidenav mf-sidenav--${this.mode()}`;
1947
+ }, ...(ngDevMode ? [{ debugName: "sidenavClasses" }] : /* istanbul ignore next */ []));
1948
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: MfSidenavComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1949
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.4", type: MfSidenavComponent, isStandalone: true, selector: "mf-sidenav", inputs: { opened: { classPropertyName: "opened", publicName: "opened", isSignal: true, isRequired: false, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null }, hasBackdrop: { classPropertyName: "hasBackdrop", publicName: "hasBackdrop", isSignal: true, isRequired: false, transformFunction: null }, sidenavWidth: { classPropertyName: "sidenavWidth", publicName: "sidenavWidth", isSignal: true, isRequired: false, transformFunction: null }, navItems: { classPropertyName: "navItems", publicName: "navItems", isSignal: true, isRequired: false, transformFunction: null }, headerTitle: { classPropertyName: "headerTitle", publicName: "headerTitle", isSignal: true, isRequired: false, transformFunction: null }, headerIcon: { classPropertyName: "headerIcon", publicName: "headerIcon", isSignal: true, isRequired: false, transformFunction: null }, navAriaLabel: { classPropertyName: "navAriaLabel", publicName: "navAriaLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { mfOpenedChange: "mfOpenedChange", mfNavItemClick: "mfNavItemClick" }, ngImport: i0, template: `
1950
+ <mat-sidenav-container [class]="containerClasses()" [hasBackdrop]="hasBackdrop()">
1951
+ <mat-sidenav
1952
+ [class]="sidenavClasses()"
1953
+ [mode]="mode()"
1954
+ [position]="position()"
1955
+ [opened]="opened()"
1956
+ [style.width]="sidenavWidth()"
1957
+ (openedChange)="mfOpenedChange.emit($event)"
1958
+ >
1959
+ @if (navItems().length > 0) {
1960
+ <div class="mf-sidenav__nav">
1961
+ @if (headerTitle()) {
1962
+ <div class="mf-sidenav__header">
1963
+ @if (headerIcon()) {
1964
+ <mat-icon class="mf-sidenav__header-icon" aria-hidden="true">{{ headerIcon() }}</mat-icon>
1965
+ }
1966
+ <span class="mf-sidenav__header-title">{{ headerTitle() }}</span>
1967
+ </div>
1968
+ }
1969
+ <nav class="mf-sidenav__menu" [attr.aria-label]="navAriaLabel()">
1970
+ @for (item of navItems(); track item.id) {
1971
+ <button
1972
+ type="button"
1973
+ class="mf-sidenav__item"
1974
+ [class.mf-sidenav__item--active]="item.active"
1975
+ [class.mf-sidenav__item--disabled]="item.disabled"
1976
+ [disabled]="item.disabled ?? false"
1977
+ [attr.aria-current]="item.active ? 'page' : null"
1978
+ (click)="!item.disabled && mfNavItemClick.emit(item)"
1979
+ >
1980
+ <mat-icon class="mf-sidenav__item-icon" aria-hidden="true">{{ item.icon }}</mat-icon>
1981
+ <span class="mf-sidenav__item-label">{{ item.label }}</span>
1982
+ @if (item.badge && item.badge > 0) {
1983
+ <span class="mf-sidenav__item-badge" aria-label="{{ item.badge }} notificaciones">
1984
+ {{ item.badge > 99 ? '99+' : item.badge }}
1985
+ </span>
1986
+ }
1987
+ </button>
1988
+ }
1989
+ </nav>
1990
+ </div>
1991
+ } @else {
1992
+ <ng-content select="[mfSidenavContent]" />
1993
+ }
1994
+ </mat-sidenav>
1995
+ <mat-sidenav-content class="mf-sidenav__main">
1996
+ <ng-content />
1997
+ </mat-sidenav-content>
1998
+ </mat-sidenav-container>
1999
+ `, isInline: true, styles: [":host{display:block;height:100%}.mf-sidenav-container{height:100%;background-color:var(--mf-color-surface)!important}.mf-sidenav{background-color:var(--mf-color-surface)!important;border-right:1px solid var(--mf-color-border)!important;font-family:var(--mf-font-base)!important}.mf-sidenav--over,.mf-sidenav--push{box-shadow:var(--mf-shadow-lg)!important}.mf-sidenav--side{box-shadow:none;border-right:1px solid var(--mf-color-border)!important}.mf-sidenav__nav{display:flex;flex-direction:column;height:100%;overflow:hidden}.mf-sidenav__header{display:flex;align-items:center;gap:var(--mf-space-2);padding:var(--mf-space-5) var(--mf-space-4) var(--mf-space-4);border-bottom:1px solid var(--mf-color-border);flex-shrink:0}.mf-sidenav__header-icon{color:var(--mf-color-brand)!important;font-size:22px;width:22px;height:22px}.mf-sidenav__header-title{font-family:var(--mf-font-display)!important;font-size:var(--mf-text-base);font-weight:var(--mf-weight-bold);color:var(--mf-color-on-surface);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mf-sidenav__menu{display:flex;flex-direction:column;gap:var(--mf-space-1);padding:var(--mf-space-3) var(--mf-space-3);flex:1;overflow-y:auto}.mf-sidenav__item{display:flex;align-items:center;gap:var(--mf-space-3);width:100%;padding:var(--mf-space-2) var(--mf-space-3);border:none;border-radius:var(--mf-radius-md);background:transparent;color:var(--mf-color-neutral-600);font-family:var(--mf-font-base);font-size:var(--mf-text-sm);font-weight:var(--mf-weight-medium);cursor:pointer;text-align:left;transition:background-color var(--mf-duration-fast) var(--mf-ease-standard),color var(--mf-duration-fast) var(--mf-ease-standard);position:relative}.mf-sidenav__item:hover:not(.mf-sidenav__item--disabled){background-color:var(--mf-color-neutral-100);color:var(--mf-color-on-surface)}.mf-sidenav__item:hover:not(.mf-sidenav__item--disabled) .mf-sidenav__item-icon{color:var(--mf-color-brand)!important}.mf-sidenav__item--active{background-color:var(--mf-color-brand-light)!important;color:var(--mf-color-brand)!important;font-weight:var(--mf-weight-bold)!important}.mf-sidenav__item--active .mf-sidenav__item-icon{color:var(--mf-color-brand)!important}.mf-sidenav__item--disabled{opacity:.4;cursor:not-allowed}.mf-sidenav__item-icon{font-size:20px;width:20px;height:20px;flex-shrink:0;color:var(--mf-color-neutral-400)!important;transition:color var(--mf-duration-fast) var(--mf-ease-standard)}.mf-sidenav__item-label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mf-sidenav__item-badge{display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:20px;padding:0 var(--mf-space-1);border-radius:var(--mf-radius-full);background-color:var(--mf-color-brand);color:var(--mf-color-on-brand);font-size:.625rem;font-weight:var(--mf-weight-bold);line-height:1;flex-shrink:0}.mf-sidenav__main{background-color:var(--mf-color-surface);padding:var(--mf-space-6);font-family:var(--mf-font-base)}.mf-sidenav-container .mat-drawer-backdrop.mat-drawer-shown{background-color:#0f172a52!important}\n"], dependencies: [{ kind: "ngmodule", type: MatSidenavModule }, { kind: "component", type: i1$h.MatSidenav, selector: "mat-sidenav", inputs: ["fixedInViewport", "fixedTopGap", "fixedBottomGap"], exportAs: ["matSidenav"] }, { kind: "component", type: i1$h.MatSidenavContainer, selector: "mat-sidenav-container", exportAs: ["matSidenavContainer"] }, { kind: "component", type: i1$h.MatSidenavContent, selector: "mat-sidenav-content" }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2000
+ }
2001
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: MfSidenavComponent, decorators: [{
2002
+ type: Component,
2003
+ args: [{ selector: 'mf-sidenav', imports: [MatSidenavModule, MatIconModule], template: `
2004
+ <mat-sidenav-container [class]="containerClasses()" [hasBackdrop]="hasBackdrop()">
2005
+ <mat-sidenav
2006
+ [class]="sidenavClasses()"
2007
+ [mode]="mode()"
2008
+ [position]="position()"
2009
+ [opened]="opened()"
2010
+ [style.width]="sidenavWidth()"
2011
+ (openedChange)="mfOpenedChange.emit($event)"
2012
+ >
2013
+ @if (navItems().length > 0) {
2014
+ <div class="mf-sidenav__nav">
2015
+ @if (headerTitle()) {
2016
+ <div class="mf-sidenav__header">
2017
+ @if (headerIcon()) {
2018
+ <mat-icon class="mf-sidenav__header-icon" aria-hidden="true">{{ headerIcon() }}</mat-icon>
2019
+ }
2020
+ <span class="mf-sidenav__header-title">{{ headerTitle() }}</span>
2021
+ </div>
2022
+ }
2023
+ <nav class="mf-sidenav__menu" [attr.aria-label]="navAriaLabel()">
2024
+ @for (item of navItems(); track item.id) {
2025
+ <button
2026
+ type="button"
2027
+ class="mf-sidenav__item"
2028
+ [class.mf-sidenav__item--active]="item.active"
2029
+ [class.mf-sidenav__item--disabled]="item.disabled"
2030
+ [disabled]="item.disabled ?? false"
2031
+ [attr.aria-current]="item.active ? 'page' : null"
2032
+ (click)="!item.disabled && mfNavItemClick.emit(item)"
2033
+ >
2034
+ <mat-icon class="mf-sidenav__item-icon" aria-hidden="true">{{ item.icon }}</mat-icon>
2035
+ <span class="mf-sidenav__item-label">{{ item.label }}</span>
2036
+ @if (item.badge && item.badge > 0) {
2037
+ <span class="mf-sidenav__item-badge" aria-label="{{ item.badge }} notificaciones">
2038
+ {{ item.badge > 99 ? '99+' : item.badge }}
2039
+ </span>
2040
+ }
2041
+ </button>
2042
+ }
2043
+ </nav>
2044
+ </div>
2045
+ } @else {
2046
+ <ng-content select="[mfSidenavContent]" />
2047
+ }
2048
+ </mat-sidenav>
2049
+ <mat-sidenav-content class="mf-sidenav__main">
2050
+ <ng-content />
2051
+ </mat-sidenav-content>
2052
+ </mat-sidenav-container>
2053
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;height:100%}.mf-sidenav-container{height:100%;background-color:var(--mf-color-surface)!important}.mf-sidenav{background-color:var(--mf-color-surface)!important;border-right:1px solid var(--mf-color-border)!important;font-family:var(--mf-font-base)!important}.mf-sidenav--over,.mf-sidenav--push{box-shadow:var(--mf-shadow-lg)!important}.mf-sidenav--side{box-shadow:none;border-right:1px solid var(--mf-color-border)!important}.mf-sidenav__nav{display:flex;flex-direction:column;height:100%;overflow:hidden}.mf-sidenav__header{display:flex;align-items:center;gap:var(--mf-space-2);padding:var(--mf-space-5) var(--mf-space-4) var(--mf-space-4);border-bottom:1px solid var(--mf-color-border);flex-shrink:0}.mf-sidenav__header-icon{color:var(--mf-color-brand)!important;font-size:22px;width:22px;height:22px}.mf-sidenav__header-title{font-family:var(--mf-font-display)!important;font-size:var(--mf-text-base);font-weight:var(--mf-weight-bold);color:var(--mf-color-on-surface);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mf-sidenav__menu{display:flex;flex-direction:column;gap:var(--mf-space-1);padding:var(--mf-space-3) var(--mf-space-3);flex:1;overflow-y:auto}.mf-sidenav__item{display:flex;align-items:center;gap:var(--mf-space-3);width:100%;padding:var(--mf-space-2) var(--mf-space-3);border:none;border-radius:var(--mf-radius-md);background:transparent;color:var(--mf-color-neutral-600);font-family:var(--mf-font-base);font-size:var(--mf-text-sm);font-weight:var(--mf-weight-medium);cursor:pointer;text-align:left;transition:background-color var(--mf-duration-fast) var(--mf-ease-standard),color var(--mf-duration-fast) var(--mf-ease-standard);position:relative}.mf-sidenav__item:hover:not(.mf-sidenav__item--disabled){background-color:var(--mf-color-neutral-100);color:var(--mf-color-on-surface)}.mf-sidenav__item:hover:not(.mf-sidenav__item--disabled) .mf-sidenav__item-icon{color:var(--mf-color-brand)!important}.mf-sidenav__item--active{background-color:var(--mf-color-brand-light)!important;color:var(--mf-color-brand)!important;font-weight:var(--mf-weight-bold)!important}.mf-sidenav__item--active .mf-sidenav__item-icon{color:var(--mf-color-brand)!important}.mf-sidenav__item--disabled{opacity:.4;cursor:not-allowed}.mf-sidenav__item-icon{font-size:20px;width:20px;height:20px;flex-shrink:0;color:var(--mf-color-neutral-400)!important;transition:color var(--mf-duration-fast) var(--mf-ease-standard)}.mf-sidenav__item-label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mf-sidenav__item-badge{display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:20px;padding:0 var(--mf-space-1);border-radius:var(--mf-radius-full);background-color:var(--mf-color-brand);color:var(--mf-color-on-brand);font-size:.625rem;font-weight:var(--mf-weight-bold);line-height:1;flex-shrink:0}.mf-sidenav__main{background-color:var(--mf-color-surface);padding:var(--mf-space-6);font-family:var(--mf-font-base)}.mf-sidenav-container .mat-drawer-backdrop.mat-drawer-shown{background-color:#0f172a52!important}\n"] }]
2054
+ }], propDecorators: { opened: [{ type: i0.Input, args: [{ isSignal: true, alias: "opened", required: false }] }], mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], position: [{ type: i0.Input, args: [{ isSignal: true, alias: "position", required: false }] }], hasBackdrop: [{ type: i0.Input, args: [{ isSignal: true, alias: "hasBackdrop", required: false }] }], sidenavWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "sidenavWidth", required: false }] }], navItems: [{ type: i0.Input, args: [{ isSignal: true, alias: "navItems", required: false }] }], headerTitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "headerTitle", required: false }] }], headerIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "headerIcon", required: false }] }], navAriaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "navAriaLabel", required: false }] }], mfOpenedChange: [{ type: i0.Output, args: ["mfOpenedChange"] }], mfNavItemClick: [{ type: i0.Output, args: ["mfNavItemClick"] }] } });
2055
+
2056
+ /**
2057
+ * Slide Toggle de la librería ng-comps.
2058
+ * Envuelve Angular Material `mat-slide-toggle` y expone una API uniforme
2059
+ * con look and feel de marca.
2060
+ */
2061
+ class MfSlideToggleComponent {
2062
+ /** Texto descriptivo */
2063
+ label = input('', ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
2064
+ /** Estado activado */
2065
+ checked = input(false, ...(ngDevMode ? [{ debugName: "checked" }] : /* istanbul ignore next */ []));
2066
+ /** Deshabilitado */
2067
+ disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
2068
+ mfChange = output();
2069
+ hostClasses = computed(() => {
2070
+ const classes = ['mf-slide-toggle'];
2071
+ if (this.disabled())
2072
+ classes.push('mf-slide-toggle--disabled');
2073
+ return classes.join(' ');
2074
+ }, ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
2075
+ onChange(event) {
2076
+ this.mfChange.emit(event.checked);
2077
+ }
2078
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: MfSlideToggleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2079
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.4", type: MfSlideToggleComponent, isStandalone: true, selector: "mf-slide-toggle", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, checked: { classPropertyName: "checked", publicName: "checked", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { mfChange: "mfChange" }, ngImport: i0, template: `
2080
+ <mat-slide-toggle
2081
+ [checked]="checked()"
2082
+ [disabled]="disabled()"
2083
+ [class]="hostClasses()"
2084
+ (change)="onChange($event)"
2085
+ >
2086
+ {{ label() }}
2087
+ </mat-slide-toggle>
2088
+ `, isInline: true, styles: [":host{display:inline-block}.mf-slide-toggle.mat-mdc-slide-toggle{font-family:var(--mf-font-base)!important;font-size:var(--mf-text-sm)!important}.mf-slide-toggle .mdc-switch--selected .mdc-switch__track:after{background-color:var(--mf-color-primary-200)!important}.mf-slide-toggle .mdc-switch--selected .mdc-switch__handle:after{background-color:var(--mf-color-brand)!important}.mf-slide-toggle--disabled{opacity:.42}\n"], dependencies: [{ kind: "ngmodule", type: MatSlideToggleModule }, { kind: "component", type: i1$i.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2089
+ }
2090
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: MfSlideToggleComponent, decorators: [{
2091
+ type: Component,
2092
+ args: [{ selector: 'mf-slide-toggle', imports: [MatSlideToggleModule], template: `
2093
+ <mat-slide-toggle
2094
+ [checked]="checked()"
2095
+ [disabled]="disabled()"
2096
+ [class]="hostClasses()"
2097
+ (change)="onChange($event)"
2098
+ >
2099
+ {{ label() }}
2100
+ </mat-slide-toggle>
2101
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:inline-block}.mf-slide-toggle.mat-mdc-slide-toggle{font-family:var(--mf-font-base)!important;font-size:var(--mf-text-sm)!important}.mf-slide-toggle .mdc-switch--selected .mdc-switch__track:after{background-color:var(--mf-color-primary-200)!important}.mf-slide-toggle .mdc-switch--selected .mdc-switch__handle:after{background-color:var(--mf-color-brand)!important}.mf-slide-toggle--disabled{opacity:.42}\n"] }]
2102
+ }], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], checked: [{ type: i0.Input, args: [{ isSignal: true, alias: "checked", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], mfChange: [{ type: i0.Output, args: ["mfChange"] }] } });
2103
+
2104
+ /**
2105
+ * Servicio de Snackbar de la librería ng-comps.
2106
+ * Envuelve Angular Material `MatSnackBar` y expone una API uniforme
2107
+ * con estilos de marca y tipos semánticos.
2108
+ */
2109
+ class MfSnackbarService {
2110
+ matSnackBar = inject(MatSnackBar);
2111
+ open(config) {
2112
+ const type = config.type ?? 'info';
2113
+ const matConfig = {
2114
+ duration: config.duration ?? 4000,
2115
+ horizontalPosition: config.horizontalPosition ?? 'end',
2116
+ verticalPosition: config.verticalPosition ?? 'bottom',
2117
+ panelClass: ['mf-snackbar', `mf-snackbar--${type}`],
2118
+ };
2119
+ return this.matSnackBar.open(config.message, config.action, matConfig);
2120
+ }
2121
+ info(message, action) {
2122
+ return this.open({ message, action, type: 'info' });
2123
+ }
2124
+ success(message, action) {
2125
+ return this.open({ message, action, type: 'success' });
2126
+ }
2127
+ warning(message, action) {
2128
+ return this.open({ message, action, type: 'warning' });
2129
+ }
2130
+ error(message, action) {
2131
+ return this.open({ message, action, type: 'error' });
2132
+ }
2133
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: MfSnackbarService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
2134
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: MfSnackbarService, providedIn: 'root' });
2135
+ }
2136
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: MfSnackbarService, decorators: [{
2137
+ type: Injectable,
2138
+ args: [{ providedIn: 'root' }]
2139
+ }] });
2140
+
2141
+ /**
2142
+ * Table de la librería ng-comps.
2143
+ * Envuelve Angular Material `mat-table` y expone una API uniforme
2144
+ * con look and feel de marca. Ideal para dashboards y paneles de datos.
2145
+ */
2146
+ class MfTableComponent {
2147
+ /** Columnas de la tabla */
2148
+ columns = input.required(...(ngDevMode ? [{ debugName: "columns" }] : /* istanbul ignore next */ []));
2149
+ /** Datos de la tabla */
2150
+ data = input.required(...(ngDevMode ? [{ debugName: "data" }] : /* istanbul ignore next */ []));
2151
+ /** Variante visual */
2152
+ variant = input('default', ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
2153
+ mfSortChange = output();
2154
+ mfRowClick = output();
2155
+ displayedColumns = computed(() => this.columns().map(c => c.key), ...(ngDevMode ? [{ debugName: "displayedColumns" }] : /* istanbul ignore next */ []));
2156
+ hostClasses = computed(() => {
2157
+ return ['mf-table', `mf-table--${this.variant()}`].join(' ');
2158
+ }, ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
2159
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: MfTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2160
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.4", type: MfTableComponent, isStandalone: true, selector: "mf-table", inputs: { columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: true, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { mfSortChange: "mfSortChange", mfRowClick: "mfRowClick" }, ngImport: i0, template: `
2161
+ <div class="mf-table__wrapper" [class]="hostClasses()">
2162
+ <table
2163
+ mat-table
2164
+ [dataSource]="data()"
2165
+ matSort
2166
+ (matSortChange)="mfSortChange.emit($event)"
2167
+ >
2168
+ @for (col of columns(); track col.key) {
2169
+ <ng-container [matColumnDef]="col.key">
2170
+ @if (col.sortable) {
2171
+ <th mat-header-cell *matHeaderCellDef mat-sort-header>{{ col.header }}</th>
2172
+ } @else {
2173
+ <th mat-header-cell *matHeaderCellDef>{{ col.header }}</th>
2174
+ }
2175
+ <td mat-cell *matCellDef="let row">{{ row[col.key] }}</td>
2176
+ </ng-container>
2177
+ }
2178
+
2179
+ <tr mat-header-row *matHeaderRowDef="displayedColumns()"></tr>
2180
+ <tr mat-row *matRowDef="let row; columns: displayedColumns()" (click)="mfRowClick.emit(row)"></tr>
2181
+ </table>
2182
+ </div>
2183
+ `, isInline: true, styles: [":host{display:block}.mf-table__wrapper{overflow-x:auto;border-radius:var(--mf-radius-md);border:1px solid var(--mf-color-border)}.mf-table .mat-mdc-table{width:100%;font-family:var(--mf-font-base)!important}.mf-table .mat-mdc-header-cell{font-family:var(--mf-font-base)!important;font-weight:var(--mf-weight-bold)!important;font-size:var(--mf-text-sm)!important;color:var(--mf-color-neutral-600)!important;background-color:var(--mf-color-neutral-50)!important;border-bottom-color:var(--mf-color-border)!important}.mf-table .mat-mdc-cell{font-family:var(--mf-font-base)!important;font-size:var(--mf-text-sm)!important;color:var(--mf-color-on-surface)!important;border-bottom-color:var(--mf-color-border)!important}.mf-table .mat-mdc-row:hover{background-color:var(--mf-color-brand-light)!important;cursor:pointer}.mf-table--striped .mat-mdc-row:nth-child(2n){background-color:var(--mf-color-neutral-50)}.mf-table--bordered .mat-mdc-cell,.mf-table--bordered .mat-mdc-header-cell{border-right:1px solid var(--mf-color-border)!important}.mf-table--bordered .mat-mdc-cell:last-child,.mf-table--bordered .mat-mdc-header-cell:last-child{border-right:none!important}.mf-table .mat-sort-header-arrow{color:var(--mf-color-brand)!important}\n"], dependencies: [{ kind: "ngmodule", type: MatTableModule }, { kind: "component", type: i1$j.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i1$j.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i1$j.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i1$j.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i1$j.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i1$j.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i1$j.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i1$j.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i1$j.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i1$j.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "ngmodule", type: MatSortModule }, { kind: "directive", type: i2$2.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i2$2.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2184
+ }
2185
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: MfTableComponent, decorators: [{
2186
+ type: Component,
2187
+ args: [{ selector: 'mf-table', imports: [MatTableModule, MatSortModule], template: `
2188
+ <div class="mf-table__wrapper" [class]="hostClasses()">
2189
+ <table
2190
+ mat-table
2191
+ [dataSource]="data()"
2192
+ matSort
2193
+ (matSortChange)="mfSortChange.emit($event)"
2194
+ >
2195
+ @for (col of columns(); track col.key) {
2196
+ <ng-container [matColumnDef]="col.key">
2197
+ @if (col.sortable) {
2198
+ <th mat-header-cell *matHeaderCellDef mat-sort-header>{{ col.header }}</th>
2199
+ } @else {
2200
+ <th mat-header-cell *matHeaderCellDef>{{ col.header }}</th>
2201
+ }
2202
+ <td mat-cell *matCellDef="let row">{{ row[col.key] }}</td>
2203
+ </ng-container>
2204
+ }
2205
+
2206
+ <tr mat-header-row *matHeaderRowDef="displayedColumns()"></tr>
2207
+ <tr mat-row *matRowDef="let row; columns: displayedColumns()" (click)="mfRowClick.emit(row)"></tr>
2208
+ </table>
2209
+ </div>
2210
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block}.mf-table__wrapper{overflow-x:auto;border-radius:var(--mf-radius-md);border:1px solid var(--mf-color-border)}.mf-table .mat-mdc-table{width:100%;font-family:var(--mf-font-base)!important}.mf-table .mat-mdc-header-cell{font-family:var(--mf-font-base)!important;font-weight:var(--mf-weight-bold)!important;font-size:var(--mf-text-sm)!important;color:var(--mf-color-neutral-600)!important;background-color:var(--mf-color-neutral-50)!important;border-bottom-color:var(--mf-color-border)!important}.mf-table .mat-mdc-cell{font-family:var(--mf-font-base)!important;font-size:var(--mf-text-sm)!important;color:var(--mf-color-on-surface)!important;border-bottom-color:var(--mf-color-border)!important}.mf-table .mat-mdc-row:hover{background-color:var(--mf-color-brand-light)!important;cursor:pointer}.mf-table--striped .mat-mdc-row:nth-child(2n){background-color:var(--mf-color-neutral-50)}.mf-table--bordered .mat-mdc-cell,.mf-table--bordered .mat-mdc-header-cell{border-right:1px solid var(--mf-color-border)!important}.mf-table--bordered .mat-mdc-cell:last-child,.mf-table--bordered .mat-mdc-header-cell:last-child{border-right:none!important}.mf-table .mat-sort-header-arrow{color:var(--mf-color-brand)!important}\n"] }]
2211
+ }], propDecorators: { columns: [{ type: i0.Input, args: [{ isSignal: true, alias: "columns", required: true }] }], data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: true }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], mfSortChange: [{ type: i0.Output, args: ["mfSortChange"] }], mfRowClick: [{ type: i0.Output, args: ["mfRowClick"] }] } });
2212
+
2213
+ /**
2214
+ * Tabs de la librería ng-comps.
2215
+ * Envuelve Angular Material `mat-tab-group` y expone una API uniforme
2216
+ * con look and feel de marca.
2217
+ */
2218
+ class MfTabsComponent {
2219
+ /** Pestañas */
2220
+ tabs = input.required(...(ngDevMode ? [{ debugName: "tabs" }] : /* istanbul ignore next */ []));
2221
+ /** Índice seleccionado */
2222
+ selectedIndex = input(0, ...(ngDevMode ? [{ debugName: "selectedIndex" }] : /* istanbul ignore next */ []));
2223
+ /** Variante visual */
2224
+ variant = input('default', ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
2225
+ mfSelectedIndexChange = output();
2226
+ hostClasses = computed(() => {
2227
+ return ['mf-tabs', `mf-tabs--${this.variant()}`].join(' ');
2228
+ }, ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
2229
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: MfTabsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2230
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.4", type: MfTabsComponent, isStandalone: true, selector: "mf-tabs", inputs: { tabs: { classPropertyName: "tabs", publicName: "tabs", isSignal: true, isRequired: true, transformFunction: null }, selectedIndex: { classPropertyName: "selectedIndex", publicName: "selectedIndex", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { mfSelectedIndexChange: "mfSelectedIndexChange" }, ngImport: i0, template: `
2231
+ <mat-tab-group
2232
+ [selectedIndex]="selectedIndex()"
2233
+ [class]="hostClasses()"
2234
+ [mat-stretch-tabs]="variant() === 'stretched'"
2235
+ (selectedIndexChange)="mfSelectedIndexChange.emit($event)"
2236
+ >
2237
+ @for (tab of tabs(); track tab.label) {
2238
+ <mat-tab [disabled]="tab.disabled ?? false">
2239
+ <ng-template mat-tab-label>
2240
+ @if (tab.icon) {
2241
+ <mat-icon class="mf-tabs__icon" aria-hidden="true">{{ tab.icon }}</mat-icon>
2242
+ }
2243
+ {{ tab.label }}
2244
+ </ng-template>
2245
+ </mat-tab>
2246
+ }
2247
+ </mat-tab-group>
2248
+ `, isInline: true, styles: [":host{display:block}.mf-tabs .mat-mdc-tab-header{border-bottom:1px solid var(--mf-color-border)!important}.mf-tabs .mat-mdc-tab:not(.mdc-tab--active) .mdc-tab__text-label{color:var(--mf-color-neutral-400)!important;font-family:var(--mf-font-base)!important;font-weight:var(--mf-weight-medium)!important}.mf-tabs .mat-mdc-tab.mdc-tab--active .mdc-tab__text-label{color:var(--mf-color-brand)!important;font-family:var(--mf-font-base)!important;font-weight:var(--mf-weight-bold)!important}.mf-tabs .mat-mdc-tab-header .mdc-tab-indicator__content--underline{border-color:var(--mf-color-brand)!important}.mf-tabs__icon{margin-right:var(--mf-space-2);font-size:1.1em;height:1.1em;width:1.1em;vertical-align:middle}\n"], dependencies: [{ kind: "ngmodule", type: MatTabsModule }, { kind: "directive", type: i1$k.MatTabLabel, selector: "[mat-tab-label], [matTabLabel]" }, { kind: "component", type: i1$k.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass", "id"], exportAs: ["matTab"] }, { kind: "component", type: i1$k.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "fitInkBarToContent", "mat-stretch-tabs", "mat-align-tabs", "dynamicHeight", "selectedIndex", "headerPosition", "animationDuration", "contentTabIndex", "disablePagination", "disableRipple", "preserveContent", "backgroundColor", "aria-label", "aria-labelledby"], outputs: ["selectedIndexChange", "focusChange", "animationDone", "selectedTabChange"], exportAs: ["matTabGroup"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2249
+ }
2250
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: MfTabsComponent, decorators: [{
2251
+ type: Component,
2252
+ args: [{ selector: 'mf-tabs', imports: [MatTabsModule, MatIconModule], template: `
2253
+ <mat-tab-group
2254
+ [selectedIndex]="selectedIndex()"
2255
+ [class]="hostClasses()"
2256
+ [mat-stretch-tabs]="variant() === 'stretched'"
2257
+ (selectedIndexChange)="mfSelectedIndexChange.emit($event)"
2258
+ >
2259
+ @for (tab of tabs(); track tab.label) {
2260
+ <mat-tab [disabled]="tab.disabled ?? false">
2261
+ <ng-template mat-tab-label>
2262
+ @if (tab.icon) {
2263
+ <mat-icon class="mf-tabs__icon" aria-hidden="true">{{ tab.icon }}</mat-icon>
2264
+ }
2265
+ {{ tab.label }}
2266
+ </ng-template>
2267
+ </mat-tab>
2268
+ }
2269
+ </mat-tab-group>
2270
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block}.mf-tabs .mat-mdc-tab-header{border-bottom:1px solid var(--mf-color-border)!important}.mf-tabs .mat-mdc-tab:not(.mdc-tab--active) .mdc-tab__text-label{color:var(--mf-color-neutral-400)!important;font-family:var(--mf-font-base)!important;font-weight:var(--mf-weight-medium)!important}.mf-tabs .mat-mdc-tab.mdc-tab--active .mdc-tab__text-label{color:var(--mf-color-brand)!important;font-family:var(--mf-font-base)!important;font-weight:var(--mf-weight-bold)!important}.mf-tabs .mat-mdc-tab-header .mdc-tab-indicator__content--underline{border-color:var(--mf-color-brand)!important}.mf-tabs__icon{margin-right:var(--mf-space-2);font-size:1.1em;height:1.1em;width:1.1em;vertical-align:middle}\n"] }]
2271
+ }], propDecorators: { tabs: [{ type: i0.Input, args: [{ isSignal: true, alias: "tabs", required: true }] }], selectedIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedIndex", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], mfSelectedIndexChange: [{ type: i0.Output, args: ["mfSelectedIndexChange"] }] } });
2272
+
2273
+ /**
2274
+ * Textarea de la librería ng-comps.
2275
+ * Envuelve Angular Material `matInput` con textarea y expone una API uniforme
2276
+ * con look and feel de marca.
2277
+ */
2278
+ class MfTextareaComponent {
2279
+ /** Etiqueta */
2280
+ label = input(undefined, ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
2281
+ /** Placeholder */
2282
+ placeholder = input('', ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
2283
+ /** Valor */
2284
+ value = input('', ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
2285
+ /** Filas visibles */
2286
+ rows = input(4, ...(ngDevMode ? [{ debugName: "rows" }] : /* istanbul ignore next */ []));
2287
+ /** Tamaño */
2288
+ size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
2289
+ /** Máximo de caracteres */
2290
+ maxLength = input(undefined, ...(ngDevMode ? [{ debugName: "maxLength" }] : /* istanbul ignore next */ []));
2291
+ /** Deshabilitado */
2292
+ disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
2293
+ /** Solo lectura */
2294
+ readonly = input(false, ...(ngDevMode ? [{ debugName: "readonly" }] : /* istanbul ignore next */ []));
2295
+ /** Texto de ayuda */
2296
+ hint = input(undefined, ...(ngDevMode ? [{ debugName: "hint" }] : /* istanbul ignore next */ []));
2297
+ /** Resize */
2298
+ resize = input('vertical', ...(ngDevMode ? [{ debugName: "resize" }] : /* istanbul ignore next */ []));
2299
+ mfInput = output();
2300
+ mfBlur = output();
2301
+ currentLength = computed(() => this.value().length, ...(ngDevMode ? [{ debugName: "currentLength" }] : /* istanbul ignore next */ []));
2302
+ hostClasses = computed(() => {
2303
+ return ['mf-textarea', `mf-textarea--${this.size()}`, `mf-textarea--resize-${this.resize()}`].join(' ');
2304
+ }, ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
2305
+ onInput(event) {
2306
+ const value = event.target.value;
2307
+ this.mfInput.emit(value);
2308
+ }
2309
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: MfTextareaComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2310
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.4", type: MfTextareaComponent, isStandalone: true, selector: "mf-textarea", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, rows: { classPropertyName: "rows", publicName: "rows", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, maxLength: { classPropertyName: "maxLength", publicName: "maxLength", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, hint: { classPropertyName: "hint", publicName: "hint", isSignal: true, isRequired: false, transformFunction: null }, resize: { classPropertyName: "resize", publicName: "resize", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { mfInput: "mfInput", mfBlur: "mfBlur" }, ngImport: i0, template: `
2311
+ <mat-form-field [appearance]="'outline'" [class]="hostClasses()">
2312
+ @if (label()) {
2313
+ <mat-label>{{ label() }}</mat-label>
2314
+ }
2315
+ <textarea
2316
+ matInput
2317
+ [placeholder]="placeholder()"
2318
+ [disabled]="disabled()"
2319
+ [readonly]="readonly()"
2320
+ [rows]="rows()"
2321
+ [attr.maxlength]="maxLength() ?? null"
2322
+ [value]="value()"
2323
+ (input)="onInput($event)"
2324
+ (blur)="mfBlur.emit()"
2325
+ ></textarea>
2326
+ @if (hint()) {
2327
+ <mat-hint>{{ hint() }}</mat-hint>
2328
+ }
2329
+ @if (maxLength()) {
2330
+ <mat-hint align="end">{{ currentLength() }} / {{ maxLength() }}</mat-hint>
2331
+ }
2332
+ </mat-form-field>
2333
+ `, isInline: true, styles: [":host{display:block}.mf-textarea.mat-mdc-form-field{font-family:var(--mf-font-base)!important;width:100%}.mf-textarea textarea.mat-mdc-input-element{font-family:var(--mf-font-base)!important;line-height:var(--mf-leading-normal)!important}.mf-textarea .mdc-notched-outline__leading,.mf-textarea .mdc-notched-outline__notch,.mf-textarea .mdc-notched-outline__trailing{border-color:var(--mf-color-border)!important}.mf-textarea.mat-mdc-form-field.mat-focused .mdc-notched-outline__leading,.mf-textarea.mat-mdc-form-field.mat-focused .mdc-notched-outline__notch,.mf-textarea.mat-mdc-form-field.mat-focused .mdc-notched-outline__trailing{border-color:var(--mf-color-brand)!important}.mf-textarea .mdc-notched-outline{border-radius:var(--mf-radius-md)!important}.mf-textarea--sm textarea.mat-mdc-input-element{font-size:var(--mf-text-sm)!important}.mf-textarea--md textarea.mat-mdc-input-element{font-size:var(--mf-text-base)!important}.mf-textarea--lg textarea.mat-mdc-input-element{font-size:var(--mf-text-lg)!important}.mf-textarea--resize-none textarea{resize:none}.mf-textarea--resize-vertical textarea{resize:vertical}.mf-textarea--resize-horizontal textarea{resize:horizontal}.mf-textarea--resize-both textarea{resize:both}\n"], dependencies: [{ kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "component", type: i1$3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i1$3.MatLabel, selector: "mat-label" }, { kind: "directive", type: i1$3.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "ngmodule", type: MatFormFieldModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2334
+ }
2335
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: MfTextareaComponent, decorators: [{
2336
+ type: Component,
2337
+ args: [{ selector: 'mf-textarea', imports: [MatInputModule, MatFormFieldModule], template: `
2338
+ <mat-form-field [appearance]="'outline'" [class]="hostClasses()">
2339
+ @if (label()) {
2340
+ <mat-label>{{ label() }}</mat-label>
2341
+ }
2342
+ <textarea
2343
+ matInput
2344
+ [placeholder]="placeholder()"
2345
+ [disabled]="disabled()"
2346
+ [readonly]="readonly()"
2347
+ [rows]="rows()"
2348
+ [attr.maxlength]="maxLength() ?? null"
2349
+ [value]="value()"
2350
+ (input)="onInput($event)"
2351
+ (blur)="mfBlur.emit()"
2352
+ ></textarea>
2353
+ @if (hint()) {
2354
+ <mat-hint>{{ hint() }}</mat-hint>
2355
+ }
2356
+ @if (maxLength()) {
2357
+ <mat-hint align="end">{{ currentLength() }} / {{ maxLength() }}</mat-hint>
2358
+ }
2359
+ </mat-form-field>
2360
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block}.mf-textarea.mat-mdc-form-field{font-family:var(--mf-font-base)!important;width:100%}.mf-textarea textarea.mat-mdc-input-element{font-family:var(--mf-font-base)!important;line-height:var(--mf-leading-normal)!important}.mf-textarea .mdc-notched-outline__leading,.mf-textarea .mdc-notched-outline__notch,.mf-textarea .mdc-notched-outline__trailing{border-color:var(--mf-color-border)!important}.mf-textarea.mat-mdc-form-field.mat-focused .mdc-notched-outline__leading,.mf-textarea.mat-mdc-form-field.mat-focused .mdc-notched-outline__notch,.mf-textarea.mat-mdc-form-field.mat-focused .mdc-notched-outline__trailing{border-color:var(--mf-color-brand)!important}.mf-textarea .mdc-notched-outline{border-radius:var(--mf-radius-md)!important}.mf-textarea--sm textarea.mat-mdc-input-element{font-size:var(--mf-text-sm)!important}.mf-textarea--md textarea.mat-mdc-input-element{font-size:var(--mf-text-base)!important}.mf-textarea--lg textarea.mat-mdc-input-element{font-size:var(--mf-text-lg)!important}.mf-textarea--resize-none textarea{resize:none}.mf-textarea--resize-vertical textarea{resize:vertical}.mf-textarea--resize-horizontal textarea{resize:horizontal}.mf-textarea--resize-both textarea{resize:both}\n"] }]
2361
+ }], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], rows: [{ type: i0.Input, args: [{ isSignal: true, alias: "rows", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], maxLength: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxLength", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], hint: [{ type: i0.Input, args: [{ isSignal: true, alias: "hint", required: false }] }], resize: [{ type: i0.Input, args: [{ isSignal: true, alias: "resize", required: false }] }], mfInput: [{ type: i0.Output, args: ["mfInput"] }], mfBlur: [{ type: i0.Output, args: ["mfBlur"] }] } });
2362
+
2363
+ /**
2364
+ * Toolbar de la librería ng-comps.
2365
+ * Envuelve Angular Material `mat-toolbar` y expone una API uniforme
2366
+ * con look and feel de marca. Usa content projection para acciones.
2367
+ */
2368
+ class MfToolbarComponent {
2369
+ /** Título que se muestra en la toolbar */
2370
+ title = input(undefined, ...(ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []));
2371
+ /** Variante visual */
2372
+ variant = input('surface', ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
2373
+ /** Muestra borde inferior */
2374
+ bordered = input(true, ...(ngDevMode ? [{ debugName: "bordered" }] : /* istanbul ignore next */ []));
2375
+ /** Toolbar fija en la parte superior */
2376
+ sticky = input(false, ...(ngDevMode ? [{ debugName: "sticky" }] : /* istanbul ignore next */ []));
2377
+ /** Elevación sutil */
2378
+ elevated = input(false, ...(ngDevMode ? [{ debugName: "elevated" }] : /* istanbul ignore next */ []));
2379
+ hostClasses = computed(() => {
2380
+ const classes = ['mf-toolbar', `mf-toolbar--${this.variant()}`];
2381
+ if (this.bordered())
2382
+ classes.push('mf-toolbar--bordered');
2383
+ if (this.sticky())
2384
+ classes.push('mf-toolbar--sticky');
2385
+ if (this.elevated())
2386
+ classes.push('mf-toolbar--elevated');
2387
+ return classes.join(' ');
2388
+ }, ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
2389
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: MfToolbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2390
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.4", type: MfToolbarComponent, isStandalone: true, selector: "mf-toolbar", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, bordered: { classPropertyName: "bordered", publicName: "bordered", isSignal: true, isRequired: false, transformFunction: null }, sticky: { classPropertyName: "sticky", publicName: "sticky", isSignal: true, isRequired: false, transformFunction: null }, elevated: { classPropertyName: "elevated", publicName: "elevated", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
2391
+ <mat-toolbar [class]="hostClasses()">
2392
+ <div class="mf-toolbar__start">
2393
+ @if (title()) {
2394
+ <span class="mf-toolbar__title">{{ title() }}</span>
2395
+ }
2396
+ <ng-content select="[mfToolbarStart]" />
2397
+ </div>
2398
+ <div class="mf-toolbar__spacer"></div>
2399
+ <div class="mf-toolbar__end">
2400
+ <ng-content select="[mfToolbarEnd]" />
2401
+ <ng-content />
2402
+ </div>
2403
+ </mat-toolbar>
2404
+ `, isInline: true, styles: [":host{display:block}.mf-toolbar.mat-toolbar{font-family:var(--mf-font-base)!important;padding:0 var(--mf-space-6)!important;min-height:56px!important;display:flex!important;align-items:center!important;transition:background-color var(--mf-duration-base) var(--mf-ease-standard),box-shadow var(--mf-duration-base) var(--mf-ease-standard)}.mf-toolbar--surface.mat-toolbar{background-color:var(--mf-color-surface)!important;color:var(--mf-color-on-surface)!important}.mf-toolbar--brand.mat-toolbar{background-color:var(--mf-color-brand)!important;color:var(--mf-color-on-brand)!important}.mf-toolbar--transparent.mat-toolbar{background-color:transparent!important;color:var(--mf-color-on-surface)!important}.mf-toolbar--bordered.mat-toolbar{border-bottom:1px solid var(--mf-color-border)}.mf-toolbar--brand.mf-toolbar--bordered.mat-toolbar{border-bottom-color:#ffffff26}.mf-toolbar--sticky.mat-toolbar{position:sticky;top:0;z-index:1000}.mf-toolbar--elevated.mat-toolbar{box-shadow:var(--mf-shadow-sm)!important}.mf-toolbar__start{display:flex;align-items:center;gap:var(--mf-space-3)}.mf-toolbar__spacer{flex:1}.mf-toolbar__end{display:flex;align-items:center;gap:var(--mf-space-2)}.mf-toolbar__title{font-family:var(--mf-font-display)!important;font-size:var(--mf-text-lg)!important;font-weight:var(--mf-weight-bold)!important;letter-spacing:-.01em}\n"], dependencies: [{ kind: "ngmodule", type: MatToolbarModule }, { kind: "component", type: i1$l.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2405
+ }
2406
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: MfToolbarComponent, decorators: [{
2407
+ type: Component,
2408
+ args: [{ selector: 'mf-toolbar', imports: [MatToolbarModule], template: `
2409
+ <mat-toolbar [class]="hostClasses()">
2410
+ <div class="mf-toolbar__start">
2411
+ @if (title()) {
2412
+ <span class="mf-toolbar__title">{{ title() }}</span>
2413
+ }
2414
+ <ng-content select="[mfToolbarStart]" />
2415
+ </div>
2416
+ <div class="mf-toolbar__spacer"></div>
2417
+ <div class="mf-toolbar__end">
2418
+ <ng-content select="[mfToolbarEnd]" />
2419
+ <ng-content />
2420
+ </div>
2421
+ </mat-toolbar>
2422
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block}.mf-toolbar.mat-toolbar{font-family:var(--mf-font-base)!important;padding:0 var(--mf-space-6)!important;min-height:56px!important;display:flex!important;align-items:center!important;transition:background-color var(--mf-duration-base) var(--mf-ease-standard),box-shadow var(--mf-duration-base) var(--mf-ease-standard)}.mf-toolbar--surface.mat-toolbar{background-color:var(--mf-color-surface)!important;color:var(--mf-color-on-surface)!important}.mf-toolbar--brand.mat-toolbar{background-color:var(--mf-color-brand)!important;color:var(--mf-color-on-brand)!important}.mf-toolbar--transparent.mat-toolbar{background-color:transparent!important;color:var(--mf-color-on-surface)!important}.mf-toolbar--bordered.mat-toolbar{border-bottom:1px solid var(--mf-color-border)}.mf-toolbar--brand.mf-toolbar--bordered.mat-toolbar{border-bottom-color:#ffffff26}.mf-toolbar--sticky.mat-toolbar{position:sticky;top:0;z-index:1000}.mf-toolbar--elevated.mat-toolbar{box-shadow:var(--mf-shadow-sm)!important}.mf-toolbar__start{display:flex;align-items:center;gap:var(--mf-space-3)}.mf-toolbar__spacer{flex:1}.mf-toolbar__end{display:flex;align-items:center;gap:var(--mf-space-2)}.mf-toolbar__title{font-family:var(--mf-font-display)!important;font-size:var(--mf-text-lg)!important;font-weight:var(--mf-weight-bold)!important;letter-spacing:-.01em}\n"] }]
2423
+ }], propDecorators: { title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], bordered: [{ type: i0.Input, args: [{ isSignal: true, alias: "bordered", required: false }] }], sticky: [{ type: i0.Input, args: [{ isSignal: true, alias: "sticky", required: false }] }], elevated: [{ type: i0.Input, args: [{ isSignal: true, alias: "elevated", required: false }] }] } });
2424
+
2425
+ /**
2426
+ * Tooltip de la librería ng-comps.
2427
+ * Envuelve Angular Material `matTooltip` y expone una API uniforme
2428
+ * con look and feel de marca.
2429
+ */
2430
+ class MfTooltipComponent {
2431
+ /** Texto del tooltip */
2432
+ text = input.required(...(ngDevMode ? [{ debugName: "text" }] : /* istanbul ignore next */ []));
2433
+ /** Posición del tooltip */
2434
+ position = input('above', ...(ngDevMode ? [{ debugName: "position" }] : /* istanbul ignore next */ []));
2435
+ /** Deshabilitado */
2436
+ disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
2437
+ /** Delay para mostrar (ms) */
2438
+ showDelay = input(200, ...(ngDevMode ? [{ debugName: "showDelay" }] : /* istanbul ignore next */ []));
2439
+ /** Delay para ocultar (ms) */
2440
+ hideDelay = input(0, ...(ngDevMode ? [{ debugName: "hideDelay" }] : /* istanbul ignore next */ []));
2441
+ hostClasses = computed(() => {
2442
+ return ['mf-tooltip', `mf-tooltip--${this.position()}`].join(' ');
2443
+ }, ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
2444
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: MfTooltipComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2445
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.4", type: MfTooltipComponent, isStandalone: true, selector: "mf-tooltip", inputs: { text: { classPropertyName: "text", publicName: "text", isSignal: true, isRequired: true, transformFunction: null }, position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, showDelay: { classPropertyName: "showDelay", publicName: "showDelay", isSignal: true, isRequired: false, transformFunction: null }, hideDelay: { classPropertyName: "hideDelay", publicName: "hideDelay", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
2446
+ <span
2447
+ [matTooltip]="text()"
2448
+ [matTooltipPosition]="position()"
2449
+ [matTooltipDisabled]="disabled()"
2450
+ [matTooltipShowDelay]="showDelay()"
2451
+ [matTooltipHideDelay]="hideDelay()"
2452
+ [class]="hostClasses()"
2453
+ >
2454
+ <ng-content />
2455
+ </span>
2456
+ `, isInline: true, styles: [":host{display:inline-block}.mf-tooltip{cursor:default}\n"], dependencies: [{ kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i1$m.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2457
+ }
2458
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: MfTooltipComponent, decorators: [{
2459
+ type: Component,
2460
+ args: [{ selector: 'mf-tooltip', imports: [MatTooltipModule], template: `
2461
+ <span
2462
+ [matTooltip]="text()"
2463
+ [matTooltipPosition]="position()"
2464
+ [matTooltipDisabled]="disabled()"
2465
+ [matTooltipShowDelay]="showDelay()"
2466
+ [matTooltipHideDelay]="hideDelay()"
2467
+ [class]="hostClasses()"
2468
+ >
2469
+ <ng-content />
2470
+ </span>
2471
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:inline-block}.mf-tooltip{cursor:default}\n"] }]
2472
+ }], propDecorators: { text: [{ type: i0.Input, args: [{ isSignal: true, alias: "text", required: true }] }], position: [{ type: i0.Input, args: [{ isSignal: true, alias: "position", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], showDelay: [{ type: i0.Input, args: [{ isSignal: true, alias: "showDelay", required: false }] }], hideDelay: [{ type: i0.Input, args: [{ isSignal: true, alias: "hideDelay", required: false }] }] } });
2473
+
2474
+ /**
2475
+ * Generated bundle index. Do not edit.
2476
+ */
2477
+
2478
+ export { MfAccordionComponent, MfAlertComponent, MfAutocompleteComponent, MfAvatarComponent, MfBadgeComponent, MfBreadcrumbComponent, MfButtonComponent, MfCardComponent, MfCheckboxComponent, MfChipComponent, MfDatepickerComponent, MfDialogComponent, MfDividerComponent, MfFormFieldComponent, MfGridListComponent, MfIconComponent, MfInputComponent, MfMenuComponent, MfPaginatorComponent, MfProgressBarComponent, MfProgressSpinnerComponent, MfRadioButtonComponent, MfSelectComponent, MfSidenavComponent, MfSlideToggleComponent, MfSnackbarService, MfTableComponent, MfTabsComponent, MfTextareaComponent, MfToolbarComponent, MfTooltipComponent };
2479
+ //# sourceMappingURL=ng-comps.mjs.map