@neural-ui/core 1.0.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.
- package/README.md +203 -0
- package/fesm2022/neural-ui-core.mjs +8517 -0
- package/fesm2022/neural-ui-core.mjs.map +1 -0
- package/package.json +52 -0
- package/styles/_breakpoints.scss +64 -0
- package/styles/_tokens.scss +210 -0
- package/styles/index.scss +43 -0
- package/types/neural-ui-core.d.ts +2100 -0
|
@@ -0,0 +1,2100 @@
|
|
|
1
|
+
import * as _angular_core from '@angular/core';
|
|
2
|
+
import { EnvironmentProviders, Signal, TemplateRef, InjectionToken, AfterViewInit, OnDestroy, Type } from '@angular/core';
|
|
3
|
+
import { Params } from '@angular/router';
|
|
4
|
+
import { ControlValueAccessor } from '@angular/forms';
|
|
5
|
+
import * as _neural_ui_core from '@neural-ui/core';
|
|
6
|
+
import { SafeHtml } from '@angular/platform-browser';
|
|
7
|
+
import { DialogRef } from '@angular/cdk/dialog';
|
|
8
|
+
|
|
9
|
+
interface NeuralUIConfig {
|
|
10
|
+
/** Tamaño por defecto de los iconos. Por defecto: '1.25rem' */
|
|
11
|
+
iconSize?: string;
|
|
12
|
+
/** Grosor de trazo de los iconos. Por defecto: '2' */
|
|
13
|
+
iconStrokeWidth?: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Registra los providers necesarios para NeuralUI.
|
|
17
|
+
*
|
|
18
|
+
* Incluye los iconos internos de la librería y la configuración
|
|
19
|
+
* por defecto de @ng-icons.
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* // app.config.ts
|
|
23
|
+
* export const appConfig: ApplicationConfig = {
|
|
24
|
+
* providers: [
|
|
25
|
+
* provideNeuralUI(),
|
|
26
|
+
* ],
|
|
27
|
+
* };
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* // Con opciones personalizadas
|
|
31
|
+
* provideNeuralUI({ iconSize: '1rem', iconStrokeWidth: '1.5' })
|
|
32
|
+
*/
|
|
33
|
+
declare function provideNeuralUI(config?: NeuralUIConfig): EnvironmentProviders;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* NeuUrlStateService — El Sistema Nervioso de NeuralUI
|
|
37
|
+
*
|
|
38
|
+
* Sincroniza el estado de la UI con los QueryParams de la URL.
|
|
39
|
+
* Completamente reactivo via Angular Signals.
|
|
40
|
+
*
|
|
41
|
+
* Uso:
|
|
42
|
+
* const urlState = inject(NeuUrlStateService);
|
|
43
|
+
* const page = urlState.getParam('page'); // Signal<string | null>
|
|
44
|
+
* urlState.setParam('menu', 'open'); // Actualiza ?menu=open
|
|
45
|
+
* urlState.patchParams({ page: '2', q: 'filter' }); // Actualiza múltiples
|
|
46
|
+
*/
|
|
47
|
+
declare class NeuUrlStateService {
|
|
48
|
+
private readonly router;
|
|
49
|
+
/**
|
|
50
|
+
* Signal con el mapa completo de queryParams actual.
|
|
51
|
+
* Se actualiza automáticamente en cada NavigationEnd.
|
|
52
|
+
*/
|
|
53
|
+
readonly params: Signal<Params>;
|
|
54
|
+
/**
|
|
55
|
+
* Devuelve un Signal reactivo con el valor del parámetro indicado.
|
|
56
|
+
* Memorizar el resultado: no llamar en bucle pues crea un computed nuevo c/vez.
|
|
57
|
+
*
|
|
58
|
+
* @example
|
|
59
|
+
* readonly menuOpen = computed(() => this.urlState.getParam('menu')() === 'open');
|
|
60
|
+
*/
|
|
61
|
+
getParam(key: string): Signal<string | null>;
|
|
62
|
+
/**
|
|
63
|
+
* Establece un único queryParam en la URL.
|
|
64
|
+
*
|
|
65
|
+
* @param key Nombre del parámetro
|
|
66
|
+
* @param value Valor. Pasar `null` para eliminarlo de la URL.
|
|
67
|
+
* @param replaceUrl Si true (default) usa replaceState — no ensucia el historial.
|
|
68
|
+
* Pasar false para acciones que el usuario debe poder deshacer con Atrás.
|
|
69
|
+
*/
|
|
70
|
+
setParam(key: string, value: string | null, replaceUrl?: boolean): void;
|
|
71
|
+
/**
|
|
72
|
+
* Actualiza múltiples queryParams en una sola navegación.
|
|
73
|
+
*
|
|
74
|
+
* @example
|
|
75
|
+
* urlState.patchParams({ page: '1', q: 'Angular' });
|
|
76
|
+
*/
|
|
77
|
+
patchParams(params: Record<string, string | null>, replaceUrl?: boolean): void;
|
|
78
|
+
/**
|
|
79
|
+
* Elimina todos los queryParams de la URL de una vez.
|
|
80
|
+
*/
|
|
81
|
+
clearParams(replaceUrl?: boolean): void;
|
|
82
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuUrlStateService, never>;
|
|
83
|
+
static ɵprov: _angular_core.ɵɵInjectableDeclaration<NeuUrlStateService>;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
type NeuToastType = 'success' | 'error' | 'info' | 'warning';
|
|
87
|
+
type NeuToastPosition = 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left';
|
|
88
|
+
interface NeuToastOptions {
|
|
89
|
+
/** Mensaje del toast */
|
|
90
|
+
message: string;
|
|
91
|
+
/** Tipo semántico — controla color e icono */
|
|
92
|
+
type?: NeuToastType;
|
|
93
|
+
/** Duración en ms antes de ocultarse automáticamente. 0 = sin auto-hide */
|
|
94
|
+
duration?: number;
|
|
95
|
+
/** Título opcional */
|
|
96
|
+
title?: string;
|
|
97
|
+
}
|
|
98
|
+
interface NeuToastItem extends Required<Omit<NeuToastOptions, 'title'>> {
|
|
99
|
+
id: string;
|
|
100
|
+
title: string;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* NeuralUI Toast Service
|
|
105
|
+
*
|
|
106
|
+
* Lanza notificaciones flotantes desde cualquier punto de la app.
|
|
107
|
+
* Requiere que `<neu-toast-container>` esté presente en la raíz del app.
|
|
108
|
+
*
|
|
109
|
+
* Uso:
|
|
110
|
+
* const toast = inject(NeuToastService);
|
|
111
|
+
* toast.success('Guardado correctamente');
|
|
112
|
+
* toast.error('Ha ocurrido un error', { title: 'Error', duration: 8000 });
|
|
113
|
+
*/
|
|
114
|
+
declare class NeuToastService {
|
|
115
|
+
/** Lista reactiva de toasts activos */
|
|
116
|
+
readonly toasts: _angular_core.WritableSignal<NeuToastItem[]>;
|
|
117
|
+
/** Posición del contenedor de toasts */
|
|
118
|
+
readonly position: _angular_core.WritableSignal<NeuToastPosition>;
|
|
119
|
+
setPosition(position: NeuToastPosition): void;
|
|
120
|
+
show(options: NeuToastOptions): string;
|
|
121
|
+
success(message: string, opts?: Partial<NeuToastOptions>): string;
|
|
122
|
+
error(message: string, opts?: Partial<NeuToastOptions>): string;
|
|
123
|
+
info(message: string, opts?: Partial<NeuToastOptions>): string;
|
|
124
|
+
warning(message: string, opts?: Partial<NeuToastOptions>): string;
|
|
125
|
+
dismiss(id: string): void;
|
|
126
|
+
clear(): void;
|
|
127
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuToastService, never>;
|
|
128
|
+
static ɵprov: _angular_core.ɵɵInjectableDeclaration<NeuToastService>;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* NeuralUI Checkbox Component
|
|
133
|
+
*
|
|
134
|
+
* Checkbox personalizado y accesible para Angular Forms.
|
|
135
|
+
*
|
|
136
|
+
* Uso:
|
|
137
|
+
* <neu-checkbox label="Acepto los términos" [formControl]="termsCtrl" />
|
|
138
|
+
*/
|
|
139
|
+
declare class NeuCheckboxComponent implements ControlValueAccessor {
|
|
140
|
+
readonly label: _angular_core.InputSignal<string>;
|
|
141
|
+
readonly name: _angular_core.InputSignal<string>;
|
|
142
|
+
readonly disabled: _angular_core.InputSignal<boolean>;
|
|
143
|
+
readonly _id: string;
|
|
144
|
+
protected readonly _checked: _angular_core.WritableSignal<boolean>;
|
|
145
|
+
/** Estado disabled interno — combina el input `disabled` con el CVA setDisabledState */
|
|
146
|
+
private readonly _cvaDisabled;
|
|
147
|
+
protected readonly _isDisabled: _angular_core.Signal<boolean>;
|
|
148
|
+
private _onChange;
|
|
149
|
+
private _onTouched;
|
|
150
|
+
onChange(event: Event): void;
|
|
151
|
+
onBlur(): void;
|
|
152
|
+
writeValue(val: unknown): void;
|
|
153
|
+
registerOnChange(fn: (v: boolean) => void): void;
|
|
154
|
+
registerOnTouched(fn: () => void): void;
|
|
155
|
+
setDisabledState(isDisabled: boolean): void;
|
|
156
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuCheckboxComponent, never>;
|
|
157
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<NeuCheckboxComponent, "neu-checkbox", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
interface CalendarDay {
|
|
161
|
+
date: Date;
|
|
162
|
+
inMonth: boolean;
|
|
163
|
+
isToday: boolean;
|
|
164
|
+
isSelected: boolean;
|
|
165
|
+
}
|
|
166
|
+
interface DrumSlot {
|
|
167
|
+
value: number;
|
|
168
|
+
offset: number;
|
|
169
|
+
label: string;
|
|
170
|
+
}
|
|
171
|
+
declare class NeuDateInputComponent implements ControlValueAccessor {
|
|
172
|
+
private readonly el;
|
|
173
|
+
/** Tipo: date | time | datetime-local */
|
|
174
|
+
type: _angular_core.InputSignal<"date" | "time" | "datetime-local">;
|
|
175
|
+
/** Etiqueta del campo */
|
|
176
|
+
label: _angular_core.InputSignal<string>;
|
|
177
|
+
/** Texto de ayuda */
|
|
178
|
+
hint: _angular_core.InputSignal<string>;
|
|
179
|
+
/** Mensaje de error */
|
|
180
|
+
errorMessage: _angular_core.InputSignal<string>;
|
|
181
|
+
/** Deshabilita el campo */
|
|
182
|
+
disabled: _angular_core.InputSignal<boolean>;
|
|
183
|
+
/** Solo lectura */
|
|
184
|
+
readonly: _angular_core.InputSignal<boolean>;
|
|
185
|
+
/** Nombre del campo (formularios nativos) */
|
|
186
|
+
name: _angular_core.InputSignal<string>;
|
|
187
|
+
/** ID accesible */
|
|
188
|
+
inputId: _angular_core.InputSignal<string>;
|
|
189
|
+
/** Requerido */
|
|
190
|
+
required: _angular_core.InputSignal<boolean>;
|
|
191
|
+
/** Mínimo (no implementado visualmente en v1) */
|
|
192
|
+
min: _angular_core.InputSignal<string | null>;
|
|
193
|
+
/** Máximo (no implementado visualmente en v1) */
|
|
194
|
+
max: _angular_core.InputSignal<string | null>;
|
|
195
|
+
/** Paso */
|
|
196
|
+
step: _angular_core.InputSignal<number | null>;
|
|
197
|
+
protected readonly _id: string;
|
|
198
|
+
readonly isOpen: _angular_core.WritableSignal<boolean>;
|
|
199
|
+
protected readonly _value: _angular_core.WritableSignal<string>;
|
|
200
|
+
protected readonly _viewYear: _angular_core.WritableSignal<number>;
|
|
201
|
+
protected readonly _viewMonth: _angular_core.WritableSignal<number>;
|
|
202
|
+
protected readonly _selYear: _angular_core.WritableSignal<number | null>;
|
|
203
|
+
protected readonly _selMonth: _angular_core.WritableSignal<number | null>;
|
|
204
|
+
protected readonly _selDay: _angular_core.WritableSignal<number | null>;
|
|
205
|
+
protected readonly _selHour: _angular_core.WritableSignal<number>;
|
|
206
|
+
protected readonly _selMinute: _angular_core.WritableSignal<number>;
|
|
207
|
+
readonly hasError: _angular_core.Signal<boolean>;
|
|
208
|
+
readonly displayValue: _angular_core.Signal<string>;
|
|
209
|
+
readonly placeholderText: _angular_core.Signal<"hh:mm" | "dd/mm/aaaa, hh:mm" | "dd/mm/aaaa">;
|
|
210
|
+
readonly monthLabel: _angular_core.Signal<string>;
|
|
211
|
+
readonly weekdays: string[];
|
|
212
|
+
readonly calendarDays: _angular_core.Signal<CalendarDay[]>;
|
|
213
|
+
readonly hourSlots: _angular_core.Signal<DrumSlot[]>;
|
|
214
|
+
readonly minuteSlots: _angular_core.Signal<DrumSlot[]>;
|
|
215
|
+
private _drumSlots;
|
|
216
|
+
toggle(): void;
|
|
217
|
+
close(): void;
|
|
218
|
+
onDocumentClick(event: MouseEvent): void;
|
|
219
|
+
prevMonth(): void;
|
|
220
|
+
nextMonth(): void;
|
|
221
|
+
selectDay(day: CalendarDay): void;
|
|
222
|
+
formatDayLabel(date: Date): string;
|
|
223
|
+
today(): void;
|
|
224
|
+
clear(): void;
|
|
225
|
+
changeHour(delta: number): void;
|
|
226
|
+
changeMinute(delta: number): void;
|
|
227
|
+
onHourWheel(e: WheelEvent): void;
|
|
228
|
+
onMinuteWheel(e: WheelEvent): void;
|
|
229
|
+
private _emitValue;
|
|
230
|
+
private _onChange;
|
|
231
|
+
private _onTouched;
|
|
232
|
+
writeValue(value: string | null): void;
|
|
233
|
+
registerOnChange(fn: (v: string) => void): void;
|
|
234
|
+
registerOnTouched(fn: () => void): void;
|
|
235
|
+
private readonly _cvaDisabled;
|
|
236
|
+
setDisabledState(isDisabled: boolean): void;
|
|
237
|
+
readonly isDisabledFinal: _angular_core.Signal<boolean>;
|
|
238
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuDateInputComponent, never>;
|
|
239
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<NeuDateInputComponent, "neu-date-input", never, { "type": { "alias": "type"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "errorMessage": { "alias": "errorMessage"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "inputId": { "alias": "inputId"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
type NeuInputType = 'text' | 'email' | 'password' | 'number' | 'tel' | 'url' | 'search';
|
|
243
|
+
/**
|
|
244
|
+
* NeuralUI Input Component
|
|
245
|
+
*
|
|
246
|
+
* Input con floating label, iconos y soporte completo para Angular Forms.
|
|
247
|
+
* Compatible con ReactiveFormsModule y ngModel.
|
|
248
|
+
*
|
|
249
|
+
* Uso standalone:
|
|
250
|
+
* <neu-input label="Correo" type="email" />
|
|
251
|
+
*
|
|
252
|
+
* Con Reactive Forms:
|
|
253
|
+
* <neu-input label="Correo" [formControl]="emailCtrl" [errorMessage]="emailError()" />
|
|
254
|
+
*/
|
|
255
|
+
declare class NeuInputComponent implements ControlValueAccessor {
|
|
256
|
+
/** Tipo de input HTML */
|
|
257
|
+
type: _angular_core.InputSignal<NeuInputType>;
|
|
258
|
+
/** Texto del floating label */
|
|
259
|
+
label: _angular_core.InputSignal<string>;
|
|
260
|
+
/** Placeholder visible cuando floatingLabel=false */
|
|
261
|
+
placeholder: _angular_core.InputSignal<string>;
|
|
262
|
+
/** Muestra el label como flotante (true) o estático encima del campo (false) */
|
|
263
|
+
floatingLabel: _angular_core.InputSignal<boolean>;
|
|
264
|
+
/** Hint de ayuda (visible cuando no hay error) */
|
|
265
|
+
hint: _angular_core.InputSignal<string>;
|
|
266
|
+
/** Mensaje de error (activa el estado de error) */
|
|
267
|
+
errorMessage: _angular_core.InputSignal<string>;
|
|
268
|
+
/** Deshabilita el campo */
|
|
269
|
+
disabled: _angular_core.InputSignal<boolean>;
|
|
270
|
+
/** Atributo autocomplete HTML */
|
|
271
|
+
autocomplete: _angular_core.InputSignal<string>;
|
|
272
|
+
/** Muestra zona para icono al inicio */
|
|
273
|
+
startIcon: _angular_core.InputSignal<boolean>;
|
|
274
|
+
/** Muestra zona para icono al final */
|
|
275
|
+
endIcon: _angular_core.InputSignal<boolean>;
|
|
276
|
+
/** Nombre del icono lucide a renderizar dentro del campo */
|
|
277
|
+
icon: _angular_core.InputSignal<string>;
|
|
278
|
+
/** Posición del icono cuando se usa `icon` */
|
|
279
|
+
iconPosition: _angular_core.InputSignal<"left" | "right">;
|
|
280
|
+
/** ID accesible para el input — generado con contador estable (seguro en SSR) */
|
|
281
|
+
inputId: _angular_core.InputSignal<string>;
|
|
282
|
+
/** Nombre del campo para formularios nativos */
|
|
283
|
+
name: _angular_core.InputSignal<string>;
|
|
284
|
+
/** Marca el campo como requerido */
|
|
285
|
+
required: _angular_core.InputSignal<boolean>;
|
|
286
|
+
/** Hace el campo de solo lectura */
|
|
287
|
+
readonly: _angular_core.InputSignal<boolean>;
|
|
288
|
+
/** Longitud máxima de caracteres */
|
|
289
|
+
maxlength: _angular_core.InputSignal<number | null>;
|
|
290
|
+
/** Longitud mínima de caracteres */
|
|
291
|
+
minlength: _angular_core.InputSignal<number | null>;
|
|
292
|
+
/** Valor mínimo (para type=number/date) */
|
|
293
|
+
min: _angular_core.InputSignal<string | null>;
|
|
294
|
+
/** Valor máximo (para type=number/date) */
|
|
295
|
+
max: _angular_core.InputSignal<string | null>;
|
|
296
|
+
/** Patrón de validación HTML5 */
|
|
297
|
+
pattern: _angular_core.InputSignal<string | null>;
|
|
298
|
+
protected readonly _value: _angular_core.WritableSignal<string>;
|
|
299
|
+
protected readonly _focused: _angular_core.WritableSignal<boolean>;
|
|
300
|
+
readonly hasValue: _angular_core.Signal<boolean>;
|
|
301
|
+
readonly hasError: _angular_core.Signal<boolean>;
|
|
302
|
+
readonly startIconPath: _angular_core.Signal<string>;
|
|
303
|
+
readonly hasStartContent: _angular_core.Signal<boolean>;
|
|
304
|
+
readonly _hasIconLeft: _angular_core.Signal<boolean>;
|
|
305
|
+
readonly _hasIconRight: _angular_core.Signal<boolean>;
|
|
306
|
+
private _onChange;
|
|
307
|
+
private _onTouched;
|
|
308
|
+
writeValue(val: unknown): void;
|
|
309
|
+
registerOnChange(fn: (v: string) => void): void;
|
|
310
|
+
registerOnTouched(fn: () => void): void;
|
|
311
|
+
private readonly _cvaDisabled;
|
|
312
|
+
setDisabledState(isDisabled: boolean): void;
|
|
313
|
+
readonly isDisabledFinal: _angular_core.Signal<boolean>;
|
|
314
|
+
onInput(event: Event): void;
|
|
315
|
+
onFocus(): void;
|
|
316
|
+
onBlur(): void;
|
|
317
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuInputComponent, never>;
|
|
318
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<NeuInputComponent, "neu-input", never, { "type": { "alias": "type"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "floatingLabel": { "alias": "floatingLabel"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "errorMessage": { "alias": "errorMessage"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "autocomplete": { "alias": "autocomplete"; "required": false; "isSignal": true; }; "startIcon": { "alias": "startIcon"; "required": false; "isSignal": true; }; "endIcon": { "alias": "endIcon"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "iconPosition": { "alias": "iconPosition"; "required": false; "isSignal": true; }; "inputId": { "alias": "inputId"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "maxlength": { "alias": "maxlength"; "required": false; "isSignal": true; }; "minlength": { "alias": "minlength"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "pattern": { "alias": "pattern"; "required": false; "isSignal": true; }; }, {}, never, ["[neu-input-start]", "[neu-input-end]"], true, never>;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
interface NeuSelectOption {
|
|
322
|
+
value: string;
|
|
323
|
+
label: string;
|
|
324
|
+
disabled?: boolean;
|
|
325
|
+
group?: string;
|
|
326
|
+
}
|
|
327
|
+
interface NeuSelectGroup {
|
|
328
|
+
label: string;
|
|
329
|
+
options: NeuSelectOption[];
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
/**
|
|
333
|
+
* Directiva para personalizar el template de cada ítem del dropdown de Multiselect.
|
|
334
|
+
*
|
|
335
|
+
* Uso:
|
|
336
|
+
* ```html
|
|
337
|
+
* <neu-multiselect [options]="opts" [(ngModel)]="values">
|
|
338
|
+
* <ng-template neuMultiselectItem let-item>
|
|
339
|
+
* <span class="flag flag-{{ item.value }}"></span>
|
|
340
|
+
* {{ item.label }}
|
|
341
|
+
* </ng-template>
|
|
342
|
+
* </neu-multiselect>
|
|
343
|
+
* ```
|
|
344
|
+
*/
|
|
345
|
+
declare class NeuMultiselectItemDirective {
|
|
346
|
+
readonly templateRef: TemplateRef<{
|
|
347
|
+
$implicit: NeuSelectOption;
|
|
348
|
+
}>;
|
|
349
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuMultiselectItemDirective, never>;
|
|
350
|
+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<NeuMultiselectItemDirective, "[neuMultiselectItem]", never, {}, {}, never, never, true, never>;
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
/**
|
|
354
|
+
* NeuralUI Multiselect Component
|
|
355
|
+
*
|
|
356
|
+
* Dropdown de selección múltiple con chips, búsqueda integrada y soporte
|
|
357
|
+
* completo para Angular Forms (ngModel y Reactive Forms).
|
|
358
|
+
*
|
|
359
|
+
* Uso:
|
|
360
|
+
* <neu-multiselect label="Tecnologías" [options]="opts" [(ngModel)]="selected" />
|
|
361
|
+
*/
|
|
362
|
+
declare class NeuMultiselectComponent implements ControlValueAccessor {
|
|
363
|
+
private readonly elementRef;
|
|
364
|
+
/** @internal */
|
|
365
|
+
readonly _triggerId: string;
|
|
366
|
+
/** Template personalizado para cada opción del dropdown */
|
|
367
|
+
readonly itemTpl: _angular_core.Signal<NeuMultiselectItemDirective | undefined>;
|
|
368
|
+
/** Opciones del dropdown */
|
|
369
|
+
options: _angular_core.InputSignal<NeuSelectOption[]>;
|
|
370
|
+
/** Etiqueta del componente */
|
|
371
|
+
label: _angular_core.InputSignal<string>;
|
|
372
|
+
/** Placeholder cuando no hay selección */
|
|
373
|
+
placeholder: _angular_core.InputSignal<string>;
|
|
374
|
+
/** Mensaje de error */
|
|
375
|
+
errorMessage: _angular_core.InputSignal<string>;
|
|
376
|
+
/** Deshabilita el componente */
|
|
377
|
+
disabled: _angular_core.InputSignal<boolean>;
|
|
378
|
+
/** Activa input de búsqueda/filtro en el panel */
|
|
379
|
+
searchable: _angular_core.InputSignal<boolean>;
|
|
380
|
+
/** Placeholder del input de búsqueda */
|
|
381
|
+
searchPlaceholder: _angular_core.InputSignal<string>;
|
|
382
|
+
/** Texto cuando no hay opciones tras filtrar */
|
|
383
|
+
noResultsMessage: _angular_core.InputSignal<string>;
|
|
384
|
+
/** Texto del botón de limpiar todas las selecciones */
|
|
385
|
+
clearAllLabel: _angular_core.InputSignal<string>;
|
|
386
|
+
/** Muestra un botón × en el trigger para limpiar la selección de una vez */
|
|
387
|
+
clearable: _angular_core.InputSignal<boolean>;
|
|
388
|
+
/** Aria-label del botón clear que aparece en el trigger */
|
|
389
|
+
clearAriaLabel: _angular_core.InputSignal<string>;
|
|
390
|
+
protected readonly _values: _angular_core.WritableSignal<string[]>;
|
|
391
|
+
readonly isOpen: _angular_core.WritableSignal<boolean>;
|
|
392
|
+
readonly searchQuery: _angular_core.WritableSignal<string>;
|
|
393
|
+
readonly _chipMode: _angular_core.WritableSignal<"chips" | "count">;
|
|
394
|
+
readonly _visibleChips: _angular_core.Signal<string[]>;
|
|
395
|
+
readonly hasError: _angular_core.Signal<boolean>;
|
|
396
|
+
readonly filteredOptions: _angular_core.Signal<NeuSelectOption[]>;
|
|
397
|
+
private _onChange;
|
|
398
|
+
private _onTouched;
|
|
399
|
+
writeValue(value: string[] | null): void;
|
|
400
|
+
registerOnChange(fn: (v: string[]) => void): void;
|
|
401
|
+
registerOnTouched(fn: () => void): void;
|
|
402
|
+
private readonly _cvaDisabled;
|
|
403
|
+
setDisabledState(isDisabled: boolean): void;
|
|
404
|
+
readonly isDisabledFinal: _angular_core.Signal<boolean>;
|
|
405
|
+
protected labelFor(value: string): string;
|
|
406
|
+
protected isSelected(value: string): boolean;
|
|
407
|
+
protected toggle(): void;
|
|
408
|
+
/** Abre el panel y mueve el foco al primer item */
|
|
409
|
+
onTriggerKey(event: Event): void;
|
|
410
|
+
/** Navega entre opciones con flechas */
|
|
411
|
+
focusOptionByIndex(event: Event, current: NeuSelectOption, dir: 1 | -1): void;
|
|
412
|
+
protected close(): void;
|
|
413
|
+
protected toggleOption(option: NeuSelectOption): void;
|
|
414
|
+
protected removeValue(value: string, event: MouseEvent): void;
|
|
415
|
+
protected clearAll(event: MouseEvent): void;
|
|
416
|
+
protected toggleChipMode(event: MouseEvent): void;
|
|
417
|
+
protected onDocumentClick(event: MouseEvent): void;
|
|
418
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuMultiselectComponent, never>;
|
|
419
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<NeuMultiselectComponent, "neu-multiselect", never, { "options": { "alias": "options"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "errorMessage": { "alias": "errorMessage"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "searchable": { "alias": "searchable"; "required": false; "isSignal": true; }; "searchPlaceholder": { "alias": "searchPlaceholder"; "required": false; "isSignal": true; }; "noResultsMessage": { "alias": "noResultsMessage"; "required": false; "isSignal": true; }; "clearAllLabel": { "alias": "clearAllLabel"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "clearAriaLabel": { "alias": "clearAriaLabel"; "required": false; "isSignal": true; }; }, {}, ["itemTpl"], never, true, never>;
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
/** Token para que neu-radio encuentre a su grupo padre */
|
|
423
|
+
declare const NEU_RADIO_GROUP: InjectionToken<NeuRadioGroupComponent>;
|
|
424
|
+
declare class NeuRadioGroupComponent implements ControlValueAccessor {
|
|
425
|
+
readonly direction: _angular_core.InputSignal<"row" | "column">;
|
|
426
|
+
/** Etiqueta accesible del grupo (WCAG 4.1.2). Usar cuando no hay <legend> visible. */
|
|
427
|
+
readonly ariaLabel: _angular_core.InputSignal<string>;
|
|
428
|
+
/** Nombre HTML compartido por todos los neu-radio hijos — garantiza la exclusión mutua nativa */
|
|
429
|
+
readonly _name: string;
|
|
430
|
+
readonly _value: _angular_core.WritableSignal<unknown>;
|
|
431
|
+
readonly _isDisabled: _angular_core.WritableSignal<boolean>;
|
|
432
|
+
private _onChange;
|
|
433
|
+
private _onTouched;
|
|
434
|
+
select(value: unknown): void;
|
|
435
|
+
writeValue(val: unknown): void;
|
|
436
|
+
registerOnChange(fn: (v: unknown) => void): void;
|
|
437
|
+
registerOnTouched(fn: () => void): void;
|
|
438
|
+
setDisabledState(isDisabled: boolean): void;
|
|
439
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuRadioGroupComponent, never>;
|
|
440
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<NeuRadioGroupComponent, "neu-radio-group", never, { "direction": { "alias": "direction"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
/**
|
|
444
|
+
* NeuralUI Radio Component
|
|
445
|
+
*
|
|
446
|
+
* Opción individual dentro de un neu-radio-group.
|
|
447
|
+
*
|
|
448
|
+
* Uso:
|
|
449
|
+
* <neu-radio value="opcion-a" label="Opción A" />
|
|
450
|
+
*/
|
|
451
|
+
declare class NeuRadioComponent {
|
|
452
|
+
readonly value: _angular_core.InputSignal<unknown>;
|
|
453
|
+
readonly label: _angular_core.InputSignal<string>;
|
|
454
|
+
readonly disabled: _angular_core.InputSignal<boolean>;
|
|
455
|
+
readonly group: _neural_ui_core.NeuRadioGroupComponent;
|
|
456
|
+
readonly _id: string;
|
|
457
|
+
/** Toma el nombre del grupo padre — así todos los radios del grupo comparten el mismo `name` nativo */
|
|
458
|
+
readonly _groupName: string;
|
|
459
|
+
readonly isChecked: _angular_core.Signal<boolean>;
|
|
460
|
+
readonly isDisabled: _angular_core.Signal<boolean>;
|
|
461
|
+
onSelect(): void;
|
|
462
|
+
onBlur(): void;
|
|
463
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuRadioComponent, never>;
|
|
464
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<NeuRadioComponent, "neu-radio", never, { "value": { "alias": "value"; "required": true; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
/**
|
|
468
|
+
* Directiva para personalizar el template de cada ítem del dropdown.
|
|
469
|
+
*
|
|
470
|
+
* Uso:
|
|
471
|
+
* ```html
|
|
472
|
+
* <neu-select [options]="opts" [(ngModel)]="value">
|
|
473
|
+
* <ng-template neuSelectItem let-item>
|
|
474
|
+
* <span class="flag flag-{{ item.value }}"></span>
|
|
475
|
+
* {{ item.label }}
|
|
476
|
+
* </ng-template>
|
|
477
|
+
* </neu-select>
|
|
478
|
+
* ```
|
|
479
|
+
*/
|
|
480
|
+
declare class NeuSelectItemDirective {
|
|
481
|
+
readonly templateRef: TemplateRef<{
|
|
482
|
+
$implicit: NeuSelectOption;
|
|
483
|
+
}>;
|
|
484
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuSelectItemDirective, never>;
|
|
485
|
+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<NeuSelectItemDirective, "[neuSelectItem]", never, {}, {}, never, never, true, never>;
|
|
486
|
+
}
|
|
487
|
+
/**
|
|
488
|
+
* Directiva para personalizar el template del ítem seleccionado (trigger).
|
|
489
|
+
*
|
|
490
|
+
* Uso:
|
|
491
|
+
* ```html
|
|
492
|
+
* <neu-select [options]="opts" [(ngModel)]="value">
|
|
493
|
+
* <ng-template neuSelectSelected let-item>
|
|
494
|
+
* <strong>{{ item?.label }}</strong>
|
|
495
|
+
* </ng-template>
|
|
496
|
+
* </neu-select>
|
|
497
|
+
* ```
|
|
498
|
+
*/
|
|
499
|
+
declare class NeuSelectSelectedDirective {
|
|
500
|
+
readonly templateRef: TemplateRef<{
|
|
501
|
+
$implicit: NeuSelectOption | null;
|
|
502
|
+
}>;
|
|
503
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuSelectSelectedDirective, never>;
|
|
504
|
+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<NeuSelectSelectedDirective, "[neuSelectSelected]", never, {}, {}, never, never, true, never>;
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
/**
|
|
508
|
+
* NeuralUI Select Component
|
|
509
|
+
*
|
|
510
|
+
* Dropdown personalizado con soporte para Angular Forms.
|
|
511
|
+
* Cierra automáticamente al hacer clic fuera del componente.
|
|
512
|
+
*
|
|
513
|
+
* Uso:
|
|
514
|
+
* <neu-select label="País" [options]="paises" [(ngModel)]="country" />
|
|
515
|
+
*
|
|
516
|
+
* Con Reactive Forms:
|
|
517
|
+
* <neu-select label="País" [options]="paises" [formControl]="countryCtrl" />
|
|
518
|
+
*/
|
|
519
|
+
declare class NeuSelectComponent implements ControlValueAccessor {
|
|
520
|
+
private readonly elementRef;
|
|
521
|
+
/** @internal — ID \u00fanico para asociar label con trigger */
|
|
522
|
+
readonly _triggerId: string;
|
|
523
|
+
/** Template personalizado para cada opción del dropdown */
|
|
524
|
+
readonly itemTpl: _angular_core.Signal<NeuSelectItemDirective | undefined>;
|
|
525
|
+
/** Template personalizado para el valor seleccionado en el trigger */
|
|
526
|
+
readonly selectedItemTpl: _angular_core.Signal<NeuSelectSelectedDirective | undefined>;
|
|
527
|
+
/** Opciones del dropdown */
|
|
528
|
+
options: _angular_core.InputSignal<NeuSelectOption[]>;
|
|
529
|
+
/** Texto del floating label */
|
|
530
|
+
label: _angular_core.InputSignal<string>;
|
|
531
|
+
/** Placeholder cuando no hay selección */
|
|
532
|
+
placeholder: _angular_core.InputSignal<string>;
|
|
533
|
+
/** Mensaje de error */
|
|
534
|
+
errorMessage: _angular_core.InputSignal<string>;
|
|
535
|
+
/** Deshabilita el select */
|
|
536
|
+
disabled: _angular_core.InputSignal<boolean>;
|
|
537
|
+
/** Muestra el label como flotante (true) o como label estático encima (false, por defecto) */
|
|
538
|
+
floatingLabel: _angular_core.InputSignal<boolean>;
|
|
539
|
+
/** Activa input de búsqueda/filtro en el panel */
|
|
540
|
+
searchable: _angular_core.InputSignal<boolean>;
|
|
541
|
+
/** Placeholder del input de búsqueda */
|
|
542
|
+
searchPlaceholder: _angular_core.InputSignal<string>;
|
|
543
|
+
/** Muestra un botón para limpiar la selección */
|
|
544
|
+
clearable: _angular_core.InputSignal<boolean>;
|
|
545
|
+
/** Texto cuando no hay opciones tras filtrar */
|
|
546
|
+
noResultsMessage: _angular_core.InputSignal<string>;
|
|
547
|
+
/** Aria-label del botón de limpiar */
|
|
548
|
+
clearAriaLabel: _angular_core.InputSignal<string>;
|
|
549
|
+
protected readonly _value: _angular_core.WritableSignal<string | null>;
|
|
550
|
+
readonly isOpen: _angular_core.WritableSignal<boolean>;
|
|
551
|
+
readonly searchQuery: _angular_core.WritableSignal<string>;
|
|
552
|
+
readonly hasError: _angular_core.Signal<boolean>;
|
|
553
|
+
readonly filteredOptions: _angular_core.Signal<NeuSelectOption[]>;
|
|
554
|
+
readonly selectedLabel: _angular_core.Signal<string | null>;
|
|
555
|
+
readonly _selectedOption: _angular_core.Signal<NeuSelectOption | null>;
|
|
556
|
+
private _onChange;
|
|
557
|
+
private _onTouched;
|
|
558
|
+
writeValue(val: string | null): void;
|
|
559
|
+
registerOnChange(fn: (v: string | null) => void): void;
|
|
560
|
+
registerOnTouched(fn: () => void): void;
|
|
561
|
+
private readonly _cvaDisabled;
|
|
562
|
+
setDisabledState(isDisabled: boolean): void;
|
|
563
|
+
readonly isDisabledFinal: _angular_core.Signal<boolean>;
|
|
564
|
+
toggle(): void;
|
|
565
|
+
close(): void;
|
|
566
|
+
/** Abre el panel y navega con flechas desde el trigger */
|
|
567
|
+
onTriggerKey(event: Event): void;
|
|
568
|
+
/** Navega entre opciones con flechas */
|
|
569
|
+
focusOptionByIndex(event: Event, current: NeuSelectOption, dir: 1 | -1): void;
|
|
570
|
+
clearValue(event: MouseEvent): void;
|
|
571
|
+
selectOption(option: NeuSelectOption): void;
|
|
572
|
+
onDocumentClick(event: MouseEvent): void;
|
|
573
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuSelectComponent, never>;
|
|
574
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<NeuSelectComponent, "neu-select", never, { "options": { "alias": "options"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "errorMessage": { "alias": "errorMessage"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "floatingLabel": { "alias": "floatingLabel"; "required": false; "isSignal": true; }; "searchable": { "alias": "searchable"; "required": false; "isSignal": true; }; "searchPlaceholder": { "alias": "searchPlaceholder"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "noResultsMessage": { "alias": "noResultsMessage"; "required": false; "isSignal": true; }; "clearAriaLabel": { "alias": "clearAriaLabel"; "required": false; "isSignal": true; }; }, {}, ["itemTpl", "selectedItemTpl"], never, true, never>;
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
/**
|
|
578
|
+
* NeuralUI Slider Component
|
|
579
|
+
*
|
|
580
|
+
* Control deslizante accesible que envuelve el <input type="range">
|
|
581
|
+
* nativo con estilos personalizados y tooltips de valor.
|
|
582
|
+
*
|
|
583
|
+
* Uso:
|
|
584
|
+
* <neu-slider [value]="volume" (valueChange)="volume = $event" />
|
|
585
|
+
* <neu-slider [value]="50" [min]="0" [max]="100" [step]="5" [showValue]="true" />
|
|
586
|
+
*/
|
|
587
|
+
declare class NeuSliderComponent {
|
|
588
|
+
private static _idCounter;
|
|
589
|
+
protected readonly sliderId: string;
|
|
590
|
+
/** Valor actual */
|
|
591
|
+
value: _angular_core.InputSignal<number>;
|
|
592
|
+
/** Valor mínimo */
|
|
593
|
+
min: _angular_core.InputSignal<number>;
|
|
594
|
+
/** Valor máximo */
|
|
595
|
+
max: _angular_core.InputSignal<number>;
|
|
596
|
+
/** Paso */
|
|
597
|
+
step: _angular_core.InputSignal<number>;
|
|
598
|
+
/** Etiqueta */
|
|
599
|
+
label: _angular_core.InputSignal<string>;
|
|
600
|
+
/** Muestra el valor numerico */
|
|
601
|
+
showValue: _angular_core.InputSignal<boolean>;
|
|
602
|
+
/** Muestra min/mid/max bajo la barra */
|
|
603
|
+
showTicks: _angular_core.InputSignal<boolean>;
|
|
604
|
+
/** Unidad a mostrar junto al valor */
|
|
605
|
+
unit: _angular_core.InputSignal<string>;
|
|
606
|
+
/** Deshabilitado */
|
|
607
|
+
disabled: _angular_core.InputSignal<boolean>;
|
|
608
|
+
/** Emite al mover el slider */
|
|
609
|
+
valueChange: _angular_core.OutputEmitterRef<number>;
|
|
610
|
+
readonly fillPercent: _angular_core.Signal<number>;
|
|
611
|
+
onInput(event: Event): void;
|
|
612
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuSliderComponent, never>;
|
|
613
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<NeuSliderComponent, "neu-slider", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "showValue": { "alias": "showValue"; "required": false; "isSignal": true; }; "showTicks": { "alias": "showTicks"; "required": false; "isSignal": true; }; "unit": { "alias": "unit"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; }, never, never, true, never>;
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
/**
|
|
617
|
+
* NeuralUI Switch Component
|
|
618
|
+
*
|
|
619
|
+
* Toggle animado para formularios de configuración en dashboards.
|
|
620
|
+
* Usa el Electric-Blue (--neu-primary) cuando está activo.
|
|
621
|
+
*
|
|
622
|
+
* Uso:
|
|
623
|
+
* <neu-switch label="Notificaciones" [formControl]="notifsCtrl" />
|
|
624
|
+
*/
|
|
625
|
+
declare class NeuSwitchComponent implements ControlValueAccessor {
|
|
626
|
+
readonly label: _angular_core.InputSignal<string>;
|
|
627
|
+
readonly name: _angular_core.InputSignal<string>;
|
|
628
|
+
readonly disabled: _angular_core.InputSignal<boolean>;
|
|
629
|
+
readonly _id: string;
|
|
630
|
+
protected readonly _checked: _angular_core.WritableSignal<boolean>;
|
|
631
|
+
/** Estado disabled interno — combina el input `disabled` con el CVA setDisabledState */
|
|
632
|
+
private readonly _cvaDisabled;
|
|
633
|
+
protected readonly _isDisabled: _angular_core.Signal<boolean>;
|
|
634
|
+
private _onChange;
|
|
635
|
+
private _onTouched;
|
|
636
|
+
onChange(event: Event): void;
|
|
637
|
+
onBlur(): void;
|
|
638
|
+
writeValue(val: unknown): void;
|
|
639
|
+
registerOnChange(fn: (v: boolean) => void): void;
|
|
640
|
+
registerOnTouched(fn: () => void): void;
|
|
641
|
+
setDisabledState(isDisabled: boolean): void;
|
|
642
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuSwitchComponent, never>;
|
|
643
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<NeuSwitchComponent, "neu-switch", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
644
|
+
}
|
|
645
|
+
|
|
646
|
+
/**
|
|
647
|
+
* NeuralUI Textarea Component
|
|
648
|
+
*
|
|
649
|
+
* Textarea con floating label y soporte completo para Angular Forms.
|
|
650
|
+
* Soporta auto-resize opcional.
|
|
651
|
+
*
|
|
652
|
+
* Uso:
|
|
653
|
+
* <neu-textarea label="Descripción" [formControl]="ctrl" />
|
|
654
|
+
* <neu-textarea label="Bio" [rows]="5" [autoResize]="true" />
|
|
655
|
+
*/
|
|
656
|
+
declare class NeuTextareaComponent implements ControlValueAccessor {
|
|
657
|
+
readonly label: _angular_core.InputSignal<string>;
|
|
658
|
+
readonly rows: _angular_core.InputSignal<number>;
|
|
659
|
+
readonly autoResize: _angular_core.InputSignal<boolean>;
|
|
660
|
+
/** Permite al usuario redimensionar el campo manualmente (por defecto: true) */
|
|
661
|
+
readonly resizable: _angular_core.InputSignal<boolean>;
|
|
662
|
+
readonly errorMessage: _angular_core.InputSignal<string>;
|
|
663
|
+
readonly hint: _angular_core.InputSignal<string>;
|
|
664
|
+
readonly disabled: _angular_core.InputSignal<boolean>;
|
|
665
|
+
readonly readonly: _angular_core.InputSignal<boolean>;
|
|
666
|
+
readonly required: _angular_core.InputSignal<boolean>;
|
|
667
|
+
readonly name: _angular_core.InputSignal<string>;
|
|
668
|
+
readonly maxlength: _angular_core.InputSignal<number | null>;
|
|
669
|
+
readonly _id: string;
|
|
670
|
+
protected readonly _value: _angular_core.WritableSignal<string>;
|
|
671
|
+
protected readonly _focused: _angular_core.WritableSignal<boolean>;
|
|
672
|
+
protected readonly _isDisabled: _angular_core.WritableSignal<boolean>;
|
|
673
|
+
readonly _isDisabledState: _angular_core.Signal<boolean>;
|
|
674
|
+
readonly hasValue: _angular_core.Signal<boolean>;
|
|
675
|
+
readonly hasError: _angular_core.Signal<boolean>;
|
|
676
|
+
readonly _resizeStyle: _angular_core.Signal<"none" | "vertical">;
|
|
677
|
+
private readonly _textareaRef;
|
|
678
|
+
private _onChange;
|
|
679
|
+
private _onTouched;
|
|
680
|
+
constructor();
|
|
681
|
+
onInput(event: Event): void;
|
|
682
|
+
onFocus(): void;
|
|
683
|
+
onBlur(): void;
|
|
684
|
+
writeValue(val: unknown): void;
|
|
685
|
+
registerOnChange(fn: (v: string) => void): void;
|
|
686
|
+
registerOnTouched(fn: () => void): void;
|
|
687
|
+
setDisabledState(isDisabled: boolean): void;
|
|
688
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuTextareaComponent, never>;
|
|
689
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<NeuTextareaComponent, "neu-textarea", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "rows": { "alias": "rows"; "required": false; "isSignal": true; }; "autoResize": { "alias": "autoResize"; "required": false; "isSignal": true; }; "resizable": { "alias": "resizable"; "required": false; "isSignal": true; }; "errorMessage": { "alias": "errorMessage"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "maxlength": { "alias": "maxlength"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
690
|
+
}
|
|
691
|
+
|
|
692
|
+
type NeuButtonVariant = 'primary' | 'secondary' | 'ghost' | 'danger' | 'outline';
|
|
693
|
+
type NeuButtonSize = 'sm' | 'md' | 'lg';
|
|
694
|
+
type NeuButtonIconPosition = 'left' | 'right';
|
|
695
|
+
/**
|
|
696
|
+
* NeuralUI Button Component
|
|
697
|
+
*
|
|
698
|
+
* Uso: <button neu-button variant="primary" size="md">Texto</button>
|
|
699
|
+
* Con icono: <button neu-button icon="lucideSave">Guardar</button>
|
|
700
|
+
* Solo icono: <button neu-button icon="lucideTrash2" [iconOnly]="true" />
|
|
701
|
+
*
|
|
702
|
+
* Signals: variant, size, disabled, loading, fullWidth, icon, iconPosition, iconOnly
|
|
703
|
+
* son inputs reactivos. El estado se computa automáticamente con computed().
|
|
704
|
+
*/
|
|
705
|
+
declare class NeuButtonComponent {
|
|
706
|
+
/** Variante visual del botón */
|
|
707
|
+
variant: _angular_core.InputSignal<NeuButtonVariant>;
|
|
708
|
+
/** Tamaño del botón */
|
|
709
|
+
size: _angular_core.InputSignal<NeuButtonSize>;
|
|
710
|
+
/** Deshabilita el botón y bloquea la interacción */
|
|
711
|
+
disabled: _angular_core.InputSignal<boolean>;
|
|
712
|
+
/** Muestra un spinner y deshabilita mientras se procesa */
|
|
713
|
+
loading: _angular_core.InputSignal<boolean>;
|
|
714
|
+
/** Ocupa el 100% del ancho de su contenedor */
|
|
715
|
+
fullWidth: _angular_core.InputSignal<boolean>;
|
|
716
|
+
/** Nombre del icono Lucide (ej: 'lucideSave', 'lucidePlus') */
|
|
717
|
+
icon: _angular_core.InputSignal<string>;
|
|
718
|
+
/** Posición del icono respecto al texto */
|
|
719
|
+
iconPosition: _angular_core.InputSignal<NeuButtonIconPosition>;
|
|
720
|
+
/** Modo solo-icono: aplica padding cuadrado y oculta el ng-content */
|
|
721
|
+
iconOnly: _angular_core.InputSignal<boolean>;
|
|
722
|
+
/** Etiqueta accesible obligatoria cuando se usa iconOnly (WCAG 4.1.2) */
|
|
723
|
+
ariaLabel: _angular_core.InputSignal<string>;
|
|
724
|
+
/** Emite el evento de click cuando el botón está activo */
|
|
725
|
+
neuClick: _angular_core.OutputEmitterRef<MouseEvent>;
|
|
726
|
+
/** @internal — reenvía el click nativo al output Angular */
|
|
727
|
+
_onHostClick(event: MouseEvent): void;
|
|
728
|
+
readonly isDisabled: _angular_core.Signal<boolean>;
|
|
729
|
+
readonly hasIcon: _angular_core.Signal<boolean>;
|
|
730
|
+
readonly iconSize: _angular_core.Signal<string>;
|
|
731
|
+
readonly hostClasses: _angular_core.Signal<{
|
|
732
|
+
[x: string]: boolean;
|
|
733
|
+
'neu-button': boolean;
|
|
734
|
+
'neu-button--loading': boolean;
|
|
735
|
+
'neu-button--disabled': boolean;
|
|
736
|
+
'neu-button--full-width': boolean;
|
|
737
|
+
'neu-button--icon-only': boolean;
|
|
738
|
+
}>;
|
|
739
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuButtonComponent, never>;
|
|
740
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<NeuButtonComponent, "button[neu-button]", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "fullWidth": { "alias": "fullWidth"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "iconPosition": { "alias": "iconPosition"; "required": false; "isSignal": true; }; "iconOnly": { "alias": "iconOnly"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, { "neuClick": "neuClick"; }, never, ["*"], true, never>;
|
|
741
|
+
}
|
|
742
|
+
|
|
743
|
+
interface NeuToggleOption<T = unknown> {
|
|
744
|
+
/** Texto visible del botón */
|
|
745
|
+
label: string;
|
|
746
|
+
/** Valor asociado a esta opción */
|
|
747
|
+
value: T;
|
|
748
|
+
/** Nombre de icono Lucide (opcional) */
|
|
749
|
+
icon?: string;
|
|
750
|
+
/** Deshabilita solo esta opción */
|
|
751
|
+
disabled?: boolean;
|
|
752
|
+
}
|
|
753
|
+
/**
|
|
754
|
+
* NeuralUI ToggleButtonGroup Component
|
|
755
|
+
*
|
|
756
|
+
* Grupo de botones de selección (single o múltiple).
|
|
757
|
+
* Equivalente técnicamente superior al SelectButton de PrimeNG.
|
|
758
|
+
*
|
|
759
|
+
* Uso (single):
|
|
760
|
+
* <neu-toggle-button-group [options]="opts" [(ngModel)]="value" />
|
|
761
|
+
*
|
|
762
|
+
* Uso (múltiple):
|
|
763
|
+
* <neu-toggle-button-group [options]="opts" [multiple]="true" [(ngModel)]="values" />
|
|
764
|
+
*/
|
|
765
|
+
declare class NeuToggleButtonGroupComponent<T = unknown> implements ControlValueAccessor {
|
|
766
|
+
/** Lista de opciones del grupo */
|
|
767
|
+
options: _angular_core.InputSignal<NeuToggleOption<T>[]>;
|
|
768
|
+
/**
|
|
769
|
+
* Permite seleccionar múltiples opciones.
|
|
770
|
+
* - false (por defecto): valor es `T | null`
|
|
771
|
+
* - true: valor es `T[]`
|
|
772
|
+
*/
|
|
773
|
+
multiple: _angular_core.InputSignal<boolean>;
|
|
774
|
+
/** Tamaño visual */
|
|
775
|
+
size: _angular_core.InputSignal<NeuButtonSize>;
|
|
776
|
+
/** Deshabilita todo el grupo */
|
|
777
|
+
disabled: _angular_core.InputSignal<boolean>;
|
|
778
|
+
/** Emite el nuevo valor al cambiar (útil sin formControl) */
|
|
779
|
+
neuChange: _angular_core.OutputEmitterRef<T | T[] | null>;
|
|
780
|
+
readonly _value: _angular_core.WritableSignal<T | T[] | null>;
|
|
781
|
+
readonly _isDisabled: _angular_core.WritableSignal<boolean>;
|
|
782
|
+
readonly groupClasses: _angular_core.Signal<{
|
|
783
|
+
[x: string]: boolean;
|
|
784
|
+
'neu-toggle-group': boolean;
|
|
785
|
+
'neu-toggle-group--disabled': boolean;
|
|
786
|
+
}>;
|
|
787
|
+
isSelected(value: T): boolean;
|
|
788
|
+
toggle(opt: NeuToggleOption<T>): void;
|
|
789
|
+
onBlur(): void;
|
|
790
|
+
private _onChange;
|
|
791
|
+
private _onTouched;
|
|
792
|
+
writeValue(val: T | T[] | null): void;
|
|
793
|
+
registerOnChange(fn: (v: unknown) => void): void;
|
|
794
|
+
registerOnTouched(fn: () => void): void;
|
|
795
|
+
setDisabledState(isDisabled: boolean): void;
|
|
796
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuToggleButtonGroupComponent<any>, never>;
|
|
797
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<NeuToggleButtonGroupComponent<any>, "neu-toggle-button-group", never, { "options": { "alias": "options"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "neuChange": "neuChange"; }, never, never, true, never>;
|
|
798
|
+
}
|
|
799
|
+
|
|
800
|
+
interface NeuBreadcrumbItem {
|
|
801
|
+
/** Etiqueta visible */
|
|
802
|
+
label: string;
|
|
803
|
+
/** Ruta interna (RouterLink) */
|
|
804
|
+
route?: string | string[];
|
|
805
|
+
/** URL externa */
|
|
806
|
+
url?: string;
|
|
807
|
+
/** Icono Lucide opcional */
|
|
808
|
+
icon?: string;
|
|
809
|
+
}
|
|
810
|
+
/**
|
|
811
|
+
* NeuralUI Breadcrumb Component
|
|
812
|
+
*
|
|
813
|
+
* Ruta de navegación jerárquica. El último elemento se muestra
|
|
814
|
+
* como activo (sin enlace).
|
|
815
|
+
*
|
|
816
|
+
* Uso:
|
|
817
|
+
* <neu-breadcrumb [items]="breadcrumbs" />
|
|
818
|
+
*
|
|
819
|
+
* items = [
|
|
820
|
+
* { label: 'Inicio', route: '/' },
|
|
821
|
+
* { label: 'Componentes', route: '/components' },
|
|
822
|
+
* { label: 'Breadcrumb' },
|
|
823
|
+
* ];
|
|
824
|
+
*/
|
|
825
|
+
declare class NeuBreadcrumbComponent {
|
|
826
|
+
/** Lista de ítems de navegación */
|
|
827
|
+
items: _angular_core.InputSignal<NeuBreadcrumbItem[]>;
|
|
828
|
+
/** Separador personalizable */
|
|
829
|
+
separator: _angular_core.InputSignal<string>;
|
|
830
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuBreadcrumbComponent, never>;
|
|
831
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<NeuBreadcrumbComponent, "neu-breadcrumb", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "separator": { "alias": "separator"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
832
|
+
}
|
|
833
|
+
|
|
834
|
+
/**
|
|
835
|
+
* Ítem de navegación con soporte para 3 niveles de profundidad.
|
|
836
|
+
*
|
|
837
|
+
* Destino del enlace — usa UNO de los dos:
|
|
838
|
+
* - `route` → navegación interna Angular (RouterLink)
|
|
839
|
+
* - `href` → URL externa, se abre en nueva pestaña con rel="noopener noreferrer"
|
|
840
|
+
*
|
|
841
|
+
* Los ítems con `children` actúan como grupo acordeón (sin destino propio).
|
|
842
|
+
* Máximo 3 niveles: raíz → hijos → nietos.
|
|
843
|
+
* Los nietos no pueden tener `children`.
|
|
844
|
+
*/
|
|
845
|
+
interface NeuNavItem {
|
|
846
|
+
id: string;
|
|
847
|
+
label: string;
|
|
848
|
+
icon: string;
|
|
849
|
+
/** Ruta Angular interna (RouterLink). Excluye `href`. */
|
|
850
|
+
route?: string;
|
|
851
|
+
/** URL externa. Se abre en nueva pestaña. Excluye `route`. */
|
|
852
|
+
href?: string;
|
|
853
|
+
/** Ítems hijo (nivel 2). Cada hijo puede tener sus propios `children` (nivel 3). */
|
|
854
|
+
children?: NeuNavItem[];
|
|
855
|
+
badge?: string;
|
|
856
|
+
badgeVariant?: 'default' | 'success' | 'warning' | 'danger' | 'info';
|
|
857
|
+
disabled?: boolean;
|
|
858
|
+
}
|
|
859
|
+
declare class NeuNavComponent {
|
|
860
|
+
private readonly router;
|
|
861
|
+
private readonly currentUrl;
|
|
862
|
+
/** Lista de ítems de navegación */
|
|
863
|
+
items: _angular_core.InputSignal<NeuNavItem[]>;
|
|
864
|
+
/** Estado inicial colapsado */
|
|
865
|
+
collapsed: _angular_core.InputSignal<boolean>;
|
|
866
|
+
/** Muestra el botón de colapsar/expandir */
|
|
867
|
+
collapsible: _angular_core.InputSignal<boolean>;
|
|
868
|
+
/** Etiqueta accesible del <nav> */
|
|
869
|
+
ariaLabel: _angular_core.InputSignal<string>;
|
|
870
|
+
/** Aria-label del botón cuando el nav está colapsado */
|
|
871
|
+
expandLabel: _angular_core.InputSignal<string>;
|
|
872
|
+
/** Aria-label del botón cuando el nav está expandido */
|
|
873
|
+
collapseLabel: _angular_core.InputSignal<string>;
|
|
874
|
+
/** Emite cuando cambia el estado colapsado */
|
|
875
|
+
collapsedChange: _angular_core.OutputEmitterRef<boolean>;
|
|
876
|
+
readonly isCollapsed: _angular_core.WritableSignal<boolean>;
|
|
877
|
+
private readonly openGroups;
|
|
878
|
+
readonly flyoutState: _angular_core.WritableSignal<{
|
|
879
|
+
item: NeuNavItem;
|
|
880
|
+
top: number;
|
|
881
|
+
left: number;
|
|
882
|
+
} | null>;
|
|
883
|
+
private _flyoutTimer;
|
|
884
|
+
constructor();
|
|
885
|
+
toggleCollapse(): void;
|
|
886
|
+
toggleGroup(id: string): void;
|
|
887
|
+
isGroupOpen(id: string): boolean;
|
|
888
|
+
isCurrentRoute(route: string): boolean;
|
|
889
|
+
isGroupActive(item: NeuNavItem): boolean;
|
|
890
|
+
onGroupMouseEnter(item: NeuNavItem, event: MouseEvent): void;
|
|
891
|
+
onGroupMouseLeave(): void;
|
|
892
|
+
onFlyoutMouseEnter(): void;
|
|
893
|
+
onFlyoutMouseLeave(): void;
|
|
894
|
+
private _openActiveGroup;
|
|
895
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuNavComponent, never>;
|
|
896
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<NeuNavComponent, "neu-nav", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "collapsed": { "alias": "collapsed"; "required": false; "isSignal": true; }; "collapsible": { "alias": "collapsible"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "expandLabel": { "alias": "expandLabel"; "required": false; "isSignal": true; }; "collapseLabel": { "alias": "collapseLabel"; "required": false; "isSignal": true; }; }, { "collapsedChange": "collapsedChange"; }, never, ["[neu-nav-brand-icon]", "[neu-nav-brand]", "[neu-nav-footer]"], true, never>;
|
|
897
|
+
}
|
|
898
|
+
|
|
899
|
+
/**
|
|
900
|
+
* NeuralUI Pagination Component
|
|
901
|
+
*
|
|
902
|
+
* Paginación accesible con navegación por páginas, primera/última y ellipsis.
|
|
903
|
+
*
|
|
904
|
+
* Uso:
|
|
905
|
+
* <neu-pagination [total]="200" [pageSize]="10" [page]="currentPage"
|
|
906
|
+
* (pageChange)="currentPage = $event" />
|
|
907
|
+
*/
|
|
908
|
+
declare class NeuPaginationComponent {
|
|
909
|
+
/** Página actual (1-indexed) */
|
|
910
|
+
page: _angular_core.InputSignal<number>;
|
|
911
|
+
/** Total de ítems */
|
|
912
|
+
total: _angular_core.InputSignal<number>;
|
|
913
|
+
/** Ítems por página */
|
|
914
|
+
pageSize: _angular_core.InputSignal<number>;
|
|
915
|
+
/** Número máximo de botones de página visibles (sin contar anterior/siguiente) */
|
|
916
|
+
maxVisible: _angular_core.InputSignal<number>;
|
|
917
|
+
/** Emite la nueva página al hacer click */
|
|
918
|
+
pageChange: _angular_core.OutputEmitterRef<number>;
|
|
919
|
+
readonly totalPages: _angular_core.Signal<number>;
|
|
920
|
+
readonly pages: _angular_core.Signal<number[]>;
|
|
921
|
+
go(page: number): void;
|
|
922
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuPaginationComponent, never>;
|
|
923
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<NeuPaginationComponent, "neu-pagination", never, { "page": { "alias": "page"; "required": false; "isSignal": true; }; "total": { "alias": "total"; "required": false; "isSignal": true; }; "pageSize": { "alias": "pageSize"; "required": false; "isSignal": true; }; "maxVisible": { "alias": "maxVisible"; "required": false; "isSignal": true; }; }, { "pageChange": "pageChange"; }, never, never, true, never>;
|
|
924
|
+
}
|
|
925
|
+
|
|
926
|
+
/**
|
|
927
|
+
* NeuralUI Sidebar Component
|
|
928
|
+
*
|
|
929
|
+
* El estado abierto/cerrado se gestiona automáticamente desde la URL
|
|
930
|
+
* via NeuUrlStateService (?menu=open por defecto).
|
|
931
|
+
*
|
|
932
|
+
* Modos:
|
|
933
|
+
* - overlay (default): panel flotante sobre el contenido con backdrop
|
|
934
|
+
* - persistent: sidebar fijo integrado en el layout (desktop)
|
|
935
|
+
*
|
|
936
|
+
* Uso:
|
|
937
|
+
* <neu-sidebar urlParam="menu" [persistent]="isDesktop()">
|
|
938
|
+
* <span neu-sidebar-header>Mi App</span>
|
|
939
|
+
* <nav>...</nav>
|
|
940
|
+
* <div neu-sidebar-footer>...</div>
|
|
941
|
+
* </neu-sidebar>
|
|
942
|
+
*
|
|
943
|
+
* Abrir desde cualquier parte:
|
|
944
|
+
* inject(NeuUrlStateService).setParam('menu', 'open', false);
|
|
945
|
+
*/
|
|
946
|
+
declare class NeuSidebarComponent {
|
|
947
|
+
private readonly urlState;
|
|
948
|
+
/** Posición del sidebar: izquierda o derecha de la pantalla */
|
|
949
|
+
side: _angular_core.InputSignal<"left" | "right">;
|
|
950
|
+
/** QueryParam que controla el estado. Default: 'menu' (?menu=open) */
|
|
951
|
+
urlParam: _angular_core.InputSignal<string>;
|
|
952
|
+
/**
|
|
953
|
+
* Modo persistente: el sidebar está siempre visible como parte del layout.
|
|
954
|
+
* Usar en desktop (≥768px). El overlay y el toggle por URL no aplican.
|
|
955
|
+
*/
|
|
956
|
+
persistent: _angular_core.InputSignal<boolean>;
|
|
957
|
+
/**
|
|
958
|
+
* Ocultar la cabecera del sidebar. Útil cuando el header ya está en el layout
|
|
959
|
+
* principal y el sidebar persistente no necesita su propio header.
|
|
960
|
+
*/
|
|
961
|
+
hideHeader: _angular_core.InputSignal<boolean>;
|
|
962
|
+
/** Etiqueta accesible para el <aside> */
|
|
963
|
+
ariaLabel: _angular_core.InputSignal<string>;
|
|
964
|
+
/** Etiqueta accesible para el botón cerrar */
|
|
965
|
+
closeLabel: _angular_core.InputSignal<string>;
|
|
966
|
+
/** Emite cuando el usuario cierra el sidebar (overlay click o botón) */
|
|
967
|
+
closeRequested: _angular_core.OutputEmitterRef<void>;
|
|
968
|
+
/** Signal reactivo: true si el sidebar debe mostrarse */
|
|
969
|
+
readonly isOpen: _angular_core.Signal<boolean>;
|
|
970
|
+
/** Abre el sidebar — añade ?{urlParam}=open a la URL */
|
|
971
|
+
open(replaceUrl?: boolean): void;
|
|
972
|
+
/** Cierra el sidebar — elimina el parámetro de la URL */
|
|
973
|
+
close(): void;
|
|
974
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuSidebarComponent, never>;
|
|
975
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<NeuSidebarComponent, "neu-sidebar", never, { "side": { "alias": "side"; "required": false; "isSignal": true; }; "urlParam": { "alias": "urlParam"; "required": false; "isSignal": true; }; "persistent": { "alias": "persistent"; "required": false; "isSignal": true; }; "hideHeader": { "alias": "hideHeader"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "closeLabel": { "alias": "closeLabel"; "required": false; "isSignal": true; }; }, { "closeRequested": "closeRequested"; }, never, ["[neu-sidebar-header]", "*", "[neu-sidebar-footer]"], true, never>;
|
|
976
|
+
}
|
|
977
|
+
|
|
978
|
+
interface NeuStepperStep {
|
|
979
|
+
/** Etiqueta del paso */
|
|
980
|
+
label: string;
|
|
981
|
+
/** Descripción corta opcional */
|
|
982
|
+
description?: string;
|
|
983
|
+
/** Marca el paso como completado externamente */
|
|
984
|
+
completed?: boolean;
|
|
985
|
+
/** Desactiva el paso */
|
|
986
|
+
disabled?: boolean;
|
|
987
|
+
}
|
|
988
|
+
/**
|
|
989
|
+
* NeuralUI Stepper Component
|
|
990
|
+
*
|
|
991
|
+
* Wizard paso a paso con estado de completado, lineal u opcional.
|
|
992
|
+
* Expone métodos next() / prev() y emite stepChange.
|
|
993
|
+
*
|
|
994
|
+
* Uso:
|
|
995
|
+
* <neu-stepper [steps]="steps" [activeStep]="step" (stepChange)="step = $event">
|
|
996
|
+
* <ng-template neuStepContent>Contenido paso 1</ng-template>
|
|
997
|
+
* <ng-template neuStepContent>Contenido paso 2</ng-template>
|
|
998
|
+
* </neu-stepper>
|
|
999
|
+
*/
|
|
1000
|
+
declare class NeuStepperComponent {
|
|
1001
|
+
/** Pasos del wizard */
|
|
1002
|
+
steps: _angular_core.InputSignal<NeuStepperStep[]>;
|
|
1003
|
+
/** Índice del paso activo (0-based) */
|
|
1004
|
+
activeStep: _angular_core.InputSignal<number>;
|
|
1005
|
+
/** Si true, solo permite ir hacia adelante secuencialmente */
|
|
1006
|
+
linear: _angular_core.InputSignal<boolean>;
|
|
1007
|
+
/** Emite el nuevo índice al cambiar */
|
|
1008
|
+
stepChange: _angular_core.OutputEmitterRef<number>;
|
|
1009
|
+
/** Set de pasos completados */
|
|
1010
|
+
private readonly _completed;
|
|
1011
|
+
readonly isCompleted: (i: number) => boolean;
|
|
1012
|
+
goTo(i: number): void;
|
|
1013
|
+
/** Marca el paso actual como completado y avanza al siguiente */
|
|
1014
|
+
next(): void;
|
|
1015
|
+
prev(): void;
|
|
1016
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuStepperComponent, never>;
|
|
1017
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<NeuStepperComponent, "neu-stepper", never, { "steps": { "alias": "steps"; "required": false; "isSignal": true; }; "activeStep": { "alias": "activeStep"; "required": false; "isSignal": true; }; "linear": { "alias": "linear"; "required": false; "isSignal": true; }; }, { "stepChange": "stepChange"; }, never, ["*"], true, never>;
|
|
1018
|
+
}
|
|
1019
|
+
|
|
1020
|
+
declare const NEU_TABS_CONTEXT: InjectionToken<NeuTabsComponent>;
|
|
1021
|
+
interface NeuTab {
|
|
1022
|
+
/** ID único de la pestaña — se usa como valor en la URL */
|
|
1023
|
+
id: string;
|
|
1024
|
+
/** Etiqueta visible */
|
|
1025
|
+
label: string;
|
|
1026
|
+
/** Badge opcional junto al label */
|
|
1027
|
+
badge?: string;
|
|
1028
|
+
/** Deshabilita la pestaña sin ocultarla */
|
|
1029
|
+
disabled?: boolean;
|
|
1030
|
+
}
|
|
1031
|
+
/**
|
|
1032
|
+
* NeuralUI Tabs Component
|
|
1033
|
+
*
|
|
1034
|
+
* Sistema de pestañas con estado sincronizado a la URL via NeuUrlStateService.
|
|
1035
|
+
* El panel activo se determina por ?{tabParam}={tabId}.
|
|
1036
|
+
*
|
|
1037
|
+
* Uso:
|
|
1038
|
+
* <neu-tabs [tabs]="tabs" tabParam="tab">
|
|
1039
|
+
* <neu-tab-panel tabId="preview">...</neu-tab-panel>
|
|
1040
|
+
* <neu-tab-panel tabId="api">...</neu-tab-panel>
|
|
1041
|
+
* </neu-tabs>
|
|
1042
|
+
*/
|
|
1043
|
+
declare class NeuTabsComponent implements AfterViewInit, OnDestroy {
|
|
1044
|
+
private readonly urlState;
|
|
1045
|
+
private readonly elRef;
|
|
1046
|
+
private resizeObserver?;
|
|
1047
|
+
constructor();
|
|
1048
|
+
/** Definición de pestañas */
|
|
1049
|
+
tabs: _angular_core.InputSignal<NeuTab[]>;
|
|
1050
|
+
/** QueryParam que almacena la pestaña activa */
|
|
1051
|
+
tabParam: _angular_core.InputSignal<string>;
|
|
1052
|
+
/** Si true, elimina el padding interno de los paneles */
|
|
1053
|
+
flush: _angular_core.InputSignal<boolean>;
|
|
1054
|
+
/** Etiqueta accesible del rol tablist */
|
|
1055
|
+
ariaLabel: _angular_core.InputSignal<string>;
|
|
1056
|
+
/** Emite al cambiar de pestaña */
|
|
1057
|
+
tabChange: _angular_core.OutputEmitterRef<string>;
|
|
1058
|
+
/** ID de la pestaña activa (de la URL o la primera disponible) */
|
|
1059
|
+
readonly activeTabId: _angular_core.Signal<string>;
|
|
1060
|
+
/** Posición del indicador calculada mediante medición DOM */
|
|
1061
|
+
private readonly _indicatorLeft;
|
|
1062
|
+
private readonly _indicatorWidth;
|
|
1063
|
+
readonly indicatorStyle: _angular_core.Signal<string>;
|
|
1064
|
+
ngAfterViewInit(): void;
|
|
1065
|
+
ngOnDestroy(): void;
|
|
1066
|
+
private _updateIndicator;
|
|
1067
|
+
selectTab(tab: NeuTab): void;
|
|
1068
|
+
/** Mueve el foco entre tabs con flechas (roving tabindex — WAI-ARIA Tabs Pattern) */
|
|
1069
|
+
focusTab(event: Event, dir: 1 | -1 | 'first' | 'last'): void;
|
|
1070
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuTabsComponent, never>;
|
|
1071
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<NeuTabsComponent, "neu-tabs", never, { "tabs": { "alias": "tabs"; "required": false; "isSignal": true; }; "tabParam": { "alias": "tabParam"; "required": false; "isSignal": true; }; "flush": { "alias": "flush"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, { "tabChange": "tabChange"; }, never, ["*"], true, never>;
|
|
1072
|
+
}
|
|
1073
|
+
/**
|
|
1074
|
+
* NeuralUI Tab Panel
|
|
1075
|
+
*
|
|
1076
|
+
* Panel de contenido asociado a una pestaña de NeuTabsComponent.
|
|
1077
|
+
* Solo se renderiza (no oculta con CSS) cuando la pestaña está activa.
|
|
1078
|
+
*
|
|
1079
|
+
* Uso: hijo directo de <neu-tabs>
|
|
1080
|
+
* <neu-tab-panel tabId="api">...</neu-tab-panel>
|
|
1081
|
+
*/
|
|
1082
|
+
declare class NeuTabPanelComponent {
|
|
1083
|
+
private readonly tabs;
|
|
1084
|
+
/** ID que debe coincidir con NeuTab.id del padre */
|
|
1085
|
+
tabId: _angular_core.InputSignal<string>;
|
|
1086
|
+
readonly isActive: _angular_core.Signal<boolean>;
|
|
1087
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuTabPanelComponent, never>;
|
|
1088
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<NeuTabPanelComponent, "neu-tab-panel", never, { "tabId": { "alias": "tabId"; "required": true; "isSignal": true; }; }, {}, never, ["*"], true, never>;
|
|
1089
|
+
}
|
|
1090
|
+
|
|
1091
|
+
interface NeuAccordionItem {
|
|
1092
|
+
/** ID único del panel */
|
|
1093
|
+
id: string;
|
|
1094
|
+
/** Título del encabezado */
|
|
1095
|
+
title: string;
|
|
1096
|
+
/** Contenido del cuerpo (HTML o texto plano) */
|
|
1097
|
+
content: string;
|
|
1098
|
+
/** Inicia expandido */
|
|
1099
|
+
expanded?: boolean;
|
|
1100
|
+
/** Deshabilita este panel */
|
|
1101
|
+
disabled?: boolean;
|
|
1102
|
+
}
|
|
1103
|
+
/**
|
|
1104
|
+
* NeuralUI Accordion Component
|
|
1105
|
+
*
|
|
1106
|
+
* Paneles expandibles / colapsables con animación suave.
|
|
1107
|
+
* Soporta modo múltiple (varios abiertos a la vez) o exclusivo.
|
|
1108
|
+
*
|
|
1109
|
+
* Uso:
|
|
1110
|
+
* <neu-accordion [items]="items" />
|
|
1111
|
+
* <neu-accordion [items]="items" [multiple]="true" />
|
|
1112
|
+
*/
|
|
1113
|
+
declare class NeuAccordionComponent {
|
|
1114
|
+
private readonly _sanitizer;
|
|
1115
|
+
/** Lista de paneles */
|
|
1116
|
+
items: _angular_core.InputSignal<NeuAccordionItem[]>;
|
|
1117
|
+
/** Permite varios paneles abiertos a la vez */
|
|
1118
|
+
multiple: _angular_core.InputSignal<boolean>;
|
|
1119
|
+
/** Borde exterior alrededor del accordion */
|
|
1120
|
+
bordered: _angular_core.InputSignal<boolean>;
|
|
1121
|
+
/** Emite el id del panel al abrirse/cerrarse */
|
|
1122
|
+
panelToggle: _angular_core.OutputEmitterRef<{
|
|
1123
|
+
id: string;
|
|
1124
|
+
expanded: boolean;
|
|
1125
|
+
}>;
|
|
1126
|
+
/**
|
|
1127
|
+
* Set de IDs actualmente expandidos.
|
|
1128
|
+
* Se inicializa desde los ítems con `expanded: true` en el primer render.
|
|
1129
|
+
* Después se vuelve un signal mutable independiente (no se resetea al cambiar items).
|
|
1130
|
+
*/
|
|
1131
|
+
private _expandedInit;
|
|
1132
|
+
private readonly _expanded;
|
|
1133
|
+
constructor();
|
|
1134
|
+
readonly isExpanded: (id: string) => boolean;
|
|
1135
|
+
sanitize(html: string): SafeHtml;
|
|
1136
|
+
toggle(id: string): void;
|
|
1137
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuAccordionComponent, never>;
|
|
1138
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<NeuAccordionComponent, "neu-accordion", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "bordered": { "alias": "bordered"; "required": false; "isSignal": true; }; }, { "panelToggle": "panelToggle"; }, never, never, true, never>;
|
|
1139
|
+
}
|
|
1140
|
+
|
|
1141
|
+
type NeuCardPadding = 'none' | 'sm' | 'md' | 'lg';
|
|
1142
|
+
/**
|
|
1143
|
+
* NeuralUI Card Component
|
|
1144
|
+
*
|
|
1145
|
+
* Contenedor con sombras y bordes Neural. Soporta header, body y footer
|
|
1146
|
+
* via content projection.
|
|
1147
|
+
*
|
|
1148
|
+
* Uso:
|
|
1149
|
+
* <neu-card>
|
|
1150
|
+
* <div neu-card-header>Título</div>
|
|
1151
|
+
* <p>Contenido</p>
|
|
1152
|
+
* <div neu-card-footer>Acciones</div>
|
|
1153
|
+
* </neu-card>
|
|
1154
|
+
*/
|
|
1155
|
+
declare class NeuCardComponent {
|
|
1156
|
+
/** Espaciado interior del cuerpo */
|
|
1157
|
+
padding: _angular_core.InputSignal<NeuCardPadding>;
|
|
1158
|
+
/** Efecto hover con elevación de sombra */
|
|
1159
|
+
hoverable: _angular_core.InputSignal<boolean>;
|
|
1160
|
+
/** Borde con acento de color primario */
|
|
1161
|
+
bordered: _angular_core.InputSignal<boolean>;
|
|
1162
|
+
/** Card compacta sin bordes ni sombras */
|
|
1163
|
+
flat: _angular_core.InputSignal<boolean>;
|
|
1164
|
+
readonly hostClasses: _angular_core.Signal<{
|
|
1165
|
+
'neu-card': boolean;
|
|
1166
|
+
'neu-card--hoverable': boolean;
|
|
1167
|
+
'neu-card--bordered': boolean;
|
|
1168
|
+
'neu-card--flat': boolean;
|
|
1169
|
+
}>;
|
|
1170
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuCardComponent, never>;
|
|
1171
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<NeuCardComponent, "neu-card", never, { "padding": { "alias": "padding"; "required": false; "isSignal": true; }; "hoverable": { "alias": "hoverable"; "required": false; "isSignal": true; }; "bordered": { "alias": "bordered"; "required": false; "isSignal": true; }; "flat": { "alias": "flat"; "required": false; "isSignal": true; }; }, {}, never, ["[neu-card-header]", "*", "[neu-card-footer]"], true, never>;
|
|
1172
|
+
}
|
|
1173
|
+
|
|
1174
|
+
/**
|
|
1175
|
+
* NeuralUI Divider
|
|
1176
|
+
*
|
|
1177
|
+
* Separador visual para secciones de contenido.
|
|
1178
|
+
*
|
|
1179
|
+
* Uso:
|
|
1180
|
+
* <neu-divider />
|
|
1181
|
+
* <neu-divider label="O continúa con" />
|
|
1182
|
+
* <neu-divider orientation="vertical" />
|
|
1183
|
+
*/
|
|
1184
|
+
declare class NeuDividerComponent {
|
|
1185
|
+
label: _angular_core.InputSignal<string>;
|
|
1186
|
+
orientation: _angular_core.InputSignal<"vertical" | "horizontal">;
|
|
1187
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuDividerComponent, never>;
|
|
1188
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<NeuDividerComponent, "neu-divider", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
1189
|
+
}
|
|
1190
|
+
|
|
1191
|
+
type NeuDialogSize = 'sm' | 'md' | 'lg' | 'xl' | 'full';
|
|
1192
|
+
/** Datos que se inyectan en el componente del diálogo */
|
|
1193
|
+
interface NeuDialogData<T = unknown> {
|
|
1194
|
+
title?: string;
|
|
1195
|
+
data?: T;
|
|
1196
|
+
}
|
|
1197
|
+
declare class NeuDialogService {
|
|
1198
|
+
private readonly dialog;
|
|
1199
|
+
open<T = unknown, R = unknown>(component: Type<unknown>, config?: {
|
|
1200
|
+
title?: string;
|
|
1201
|
+
data?: T;
|
|
1202
|
+
size?: NeuDialogSize;
|
|
1203
|
+
disableClose?: boolean;
|
|
1204
|
+
}): DialogRef<R>;
|
|
1205
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuDialogService, never>;
|
|
1206
|
+
static ɵprov: _angular_core.ɵɵInjectableDeclaration<NeuDialogService>;
|
|
1207
|
+
}
|
|
1208
|
+
/**
|
|
1209
|
+
* NeuDialogComponent — Diálogo accesible con header, body y footer.
|
|
1210
|
+
* Úsalo directamente como componente declarativo pasando `open` como signal.
|
|
1211
|
+
*
|
|
1212
|
+
* Para uso programático, utiliza NeuDialogService.open().
|
|
1213
|
+
*
|
|
1214
|
+
* Uso declarativo:
|
|
1215
|
+
* <neu-dialog [open]="isOpen()" title="Editar usuario" (closed)="isOpen.set(false)">
|
|
1216
|
+
* <p>Contenido del diálogo</p>
|
|
1217
|
+
* <div neu-dialog-footer>
|
|
1218
|
+
* <neu-button (click)="save()">Guardar</neu-button>
|
|
1219
|
+
* </div>
|
|
1220
|
+
* </neu-dialog>
|
|
1221
|
+
*/
|
|
1222
|
+
declare class NeuDialogComponent {
|
|
1223
|
+
/** Controla la visibilidad del diálogo. */
|
|
1224
|
+
open: _angular_core.InputSignal<boolean>;
|
|
1225
|
+
/** Título que aparece en el header. */
|
|
1226
|
+
title: _angular_core.InputSignal<string>;
|
|
1227
|
+
/** Tamaño del panel: sm | md | lg | xl | full. */
|
|
1228
|
+
size: _angular_core.InputSignal<NeuDialogSize>;
|
|
1229
|
+
/** Si es true, el backdrop y el botón cerrar no funcionan. */
|
|
1230
|
+
disableClose: _angular_core.InputSignal<boolean>;
|
|
1231
|
+
/** Emite cuando el usuario cierra el diálogo. */
|
|
1232
|
+
closed: _angular_core.OutputEmitterRef<void>;
|
|
1233
|
+
/** @internal — ID único para aria-labelledby */
|
|
1234
|
+
readonly _uid: string;
|
|
1235
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuDialogComponent, never>;
|
|
1236
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<NeuDialogComponent, "neu-dialog", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "disableClose": { "alias": "disableClose"; "required": false; "isSignal": true; }; }, { "closed": "closed"; }, never, ["*", "[neu-dialog-footer]"], true, never>;
|
|
1237
|
+
}
|
|
1238
|
+
|
|
1239
|
+
/**
|
|
1240
|
+
* Directiva para definir el template de expansión de fila en NeuTable.
|
|
1241
|
+
*
|
|
1242
|
+
* Uso:
|
|
1243
|
+
* ```html
|
|
1244
|
+
* <neu-table [expandable]="true" [columns]="cols" [data]="rows">
|
|
1245
|
+
* <ng-template neuTableExpand let-row>
|
|
1246
|
+
* <div>{{ row.details }}</div>
|
|
1247
|
+
* </ng-template>
|
|
1248
|
+
* </neu-table>
|
|
1249
|
+
* ```
|
|
1250
|
+
*/
|
|
1251
|
+
declare class NeuTableExpandDirective {
|
|
1252
|
+
readonly templateRef: TemplateRef<{
|
|
1253
|
+
$implicit: Record<string, unknown>;
|
|
1254
|
+
}>;
|
|
1255
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuTableExpandDirective, never>;
|
|
1256
|
+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<NeuTableExpandDirective, "ng-template[neuTableExpand]", never, {}, {}, never, never, true, never>;
|
|
1257
|
+
}
|
|
1258
|
+
|
|
1259
|
+
type NeuTableBadgeVariant = 'primary' | 'success' | 'warning' | 'danger' | 'info' | 'default';
|
|
1260
|
+
interface NeuTableBadgeConfig {
|
|
1261
|
+
/** Etiqueta a mostrar (si omit, usa el valor bruto) */
|
|
1262
|
+
label?: string;
|
|
1263
|
+
variant: NeuTableBadgeVariant;
|
|
1264
|
+
}
|
|
1265
|
+
interface NeuTableColumn<T = Record<string, unknown>> {
|
|
1266
|
+
/** Clave del campo en el objeto de datos */
|
|
1267
|
+
key: string;
|
|
1268
|
+
/** Texto del encabezado de columna */
|
|
1269
|
+
header: string;
|
|
1270
|
+
/** Ancho fijo (CSS: '120px', '20%', etc.) */
|
|
1271
|
+
width?: string;
|
|
1272
|
+
/** Alineación del contenido */
|
|
1273
|
+
align?: 'left' | 'center' | 'right';
|
|
1274
|
+
/** Renderer personalizado: recibe la fila completa y devuelve texto */
|
|
1275
|
+
cell?: (row: T) => string;
|
|
1276
|
+
/** Clases CSS adicionales para las celdas de esta columna */
|
|
1277
|
+
cellClass?: string;
|
|
1278
|
+
/** Esta columna es ordenable (requiere [sortable]=true en la tabla) */
|
|
1279
|
+
sortable?: boolean;
|
|
1280
|
+
/**
|
|
1281
|
+
* Tipo de renderizado de la celda.
|
|
1282
|
+
* - `'text'` (default): texto plano
|
|
1283
|
+
* - `'badge'`: chip de color usando `badgeMap`
|
|
1284
|
+
*/
|
|
1285
|
+
type?: 'text' | 'badge';
|
|
1286
|
+
/**
|
|
1287
|
+
* Mapa valor → configuración de badge. Requiere `type: 'badge'`.
|
|
1288
|
+
* Ejemplo: `{ active: { label: 'Activo', variant: 'success' } }`
|
|
1289
|
+
*/
|
|
1290
|
+
badgeMap?: Record<string, NeuTableBadgeConfig>;
|
|
1291
|
+
/**
|
|
1292
|
+
* Template personalizado para la cabecera de esta columna.
|
|
1293
|
+
* Contexto de la plantilla: `{ $implicit: col }`.
|
|
1294
|
+
*
|
|
1295
|
+
* Ejemplo:
|
|
1296
|
+
* ```html
|
|
1297
|
+
* <ng-template #myHeader let-col>
|
|
1298
|
+
* <span class="custom-header">{{ col.header }}</span>
|
|
1299
|
+
* </ng-template>
|
|
1300
|
+
* <neu-table [columns]="[{ key: 'name', header: 'Nombre', headerTemplate: myHeader }]" ... />
|
|
1301
|
+
* ```
|
|
1302
|
+
*/
|
|
1303
|
+
headerTemplate?: TemplateRef<any>;
|
|
1304
|
+
}
|
|
1305
|
+
|
|
1306
|
+
type Row = Record<string, unknown>;
|
|
1307
|
+
/**
|
|
1308
|
+
* NeuralUI Table — Componente Estrella
|
|
1309
|
+
*
|
|
1310
|
+
* Tabla de datos con:
|
|
1311
|
+
* - Búsqueda/filtrado → ?q=...
|
|
1312
|
+
* - Paginación → ?page=...
|
|
1313
|
+
* - Ordenación → ?sort=col&sortDir=asc|desc
|
|
1314
|
+
* - Selección de filas (múltiple) opcional
|
|
1315
|
+
* - Skeleton de carga animado
|
|
1316
|
+
* - Scroll horizontal elegante en mobile (<400px)
|
|
1317
|
+
*
|
|
1318
|
+
* Uso básico:
|
|
1319
|
+
* <neu-table [columns]="cols" [data]="rows" />
|
|
1320
|
+
*
|
|
1321
|
+
* Múltiples tablas por página:
|
|
1322
|
+
* <neu-table pageParam="userPage" searchParam="userQ" sortParam="userSort" ... />
|
|
1323
|
+
*/
|
|
1324
|
+
declare class NeuTableComponent {
|
|
1325
|
+
private readonly urlState;
|
|
1326
|
+
readonly expandTemplate: _angular_core.Signal<NeuTableExpandDirective | undefined>;
|
|
1327
|
+
columns: _angular_core.InputSignal<NeuTableColumn<Record<string, unknown>>[]>;
|
|
1328
|
+
data: _angular_core.InputSignal<object[]>;
|
|
1329
|
+
pageSize: _angular_core.InputSignal<number>;
|
|
1330
|
+
loading: _angular_core.InputSignal<boolean>;
|
|
1331
|
+
title: _angular_core.InputSignal<string>;
|
|
1332
|
+
emptyMessage: _angular_core.InputSignal<string>;
|
|
1333
|
+
skeletonRows: _angular_core.InputSignal<number[]>;
|
|
1334
|
+
searchable: _angular_core.InputSignal<boolean>;
|
|
1335
|
+
searchPlaceholder: _angular_core.InputSignal<string>;
|
|
1336
|
+
exactMatchable: _angular_core.InputSignal<boolean>;
|
|
1337
|
+
exactMatchLabel: _angular_core.InputSignal<string>;
|
|
1338
|
+
/** Aria-label del input de búsqueda */
|
|
1339
|
+
searchAriaLabel: _angular_core.InputSignal<string>;
|
|
1340
|
+
/** Aria-label del botón de limpiar búsqueda */
|
|
1341
|
+
clearSearchAriaLabel: _angular_core.InputSignal<string>;
|
|
1342
|
+
/** Texto del botón que elimina el filtro activo */
|
|
1343
|
+
clearFilterLabel: _angular_core.InputSignal<string>;
|
|
1344
|
+
/** Aria-label del botón de página anterior */
|
|
1345
|
+
previousPageAriaLabel: _angular_core.InputSignal<string>;
|
|
1346
|
+
/** Aria-label del botón de página siguiente */
|
|
1347
|
+
nextPageAriaLabel: _angular_core.InputSignal<string>;
|
|
1348
|
+
sortable: _angular_core.InputSignal<boolean>;
|
|
1349
|
+
selectable: _angular_core.InputSignal<boolean>;
|
|
1350
|
+
expandable: _angular_core.InputSignal<boolean>;
|
|
1351
|
+
exportable: _angular_core.InputSignal<boolean>;
|
|
1352
|
+
exportFileName: _angular_core.InputSignal<string>;
|
|
1353
|
+
pageSizeOptions: _angular_core.InputSignal<number[]>;
|
|
1354
|
+
stickyHeader: _angular_core.InputSignal<boolean>;
|
|
1355
|
+
/** Clave del campo que identifica de forma única cada fila */
|
|
1356
|
+
rowKey: _angular_core.InputSignal<string>;
|
|
1357
|
+
pageParam: _angular_core.InputSignal<string>;
|
|
1358
|
+
searchParam: _angular_core.InputSignal<string>;
|
|
1359
|
+
sortParam: _angular_core.InputSignal<string>;
|
|
1360
|
+
sortDirParam: _angular_core.InputSignal<string>;
|
|
1361
|
+
rowSelectionChange: _angular_core.OutputEmitterRef<Row[]>;
|
|
1362
|
+
readonly currentPage: _angular_core.Signal<number>;
|
|
1363
|
+
readonly searchQuery: _angular_core.Signal<string>;
|
|
1364
|
+
readonly sortKey: _angular_core.Signal<string>;
|
|
1365
|
+
readonly sortDir: _angular_core.Signal<"desc" | "asc">;
|
|
1366
|
+
private readonly rows;
|
|
1367
|
+
readonly exactMatch: _angular_core.WritableSignal<boolean>;
|
|
1368
|
+
readonly filteredData: _angular_core.Signal<Row[]>;
|
|
1369
|
+
readonly sortedData: _angular_core.Signal<Row[]>;
|
|
1370
|
+
private readonly _dynamicPageSize;
|
|
1371
|
+
readonly effectivePageSize: _angular_core.Signal<number>;
|
|
1372
|
+
readonly totalPages: _angular_core.Signal<number>;
|
|
1373
|
+
readonly paginatedData: _angular_core.Signal<Row[]>;
|
|
1374
|
+
readonly pageNumbers: _angular_core.Signal<number[]>;
|
|
1375
|
+
readonly paginationInfo: _angular_core.Signal<string>;
|
|
1376
|
+
readonly totalColspan: _angular_core.Signal<number>;
|
|
1377
|
+
private readonly _expandedKeys;
|
|
1378
|
+
isRowExpanded(row: Row): boolean;
|
|
1379
|
+
toggleExpand(row: Row): void;
|
|
1380
|
+
private readonly _selectedKeys;
|
|
1381
|
+
readonly selectedCount: _angular_core.Signal<number>;
|
|
1382
|
+
readonly isAllSelected: _angular_core.Signal<boolean>;
|
|
1383
|
+
readonly isSomeSelected: _angular_core.Signal<boolean>;
|
|
1384
|
+
isRowSelected(row: Row): boolean;
|
|
1385
|
+
toggleRow(row: Row): void;
|
|
1386
|
+
toggleAll(): void;
|
|
1387
|
+
clearSelection(): void;
|
|
1388
|
+
private _emitSelection;
|
|
1389
|
+
goToPage(page: number): void;
|
|
1390
|
+
sortBy(key: string): void;
|
|
1391
|
+
onSearch(event: Event): void;
|
|
1392
|
+
clearSearch(): void;
|
|
1393
|
+
onPageSizeChange(event: Event): void;
|
|
1394
|
+
exportCsv(): void;
|
|
1395
|
+
getRowKey(row: Row): unknown;
|
|
1396
|
+
getCellValue(row: Row, col: NeuTableColumn): string;
|
|
1397
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuTableComponent, never>;
|
|
1398
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<NeuTableComponent, "neu-table", never, { "columns": { "alias": "columns"; "required": false; "isSignal": true; }; "data": { "alias": "data"; "required": false; "isSignal": true; }; "pageSize": { "alias": "pageSize"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "emptyMessage": { "alias": "emptyMessage"; "required": false; "isSignal": true; }; "skeletonRows": { "alias": "skeletonRows"; "required": false; "isSignal": true; }; "searchable": { "alias": "searchable"; "required": false; "isSignal": true; }; "searchPlaceholder": { "alias": "searchPlaceholder"; "required": false; "isSignal": true; }; "exactMatchable": { "alias": "exactMatchable"; "required": false; "isSignal": true; }; "exactMatchLabel": { "alias": "exactMatchLabel"; "required": false; "isSignal": true; }; "searchAriaLabel": { "alias": "searchAriaLabel"; "required": false; "isSignal": true; }; "clearSearchAriaLabel": { "alias": "clearSearchAriaLabel"; "required": false; "isSignal": true; }; "clearFilterLabel": { "alias": "clearFilterLabel"; "required": false; "isSignal": true; }; "previousPageAriaLabel": { "alias": "previousPageAriaLabel"; "required": false; "isSignal": true; }; "nextPageAriaLabel": { "alias": "nextPageAriaLabel"; "required": false; "isSignal": true; }; "sortable": { "alias": "sortable"; "required": false; "isSignal": true; }; "selectable": { "alias": "selectable"; "required": false; "isSignal": true; }; "expandable": { "alias": "expandable"; "required": false; "isSignal": true; }; "exportable": { "alias": "exportable"; "required": false; "isSignal": true; }; "exportFileName": { "alias": "exportFileName"; "required": false; "isSignal": true; }; "pageSizeOptions": { "alias": "pageSizeOptions"; "required": false; "isSignal": true; }; "stickyHeader": { "alias": "stickyHeader"; "required": false; "isSignal": true; }; "rowKey": { "alias": "rowKey"; "required": false; "isSignal": true; }; "pageParam": { "alias": "pageParam"; "required": false; "isSignal": true; }; "searchParam": { "alias": "searchParam"; "required": false; "isSignal": true; }; "sortParam": { "alias": "sortParam"; "required": false; "isSignal": true; }; "sortDirParam": { "alias": "sortDirParam"; "required": false; "isSignal": true; }; }, { "rowSelectionChange": "rowSelectionChange"; }, ["expandTemplate"], never, true, never>;
|
|
1399
|
+
}
|
|
1400
|
+
|
|
1401
|
+
type NeuAvatarSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';
|
|
1402
|
+
type NeuAvatarShape = 'circle' | 'square';
|
|
1403
|
+
type NeuAvatarColor = 'blue' | 'violet' | 'green' | 'amber' | 'red' | 'slate';
|
|
1404
|
+
type NeuAvatarStatus = 'online' | 'offline' | 'busy' | 'away' | '';
|
|
1405
|
+
/**
|
|
1406
|
+
* NeuAvatar — Avatar circular o cuadrado para foto o iniciales.
|
|
1407
|
+
*
|
|
1408
|
+
* Uso:
|
|
1409
|
+
* <neu-avatar name="Pedro Moreno" />
|
|
1410
|
+
* <neu-avatar src="/assets/avatar.jpg" alt="Pedro" size="lg" />
|
|
1411
|
+
* <neu-avatar name="PM" size="lg" color="blue" status="online" />
|
|
1412
|
+
*/
|
|
1413
|
+
declare class NeuAvatarComponent {
|
|
1414
|
+
/** URL de la imagen. Si falla la carga, muestra las iniciales. */
|
|
1415
|
+
src: _angular_core.InputSignal<string>;
|
|
1416
|
+
/** Texto alternativo de la imagen. */
|
|
1417
|
+
alt: _angular_core.InputSignal<string>;
|
|
1418
|
+
/** Nombre completo — se usan las iniciales como fallback. */
|
|
1419
|
+
name: _angular_core.InputSignal<string>;
|
|
1420
|
+
/** Tamaño: xs (24) | sm (32) | md (40) | lg (48) | xl (64). Por defecto 'md'. */
|
|
1421
|
+
size: _angular_core.InputSignal<NeuAvatarSize>;
|
|
1422
|
+
/** Forma: 'circle' (default) o 'square'. */
|
|
1423
|
+
shape: _angular_core.InputSignal<NeuAvatarShape>;
|
|
1424
|
+
/** Color de fondo para iniciales. */
|
|
1425
|
+
color: _angular_core.InputSignal<NeuAvatarColor>;
|
|
1426
|
+
/** Indicador de presencia. */
|
|
1427
|
+
status: _angular_core.InputSignal<NeuAvatarStatus>;
|
|
1428
|
+
/** @internal Imagen fallida */
|
|
1429
|
+
protected readonly imgError: _angular_core.WritableSignal<boolean>;
|
|
1430
|
+
protected readonly initials: _angular_core.Signal<string>;
|
|
1431
|
+
protected readonly hostClasses: _angular_core.Signal<string[]>;
|
|
1432
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuAvatarComponent, never>;
|
|
1433
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<NeuAvatarComponent, "neu-avatar", never, { "src": { "alias": "src"; "required": false; "isSignal": true; }; "alt": { "alias": "alt"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "shape": { "alias": "shape"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "status": { "alias": "status"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
1434
|
+
}
|
|
1435
|
+
|
|
1436
|
+
type NeuBadgeVariant = 'default' | 'success' | 'info' | 'warning' | 'danger';
|
|
1437
|
+
type NeuBadgeSize = 'sm' | 'md';
|
|
1438
|
+
/**
|
|
1439
|
+
* NeuralUI Badge Component
|
|
1440
|
+
*
|
|
1441
|
+
* Etiqueta de estado compacta y semántica.
|
|
1442
|
+
*
|
|
1443
|
+
* Uso: <neu-badge variant="success">Activo</neu-badge>
|
|
1444
|
+
* <neu-badge variant="danger" [dot]="true">Error</neu-badge>
|
|
1445
|
+
*/
|
|
1446
|
+
declare class NeuBadgeComponent {
|
|
1447
|
+
/** Variante semántica */
|
|
1448
|
+
variant: _angular_core.InputSignal<NeuBadgeVariant>;
|
|
1449
|
+
/** Tamaño */
|
|
1450
|
+
size: _angular_core.InputSignal<NeuBadgeSize>;
|
|
1451
|
+
/** Muestra un punto de color a la izquierda */
|
|
1452
|
+
dot: _angular_core.InputSignal<boolean>;
|
|
1453
|
+
/** Estilo con solo borde (outline) sin relleno */
|
|
1454
|
+
outline: _angular_core.InputSignal<boolean>;
|
|
1455
|
+
/** Estilo completamente redondeado (pill) */
|
|
1456
|
+
pill: _angular_core.InputSignal<boolean>;
|
|
1457
|
+
readonly hostClasses: _angular_core.Signal<{
|
|
1458
|
+
[x: string]: boolean;
|
|
1459
|
+
'neu-badge': boolean;
|
|
1460
|
+
'neu-badge--outline': boolean;
|
|
1461
|
+
'neu-badge--pill': boolean;
|
|
1462
|
+
'neu-badge--dot': boolean;
|
|
1463
|
+
}>;
|
|
1464
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuBadgeComponent, never>;
|
|
1465
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<NeuBadgeComponent, "neu-badge", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "dot": { "alias": "dot"; "required": false; "isSignal": true; }; "outline": { "alias": "outline"; "required": false; "isSignal": true; }; "pill": { "alias": "pill"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
|
|
1466
|
+
}
|
|
1467
|
+
|
|
1468
|
+
type NeuChartType = 'line' | 'area' | 'bar' | 'bar-stacked' | 'bar-horizontal' | 'bar-horizontal-stacked' | 'pareto' | 'donut' | 'pie' | 'radialBar';
|
|
1469
|
+
interface NeuChartSeries {
|
|
1470
|
+
name: string;
|
|
1471
|
+
data: number[];
|
|
1472
|
+
}
|
|
1473
|
+
/**
|
|
1474
|
+
* NeuChart — Wrapper reactivo de ApexCharts con estética Neural-Blue.
|
|
1475
|
+
*
|
|
1476
|
+
* Tipos soportados:
|
|
1477
|
+
* line · area · bar · bar-stacked · bar-horizontal · bar-horizontal-stacked · pareto · donut · pie · radialBar
|
|
1478
|
+
*
|
|
1479
|
+
* Uso:
|
|
1480
|
+
* <neu-chart
|
|
1481
|
+
* type="bar-stacked"
|
|
1482
|
+
* [series]="series()"
|
|
1483
|
+
* [categories]="months()"
|
|
1484
|
+
* height="280"
|
|
1485
|
+
* />
|
|
1486
|
+
*/
|
|
1487
|
+
declare class NeuChartComponent {
|
|
1488
|
+
/** Tipo de gráfica. */
|
|
1489
|
+
type: _angular_core.InputSignal<NeuChartType>;
|
|
1490
|
+
/** Series para gráficas de ejes (line, area, bar, pareto…). */
|
|
1491
|
+
series: _angular_core.InputSignal<NeuChartSeries[]>;
|
|
1492
|
+
/** Series para gráficas sin ejes (donut, pie). */
|
|
1493
|
+
pieSeries: _angular_core.InputSignal<number[]>;
|
|
1494
|
+
/** Etiquetas del eje X. */
|
|
1495
|
+
categories: _angular_core.InputSignal<string[]>;
|
|
1496
|
+
/** Etiquetas para donut/pie. */
|
|
1497
|
+
labels: _angular_core.InputSignal<string[]>;
|
|
1498
|
+
/** Altura en px. */
|
|
1499
|
+
height: _angular_core.InputSignal<number>;
|
|
1500
|
+
/** Colores custom. Si no se proveen, usa la paleta Neural-Blue. */
|
|
1501
|
+
colors: _angular_core.InputSignal<string[]>;
|
|
1502
|
+
/** Muestra/oculta las etiquetas de datos. */
|
|
1503
|
+
showDataLabels: _angular_core.InputSignal<boolean>;
|
|
1504
|
+
/** Título de la gráfica. */
|
|
1505
|
+
title: _angular_core.InputSignal<string>;
|
|
1506
|
+
private get _isBar();
|
|
1507
|
+
private get _isStacked();
|
|
1508
|
+
private get _isHorizontal();
|
|
1509
|
+
protected readonly resolvedColors: _angular_core.Signal<string[]>;
|
|
1510
|
+
protected readonly resolvedSeries: _angular_core.Signal<any>;
|
|
1511
|
+
protected readonly chartConfig: _angular_core.Signal<{
|
|
1512
|
+
type: any;
|
|
1513
|
+
height: number;
|
|
1514
|
+
stacked: boolean;
|
|
1515
|
+
fontFamily: string;
|
|
1516
|
+
foreColor: string;
|
|
1517
|
+
background: string;
|
|
1518
|
+
toolbar: {
|
|
1519
|
+
show: boolean;
|
|
1520
|
+
};
|
|
1521
|
+
sparkline: {
|
|
1522
|
+
enabled: boolean;
|
|
1523
|
+
};
|
|
1524
|
+
zoom: {
|
|
1525
|
+
enabled: boolean;
|
|
1526
|
+
};
|
|
1527
|
+
animations: {
|
|
1528
|
+
enabled: boolean;
|
|
1529
|
+
speed: number;
|
|
1530
|
+
};
|
|
1531
|
+
}>;
|
|
1532
|
+
protected readonly xaxisConfig: _angular_core.Signal<{
|
|
1533
|
+
categories: string[];
|
|
1534
|
+
labels: {
|
|
1535
|
+
style: {
|
|
1536
|
+
fontSize: string;
|
|
1537
|
+
fontFamily: string;
|
|
1538
|
+
colors: string;
|
|
1539
|
+
};
|
|
1540
|
+
};
|
|
1541
|
+
axisBorder: {
|
|
1542
|
+
show: boolean;
|
|
1543
|
+
};
|
|
1544
|
+
axisTicks: {
|
|
1545
|
+
show: boolean;
|
|
1546
|
+
};
|
|
1547
|
+
}>;
|
|
1548
|
+
protected readonly yaxisConfig: _angular_core.Signal<any>;
|
|
1549
|
+
protected readonly strokeConfig: _angular_core.Signal<{
|
|
1550
|
+
show: boolean;
|
|
1551
|
+
width?: undefined;
|
|
1552
|
+
curve?: undefined;
|
|
1553
|
+
lineCap?: undefined;
|
|
1554
|
+
} | {
|
|
1555
|
+
show: boolean;
|
|
1556
|
+
width: number[];
|
|
1557
|
+
curve: any;
|
|
1558
|
+
lineCap: "round";
|
|
1559
|
+
} | {
|
|
1560
|
+
curve: "smooth";
|
|
1561
|
+
width: number;
|
|
1562
|
+
show?: undefined;
|
|
1563
|
+
lineCap?: undefined;
|
|
1564
|
+
}>;
|
|
1565
|
+
protected readonly fillConfig: _angular_core.Signal<{
|
|
1566
|
+
type: "gradient";
|
|
1567
|
+
gradient: {
|
|
1568
|
+
shadeIntensity: number;
|
|
1569
|
+
opacityFrom: number;
|
|
1570
|
+
opacityTo: number;
|
|
1571
|
+
stops: number[];
|
|
1572
|
+
};
|
|
1573
|
+
opacity?: undefined;
|
|
1574
|
+
} | {
|
|
1575
|
+
opacity: number;
|
|
1576
|
+
type?: undefined;
|
|
1577
|
+
gradient?: undefined;
|
|
1578
|
+
}>;
|
|
1579
|
+
protected readonly dataLabelsConfig: _angular_core.Signal<{
|
|
1580
|
+
enabled: boolean;
|
|
1581
|
+
style: {
|
|
1582
|
+
fontSize: string;
|
|
1583
|
+
fontFamily: string;
|
|
1584
|
+
};
|
|
1585
|
+
}>;
|
|
1586
|
+
protected readonly gridConfig: _angular_core.Signal<{
|
|
1587
|
+
borderColor: string;
|
|
1588
|
+
strokeDashArray: number;
|
|
1589
|
+
xaxis: {
|
|
1590
|
+
lines: {
|
|
1591
|
+
show: boolean;
|
|
1592
|
+
};
|
|
1593
|
+
};
|
|
1594
|
+
yaxis: {
|
|
1595
|
+
lines: {
|
|
1596
|
+
show: boolean;
|
|
1597
|
+
};
|
|
1598
|
+
};
|
|
1599
|
+
padding: {
|
|
1600
|
+
left: number;
|
|
1601
|
+
right: number;
|
|
1602
|
+
};
|
|
1603
|
+
}>;
|
|
1604
|
+
protected readonly legendConfig: _angular_core.Signal<{
|
|
1605
|
+
position: "bottom";
|
|
1606
|
+
fontFamily: string;
|
|
1607
|
+
fontSize: string;
|
|
1608
|
+
markers: {
|
|
1609
|
+
size: number;
|
|
1610
|
+
};
|
|
1611
|
+
itemMargin: {
|
|
1612
|
+
horizontal: number;
|
|
1613
|
+
};
|
|
1614
|
+
}>;
|
|
1615
|
+
protected readonly tooltipConfig: _angular_core.Signal<{
|
|
1616
|
+
theme: "light";
|
|
1617
|
+
style: {
|
|
1618
|
+
fontSize: string;
|
|
1619
|
+
fontFamily: string;
|
|
1620
|
+
};
|
|
1621
|
+
} | {
|
|
1622
|
+
y: {
|
|
1623
|
+
formatter: (v: number) => string;
|
|
1624
|
+
}[];
|
|
1625
|
+
theme: "light";
|
|
1626
|
+
style: {
|
|
1627
|
+
fontSize: string;
|
|
1628
|
+
fontFamily: string;
|
|
1629
|
+
};
|
|
1630
|
+
}>;
|
|
1631
|
+
protected readonly plotOptionsConfig: _angular_core.Signal<{
|
|
1632
|
+
pie: {
|
|
1633
|
+
donut: {
|
|
1634
|
+
size: string;
|
|
1635
|
+
};
|
|
1636
|
+
};
|
|
1637
|
+
bar?: undefined;
|
|
1638
|
+
} | {
|
|
1639
|
+
bar: {
|
|
1640
|
+
horizontal: boolean;
|
|
1641
|
+
borderRadius: number;
|
|
1642
|
+
columnWidth: string;
|
|
1643
|
+
barHeight: string;
|
|
1644
|
+
dataLabels: {
|
|
1645
|
+
total: {
|
|
1646
|
+
enabled: boolean;
|
|
1647
|
+
};
|
|
1648
|
+
};
|
|
1649
|
+
};
|
|
1650
|
+
pie?: undefined;
|
|
1651
|
+
} | {
|
|
1652
|
+
pie?: undefined;
|
|
1653
|
+
bar?: undefined;
|
|
1654
|
+
}>;
|
|
1655
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuChartComponent, never>;
|
|
1656
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<NeuChartComponent, "neu-chart", never, { "type": { "alias": "type"; "required": false; "isSignal": true; }; "series": { "alias": "series"; "required": false; "isSignal": true; }; "pieSeries": { "alias": "pieSeries"; "required": false; "isSignal": true; }; "categories": { "alias": "categories"; "required": false; "isSignal": true; }; "labels": { "alias": "labels"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "colors": { "alias": "colors"; "required": false; "isSignal": true; }; "showDataLabels": { "alias": "showDataLabels"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
1657
|
+
}
|
|
1658
|
+
|
|
1659
|
+
type NeuChipVariant = 'default' | 'primary' | 'success' | 'warning' | 'danger';
|
|
1660
|
+
type NeuChipSize = 'sm' | 'md';
|
|
1661
|
+
/**
|
|
1662
|
+
* NeuralUI Chip Component
|
|
1663
|
+
*
|
|
1664
|
+
* Etiqueta compacta seleccionable y/o eliminable. Ideal para filtros,
|
|
1665
|
+
* listas de tags y multiselección visual.
|
|
1666
|
+
*
|
|
1667
|
+
* Uso:
|
|
1668
|
+
* <neu-chip>Angular</neu-chip>
|
|
1669
|
+
* <neu-chip [removable]="true" (removed)="onRemove()">CSS</neu-chip>
|
|
1670
|
+
* <neu-chip [selected]="true" (selectedChange)="toggle()">TypeScript</neu-chip>
|
|
1671
|
+
*/
|
|
1672
|
+
declare class NeuChipComponent {
|
|
1673
|
+
/** Variante de color */
|
|
1674
|
+
variant: _angular_core.InputSignal<NeuChipVariant>;
|
|
1675
|
+
/** Tamaño */
|
|
1676
|
+
size: _angular_core.InputSignal<NeuChipSize>;
|
|
1677
|
+
/** Estado seleccionado */
|
|
1678
|
+
selected: _angular_core.InputSignal<boolean>;
|
|
1679
|
+
/** Muestra botón de cierre */
|
|
1680
|
+
removable: _angular_core.InputSignal<boolean>;
|
|
1681
|
+
/** Deshabilitado */
|
|
1682
|
+
disabled: _angular_core.InputSignal<boolean>;
|
|
1683
|
+
/** Aria-label del botón de eliminar */
|
|
1684
|
+
removeAriaLabel: _angular_core.InputSignal<string>;
|
|
1685
|
+
/** Emite al hacer clic o pulsar espacio/enter */
|
|
1686
|
+
selectedChange: _angular_core.OutputEmitterRef<boolean>;
|
|
1687
|
+
/** Emite al pulsar el botón de cierre */
|
|
1688
|
+
removed: _angular_core.OutputEmitterRef<void>;
|
|
1689
|
+
readonly hostClasses: _angular_core.Signal<{
|
|
1690
|
+
[x: string]: boolean;
|
|
1691
|
+
'neu-chip': boolean;
|
|
1692
|
+
'neu-chip--selected': boolean;
|
|
1693
|
+
'neu-chip--removable': boolean;
|
|
1694
|
+
'neu-chip--disabled': boolean;
|
|
1695
|
+
}>;
|
|
1696
|
+
onToggle(): void;
|
|
1697
|
+
onRemove(): void;
|
|
1698
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuChipComponent, never>;
|
|
1699
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<NeuChipComponent, "neu-chip", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "selected": { "alias": "selected"; "required": false; "isSignal": true; }; "removable": { "alias": "removable"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "removeAriaLabel": { "alias": "removeAriaLabel"; "required": false; "isSignal": true; }; }, { "selectedChange": "selectedChange"; "removed": "removed"; }, never, ["*"], true, never>;
|
|
1700
|
+
}
|
|
1701
|
+
|
|
1702
|
+
/**
|
|
1703
|
+
* NeuralUI Code Block
|
|
1704
|
+
*
|
|
1705
|
+
* Bloque de código con estilo editor oscuro (Tokyo Night).
|
|
1706
|
+
* Incluye botón de copiar al portapapeles, badge del lenguaje
|
|
1707
|
+
* y soporte para resaltado futuro con ngx-highlightjs.
|
|
1708
|
+
*
|
|
1709
|
+
* Uso:
|
|
1710
|
+
* <neu-code-block [code]="snippet" lang="TypeScript" />
|
|
1711
|
+
*
|
|
1712
|
+
* Con ngx-highlightjs instalado, envuelve el <pre> con
|
|
1713
|
+
* [highlight]="code" para resaltado automático.
|
|
1714
|
+
*/
|
|
1715
|
+
declare class NeuCodeBlockComponent {
|
|
1716
|
+
private readonly doc;
|
|
1717
|
+
/** Código fuente a mostrar */
|
|
1718
|
+
code: _angular_core.InputSignal<string>;
|
|
1719
|
+
/** Nombre del lenguaje (decorativo) */
|
|
1720
|
+
lang: _angular_core.InputSignal<string>;
|
|
1721
|
+
/** Texto del botón cuando no se ha copiado */
|
|
1722
|
+
copyLabel: _angular_core.InputSignal<string>;
|
|
1723
|
+
/** Texto del botón tras copiar */
|
|
1724
|
+
copiedLabel: _angular_core.InputSignal<string>;
|
|
1725
|
+
/** Aria-label del botón copiar */
|
|
1726
|
+
copyAriaLabel: _angular_core.InputSignal<string>;
|
|
1727
|
+
/** Aria-label del botón tras copiar */
|
|
1728
|
+
copiedAriaLabel: _angular_core.InputSignal<string>;
|
|
1729
|
+
protected readonly copied: _angular_core.WritableSignal<boolean>;
|
|
1730
|
+
private _copyTimer?;
|
|
1731
|
+
copy(): void;
|
|
1732
|
+
private _markCopied;
|
|
1733
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuCodeBlockComponent, never>;
|
|
1734
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<NeuCodeBlockComponent, "neu-code-block", never, { "code": { "alias": "code"; "required": false; "isSignal": true; }; "lang": { "alias": "lang"; "required": false; "isSignal": true; }; "copyLabel": { "alias": "copyLabel"; "required": false; "isSignal": true; }; "copiedLabel": { "alias": "copiedLabel"; "required": false; "isSignal": true; }; "copyAriaLabel": { "alias": "copyAriaLabel"; "required": false; "isSignal": true; }; "copiedAriaLabel": { "alias": "copiedAriaLabel"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
1735
|
+
}
|
|
1736
|
+
|
|
1737
|
+
/**
|
|
1738
|
+
* NeuEmptyState — Estado vacío con icono Lucide, título, descripción y acción.
|
|
1739
|
+
*
|
|
1740
|
+
* Uso:
|
|
1741
|
+
* <neu-empty-state
|
|
1742
|
+
* icon="lucideInbox"
|
|
1743
|
+
* title="Sin resultados"
|
|
1744
|
+
* description="Prueba con otros filtros."
|
|
1745
|
+
* actionLabel="Limpiar filtros"
|
|
1746
|
+
* (action)="clearFilters()"
|
|
1747
|
+
* />
|
|
1748
|
+
*/
|
|
1749
|
+
declare class NeuEmptyStateComponent {
|
|
1750
|
+
/** Nombre del icono Lucide registrado con provideIcons(). */
|
|
1751
|
+
icon: _angular_core.InputSignal<string>;
|
|
1752
|
+
/** Tamaño del icono. Por defecto 3rem. */
|
|
1753
|
+
iconSize: _angular_core.InputSignal<string>;
|
|
1754
|
+
/** Título principal del estado vacío. */
|
|
1755
|
+
title: _angular_core.InputSignal<string>;
|
|
1756
|
+
/** Descripción secundaria opcional. */
|
|
1757
|
+
description: _angular_core.InputSignal<string>;
|
|
1758
|
+
/** Texto del botón de acción. Si está vacío, no se muestra el botón. */
|
|
1759
|
+
actionLabel: _angular_core.InputSignal<string>;
|
|
1760
|
+
/** Emite cuando el usuario hace clic en el botón de acción. */
|
|
1761
|
+
action: _angular_core.OutputEmitterRef<void>;
|
|
1762
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuEmptyStateComponent, never>;
|
|
1763
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<NeuEmptyStateComponent, "neu-empty-state", never, { "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "iconSize": { "alias": "iconSize"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "actionLabel": { "alias": "actionLabel"; "required": false; "isSignal": true; }; }, { "action": "action"; }, never, never, true, never>;
|
|
1764
|
+
}
|
|
1765
|
+
|
|
1766
|
+
/**
|
|
1767
|
+
* NeuIconComponent — Wrapper delgado sobre NgIcon de @ng-icons/core
|
|
1768
|
+
*
|
|
1769
|
+
* Hereda el color del elemento padre mediante `color: currentColor`.
|
|
1770
|
+
* El grosor del trazo se controla con la variable CSS `--ng-icon__stroke-width`
|
|
1771
|
+
* que viene configurada globalmente vía `provideNgIconsConfig`.
|
|
1772
|
+
*
|
|
1773
|
+
* Uso básico:
|
|
1774
|
+
* <neu-icon name="lucideX" />
|
|
1775
|
+
* <neu-icon name="lucideAlertCircle" size="1rem" />
|
|
1776
|
+
*/
|
|
1777
|
+
declare class NeuIconComponent {
|
|
1778
|
+
/** Nombre del icono registrado con provideIcons() */
|
|
1779
|
+
name: _angular_core.InputSignal<string>;
|
|
1780
|
+
/**
|
|
1781
|
+
* Grosor del trazo. Default '2' para estética fina y técnica.
|
|
1782
|
+
* Puede sobrescribirse por instancia.
|
|
1783
|
+
*/
|
|
1784
|
+
strokeWidth: _angular_core.InputSignal<string>;
|
|
1785
|
+
/**
|
|
1786
|
+
* Tamaño del icono. Acepta cualquier unidad CSS válida.
|
|
1787
|
+
* Si no se especifica, usa la variable CSS `--neu-icon-size` (1.25rem por defecto).
|
|
1788
|
+
*/
|
|
1789
|
+
size: _angular_core.InputSignal<string>;
|
|
1790
|
+
/** Tamaño resuelto: usa el input `size` o cae al token CSS. */
|
|
1791
|
+
readonly resolvedSize: _angular_core.Signal<string>;
|
|
1792
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuIconComponent, never>;
|
|
1793
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<NeuIconComponent, "neu-icon", never, { "name": { "alias": "name"; "required": true; "isSignal": true; }; "strokeWidth": { "alias": "strokeWidth"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
1794
|
+
}
|
|
1795
|
+
|
|
1796
|
+
type NeuProgressVariant = 'primary' | 'success' | 'warning' | 'danger';
|
|
1797
|
+
/**
|
|
1798
|
+
* NeuralUI ProgressBar Component
|
|
1799
|
+
*
|
|
1800
|
+
* Barra de progreso accesible con valor, etiqueta y variantes semánticas.
|
|
1801
|
+
* Soporte para modo indeterminado (animación continua).
|
|
1802
|
+
*
|
|
1803
|
+
* Uso:
|
|
1804
|
+
* <neu-progress-bar [value]="75" />
|
|
1805
|
+
* <neu-progress-bar [value]="75" label="Cargando..." variant="success" [showValue]="true" />
|
|
1806
|
+
* <neu-progress-bar [indeterminate]="true" />
|
|
1807
|
+
*/
|
|
1808
|
+
declare class NeuProgressBarComponent {
|
|
1809
|
+
/** Valor de 0 a 100 */
|
|
1810
|
+
value: _angular_core.InputSignal<number>;
|
|
1811
|
+
/** Variante de color */
|
|
1812
|
+
variant: _angular_core.InputSignal<NeuProgressVariant>;
|
|
1813
|
+
/** Etiqueta descriptiva sobre la barra */
|
|
1814
|
+
label: _angular_core.InputSignal<string>;
|
|
1815
|
+
/** Muestra el % a la derecha */
|
|
1816
|
+
showValue: _angular_core.InputSignal<boolean>;
|
|
1817
|
+
/** Modo indeterminado (animación continua) */
|
|
1818
|
+
indeterminate: _angular_core.InputSignal<boolean>;
|
|
1819
|
+
/** Altura de la barra */
|
|
1820
|
+
size: _angular_core.InputSignal<"sm" | "md" | "lg">;
|
|
1821
|
+
readonly clampedValue: _angular_core.Signal<number>;
|
|
1822
|
+
readonly hostClasses: _angular_core.Signal<string>;
|
|
1823
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuProgressBarComponent, never>;
|
|
1824
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<NeuProgressBarComponent, "neu-progress-bar", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "showValue": { "alias": "showValue"; "required": false; "isSignal": true; }; "indeterminate": { "alias": "indeterminate"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
1825
|
+
}
|
|
1826
|
+
|
|
1827
|
+
/**
|
|
1828
|
+
* NeuralUI Rating Component
|
|
1829
|
+
*
|
|
1830
|
+
* Selector de valoración con estrellas (o icono personalizable).
|
|
1831
|
+
* Soporta valores medios (half-star) y modo solo-lectura.
|
|
1832
|
+
*
|
|
1833
|
+
* Uso:
|
|
1834
|
+
* <neu-rating [value]="rating" (valueChange)="rating = $event" />
|
|
1835
|
+
* <neu-rating [value]="4.5" [readonly]="true" />
|
|
1836
|
+
*/
|
|
1837
|
+
declare class NeuRatingComponent {
|
|
1838
|
+
protected readonly Math: Math;
|
|
1839
|
+
/** Valor actual (1 a stars) */
|
|
1840
|
+
value: _angular_core.InputSignal<number>;
|
|
1841
|
+
/** Número de estrellas */
|
|
1842
|
+
stars: _angular_core.InputSignal<number>;
|
|
1843
|
+
/** Modo solo lectura */
|
|
1844
|
+
readonly: _angular_core.InputSignal<boolean>;
|
|
1845
|
+
/** Emite el nuevo valor al seleccionar */
|
|
1846
|
+
valueChange: _angular_core.OutputEmitterRef<number>;
|
|
1847
|
+
protected readonly hovered: _angular_core.WritableSignal<number | null>;
|
|
1848
|
+
readonly starsArray: _angular_core.Signal<number[]>;
|
|
1849
|
+
onHover(i: number): void;
|
|
1850
|
+
onLeave(): void;
|
|
1851
|
+
select(i: number): void;
|
|
1852
|
+
isInteger(n: number): boolean;
|
|
1853
|
+
getFill(i: number): string;
|
|
1854
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuRatingComponent, never>;
|
|
1855
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<NeuRatingComponent, "neu-rating", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "stars": { "alias": "stars"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; }, never, never, true, never>;
|
|
1856
|
+
}
|
|
1857
|
+
|
|
1858
|
+
/**
|
|
1859
|
+
* NeuralUI Skeleton Component
|
|
1860
|
+
*
|
|
1861
|
+
* Placeholder animado para simular la carga de contenido.
|
|
1862
|
+
*
|
|
1863
|
+
* Uso:
|
|
1864
|
+
* <neu-skeleton width="100%" height="20px" />
|
|
1865
|
+
* <neu-skeleton variant="circle" width="40px" height="40px" />
|
|
1866
|
+
* <neu-skeleton variant="text" />
|
|
1867
|
+
*/
|
|
1868
|
+
declare class NeuSkeletonComponent {
|
|
1869
|
+
readonly variant: _angular_core.InputSignal<"text" | "circle" | "rect">;
|
|
1870
|
+
readonly width: _angular_core.InputSignal<string>;
|
|
1871
|
+
readonly height: _angular_core.InputSignal<string>;
|
|
1872
|
+
readonly borderRadius: _angular_core.InputSignal<string>;
|
|
1873
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuSkeletonComponent, never>;
|
|
1874
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<NeuSkeletonComponent, "neu-skeleton", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "borderRadius": { "alias": "borderRadius"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
1875
|
+
}
|
|
1876
|
+
|
|
1877
|
+
type NeuSpinnerSeverity = 'primary' | 'success' | 'warning' | 'danger' | 'info';
|
|
1878
|
+
/**
|
|
1879
|
+
* NeuralUI Spinner Component
|
|
1880
|
+
*
|
|
1881
|
+
* Indicador de carga circular animado, similar al ProgressSpinner de PrimeNG.
|
|
1882
|
+
* Permite personalizar color via severity o color CSS directo.
|
|
1883
|
+
*
|
|
1884
|
+
* Uso básico:
|
|
1885
|
+
* <neu-spinner />
|
|
1886
|
+
*
|
|
1887
|
+
* Con severity:
|
|
1888
|
+
* <neu-spinner severity="success" size="48px" />
|
|
1889
|
+
*
|
|
1890
|
+
* Con color personalizado:
|
|
1891
|
+
* <neu-spinner color="#ff6b35" strokeWidth="6" />
|
|
1892
|
+
*/
|
|
1893
|
+
declare class NeuSpinnerComponent {
|
|
1894
|
+
/** Variante de color semántica */
|
|
1895
|
+
severity: _angular_core.InputSignal<NeuSpinnerSeverity>;
|
|
1896
|
+
/** Color CSS directo — sobreescribe severity */
|
|
1897
|
+
color: _angular_core.InputSignal<string>;
|
|
1898
|
+
/** Grosor del trazo SVG (unidades SVG) */
|
|
1899
|
+
strokeWidth: _angular_core.InputSignal<string>;
|
|
1900
|
+
/** Tamaño del spinner (CSS: '40px', '2rem', etc.) */
|
|
1901
|
+
size: _angular_core.InputSignal<string>;
|
|
1902
|
+
/** Duración de la animación de rotación */
|
|
1903
|
+
animationDuration: _angular_core.InputSignal<string>;
|
|
1904
|
+
/** Texto accesible para lectores de pantalla */
|
|
1905
|
+
ariaLabel: _angular_core.InputSignal<string>;
|
|
1906
|
+
readonly _severityColor: _angular_core.Signal<string>;
|
|
1907
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuSpinnerComponent, never>;
|
|
1908
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<NeuSpinnerComponent, "neu-spinner", never, { "severity": { "alias": "severity"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "strokeWidth": { "alias": "strokeWidth"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "animationDuration": { "alias": "animationDuration"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
1909
|
+
}
|
|
1910
|
+
|
|
1911
|
+
interface NeuSplitButtonAction {
|
|
1912
|
+
/** Identificador único de la acción */
|
|
1913
|
+
id: string;
|
|
1914
|
+
/** Texto visible */
|
|
1915
|
+
label: string;
|
|
1916
|
+
/** Icono opcional (SVG string o nombre) */
|
|
1917
|
+
icon?: string;
|
|
1918
|
+
/** Deshabilita esta acción individualmente */
|
|
1919
|
+
disabled?: boolean;
|
|
1920
|
+
/** Separador visual encima de este item */
|
|
1921
|
+
divider?: boolean;
|
|
1922
|
+
}
|
|
1923
|
+
/**
|
|
1924
|
+
* NeuralUI SplitButton Component
|
|
1925
|
+
*
|
|
1926
|
+
* Botón principal con un dropdown de acciones adicionales.
|
|
1927
|
+
*
|
|
1928
|
+
* Uso:
|
|
1929
|
+
* <neu-split-button
|
|
1930
|
+
* label="Guardar"
|
|
1931
|
+
* [actions]="actions"
|
|
1932
|
+
* (primaryClick)="save()"
|
|
1933
|
+
* (actionClick)="onAction($event)"
|
|
1934
|
+
* />
|
|
1935
|
+
*/
|
|
1936
|
+
declare class NeuSplitButtonComponent {
|
|
1937
|
+
private readonly el;
|
|
1938
|
+
/** Texto del botón principal */
|
|
1939
|
+
label: _angular_core.InputSignal<string>;
|
|
1940
|
+
/** Variante visual */
|
|
1941
|
+
variant: _angular_core.InputSignal<NeuButtonVariant>;
|
|
1942
|
+
/** Tamaño */
|
|
1943
|
+
size: _angular_core.InputSignal<NeuButtonSize>;
|
|
1944
|
+
/** Deshabilita todo el componente */
|
|
1945
|
+
disabled: _angular_core.InputSignal<boolean>;
|
|
1946
|
+
/** Muestra spinner en el botón principal */
|
|
1947
|
+
loading: _angular_core.InputSignal<boolean>;
|
|
1948
|
+
/** Acciones del dropdown */
|
|
1949
|
+
actions: _angular_core.InputSignal<NeuSplitButtonAction[]>;
|
|
1950
|
+
/** Aria-label del botón de desplegable */
|
|
1951
|
+
moreActionsAriaLabel: _angular_core.InputSignal<string>;
|
|
1952
|
+
/** Aria-label del menú desplegable */
|
|
1953
|
+
actionsAriaLabel: _angular_core.InputSignal<string>;
|
|
1954
|
+
/** Emite al hacer click en el botón principal */
|
|
1955
|
+
primaryClick: _angular_core.OutputEmitterRef<MouseEvent>;
|
|
1956
|
+
/** Emite al seleccionar una acción del dropdown */
|
|
1957
|
+
actionClick: _angular_core.OutputEmitterRef<NeuSplitButtonAction>;
|
|
1958
|
+
readonly isOpen: _angular_core.WritableSignal<boolean>;
|
|
1959
|
+
readonly isDisabled: _angular_core.Signal<boolean>;
|
|
1960
|
+
readonly mainClasses: _angular_core.Signal<string>;
|
|
1961
|
+
readonly chevronClasses: _angular_core.Signal<string>;
|
|
1962
|
+
toggleDropdown(event: MouseEvent): void;
|
|
1963
|
+
closeDropdown(): void;
|
|
1964
|
+
onDocumentClick(event: MouseEvent): void;
|
|
1965
|
+
onPrimaryClick(event: MouseEvent): void;
|
|
1966
|
+
onActionClick(action: NeuSplitButtonAction): void;
|
|
1967
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuSplitButtonComponent, never>;
|
|
1968
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<NeuSplitButtonComponent, "neu-split-button", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "actions": { "alias": "actions"; "required": false; "isSignal": true; }; "moreActionsAriaLabel": { "alias": "moreActionsAriaLabel"; "required": false; "isSignal": true; }; "actionsAriaLabel": { "alias": "actionsAriaLabel"; "required": false; "isSignal": true; }; }, { "primaryClick": "primaryClick"; "actionClick": "actionClick"; }, never, never, true, never>;
|
|
1969
|
+
}
|
|
1970
|
+
|
|
1971
|
+
type NeuStatsTrend = 'up' | 'down' | 'neutral';
|
|
1972
|
+
/**
|
|
1973
|
+
* NeuStatsCard — Card de métrica con título, valor, tendencia y sparkline.
|
|
1974
|
+
*
|
|
1975
|
+
* Uso:
|
|
1976
|
+
* <neu-stats-card
|
|
1977
|
+
* title="Ingresos"
|
|
1978
|
+
* value="$12,450"
|
|
1979
|
+
* change="+12.5%"
|
|
1980
|
+
* trend="up"
|
|
1981
|
+
* icon="lucideDollarSign"
|
|
1982
|
+
* [sparkData]="[30,45,38,52,60,55,70]"
|
|
1983
|
+
* />
|
|
1984
|
+
*/
|
|
1985
|
+
declare class NeuStatsCardComponent {
|
|
1986
|
+
/** Título o etiqueta de la métrica. */
|
|
1987
|
+
title: _angular_core.InputSignal<string>;
|
|
1988
|
+
/** Valor principal formateado (p.ej. "$12,450" o "98.2%"). */
|
|
1989
|
+
value: _angular_core.InputSignal<string>;
|
|
1990
|
+
/** Cambio porcentual o absoluto (p.ej. "+12.5%" o "-3"). */
|
|
1991
|
+
change: _angular_core.InputSignal<string>;
|
|
1992
|
+
/** Dirección del cambio. Afecta el color del change. */
|
|
1993
|
+
trend: _angular_core.InputSignal<NeuStatsTrend>;
|
|
1994
|
+
/** Texto auxiliar bajo el cambio (p.ej. "vs. mes anterior"). */
|
|
1995
|
+
label: _angular_core.InputSignal<string>;
|
|
1996
|
+
/** Nombre del icono Lucide para el encabezado. */
|
|
1997
|
+
icon: _angular_core.InputSignal<string>;
|
|
1998
|
+
/** Array de valores numéricos para la sparkline. Mín. 2 puntos. */
|
|
1999
|
+
sparkData: _angular_core.InputSignal<number[]>;
|
|
2000
|
+
/** @internal Genera los puntos SVG de la sparkline */
|
|
2001
|
+
protected readonly sparkPoints: _angular_core.Signal<string>;
|
|
2002
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuStatsCardComponent, never>;
|
|
2003
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<NeuStatsCardComponent, "neu-stats-card", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "change": { "alias": "change"; "required": false; "isSignal": true; }; "trend": { "alias": "trend"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "sparkData": { "alias": "sparkData"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
2004
|
+
}
|
|
2005
|
+
|
|
2006
|
+
type NeuTimelineItemVariant = 'default' | 'success' | 'warning' | 'danger' | 'info';
|
|
2007
|
+
interface NeuTimelineItem {
|
|
2008
|
+
/** Etiqueta de tiempo (ej. "Hace 2h", "12 Mar") */
|
|
2009
|
+
time?: string;
|
|
2010
|
+
/** Título del evento */
|
|
2011
|
+
title: string;
|
|
2012
|
+
/** Descripción opcional */
|
|
2013
|
+
description?: string;
|
|
2014
|
+
/** Variante de color del punto */
|
|
2015
|
+
variant?: NeuTimelineItemVariant;
|
|
2016
|
+
/** Icono SVG path opcional */
|
|
2017
|
+
icon?: string;
|
|
2018
|
+
}
|
|
2019
|
+
/**
|
|
2020
|
+
* NeuralUI Timeline Component
|
|
2021
|
+
*
|
|
2022
|
+
* Lista vertical de eventos cronológicos con línea conectora.
|
|
2023
|
+
*
|
|
2024
|
+
* Uso:
|
|
2025
|
+
* <neu-timeline [items]="events" />
|
|
2026
|
+
* <neu-timeline [items]="events" align="right" />
|
|
2027
|
+
*/
|
|
2028
|
+
declare class NeuTimelineComponent {
|
|
2029
|
+
/** Eventos a mostrar */
|
|
2030
|
+
items: _angular_core.InputSignal<NeuTimelineItem[]>;
|
|
2031
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuTimelineComponent, never>;
|
|
2032
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<NeuTimelineComponent, "neu-timeline", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
2033
|
+
}
|
|
2034
|
+
|
|
2035
|
+
/**
|
|
2036
|
+
* NeuralUI Toast Container Component
|
|
2037
|
+
*
|
|
2038
|
+
* Renderiza los toasts activos del NeuToastService.
|
|
2039
|
+
* Añade este componente una sola vez en la raíz del app (app.html).
|
|
2040
|
+
*
|
|
2041
|
+
* Diseño mobile-first:
|
|
2042
|
+
* - < 400px: banner inferior centrado
|
|
2043
|
+
* - ≥ 400px: stack en la esquina superior derecha
|
|
2044
|
+
*
|
|
2045
|
+
* Uso:
|
|
2046
|
+
* <!-- en app.html -->
|
|
2047
|
+
* <neu-toast-container />
|
|
2048
|
+
*/
|
|
2049
|
+
declare class NeuToastContainerComponent {
|
|
2050
|
+
readonly toastService: NeuToastService;
|
|
2051
|
+
getIcon(type: NeuToastType): string;
|
|
2052
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuToastContainerComponent, never>;
|
|
2053
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<NeuToastContainerComponent, "neu-toast-container", never, {}, {}, never, never, true, never>;
|
|
2054
|
+
}
|
|
2055
|
+
|
|
2056
|
+
/** @internal — componente flotante del tooltip, renderizado vía CDK Portal */
|
|
2057
|
+
declare class NeuTooltipOverlayComponent {
|
|
2058
|
+
readonly text: _angular_core.InputSignal<string>;
|
|
2059
|
+
readonly tooltipId: _angular_core.InputSignal<string>;
|
|
2060
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuTooltipOverlayComponent, never>;
|
|
2061
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<NeuTooltipOverlayComponent, "neu-tooltip-overlay", never, { "text": { "alias": "text"; "required": true; "isSignal": true; }; "tooltipId": { "alias": "tooltipId"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
2062
|
+
}
|
|
2063
|
+
|
|
2064
|
+
type NeuTooltipPosition = 'top' | 'bottom' | 'left' | 'right';
|
|
2065
|
+
/**
|
|
2066
|
+
* NeuralUI Tooltip Directive
|
|
2067
|
+
*
|
|
2068
|
+
* Muestra un globo informativo al hacer hover/focus sobre el elemento host.
|
|
2069
|
+
* Usa CDK Overlay para posicionamiento robusto.
|
|
2070
|
+
*
|
|
2071
|
+
* Uso:
|
|
2072
|
+
* <button [neuTooltip]="'Guardar cambios'">Guardar</button>
|
|
2073
|
+
* <button [neuTooltip]="'Eliminar'" neuTooltipPosition="bottom">Eliminar</button>
|
|
2074
|
+
*/
|
|
2075
|
+
declare class NeuTooltipDirective implements OnDestroy {
|
|
2076
|
+
readonly neuTooltip: _angular_core.InputSignal<string>;
|
|
2077
|
+
readonly neuTooltipPosition: _angular_core.InputSignal<NeuTooltipPosition>;
|
|
2078
|
+
readonly neuTooltipDisabled: _angular_core.InputSignal<boolean>;
|
|
2079
|
+
private readonly _overlay;
|
|
2080
|
+
private readonly _elementRef;
|
|
2081
|
+
private readonly _injector;
|
|
2082
|
+
readonly _tooltipId: string;
|
|
2083
|
+
/** Elementos HTML nativamente focusables que no necesitan tabindex extra */
|
|
2084
|
+
private readonly _NATIVE_FOCUSABLE;
|
|
2085
|
+
protected readonly _needsTabindex: () => boolean;
|
|
2086
|
+
private _overlayRef;
|
|
2087
|
+
private _tooltipRef;
|
|
2088
|
+
private _hideTimeout;
|
|
2089
|
+
show(): void;
|
|
2090
|
+
hide(): void;
|
|
2091
|
+
private _createOverlay;
|
|
2092
|
+
private _getPositions;
|
|
2093
|
+
private _detach;
|
|
2094
|
+
ngOnDestroy(): void;
|
|
2095
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<NeuTooltipDirective, never>;
|
|
2096
|
+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<NeuTooltipDirective, "[neuTooltip]", never, { "neuTooltip": { "alias": "neuTooltip"; "required": true; "isSignal": true; }; "neuTooltipPosition": { "alias": "neuTooltipPosition"; "required": false; "isSignal": true; }; "neuTooltipDisabled": { "alias": "neuTooltipDisabled"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
2097
|
+
}
|
|
2098
|
+
|
|
2099
|
+
export { NEU_RADIO_GROUP, NEU_TABS_CONTEXT, NeuAccordionComponent, NeuAvatarComponent, NeuBadgeComponent, NeuBreadcrumbComponent, NeuButtonComponent, NeuCardComponent, NeuChartComponent, NeuCheckboxComponent, NeuChipComponent, NeuCodeBlockComponent, NeuDateInputComponent, NeuDialogComponent, NeuDialogService, NeuDividerComponent, NeuEmptyStateComponent, NeuIconComponent, NeuInputComponent, NeuMultiselectComponent, NeuMultiselectItemDirective, NeuNavComponent, NeuPaginationComponent, NeuProgressBarComponent, NeuRadioComponent, NeuRadioGroupComponent, NeuRatingComponent, NeuSelectComponent, NeuSelectItemDirective, NeuSelectSelectedDirective, NeuSidebarComponent, NeuSkeletonComponent, NeuSliderComponent, NeuSpinnerComponent, NeuSplitButtonComponent, NeuStatsCardComponent, NeuStepperComponent, NeuSwitchComponent, NeuTabPanelComponent, NeuTableComponent, NeuTableExpandDirective, NeuTabsComponent, NeuTextareaComponent, NeuTimelineComponent, NeuToastContainerComponent, NeuToastService, NeuToggleButtonGroupComponent, NeuTooltipDirective, NeuTooltipOverlayComponent, NeuUrlStateService, provideNeuralUI };
|
|
2100
|
+
export type { NeuAccordionItem, NeuAvatarColor, NeuAvatarShape, NeuAvatarSize, NeuAvatarStatus, NeuBadgeSize, NeuBadgeVariant, NeuBreadcrumbItem, NeuButtonIconPosition, NeuButtonSize, NeuButtonVariant, NeuCardPadding, NeuChartSeries, NeuChartType, NeuChipSize, NeuChipVariant, NeuDialogData, NeuDialogSize, NeuInputType, NeuNavItem, NeuProgressVariant, NeuSelectGroup, NeuSelectOption, NeuSpinnerSeverity, NeuSplitButtonAction, NeuStatsTrend, NeuStepperStep, NeuTab, NeuTableBadgeConfig, NeuTableBadgeVariant, NeuTableColumn, NeuTimelineItem, NeuTimelineItemVariant, NeuToastItem, NeuToastOptions, NeuToastPosition, NeuToastType, NeuToggleOption, NeuTooltipPosition, NeuralUIConfig };
|