@forgeroute/ui 0.4.72 → 0.4.74

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 i0 from "@angular/core";
2
- import { EnvironmentProviders, InjectionToken, OnDestroy, OnInit, Signal, TemplateRef, WritableSignal } from "@angular/core";
2
+ import { AfterContentChecked, EnvironmentProviders, InjectionToken, OnDestroy, OnInit, Signal, TemplateRef, WritableSignal } from "@angular/core";
3
3
  import { UrlTree } from "@angular/router";
4
4
  import { Observable, Subject } from "rxjs";
5
5
  import { AbstractControl, ControlValueAccessor, FormControl, ValidationErrors, Validator, ValidatorFn } from "@angular/forms";
@@ -202,7 +202,9 @@ export interface ColumnDef {
202
202
  ariaLabel?: string;
203
203
  } | null;
204
204
  /** Key in item holding the tags array. Defaults to col.key.
205
- * Expected shape: { name: string; variant?: BadgeVariant }[] */
205
+ * Expected shape: { name: string; variant?: BadgeVariant; color?: string }[]. `color` is a custom hex colour (`#rgb` / `#rrggbb`,
206
+ * e.g. the colour a user picked for the tag): it becomes the chip background with dark or white text for contrast and wins over `variant`;
207
+ * an invalid value is ignored. */
206
208
  tagsKey?: string;
207
209
  /**
208
210
  * `cellType: 'link'` — returns where the cell points for a row (`value` is `item[key]`), or null / undefined /
@@ -736,7 +738,17 @@ export declare class BadgeComponent {
736
738
  * 2. Fall back to auto-color based on the label string
737
739
  */
738
740
  readonly variant: import("@angular/core").InputSignal<BadgeVariant | null>;
741
+ /**
742
+ * A custom hex colour (`#rgb` or `#rrggbb`), e.g. the colour a user picked for a tag. It becomes the background and the text is
743
+ * dark or white, whichever reads better (WCAG contrast). It wins over `variant`; anything that is not a valid hex colour is
744
+ * ignored (the variant / automatic colour applies). Omit it and nothing changes.
745
+ */
746
+ readonly color: import("@angular/core").InputSignal<string | null>;
739
747
  protected readonly resolvedVariant: import("@angular/core").Signal<BadgeVariant>;
748
+ protected readonly customStyles: import("@angular/core").Signal<{
749
+ bg: string;
750
+ color: string;
751
+ } | null>;
740
752
  protected readonly styles: import("@angular/core").Signal<{
741
753
  bg: string;
742
754
  color: string;
@@ -753,6 +765,11 @@ export declare class BadgeComponent {
753
765
  "required": false;
754
766
  "isSignal": true;
755
767
  };
768
+ "color": {
769
+ "alias": "color";
770
+ "required": false;
771
+ "isSignal": true;
772
+ };
756
773
  }, {}, never, never, true, never>;
757
774
  }
758
775
  /**
@@ -1133,6 +1150,13 @@ export declare class SelectComponent implements ControlValueAccessor, Validator,
1133
1150
  readonly label: import("@angular/core").InputSignal<string>;
1134
1151
  /** Accessible name for a select with no visible label (e.g. an inline row or table-cell select). */
1135
1152
  readonly ariaLabel: import("@angular/core").InputSignal<string>;
1153
+ /**
1154
+ * Compact, label-less look for a filter above KPI cards or in a toolbar (library source 2026-11-04, not yet published). `true` renders NO visible
1155
+ * label row (no gap above the field; the `*` marker goes with it) while `label` stays the select's accessible name through `aria-label` and still
1156
+ * words the built-in "<label> is required." message. An explicit `ariaLabel` wins over `label`. Default `false` = unchanged. Combine with
1157
+ * `size="sm"`. (`ariaLabel` alone, with no `label`, was already the way to name a label-less select in a table cell.)
1158
+ */
1159
+ readonly labelHidden: import("@angular/core").InputSignal<boolean>;
1136
1160
  /** Native `name` attribute placed on the inner `<select>` (e2e `[name=x]` selectors, autofill). None when empty. */
1137
1161
  readonly inputName: import("@angular/core").InputSignal<string>;
1138
1162
  readonly placeholder: import("@angular/core").InputSignal<string>;
@@ -1146,7 +1170,7 @@ export declare class SelectComponent implements ControlValueAccessor, Validator,
1146
1170
  readonly error: import("@angular/core").InputSignal<string>;
1147
1171
  /** Reveal the built-in error messages now (e.g. after a failed Save click), without waiting for blur. */
1148
1172
  readonly showErrors: import("@angular/core").InputSignal<boolean>;
1149
- readonly size: import("@angular/core").InputSignal<"default" | "sm">;
1173
+ readonly size: import("@angular/core").InputSignal<"sm" | "default">;
1150
1174
  readonly _disabledInput: import("@angular/core").InputSignal<boolean>;
1151
1175
  private readonly _cvaDisabled;
1152
1176
  protected readonly disabled: import("@angular/core").Signal<boolean>;
@@ -1175,6 +1199,13 @@ export declare class SelectComponent implements ControlValueAccessor, Validator,
1175
1199
  validate(control: AbstractControl): ValidationErrors | null;
1176
1200
  registerOnValidatorChange(fn: () => void): void;
1177
1201
  protected readonly _selectId: string;
1202
+ private readonly _hostEl;
1203
+ /**
1204
+ * Library source 2026-11-04, not yet published. Puts the keyboard focus on the inner native `<select>` (`ref.focus()` via `viewChild`).
1205
+ * Same options as the DOM method (`{ preventScroll: true }`). Safe at any time: before the view exists, or on a disabled field, it does
1206
+ * nothing and never throws.
1207
+ */
1208
+ focus(options?: FocusOptions): void;
1178
1209
  private _onChange;
1179
1210
  private _warned;
1180
1211
  /** The comparison form of a key: in number mode a numeric text ('21.0', ' 21 ') becomes the canonical number text ('21'). */
@@ -1203,6 +1234,11 @@ export declare class SelectComponent implements ControlValueAccessor, Validator,
1203
1234
  "required": false;
1204
1235
  "isSignal": true;
1205
1236
  };
1237
+ "labelHidden": {
1238
+ "alias": "labelHidden";
1239
+ "required": false;
1240
+ "isSignal": true;
1241
+ };
1206
1242
  "inputName": {
1207
1243
  "alias": "inputName";
1208
1244
  "required": false;
@@ -1267,6 +1303,11 @@ export interface ImportFieldDef {
1267
1303
  key: string;
1268
1304
  label: string;
1269
1305
  required?: boolean;
1306
+ /**
1307
+ * An example of what the column should contain (e.g. `VACANT, OCCUPIED`, `500.00`, `YYYY-MM-DD`). It is shown under the field's
1308
+ * label in the column-mapping step as "e.g. <example>" and linked to the column dropdown for screen readers. Omit it and nothing changes.
1309
+ */
1310
+ example?: string;
1270
1311
  }
1271
1312
  export interface ImportSource {
1272
1313
  value: string;
@@ -1387,6 +1428,10 @@ export declare class ImportExportComponent {
1387
1428
  private csvFile;
1388
1429
  private readCsvFile;
1389
1430
  private autoMap;
1431
+ private static nextId;
1432
+ private readonly idPrefix;
1433
+ /** Id of a field's example hint (the column dropdown points at it with aria-describedby). */
1434
+ protected exampleId(field: ImportFieldDef): string;
1390
1435
  get canSubmit(): boolean;
1391
1436
  get unmappedRequiredFields(): string[];
1392
1437
  get unmatchedCsvHeaders(): string[];
@@ -1601,6 +1646,15 @@ export declare class DataTableComponent<T extends Record<string, any>> implement
1601
1646
  * own panel for `rows` and, when it has finished, calls `clearSelection()` and `refresh()` on the table.
1602
1647
  */
1603
1648
  readonly bulkPanelClick: import("@angular/core").OutputEmitterRef<BulkPanelEvent<T>>;
1649
+ /**
1650
+ * Emitted after every rows request that completes (a request superseded by a newer one emits nothing; first load, page, sort, search, tab, filter, `refresh()` ...): `{ ok: true, total }` when the rows
1651
+ * arrived (`total` = all matching rows), `{ ok: false, total }` when the request failed (the rows on screen are kept, `total` is the last known).
1652
+ * Lets a host refresh something that must follow the table (e.g. a failure banner above it).
1653
+ */
1654
+ readonly loaded: import("@angular/core").OutputEmitterRef<{
1655
+ ok: boolean;
1656
+ total: number;
1657
+ }>;
1604
1658
  /** Emitted after a built-in single-row delete completes successfully. */
1605
1659
  readonly rowDeleted: import("@angular/core").OutputEmitterRef<T>;
1606
1660
  /**
@@ -2193,6 +2247,7 @@ export declare class DataTableComponent<T extends Record<string, any>> implement
2193
2247
  "tabChange": "tabChange";
2194
2248
  "bulkAction": "bulkAction";
2195
2249
  "bulkPanelClick": "bulkPanelClick";
2250
+ "loaded": "loaded";
2196
2251
  "rowDeleted": "rowDeleted";
2197
2252
  "rowReorder": "rowReorder";
2198
2253
  }, never, never, true, never>;
@@ -2228,7 +2283,7 @@ export declare class SidePanelComponent implements OnDestroy {
2228
2283
  readonly cancelLabel: import("@angular/core").InputSignal<string>;
2229
2284
  /** Right-aligned primary action button label. Empty string = hidden. */
2230
2285
  readonly primaryLabel: import("@angular/core").InputSignal<string>;
2231
- readonly primaryVariant: import("@angular/core").InputSignal<"warning" | "danger" | "primary">;
2286
+ readonly primaryVariant: import("@angular/core").InputSignal<"primary" | "danger" | "warning">;
2232
2287
  readonly primaryLoading: import("@angular/core").InputSignal<boolean>;
2233
2288
  readonly primaryDisabled: import("@angular/core").InputSignal<boolean>;
2234
2289
  /** `data-testid` of the Cancel button; none when empty (default). */
@@ -2243,6 +2298,15 @@ export declare class SidePanelComponent implements OnDestroy {
2243
2298
  readonly closed: import("@angular/core").OutputEmitterRef<void>;
2244
2299
  readonly primaryClick: import("@angular/core").OutputEmitterRef<void>;
2245
2300
  protected readonly titleId: string;
2301
+ /**
2302
+ * (library source 2026-11-04, not yet published) True while the scrollable body (`.sp-body`) is taller than the space it has.
2303
+ * Only then the body is a keyboard Tab stop (`tabindex="0"`, `role="group"`, named by the panel title via `aria-labelledby`)
2304
+ * so keyboard users can scroll it with the arrow keys / Space / PageUp / PageDown. While the content fits, the body carries
2305
+ * none of those attributes (unchanged markup). Kept current by a ResizeObserver + MutationObserver on the body.
2306
+ */
2307
+ readonly bodyScrollable: import("@angular/core").WritableSignal<boolean>;
2308
+ private readonly _bodyRef;
2309
+ private _bodyObservers;
2246
2310
  private readonly _el;
2247
2311
  private readonly _doc;
2248
2312
  private readonly _overlays;
@@ -2252,6 +2316,14 @@ export declare class SidePanelComponent implements OnDestroy {
2252
2316
  private _stopIframeKeys;
2253
2317
  private readonly _interaction;
2254
2318
  constructor();
2319
+ /**
2320
+ * Re-measures the body now (`scrollHeight` vs `clientHeight`, 1px tolerance for sub-pixel rounding) and updates
2321
+ * `bodyScrollable`. Called by the observers; also usable by a host that changes the body content in a way no observer sees.
2322
+ */
2323
+ refreshScrollable(): void;
2324
+ /** Starts observing the (new) body element, or stops observing when the body is gone (panel closed). */
2325
+ private _watchBody;
2326
+ private _stopWatchingBody;
2255
2327
  onKeydown(event: KeyboardEvent): void;
2256
2328
  /** A focus-guard sentinel received focus (Tab left the panel's tab order, e.g. out of an iframe): send it back inside. */
2257
2329
  protected onGuardFocus(which: 'start' | 'end', event?: FocusEvent): void;
@@ -2342,7 +2414,7 @@ export declare class ModalComponent implements OnInit, OnDestroy {
2342
2414
  */
2343
2415
  readonly describedBy: import("@angular/core").InputSignal<string | null>;
2344
2416
  readonly maxWidth: import("@angular/core").InputSignal<string>;
2345
- readonly bodyOverflow: import("@angular/core").InputSignal<"hidden" | "visible" | "auto">;
2417
+ readonly bodyOverflow: import("@angular/core").InputSignal<"auto" | "hidden" | "visible">;
2346
2418
  /** `data-testid` of the dialog element itself (the host `<ui-modal>` is always in the page, the dialog only while open). None when empty. */
2347
2419
  readonly dialogTestId: import("@angular/core").InputSignal<string>;
2348
2420
  /** Hides the header X button (e.g. while a request is running). Escape and a backdrop click still close unless `closable` is false. */
@@ -2513,6 +2585,14 @@ export interface ToastOptions {
2513
2585
  key?: string;
2514
2586
  /** Called with the `id` of a button when it is used (before the toast closes). */
2515
2587
  onAction?: (actionId: string) => void;
2588
+ /**
2589
+ * (library source 2026-11-04, not yet published) Default `false` (unchanged). `true` = if a toast with the SAME message and the SAME type is on screen right
2590
+ * now, show this one as a fresh toast of its own: the toast element is re-created (so a screen reader announces the text again and the
2591
+ * entry animation replays), the dismiss timer restarts with this call's duration, and the title / buttons / countdown of this call replace
2592
+ * the old ones. Nothing is queued. If the message on screen is different (or nothing is showing) `repeat` changes nothing. Without
2593
+ * `repeat`, an identical message arriving while it is on screen only restarts the timer silently: it is not announced again.
2594
+ */
2595
+ repeat?: boolean;
2516
2596
  }
2517
2597
  /** What is known about the toast on screen beyond its message and type; `null` for a plain toast. */
2518
2598
  export interface ToastDetails {
@@ -2539,6 +2619,11 @@ export declare class ToastService implements OnDestroy {
2539
2619
  readonly persistentLiveRegion: import("@angular/core").WritableSignal<boolean>;
2540
2620
  /** The title, buttons, countdown flag, key and callback of the toast on screen; `null` for a plain toast or none. */
2541
2621
  readonly details: import("@angular/core").WritableSignal<ToastDetails | null>;
2622
+ /**
2623
+ * (library source 2026-11-04, not yet published) Counts the `repeat: true` re-presentations of an identical message. The outlet re-creates the toast
2624
+ * element whenever it changes, which is what makes a screen reader announce the same text again. Starts at 0 and only grows.
2625
+ */
2626
+ readonly repeatTick: import("@angular/core").WritableSignal<number>;
2542
2627
  /** How many toasts are waiting behind the one on screen (queue mode). */
2543
2628
  readonly queuedCount: import("@angular/core").WritableSignal<number>;
2544
2629
  /** Default for `ToastOptions.queue`: new toasts wait for the one on screen instead of replacing it. Set with `provideForgerouteToast({ queue: true })` or `<ui-toast [queue]="true" />`. */
@@ -2630,6 +2715,8 @@ export declare class ToastComponent {
2630
2715
  readonly queueLabel: import("@angular/core").InputSignal<string>;
2631
2716
  /** A toast button was used (also after its own `onAction`). */
2632
2717
  readonly action: import("@angular/core").OutputEmitterRef<ToastActionEvent>;
2718
+ /** One entry that changes with every `repeat: true` toast: the @for re-creates the toast element, so identical text is announced again. */
2719
+ protected readonly repeatKeys: import("@angular/core").Signal<number[]>;
2633
2720
  protected readonly isRich: import("@angular/core").Signal<boolean>;
2634
2721
  protected readonly countdownPct: import("@angular/core").Signal<number>;
2635
2722
  protected readonly countdownText: import("@angular/core").Signal<string>;
@@ -2642,6 +2729,7 @@ export declare class ToastComponent {
2642
2729
  */
2643
2730
  private readonly _adoptedMessage;
2644
2731
  protected readonly adopted: import("@angular/core").Signal<boolean>;
2732
+ private _lastRepeatTick;
2645
2733
  private _wasWaiting;
2646
2734
  private _hover;
2647
2735
  private _focus;
@@ -2694,7 +2782,7 @@ export declare class ToastComponent {
2694
2782
  "action": "action";
2695
2783
  }, never, never, true, never>;
2696
2784
  }
2697
- export type ProgressBarVariant = 'blue' | 'green' | 'amber' | 'red' | 'slate';
2785
+ export type ProgressBarVariant = 'blue' | 'green' | 'amber' | 'orange' | 'red' | 'slate';
2698
2786
  /**
2699
2787
  * Horizontal progress bar with an optional trailing label (e.g. "3/5").
2700
2788
  * Pass `value` and `max`; the fill width is clamped to 0–100%, rounded to whole percents, and a value above 0 is never drawn narrower
@@ -2900,7 +2988,7 @@ export declare class AudioPlayerComponent {
2900
2988
  /** Accessible name of the player. */
2901
2989
  readonly ariaLabel: import("@angular/core").InputSignal<string>;
2902
2990
  /** How much to load before play: 'metadata' (default), 'auto' or 'none'. */
2903
- readonly preload: import("@angular/core").InputSignal<"none" | "metadata" | "auto">;
2991
+ readonly preload: import("@angular/core").InputSignal<"auto" | "none" | "metadata">;
2904
2992
  /** Fires when the browser can't load or decode the source. */
2905
2993
  readonly playbackError: import("@angular/core").OutputEmitterRef<void>;
2906
2994
  protected readonly failed: import("@angular/core").WritableSignal<boolean>;
@@ -3154,7 +3242,7 @@ export declare class CheckboxComponent implements ControlValueAccessor, Validato
3154
3242
  * clicking it still toggles the box - e.g. a product name that is both the heading of its card and the label of its checkbox.
3155
3243
  * Default null: plain label text, exactly as before. Single mode only.
3156
3244
  */
3157
- readonly headingLevel: import("@angular/core").InputSignal<1 | 2 | 3 | 4 | 5 | 6 | null>;
3245
+ readonly headingLevel: import("@angular/core").InputSignal<1 | 4 | 2 | 3 | 5 | 6 | null>;
3158
3246
  readonly indeterminate: import("@angular/core").InputSignal<boolean>;
3159
3247
  readonly checked: import("@angular/core").ModelSignal<boolean>;
3160
3248
  /**
@@ -3172,7 +3260,7 @@ export declare class CheckboxComponent implements ControlValueAccessor, Validato
3172
3260
  */
3173
3261
  protected readonly _legend: import("@angular/core").Signal<string>;
3174
3262
  /** Group mode: lay the options out in a column (default) or in a wrapping row. */
3175
- readonly orientation: import("@angular/core").InputSignal<"vertical" | "horizontal">;
3263
+ readonly orientation: import("@angular/core").InputSignal<"horizontal" | "vertical">;
3176
3264
  /**
3177
3265
  * Group mode: the ticked option values as a two-way model (`[(values)]`), an alternative to ngModel / forms. Unset (default) = the
3178
3266
  * group is driven by ngModel / FormControl only. Values that are not an option are dropped and the order follows `options`.
@@ -3378,6 +3466,8 @@ export declare class ToggleComponent implements ControlValueAccessor {
3378
3466
  readonly ariaLabel: import("@angular/core").InputSignal<string>;
3379
3467
  /** Id of another element that describes the switch (e.g. a description rendered elsewhere); announced after the hint. Absent when empty. */
3380
3468
  readonly ariaDescribedBy: import("@angular/core").InputSignal<string>;
3469
+ /** `data-testid` put on the inner `<input role="switch">` (the host keeps its own attributes), so e2e can target the switch directly. Absent when empty. */
3470
+ readonly inputTestId: import("@angular/core").InputSignal<string>;
3381
3471
  /** Whether the switch is on. Two-way: `[(checked)]`. */
3382
3472
  readonly checked: import("@angular/core").ModelSignal<boolean>;
3383
3473
  /** Public so a host template can bind `[disabled]` (a protected input fails strict template type-checking, TS2445). */
@@ -3420,6 +3510,11 @@ export declare class ToggleComponent implements ControlValueAccessor {
3420
3510
  "required": false;
3421
3511
  "isSignal": true;
3422
3512
  };
3513
+ "inputTestId": {
3514
+ "alias": "inputTestId";
3515
+ "required": false;
3516
+ "isSignal": true;
3517
+ };
3423
3518
  "checked": {
3424
3519
  "alias": "checked";
3425
3520
  "required": false;
@@ -3546,13 +3641,13 @@ export declare class StepperComponent {
3546
3641
  /** Accessible name of the list. */
3547
3642
  readonly ariaLabel: import("@angular/core").InputSignal<string>;
3548
3643
  /** Horizontal, <= 480px: show only the current step's label (`'current'`, default) or every label (`'all'`). */
3549
- readonly labelsOnSmallScreens: import("@angular/core").InputSignal<"all" | "current">;
3644
+ readonly labelsOnSmallScreens: import("@angular/core").InputSignal<"current" | "all">;
3550
3645
  /**
3551
3646
  * Horizontal only. `'beside'` (default): the label sits to the right of its circle. `'below'`: equal-width columns, the label centred under
3552
3647
  * its circle, one continuous line behind the circles that fills as steps complete; a complete step shows a check, the current step an
3553
3648
  * accent ring with a dot, an upcoming step an empty circle (no numbers). Circles are 40px (32px with `size="sm"`).
3554
3649
  */
3555
- readonly labelPosition: import("@angular/core").InputSignal<"below" | "beside">;
3650
+ readonly labelPosition: import("@angular/core").InputSignal<"beside" | "below">;
3556
3651
  /** Viewport width in px below which a horizontal stepper is drawn vertical (labels beside the circles), e.g. `640`. null (default) = never. */
3557
3652
  readonly stackBelow: import("@angular/core").InputSignal<number | null>;
3558
3653
  /** CSS length (e.g. `10.5rem`): horizontal only - the list gets `min-width: calc(<step count> * <value>)`. Empty (default) = no minimum. */
@@ -3584,7 +3679,7 @@ export declare class StepperComponent {
3584
3679
  protected readonly rows: import("@angular/core").Signal<{
3585
3680
  step: StepperStep;
3586
3681
  index: number;
3587
- state: "complete" | "current" | "upcoming";
3682
+ state: "current" | "complete" | "upcoming";
3588
3683
  error: boolean;
3589
3684
  errorMessage: string;
3590
3685
  selectable: boolean;
@@ -3869,6 +3964,11 @@ export interface RadioOption {
3869
3964
  disabled?: boolean;
3870
3965
  /** `data-testid` of this option's native radio input (e.g. for end-to-end tests); none when omitted. */
3871
3966
  testId?: string;
3967
+ /**
3968
+ * Library source 2026-11-04, not yet published. Icon drawn in front of the option's label: a `<ui-icon>` key (`cup`, `wrench`, ...) or a raw SVG
3969
+ * path. Decorative (`aria-hidden`); none when omitted.
3970
+ */
3971
+ icon?: string;
3872
3972
  }
3873
3973
  /**
3874
3974
  * Group of native radio buttons inside a `<fieldset>` (+ `<legend>` = `label`), a ControlValueAccessor (string value, `''`
@@ -3892,13 +3992,13 @@ export declare class RadioGroupComponent implements ControlValueAccessor, Valida
3892
3992
  readonly error: import("@angular/core").InputSignal<string>;
3893
3993
  /** Reveal the built-in error messages now (e.g. after a failed Save click), without waiting for blur. */
3894
3994
  readonly showErrors: import("@angular/core").InputSignal<boolean>;
3895
- readonly orientation: import("@angular/core").InputSignal<"vertical" | "horizontal">;
3995
+ readonly orientation: import("@angular/core").InputSignal<"horizontal" | "vertical">;
3896
3996
  /** Native `name` shared by the radios; a unique one is generated when omitted. */
3897
3997
  readonly name: import("@angular/core").InputSignal<string>;
3898
3998
  /** `<ng-template uiRadioOptionContent="value">` children: content shown under that option while it is selected. */
3899
3999
  private readonly _optionContent;
3900
4000
  protected readonly _nestedContent: import("@angular/core").Signal<Map<string, TemplateRef<unknown>>>;
3901
- protected readonly _disabledInput: import("@angular/core").InputSignal<boolean>;
4001
+ readonly _disabledInput: import("@angular/core").InputSignal<boolean>;
3902
4002
  private readonly _cvaDisabled;
3903
4003
  protected readonly disabled: import("@angular/core").Signal<boolean>;
3904
4004
  private readonly _generatedName;
@@ -4181,7 +4281,7 @@ export declare class ButtonComponent {
4181
4281
  * `ghost-start`: a ghost button for list / section toggles - a full-width row with its content aligned to the start, transparent
4182
4282
  * background, hover tint and the normal focus ring. Pair it with `ariaExpanded` / `ariaPressed`; the label may contain a heading element.
4183
4283
  */
4184
- readonly variant: import("@angular/core").InputSignal<"link" | "icon" | "warning" | "danger" | "primary" | "secondary" | "ghost" | "ghost-start" | "tab" | "icon-danger">;
4284
+ readonly variant: import("@angular/core").InputSignal<"link" | "primary" | "secondary" | "danger" | "warning" | "icon" | "ghost" | "ghost-start" | "tab" | "icon-danger">;
4185
4285
  /** Renders an anchor to this route instead of a button (use with `variant="link"` for an inline text link). `['/settings']` or `'/settings'`. While `disabled` or `loading` it renders a non-clickable `<span role="link" aria-disabled>` with no href (like `href`). */
4186
4286
  readonly routerLink: import("@angular/core").InputSignal<string | readonly unknown[] | null>;
4187
4287
  /** Query params of the `routerLink` (e.g. `{ section: 'deal-defaults' }`). */
@@ -4202,7 +4302,7 @@ export declare class ButtonComponent {
4202
4302
  */
4203
4303
  readonly href: import("@angular/core").InputSignal<string | null>;
4204
4304
  /** Where to open the `href` (`_blank` = a new tab). */
4205
- readonly target: import("@angular/core").InputSignal<"_self" | "_blank" | "_parent" | "_top" | null>;
4305
+ readonly target: import("@angular/core").InputSignal<"_blank" | "_self" | "_parent" | "_top" | null>;
4206
4306
  /** `rel` of the `href` link. A `_blank` target always gets `noopener noreferrer` added. */
4207
4307
  readonly rel: import("@angular/core").InputSignal<string | null>;
4208
4308
  /** The href when it is allowed (http, https, mailto, tel, sms or a relative URL), else null. */
@@ -4236,6 +4336,14 @@ export declare class ButtonComponent {
4236
4336
  readonly ariaPressed: import("@angular/core").InputSignal<boolean | undefined>;
4237
4337
  /** Id of the element that describes this button (an error or hint rendered next to it), e.g. `<ui-error errorId="x">`. Absent when empty. */
4238
4338
  readonly ariaDescribedBy: import("@angular/core").InputSignal<string | undefined>;
4339
+ private readonly _hostEl;
4340
+ /**
4341
+ * Library source 2026-11-04, not yet published. Puts the keyboard focus on the inner native control (the `<button>`, or the `<a>` of a
4342
+ * `routerLink` / `href` button): `buttonRef.focus()` via `viewChild(ButtonComponent)`. Same options as the DOM method (`{ preventScroll: true }`).
4343
+ * Safe at any time: before the view exists, or while the button is `disabled` / `loading` (a disabled `<button>` cannot take focus; the
4344
+ * disabled-link `<span>` is not focusable), it does nothing and never throws.
4345
+ */
4346
+ focus(options?: FocusOptions): void;
4239
4347
  constructor();
4240
4348
  _footerLeft?: string;
4241
4349
  _footerRight?: string;
@@ -4428,6 +4536,10 @@ export interface PillTab {
4428
4536
  * its name. The tooltip is not shown in the horizontally scrolling mobile layout (it would be clipped).
4429
4537
  */
4430
4538
  info?: string;
4539
+ /** (library source 2026-11-05) Heading shown under the tab list while this tab is active, when the tabs' `showDescription` input is on. */
4540
+ title?: string;
4541
+ /** (library source 2026-11-05) Explanatory paragraph shown under the heading while this tab is active (`showDescription`). */
4542
+ description?: string;
4431
4543
  }
4432
4544
  /**
4433
4545
  * Pill-style tabs following the WAI-ARIA tabs pattern: each tab is a real <button role="tab">,
@@ -4444,13 +4556,39 @@ export declare class PillTabsComponent {
4444
4556
  /** Keep every pill at its own width on one line (default false: pills may shrink and wrap their text). On a phone the row scrolls sideways, as it always does. */
4445
4557
  readonly noWrap: import("@angular/core").InputSignal<boolean>;
4446
4558
  /** 'vertical' stacks the tabs in a column (Up/Down arrows move between them, `aria-orientation="vertical"`). Default 'horizontal' = unchanged. */
4447
- readonly orientation: import("@angular/core").InputSignal<"vertical" | "horizontal">;
4559
+ readonly orientation: import("@angular/core").InputSignal<"horizontal" | "vertical">;
4448
4560
  protected readonly vertical: () => boolean;
4561
+ /**
4562
+ * (library source 2026-11-04, not yet published) Associate the tabs with their panels: every tab gets
4563
+ * `aria-controls="<name>-panel-<key>"`, the id a `uiTabPanel` directive gives its element (see `PillTabPanelDirective`).
4564
+ * Default false = no `aria-controls` at all (unchanged markup). Turn it on only when every tab has a `uiTabPanel`
4565
+ * element in the page, otherwise `aria-controls` would point at a missing id. The tab ids themselves are unchanged
4566
+ * and always `<name>-<key>` (see `pillTabId`).
4567
+ *
4568
+ * Id collision: a tab whose KEY is `panel-x` has the id `<name>-panel-x`, which is also the panel id for key `x`. Avoid keys that start with
4569
+ * `panel-` when this is on; in development mode a `console.warn` names such a key.
4570
+ */
4571
+ readonly controlsPanels: import("@angular/core").InputSignal<boolean>;
4572
+ /**
4573
+ * (library source 2026-11-05) Show the ACTIVE tab's `title` (heading) and `description` (paragraph) under the tab list. Default false = no extra DOM.
4574
+ * A tab with only one of them renders only that one; a tab with neither renders nothing. The ids are `<name>--title` / `<name>--description`
4575
+ * (`pillTabTitleId` / `pillTabDescriptionId`); `[uiTabPanel] [describedByHeader]="true"` points the panel's `aria-describedby` at the description.
4576
+ */
4577
+ readonly showDescription: import("@angular/core").InputSignal<boolean>;
4578
+ /** Heading level of the active tab's title when `showDescription` is on: 2 (default) or 3. */
4579
+ readonly headingLevel: import("@angular/core").InputSignal<2 | 3>;
4449
4580
  readonly tabChange: import("@angular/core").OutputEmitterRef<string>;
4581
+ protected readonly activeTab: import("@angular/core").Signal<PillTab | null>;
4582
+ protected titleId(): string;
4583
+ protected descriptionId(): string;
4450
4584
  /** True while pills are hidden past the start / end edge of the scroll area (drives the fade hints). */
4451
4585
  protected readonly canScrollStart: import("@angular/core").WritableSignal<boolean>;
4452
4586
  protected readonly canScrollEnd: import("@angular/core").WritableSignal<boolean>;
4453
4587
  constructor();
4588
+ /** Id of the tab button for [key] (`<name>-<key>`, the exported `pillTabId`). */
4589
+ protected tabId(key: string): string;
4590
+ /** Id of the panel [key] controls (`<name>-panel-<key>`, the exported `pillTabPanelId`). */
4591
+ protected panelId(key: string): string;
4454
4592
  protected updateOverflow(): void;
4455
4593
  select(key: string): void;
4456
4594
  /** Roving tabindex — the selected tab (or the first enabled one when none is selected) is tabbable. */
@@ -4488,10 +4626,104 @@ export declare class PillTabsComponent {
4488
4626
  "required": false;
4489
4627
  "isSignal": true;
4490
4628
  };
4629
+ "controlsPanels": {
4630
+ "alias": "controlsPanels";
4631
+ "required": false;
4632
+ "isSignal": true;
4633
+ };
4634
+ "showDescription": {
4635
+ "alias": "showDescription";
4636
+ "required": false;
4637
+ "isSignal": true;
4638
+ };
4639
+ "headingLevel": {
4640
+ "alias": "headingLevel";
4641
+ "required": false;
4642
+ "isSignal": true;
4643
+ };
4491
4644
  }, {
4492
4645
  "tabChange": "tabChange";
4493
4646
  }, never, never, true, never>;
4494
4647
  }
4648
+ /** Id of the tab button `ui-pill-tabs` renders for [key] when its `name` input is [name] (always `<name>-<key>`). */
4649
+ export declare function pillTabId(name: string, key: string): string;
4650
+ /** Id a `uiTabPanel` element gets, and the id every tab's `aria-controls` points at when `controlsPanels` is on: `<name>-panel-<key>`. */
4651
+ export declare function pillTabPanelId(name: string, key: string): string;
4652
+ /** Id of the heading `ui-pill-tabs` renders for the active tab when `showDescription` is on: `<name>--title`. */
4653
+ export declare function pillTabTitleId(name: string): string;
4654
+ /** Id of the description paragraph `ui-pill-tabs` renders for the active tab when `showDescription` is on: `<name>--description`. */
4655
+ export declare function pillTabDescriptionId(name: string): string;
4656
+ /**
4657
+ * (library source 2026-11-04, not yet published) The panel that belongs to one `ui-pill-tabs` tab: a correct
4658
+ * WAI-ARIA tablist / tabpanel association with the smallest possible markup.
4659
+ *
4660
+ * ```html
4661
+ * <ui-pill-tabs name="billing" [tabs]="tabs" [activeKey]="tab()" [controlsPanels]="true" (tabChange)="tab.set($event)" />
4662
+ * <section uiTabPanel="invoices" tabsName="billing" [activeKey]="tab()"> ... </section>
4663
+ * <section uiTabPanel="payments" tabsName="billing" [activeKey]="tab()"> ... </section>
4664
+ * ```
4665
+ *
4666
+ * The host element gets `role="tabpanel"`, `id="<tabsName>-panel-<key>"` and `aria-labelledby="<tabsName>-<key>"` (the tab button).
4667
+ * - `uiTabPanel` the key of the tab this panel belongs to (required, the same `key` as in the tabs list).
4668
+ * - `tabsName` the `name` input of the `ui-pill-tabs` (required; give the tabs a fixed `name` so the ids are predictable).
4669
+ * - `activeKey` the tabs' active key. When given (not null), the panel gets the `hidden` attribute while another tab is active
4670
+ * (the panels stay in the DOM, so their state survives a tab change). Leave it unset when the page renders only the
4671
+ * active panel itself (`@if`), then no `hidden` attribute is ever set.
4672
+ * - `describedByHeader` default false. true adds `aria-describedby="<tabsName>--description"` (the description `ui-pill-tabs` shows under the
4673
+ * tab list with `showDescription`) while the panel is not hidden. Turn it on only when the active tab has a `description`.
4674
+ * - `tabbable` default false. true adds `tabindex="0"` so a panel without any focusable content can be reached by keyboard
4675
+ * (WAI-ARIA tabs pattern).
4676
+ *
4677
+ * Id collision: ids are plain strings, so a tab whose KEY is `panel-x` has the tab id `<name>-panel-x`, which is the same string as the panel id of the
4678
+ * key `x`. Do not use keys that start with `panel-` together with `controlsPanels` (`ui-pill-tabs` logs a `console.warn` for such a key in development mode).
4679
+ *
4680
+ * Note: the `hidden` attribute loses against an author rule such as `display: flex` on the same element; put such layout on an
4681
+ * inner element, or style `[hidden] { display: none }`.
4682
+ */
4683
+ export declare class PillTabPanelDirective {
4684
+ /** Key of the tab this panel belongs to. */
4685
+ readonly key: import("@angular/core").InputSignal<string>;
4686
+ /** `name` of the `ui-pill-tabs` this panel belongs to. */
4687
+ readonly tabsName: import("@angular/core").InputSignal<string>;
4688
+ /** Active key of the tabs; the panel is `hidden` while it is another key. null (default) = never hidden by this directive. */
4689
+ readonly activeKey: import("@angular/core").InputSignal<string | null>;
4690
+ /** Makes the panel itself a Tab stop (for panels with no focusable content). Default false. */
4691
+ readonly tabbable: import("@angular/core").InputSignal<boolean>;
4692
+ /** Adds `aria-describedby` pointing at the description `ui-pill-tabs` renders under the tab list (`showDescription`). Default false. */
4693
+ readonly describedByHeader: import("@angular/core").InputSignal<boolean>;
4694
+ protected describedId(): string | null;
4695
+ protected panelId(): string;
4696
+ protected tabId(): string;
4697
+ protected isHidden(): boolean;
4698
+ static ɵfac: i0.ɵɵFactoryDeclaration<PillTabPanelDirective, never>;
4699
+ static ɵdir: i0.ɵɵDirectiveDeclaration<PillTabPanelDirective, "[uiTabPanel]", never, {
4700
+ "key": {
4701
+ "alias": "uiTabPanel";
4702
+ "required": true;
4703
+ "isSignal": true;
4704
+ };
4705
+ "tabsName": {
4706
+ "alias": "tabsName";
4707
+ "required": true;
4708
+ "isSignal": true;
4709
+ };
4710
+ "activeKey": {
4711
+ "alias": "activeKey";
4712
+ "required": false;
4713
+ "isSignal": true;
4714
+ };
4715
+ "tabbable": {
4716
+ "alias": "tabbable";
4717
+ "required": false;
4718
+ "isSignal": true;
4719
+ };
4720
+ "describedByHeader": {
4721
+ "alias": "describedByHeader";
4722
+ "required": false;
4723
+ "isSignal": true;
4724
+ };
4725
+ }, {}, never, never, true, never>;
4726
+ }
4495
4727
  export interface ContactLookup {
4496
4728
  id: string;
4497
4729
  name: string;
@@ -4999,7 +5231,11 @@ export interface ActiveConfirm {
4999
5231
  /** Optional bullet list rendered under the message (plain text). */
5000
5232
  details: string[];
5001
5233
  }
5002
- export declare class ConfirmService {
5234
+ export declare class ConfirmService implements OnDestroy {
5235
+ private readonly _appRef;
5236
+ private readonly _envInjector;
5237
+ private readonly _doc;
5238
+ private readonly _browser;
5003
5239
  private _open;
5004
5240
  private _active;
5005
5241
  private _resolve;
@@ -5013,8 +5249,24 @@ export declare class ConfirmService {
5013
5249
  */
5014
5250
  private readonly _outlets;
5015
5251
  readonly primaryOutlet: import("@angular/core").Signal<object>;
5252
+ /**
5253
+ * The outlet this service created itself because `confirm()` was called while no `<ui-confirm-outlet>` existed (a page without a
5254
+ * `ui-data-table` and without a hand-placed outlet). Null while a template-placed outlet exists, before the first such confirm, and
5255
+ * on the server. Library source 2026-11-04, not yet published.
5256
+ */
5257
+ private _auto;
5258
+ /** True when a template-placed outlet appeared while the auto outlet's dialog was open: the auto outlet is removed once that dialog closes. */
5259
+ private _retireAutoOnDismiss;
5016
5260
  registerOutlet(outlet: object): void;
5017
5261
  unregisterOutlet(outlet: object): void;
5262
+ ngOnDestroy(): void;
5263
+ /**
5264
+ * Makes sure some outlet exists to render the dialog. Template-placed outlets (data-table, app-shell, a hand-placed
5265
+ * `<ui-confirm-outlet />`) are used as they are; only when there is none is one outlet created and attached to `document.body`
5266
+ * (reused for later confirms, removed when the service is destroyed or a template-placed outlet appears). Does nothing without a DOM (SSR).
5267
+ */
5268
+ private _ensureOutlet;
5269
+ private _destroyAuto;
5018
5270
  confirm(config: {
5019
5271
  title: string;
5020
5272
  message: string;
@@ -5069,12 +5321,19 @@ export declare class EmptyStateComponent {
5069
5321
  }, {}, never, ["*"], true, never>;
5070
5322
  }
5071
5323
  export declare class ErrorStateComponent {
5324
+ /** Optional bold heading line above the message (e.g. "Unable to load application"). Empty = no heading. */
5325
+ readonly title: import("@angular/core").InputSignal<string>;
5072
5326
  readonly message: import("@angular/core").InputSignal<string>;
5073
5327
  readonly retryLabel: import("@angular/core").InputSignal<string>;
5074
5328
  readonly retrying: import("@angular/core").InputSignal<boolean>;
5075
5329
  readonly retry: import("@angular/core").OutputEmitterRef<void>;
5076
5330
  static ɵfac: i0.ɵɵFactoryDeclaration<ErrorStateComponent, never>;
5077
5331
  static ɵcmp: i0.ɵɵComponentDeclaration<ErrorStateComponent, "ui-error-state", never, {
5332
+ "title": {
5333
+ "alias": "title";
5334
+ "required": false;
5335
+ "isSignal": true;
5336
+ };
5078
5337
  "message": {
5079
5338
  "alias": "message";
5080
5339
  "required": false;
@@ -5161,6 +5420,12 @@ export declare class TextInputComponent implements ControlValueAccessor, Validat
5161
5420
  * Meant for a short mark of 1-3 characters.
5162
5421
  */
5163
5422
  readonly prefix: import("@angular/core").InputSignal<string>;
5423
+ /**
5424
+ * Library source 2026-11-04, not yet published. An optional icon at the left inside the field: a `<ui-icon>` key, e.g. `leadingIcon="search"` for a search field.
5425
+ * Decorative (`aria-hidden`, no pointer events, not part of the value), so give the field a `label` or `ariaLabel`. The input's left padding grows to
5426
+ * make room (36px; with a `prefix` the mark moves right of the icon). An unknown key or empty (default) draws nothing and changes nothing.
5427
+ */
5428
+ readonly leadingIcon: import("@angular/core").InputSignal<string>;
5164
5429
  /**
5165
5430
  * `type="password"` only: puts an eye button inside the field, at its right end, that shows / hides the typed text (the eye with a slash
5166
5431
  * means "hidden again"). Per field, starts hidden; the button is a toggle (`aria-pressed`) named "Show password". Ignored for other types.
@@ -5182,7 +5447,7 @@ export declare class TextInputComponent implements ControlValueAccessor, Validat
5182
5447
  * `search`, `text`, `none`). Empty (default) = the browser's default for the field, except `type="tel"`, which keeps `tel`.
5183
5448
  * It only picks the keyboard; it does not restrict what can be typed or pasted.
5184
5449
  */
5185
- readonly inputmode: import("@angular/core").InputSignal<"" | "none" | "email" | "search" | "text" | "numeric" | "tel" | "url" | "decimal">;
5450
+ readonly inputmode: import("@angular/core").InputSignal<"" | "email" | "search" | "none" | "text" | "tel" | "url" | "decimal" | "numeric">;
5186
5451
  readonly readonly: import("@angular/core").InputSignal<boolean>;
5187
5452
  readonly hint: import("@angular/core").InputSignal<string>;
5188
5453
  /** Id(s) of an external element that also describes this control (e.g. one shared error text for a group of fields). Space separated; MERGED after the control's own hint / error id in `aria-describedby`, never replacing it. Empty = unchanged. */
@@ -5240,8 +5505,14 @@ export declare class TextInputComponent implements ControlValueAccessor, Validat
5240
5505
  protected readonly disabled: import("@angular/core").Signal<boolean>;
5241
5506
  protected readonly _value: import("@angular/core").WritableSignal<string>;
5242
5507
  private readonly _reveal;
5243
- /** Left padding that makes room for the prefix (its width in `ch` plus the field's own 12px and a 6px gap); none without a prefix. */
5508
+ /** Path of the leading icon, or null when `leadingIcon` is empty or not a known icon key. */
5509
+ protected readonly _leadingD: import("@angular/core").Signal<string | null>;
5510
+ /**
5511
+ * Left padding that makes room for the prefix (its width in `ch` plus the field's own 12px and a 6px gap) and/or the leading icon (a 16px icon
5512
+ * plus an 8px gap, so 36px from the edge); none without either.
5513
+ */
5244
5514
  protected readonly _prefixPadding: import("@angular/core").Signal<string | null>;
5515
+ private readonly _fieldEl;
5245
5516
  /** True when the control value is a number: `valueType="number"` on a `type="number"` field. */
5246
5517
  private readonly _numeric;
5247
5518
  /** The native `step` attribute: only for `type="number"` and only for a finite number above 0; otherwise none (the browser's step of 1). */
@@ -5267,6 +5538,12 @@ export declare class TextInputComponent implements ControlValueAccessor, Validat
5267
5538
  protected readonly _activeError: import("@angular/core").Signal<string>;
5268
5539
  protected readonly _inputId: string;
5269
5540
  private static readonly _EMAIL_RE;
5541
+ /**
5542
+ * Library source 2026-11-04, not yet published. Puts the keyboard focus on the inner `<input>` (e.g. after a panel opens or a search is cleared):
5543
+ * `fieldRef.focus()` via `viewChild(TextInputComponent)`. Same options as the DOM method (`{ preventScroll: true }`). Safe at any time: before the
5544
+ * view exists, or on a disabled field, it does nothing and never throws.
5545
+ */
5546
+ focus(options?: FocusOptions): void;
5270
5547
  private _onChange;
5271
5548
  private _onTouched;
5272
5549
  private _onValidatorChange;
@@ -5327,6 +5604,11 @@ export declare class TextInputComponent implements ControlValueAccessor, Validat
5327
5604
  "required": false;
5328
5605
  "isSignal": true;
5329
5606
  };
5607
+ "leadingIcon": {
5608
+ "alias": "leadingIcon";
5609
+ "required": false;
5610
+ "isSignal": true;
5611
+ };
5330
5612
  "revealable": {
5331
5613
  "alias": "revealable";
5332
5614
  "required": false;
@@ -5556,7 +5838,7 @@ export declare class TextareaInputComponent implements ControlValueAccessor, Val
5556
5838
  readonly monospace: import("@angular/core").InputSignal<boolean>;
5557
5839
  /** Reveal the built-in error messages now (e.g. after a failed Save click), without waiting for blur. */
5558
5840
  readonly showErrors: import("@angular/core").InputSignal<boolean>;
5559
- protected readonly _disabledInput: import("@angular/core").InputSignal<boolean>;
5841
+ readonly _disabledInput: import("@angular/core").InputSignal<boolean>;
5560
5842
  private readonly _cvaDisabled;
5561
5843
  protected readonly disabled: import("@angular/core").Signal<boolean>;
5562
5844
  protected readonly _value: import("@angular/core").WritableSignal<string>;
@@ -5584,6 +5866,13 @@ export declare class TextareaInputComponent implements ControlValueAccessor, Val
5584
5866
  validate(control: AbstractControl): ValidationErrors | null;
5585
5867
  registerOnValidatorChange(fn: () => void): void;
5586
5868
  protected readonly _inputId: string;
5869
+ private readonly _hostEl;
5870
+ /**
5871
+ * Library source 2026-11-04, not yet published. Puts the keyboard focus on the inner native `<textarea>` (`ref.focus()` via `viewChild`).
5872
+ * Same options as the DOM method (`{ preventScroll: true }`). Safe at any time: before the view exists, or on a disabled field, it does
5873
+ * nothing and never throws.
5874
+ */
5875
+ focus(options?: FocusOptions): void;
5587
5876
  private _onChange;
5588
5877
  private _onTouched;
5589
5878
  writeValue(val: string | null): void;
@@ -5839,7 +6128,7 @@ export declare class FileInputComponent implements ControlValueAccessor, Validat
5839
6128
  readonly fileRemoved: import("@angular/core").OutputEmitterRef<void>;
5840
6129
  /** Emits whenever the field becomes invalid / valid. */
5841
6130
  readonly invalidChange: import("@angular/core").OutputEmitterRef<boolean>;
5842
- protected readonly _disabledInput: import("@angular/core").InputSignal<boolean>;
6131
+ readonly _disabledInput: import("@angular/core").InputSignal<boolean>;
5843
6132
  private readonly _cvaDisabled;
5844
6133
  protected readonly disabled: import("@angular/core").Signal<boolean>;
5845
6134
  protected readonly _files: import("@angular/core").WritableSignal<File[]>;
@@ -6145,7 +6434,7 @@ export declare class DatetimeInputComponent implements ControlValueAccessor, Val
6145
6434
  readonly error: import("@angular/core").InputSignal<string>;
6146
6435
  /** Reveal the built-in error messages now (e.g. after a failed Save click), without waiting for blur. */
6147
6436
  readonly showErrors: import("@angular/core").InputSignal<boolean>;
6148
- protected readonly _disabledInput: import("@angular/core").InputSignal<boolean>;
6437
+ readonly _disabledInput: import("@angular/core").InputSignal<boolean>;
6149
6438
  private readonly _cvaDisabled;
6150
6439
  protected readonly disabled: import("@angular/core").Signal<boolean>;
6151
6440
  protected readonly _value: import("@angular/core").WritableSignal<string>;
@@ -6421,7 +6710,8 @@ export declare class ComboboxComponent<T = unknown> implements ControlValueAcces
6421
6710
  readonly invalidChange: import("@angular/core").OutputEmitterRef<boolean>;
6422
6711
  readonly focused: import("@angular/core").OutputEmitterRef<void>;
6423
6712
  readonly blurred: import("@angular/core").OutputEmitterRef<void>;
6424
- protected readonly _disabledInput: import("@angular/core").InputSignal<boolean>;
6713
+ /** Disables the field (`[disabled]="x()"`). Public so templates compile; ngModel / FormControl `disable()` still works (effective disabled = this OR the forms API). */
6714
+ readonly _disabledInput: import("@angular/core").InputSignal<boolean>;
6425
6715
  private readonly _cvaDisabled;
6426
6716
  protected readonly disabled: import("@angular/core").Signal<boolean>;
6427
6717
  private readonly _field;
@@ -6743,7 +7033,7 @@ export declare class DropdownComponent {
6743
7033
  readonly loader: import("@angular/core").InputSignal<(() => Promise<DropdownItem[]>) | null>;
6744
7034
  readonly active: import("@angular/core").InputSignal<boolean>;
6745
7035
  readonly activeValue: import("@angular/core").InputSignal<string>;
6746
- readonly variant: import("@angular/core").InputSignal<"badge" | "button">;
7036
+ readonly variant: import("@angular/core").InputSignal<"button" | "badge">;
6747
7037
  /** Trigger size for `variant="button"`: `sm` (default, the compact toolbar look) or `md` (same padding and type as a medium `ui-button`). */
6748
7038
  readonly size: import("@angular/core").InputSignal<"sm" | "md">;
6749
7039
  readonly menuWidth: import("@angular/core").InputSignal<string>;
@@ -7056,7 +7346,7 @@ export declare class FormSectionComponent {
7056
7346
  }, {}, never, ["*"], true, never>;
7057
7347
  }
7058
7348
  export declare class FormRowComponent {
7059
- readonly cols: import("@angular/core").InputSignal<1 | 2 | 3 | 4>;
7349
+ readonly cols: import("@angular/core").InputSignal<1 | 4 | 2 | 3>;
7060
7350
  static ɵfac: i0.ɵɵFactoryDeclaration<FormRowComponent, never>;
7061
7351
  static ɵcmp: i0.ɵɵComponentDeclaration<FormRowComponent, "ui-form-row", never, {
7062
7352
  "cols": {
@@ -7073,7 +7363,7 @@ export declare class FormRowComponent {
7073
7363
  * child simply takes the full width. Keep a numeric span within the row's `cols` (use `all` for the whole row).
7074
7364
  */
7075
7365
  export declare class FormColSpanDirective {
7076
- readonly uiColSpan: import("@angular/core").InputSignal<"" | 2 | 3 | "2" | "3" | "all">;
7366
+ readonly uiColSpan: import("@angular/core").InputSignal<"" | 2 | 3 | "all" | "2" | "3">;
7077
7367
  protected readonly _class: import("@angular/core").Signal<string>;
7078
7368
  static ɵfac: i0.ɵɵFactoryDeclaration<FormColSpanDirective, never>;
7079
7369
  static ɵdir: i0.ɵɵDirectiveDeclaration<FormColSpanDirective, "[uiColSpan]", never, {
@@ -7112,6 +7402,16 @@ export declare class FormColSpanDirective {
7112
7402
  * badge="Archived" badgeVariant="gray" [alwaysShowBadge]="true">
7113
7403
  * <ui-button list-item-action variant="icon" ariaLabel="Remove" (click)="remove(d)">…</ui-button>
7114
7404
  * </ui-list-item>
7405
+ *
7406
+ * Library source 2026-11-04, not yet published: `[disabled]` (aria-disabled, not focusable, never emits `select`, non-colour cue), `[busy]`
7407
+ * (aria-busy, spinner, presses ignored) and a leading image slot, `<img list-item-image>` / `<ui-image list-item-image>`, rendered in front of
7408
+ * the text and instead of the icon tile (clicks on it select a plain row; on a radio / checkbox row they do not, because the image sits outside
7409
+ * the label). An interactive image (`<ui-image list-item-image [interactive]="true" (activate)=...>`) inside a plain pressable row: a click emits the
7410
+ * image's `activate` AND selects the row (the click bubbles); Enter / Space on the image emit `activate` only (the row's key handler ignores keys
7411
+ * whose target is not the row itself). Row-end actions stay in `list-item-action`.
7412
+ * <ui-list-item [title]="p.name" [details]="[p.price]" [disabled]="p.soldOut" [busy]="adding() === p.id" (select)="add(p)">
7413
+ * <ui-image list-item-image [src]="p.photo" [alt]="p.name" width="48px" height="48px" fit="cover" radius="md" />
7414
+ * </ui-list-item>
7115
7415
  */
7116
7416
  /** One secondary line under the title: plain text, or text with a small icon and a tone (`danger` red, `warning` amber). */
7117
7417
  export type ListItemDetail = string | {
@@ -7121,7 +7421,8 @@ export type ListItemDetail = string | {
7121
7421
  };
7122
7422
  /** Colour of the optional leading icon tile. */
7123
7423
  export type ListItemIconColor = 'slate' | 'amber' | 'red' | 'blue' | 'green' | 'purple' | 'teal' | 'orange';
7124
- export declare class ListItemComponent {
7424
+ export declare class ListItemComponent implements AfterContentChecked {
7425
+ private readonly host;
7125
7426
  /** Show a radio button, checkbox, or nothing on the left. */
7126
7427
  readonly leading: import("@angular/core").InputSignal<"none" | "radio" | "checkbox">;
7127
7428
  /** `name` attribute for the radio/checkbox (groups radios together). */
@@ -7148,7 +7449,24 @@ export declare class ListItemComponent {
7148
7449
  * Rows with `[interactive]="false"` always wrap (new in 2026-10-19, nothing to preserve).
7149
7450
  */
7150
7451
  readonly wrapText: import("@angular/core").InputSignal<boolean>;
7452
+ /**
7453
+ * Library source 2026-11-04, not yet published. `true` = the row cannot be used right now: the native radio / checkbox is `disabled` (that carries
7454
+ * the state for assistive tech), a plain pressable row (`role="button"`) gets `aria-disabled="true"` and loses its `tabindex` (not a tab stop). A row
7455
+ * without a role (radio / checkbox row wrapper, non-interactive row) gets NO `aria-disabled` (it is not valid on a role-less div); it only
7456
+ * gets the classes. Clicks, Enter and Space never emit `select`, and the row looks disabled without relying on colour alone (dimmed, muted
7457
+ * surface, `not-allowed` cursor, a dashed outline on a bordered card). Projected row-end actions (`list-item-action`) are NOT disabled by this
7458
+ * input; disable them yourself. Default `false` = unchanged.
7459
+ */
7460
+ readonly disabled: import("@angular/core").InputSignal<boolean>;
7461
+ /**
7462
+ * Library source 2026-11-04, not yet published. `true` = the row is working on a request: `aria-busy="true"`, a small spinner (decorative)
7463
+ * at the row end, and presses (click, Enter, Space, radio / checkbox change) are ignored: `select` never emits and a radio / checkbox keeps
7464
+ * its state (the click is cancelled, so a sibling radio of the same `name` stays checked too; arrow keys on a busy radio are blocked).
7465
+ * The row stays focusable. Default `false` = unchanged.
7466
+ */
7467
+ readonly busy: import("@angular/core").InputSignal<boolean>;
7151
7468
  get _borderedClass(): boolean;
7469
+ get _disabledClass(): boolean;
7152
7470
  /** Primary label. */
7153
7471
  readonly title: import("@angular/core").InputSignal<string>;
7154
7472
  /** Badge shown next to the title — only visible when the item is checked, unless `alwaysShowBadge` is set. */
@@ -7169,6 +7487,21 @@ export declare class ListItemComponent {
7169
7487
  readonly select: import("@angular/core").OutputEmitterRef<void>;
7170
7488
  /** A plain interactive row (no radio/checkbox) is itself clickable: click, Enter or Space emit `select`. */
7171
7489
  protected readonly pressable: () => boolean;
7490
+ /**
7491
+ * True while the leading image slot (`<img list-item-image>` / any element with the `list-item-image` attribute) holds content.
7492
+ * The slot is projected, so this is read from the DOM after every content check; the icon tile is not rendered while it is true.
7493
+ */
7494
+ protected readonly hasImage: import("@angular/core").WritableSignal<boolean>;
7495
+ ngAfterContentChecked(): void;
7496
+ /**
7497
+ * Radio / checkbox click while busy or disabled: cancelled, so the browser restores the checkedness of the clicked input AND of the other radios of
7498
+ * the same `name` group (clicking or arrowing onto this radio would otherwise uncheck the sibling that the model still holds as checked).
7499
+ */
7500
+ protected onInputClick(e: Event): void;
7501
+ /** Arrow keys on a busy / disabled radio would move the selection to a sibling of the group: blocked. (Arriving at it from a sibling is stopped by `onInputClick`.) */
7502
+ protected onInputKey(e: KeyboardEvent): void;
7503
+ /** Radio / checkbox change: never while disabled (the input is disabled anyway); ignored while busy. Safety net after `onInputClick`: the input is put back to `checked`. */
7504
+ protected onInputChange(e: Event): void;
7172
7505
  protected onRowClick(e: Event): void;
7173
7506
  protected onRowKey(e: Event): void;
7174
7507
  protected readonly visibleDetails: () => {
@@ -7223,6 +7556,16 @@ export declare class ListItemComponent {
7223
7556
  "required": false;
7224
7557
  "isSignal": true;
7225
7558
  };
7559
+ "disabled": {
7560
+ "alias": "disabled";
7561
+ "required": false;
7562
+ "isSignal": true;
7563
+ };
7564
+ "busy": {
7565
+ "alias": "busy";
7566
+ "required": false;
7567
+ "isSignal": true;
7568
+ };
7226
7569
  "title": {
7227
7570
  "alias": "title";
7228
7571
  "required": false;
@@ -7255,7 +7598,7 @@ export declare class ListItemComponent {
7255
7598
  };
7256
7599
  }, {
7257
7600
  "select": "select";
7258
- }, never, ["[list-item-action], [li-action]"], true, never>;
7601
+ }, never, ["[list-item-image]", "[list-item-action], [li-action]"], true, never>;
7259
7602
  }
7260
7603
  /** Colour of the priority dot (`high` red, `medium` amber, `low` grey, `blue`, `green`); `none` = no dot. */
7261
7604
  export type CardListIndicator = 'high' | 'medium' | 'low' | 'blue' | 'green' | 'none';
@@ -7650,6 +7993,12 @@ export declare class ListComponent<T = unknown> {
7650
7993
  readonly items: import("@angular/core").InputSignal<readonly T[]>;
7651
7994
  /** `false` (default) renders a `<ul>`; `true` renders an `<ol>` with native numbering (no numbers in the grid layout). */
7652
7995
  readonly ordered: import("@angular/core").InputSignal<boolean>;
7996
+ /**
7997
+ * Library source 2026-11-04, not yet published. `true` = the `<ul>` shows a visible bullet (disc) before every row, for plain text lines such as a
7998
+ * "what will happen" list: `<ui-list [items]="lines" [bulleted]="true" ariaLabel="What will happen" />` (string items render as their text, no template needed).
7999
+ * Still a real `<ul>` with `<li>` rows. Ignored with `[ordered]="true"` (which already has numbers) and in the grid layout. Default `false` = no markers, as before.
8000
+ */
8001
+ readonly bulleted: import("@angular/core").InputSignal<boolean>;
7653
8002
  /** 'list' = one column; 'grid' = wrapping columns of at least `gridMin` px (still a real `<ul>`). */
7654
8003
  readonly layout: import("@angular/core").InputSignal<"list" | "grid">;
7655
8004
  /** Minimum column width in px of the grid layout. */
@@ -7756,6 +8105,11 @@ export declare class ListComponent<T = unknown> {
7756
8105
  "required": false;
7757
8106
  "isSignal": true;
7758
8107
  };
8108
+ "bulleted": {
8109
+ "alias": "bulleted";
8110
+ "required": false;
8111
+ "isSignal": true;
8112
+ };
7759
8113
  "layout": {
7760
8114
  "alias": "layout";
7761
8115
  "required": false;
@@ -8585,10 +8939,15 @@ export declare class AlertComponent {
8585
8939
  "dismissed": "dismissed";
8586
8940
  }, never, ["*"], true, never>;
8587
8941
  }
8942
+ /**
8943
+ * Every key `<ui-icon>` draws by itself (the data-table action keys such as `view` / `edit` / `call` are accepted too, see `builtInActionIcon`).
8944
+ * Each resolves with `iconPath(key)`. Includes `search`, `cup` (food / drink) and `wrench` (rental / tools), library source 2026-11-04, not yet published.
8945
+ */
8946
+ export declare const ICON_NAMES: readonly string[];
8588
8947
  /** The SVG path (24×24 stroke icon) for an icon key, or undefined when the key is unknown. */
8589
8948
  export declare function iconPath(name: string): string | undefined;
8590
8949
  /** Keys with an icon of their own (the data-table action keys are accepted too — see `builtInActionIcon`). */
8591
- export type IconName = 'add' | 'close' | 'check' | 'upload' | 'image' | 'chevron-up' | 'chevron-down' | 'arrow-left' | 'bell' | 'print' | 'lock' | 'shield' | 'arrow-up' | 'arrow-down' | 'arrow-right' | 'document' | 'grip' | 'card' | 'bank' | 'view' | 'view-off' | 'edit' | 'delete' | 'download' | 'duplicate' | 'archive' | 'restore' | 'share' | 'email' | 'message' | 'call' | 'refund' | 'chevron-right' | 'link' | 'save' | 'chart' | 'clipboard' | 'unlink' | 'send' | 'refresh';
8950
+ export type IconName = 'add' | 'close' | 'check' | 'upload' | 'image' | 'chevron-up' | 'chevron-down' | 'arrow-left' | 'bell' | 'print' | 'lock' | 'shield' | 'arrow-up' | 'arrow-down' | 'arrow-right' | 'document' | 'grip' | 'card' | 'bank' | 'view' | 'view-off' | 'edit' | 'delete' | 'download' | 'duplicate' | 'archive' | 'restore' | 'share' | 'email' | 'message' | 'call' | 'refund' | 'chevron-right' | 'link' | 'save' | 'chart' | 'clipboard' | 'unlink' | 'send' | 'refresh' | 'search' | 'cup' | 'wrench' | 'history' | 'move-up' | 'move-down';
8592
8951
  /**
8593
8952
  * A clickable icon. The host passes a key (`name="delete"`) and the library draws that icon; clicking it emits
8594
8953
  * `iconClick`, and the host does the actual work (delete the row, open a panel, …).
@@ -8615,7 +8974,7 @@ export declare class IconComponent {
8615
8974
  readonly ariaLabel: import("@angular/core").InputSignal<string>;
8616
8975
  /** Icon size in px. */
8617
8976
  readonly size: import("@angular/core").InputSignal<number>;
8618
- readonly variant: import("@angular/core").InputSignal<"default" | "danger">;
8977
+ readonly variant: import("@angular/core").InputSignal<"danger" | "default">;
8619
8978
  readonly disabled: import("@angular/core").InputSignal<boolean>;
8620
8979
  /** The host is running the request this icon started: a spinner replaces the picture and the button is disabled (no click) until it is false again. */
8621
8980
  readonly loading: import("@angular/core").InputSignal<boolean>;
@@ -8926,7 +9285,7 @@ export declare class AddressInputComponent implements ControlValueAccessor, Vali
8926
9285
  * the object. `valueChange` always emits the object. A written string is read with `parseAddressValue` for display only: the control keeps
8927
9286
  * the original text until the user edits a field (so a text the parser cannot split is not rewritten on load).
8928
9287
  */
8929
- readonly valueFormat: import("@angular/core").InputSignal<"object" | "text" | "auto">;
9288
+ readonly valueFormat: import("@angular/core").InputSignal<"object" | "auto" | "text">;
8930
9289
  /** ZIP rule; the default is the US 5 digits / 5+4 rule. `null` accepts any non-empty ZIP. The ZIP is validated and stored trimmed. */
8931
9290
  readonly zipPattern: import("@angular/core").InputSignal<RegExp | null>;
8932
9291
  /** Message shown when the ZIP breaks `zipPattern`. */
@@ -9250,6 +9609,14 @@ export type ImageAlign = 'start' | 'center' | 'end';
9250
9609
  * - `placeholder` (default true): a neutral icon in the same box when there is no `src` or it fails to load. false renders nothing then.
9251
9610
  * - `priority`: above-the-fold image - loads eagerly with high fetch priority. Otherwise `loading="lazy"` and async decoding.
9252
9611
  * - Outputs `loaded` and `failed`. A new `src` (or a changed `retryKey`) gets a fresh chance to load.
9612
+ * - Library source 2026-11-04, not yet published: `[interactive]="true"` makes the image a button (e.g. a product photo that opens a preview):
9613
+ * the host gets `role="button"`, `tabindex="0"`, a focus ring, and click, Enter or Space emit `(activate)`. Its accessible name is the `alt`
9614
+ * text (also set as `aria-label`), so an interactive image NEEDS a non-empty `alt` (a decorative `alt=""` image would be an unnamed button). Not
9615
+ * interactive (default) = no role, no tabindex, no key handling, no output: exactly as before.
9616
+ * Inside a clickable parent (e.g. a pressable `ui-list-item` row via the `list-item-image` slot) the click bubbles: `activate` fires AND the parent's
9617
+ * own click handling runs (the row is selected). Enter / Space fire `activate` only; the parent's key handlers that require their own element as the
9618
+ * target (`ui-list-item`) ignore them.
9619
+ * <ui-image [src]="p.photo" [alt]="'Open photo of ' + p.name" [interactive]="true" (activate)="preview(p)" />
9253
9620
  */
9254
9621
  export declare class ImageComponent {
9255
9622
  /** Image URL (or data URL). Blank shows the placeholder. */
@@ -9276,8 +9643,15 @@ export declare class ImageComponent {
9276
9643
  readonly priority: import("@angular/core").InputSignal<boolean>;
9277
9644
  /** Bump to retry a failed image with the same `src`. */
9278
9645
  readonly retryKey: import("@angular/core").InputSignal<unknown>;
9646
+ /**
9647
+ * Library source 2026-11-04, not yet published. `true` = the image is a button: `role="button"`, `tabindex="0"`, `aria-label` from `alt`, and click /
9648
+ * Enter / Space emit `activate`. Needs a non-empty `alt` (it is the button's name). Default `false` = a plain image, nothing changes.
9649
+ */
9650
+ readonly interactive: import("@angular/core").InputSignal<boolean>;
9279
9651
  readonly loaded: import("@angular/core").OutputEmitterRef<void>;
9280
9652
  readonly failed: import("@angular/core").OutputEmitterRef<void>;
9653
+ /** Fires (once per press) when an `interactive` image is clicked, or Enter / Space is pressed on it. Never fires when not interactive. */
9654
+ readonly activate: import("@angular/core").OutputEmitterRef<void>;
9281
9655
  protected readonly _failed: import("@angular/core").WritableSignal<boolean>;
9282
9656
  protected readonly _url: import("@angular/core").Signal<string | null>;
9283
9657
  protected readonly radiusCss: import("@angular/core").Signal<string>;
@@ -9289,6 +9663,8 @@ export declare class ImageComponent {
9289
9663
  protected readonly isBlock: import("@angular/core").Signal<boolean>;
9290
9664
  constructor();
9291
9665
  protected _onError(): void;
9666
+ protected onActivate(): void;
9667
+ protected onKey(event: Event): void;
9292
9668
  static ɵfac: i0.ɵɵFactoryDeclaration<ImageComponent, never>;
9293
9669
  static ɵcmp: i0.ɵɵComponentDeclaration<ImageComponent, "ui-image", never, {
9294
9670
  "src": {
@@ -9366,9 +9742,15 @@ export declare class ImageComponent {
9366
9742
  "required": false;
9367
9743
  "isSignal": true;
9368
9744
  };
9745
+ "interactive": {
9746
+ "alias": "interactive";
9747
+ "required": false;
9748
+ "isSignal": true;
9749
+ };
9369
9750
  }, {
9370
9751
  "loaded": "loaded";
9371
9752
  "failed": "failed";
9753
+ "activate": "activate";
9372
9754
  }, never, never, true, never>;
9373
9755
  }
9374
9756
  /** One picture of a `ui-image-gallery`. */
@@ -9587,6 +9969,17 @@ export declare class KpiCardComponent {
9587
9969
  readonly highlight: import("@angular/core").InputSignal<boolean>;
9588
9970
  readonly clickable: import("@angular/core").InputSignal<boolean>;
9589
9971
  readonly valueColor: import("@angular/core").InputSignal<KpiCardValueColor>;
9972
+ /**
9973
+ * (library source 2026-11-04, not yet published) While true the value (and the subtitle, when one is set) are replaced by grey
9974
+ * placeholders and the card is `aria-busy="true"`; assistive tech reads the label followed by the `loadingLabel` text
9975
+ * (visually hidden), never the stale value or subtitle. The card keeps its size: the value placeholder has the value line's box and the
9976
+ * subtitle placeholder is the subtitle's own (transparent) text, so pass the subtitle you will show while loading to keep the height
9977
+ * identical. The progress ring (when there is one) stays visible but is hidden from assistive tech (`aria-hidden="true"` on it) while loading, since its
9978
+ * value belongs to the data that is being replaced. Default false = unchanged. Everything else (icon, ring, `kpi-footer` slot, `clickable`, colours) is unaffected.
9979
+ */
9980
+ readonly loading: import("@angular/core").InputSignal<boolean>;
9981
+ /** What assistive tech hears instead of the value while `loading` (default 'Loading'). */
9982
+ readonly loadingLabel: import("@angular/core").InputSignal<string>;
9590
9983
  /** Card background as any CSS colour (`#fef2f2`, `var(--surface)` …). Empty (default) = white. The text colours do not change, so use a light shade. */
9591
9984
  readonly background: import("@angular/core").InputSignal<string>;
9592
9985
  /** Completed amount shown as a `ui-progress-ring` beside the label. `null` (default) = no ring. */
@@ -9648,6 +10041,16 @@ export declare class KpiCardComponent {
9648
10041
  "required": false;
9649
10042
  "isSignal": true;
9650
10043
  };
10044
+ "loading": {
10045
+ "alias": "loading";
10046
+ "required": false;
10047
+ "isSignal": true;
10048
+ };
10049
+ "loadingLabel": {
10050
+ "alias": "loadingLabel";
10051
+ "required": false;
10052
+ "isSignal": true;
10053
+ };
9651
10054
  "background": {
9652
10055
  "alias": "background";
9653
10056
  "required": false;
@@ -9805,7 +10208,7 @@ export declare class RichTextEditorComponent implements ControlValueAccessor {
9805
10208
  readonly maxHeight: import("@angular/core").InputSignal<number>;
9806
10209
  /** Toolbar controls to remove. Everything is shown by default. */
9807
10210
  readonly hide: import("@angular/core").InputSignal<RichTextOption[]>;
9808
- protected readonly _disabledInput: import("@angular/core").InputSignal<boolean>;
10211
+ readonly _disabledInput: import("@angular/core").InputSignal<boolean>;
9809
10212
  private readonly _cvaDisabled;
9810
10213
  protected readonly disabled: import("@angular/core").Signal<boolean>;
9811
10214
  /** Disabled or read-only: the editor is not editable and every toolbar control is disabled. */
@@ -9959,6 +10362,12 @@ export declare function humanReadableMessage(value: unknown): string | null;
9959
10362
  export declare class RadioComponent {
9960
10363
  readonly label: import("@angular/core").InputSignal<string>;
9961
10364
  readonly description: import("@angular/core").InputSignal<string>;
10365
+ /**
10366
+ * Library source 2026-11-04, not yet published. Optional icon drawn in front of the label: a `<ui-icon>` key (`cup`, `wrench`, `card`, ...) or a raw 24x24
10367
+ * stroke SVG path (`M12 5v14 M5 12h14`). Decorative (`aria-hidden`), so the accessible name stays the label. Empty (default), an unknown key or
10368
+ * text that is not a path = nothing is drawn and the DOM is unchanged.
10369
+ */
10370
+ readonly icon: import("@angular/core").InputSignal<string>;
9962
10371
  /** Accessible name when there is no visible `label`. */
9963
10372
  readonly ariaLabel: import("@angular/core").InputSignal<string>;
9964
10373
  /** `data-testid` of the native radio input; none when empty. */
@@ -9975,6 +10384,8 @@ export declare class RadioComponent {
9975
10384
  /** Public so a host template can bind `[disabled]` (a protected input fails strict template type-checking). */
9976
10385
  readonly _disabledInput: import("@angular/core").InputSignal<boolean>;
9977
10386
  protected readonly disabled: import("@angular/core").InputSignal<boolean>;
10387
+ /** Path of the icon: a known icon key, else the text itself when it looks like an SVG path (drawing commands and numbers only), else none. */
10388
+ protected readonly _iconD: import("@angular/core").Signal<string | null>;
9978
10389
  /** Id of the visible label text. Optional: a host (e.g. `ui-radio-group`) can set it to point another element at the label with `aria-labelledby`; a unique id is generated when empty. */
9979
10390
  readonly labelId: import("@angular/core").InputSignal<string>;
9980
10391
  private readonly _generatedLabelId;
@@ -9999,6 +10410,11 @@ export declare class RadioComponent {
9999
10410
  "required": false;
10000
10411
  "isSignal": true;
10001
10412
  };
10413
+ "icon": {
10414
+ "alias": "icon";
10415
+ "required": false;
10416
+ "isSignal": true;
10417
+ };
10002
10418
  "ariaLabel": {
10003
10419
  "alias": "ariaLabel";
10004
10420
  "required": false;
@@ -10053,6 +10469,240 @@ export declare class RadioComponent {
10053
10469
  "selected": "selected";
10054
10470
  }, never, ["*"], true, never>;
10055
10471
  }
10472
+ export interface SwatchOption {
10473
+ value: string;
10474
+ /** Accessible name and tooltip of the swatch (e.g. "Ocean blue"). */
10475
+ label: string;
10476
+ /** Any CSS colour (`#2563eb`, `rgb(...)`, `var(--x)`). */
10477
+ color: string;
10478
+ disabled?: boolean;
10479
+ /** `data-testid` of this option's native radio input; none when omitted. */
10480
+ testId?: string;
10481
+ }
10482
+ /**
10483
+ * (library source 2026-11-05, not yet published) Colour swatch picker: a `<fieldset role="radiogroup">` of native radio inputs
10484
+ * (arrow keys move + select natively, Home / End jump to the first / last enabled swatch), ControlValueAccessor with a string value
10485
+ * (`''` = nothing selected). The selected swatch shows a check mark and a ring (never colour alone); every swatch is named by its `label`
10486
+ * (accessible name + `title` tooltip). Built-in validation like `ui-radio-group`: `required` -> "<label> is required."; a value that is not one
10487
+ * of the `options` -> "Select a valid option." (not checked while `options` is empty); a disabled picker is never invalid.
10488
+ * `disabled` combines with the forms API (`setDisabledState`). 44px touch targets on touch devices and phones; the swatches wrap.
10489
+ */
10490
+ export declare class SwatchPickerComponent implements ControlValueAccessor, Validator, UiFieldValidity {
10491
+ private readonly _el;
10492
+ readonly label: import("@angular/core").InputSignal<string>;
10493
+ readonly options: import("@angular/core").InputSignal<SwatchOption[]>;
10494
+ readonly required: import("@angular/core").InputSignal<boolean>;
10495
+ readonly hint: import("@angular/core").InputSignal<string>;
10496
+ readonly error: import("@angular/core").InputSignal<string>;
10497
+ /** Reveal the built-in error messages now (e.g. after a failed Save click), without waiting for blur. */
10498
+ readonly showErrors: import("@angular/core").InputSignal<boolean>;
10499
+ /** Fixed number of swatches per row (0 = wrap freely, the default). On a phone the row wraps by width instead. */
10500
+ readonly columns: import("@angular/core").InputSignal<number>;
10501
+ /** Native `name` shared by the radios; a unique one is generated when omitted. */
10502
+ readonly name: import("@angular/core").InputSignal<string>;
10503
+ readonly _disabledInput: import("@angular/core").InputSignal<boolean>;
10504
+ private readonly _cvaDisabled;
10505
+ protected readonly disabled: import("@angular/core").Signal<boolean>;
10506
+ private readonly _generatedName;
10507
+ protected get _name(): string;
10508
+ protected readonly _descId: string;
10509
+ protected readonly _value: import("@angular/core").WritableSignal<string>;
10510
+ private readonly _reveal;
10511
+ private readonly _issue;
10512
+ readonly invalid: import("@angular/core").Signal<boolean>;
10513
+ readonly errorMessage: import("@angular/core").Signal<string>;
10514
+ readonly invalidChange: import("@angular/core").OutputEmitterRef<boolean>;
10515
+ /** Emits the chosen value on a user pick. */
10516
+ readonly valueChange: import("@angular/core").OutputEmitterRef<string>;
10517
+ protected readonly _activeError: import("@angular/core").Signal<string>;
10518
+ private _onValidatorChange;
10519
+ constructor();
10520
+ ngOnChanges(): void;
10521
+ validate(control: AbstractControl): ValidationErrors | null;
10522
+ registerOnValidatorChange(fn: () => void): void;
10523
+ private _onChange;
10524
+ private _onTouched;
10525
+ writeValue(val: string): void;
10526
+ registerOnChange(fn: (v: string) => void): void;
10527
+ registerOnTouched(fn: () => void): void;
10528
+ setDisabledState(d: boolean): void;
10529
+ protected onSelect(value: string): void;
10530
+ /** Home / End select the first / last enabled swatch (arrow keys are native radio behaviour). */
10531
+ protected onKeydown(e: KeyboardEvent): void;
10532
+ /** Touched once focus leaves the whole group. */
10533
+ protected onFocusOut(event: FocusEvent): void;
10534
+ private _check;
10535
+ static ɵfac: i0.ɵɵFactoryDeclaration<SwatchPickerComponent, never>;
10536
+ static ɵcmp: i0.ɵɵComponentDeclaration<SwatchPickerComponent, "ui-swatch-picker", never, {
10537
+ "label": {
10538
+ "alias": "label";
10539
+ "required": false;
10540
+ "isSignal": true;
10541
+ };
10542
+ "options": {
10543
+ "alias": "options";
10544
+ "required": false;
10545
+ "isSignal": true;
10546
+ };
10547
+ "required": {
10548
+ "alias": "required";
10549
+ "required": false;
10550
+ "isSignal": true;
10551
+ };
10552
+ "hint": {
10553
+ "alias": "hint";
10554
+ "required": false;
10555
+ "isSignal": true;
10556
+ };
10557
+ "error": {
10558
+ "alias": "error";
10559
+ "required": false;
10560
+ "isSignal": true;
10561
+ };
10562
+ "showErrors": {
10563
+ "alias": "showErrors";
10564
+ "required": false;
10565
+ "isSignal": true;
10566
+ };
10567
+ "columns": {
10568
+ "alias": "columns";
10569
+ "required": false;
10570
+ "isSignal": true;
10571
+ };
10572
+ "name": {
10573
+ "alias": "name";
10574
+ "required": false;
10575
+ "isSignal": true;
10576
+ };
10577
+ "_disabledInput": {
10578
+ "alias": "disabled";
10579
+ "required": false;
10580
+ "isSignal": true;
10581
+ };
10582
+ }, {
10583
+ "invalidChange": "invalidChange";
10584
+ "valueChange": "valueChange";
10585
+ }, never, never, true, never>;
10586
+ }
10587
+ export interface IconPickerOption {
10588
+ value: string;
10589
+ /** Accessible name and tooltip of the icon (e.g. "Wrench"). */
10590
+ label: string;
10591
+ /** Key of a library icon (`<ui-icon>` / action key such as `wrench`, `history`). Defaults to `value` when neither `iconKey` nor `path` is given. */
10592
+ iconKey?: string;
10593
+ /** Raw SVG path (`d` value, 24x24 stroke icon); wins over `iconKey`. */
10594
+ path?: string;
10595
+ disabled?: boolean;
10596
+ /** `data-testid` of this option's native radio input; none when omitted. */
10597
+ testId?: string;
10598
+ }
10599
+ /**
10600
+ * (library source 2026-11-05, not yet published) Icon picker: a `<fieldset role="radiogroup">` of native radio inputs
10601
+ * (arrow keys move + select natively, Home / End jump to the first / last enabled icon), ControlValueAccessor with a string value
10602
+ * (`''` = nothing selected). The selected icon is inverted and shows a check mark (never colour alone); every icon is named by its `label`
10603
+ * (accessible name + `title` tooltip). Built-in validation like `ui-radio-group`: `required` -> "<label> is required."; a value that is not one
10604
+ * of the `options` -> "Select a valid option." (not checked while `options` is empty); a disabled picker is never invalid.
10605
+ * `disabled` combines with the forms API (`setDisabledState`). 44px touch targets on touch devices and phones; the icons wrap.
10606
+ */
10607
+ export declare class IconPickerComponent implements ControlValueAccessor, Validator, UiFieldValidity {
10608
+ private readonly _el;
10609
+ readonly label: import("@angular/core").InputSignal<string>;
10610
+ readonly options: import("@angular/core").InputSignal<IconPickerOption[]>;
10611
+ readonly required: import("@angular/core").InputSignal<boolean>;
10612
+ readonly hint: import("@angular/core").InputSignal<string>;
10613
+ readonly error: import("@angular/core").InputSignal<string>;
10614
+ /** Reveal the built-in error messages now (e.g. after a failed Save click), without waiting for blur. */
10615
+ readonly showErrors: import("@angular/core").InputSignal<boolean>;
10616
+ /** SVG path drawn for an option: its `path`, else the library icon `iconKey` (default: the option's `value`); '' when unknown. */
10617
+ protected _path(o: IconPickerOption): string;
10618
+ /** Fixed number of icons per row (0 = wrap freely, the default). On a phone the row wraps by width instead. */
10619
+ readonly columns: import("@angular/core").InputSignal<number>;
10620
+ /** Native `name` shared by the radios; a unique one is generated when omitted. */
10621
+ readonly name: import("@angular/core").InputSignal<string>;
10622
+ readonly _disabledInput: import("@angular/core").InputSignal<boolean>;
10623
+ private readonly _cvaDisabled;
10624
+ protected readonly disabled: import("@angular/core").Signal<boolean>;
10625
+ private readonly _generatedName;
10626
+ protected get _name(): string;
10627
+ protected readonly _descId: string;
10628
+ protected readonly _value: import("@angular/core").WritableSignal<string>;
10629
+ private readonly _reveal;
10630
+ private readonly _issue;
10631
+ readonly invalid: import("@angular/core").Signal<boolean>;
10632
+ readonly errorMessage: import("@angular/core").Signal<string>;
10633
+ readonly invalidChange: import("@angular/core").OutputEmitterRef<boolean>;
10634
+ /** Emits the chosen value on a user pick. */
10635
+ readonly valueChange: import("@angular/core").OutputEmitterRef<string>;
10636
+ protected readonly _activeError: import("@angular/core").Signal<string>;
10637
+ private _onValidatorChange;
10638
+ constructor();
10639
+ ngOnChanges(): void;
10640
+ validate(control: AbstractControl): ValidationErrors | null;
10641
+ registerOnValidatorChange(fn: () => void): void;
10642
+ private _onChange;
10643
+ private _onTouched;
10644
+ writeValue(val: string): void;
10645
+ registerOnChange(fn: (v: string) => void): void;
10646
+ registerOnTouched(fn: () => void): void;
10647
+ setDisabledState(d: boolean): void;
10648
+ protected onSelect(value: string): void;
10649
+ /** Home / End select the first / last enabled icon (arrow keys are native radio behaviour). */
10650
+ protected onKeydown(e: KeyboardEvent): void;
10651
+ /** Touched once focus leaves the whole group. */
10652
+ protected onFocusOut(event: FocusEvent): void;
10653
+ private _check;
10654
+ static ɵfac: i0.ɵɵFactoryDeclaration<IconPickerComponent, never>;
10655
+ static ɵcmp: i0.ɵɵComponentDeclaration<IconPickerComponent, "ui-icon-picker", never, {
10656
+ "label": {
10657
+ "alias": "label";
10658
+ "required": false;
10659
+ "isSignal": true;
10660
+ };
10661
+ "options": {
10662
+ "alias": "options";
10663
+ "required": false;
10664
+ "isSignal": true;
10665
+ };
10666
+ "required": {
10667
+ "alias": "required";
10668
+ "required": false;
10669
+ "isSignal": true;
10670
+ };
10671
+ "hint": {
10672
+ "alias": "hint";
10673
+ "required": false;
10674
+ "isSignal": true;
10675
+ };
10676
+ "error": {
10677
+ "alias": "error";
10678
+ "required": false;
10679
+ "isSignal": true;
10680
+ };
10681
+ "showErrors": {
10682
+ "alias": "showErrors";
10683
+ "required": false;
10684
+ "isSignal": true;
10685
+ };
10686
+ "columns": {
10687
+ "alias": "columns";
10688
+ "required": false;
10689
+ "isSignal": true;
10690
+ };
10691
+ "name": {
10692
+ "alias": "name";
10693
+ "required": false;
10694
+ "isSignal": true;
10695
+ };
10696
+ "_disabledInput": {
10697
+ "alias": "disabled";
10698
+ "required": false;
10699
+ "isSignal": true;
10700
+ };
10701
+ }, {
10702
+ "invalidChange": "invalidChange";
10703
+ "valueChange": "valueChange";
10704
+ }, never, never, true, never>;
10705
+ }
10056
10706
  /**
10057
10707
  * Content shown directly under ONE option of a `ui-radio-group`, only while that option is selected (e.g. an address form under
10058
10708
  * "Ship to an alternate address"). Put an `<ng-template>` inside the group and name the option's value:
@@ -10115,7 +10765,7 @@ export declare class RadioMatrixComponent implements ControlValueAccessor, Valid
10115
10765
  readonly showErrors: import("@angular/core").InputSignal<boolean>;
10116
10766
  /** Prefix of the native radio `name`s (one name per row); a unique one is generated when omitted. */
10117
10767
  readonly name: import("@angular/core").InputSignal<string>;
10118
- protected readonly _disabledInput: import("@angular/core").InputSignal<boolean>;
10768
+ readonly _disabledInput: import("@angular/core").InputSignal<boolean>;
10119
10769
  private readonly _cvaDisabled;
10120
10770
  protected readonly disabled: import("@angular/core").Signal<boolean>;
10121
10771
  private readonly _generatedName;
@@ -10417,7 +11067,7 @@ export declare class PdfHotspotComponent {
10417
11067
  /** `ready`: clickable; `blocked`: disabled (a prerequisite is missing); `signed`: shows `image`. */
10418
11068
  readonly state: import("@angular/core").InputSignal<"ready" | "blocked" | "signed">;
10419
11069
  /** `warning` gives the ready state an amber look (e.g. for initials), default is blue. */
10420
- readonly tone: import("@angular/core").InputSignal<"warning" | "primary">;
11070
+ readonly tone: import("@angular/core").InputSignal<"primary" | "warning">;
10421
11071
  /** Text of the ready button (e.g. "Sign Here"). */
10422
11072
  readonly label: import("@angular/core").InputSignal<string>;
10423
11073
  /** Text of the blocked button (e.g. "Add signature above"). */
@@ -10520,6 +11170,9 @@ export declare class PdfHotspotComponent {
10520
11170
  * - `textColor`: the colour of the title, subtitle, chevron and body text (any CSS colour; default: the normal slate colours). Use it for light text on a dark `background`. Text you colour yourself inside the body keeps its own colour.
10521
11171
  * - `<ng-container card-footer>` / `<div card-footer>`: a footer bar under the body (a pager, totals, a link). Hidden while empty or collapsed, 10px 18px padding,
10522
11172
  * a light top line; `footerBackground` colours it (pair it with `headerBackground` to frame the card). In a `fill` card it is pinned to the bottom edge.
11173
+ * - `footerAlign="end"` (library source 2026-11-04, not yet published): turns the `[card-footer]` bar into a right-aligned action row (flex, `justify-content: flex-end`,
11174
+ * 8px gap, wraps on a narrow card) for one or several buttons under the body, e.g. `<ui-button card-footer variant="secondary" size="sm">Open Resident</ui-button>`.
11175
+ * Default `'start'` = the footer is unchanged (block content, left-aligned). Hidden while empty or collapsed in both modes.
10523
11176
  * - The body has built-in padding (16px 18px, matching the header's 18px side padding); there is no padding input.
10524
11177
  * - `collapsible` (default true): a chevron toggle and a clickable header; `[(expanded)]` is two-way.
10525
11178
  * Without a header, or with `collapsible` false, the body is always open.
@@ -10551,7 +11204,7 @@ export declare class DetailCardComponent {
10551
11204
  /** true (default) = the title is displayed in capitals (CSS only); false = shown as written. The text, aria-label and heading name are never changed. */
10552
11205
  readonly uppercaseTitle: import("@angular/core").InputSignal<boolean>;
10553
11206
  /** 1-6 makes the title a real heading for screen readers (role=heading, aria-level); null keeps it plain text. */
10554
- readonly headingLevel: import("@angular/core").InputSignal<1 | 2 | 3 | 4 | 5 | 6 | null>;
11207
+ readonly headingLevel: import("@angular/core").InputSignal<1 | 4 | 2 | 3 | 5 | 6 | null>;
10555
11208
  /** Optional id for the title text; the card is then labelled by it. Without it the title is the card's aria-label. */
10556
11209
  readonly titleId: import("@angular/core").InputSignal<string>;
10557
11210
  /** Accessible name of the card when the header gives none (no header, or no title). A visible title wins; blank = no name. */
@@ -10564,6 +11217,8 @@ export declare class DetailCardComponent {
10564
11217
  readonly headerBackground: import("@angular/core").InputSignal<string>;
10565
11218
  /** Background colour of the footer bar (the `[card-footer]` slot) as any CSS colour. Empty = no colour of its own. */
10566
11219
  readonly footerBackground: import("@angular/core").InputSignal<string>;
11220
+ /** Alignment of the `[card-footer]` content: `'start'` (default, unchanged) or `'end'` = a right-aligned action row with an 8px gap. */
11221
+ readonly footerAlign: import("@angular/core").InputSignal<"start" | "end">;
10567
11222
  /** Text colour as any CSS colour (`#fff`, `var(--on-dark)` …). Empty = the default colours. Colours the title, subtitle, chevron and body text. */
10568
11223
  readonly textColor: import("@angular/core").InputSignal<string>;
10569
11224
  /** false = no header at all (no title, edit button, toggle or divider): the card is only the body, always open. */
@@ -10650,6 +11305,11 @@ export declare class DetailCardComponent {
10650
11305
  "required": false;
10651
11306
  "isSignal": true;
10652
11307
  };
11308
+ "footerAlign": {
11309
+ "alias": "footerAlign";
11310
+ "required": false;
11311
+ "isSignal": true;
11312
+ };
10653
11313
  "textColor": {
10654
11314
  "alias": "textColor";
10655
11315
  "required": false;
@@ -11187,7 +11847,7 @@ export declare class ColorInputComponent implements ControlValueAccessor, Valida
11187
11847
  readonly presets: import("@angular/core").InputSignal<ColorPreset[]>;
11188
11848
  /** Emits whenever the field becomes invalid / valid. */
11189
11849
  readonly invalidChange: import("@angular/core").OutputEmitterRef<boolean>;
11190
- protected readonly _disabledInput: import("@angular/core").InputSignal<boolean>;
11850
+ readonly _disabledInput: import("@angular/core").InputSignal<boolean>;
11191
11851
  private readonly _cvaDisabled;
11192
11852
  protected readonly disabled: import("@angular/core").Signal<boolean>;
11193
11853
  /** Current model value (what the form control holds). */