@highstacklabs2026/ui 1.1.1 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,18 +1,759 @@
1
1
  import * as _angular_core from '@angular/core';
2
+ import { TemplateRef, OnDestroy, Provider } from '@angular/core';
3
+ import { ControlValueAccessor } from '@angular/forms';
2
4
 
3
- type ButtonVariant = 'default' | 'destructive' | 'outline' | 'ghost' | 'link' | 'secondary' | 'gradient' | 'glass';
4
- type ButtonSize = 'sm' | 'md' | 'lg' | 'icon';
5
+ /**
6
+ * Acordeón compositional. `multiple` permite varios paneles abiertos; por
7
+ * defecto solo uno (al abrir otro se cierra el anterior).
8
+ */
9
+ declare class AccordionComponent {
10
+ readonly multiple: _angular_core.InputSignalWithTransform<boolean, unknown>;
11
+ /** Ids de los items abiertos. */
12
+ private readonly openIds;
13
+ isOpen(id: number): boolean;
14
+ toggle(id: number): void;
15
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AccordionComponent, never>;
16
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AccordionComponent, "ui-accordion", never, { "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
17
+ }
18
+ /** Un panel del acordeón. */
19
+ declare class AccordionItemComponent {
20
+ readonly title: _angular_core.InputSignal<string>;
21
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
22
+ private readonly accordion;
23
+ protected readonly id: number;
24
+ protected readonly contentId: string;
25
+ protected readonly open: _angular_core.Signal<boolean>;
26
+ protected toggle(): void;
27
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AccordionItemComponent, never>;
28
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AccordionItemComponent, "ui-accordion-item", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
29
+ }
30
+
31
+ type AlertType = 'info' | 'success' | 'warning' | 'error';
32
+ type AlertVariant = 'soft' | 'solid';
33
+ /**
34
+ * Mensaje contextual con color e ícono según el tipo. El cuerpo se proyecta;
35
+ * `title` opcional en negrita. Cerrable con el output (close).
36
+ */
37
+ declare class AlertComponent {
38
+ readonly type: _angular_core.InputSignal<AlertType>;
39
+ readonly variant: _angular_core.InputSignal<AlertVariant>;
40
+ readonly title: _angular_core.InputSignal<string>;
41
+ readonly closable: _angular_core.InputSignalWithTransform<boolean, unknown>;
42
+ readonly close: _angular_core.OutputEmitterRef<void>;
43
+ protected readonly hostClasses: _angular_core.Signal<string>;
44
+ /** Color del ícono (en soft toma el color del tipo; en solid hereda currentColor). */
45
+ protected readonly iconColor: _angular_core.Signal<string>;
46
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AlertComponent, never>;
47
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AlertComponent, "ui-alert", never, { "type": { "alias": "type"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "closable": { "alias": "closable"; "required": false; "isSignal": true; }; }, { "close": "close"; }, never, ["*"], true, never>;
48
+ }
49
+
50
+ type AvatarSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';
51
+ type AvatarShape = 'circle' | 'square';
52
+ type AvatarStatus = 'online' | 'offline' | 'away' | 'busy';
53
+ /** Avatar: imagen con fallback a iniciales, tamaños, forma e indicador de estado. */
54
+ declare class AvatarComponent {
55
+ readonly src: _angular_core.InputSignal<string>;
56
+ readonly name: _angular_core.InputSignal<string>;
57
+ readonly alt: _angular_core.InputSignal<string>;
58
+ readonly size: _angular_core.InputSignal<AvatarSize>;
59
+ readonly shape: _angular_core.InputSignal<AvatarShape>;
60
+ readonly status: _angular_core.InputSignal<AvatarStatus | null>;
61
+ /** Lo controla ui-avatar-group para ocultar los que exceden `max`. */
62
+ readonly hidden: _angular_core.WritableSignal<boolean>;
63
+ protected readonly imgError: _angular_core.WritableSignal<boolean>;
64
+ protected readonly showImage: _angular_core.Signal<boolean>;
65
+ protected readonly initials: _angular_core.Signal<string>;
66
+ protected readonly statusDotClasses: _angular_core.Signal<string>;
67
+ protected readonly innerClasses: _angular_core.Signal<string>;
68
+ protected readonly hostClasses: _angular_core.Signal<string>;
69
+ protected onImgError(): void;
70
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AvatarComponent, never>;
71
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AvatarComponent, "ui-avatar", never, { "src": { "alias": "src"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "alt": { "alias": "alt"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "shape": { "alias": "shape"; "required": false; "isSignal": true; }; "status": { "alias": "status"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
72
+ }
73
+ /** Grupo de avatares apilados, con "+N" cuando se supera `max`. */
74
+ declare class AvatarGroupComponent {
75
+ readonly max: _angular_core.InputSignal<number | null>;
76
+ readonly size: _angular_core.InputSignal<AvatarSize>;
77
+ private readonly avatars;
78
+ protected readonly overflow: _angular_core.Signal<number>;
79
+ protected readonly moreClasses: _angular_core.Signal<string>;
80
+ constructor();
81
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AvatarGroupComponent, never>;
82
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AvatarGroupComponent, "ui-avatar-group", never, { "max": { "alias": "max"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, {}, ["avatars"], ["*"], true, never>;
83
+ }
84
+
85
+ type BadgeVariant = 'solid' | 'soft' | 'outline' | 'glass';
86
+ type BadgeColor = 'primary' | 'secondary' | 'success' | 'warning' | 'destructive';
87
+ type BadgeSize = 'sm' | 'md';
88
+ /**
89
+ * Etiqueta compacta para estados, tags y contadores.
90
+ * Dos ejes: variant (solid/soft/outline) × color, más dot, ícono y removible.
91
+ */
92
+ declare class BadgeComponent {
93
+ readonly variant: _angular_core.InputSignal<BadgeVariant>;
94
+ readonly color: _angular_core.InputSignal<BadgeColor>;
95
+ readonly size: _angular_core.InputSignal<BadgeSize>;
96
+ readonly dot: _angular_core.InputSignalWithTransform<boolean, unknown>;
97
+ readonly removable: _angular_core.InputSignalWithTransform<boolean, unknown>;
98
+ /** Se emite al pulsar la × (solo si removable). */
99
+ readonly remove: _angular_core.OutputEmitterRef<void>;
100
+ protected readonly hostClasses: _angular_core.Signal<string>;
101
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<BadgeComponent, never>;
102
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<BadgeComponent, "ui-badge", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "dot": { "alias": "dot"; "required": false; "isSignal": true; }; "removable": { "alias": "removable"; "required": false; "isSignal": true; }; }, { "remove": "remove"; }, never, ["[slot=icon]", "*"], true, never>;
103
+ }
104
+
105
+ /** Ruta de navegación jerárquica. Inserta un separador entre ítems. */
106
+ declare class BreadcrumbComponent {
107
+ readonly items: _angular_core.Signal<readonly BreadcrumbItemComponent[]>;
108
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<BreadcrumbComponent, never>;
109
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<BreadcrumbComponent, "ui-breadcrumb", never, {}, {}, ["items"], ["*"], true, never>;
110
+ }
111
+ /** Un ítem del breadcrumb. Con `link` es navegable; sin él, es el actual. */
112
+ declare class BreadcrumbItemComponent {
113
+ /** Destino de routerLink; si se omite, el ítem es el actual (no navegable). */
114
+ readonly link: _angular_core.InputSignal<string | unknown[] | null>;
115
+ private readonly parent;
116
+ /** Es el último ítem (no muestra separador después). */
117
+ readonly isLast: _angular_core.Signal<boolean>;
118
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<BreadcrumbItemComponent, never>;
119
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<BreadcrumbItemComponent, "ui-breadcrumb-item", never, { "link": { "alias": "link"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
120
+ }
121
+
122
+ type ButtonVariant = 'default' | 'destructive' | 'outline' | 'ghost' | 'link' | 'secondary' | 'gradient' | 'glass' | 'success' | 'warning';
123
+ type ButtonSize = 'xs' | 'sm' | 'md' | 'lg' | 'icon';
5
124
  declare class ButtonComponent {
6
125
  readonly variant: _angular_core.InputSignal<ButtonVariant>;
7
126
  readonly size: _angular_core.InputSignal<ButtonSize>;
8
127
  readonly disabled: _angular_core.InputSignal<boolean>;
9
128
  readonly loading: _angular_core.InputSignal<boolean>;
10
129
  readonly type: _angular_core.InputSignal<"button" | "submit" | "reset">;
130
+ readonly pill: _angular_core.InputSignal<boolean>;
131
+ readonly full: _angular_core.InputSignal<boolean>;
11
132
  protected readonly isDisabled: _angular_core.Signal<boolean>;
12
133
  protected readonly hostClasses: _angular_core.Signal<string>;
13
134
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ButtonComponent, never>;
14
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<ButtonComponent, "ui-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; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
135
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ButtonComponent, "ui-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; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "pill": { "alias": "pill"; "required": false; "isSignal": true; }; "full": { "alias": "full"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
136
+ }
137
+
138
+ type CardVariant = 'elevated' | 'outline' | 'soft' | 'interactive';
139
+ /** Contenedor principal. Proyecta header/content/footer (u contenido libre). */
140
+ declare class CardComponent {
141
+ readonly variant: _angular_core.InputSignal<CardVariant>;
142
+ protected readonly hostClasses: _angular_core.Signal<string>;
143
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CardComponent, never>;
144
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CardComponent, "ui-card", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
145
+ }
146
+ /** Cabecera: padding + columna con separación. */
147
+ declare class CardHeaderComponent {
148
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CardHeaderComponent, never>;
149
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CardHeaderComponent, "ui-card-header", never, {}, {}, never, ["*"], true, never>;
150
+ }
151
+ /** Título de la tarjeta. */
152
+ declare class CardTitleComponent {
153
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CardTitleComponent, never>;
154
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CardTitleComponent, "ui-card-title", never, {}, {}, never, ["*"], true, never>;
155
+ }
156
+ /** Descripción / subtítulo. */
157
+ declare class CardDescriptionComponent {
158
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CardDescriptionComponent, never>;
159
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CardDescriptionComponent, "ui-card-description", never, {}, {}, never, ["*"], true, never>;
160
+ }
161
+ /** Cuerpo de la tarjeta. */
162
+ declare class CardContentComponent {
163
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CardContentComponent, never>;
164
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CardContentComponent, "ui-card-content", never, {}, {}, never, ["*"], true, never>;
165
+ }
166
+ /** Pie: fila para acciones (botones). */
167
+ declare class CardFooterComponent {
168
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CardFooterComponent, never>;
169
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CardFooterComponent, "ui-card-footer", never, {}, {}, never, ["*"], true, never>;
170
+ }
171
+
172
+ type CheckboxSize = 'sm' | 'md';
173
+ interface CheckboxValidationError {
174
+ kind?: string;
175
+ message?: string;
176
+ }
177
+ /**
178
+ * Casilla de verificación. Funciona con Signal Forms (`[formField]`, contrato
179
+ * FormCheckboxControl), ControlValueAccessor (ngModel/Reactive) y two-way `[(checked)]`.
180
+ */
181
+ declare class CheckboxComponent implements ControlValueAccessor {
182
+ /** Fuente única de verdad (Signal Forms usa `checked` para checkboxes). */
183
+ readonly checked: _angular_core.ModelSignal<boolean>;
184
+ readonly label: _angular_core.InputSignal<string>;
185
+ readonly description: _angular_core.InputSignal<string>;
186
+ readonly size: _angular_core.InputSignal<CheckboxSize>;
187
+ readonly id: _angular_core.InputSignal<string>;
188
+ readonly name: _angular_core.InputSignal<string>;
189
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
190
+ readonly required: _angular_core.InputSignalWithTransform<boolean, unknown>;
191
+ readonly indeterminate: _angular_core.InputSignalWithTransform<boolean, unknown>;
192
+ readonly invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
193
+ readonly touched: _angular_core.InputSignalWithTransform<boolean, unknown>;
194
+ readonly errors: _angular_core.InputSignal<readonly CheckboxValidationError[]>;
195
+ private readonly cvaDisabled;
196
+ protected readonly isDisabled: _angular_core.Signal<boolean>;
197
+ protected readonly errorMessage: _angular_core.Signal<string>;
198
+ protected readonly hasError: _angular_core.Signal<boolean>;
199
+ protected readonly boxClasses: _angular_core.Signal<string>;
200
+ private onChange;
201
+ private onTouched;
202
+ writeValue(value: boolean): void;
203
+ registerOnChange(fn: (value: boolean) => void): void;
204
+ registerOnTouched(fn: () => void): void;
205
+ setDisabledState(isDisabled: boolean): void;
206
+ protected toggle(event: Event): void;
207
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CheckboxComponent, never>;
208
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CheckboxComponent, "ui-checkbox", never, { "checked": { "alias": "checked"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "indeterminate": { "alias": "indeterminate"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; }, { "checked": "checkedChange"; }, never, never, true, never>;
209
+ }
210
+
211
+ type DropdownSide = 'bottom' | 'top';
212
+ type DropdownAlign = 'start' | 'end';
213
+ /**
214
+ * Menú desplegable compositional, sin dependencias. Maneja abrir/cerrar,
215
+ * posición, click-afuera y navegación por teclado.
216
+ */
217
+ declare class DropdownComponent {
218
+ readonly side: _angular_core.InputSignal<DropdownSide>;
219
+ readonly align: _angular_core.InputSignal<DropdownAlign>;
220
+ readonly open: _angular_core.WritableSignal<boolean>;
221
+ private readonly el;
222
+ private readonly items;
223
+ protected readonly panelClasses: _angular_core.Signal<string>;
224
+ toggle(): void;
225
+ close(): void;
226
+ protected onDocClick(event: MouseEvent): void;
227
+ protected onKeydown(event: KeyboardEvent): void;
228
+ /** Enfoca el ítem habilitado en la posición dada (tras render). */
229
+ private focusItem;
230
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DropdownComponent, never>;
231
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DropdownComponent, "ui-dropdown", never, { "side": { "alias": "side"; "required": false; "isSignal": true; }; "align": { "alias": "align"; "required": false; "isSignal": true; }; }, {}, ["items"], ["[uiDropdownTrigger]", "*"], true, never>;
232
+ }
233
+ /** Marca el elemento disparador del dropdown. */
234
+ declare class DropdownTriggerDirective {
235
+ protected readonly dd: DropdownComponent;
236
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DropdownTriggerDirective, never>;
237
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<DropdownTriggerDirective, "[uiDropdownTrigger]", never, {}, {}, never, never, true, never>;
238
+ }
239
+ /** Ítem seleccionable del menú. */
240
+ declare class DropdownItemComponent {
241
+ readonly destructive: _angular_core.InputSignalWithTransform<boolean, unknown>;
242
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
243
+ readonly select: _angular_core.OutputEmitterRef<void>;
244
+ private readonly dd;
245
+ private readonly el;
246
+ protected readonly hostClasses: _angular_core.Signal<string>;
247
+ focus(): void;
248
+ isActive(node: Element | null): boolean;
249
+ protected onClick(): void;
250
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DropdownItemComponent, never>;
251
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DropdownItemComponent, "ui-dropdown-item", never, { "destructive": { "alias": "destructive"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "select": "select"; }, never, ["[slot=icon]", "*", "[slot=shortcut]"], true, never>;
252
+ }
253
+ /** Encabezado de sección. */
254
+ declare class DropdownLabelComponent {
255
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DropdownLabelComponent, never>;
256
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DropdownLabelComponent, "ui-dropdown-label", never, {}, {}, never, ["*"], true, never>;
257
+ }
258
+ /** Línea divisoria. */
259
+ declare class DropdownSeparatorComponent {
260
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DropdownSeparatorComponent, never>;
261
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DropdownSeparatorComponent, "ui-dropdown-separator", never, {}, {}, never, never, true, never>;
262
+ }
263
+
264
+ type InputSize = 'sm' | 'md' | 'lg';
265
+ type InputType = 'text' | 'email' | 'password' | 'number' | 'search' | 'tel' | 'url';
266
+ /** Forma laxa de un error de validación (Signal Forms entrega { kind, message? }). */
267
+ interface InputValidationError {
268
+ kind?: string;
269
+ message?: string;
270
+ }
271
+ /**
272
+ * Campo de texto. Funciona con:
273
+ * - Signal Forms (Angular 22) vía `[formField]` — implementa el contrato
274
+ * FormValueControl por duck typing (value = model + errors/disabled/... = input).
275
+ * - ControlValueAccessor — ngModel, Reactive Forms, formControlName.
276
+ * - Two-way simple `[(value)]`.
277
+ */
278
+ declare class InputComponent implements ControlValueAccessor {
279
+ /** Fuente única de verdad del valor (Signal Forms + two-way). */
280
+ readonly value: _angular_core.ModelSignal<string>;
281
+ readonly type: _angular_core.InputSignal<InputType>;
282
+ readonly size: _angular_core.InputSignal<InputSize>;
283
+ readonly label: _angular_core.InputSignal<string>;
284
+ readonly hint: _angular_core.InputSignal<string>;
285
+ readonly placeholder: _angular_core.InputSignal<string>;
286
+ readonly name: _angular_core.InputSignal<string>;
287
+ readonly id: _angular_core.InputSignal<string>;
288
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
289
+ readonly readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
290
+ readonly required: _angular_core.InputSignalWithTransform<boolean, unknown>;
291
+ /** Muestra el botón de ojito para revelar/ocultar la contraseña (solo type="password"). */
292
+ readonly passwordToggle: _angular_core.InputSignalWithTransform<boolean, unknown>;
293
+ /** Mensaje de error manual (tiene prioridad sobre los errors de Signal Forms). */
294
+ readonly error: _angular_core.InputSignal<string>;
295
+ /** Estado de validación que cablea Signal Forms automáticamente. */
296
+ readonly invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
297
+ readonly touched: _angular_core.InputSignalWithTransform<boolean, unknown>;
298
+ readonly errors: _angular_core.InputSignal<readonly InputValidationError[]>;
299
+ /** disabled puede venir del input o de CVA (setDisabledState). */
300
+ private readonly cvaDisabled;
301
+ protected readonly isDisabled: _angular_core.Signal<boolean>;
302
+ /** Estado y tipo efectivo para el toggle de contraseña. */
303
+ protected readonly showPassword: _angular_core.WritableSignal<boolean>;
304
+ protected readonly hasPasswordToggle: _angular_core.Signal<boolean>;
305
+ protected readonly resolvedType: _angular_core.Signal<InputType>;
306
+ protected readonly errorMessage: _angular_core.Signal<string>;
307
+ protected readonly hasError: _angular_core.Signal<boolean>;
308
+ protected readonly describedById: _angular_core.Signal<string | null>;
309
+ protected readonly wrapperClasses: _angular_core.Signal<string>;
310
+ private onChange;
311
+ private onTouched;
312
+ writeValue(value: string): void;
313
+ registerOnChange(fn: (value: string) => void): void;
314
+ registerOnTouched(fn: () => void): void;
315
+ setDisabledState(isDisabled: boolean): void;
316
+ protected onInput(event: Event): void;
317
+ protected onBlur(): void;
318
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<InputComponent, never>;
319
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<InputComponent, "ui-input", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "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; }; "passwordToggle": { "alias": "passwordToggle"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, ["[slot=prefix]", "[slot=suffix]"], true, never>;
320
+ }
321
+
322
+ type LoadingSize = 'sm' | 'md' | 'lg';
323
+ /** Indicador giratorio. Hereda el color (currentColor). */
324
+ declare class SpinnerComponent {
325
+ readonly size: _angular_core.InputSignal<LoadingSize>;
326
+ protected readonly px: _angular_core.Signal<number>;
327
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SpinnerComponent, never>;
328
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SpinnerComponent, "ui-spinner", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
329
+ }
330
+ /** Placeholder con pulso mientras carga el contenido real. */
331
+ declare class SkeletonComponent {
332
+ readonly width: _angular_core.InputSignal<string>;
333
+ readonly height: _angular_core.InputSignal<string>;
334
+ readonly circle: _angular_core.InputSignalWithTransform<boolean, unknown>;
335
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SkeletonComponent, never>;
336
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SkeletonComponent, "ui-skeleton", never, { "width": { "alias": "width"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "circle": { "alias": "circle"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
337
+ }
338
+ /** Barra de progreso (determinada con value 0-100, o indeterminada). */
339
+ declare class ProgressComponent {
340
+ readonly value: _angular_core.InputSignalWithTransform<number, unknown>;
341
+ readonly size: _angular_core.InputSignal<LoadingSize>;
342
+ readonly indeterminate: _angular_core.InputSignalWithTransform<boolean, unknown>;
343
+ protected readonly clamped: _angular_core.Signal<number>;
344
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ProgressComponent, never>;
345
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ProgressComponent, "ui-progress", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "indeterminate": { "alias": "indeterminate"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
346
+ }
347
+
348
+ type PaginationVariant = 'numbers' | 'compact';
349
+ type PaginationSize = 'sm' | 'md';
350
+ /** Token de elipsis en la lista de páginas. */
351
+ declare const GAP: "\u2026";
352
+ /**
353
+ * Paginación. Two-way `[(page)]` (1-based). Modo 'numbers' (con elipsis) o
354
+ * 'compact' ('Página X de Y'). Selector opcional de items por página.
355
+ */
356
+ declare class PaginationComponent {
357
+ readonly page: _angular_core.ModelSignal<number>;
358
+ readonly totalPages: _angular_core.InputSignalWithTransform<number, unknown>;
359
+ readonly variant: _angular_core.InputSignal<PaginationVariant>;
360
+ readonly size: _angular_core.InputSignal<PaginationSize>;
361
+ /** Si se pasan opciones, se muestra el selector de items por página. */
362
+ readonly pageSize: _angular_core.ModelSignal<number>;
363
+ readonly pageSizeOptions: _angular_core.InputSignal<number[]>;
364
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
365
+ protected readonly gap: "…";
366
+ protected readonly canPrev: _angular_core.Signal<boolean>;
367
+ protected readonly canNext: _angular_core.Signal<boolean>;
368
+ /** Lista de páginas visibles con elipsis: 1 … 4 5 6 … 20 */
369
+ protected readonly pages: _angular_core.Signal<(number | "…")[]>;
370
+ protected readonly btnSize: _angular_core.Signal<"size-8 text-xs" | "size-9 text-sm">;
371
+ protected readonly pageSizeStr: _angular_core.Signal<string>;
372
+ protected go(p: number): void;
373
+ protected prev(): void;
374
+ protected next(): void;
375
+ protected onPageSize(v: string): void;
376
+ protected isGap(p: number | typeof GAP): p is typeof GAP;
377
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PaginationComponent, never>;
378
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PaginationComponent, "ui-pagination", never, { "page": { "alias": "page"; "required": false; "isSignal": true; }; "totalPages": { "alias": "totalPages"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "pageSize": { "alias": "pageSize"; "required": false; "isSignal": true; }; "pageSizeOptions": { "alias": "pageSizeOptions"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "page": "pageChange"; "pageSize": "pageSizeChange"; }, never, never, true, never>;
379
+ }
380
+
381
+ type RadioSize = 'sm' | 'md';
382
+ type RadioOrientation = 'vertical' | 'horizontal';
383
+ type RadioAppearance = 'default' | 'card';
384
+ interface RadioValidationError {
385
+ kind?: string;
386
+ message?: string;
387
+ }
388
+ /**
389
+ * Grupo de selección única. El valor vive aquí. Funciona con Signal Forms
390
+ * (`[formField]`, FormValueControl), ControlValueAccessor y two-way `[(value)]`.
391
+ * Los ui-radio hijos lo inyectan por DI.
392
+ */
393
+ declare class RadioGroupComponent implements ControlValueAccessor {
394
+ readonly value: _angular_core.ModelSignal<string>;
395
+ readonly size: _angular_core.InputSignal<RadioSize>;
396
+ readonly orientation: _angular_core.InputSignal<RadioOrientation>;
397
+ readonly appearance: _angular_core.InputSignal<RadioAppearance>;
398
+ readonly name: _angular_core.InputSignal<string>;
399
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
400
+ readonly required: _angular_core.InputSignalWithTransform<boolean, unknown>;
401
+ readonly invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
402
+ readonly touched: _angular_core.InputSignalWithTransform<boolean, unknown>;
403
+ readonly errors: _angular_core.InputSignal<readonly RadioValidationError[]>;
404
+ private readonly cvaDisabled;
405
+ readonly isDisabled: _angular_core.Signal<boolean>;
406
+ readonly errorMessage: _angular_core.Signal<string>;
407
+ readonly hasError: _angular_core.Signal<boolean>;
408
+ protected readonly hostClasses: _angular_core.Signal<"flex flex-row flex-wrap gap-3" | "flex flex-col gap-3">;
409
+ private onChange;
410
+ private onTouched;
411
+ writeValue(value: string): void;
412
+ registerOnChange(fn: (value: string) => void): void;
413
+ registerOnTouched(fn: () => void): void;
414
+ setDisabledState(isDisabled: boolean): void;
415
+ /** Llamado por un ui-radio hijo al seleccionarse. */
416
+ select(value: string): void;
417
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<RadioGroupComponent, never>;
418
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<RadioGroupComponent, "ui-radio-group", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; "appearance": { "alias": "appearance"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, ["*"], true, never>;
419
+ }
420
+ /** Una opción dentro de ui-radio-group. */
421
+ declare class RadioComponent {
422
+ protected readonly group: RadioGroupComponent;
423
+ readonly value: _angular_core.InputSignal<string>;
424
+ readonly label: _angular_core.InputSignal<string>;
425
+ readonly description: _angular_core.InputSignal<string>;
426
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
427
+ protected readonly id: string;
428
+ protected readonly checked: _angular_core.Signal<boolean>;
429
+ protected readonly isDisabled: _angular_core.Signal<boolean>;
430
+ protected readonly circleClasses: _angular_core.Signal<string>;
431
+ protected readonly dotClasses: _angular_core.Signal<string>;
432
+ protected readonly cardClasses: _angular_core.Signal<string>;
433
+ protected onSelect(): void;
434
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<RadioComponent, never>;
435
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<RadioComponent, "ui-radio", never, { "value": { "alias": "value"; "required": true; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
436
+ }
437
+
438
+ type SelectSize = 'sm' | 'md' | 'lg';
439
+ interface SelectValidationError {
440
+ kind?: string;
441
+ message?: string;
442
+ }
443
+ /**
444
+ * Select compositional, sin dependencias. Combina el overlay del Dropdown con
445
+ * la integración de formularios del Input: Signal Forms (`[formField]`),
446
+ * ControlValueAccessor (ngModel/Reactive) y two-way `[(value)]`.
447
+ */
448
+ declare class SelectComponent implements ControlValueAccessor {
449
+ readonly value: _angular_core.ModelSignal<string>;
450
+ readonly placeholder: _angular_core.InputSignal<string>;
451
+ readonly label: _angular_core.InputSignal<string>;
452
+ readonly hint: _angular_core.InputSignal<string>;
453
+ readonly error: _angular_core.InputSignal<string>;
454
+ readonly size: _angular_core.InputSignal<SelectSize>;
455
+ readonly id: _angular_core.InputSignal<string>;
456
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
457
+ readonly required: _angular_core.InputSignalWithTransform<boolean, unknown>;
458
+ readonly invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
459
+ readonly touched: _angular_core.InputSignalWithTransform<boolean, unknown>;
460
+ readonly errors: _angular_core.InputSignal<readonly SelectValidationError[]>;
461
+ readonly open: _angular_core.WritableSignal<boolean>;
462
+ private readonly el;
463
+ private readonly options;
464
+ private readonly cvaDisabled;
465
+ protected readonly isDisabled: _angular_core.Signal<boolean>;
466
+ protected readonly errorMessage: _angular_core.Signal<string>;
467
+ protected readonly hasError: _angular_core.Signal<boolean>;
468
+ protected readonly selectedLabel: _angular_core.Signal<any>;
469
+ protected readonly triggerClasses: _angular_core.Signal<string>;
470
+ protected readonly describedById: _angular_core.Signal<string | null>;
471
+ toggle(): void;
472
+ close(): void;
473
+ /** Llamado por una ui-option al elegirse. */
474
+ choose(v: string): void;
475
+ protected onDocClick(event: MouseEvent): void;
476
+ protected onKeydown(event: KeyboardEvent): void;
477
+ private focusActive;
478
+ private onChange;
479
+ private onTouched;
480
+ writeValue(value: string): void;
481
+ registerOnChange(fn: (value: string) => void): void;
482
+ registerOnTouched(fn: () => void): void;
483
+ setDisabledState(isDisabled: boolean): void;
484
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SelectComponent, never>;
485
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SelectComponent, "ui-select", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, ["options"], ["*"], true, never>;
486
+ }
487
+ /** Opción dentro de ui-select. */
488
+ declare class OptionComponent {
489
+ readonly value: _angular_core.InputSignal<string>;
490
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
491
+ private readonly select;
492
+ private readonly el;
493
+ protected readonly selected: _angular_core.Signal<boolean>;
494
+ protected readonly hostClasses: _angular_core.Signal<string>;
495
+ getLabel(): any;
496
+ focus(): void;
497
+ isActive(node: Element | null): boolean;
498
+ protected onClick(): void;
499
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<OptionComponent, never>;
500
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<OptionComponent, "ui-option", never, { "value": { "alias": "value"; "required": true; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
501
+ }
502
+
503
+ type TableAlign = 'left' | 'center' | 'right';
504
+ type SortDirection = 'asc' | 'desc' | null;
505
+ interface TableColumn {
506
+ /** Path al valor (soporta anidado "a.b.c"). Omitir para columnas solo-template (acciones). */
507
+ field?: string;
508
+ header: string;
509
+ sortable?: boolean;
510
+ align?: TableAlign;
511
+ /** Ancho CSS, p. ej. '120px' o '20%'. */
512
+ width?: string;
513
+ }
514
+ interface SortState {
515
+ field: string;
516
+ direction: SortDirection;
517
+ }
518
+ /** Resuelve un path anidado: getByPath(row, 'direccion.ciudad'). */
519
+ declare function getByPath(obj: unknown, path: string | undefined): unknown;
520
+
521
+ type Row = Record<string, unknown>;
522
+ /** Marca un template de celda para un field: <ng-template tableCell="estado">. */
523
+ declare class TableCellDirective {
524
+ readonly field: _angular_core.InputSignal<string>;
525
+ readonly template: TemplateRef<any>;
526
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TableCellDirective, never>;
527
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<TableCellDirective, "[tableCell]", never, { "field": { "alias": "tableCell"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
528
+ }
529
+ /**
530
+ * Tabla data-driven. Pinta `columns` automáticamente (incluido anidado);
531
+ * para render custom, declara <ng-template tableCell="<field>"> y se usa solo
532
+ * en esa columna. Soporta sorting, selección, loading y estado vacío.
533
+ */
534
+ declare class TableComponent {
535
+ readonly data: _angular_core.InputSignal<any[]>;
536
+ readonly columns: _angular_core.InputSignal<TableColumn[]>;
537
+ readonly loading: _angular_core.InputSignalWithTransform<boolean, unknown>;
538
+ readonly rowKey: _angular_core.InputSignal<string>;
539
+ readonly selectable: _angular_core.InputSignalWithTransform<boolean, unknown>;
540
+ readonly emptyMessage: _angular_core.InputSignal<string>;
541
+ readonly sortChange: _angular_core.OutputEmitterRef<SortState>;
542
+ readonly selectionChange: _angular_core.OutputEmitterRef<Row[]>;
543
+ private readonly cellTemplates;
544
+ protected readonly sort: _angular_core.WritableSignal<SortState>;
545
+ private readonly selectedKeys;
546
+ protected readonly skeletonRows: number[];
547
+ protected templateFor(field: string | undefined): TemplateRef<unknown> | null;
548
+ protected value(row: Row, field: string | undefined): unknown;
549
+ protected readonly rows: _angular_core.Signal<Row[]>;
550
+ protected align(a: TableAlign | undefined): "text-right" | "text-center" | "text-left";
551
+ protected toggleSort(col: TableColumn): void;
552
+ protected sortDir(col: TableColumn): SortDirection;
553
+ private keyOf;
554
+ protected isSelected(row: Row): boolean;
555
+ protected toggleRow(row: Row): void;
556
+ protected readonly allSelected: _angular_core.Signal<boolean>;
557
+ protected readonly someSelected: _angular_core.Signal<boolean>;
558
+ protected toggleAll(): void;
559
+ private emitSelection;
560
+ protected trackRow: (index: number, row: Row) => unknown;
561
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TableComponent, never>;
562
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TableComponent, "ui-table", never, { "data": { "alias": "data"; "required": false; "isSignal": true; }; "columns": { "alias": "columns"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "rowKey": { "alias": "rowKey"; "required": false; "isSignal": true; }; "selectable": { "alias": "selectable"; "required": false; "isSignal": true; }; "emptyMessage": { "alias": "emptyMessage"; "required": false; "isSignal": true; }; }, { "sortChange": "sortChange"; "selectionChange": "selectionChange"; }, ["cellTemplates"], never, true, never>;
563
+ }
564
+
565
+ type TabsVariant = 'underline' | 'pills';
566
+ type TabsSize = 'sm' | 'md';
567
+ /**
568
+ * Pestañas compositional. ui-tabs guarda la pestaña activa y arma la barra a
569
+ * partir de los ui-tab hijos; cada ui-tab proyecta su panel (visible si activo).
570
+ */
571
+ declare class TabsComponent {
572
+ readonly value: _angular_core.ModelSignal<string>;
573
+ readonly variant: _angular_core.InputSignal<TabsVariant>;
574
+ readonly size: _angular_core.InputSignal<TabsSize>;
575
+ readonly tabs: _angular_core.Signal<readonly TabComponent[]>;
576
+ constructor();
577
+ protected readonly listClasses: _angular_core.Signal<"inline-flex items-center gap-1 rounded-[var(--radius)] bg-[var(--color-muted)] p-1" | "flex items-center gap-1 border-b border-[var(--color-border)]">;
578
+ protected select(v: string): void;
579
+ protected tabClasses(tab: TabComponent): string;
580
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TabsComponent, never>;
581
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TabsComponent, "ui-tabs", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, ["tabs"], ["*"], true, never>;
582
+ }
583
+ /** Una pestaña: label/ícono para la barra + su panel proyectado. */
584
+ declare class TabComponent {
585
+ readonly value: _angular_core.InputSignal<string>;
586
+ readonly label: _angular_core.InputSignal<string>;
587
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
588
+ readonly iconTpl: _angular_core.Signal<TemplateRef<unknown> | undefined>;
589
+ private readonly tabs;
590
+ readonly isActive: _angular_core.Signal<boolean>;
591
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TabComponent, never>;
592
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TabComponent, "ui-tab", never, { "value": { "alias": "value"; "required": true; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, {}, never, ["[slot=icon]", "*"], true, never>;
593
+ }
594
+
595
+ interface TextareaValidationError {
596
+ kind?: string;
597
+ message?: string;
598
+ }
599
+ /**
600
+ * Campo de texto multilínea. Funciona con Signal Forms (`[formField]`),
601
+ * ControlValueAccessor (ngModel/Reactive) y two-way `[(value)]`.
602
+ */
603
+ declare class TextareaComponent implements ControlValueAccessor {
604
+ readonly value: _angular_core.ModelSignal<string>;
605
+ readonly label: _angular_core.InputSignal<string>;
606
+ readonly hint: _angular_core.InputSignal<string>;
607
+ readonly error: _angular_core.InputSignal<string>;
608
+ readonly placeholder: _angular_core.InputSignal<string>;
609
+ readonly name: _angular_core.InputSignal<string>;
610
+ readonly id: _angular_core.InputSignal<string>;
611
+ readonly rows: _angular_core.InputSignalWithTransform<number, unknown>;
612
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
613
+ readonly readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
614
+ readonly required: _angular_core.InputSignalWithTransform<boolean, unknown>;
615
+ /** Crece en alto según el contenido. */
616
+ readonly autoGrow: _angular_core.InputSignalWithTransform<boolean, unknown>;
617
+ readonly invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
618
+ readonly touched: _angular_core.InputSignalWithTransform<boolean, unknown>;
619
+ readonly errors: _angular_core.InputSignal<readonly TextareaValidationError[]>;
620
+ private readonly host;
621
+ private readonly cvaDisabled;
622
+ protected readonly isDisabled: _angular_core.Signal<boolean>;
623
+ protected readonly errorMessage: _angular_core.Signal<string>;
624
+ protected readonly hasError: _angular_core.Signal<boolean>;
625
+ protected readonly describedById: _angular_core.Signal<string | null>;
626
+ protected readonly fieldClasses: _angular_core.Signal<string>;
627
+ private onChange;
628
+ private onTouched;
629
+ writeValue(value: string): void;
630
+ registerOnChange(fn: (value: string) => void): void;
631
+ registerOnTouched(fn: () => void): void;
632
+ setDisabledState(isDisabled: boolean): void;
633
+ protected onInput(event: Event): void;
634
+ protected onBlur(): void;
635
+ private grow;
636
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TextareaComponent, never>;
637
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TextareaComponent, "ui-textarea", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "rows": { "alias": "rows"; "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; }; "autoGrow": { "alias": "autoGrow"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, never>;
638
+ }
639
+
640
+ type ToastType = 'info' | 'success' | 'warning' | 'error';
641
+ type ToastPosition = 'top-left' | 'top-center' | 'top-right' | 'bottom-left' | 'bottom-center' | 'bottom-right';
642
+ interface ToastAction {
643
+ label: string;
644
+ handler: () => void;
645
+ }
646
+ interface ToastOptions {
647
+ type?: ToastType;
648
+ title?: string;
649
+ message: string;
650
+ /** ms antes de cerrarse solo; 0 = no auto-cerrar. */
651
+ duration?: number;
652
+ action?: ToastAction;
653
+ }
654
+ /** Toast ya creado (con id interno). */
655
+ interface Toast {
656
+ id: number;
657
+ type: ToastType;
658
+ title?: string;
659
+ message: string;
660
+ action?: ToastAction;
661
+ }
662
+
663
+ /**
664
+ * API de notificaciones. Auto-monta el contenedor en el <body> al primer uso
665
+ * (cero setup para el consumidor).
666
+ *
667
+ * private toast = inject(ToastService);
668
+ * toast.success('Guardado');
669
+ * toast.error('Falló', { title: 'Error' });
670
+ */
671
+ declare class ToastService {
672
+ private readonly appRef;
673
+ private readonly envInjector;
674
+ readonly toasts: _angular_core.WritableSignal<Toast[]>;
675
+ readonly position: _angular_core.WritableSignal<ToastPosition>;
676
+ private mounted;
677
+ private seq;
678
+ show(opts: ToastOptions): number;
679
+ success(message: string, opts?: Omit<ToastOptions, 'type' | 'message'>): number;
680
+ error(message: string, opts?: Omit<ToastOptions, 'type' | 'message'>): number;
681
+ warning(message: string, opts?: Omit<ToastOptions, 'type' | 'message'>): number;
682
+ info(message: string, opts?: Omit<ToastOptions, 'type' | 'message'>): number;
683
+ dismiss(id: number): void;
684
+ setPosition(position: ToastPosition): void;
685
+ private ensureMounted;
686
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ToastService, never>;
687
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<ToastService>;
688
+ }
689
+
690
+ type TooltipPlacement = 'top' | 'bottom' | 'left' | 'right';
691
+ /**
692
+ * Tooltip accesible sin dependencias: se añade a cualquier elemento.
693
+ * Posiciona un elemento flotante (position: fixed) con auto-flip y flecha.
694
+ *
695
+ * <ui-button uiTooltip="Guardar" tooltipPlacement="top">Guardar</ui-button>
696
+ */
697
+ declare class TooltipDirective implements OnDestroy {
698
+ private readonly host;
699
+ private readonly renderer;
700
+ readonly text: _angular_core.InputSignal<string>;
701
+ readonly placement: _angular_core.InputSignal<TooltipPlacement>;
702
+ readonly delay: _angular_core.InputSignalWithTransform<number, unknown>;
703
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
704
+ private tooltipEl;
705
+ private arrowEl;
706
+ private openTimer;
707
+ private readonly tipId;
708
+ protected onEnter(): void;
709
+ protected onLeave(): void;
710
+ protected onEscape(): void;
711
+ private scheduleShow;
712
+ private show;
713
+ private position;
714
+ private hide;
715
+ private clearTimer;
716
+ ngOnDestroy(): void;
717
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TooltipDirective, never>;
718
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<TooltipDirective, "[uiTooltip]", never, { "text": { "alias": "uiTooltip"; "required": false; "isSignal": true; }; "placement": { "alias": "tooltipPlacement"; "required": false; "isSignal": true; }; "delay": { "alias": "tooltipDelay"; "required": false; "isSignal": true; }; "disabled": { "alias": "tooltipDisabled"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
719
+ }
720
+
721
+ type SwitchSize = 'sm' | 'md';
722
+ /**
723
+ * Interruptor on/off. Funciona con Signal Forms (`[formField]`, contrato
724
+ * FormCheckboxControl), ControlValueAccessor (ngModel/Reactive) y two-way `[(checked)]`.
725
+ */
726
+ declare class SwitchComponent implements ControlValueAccessor {
727
+ readonly checked: _angular_core.ModelSignal<boolean>;
728
+ readonly label: _angular_core.InputSignal<string>;
729
+ readonly description: _angular_core.InputSignal<string>;
730
+ readonly size: _angular_core.InputSignal<SwitchSize>;
731
+ readonly id: _angular_core.InputSignal<string>;
732
+ readonly name: _angular_core.InputSignal<string>;
733
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
734
+ readonly required: _angular_core.InputSignalWithTransform<boolean, unknown>;
735
+ private readonly cvaDisabled;
736
+ protected readonly isDisabled: _angular_core.Signal<boolean>;
737
+ protected readonly trackClasses: _angular_core.Signal<string>;
738
+ protected readonly thumbClasses: _angular_core.Signal<string>;
739
+ private onChange;
740
+ private onTouched;
741
+ writeValue(value: boolean): void;
742
+ registerOnChange(fn: (value: boolean) => void): void;
743
+ registerOnTouched(fn: () => void): void;
744
+ setDisabledState(isDisabled: boolean): void;
745
+ protected toggle(event: Event): void;
746
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SwitchComponent, never>;
747
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SwitchComponent, "ui-switch", never, { "checked": { "alias": "checked"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; }, { "checked": "checkedChange"; }, never, never, true, never>;
748
+ }
749
+
750
+ type HighstackTheme = 'indigo' | 'teal' | 'violet' | 'rose' | 'default';
751
+ interface HighstackConfig {
752
+ theme?: HighstackTheme;
753
+ /** Activa el modo oscuro añadiendo la clase `dark` al <body>. */
754
+ dark?: boolean;
15
755
  }
756
+ declare function provideHighstack(config: HighstackConfig): Provider[];
16
757
 
17
- export { ButtonComponent };
18
- export type { ButtonSize, ButtonVariant };
758
+ export { AccordionComponent, AccordionItemComponent, AlertComponent, AvatarComponent, AvatarGroupComponent, BadgeComponent, BreadcrumbComponent, BreadcrumbItemComponent, ButtonComponent, CardComponent, CardContentComponent, CardDescriptionComponent, CardFooterComponent, CardHeaderComponent, CardTitleComponent, CheckboxComponent, DropdownComponent, DropdownItemComponent, DropdownLabelComponent, DropdownSeparatorComponent, DropdownTriggerDirective, InputComponent, OptionComponent, PaginationComponent, ProgressComponent, RadioComponent, RadioGroupComponent, SelectComponent, SkeletonComponent, SpinnerComponent, SwitchComponent, TabComponent, TableCellDirective, TableComponent, TabsComponent, TextareaComponent, ToastService, TooltipDirective, getByPath, provideHighstack };
759
+ export type { AlertType, AlertVariant, AvatarShape, AvatarSize, AvatarStatus, BadgeColor, BadgeSize, BadgeVariant, ButtonSize, ButtonVariant, CardVariant, CheckboxSize, DropdownAlign, DropdownSide, HighstackConfig, HighstackTheme, InputSize, InputType, LoadingSize, PaginationSize, PaginationVariant, RadioAppearance, RadioOrientation, RadioSize, SelectSize, SortDirection, SortState, SwitchSize, TableAlign, TableColumn, TabsSize, TabsVariant, Toast, ToastAction, ToastOptions, ToastPosition, ToastType, TooltipPlacement };