@acontplus/ng-components 3.2.1 → 5.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.
@@ -1,5 +1,5 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { EventEmitter, TemplateRef, InjectionToken, OnDestroy, OnInit, ElementRef, Signal, ViewContainerRef, Injector, Binding, Type, ComponentRef, AfterViewInit, EnvironmentProviders, OnChanges, SimpleChanges, NgZone, QueryList, TrackByFunction, KeyValueChangeRecord, OutputEmitterRef, WritableSignal, AfterContentInit, PipeTransform } from '@angular/core';
2
+ import { TemplateRef, InjectionToken, OnDestroy, EventEmitter, OnInit, ElementRef, Signal, ViewContainerRef, Injector, Binding, Type, ComponentRef, AfterViewInit, EnvironmentProviders, DoCheck, OnChanges, SimpleChanges, NgZone, QueryList, TrackByFunction, KeyValueChangeRecord, OutputEmitterRef, WritableSignal, AfterContentInit, PipeTransform } from '@angular/core';
3
3
  import * as rxjs from 'rxjs';
4
4
  import { Observable, Subject } from 'rxjs';
5
5
  import { DialogPosition, MatDialogRef, MatDialogState } from '@angular/material/dialog';
@@ -7,6 +7,9 @@ import { ScrollStrategy } from '@angular/cdk/overlay';
7
7
  import * as _acontplus_ng_components from '@acontplus/ng-components';
8
8
  import { FormControl, ControlValueAccessor, FormGroup } from '@angular/forms';
9
9
  import { SelectOption, IconDefinition, ButtonVariant, ButtonType, MaterialButtonStyle, REPORT_FORMAT } from '@acontplus/ui-kit';
10
+ import { ErrorStateMatcher, ThemePalette } from '@angular/material/core';
11
+ import { MatAutocompleteSelectedEvent } from '@angular/material/autocomplete';
12
+ import { MatFormFieldAppearance } from '@angular/material/form-field';
10
13
  import { SafeHtml } from '@angular/platform-browser';
11
14
  import { MatChipInputEvent, MatChipEditedEvent } from '@angular/material/chips';
12
15
  import { LiveAnnouncer, FocusOrigin } from '@angular/cdk/a11y';
@@ -17,7 +20,6 @@ import { SortDirection, MatSort, Sort } from '@angular/material/sort';
17
20
  import { SelectionModel } from '@angular/cdk/collections';
18
21
  import { MatBadgePosition, MatBadgeSize } from '@angular/material/badge';
19
22
  import { MatButtonAppearance } from '@angular/material/button';
20
- import { ThemePalette } from '@angular/material/core';
21
23
  import { TooltipPosition, TooltipTouchGestures } from '@angular/material/tooltip';
22
24
  import { CdkDragDrop } from '@angular/cdk/drag-drop';
23
25
  import { MatMenu, MatMenuTrigger } from '@angular/material/menu';
@@ -32,21 +34,44 @@ import { MatSidenav, MatSidenavContent } from '@angular/material/sidenav';
32
34
  import { RouterLinkActive } from '@angular/router';
33
35
 
34
36
  type AcpAlertType = 'default' | 'info' | 'success' | 'warning' | 'danger';
37
+ /**
38
+ * - `soft`: tinted container (default).
39
+ * - `outlined`: neutral container with a colored border and icon.
40
+ * - `filled`: solid colored container, for high-emphasis messages.
41
+ */
42
+ type AcpAlertVariant = 'soft' | 'outlined' | 'filled';
35
43
  declare class AcpAlert {
36
- private _changeDetectorRef;
37
- get hostClassList(): string;
38
44
  /** The alert's type. Can be `default`, `info`, `success`, `warning` or `danger`. */
39
- type: AcpAlertType;
45
+ readonly type: _angular_core.InputSignal<AcpAlertType>;
46
+ /** Visual style: `soft` (default), `outlined` or `filled`. */
47
+ readonly variant: _angular_core.InputSignal<AcpAlertVariant>;
48
+ /** Optional bold heading shown above the content. */
49
+ readonly heading: _angular_core.InputSignal<string | undefined>;
50
+ /** Material icon name. Defaults to an icon per type (none for `default`). */
51
+ readonly icon: _angular_core.InputSignal<string | undefined>;
52
+ /** Whether to show the icon. */
53
+ readonly showIcon: _angular_core.InputSignalWithTransform<boolean, unknown>;
40
54
  /** Whether to display an inline close button. */
41
- dismissible: boolean;
55
+ readonly dismissible: _angular_core.InputSignalWithTransform<boolean, unknown>;
56
+ /** Accessible label of the close button. */
57
+ readonly closeLabel: _angular_core.InputSignal<string>;
42
58
  /** The alert's elevation (0~24). */
43
- elevation: number;
44
- /** Event emitted when the alert closed. */
45
- closed: EventEmitter<AcpAlert>;
46
- _onClosed(): void;
59
+ readonly elevation: _angular_core.InputSignalWithTransform<number, unknown>;
60
+ /** Event emitted when the alert is closed. */
61
+ readonly closed: _angular_core.OutputEmitterRef<AcpAlert>;
62
+ private readonly _open;
63
+ /** Whether the alert is visible. */
64
+ readonly isOpen: _angular_core.Signal<boolean>;
65
+ protected readonly resolvedIcon: _angular_core.Signal<string | null>;
66
+ /** Errors and warnings interrupt screen readers; the rest are announced politely. */
67
+ protected readonly role: _angular_core.Signal<"alert" | "status">;
68
+ protected readonly hostClassList: _angular_core.Signal<string>;
69
+ /** Hides the alert and emits `closed`. */
70
+ close(): void;
71
+ /** Shows the alert again after it was closed. */
72
+ open(): void;
47
73
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AcpAlert, never>;
48
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AcpAlert, "acp-alert", ["acpAlert"], { "type": { "alias": "type"; "required": false; }; "dismissible": { "alias": "dismissible"; "required": false; }; "elevation": { "alias": "elevation"; "required": false; }; }, { "closed": "closed"; }, never, ["*"], true, never>;
49
- static ngAcceptInputType_dismissible: unknown;
74
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AcpAlert, "acp-alert", ["acpAlert"], { "type": { "alias": "type"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "heading": { "alias": "heading"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "showIcon": { "alias": "showIcon"; "required": false; "isSignal": true; }; "dismissible": { "alias": "dismissible"; "required": false; "isSignal": true; }; "closeLabel": { "alias": "closeLabel"; "required": false; "isSignal": true; }; "elevation": { "alias": "elevation"; "required": false; "isSignal": true; }; }, { "closed": "closed"; }, never, ["*", "[acpAlertActions]"], true, never>;
50
75
  }
51
76
 
52
77
  type AcpBadgeColor = 'primary' | 'secondary' | 'tertiary' | 'success' | 'warning' | 'danger' | 'info' | 'neutral' | 'custom';
@@ -113,136 +138,6 @@ declare const ACP_BADGE_SHAPES: AcpBadgeShape[];
113
138
 
114
139
  declare const TREND_CONFIGS: Record<AcpBadgeTrend, AcpBadgeTrendConfig>;
115
140
 
116
- /**
117
- * A versatile card component that wraps Angular Material's mat-card with additional functionality
118
- * and customization options. This component provides a consistent card layout with configurable
119
- * header, content, and action areas.
120
- */
121
- declare class DynamicCard {
122
- /**
123
- * The title text to display in the card header.
124
- * @default null
125
- */
126
- cardTitle: _angular_core.InputSignal<string | null>;
127
- /**
128
- * The subtitle text to display in the card header.
129
- * @default null
130
- */
131
- cardSubtitle: _angular_core.InputSignal<string | null>;
132
- /**
133
- * URL for the avatar image to display in the card header.
134
- * @default null
135
- */
136
- avatarImageUrl: _angular_core.InputSignal<string | null>;
137
- /**
138
- * Whether to show the card header section.
139
- * @default false
140
- */
141
- isHeaderVisible: _angular_core.InputSignalWithTransform<boolean, unknown>;
142
- /**
143
- * CSS padding value for the card content area.
144
- * @default '1rem'
145
- */
146
- contentPadding: _angular_core.InputSignal<string>;
147
- /**
148
- * Whether to show a divider between the header and content sections.
149
- * @default false
150
- */
151
- hasDivider: _angular_core.InputSignalWithTransform<boolean, unknown>;
152
- /**
153
- * Whether to show the action buttons section.
154
- * @default false
155
- */
156
- areActionsVisible: _angular_core.InputSignalWithTransform<boolean, unknown>;
157
- /**
158
- * Text for the primary action button.
159
- * @default 'Confirm'
160
- */
161
- primaryButtonText: _angular_core.InputSignal<string>;
162
- /**
163
- * Text for the secondary action button.
164
- * @default 'Cancel'
165
- */
166
- secondaryButtonText: _angular_core.InputSignal<string>;
167
- /**
168
- * Material icon name for the primary button.
169
- * @default null
170
- */
171
- primaryButtonIcon: _angular_core.InputSignal<string | null>;
172
- /**
173
- * Material icon name for the secondary button.
174
- * @default null
175
- */
176
- secondaryButtonIcon: _angular_core.InputSignal<string | null>;
177
- /**
178
- * Alignment of the action buttons.
179
- * @default 'end'
180
- */
181
- buttonsPosition: _angular_core.InputSignal<"start" | "end">;
182
- /**
183
- * Event emitted when the primary button is clicked.
184
- */
185
- primaryButtonClicked: _angular_core.OutputEmitterRef<void>;
186
- /**
187
- * Event emitted when the secondary button is clicked.
188
- */
189
- secondaryButtonClicked: _angular_core.OutputEmitterRef<void>;
190
- /**
191
- * Event emitted when the card is clicked.
192
- */
193
- cardClicked: _angular_core.OutputEmitterRef<Event>;
194
- /**
195
- * Event emitted when a key is pressed down on the card.
196
- */
197
- keyDown: _angular_core.OutputEmitterRef<KeyboardEvent>;
198
- /**
199
- * Event emitted when a key is released on the card.
200
- */
201
- keyUp: _angular_core.OutputEmitterRef<KeyboardEvent>;
202
- /**
203
- * Event emitted when a key is pressed on the card.
204
- */
205
- keyPress: _angular_core.OutputEmitterRef<KeyboardEvent>;
206
- /**
207
- * Handles the primary button click event.
208
- * Stops event propagation and emits the primaryButtonClicked event.
209
- * @param event The click event
210
- */
211
- handlePrimaryButtonClick(event: Event): void;
212
- /**
213
- * Handles the secondary button click event.
214
- * Stops event propagation and emits the secondaryButtonClicked event.
215
- * @param event The click event
216
- */
217
- handleSecondaryButtonClick(event: Event): void;
218
- /**
219
- * Handles the card click event.
220
- * Emits the cardClicked event with the original event.
221
- * @param event The click event
222
- */
223
- handleCardClick(event: Event): void;
224
- /**
225
- * Handles the key down event on the card.
226
- * Emits the keyDown event with the original keyboard event.
227
- * @param event The keyboard event
228
- */
229
- handleKeyDown(event: KeyboardEvent): void;
230
- /**
231
- * Handles the key up event on the card.
232
- * Emits the keyUp event with the original keyboard event.
233
- * @param event The keyboard event
234
- */
235
- handleKeyUp(event: KeyboardEvent): void;
236
- /**
237
- * Handles the key press event on the card.
238
- * Emits the keyPress event with the original keyboard event.
239
- * @param event The keyboard event
240
- */
241
- handleKeyPress(event: KeyboardEvent): void;
242
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<DynamicCard, never>;
243
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DynamicCard, "acp-dynamic-card", never, { "cardTitle": { "alias": "cardTitle"; "required": false; "isSignal": true; }; "cardSubtitle": { "alias": "cardSubtitle"; "required": false; "isSignal": true; }; "avatarImageUrl": { "alias": "avatarImageUrl"; "required": false; "isSignal": true; }; "isHeaderVisible": { "alias": "isHeaderVisible"; "required": false; "isSignal": true; }; "contentPadding": { "alias": "contentPadding"; "required": false; "isSignal": true; }; "hasDivider": { "alias": "hasDivider"; "required": false; "isSignal": true; }; "areActionsVisible": { "alias": "areActionsVisible"; "required": false; "isSignal": true; }; "primaryButtonText": { "alias": "primaryButtonText"; "required": false; "isSignal": true; }; "secondaryButtonText": { "alias": "secondaryButtonText"; "required": false; "isSignal": true; }; "primaryButtonIcon": { "alias": "primaryButtonIcon"; "required": false; "isSignal": true; }; "secondaryButtonIcon": { "alias": "secondaryButtonIcon"; "required": false; "isSignal": true; }; "buttonsPosition": { "alias": "buttonsPosition"; "required": false; "isSignal": true; }; }, { "primaryButtonClicked": "primaryButtonClicked"; "secondaryButtonClicked": "secondaryButtonClicked"; "cardClicked": "cardClicked"; "keyDown": "keyDown"; "keyUp": "keyUp"; "keyPress": "keyPress"; }, never, ["*"], true, never>;
244
- }
245
-
246
141
  /**
247
142
  * Context Menu Types and Interfaces
248
143
  * Defines the API contract for the ContextMenu component
@@ -387,16 +282,27 @@ declare class AcpContextMenuService {
387
282
  private readonly openMenuRef;
388
283
  private readonly menuItems;
389
284
  private readonly contextData;
285
+ private readonly escapeCloses;
286
+ private outsideClickCloses;
287
+ private openOwner;
288
+ /** @internal Items rendered by the open panel. */
289
+ readonly activeItems: _angular_core.Signal<AcpContextMenuItem[]>;
290
+ /** @internal Data passed to the open panel. */
291
+ readonly activeData: _angular_core.Signal<unknown>;
292
+ /** @internal Whether Escape closes the open panel. */
293
+ readonly closeOnEscape: _angular_core.Signal<boolean>;
390
294
  private readonly itemSelected$;
295
+ private readonly closed$;
391
296
  constructor();
392
297
  /**
393
298
  * Open a context menu at the specified position
394
299
  */
395
- open(items: AcpContextMenuItem[], config: AcpContextMenuOpenConfig): Promise<AcpContextMenuRef>;
300
+ open(items: AcpContextMenuItem[], config: AcpContextMenuOpenConfig, owner?: unknown): Promise<AcpContextMenuRef>;
396
301
  /**
397
302
  * Close all open context menus
398
303
  */
399
304
  closeAll(): void;
305
+ private closeOverlay;
400
306
  /**
401
307
  * Check if any menu is open
402
308
  */
@@ -404,7 +310,15 @@ declare class AcpContextMenuService {
404
310
  /**
405
311
  * Get the item selection subject
406
312
  */
407
- getItemSelected$(): rxjs.Observable<AcpContextMenuItemContext>;
313
+ getItemSelected$(): Observable<AcpContextMenuItemContext>;
314
+ /**
315
+ * Item selections of menus opened by the given owner
316
+ */
317
+ itemSelectedFor$(owner: unknown): Observable<AcpContextMenuItemContext>;
318
+ /**
319
+ * Emits when a menu opened by the given owner closes, for any reason
320
+ */
321
+ closedFor$(owner: unknown): Observable<void>;
408
322
  /**
409
323
  * Emit item selection
410
324
  */
@@ -426,13 +340,11 @@ declare class AcpContextMenuService {
426
340
  */
427
341
  private createMenuRef;
428
342
  /**
429
- * Setup handler for closing menu on outside click
343
+ * Single outside-click mechanism. A backdrop is not used: CDK renders overlays as popovers, so
344
+ * the backdrop does not cover the page, and without it a right-click on another element reaches
345
+ * that element directly (opening its own menu).
430
346
  */
431
- private setupOutsideClickHandler;
432
- /**
433
- * Check if click is inside the menu
434
- */
435
- private isClickInsideMenu;
347
+ private listenForOutsideClicks;
436
348
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AcpContextMenuService, never>;
437
349
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<AcpContextMenuService>;
438
350
  }
@@ -526,8 +438,10 @@ declare class AcpContextMenuPanel implements OnInit, OnDestroy {
526
438
  private readonly ngZone;
527
439
  private readonly elementRef;
528
440
  menuContainer?: ElementRef;
529
- items: _angular_core.WritableSignal<AcpContextMenuItem[]>;
530
- contextData: _angular_core.WritableSignal<unknown>;
441
+ private readonly initialItems;
442
+ private readonly initialData;
443
+ items: _angular_core.Signal<AcpContextMenuItem[]>;
444
+ contextData: _angular_core.Signal<unknown>;
531
445
  selectedIndex: _angular_core.WritableSignal<number>;
532
446
  expandedIndex: _angular_core.WritableSignal<number>;
533
447
  private destroy$;
@@ -554,21 +468,14 @@ declare class AcpContextMenuPanel implements OnInit, OnDestroy {
554
468
  * Get item classes
555
469
  */
556
470
  getItemClasses(item: AcpContextMenuItem, index: number): Record<string, boolean>;
471
+ private isSelectable;
557
472
  /**
558
- * Select next item
473
+ * Move the selection to the next selectable item in the given direction, wrapping around
559
474
  */
475
+ private moveSelection;
560
476
  private selectNext;
561
- /**
562
- * Select previous item
563
- */
564
477
  private selectPrevious;
565
- /**
566
- * Select first item
567
- */
568
478
  private selectFirst;
569
- /**
570
- * Select last item
571
- */
572
479
  private selectLast;
573
480
  /**
574
481
  * Expand selected item
@@ -1148,7 +1055,7 @@ declare class AcpDialogContainer implements AfterViewInit {
1148
1055
  /** Pending declarative titlebar template, captured before the outlet is ready. */
1149
1056
  private readonly pendingTitlebarTemplate;
1150
1057
  /** Alignment requested by a declarative actions template. */
1151
- protected readonly declarativeActionsAlign: _angular_core.WritableSignal<"start" | "end" | "center" | undefined>;
1058
+ protected readonly declarativeActionsAlign: _angular_core.WritableSignal<"start" | "center" | "end" | undefined>;
1152
1059
  /** Title requested by a declarative titlebar template. */
1153
1060
  protected readonly declarativeTitle: _angular_core.WritableSignal<string | undefined>;
1154
1061
  /** Outlet object provided to content so `acp-dialog-actions` can register itself. */
@@ -1160,7 +1067,7 @@ declare class AcpDialogContainer implements AfterViewInit {
1160
1067
  /** Title used for the actions footer label. */
1161
1068
  protected readonly resolvedDialogTitle: Signal<string | undefined>;
1162
1069
  /** Alignment used for the actions footer. */
1163
- protected readonly resolvedActionsAlign: Signal<"start" | "end" | "center">;
1070
+ protected readonly resolvedActionsAlign: Signal<"start" | "center" | "end">;
1164
1071
  /** Whether the current content is a plain string. */
1165
1072
  protected readonly isStringContent: _angular_core.WritableSignal<boolean>;
1166
1073
  get config(): _acontplus_ng_components.AcpDialogConfig<unknown>;
@@ -1246,7 +1153,7 @@ declare class AcpDialogActions implements AfterViewInit {
1246
1153
  protected readonly renderInline: _angular_core.WritableSignal<boolean>;
1247
1154
  protected readonly hostDisplay: _angular_core.WritableSignal<string>;
1248
1155
  /** Alignment of the action buttons. @default 'end' */
1249
- align: _angular_core.InputSignal<"start" | "end" | "center">;
1156
+ align: _angular_core.InputSignal<"start" | "center" | "end">;
1250
1157
  /** Configured footer actions. When omitted, the component works as a declarative slot. */
1251
1158
  actions: _angular_core.InputSignal<AcpDialogAction<unknown>[] | undefined>;
1252
1159
  /** Optional title used to label the actions footer. */
@@ -1584,6 +1491,113 @@ declare class DynamicSelect implements OnInit, OnDestroy {
1584
1491
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<DynamicSelect, "acp-dynamic-select", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": true; "isSignal": true; }; "selectedValue": { "alias": "selectedValue"; "required": false; "isSignal": true; }; "className": { "alias": "className"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "searchable": { "alias": "searchable"; "required": false; "isSignal": true; }; "virtualScroll": { "alias": "virtualScroll"; "required": false; "isSignal": true; }; "dropdownPosition": { "alias": "dropdownPosition"; "required": false; "isSignal": true; }; "closeOnSelect": { "alias": "closeOnSelect"; "required": false; "isSignal": true; }; "hideSelected": { "alias": "hideSelected"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "selectOnTab": { "alias": "selectOnTab"; "required": false; "isSignal": true; }; "openOnEnter": { "alias": "openOnEnter"; "required": false; "isSignal": true; }; "selectableGroup": { "alias": "selectableGroup"; "required": false; "isSignal": true; }; "selectableGroupAsModel": { "alias": "selectableGroupAsModel"; "required": false; "isSignal": true; }; "clearOnBackspace": { "alias": "clearOnBackspace"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "searchWhileComposing": { "alias": "searchWhileComposing"; "required": false; "isSignal": true; }; "minTermLength": { "alias": "minTermLength"; "required": false; "isSignal": true; }; "editableSearchTerm": { "alias": "editableSearchTerm"; "required": false; "isSignal": true; }; "typeToSearchText": { "alias": "typeToSearchText"; "required": false; "isSignal": true; }; "addTagText": { "alias": "addTagText"; "required": false; "isSignal": true; }; "loadingText": { "alias": "loadingText"; "required": false; "isSignal": true; }; "clearAllText": { "alias": "clearAllText"; "required": false; "isSignal": true; }; "notFoundText": { "alias": "notFoundText"; "required": false; "isSignal": true; }; }, { "selectionChange": "selectionChange"; }, never, never, true, never>;
1585
1492
  }
1586
1493
 
1494
+ /** Property name or function that reads a value from an item. */
1495
+ type AcpSearchSelectAccessor<T, R> = keyof T | ((item: T) => R);
1496
+ /** Context of the `#option` template. */
1497
+ interface AcpSearchSelectOptionContext<T> {
1498
+ $implicit: T;
1499
+ group: T | null;
1500
+ }
1501
+ /** Payload of `optionSelected`. */
1502
+ interface AcpSearchSelectSelection<T, V = unknown> {
1503
+ value: V;
1504
+ item: T;
1505
+ group: T | null;
1506
+ }
1507
+
1508
+ interface OptionVm<T> {
1509
+ key: string;
1510
+ label: string;
1511
+ value: unknown;
1512
+ source: T;
1513
+ group: T | null;
1514
+ }
1515
+ /** `label === null` holds loose options rendered without `mat-optgroup`. */
1516
+ interface GroupVm<T> {
1517
+ label: string | null;
1518
+ options: OptionVm<T>[];
1519
+ }
1520
+ /** Matches `1` with `'1'`, useful when ids come as strings from forms or query params. */
1521
+ declare const acpSearchSelectLooseEquals: (a: unknown, b: unknown) => boolean;
1522
+ /** Lowercase and strip accents, so "camion" matches "Camión". */
1523
+ declare const acpSearchSelectNormalize: (text: string) => string;
1524
+ /**
1525
+ * Searchable select built on `mat-autocomplete`. Accepts flat or one-level tree lists:
1526
+ * an item whose `children` is an array renders as a group.
1527
+ * Works with `ngModel`, reactive forms and `[(value)]`.
1528
+ */
1529
+ declare class AcpSearchSelect<T = any> implements ControlValueAccessor, DoCheck {
1530
+ private readonly document;
1531
+ private readonly ngControl;
1532
+ private readonly parentForm;
1533
+ private readonly parentFormGroup;
1534
+ readonly items: _angular_core.InputSignal<T[] | null | undefined>;
1535
+ readonly bindLabel: _angular_core.InputSignal<AcpSearchSelectAccessor<T, string>>;
1536
+ readonly bindValue: _angular_core.InputSignal<AcpSearchSelectAccessor<T, unknown>>;
1537
+ readonly children: _angular_core.InputSignal<AcpSearchSelectAccessor<T, T[] | undefined>>;
1538
+ readonly groupLabel: _angular_core.InputSignal<AcpSearchSelectAccessor<T, string>>;
1539
+ readonly compareWith: _angular_core.InputSignal<(a: unknown, b: unknown) => boolean>;
1540
+ /** Custom match. Receives the item and the normalized query. */
1541
+ readonly filterFn: _angular_core.InputSignal<((item: T, query: string) => boolean) | null>;
1542
+ /** Set to `false` when `items` already come filtered from the server (see `searchChange`). */
1543
+ readonly localFilter: _angular_core.InputSignalWithTransform<boolean, unknown>;
1544
+ /** Value written when the field is cleared, e.g. `0` for "all". */
1545
+ readonly emptyValue: _angular_core.InputSignal<unknown>;
1546
+ readonly label: _angular_core.InputSignal<string>;
1547
+ readonly placeholder: _angular_core.InputSignal<string>;
1548
+ readonly hint: _angular_core.InputSignal<string>;
1549
+ readonly errorText: _angular_core.InputSignal<string>;
1550
+ readonly noResultsText: _angular_core.InputSignal<string>;
1551
+ readonly loadingText: _angular_core.InputSignal<string>;
1552
+ readonly clearLabel: _angular_core.InputSignal<string>;
1553
+ readonly appearance: _angular_core.InputSignal<MatFormFieldAppearance>;
1554
+ readonly required: _angular_core.InputSignalWithTransform<boolean, unknown>;
1555
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
1556
+ readonly clearable: _angular_core.InputSignalWithTransform<boolean, unknown>;
1557
+ readonly loading: _angular_core.InputSignalWithTransform<boolean, unknown>;
1558
+ readonly value: _angular_core.ModelSignal<unknown>;
1559
+ readonly optionSelected: _angular_core.OutputEmitterRef<AcpSearchSelectSelection<T, unknown>>;
1560
+ readonly cleared: _angular_core.OutputEmitterRef<void>;
1561
+ /** Raw text typed by the user; debounce it in the consumer for server-side search. */
1562
+ readonly searchChange: _angular_core.OutputEmitterRef<string>;
1563
+ private readonly input;
1564
+ private readonly trigger;
1565
+ private readonly inputEl;
1566
+ readonly optionTemplate: _angular_core.Signal<TemplateRef<AcpSearchSelectOptionContext<T>> | undefined>;
1567
+ /** Text typed by the user; `null` while not searching. */
1568
+ protected readonly query: _angular_core.WritableSignal<string | null>;
1569
+ private readonly formDisabled;
1570
+ protected readonly isDisabled: _angular_core.Signal<boolean>;
1571
+ private onChange;
1572
+ private onTouched;
1573
+ protected readonly errorStateMatcher: ErrorStateMatcher;
1574
+ constructor();
1575
+ /** The inner `matInput` has no `NgControl`, so it never refreshes its error state by itself. */
1576
+ ngDoCheck(): void;
1577
+ private readonly groups;
1578
+ protected readonly filteredGroups: _angular_core.Signal<GroupVm<T>[]>;
1579
+ private readonly selected;
1580
+ protected readonly text: _angular_core.Signal<string>;
1581
+ protected readonly hasValue: _angular_core.Signal<boolean>;
1582
+ protected readonly displayWith: (option: OptionVm<T> | string | null) => string;
1583
+ /** Clears the selection and the search text. */
1584
+ clear(): void;
1585
+ protected selectAll(event: Event): void;
1586
+ protected onInput(event: Event): void;
1587
+ /** Leaving the field without picking drops the typed text and shows the selection again. */
1588
+ protected onBlur(): void;
1589
+ /** The panel also closes while typing (e.g. no results yet); keep the text in that case. */
1590
+ protected onClosed(): void;
1591
+ protected onSelected(event: MatAutocompleteSelectedEvent): void;
1592
+ writeValue(value: unknown): void;
1593
+ registerOnChange(fn: (value: unknown) => void): void;
1594
+ registerOnTouched(fn: () => void): void;
1595
+ setDisabledState(isDisabled: boolean): void;
1596
+ private setValue;
1597
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AcpSearchSelect<any>, never>;
1598
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AcpSearchSelect<any>, "acp-search-select", ["acpSearchSelect"], { "items": { "alias": "items"; "required": true; "isSignal": true; }; "bindLabel": { "alias": "bindLabel"; "required": false; "isSignal": true; }; "bindValue": { "alias": "bindValue"; "required": false; "isSignal": true; }; "children": { "alias": "children"; "required": false; "isSignal": true; }; "groupLabel": { "alias": "groupLabel"; "required": false; "isSignal": true; }; "compareWith": { "alias": "compareWith"; "required": false; "isSignal": true; }; "filterFn": { "alias": "filterFn"; "required": false; "isSignal": true; }; "localFilter": { "alias": "localFilter"; "required": false; "isSignal": true; }; "emptyValue": { "alias": "emptyValue"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "errorText": { "alias": "errorText"; "required": false; "isSignal": true; }; "noResultsText": { "alias": "noResultsText"; "required": false; "isSignal": true; }; "loadingText": { "alias": "loadingText"; "required": false; "isSignal": true; }; "clearLabel": { "alias": "clearLabel"; "required": false; "isSignal": true; }; "appearance": { "alias": "appearance"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "optionSelected": "optionSelected"; "cleared": "cleared"; "searchChange": "searchChange"; }, ["optionTemplate"], never, true, never>;
1599
+ }
1600
+
1587
1601
  declare class UserIcon {
1588
1602
  size: _angular_core.InputSignal<string>;
1589
1603
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UserIcon, never>;
@@ -2011,6 +2025,7 @@ interface DataGridRowSelectionFormatter<T = any> {
2011
2025
  }
2012
2026
  type DataGridRowClassFormatter<T = any> = Record<string, (rowData: T, index: number) => boolean>;
2013
2027
  type DataGridButtonType = MatButtonAppearance | 'icon';
2028
+ type DataGridSize = 'small' | 'medium' | 'large';
2014
2029
  /**
2015
2030
  * Represents the default options for the grid that can be configured
2016
2031
  * using the `DATA_GRID_DEFAULT_OPTIONS` injection token.
@@ -2040,6 +2055,7 @@ interface DataGridDefaultOptions {
2040
2055
  hideRowSelectionCheckbox?: boolean;
2041
2056
  disableRowClickSelection?: boolean;
2042
2057
  cellSelectable?: boolean;
2058
+ keyboardNavigation?: boolean;
2043
2059
  showToolbar?: boolean;
2044
2060
  toolbarTitle?: string;
2045
2061
  columnHideable?: boolean;
@@ -2304,10 +2320,21 @@ declare class AcpGridExpansionToggle {
2304
2320
 
2305
2321
  declare const DATA_GRID_DEFAULT_OPTIONS: InjectionToken<DataGridDefaultOptions>;
2306
2322
  declare class DataGrid implements AfterViewInit, OnChanges {
2307
- size: _angular_core.InputSignal<"small" | "medium" | "normal">;
2323
+ /** Densidad de la tabla. `'normal'` está obsoleto y equivale a `'medium'`. */
2324
+ size: _angular_core.InputSignal<"normal" | DataGridSize>;
2325
+ protected readonly _size: _angular_core.Signal<DataGridSize>;
2308
2326
  protected _animationsDisabled: boolean;
2309
2327
  private readonly _utils;
2310
2328
  private readonly _changeDetectorRef;
2329
+ private readonly _elementRef;
2330
+ private readonly _injector;
2331
+ private static _nextId;
2332
+ /** Unique id of the grid, used for row ids and `aria-controls`. */
2333
+ readonly gridId: string;
2334
+ private readonly _activeRow;
2335
+ private _focusFirstRowOnRender;
2336
+ /** @internal Set by `acpGridNavigationFor` to activate the first row when data changes. */
2337
+ _activateFirstRowOnDataChange: boolean;
2311
2338
  private readonly _defaultOptions;
2312
2339
  table: MatTable<any>;
2313
2340
  paginator: MatPaginator;
@@ -2484,8 +2511,15 @@ declare class DataGrid implements AfterViewInit, OnChanges {
2484
2511
  noResultText: string;
2485
2512
  /** The template for the empty data. */
2486
2513
  noResultTemplate: TemplateRef<any>;
2487
- keyboardNavigation: _angular_core.InputSignal<boolean>;
2514
+ /**
2515
+ * Whether rows can be navigated with the keyboard: arrows, Home/End, PageUp/PageDown,
2516
+ * Enter (same as a click), Space (toggle selection) and Ctrl+A (select all).
2517
+ */
2518
+ keyboardNavigation: _angular_core.InputSignalWithTransform<boolean, unknown>;
2519
+ /** Index (within the rendered page) of the row to mark as active. */
2488
2520
  highlightedRowIndex: _angular_core.InputSignal<number>;
2521
+ private readonly _highlightedRowEffect;
2522
+ /** Event emitted when the active row changes. */
2489
2523
  focusedRowChange: _angular_core.OutputEmitterRef<{
2490
2524
  row: any;
2491
2525
  index: number;
@@ -2522,6 +2556,37 @@ declare class DataGrid implements AfterViewInit, OnChanges {
2522
2556
  ngOnChanges(changes: SimpleChanges): void;
2523
2557
  ngAfterViewInit(): void;
2524
2558
  _countPinnedPosition(): void;
2559
+ /** Rows currently rendered (after sorting and front-end paging). */
2560
+ get renderedRows(): any[];
2561
+ /** Index of the active row within the rendered rows, or -1. */
2562
+ get activeRowIndex(): number;
2563
+ /** The active row, or `null`. */
2564
+ get activeRow(): any;
2565
+ /**
2566
+ * Marks a rendered row as active.
2567
+ * @param focus Whether to move the browser focus to the row.
2568
+ */
2569
+ setActiveRow(index: number, focus?: boolean): void;
2570
+ /** Moves the active row by `delta` rows; starts at the first row when none is active. */
2571
+ moveActiveRow(delta: number, focus?: boolean): void;
2572
+ /** Runs the click behavior (selection and `rowClick`) on the active row. */
2573
+ activateActiveRow(event: MouseEvent | KeyboardEvent): boolean;
2574
+ /** Goes to the next page, if there is one, and activates its first row. */
2575
+ nextPage(focus?: boolean): void;
2576
+ /** Goes to the previous page, if there is one, and activates its first row. */
2577
+ previousPage(focus?: boolean): void;
2578
+ _rowId(index: number): string;
2579
+ _activeRowId(): string | null;
2580
+ _isActiveRow(row: unknown): boolean;
2581
+ _rowTabIndex(row: unknown, index: number): number | null;
2582
+ _onRowFocus(row: unknown): void;
2583
+ private _setActiveRow;
2584
+ private _rowElement;
2585
+ private _changePage;
2586
+ private _syncActiveRowWithData;
2587
+ private _activateFirstRowAfterRender;
2588
+ private _isEditableTarget;
2589
+ private _handleRowKeyDown;
2525
2590
  _getIndex(index: number | undefined, dataIndex: number): number;
2526
2591
  _onSortChange(sort: Sort): void;
2527
2592
  _onRowDataChange(record: KeyValueChangeRecord<string, any>): void;
@@ -2530,7 +2595,7 @@ declare class DataGrid implements AfterViewInit, OnChanges {
2530
2595
  /** Cell select event */
2531
2596
  _selectCell(cellRef: AcpGridSelectableCell, rowData: Record<string, any>, colDef: DataGridColumn): void;
2532
2597
  /** Row select event */
2533
- _selectRow(event: MouseEvent, rowData: Record<string, any>, index: number): void;
2598
+ _selectRow(event: MouseEvent | KeyboardEvent, rowData: Record<string, any>, index: number): void;
2534
2599
  /** Whether the number of selected elements matches the total number of rows. */
2535
2600
  _isAllSelected(): boolean;
2536
2601
  /** Select all rows if they are not all selected; otherwise clear selection. */
@@ -2590,85 +2655,25 @@ declare class DataGrid implements AfterViewInit, OnChanges {
2590
2655
  }
2591
2656
 
2592
2657
  /**
2593
- * Interfaz que define un elemento que puede recibir el foco y participar en la navegación por teclado.
2594
- */
2595
- interface FocusableElement {
2596
- /** El ElementRef del elemento DOM */
2597
- element: ElementRef;
2598
- /** Un nombre único para identificar el elemento en el sistema de navegación */
2599
- name: string;
2600
- /** Callback opcional que se ejecuta cuando se presiona la flecha arriba y no hay más elementos arriba */
2601
- onArrowUp?: () => void;
2602
- /** Callback opcional que se ejecuta cuando se presiona la flecha abajo y no hay más elementos abajo */
2603
- onArrowDown?: () => void;
2604
- /** Callback opcional que se ejecuta cuando se presiona la flecha izquierda */
2605
- onArrowLeft?: () => void;
2606
- /** Callback opcional que se ejecuta cuando se presiona la flecha derecha */
2607
- onArrowRight?: () => void;
2608
- /** Callback opcional que se ejecuta cuando el elemento recibe el foco */
2609
- onFocus?: (index?: number) => void;
2610
- /** Callback opcional que se ejecuta cuando el índice enfocado dentro del elemento cambia (ej: una fila en una tabla) */
2611
- onFocusedChange?: (index: number) => void;
2612
- }
2613
- /**
2614
- * Servicio que gestiona la navegación por teclado entre componentes registrados.
2615
- * Permite mover el foco entre elementos usando las teclas de flecha y centraliza el estado del foco.
2658
+ * Lets a text input drive the rows of an `acp-data-grid` while keeping the focus in the input,
2659
+ * like an autocomplete: ArrowDown/ArrowUp move the active row, PageDown/PageUp change page and
2660
+ * Enter runs the row click (selection and `rowClick`) on the active row.
2661
+ *
2662
+ * @example
2663
+ * ```html
2664
+ * <input matInput [acpGridNavigationFor]="grid" />
2665
+ * <acp-data-grid #grid [data]="results" [columns]="columns" (rowClick)="pick($event.rowData)" />
2666
+ * ```
2616
2667
  */
2617
- declare class KeyboardNavigationService {
2618
- /** Array privado que contiene todos los elementos registrados para la navegación */
2619
- private readonly focusableElements;
2620
- /** Signal que mantiene el índice del elemento actualmente enfocado en el array `focusableElements` */
2621
- private readonly currentFocusIndex;
2622
- /** Subject para notificar la destrucción del servicio y limpiar suscripciones */
2623
- private readonly destroy$;
2624
- /**
2625
- * Signal público que expone el índice de la fila enfocada (usado por componentes como DataGrid).
2626
- * Es un signal escribible porque el componente hijo (DataGrid) es quien actualiza su valor.
2627
- */
2628
- focusedRowIndex: _angular_core.WritableSignal<number>;
2629
- /**
2630
- * Signal público que expone el nombre del elemento actualmente enfocado.
2631
- * Es un signal `computed` que se deriva automáticamente del `currentFocusIndex` privado.
2632
- */
2633
- focusedElementName: _angular_core.Signal<string>;
2634
- /**
2635
- * Registra un nuevo elemento en el sistema de navegación por teclado.
2636
- * @param element El objeto FocusableElement a registrar.
2637
- */
2638
- registerElement(element: FocusableElement): void;
2639
- /**
2640
- * Elimina un elemento del sistema de navegación por teclado.
2641
- * @param element El ElementRef del elemento a desregistrar.
2642
- */
2643
- unregisterElement(element: ElementRef): void;
2644
- /**
2645
- * Mueve el foco a un elemento específico por su nombre.
2646
- * @param name El nombre único del elemento al que se quiere mover el foco.
2647
- * @param index Opcional: el índice interno a enfocar (ej: el índice de una fila en una tabla).
2648
- */
2649
- focusElement(name: string, index?: number): void;
2650
- /**
2651
- * Actualiza el índice enfocado (usado por componentes internos como una tabla).
2652
- * @param index El nuevo índice enfocado.
2653
- */
2654
- updateFocusedIndex(index: number): void;
2655
- /**
2656
- * Maneja la lógica de navegación basada en la tecla presionada.
2657
- * @param key La tecla presionada ('ArrowUp', 'ArrowDown', etc.).
2658
- */
2659
- private handleKeyNavigation;
2660
- /**
2661
- * Resetea el índice de la fila enfocada a -1.
2662
- * Útil cuando los datos de un componente cambian y el foco anterior ya no es válido.
2663
- */
2664
- resetFocusedRowIndex(): void;
2665
- /**
2666
- * Método de limpieza para ser llamado cuando el servicio se destruye.
2667
- * Cierra el Subject `destroy$` para completar todas las suscripciones activas.
2668
- */
2669
- onDestroy(): void;
2670
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<KeyboardNavigationService, never>;
2671
- static ɵprov: _angular_core.ɵɵInjectableDeclaration<KeyboardNavigationService>;
2668
+ declare class AcpGridNavigationFor {
2669
+ /** The grid controlled by this input. */
2670
+ readonly grid: _angular_core.InputSignal<DataGrid>;
2671
+ /** Whether the first row becomes active each time the grid data changes. */
2672
+ readonly acpGridNavigationActivateFirstRow: _angular_core.InputSignalWithTransform<boolean, unknown>;
2673
+ constructor();
2674
+ _onKeydown(event: KeyboardEvent): void;
2675
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AcpGridNavigationFor, never>;
2676
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<AcpGridNavigationFor, "[acpGridNavigationFor]", ["acpGridNavigationFor"], { "grid": { "alias": "acpGridNavigationFor"; "required": true; "isSignal": true; }; "acpGridNavigationActivateFirstRow": { "alias": "acpGridNavigationActivateFirstRow"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
2672
2677
  }
2673
2678
 
2674
2679
  interface DateRangePickerOptions {
@@ -4051,53 +4056,47 @@ declare class AcpCheckboxGroup implements AfterViewInit, OnDestroy, ControlValue
4051
4056
  }
4052
4057
 
4053
4058
  /**
4054
- * Card appearance variants
4059
+ * Card appearance variants. Mirrors Angular Material's `MatCardAppearance`
4060
+ * (`elevated` maps to Material's `raised`).
4055
4061
  */
4056
- type AcpCardAppearance = 'default' | 'outlined' | 'elevated' | 'filled' | 'interactive' | 'compact';
4062
+ type AcpCardAppearance = 'elevated' | 'outlined' | 'filled';
4057
4063
  /**
4058
- * Card elevation levels (Material Design)
4064
+ * Card elevation levels, mapped to `--mat-sys-level{n}`. Only applies to `elevated` cards.
4059
4065
  */
4060
4066
  type AcpCardElevation = 0 | 1 | 2 | 3 | 4 | 5;
4061
4067
  /**
4062
- * Card padding options
4068
+ * Content padding options.
4063
4069
  */
4064
4070
  type AcpCardPadding = 'none' | 'small' | 'medium' | 'large';
4065
4071
  /**
4066
- * Card background color variants (Material Design)
4072
+ * Card color variants based on Material Design 3 system roles.
4067
4073
  */
4068
- type AcpCardBackgroundColor = 'primary' | 'primary-container' | 'secondary' | 'secondary-container' | 'error' | 'error-container' | 'surface' | 'surface-variant' | 'surface-container-highest' | 'surface-container-high' | 'surface-container' | 'surface-container-low' | 'surface-container-lowest' | 'inverse-surface' | 'disabled-bg';
4074
+ type AcpCardColor = 'primary' | 'primary-container' | 'secondary' | 'secondary-container' | 'tertiary' | 'tertiary-container' | 'error' | 'error-container' | 'surface' | 'surface-variant' | 'surface-container-highest' | 'surface-container-high' | 'surface-container' | 'surface-container-low' | 'surface-container-lowest' | 'inverse-surface' | 'disabled-bg';
4069
4075
  /**
4070
- * Card image aspect ratio
4076
+ * Media aspect ratio.
4071
4077
  */
4072
4078
  type AcpCardImageRatio = '1:1' | '4:3' | '16:9' | '21:9' | '3:2' | '3:4';
4073
4079
  /**
4074
- * Card configuration interface
4080
+ * Horizontal alignment of the actions slot (same as `mat-card-actions[align]`).
4081
+ */
4082
+ type AcpCardActionsAlign = 'start' | 'end';
4083
+ /**
4084
+ * Application-wide or subtree defaults for `acp-card`.
4085
+ * Provide them with `provideAcpCardDefaults()` or the `ACP_CARD_DEFAULT_OPTIONS` token.
4086
+ * Inputs set on an individual card always win.
4075
4087
  */
4076
4088
  interface AcpCardConfig {
4077
4089
  appearance?: AcpCardAppearance;
4078
4090
  elevation?: AcpCardElevation;
4079
4091
  rounded?: boolean | number;
4080
- hover?: boolean;
4081
- clickable?: boolean;
4082
- outlined?: boolean;
4083
- loading?: boolean;
4084
- disabled?: boolean;
4085
4092
  padding?: AcpCardPadding;
4093
+ color?: AcpCardColor;
4094
+ hoverable?: boolean;
4095
+ actionsAlign?: AcpCardActionsAlign;
4086
4096
  imageRatio?: AcpCardImageRatio;
4087
- fullHeight?: boolean;
4088
- fullWidth?: boolean;
4089
4097
  }
4090
4098
  /**
4091
- * Card badge configuration
4092
- */
4093
- interface AcpCardBadge {
4094
- content: string | number;
4095
- color?: 'primary' | 'secondary' | 'accent' | 'error' | 'success' | 'warning' | 'info';
4096
- position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';
4097
- }
4098
- /**
4099
- * Pass Through options for card sections
4100
- * Allows customization of classes, styles, and attributes for each section
4099
+ * Pass-through classes and styles for a single card section.
4101
4100
  */
4102
4101
  interface AcpCardPassThroughSection {
4103
4102
  class?: string | string[] | Record<string, boolean>;
@@ -4116,135 +4115,209 @@ interface AcpCardPassThroughOptions {
4116
4115
  footer?: AcpCardPassThroughSection | undefined;
4117
4116
  }
4118
4117
 
4118
+ /**
4119
+ * Defaults for every `acp-card` in the injector tree. Mirrors `MAT_CARD_CONFIG`.
4120
+ * Can also be provided at component level: `providers: [{ provide: ACP_CARD_DEFAULT_OPTIONS, useValue }]`.
4121
+ */
4122
+ declare const ACP_CARD_DEFAULT_OPTIONS: InjectionToken<AcpCardConfig>;
4123
+ /**
4124
+ * Registers application-wide card defaults, e.g.:
4125
+ * `provideAcpCardDefaults({ appearance: 'outlined', rounded: 16 })`.
4126
+ */
4127
+ declare function provideAcpCardDefaults(defaults: AcpCardConfig): EnvironmentProviders;
4128
+
4129
+ /**
4130
+ * Typed slot directives for `acp-card`. Preferred over `#title`-style template refs:
4131
+ * they are type-checked, discoverable and never collide with refs of nested components.
4132
+ *
4133
+ * @example
4134
+ * ```html
4135
+ * <acp-card>
4136
+ * <ng-template acpCardTitle>Order #123</ng-template>
4137
+ * <p>Body</p>
4138
+ * <ng-template acpCardActions><acp-button text="Open" /></ng-template>
4139
+ * </acp-card>
4140
+ * ```
4141
+ */
4142
+ declare class AcpCardHeader {
4143
+ readonly templateRef: TemplateRef<any>;
4144
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AcpCardHeader, never>;
4145
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<AcpCardHeader, "ng-template[acpCardHeader]", never, {}, {}, never, never, true, never>;
4146
+ }
4147
+ declare class AcpCardMedia {
4148
+ readonly templateRef: TemplateRef<any>;
4149
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AcpCardMedia, never>;
4150
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<AcpCardMedia, "ng-template[acpCardMedia]", never, {}, {}, never, never, true, never>;
4151
+ }
4152
+ declare class AcpCardAvatar {
4153
+ readonly templateRef: TemplateRef<any>;
4154
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AcpCardAvatar, never>;
4155
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<AcpCardAvatar, "ng-template[acpCardAvatar]", never, {}, {}, never, never, true, never>;
4156
+ }
4157
+ declare class AcpCardTitle {
4158
+ readonly templateRef: TemplateRef<any>;
4159
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AcpCardTitle, never>;
4160
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<AcpCardTitle, "ng-template[acpCardTitle]", never, {}, {}, never, never, true, never>;
4161
+ }
4162
+ declare class AcpCardSubtitle {
4163
+ readonly templateRef: TemplateRef<any>;
4164
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AcpCardSubtitle, never>;
4165
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<AcpCardSubtitle, "ng-template[acpCardSubtitle]", never, {}, {}, never, never, true, never>;
4166
+ }
4167
+ declare class AcpCardActions {
4168
+ readonly templateRef: TemplateRef<any>;
4169
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AcpCardActions, never>;
4170
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<AcpCardActions, "ng-template[acpCardActions]", never, {}, {}, never, never, true, never>;
4171
+ }
4172
+ declare class AcpCardFooter {
4173
+ readonly templateRef: TemplateRef<any>;
4174
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AcpCardFooter, never>;
4175
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<AcpCardFooter, "ng-template[acpCardFooter]", never, {}, {}, never, never, true, never>;
4176
+ }
4177
+ declare const ACP_CARD_SLOTS: readonly [typeof AcpCardHeader, typeof AcpCardMedia, typeof AcpCardAvatar, typeof AcpCardTitle, typeof AcpCardSubtitle, typeof AcpCardActions, typeof AcpCardFooter];
4178
+
4119
4179
  declare class AcpCard {
4120
- readonly appearance: _angular_core.InputSignal<AcpCardAppearance>;
4121
- readonly elevation: _angular_core.InputSignal<AcpCardElevation>;
4122
- readonly rounded: _angular_core.InputSignal<number | boolean>;
4123
- readonly hover: _angular_core.InputSignalWithTransform<boolean, unknown>;
4180
+ private readonly defaults;
4181
+ readonly title: _angular_core.InputSignal<string | undefined>;
4182
+ readonly subtitle: _angular_core.InputSignal<string | undefined>;
4183
+ readonly appearance: _angular_core.InputSignal<AcpCardAppearance | undefined>;
4184
+ readonly color: _angular_core.InputSignal<AcpCardColor | undefined>;
4185
+ readonly elevation: _angular_core.InputSignal<AcpCardElevation | undefined>;
4186
+ /** `true` = theme radius, `false` = square, number = radius in px. */
4187
+ readonly rounded: _angular_core.InputSignal<number | boolean | undefined>;
4188
+ readonly padding: _angular_core.InputSignal<AcpCardPadding | undefined>;
4189
+ readonly hoverable: _angular_core.InputSignalWithTransform<boolean | undefined, unknown>;
4190
+ readonly actionsAlign: _angular_core.InputSignal<AcpCardActionsAlign | undefined>;
4191
+ /** Aspect ratio applied to the media slot. Media keeps its natural size when unset. */
4192
+ readonly imageRatio: _angular_core.InputSignal<AcpCardImageRatio | undefined>;
4124
4193
  readonly clickable: _angular_core.InputSignalWithTransform<boolean, unknown>;
4125
- readonly outlined: _angular_core.InputSignalWithTransform<boolean, unknown>;
4126
4194
  readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
4127
- readonly padding: _angular_core.InputSignal<AcpCardPadding>;
4128
- readonly imageRatio: _angular_core.InputSignal<AcpCardImageRatio>;
4195
+ readonly loading: _angular_core.InputSignalWithTransform<boolean, unknown>;
4129
4196
  readonly fullHeight: _angular_core.InputSignalWithTransform<boolean, unknown>;
4130
4197
  readonly fullWidth: _angular_core.InputSignalWithTransform<boolean, unknown>;
4131
- readonly backgroundColor: _angular_core.InputSignal<AcpCardBackgroundColor | undefined>;
4198
+ readonly ariaLabel: _angular_core.InputSignal<string | undefined>;
4132
4199
  readonly passThrough: _angular_core.InputSignal<AcpCardPassThroughOptions>;
4133
- headerTemplate: TemplateRef<any>;
4134
- mediaTemplate: TemplateRef<any>;
4135
- avatarTemplate: TemplateRef<any>;
4136
- titleTemplate: TemplateRef<any>;
4137
- subtitleTemplate: TemplateRef<any>;
4138
- actionsTemplate: TemplateRef<any>;
4139
- footerTemplate: TemplateRef<any>;
4140
- get role(): string;
4141
- get tabindex(): string | null;
4142
- get ariaDisabled(): string | null;
4200
+ /** Emitted on click, Enter or Space when `clickable` and not disabled/loading. */
4201
+ readonly clicked: _angular_core.OutputEmitterRef<MouseEvent | KeyboardEvent>;
4202
+ private readonly headerDir;
4203
+ private readonly mediaDir;
4204
+ private readonly avatarDir;
4205
+ private readonly titleDir;
4206
+ private readonly subtitleDir;
4207
+ private readonly actionsDir;
4208
+ private readonly footerDir;
4209
+ private readonly headerRef;
4210
+ private readonly mediaRef;
4211
+ private readonly avatarRef;
4212
+ private readonly titleRef;
4213
+ private readonly subtitleRef;
4214
+ private readonly actionsRef;
4215
+ private readonly footerRef;
4216
+ readonly headerTpl: _angular_core.Signal<TemplateRef<any> | undefined>;
4217
+ readonly mediaTpl: _angular_core.Signal<TemplateRef<any> | undefined>;
4218
+ readonly avatarTpl: _angular_core.Signal<TemplateRef<any> | undefined>;
4219
+ readonly titleTpl: _angular_core.Signal<TemplateRef<any> | undefined>;
4220
+ readonly subtitleTpl: _angular_core.Signal<TemplateRef<any> | undefined>;
4221
+ readonly actionsTpl: _angular_core.Signal<TemplateRef<any> | undefined>;
4222
+ readonly footerTpl: _angular_core.Signal<TemplateRef<any> | undefined>;
4223
+ readonly hasTitleGroup: _angular_core.Signal<boolean>;
4224
+ readonly resolvedAppearance: _angular_core.Signal<AcpCardAppearance>;
4225
+ readonly matAppearance: _angular_core.Signal<"outlined" | "filled" | "raised">;
4226
+ readonly resolvedPadding: _angular_core.Signal<AcpCardPadding>;
4227
+ readonly resolvedColor: _angular_core.Signal<AcpCardColor | undefined>;
4228
+ readonly resolvedHoverable: _angular_core.Signal<boolean>;
4229
+ readonly resolvedActionsAlign: _angular_core.Signal<AcpCardActionsAlign>;
4230
+ readonly mediaRatio: _angular_core.Signal<string | undefined>;
4231
+ readonly interactive: _angular_core.Signal<boolean>;
4232
+ readonly shape: _angular_core.Signal<string | null>;
4233
+ readonly elevationShadow: _angular_core.Signal<string | null>;
4234
+ readonly hostClasses: _angular_core.Signal<string>;
4235
+ onActivate(event: MouseEvent): void;
4236
+ onKeyActivate(event: Event): void;
4143
4237
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AcpCard, never>;
4144
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AcpCard, "acp-card", never, { "appearance": { "alias": "appearance"; "required": false; "isSignal": true; }; "elevation": { "alias": "elevation"; "required": false; "isSignal": true; }; "rounded": { "alias": "rounded"; "required": false; "isSignal": true; }; "hover": { "alias": "hover"; "required": false; "isSignal": true; }; "clickable": { "alias": "clickable"; "required": false; "isSignal": true; }; "outlined": { "alias": "outlined"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "padding": { "alias": "padding"; "required": false; "isSignal": true; }; "imageRatio": { "alias": "imageRatio"; "required": false; "isSignal": true; }; "fullHeight": { "alias": "fullHeight"; "required": false; "isSignal": true; }; "fullWidth": { "alias": "fullWidth"; "required": false; "isSignal": true; }; "backgroundColor": { "alias": "backgroundColor"; "required": false; "isSignal": true; }; "passThrough": { "alias": "passThrough"; "required": false; "isSignal": true; }; }, {}, ["headerTemplate", "mediaTemplate", "avatarTemplate", "titleTemplate", "subtitleTemplate", "actionsTemplate", "footerTemplate"], ["*"], true, never>;
4238
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AcpCard, "acp-card", ["acpCard"], { "title": { "alias": "title"; "required": false; "isSignal": true; }; "subtitle": { "alias": "subtitle"; "required": false; "isSignal": true; }; "appearance": { "alias": "appearance"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "elevation": { "alias": "elevation"; "required": false; "isSignal": true; }; "rounded": { "alias": "rounded"; "required": false; "isSignal": true; }; "padding": { "alias": "padding"; "required": false; "isSignal": true; }; "hoverable": { "alias": "hoverable"; "required": false; "isSignal": true; }; "actionsAlign": { "alias": "actionsAlign"; "required": false; "isSignal": true; }; "imageRatio": { "alias": "imageRatio"; "required": false; "isSignal": true; }; "clickable": { "alias": "clickable"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "fullHeight": { "alias": "fullHeight"; "required": false; "isSignal": true; }; "fullWidth": { "alias": "fullWidth"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "passThrough": { "alias": "passThrough"; "required": false; "isSignal": true; }; }, { "clicked": "clicked"; }, ["headerDir", "mediaDir", "avatarDir", "titleDir", "subtitleDir", "actionsDir", "footerDir", "headerRef", "mediaRef", "avatarRef", "titleRef", "subtitleRef", "actionsRef", "footerRef"], ["*"], true, never>;
4145
4239
  }
4146
4240
 
4147
- type AcpKpiCardColor = 'primary' | 'secondary' | 'success' | 'success-light' | 'warning' | 'warning-light' | 'error' | 'error-light' | 'info' | 'info-light' | 'neutral' | 'white' | 'custom';
4241
+ type AcpKpiCardColor = 'primary' | 'secondary' | 'success' | 'success-light' | 'warning' | 'warning-light' | 'error' | 'error-light' | 'info' | 'info-light' | 'neutral' | 'surface' | 'custom';
4148
4242
  type AcpKpiCardVariant = 'default' | 'elevated' | 'outlined' | 'filled' | 'tonal';
4149
4243
  type AcpKpiCardSize = 'xs' | 'sm' | 'md' | 'lg';
4244
+ /** Horizontal alignment of header, value and text. */
4245
+ type AcpKpiCardAlign = 'start' | 'center' | 'end';
4246
+ /** Direction of the change. `none` hides the trend icon. */
4150
4247
  type AcpKpiCardTrend = 'up' | 'down' | 'neutral' | 'none';
4248
+ /** Whether the change is good or bad for the business; drives the delta badge color. */
4249
+ type AcpKpiCardTrendSentiment = 'positive' | 'negative' | 'neutral';
4151
4250
  interface AcpKpiCardTrendConfig {
4152
4251
  icon: string;
4153
- color: AcpKpiCardColor;
4154
4252
  ariaLabel: string;
4155
4253
  }
4156
- interface AcpKpiCardLayout {
4157
- title: boolean;
4158
- subtitle: boolean;
4159
- value: boolean;
4160
- description: boolean;
4161
- trend: boolean;
4162
- percentage: boolean;
4163
- icon: boolean;
4164
- avatar: boolean;
4165
- actions: boolean;
4166
- footer: boolean;
4167
- progress: boolean;
4168
- }
4169
4254
 
4170
4255
  declare class AcpKpiCard {
4171
- title: _angular_core.InputSignal<string | undefined>;
4172
- subtitle: _angular_core.InputSignal<string | undefined>;
4173
- value: _angular_core.InputSignal<string | number | undefined>;
4174
- description: _angular_core.InputSignal<string | undefined>;
4175
- footer: _angular_core.InputSignal<string | undefined>;
4176
- variant: _angular_core.InputSignal<AcpKpiCardVariant>;
4177
- color: _angular_core.InputSignal<AcpKpiCardColor>;
4178
- size: _angular_core.InputSignal<AcpKpiCardSize>;
4179
- icon: _angular_core.InputSignal<string | undefined>;
4180
- svgIcon: _angular_core.InputSignal<string | undefined>;
4181
- avatar: _angular_core.InputSignal<string | undefined>;
4182
- avatarInitials: _angular_core.InputSignal<string | undefined>;
4183
- trend: _angular_core.InputSignal<AcpKpiCardTrend>;
4184
- percentage: _angular_core.InputSignal<string | number | undefined>;
4185
- percentageFormat: _angular_core.InputSignal<"number" | "percent">;
4186
- progress: _angular_core.InputSignal<number | undefined>;
4187
- progressColor: _angular_core.InputSignal<AcpKpiCardColor>;
4188
- loading: _angular_core.InputSignalWithTransform<boolean, unknown>;
4189
- disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
4190
- clickable: _angular_core.InputSignalWithTransform<boolean, unknown>;
4191
- selected: _angular_core.InputSignalWithTransform<boolean, unknown>;
4192
- routerLink: _angular_core.InputSignal<string | any[] | null>;
4193
- href: _angular_core.InputSignal<string | null>;
4194
- ariaLabel: _angular_core.InputSignal<string | undefined>;
4195
- tooltip: _angular_core.InputSignal<string | undefined>;
4196
- clicked: _angular_core.OutputEmitterRef<void>;
4197
- actionClicked: _angular_core.OutputEmitterRef<string>;
4198
- isHovered: _angular_core.WritableSignal<boolean>;
4199
- iconTemplate: _angular_core.Signal<TemplateRef<any> | undefined>;
4200
- avatarTemplate: _angular_core.Signal<TemplateRef<any> | undefined>;
4201
- footerTemplate: _angular_core.Signal<TemplateRef<any> | undefined>;
4202
- actionsTemplate: _angular_core.Signal<TemplateRef<any> | undefined>;
4203
- isTrending: _angular_core.Signal<boolean>;
4204
- trendConfig: _angular_core.Signal<_acontplus_ng_components.AcpKpiCardTrendConfig>;
4205
- effectiveIcon: _angular_core.Signal<string | undefined>;
4206
- trendColor: _angular_core.Signal<AcpKpiCardColor>;
4207
- hasHeader: _angular_core.Signal<boolean>;
4208
- hasFooter: _angular_core.Signal<boolean>;
4209
- hasActions: _angular_core.Signal<boolean>;
4210
- hostClasses: _angular_core.Signal<string>;
4256
+ private readonly defaultLocale;
4257
+ readonly title: _angular_core.InputSignal<string | undefined>;
4258
+ readonly subtitle: _angular_core.InputSignal<string | undefined>;
4259
+ /** Numbers are formatted with `Intl.NumberFormat`; strings are shown as-is. */
4260
+ readonly value: _angular_core.InputSignal<string | number | null | undefined>;
4261
+ readonly valueFormat: _angular_core.InputSignal<Intl.NumberFormatOptions | undefined>;
4262
+ readonly prefix: _angular_core.InputSignal<string | undefined>;
4263
+ readonly suffix: _angular_core.InputSignal<string | undefined>;
4264
+ readonly description: _angular_core.InputSignal<string | undefined>;
4265
+ readonly footer: _angular_core.InputSignal<string | undefined>;
4266
+ /** BCP 47 locale for number formatting. Defaults to the app `LOCALE_ID`. */
4267
+ readonly locale: _angular_core.InputSignal<string | undefined>;
4268
+ readonly variant: _angular_core.InputSignal<AcpKpiCardVariant>;
4269
+ readonly color: _angular_core.InputSignal<AcpKpiCardColor>;
4270
+ readonly size: _angular_core.InputSignal<AcpKpiCardSize>;
4271
+ readonly align: _angular_core.InputSignal<AcpKpiCardAlign>;
4272
+ readonly icon: _angular_core.InputSignal<string | undefined>;
4273
+ readonly svgIcon: _angular_core.InputSignal<string | undefined>;
4274
+ readonly avatar: _angular_core.InputSignal<string | undefined>;
4275
+ readonly avatarInitials: _angular_core.InputSignal<string | undefined>;
4276
+ readonly percentage: _angular_core.InputSignal<string | number | null | undefined>;
4277
+ readonly percentageFormat: _angular_core.InputSignal<"number" | "percent">;
4278
+ /** Direction of the change. Inferred from the sign of `percentage` when unset. */
4279
+ readonly trend: _angular_core.InputSignal<AcpKpiCardTrend | undefined>;
4280
+ /** Invert the badge color for metrics where a decrease is good (costs, churn, errors). */
4281
+ readonly lowerIsBetter: _angular_core.InputSignalWithTransform<boolean, unknown>;
4282
+ /** Comparison context shown next to the change, e.g. "vs last month". */
4283
+ readonly trendLabel: _angular_core.InputSignal<string | undefined>;
4284
+ /** Show the trend arrow inside the change badge. */
4285
+ readonly showTrendIcon: _angular_core.InputSignalWithTransform<boolean, unknown>;
4286
+ readonly progress: _angular_core.InputSignal<number | undefined>;
4287
+ readonly progressColor: _angular_core.InputSignal<AcpKpiCardColor | undefined>;
4288
+ readonly loading: _angular_core.InputSignalWithTransform<boolean, unknown>;
4289
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
4290
+ readonly clickable: _angular_core.InputSignalWithTransform<boolean, unknown>;
4291
+ readonly selected: _angular_core.InputSignalWithTransform<boolean, unknown>;
4292
+ readonly routerLink: _angular_core.InputSignal<string | any[] | null>;
4293
+ readonly ariaLabel: _angular_core.InputSignal<string | undefined>;
4294
+ readonly menuAriaLabel: _angular_core.InputSignal<string>;
4295
+ readonly tooltip: _angular_core.InputSignal<string | undefined>;
4296
+ /** Emitted on click, Enter or Space when `clickable`. */
4297
+ readonly clicked: _angular_core.OutputEmitterRef<void>;
4298
+ readonly iconTemplate: _angular_core.Signal<TemplateRef<any> | undefined>;
4299
+ readonly avatarTemplate: _angular_core.Signal<TemplateRef<any> | undefined>;
4300
+ readonly footerTemplate: _angular_core.Signal<TemplateRef<any> | undefined>;
4301
+ readonly actionsTemplate: _angular_core.Signal<TemplateRef<any> | undefined>;
4302
+ private readonly resolvedLocale;
4303
+ readonly formattedValue: _angular_core.Signal<string | null>;
4304
+ readonly formattedDelta: _angular_core.Signal<string | null>;
4305
+ readonly resolvedTrend: _angular_core.Signal<AcpKpiCardTrend>;
4306
+ readonly trendConfig: _angular_core.Signal<_acontplus_ng_components.AcpKpiCardTrendConfig>;
4307
+ readonly sentiment: _angular_core.Signal<AcpKpiCardTrendSentiment>;
4308
+ readonly hasHeader: _angular_core.Signal<boolean>;
4309
+ readonly hasFooter: _angular_core.Signal<boolean>;
4310
+ readonly interactive: _angular_core.Signal<boolean>;
4311
+ readonly hostClasses: _angular_core.Signal<string>;
4211
4312
  onCardClick(): void;
4212
- onActionClick(action: string, event: Event): void;
4213
- onMouseEnter(): void;
4214
- onMouseLeave(): void;
4313
+ onCardKey(event: Event): void;
4215
4314
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AcpKpiCard, never>;
4216
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AcpKpiCard, "acp-kpi-card", ["acpKpiCard"], { "title": { "alias": "title"; "required": false; "isSignal": true; }; "subtitle": { "alias": "subtitle"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "footer": { "alias": "footer"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "svgIcon": { "alias": "svgIcon"; "required": false; "isSignal": true; }; "avatar": { "alias": "avatar"; "required": false; "isSignal": true; }; "avatarInitials": { "alias": "avatarInitials"; "required": false; "isSignal": true; }; "trend": { "alias": "trend"; "required": false; "isSignal": true; }; "percentage": { "alias": "percentage"; "required": false; "isSignal": true; }; "percentageFormat": { "alias": "percentageFormat"; "required": false; "isSignal": true; }; "progress": { "alias": "progress"; "required": false; "isSignal": true; }; "progressColor": { "alias": "progressColor"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "clickable": { "alias": "clickable"; "required": false; "isSignal": true; }; "selected": { "alias": "selected"; "required": false; "isSignal": true; }; "routerLink": { "alias": "routerLink"; "required": false; "isSignal": true; }; "href": { "alias": "href"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "tooltip": { "alias": "tooltip"; "required": false; "isSignal": true; }; }, { "clicked": "clicked"; "actionClicked": "actionClicked"; }, ["iconTemplate", "avatarTemplate", "footerTemplate", "actionsTemplate"], never, true, never>;
4315
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AcpKpiCard, "acp-kpi-card", ["acpKpiCard"], { "title": { "alias": "title"; "required": false; "isSignal": true; }; "subtitle": { "alias": "subtitle"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "valueFormat": { "alias": "valueFormat"; "required": false; "isSignal": true; }; "prefix": { "alias": "prefix"; "required": false; "isSignal": true; }; "suffix": { "alias": "suffix"; "required": false; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "footer": { "alias": "footer"; "required": false; "isSignal": true; }; "locale": { "alias": "locale"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "align": { "alias": "align"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "svgIcon": { "alias": "svgIcon"; "required": false; "isSignal": true; }; "avatar": { "alias": "avatar"; "required": false; "isSignal": true; }; "avatarInitials": { "alias": "avatarInitials"; "required": false; "isSignal": true; }; "percentage": { "alias": "percentage"; "required": false; "isSignal": true; }; "percentageFormat": { "alias": "percentageFormat"; "required": false; "isSignal": true; }; "trend": { "alias": "trend"; "required": false; "isSignal": true; }; "lowerIsBetter": { "alias": "lowerIsBetter"; "required": false; "isSignal": true; }; "trendLabel": { "alias": "trendLabel"; "required": false; "isSignal": true; }; "showTrendIcon": { "alias": "showTrendIcon"; "required": false; "isSignal": true; }; "progress": { "alias": "progress"; "required": false; "isSignal": true; }; "progressColor": { "alias": "progressColor"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "clickable": { "alias": "clickable"; "required": false; "isSignal": true; }; "selected": { "alias": "selected"; "required": false; "isSignal": true; }; "routerLink": { "alias": "routerLink"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "menuAriaLabel": { "alias": "menuAriaLabel"; "required": false; "isSignal": true; }; "tooltip": { "alias": "tooltip"; "required": false; "isSignal": true; }; }, { "clicked": "clicked"; }, ["iconTemplate", "avatarTemplate", "footerTemplate", "actionsTemplate"], never, true, never>;
4217
4316
  }
4218
4317
 
4219
4318
  declare const KPI_CARD_TREND_CONFIGS: Record<AcpKpiCardTrend, AcpKpiCardTrendConfig>;
4220
- declare function formatValue(value: number | string, format?: string): string;
4221
-
4222
- declare const KPI_CARD_TOKENS: {
4223
- SIZE_SM: string;
4224
- SIZE_MD: string;
4225
- SIZE_LG: string;
4226
- VARIANT_DEFAULT: string;
4227
- VARIANT_ELEVATED: string;
4228
- VARIANT_OUTLINED: string;
4229
- VARIANT_FILLED: string;
4230
- VARIANT_TONAL: string;
4231
- COLOR_PRIMARY: string;
4232
- COLOR_SECONDARY: string;
4233
- COLOR_SUCCESS: string;
4234
- COLOR_SUCCESS_LIGHT: string;
4235
- COLOR_WARNING: string;
4236
- COLOR_WARNING_LIGHT: string;
4237
- COLOR_ERROR: string;
4238
- COLOR_ERROR_LIGHT: string;
4239
- COLOR_INFO: string;
4240
- COLOR_INFO_LIGHT: string;
4241
- COLOR_NEUTRAL: string;
4242
- COLOR_CUSTOM: string;
4243
- TREND_UP: string;
4244
- TREND_DOWN: string;
4245
- TREND_NEUTRAL: string;
4246
- TREND_NONE: string;
4247
- };
4319
+ /** Infers the trend direction from a numeric or numeric-string delta (`'+12.5'`, `-3`). */
4320
+ declare function inferKpiTrend(delta: number | string | null | undefined): AcpKpiCardTrend;
4248
4321
 
4249
4322
  declare class Branding {
4250
4323
  readonly logo: _angular_core.InputSignal<string | null>;
@@ -5394,5 +5467,5 @@ declare class StatusDisplayPipe implements PipeTransform {
5394
5467
  static ɵpipe: _angular_core.ɵɵPipeDeclaration<StatusDisplayPipe, "statusDisplay", true>;
5395
5468
  }
5396
5469
 
5397
- export { ACP_ACTIVE_DATE_DEBOUNCE, ACP_BADGE_COLORS, ACP_BADGE_SHAPES, ACP_BADGE_SIZES, ACP_BADGE_VARIANTS, ACP_DATE_OPTION_TYPE, ACP_DEFAULT_DATE_OPTIONS, ACP_DIALOG_ACTIONS, ACP_DIALOG_DATA, ACP_DIALOG_DEFAULT_OPTIONS, ACP_DIALOG_TITLEBAR, ACP_DRAWER_DATA, ACP_DRAWER_DEFAULT_OPTIONS, ACP_POPOVER_CONTENT, ACP_POPOVER_DEFAULT_OPTIONS, ACP_POPOVER_SCROLL_STRATEGY, AcpAlert, AcpBadge, AcpButton, AcpCard, AcpCheckboxBase, AcpCheckboxGroup, AcpContextMenu, AcpContextMenuDirective, AcpContextMenuPanel, AcpContextMenuService, AcpDateRangeInput, AcpDialog, AcpDialogActions, AcpDialogContainer, AcpDialogContent, AcpDialogRef, AcpDialogService, AcpDialogTitlebar, AcpDrawer, AcpDrawerConfig, AcpDrawerContainer, AcpDrawerRef, AcpHeader, AcpHeaderActions, AcpHeaderBranding, AcpHeaderCenter, AcpHeaderEnd, AcpHeaderLanguage, AcpHeaderNotifications, AcpHeaderStart, AcpHeaderTheme, AcpHeaderWorkspace, AcpKpiCard, AcpPopover, AcpPopoverContent, AcpPopoverTarget, AcpPopoverTrigger, AcpSelectDateOption, AcpShellLayout, AcpShellSlotHeader, AcpShellSlotSidebar, AcpShellSlotSidebarFooter, AcpShellSlotToolbar, AcpShellSlotTopmenu, AcpSidebar, AcpSidebarBranding, AcpSidebarContent, AcpSidebarHeader, AcpSidebarToggle, AcpSidebarUserPanel, AcpTopmenu, AcpTopmenuPanel, AdvancedDialogService, Branding, Button, CONTEXT_MENU_DATA, CONTEXT_MENU_ITEMS, DATA_GRID_DEFAULT_OPTIONS, DataGrid, DateRangePicker, DialogWrapper, DialogZIndexService, DynamicCard, DynamicSelect, GetTotalPipe, IconRegistryService, InputChip, KPI_CARD_TOKENS, KPI_CARD_TREND_CONFIGS, KeyboardNavigationService, NavAccordionDirective, NavAccordionItemDirective, NavAccordionToggleDirective, OverlayService, Pagination, SidemenuComponent, Spinner, StatusDisplayPipe, SvgIcon, TREND_CONFIGS, TabulatorTable, ThemeSwitcher, ThemeToggle, ToUpperCase, UserIcon, UserMenu, UserPanel, _AcpPopoverContentBase, formatValue, provideAcpDialogDefaults };
5398
- export type { AcpAlertType, AcpBadgeColor, AcpBadgeShape, AcpBadgeSize, AcpBadgeTrend, AcpBadgeTrendConfig, AcpBadgeVariant, AcpButtonAppearance$1 as AcpButtonAppearance, AcpButtonColor$1 as AcpButtonColor, AcpButtonSize, AcpButtonType$1 as AcpButtonType, AcpButtonVariant$1 as AcpButtonVariant, AcpCardAppearance, AcpCardBackgroundColor, AcpCardBadge, AcpCardConfig, AcpCardElevation, AcpCardImageRatio, AcpCardPadding, AcpCardPassThroughOptions, AcpCardPassThroughSection, AcpCheckboxGroupOption, AcpContextMenuItem, AcpContextMenuItemContext, AcpContextMenuOpenConfig, AcpContextMenuPosition, AcpContextMenuRef, AcpContextMenuTriggerConfig, AcpDialogAction, AcpDialogActionClick, AcpDialogActionState, AcpDialogActionsOutlet, AcpDialogCloseConfig, AcpDialogComponentLoader, AcpDialogConfig, AcpDialogContainerData, AcpDialogContentFunction, AcpDialogContentInput, AcpDialogDirection, AcpDialogHeaderConfig, AcpDialogResolvedContent, AcpDialogRestoreFocus, AcpDialogSize, AcpDialogTitlebarOutlet, AcpDir, AcpHeaderAction, AcpHeaderActionEvent, AcpHeaderBrandingConfig, AcpHeaderConfig, AcpHeaderPos, AcpHeaderUserMenuConfig, AcpHeaderUserMenuItem, AcpHeaderUserMenuItemEvent, AcpKpiCardColor, AcpKpiCardLayout, AcpKpiCardSize, AcpKpiCardTrend, AcpKpiCardTrendConfig, AcpKpiCardVariant, AcpLanguageItem, AcpNavPos, AcpNotificationItem, AcpPopoverDefaultOptions, AcpPopoverPanel, AcpPopoverPosition, AcpPopoverPositionEnd, AcpPopoverPositionStart, AcpPopoverTriggerEvent, AcpSelectedDateEvent, AcpThemeVariant, AcpTopmenuChildItem, AcpTopmenuItem, AcpTopmenuPermissions, AcpTopmenuTag, AcpWorkspaceItem, AutoFocusTarget, DataGridButtonType, DataGridCellTemplate, DataGridColumn, DataGridColumnButton, DataGridColumnButtonBadge, DataGridColumnButtonPop, DataGridColumnButtonTooltip, DataGridColumnPinOption, DataGridColumnPinValue, DataGridColumnTag, DataGridColumnTagValue, DataGridColumnType, DataGridColumnTypeParameter, DataGridDefaultOptions, DataGridMenuItem, DataGridRowClassFormatter, DataGridRowSelectionFormatter, DataGridSortProp, DateRangePickerOptions, DateRangeValue, DialogSize, DialogType, DialogWrapperConfig, DrawerPosition, FocusableElement, IAcpSelectDateOption, IconRegistryConfig, MatCustomDialogConfig, MenuItem, MenuPermissions, MenuTag, PaginationOptions, PopoverCloseReason, TabulatorColumn, TabulatorConfig, TabulatorEventHandlers, TabulatorTheme, UserMenuItem, UserMenuSelectedEvent, UserProfile };
5470
+ export { ACP_ACTIVE_DATE_DEBOUNCE, ACP_BADGE_COLORS, ACP_BADGE_SHAPES, ACP_BADGE_SIZES, ACP_BADGE_VARIANTS, ACP_CARD_DEFAULT_OPTIONS, ACP_CARD_SLOTS, ACP_DATE_OPTION_TYPE, ACP_DEFAULT_DATE_OPTIONS, ACP_DIALOG_ACTIONS, ACP_DIALOG_DATA, ACP_DIALOG_DEFAULT_OPTIONS, ACP_DIALOG_TITLEBAR, ACP_DRAWER_DATA, ACP_DRAWER_DEFAULT_OPTIONS, ACP_POPOVER_CONTENT, ACP_POPOVER_DEFAULT_OPTIONS, ACP_POPOVER_SCROLL_STRATEGY, AcpAlert, AcpBadge, AcpButton, AcpCard, AcpCardActions, AcpCardAvatar, AcpCardFooter, AcpCardHeader, AcpCardMedia, AcpCardSubtitle, AcpCardTitle, AcpCheckboxBase, AcpCheckboxGroup, AcpContextMenu, AcpContextMenuDirective, AcpContextMenuPanel, AcpContextMenuService, AcpDateRangeInput, AcpDialog, AcpDialogActions, AcpDialogContainer, AcpDialogContent, AcpDialogRef, AcpDialogService, AcpDialogTitlebar, AcpDrawer, AcpDrawerConfig, AcpDrawerContainer, AcpDrawerRef, AcpGridNavigationFor, AcpHeader, AcpHeaderActions, AcpHeaderBranding, AcpHeaderCenter, AcpHeaderEnd, AcpHeaderLanguage, AcpHeaderNotifications, AcpHeaderStart, AcpHeaderTheme, AcpHeaderWorkspace, AcpKpiCard, AcpPopover, AcpPopoverContent, AcpPopoverTarget, AcpPopoverTrigger, AcpSearchSelect, AcpSelectDateOption, AcpShellLayout, AcpShellSlotHeader, AcpShellSlotSidebar, AcpShellSlotSidebarFooter, AcpShellSlotToolbar, AcpShellSlotTopmenu, AcpSidebar, AcpSidebarBranding, AcpSidebarContent, AcpSidebarHeader, AcpSidebarToggle, AcpSidebarUserPanel, AcpTopmenu, AcpTopmenuPanel, AdvancedDialogService, Branding, Button, CONTEXT_MENU_DATA, CONTEXT_MENU_ITEMS, DATA_GRID_DEFAULT_OPTIONS, DataGrid, DateRangePicker, DialogWrapper, DialogZIndexService, DynamicSelect, GetTotalPipe, IconRegistryService, InputChip, KPI_CARD_TREND_CONFIGS, NavAccordionDirective, NavAccordionItemDirective, NavAccordionToggleDirective, OverlayService, Pagination, SidemenuComponent, Spinner, StatusDisplayPipe, SvgIcon, TREND_CONFIGS, TabulatorTable, ThemeSwitcher, ThemeToggle, ToUpperCase, UserIcon, UserMenu, UserPanel, _AcpPopoverContentBase, acpSearchSelectLooseEquals, acpSearchSelectNormalize, inferKpiTrend, provideAcpCardDefaults, provideAcpDialogDefaults };
5471
+ export type { AcpAlertType, AcpAlertVariant, AcpBadgeColor, AcpBadgeShape, AcpBadgeSize, AcpBadgeTrend, AcpBadgeTrendConfig, AcpBadgeVariant, AcpButtonAppearance$1 as AcpButtonAppearance, AcpButtonColor$1 as AcpButtonColor, AcpButtonSize, AcpButtonType$1 as AcpButtonType, AcpButtonVariant$1 as AcpButtonVariant, AcpCardActionsAlign, AcpCardAppearance, AcpCardColor, AcpCardConfig, AcpCardElevation, AcpCardImageRatio, AcpCardPadding, AcpCardPassThroughOptions, AcpCardPassThroughSection, AcpCheckboxGroupOption, AcpContextMenuItem, AcpContextMenuItemContext, AcpContextMenuOpenConfig, AcpContextMenuPosition, AcpContextMenuRef, AcpContextMenuTriggerConfig, AcpDialogAction, AcpDialogActionClick, AcpDialogActionState, AcpDialogActionsOutlet, AcpDialogCloseConfig, AcpDialogComponentLoader, AcpDialogConfig, AcpDialogContainerData, AcpDialogContentFunction, AcpDialogContentInput, AcpDialogDirection, AcpDialogHeaderConfig, AcpDialogResolvedContent, AcpDialogRestoreFocus, AcpDialogSize, AcpDialogTitlebarOutlet, AcpDir, AcpHeaderAction, AcpHeaderActionEvent, AcpHeaderBrandingConfig, AcpHeaderConfig, AcpHeaderPos, AcpHeaderUserMenuConfig, AcpHeaderUserMenuItem, AcpHeaderUserMenuItemEvent, AcpKpiCardAlign, AcpKpiCardColor, AcpKpiCardSize, AcpKpiCardTrend, AcpKpiCardTrendConfig, AcpKpiCardTrendSentiment, AcpKpiCardVariant, AcpLanguageItem, AcpNavPos, AcpNotificationItem, AcpPopoverDefaultOptions, AcpPopoverPanel, AcpPopoverPosition, AcpPopoverPositionEnd, AcpPopoverPositionStart, AcpPopoverTriggerEvent, AcpSearchSelectAccessor, AcpSearchSelectOptionContext, AcpSearchSelectSelection, AcpSelectedDateEvent, AcpThemeVariant, AcpTopmenuChildItem, AcpTopmenuItem, AcpTopmenuPermissions, AcpTopmenuTag, AcpWorkspaceItem, AutoFocusTarget, DataGridButtonType, DataGridCellTemplate, DataGridColumn, DataGridColumnButton, DataGridColumnButtonBadge, DataGridColumnButtonPop, DataGridColumnButtonTooltip, DataGridColumnPinOption, DataGridColumnPinValue, DataGridColumnTag, DataGridColumnTagValue, DataGridColumnType, DataGridColumnTypeParameter, DataGridDefaultOptions, DataGridMenuItem, DataGridRowClassFormatter, DataGridRowSelectionFormatter, DataGridSize, DataGridSortProp, DateRangePickerOptions, DateRangeValue, DialogSize, DialogType, DialogWrapperConfig, DrawerPosition, IAcpSelectDateOption, IconRegistryConfig, MatCustomDialogConfig, MenuItem, MenuPermissions, MenuTag, PaginationOptions, PopoverCloseReason, TabulatorColumn, TabulatorConfig, TabulatorEventHandlers, TabulatorTheme, UserMenuItem, UserMenuSelectedEvent, UserProfile };