@forgeroute/ui 0.4.73 → 0.4.75

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.
@@ -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; colorName?: string }[]. `colorName` is the colour (or state) in words, e.g. 'red' or 'error': it is read by screen readers after the tag name (hidden visually) so the colour is never the only signal; omit it and nothing changes. `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
  /**
@@ -1153,7 +1170,7 @@ export declare class SelectComponent implements ControlValueAccessor, Validator,
1153
1170
  readonly error: import("@angular/core").InputSignal<string>;
1154
1171
  /** Reveal the built-in error messages now (e.g. after a failed Save click), without waiting for blur. */
1155
1172
  readonly showErrors: import("@angular/core").InputSignal<boolean>;
1156
- readonly size: import("@angular/core").InputSignal<"sm" | "default">;
1173
+ readonly size: import("@angular/core").InputSignal<"default" | "sm">;
1157
1174
  readonly _disabledInput: import("@angular/core").InputSignal<boolean>;
1158
1175
  private readonly _cvaDisabled;
1159
1176
  protected readonly disabled: import("@angular/core").Signal<boolean>;
@@ -1286,6 +1303,11 @@ export interface ImportFieldDef {
1286
1303
  key: string;
1287
1304
  label: string;
1288
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;
1289
1311
  }
1290
1312
  export interface ImportSource {
1291
1313
  value: string;
@@ -1406,6 +1428,10 @@ export declare class ImportExportComponent {
1406
1428
  private csvFile;
1407
1429
  private readCsvFile;
1408
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;
1409
1435
  get canSubmit(): boolean;
1410
1436
  get unmappedRequiredFields(): string[];
1411
1437
  get unmatchedCsvHeaders(): string[];
@@ -1620,7 +1646,6 @@ export declare class DataTableComponent<T extends Record<string, any>> implement
1620
1646
  * own panel for `rows` and, when it has finished, calls `clearSelection()` and `refresh()` on the table.
1621
1647
  */
1622
1648
  readonly bulkPanelClick: import("@angular/core").OutputEmitterRef<BulkPanelEvent<T>>;
1623
- /** Emitted after a built-in single-row delete completes successfully. */
1624
1649
  /**
1625
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
1626
1651
  * arrived (`total` = all matching rows), `{ ok: false, total }` when the request failed (the rows on screen are kept, `total` is the last known).
@@ -1630,6 +1655,7 @@ export declare class DataTableComponent<T extends Record<string, any>> implement
1630
1655
  ok: boolean;
1631
1656
  total: number;
1632
1657
  }>;
1658
+ /** Emitted after a built-in single-row delete completes successfully. */
1633
1659
  readonly rowDeleted: import("@angular/core").OutputEmitterRef<T>;
1634
1660
  /**
1635
1661
  * Optional drag-and-drop ordering of the rows. Off by default; when `true` (and the user has full access) every row gets a grip
@@ -2257,7 +2283,7 @@ export declare class SidePanelComponent implements OnDestroy {
2257
2283
  readonly cancelLabel: import("@angular/core").InputSignal<string>;
2258
2284
  /** Right-aligned primary action button label. Empty string = hidden. */
2259
2285
  readonly primaryLabel: import("@angular/core").InputSignal<string>;
2260
- readonly primaryVariant: import("@angular/core").InputSignal<"primary" | "danger" | "warning">;
2286
+ readonly primaryVariant: import("@angular/core").InputSignal<"warning" | "danger" | "primary">;
2261
2287
  readonly primaryLoading: import("@angular/core").InputSignal<boolean>;
2262
2288
  readonly primaryDisabled: import("@angular/core").InputSignal<boolean>;
2263
2289
  /** `data-testid` of the Cancel button; none when empty (default). */
@@ -2756,7 +2782,7 @@ export declare class ToastComponent {
2756
2782
  "action": "action";
2757
2783
  }, never, never, true, never>;
2758
2784
  }
2759
- export type ProgressBarVariant = 'blue' | 'green' | 'amber' | 'red' | 'slate';
2785
+ export type ProgressBarVariant = 'blue' | 'green' | 'amber' | 'orange' | 'red' | 'slate';
2760
2786
  /**
2761
2787
  * Horizontal progress bar with an optional trailing label (e.g. "3/5").
2762
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
@@ -3216,7 +3242,7 @@ export declare class CheckboxComponent implements ControlValueAccessor, Validato
3216
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.
3217
3243
  * Default null: plain label text, exactly as before. Single mode only.
3218
3244
  */
3219
- readonly headingLevel: import("@angular/core").InputSignal<2 | 1 | 5 | 3 | 4 | 6 | null>;
3245
+ readonly headingLevel: import("@angular/core").InputSignal<1 | 2 | 3 | 4 | 5 | 6 | null>;
3220
3246
  readonly indeterminate: import("@angular/core").InputSignal<boolean>;
3221
3247
  readonly checked: import("@angular/core").ModelSignal<boolean>;
3222
3248
  /**
@@ -3972,7 +3998,7 @@ export declare class RadioGroupComponent implements ControlValueAccessor, Valida
3972
3998
  /** `<ng-template uiRadioOptionContent="value">` children: content shown under that option while it is selected. */
3973
3999
  private readonly _optionContent;
3974
4000
  protected readonly _nestedContent: import("@angular/core").Signal<Map<string, TemplateRef<unknown>>>;
3975
- protected readonly _disabledInput: import("@angular/core").InputSignal<boolean>;
4001
+ readonly _disabledInput: import("@angular/core").InputSignal<boolean>;
3976
4002
  private readonly _cvaDisabled;
3977
4003
  protected readonly disabled: import("@angular/core").Signal<boolean>;
3978
4004
  private readonly _generatedName;
@@ -4139,7 +4165,7 @@ export declare class PhoneNumberPickerComponent {
4139
4165
  protected readonly modeCtl: FormControl<string>;
4140
4166
  protected readonly zipCtl: FormControl<string>;
4141
4167
  protected readonly areaCtl: FormControl<string>;
4142
- protected readonly step: import("@angular/core").WritableSignal<2 | 1 | 3>;
4168
+ protected readonly step: import("@angular/core").WritableSignal<1 | 2 | 3>;
4143
4169
  protected readonly mode: import("@angular/core").WritableSignal<PhoneNumberSearchMode>;
4144
4170
  private readonly _zip;
4145
4171
  private readonly _area;
@@ -4255,7 +4281,7 @@ export declare class ButtonComponent {
4255
4281
  * `ghost-start`: a ghost button for list / section toggles - a full-width row with its content aligned to the start, transparent
4256
4282
  * background, hover tint and the normal focus ring. Pair it with `ariaExpanded` / `ariaPressed`; the label may contain a heading element.
4257
4283
  */
4258
- readonly variant: import("@angular/core").InputSignal<"link" | "primary" | "secondary" | "danger" | "warning" | "icon" | "ghost" | "ghost-start" | "tab" | "icon-danger">;
4284
+ readonly variant: import("@angular/core").InputSignal<"link" | "icon" | "warning" | "danger" | "primary" | "secondary" | "ghost" | "ghost-start" | "tab" | "icon-danger">;
4259
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`). */
4260
4286
  readonly routerLink: import("@angular/core").InputSignal<string | readonly unknown[] | null>;
4261
4287
  /** Query params of the `routerLink` (e.g. `{ section: 'deal-defaults' }`). */
@@ -4276,7 +4302,7 @@ export declare class ButtonComponent {
4276
4302
  */
4277
4303
  readonly href: import("@angular/core").InputSignal<string | null>;
4278
4304
  /** Where to open the `href` (`_blank` = a new tab). */
4279
- readonly target: import("@angular/core").InputSignal<"_blank" | "_self" | "_parent" | "_top" | null>;
4305
+ readonly target: import("@angular/core").InputSignal<"_self" | "_blank" | "_parent" | "_top" | null>;
4280
4306
  /** `rel` of the `href` link. A `_blank` target always gets `noopener noreferrer` added. */
4281
4307
  readonly rel: import("@angular/core").InputSignal<string | null>;
4282
4308
  /** The href when it is allowed (http, https, mailto, tel, sms or a relative URL), else null. */
@@ -4301,7 +4327,7 @@ export declare class ButtonComponent {
4301
4327
  readonly color: import("@angular/core").InputSignal<string | undefined>;
4302
4328
  readonly active: import("@angular/core").InputSignal<boolean>;
4303
4329
  readonly size: import("@angular/core").InputSignal<"sm" | "md" | "lg" | "xs">;
4304
- readonly type: import("@angular/core").InputSignal<"reset" | "submit" | "button">;
4330
+ readonly type: import("@angular/core").InputSignal<"button" | "reset" | "submit">;
4305
4331
  readonly disabled: import("@angular/core").InputSignal<boolean>;
4306
4332
  readonly loading: import("@angular/core").InputSignal<boolean>;
4307
4333
  readonly fullWidth: import("@angular/core").InputSignal<boolean>;
@@ -4510,6 +4536,10 @@ export interface PillTab {
4510
4536
  * its name. The tooltip is not shown in the horizontally scrolling mobile layout (it would be clipped).
4511
4537
  */
4512
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;
4513
4543
  }
4514
4544
  /**
4515
4545
  * Pill-style tabs following the WAI-ARIA tabs pattern: each tab is a real <button role="tab">,
@@ -4539,7 +4569,18 @@ export declare class PillTabsComponent {
4539
4569
  * `panel-` when this is on; in development mode a `console.warn` names such a key.
4540
4570
  */
4541
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>;
4542
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;
4543
4584
  /** True while pills are hidden past the start / end edge of the scroll area (drives the fade hints). */
4544
4585
  protected readonly canScrollStart: import("@angular/core").WritableSignal<boolean>;
4545
4586
  protected readonly canScrollEnd: import("@angular/core").WritableSignal<boolean>;
@@ -4590,6 +4631,16 @@ export declare class PillTabsComponent {
4590
4631
  "required": false;
4591
4632
  "isSignal": true;
4592
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
+ };
4593
4644
  }, {
4594
4645
  "tabChange": "tabChange";
4595
4646
  }, never, never, true, never>;
@@ -4598,6 +4649,10 @@ export declare class PillTabsComponent {
4598
4649
  export declare function pillTabId(name: string, key: string): string;
4599
4650
  /** Id a `uiTabPanel` element gets, and the id every tab's `aria-controls` points at when `controlsPanels` is on: `<name>-panel-<key>`. */
4600
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;
4601
4656
  /**
4602
4657
  * (library source 2026-11-04, not yet published) The panel that belongs to one `ui-pill-tabs` tab: a correct
4603
4658
  * WAI-ARIA tablist / tabpanel association with the smallest possible markup.
@@ -4614,6 +4669,8 @@ export declare function pillTabPanelId(name: string, key: string): string;
4614
4669
  * - `activeKey` the tabs' active key. When given (not null), the panel gets the `hidden` attribute while another tab is active
4615
4670
  * (the panels stay in the DOM, so their state survives a tab change). Leave it unset when the page renders only the
4616
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`.
4617
4674
  * - `tabbable` default false. true adds `tabindex="0"` so a panel without any focusable content can be reached by keyboard
4618
4675
  * (WAI-ARIA tabs pattern).
4619
4676
  *
@@ -4632,6 +4689,9 @@ export declare class PillTabPanelDirective {
4632
4689
  readonly activeKey: import("@angular/core").InputSignal<string | null>;
4633
4690
  /** Makes the panel itself a Tab stop (for panels with no focusable content). Default false. */
4634
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;
4635
4695
  protected panelId(): string;
4636
4696
  protected tabId(): string;
4637
4697
  protected isHidden(): boolean;
@@ -4657,6 +4717,11 @@ export declare class PillTabPanelDirective {
4657
4717
  "required": false;
4658
4718
  "isSignal": true;
4659
4719
  };
4720
+ "describedByHeader": {
4721
+ "alias": "describedByHeader";
4722
+ "required": false;
4723
+ "isSignal": true;
4724
+ };
4660
4725
  }, {}, never, never, true, never>;
4661
4726
  }
4662
4727
  export interface ContactLookup {
@@ -4845,7 +4910,7 @@ export declare class BulkMessagePanelComponent {
4845
4910
  readonly sending: import("@angular/core").InputSignal<boolean>;
4846
4911
  readonly closed: import("@angular/core").OutputEmitterRef<void>;
4847
4912
  readonly send: import("@angular/core").OutputEmitterRef<BulkMessageSendEvent>;
4848
- readonly channel: import("@angular/core").WritableSignal<"text" | "email">;
4913
+ readonly channel: import("@angular/core").WritableSignal<"email" | "text">;
4849
4914
  private readonly _subject;
4850
4915
  private readonly _body;
4851
4916
  get subject(): string;
@@ -4900,7 +4965,7 @@ export declare class ImportSourceGridComponent {
4900
4965
  /** The `value` of the picked source (highlighted). `tile` only: the `card` appearance does not keep a selection. */
4901
4966
  readonly selected: import("@angular/core").InputSignal<string>;
4902
4967
  /** `tile`: the compact buttons of the import window. `card`: one `ui-detail-card` per source with its own select button (used on a page). */
4903
- readonly appearance: import("@angular/core").InputSignal<"tile" | "card">;
4968
+ readonly appearance: import("@angular/core").InputSignal<"card" | "tile">;
4904
4969
  /** `card`: disables every card's button (for example while the page is saving). */
4905
4970
  readonly disabled: import("@angular/core").InputSignal<boolean>;
4906
4971
  /** `card`: the text of each card's button. */
@@ -5097,7 +5162,7 @@ export declare class BankAccountFormComponent implements UiFieldValidity {
5097
5162
  protected readonly accountError: import("@angular/core").Signal<"" | "Account number must be at least 4 digits.">;
5098
5163
  protected readonly confirmError: import("@angular/core").Signal<"" | "Account numbers do not match.">;
5099
5164
  /** First reason the form cannot be submitted ('' when it can). */
5100
- readonly errorMessage: import("@angular/core").Signal<"" | "Routing number must be 9 digits." | "Account number must be at least 4 digits." | "Account numbers do not match." | "Account holder name is required." | "Routing number is required." | "Account number is required." | "Confirm account number is required." | "Select a valid account type." | "Select a valid holder type." | "You must authorize ACH debits to continue.">;
5165
+ readonly errorMessage: import("@angular/core").Signal<"" | "Account holder name is required." | "Routing number is required." | "Routing number must be 9 digits." | "Account number is required." | "Account number must be at least 4 digits." | "Confirm account number is required." | "Account numbers do not match." | "Select a valid account type." | "Select a valid holder type." | "You must authorize ACH debits to continue.">;
5101
5166
  /** True while the form cannot be submitted (`UiFieldValidity`). */
5102
5167
  readonly invalid: import("@angular/core").Signal<boolean>;
5103
5168
  /** True when the form can be submitted (ignores `disabled` / `busy`). */
@@ -5373,7 +5438,7 @@ export declare class TextInputComponent implements ControlValueAccessor, Validat
5373
5438
  readonly passwordRequirements: import("@angular/core").InputSignal<boolean>;
5374
5439
  /** Rules for `passwordRequirements`; default = the library's five rules (8+ characters, upper, lower, digit, special). */
5375
5440
  readonly passwordRules: import("@angular/core").InputSignal<readonly PasswordRule[] | undefined>;
5376
- readonly type: import("@angular/core").InputSignal<"number" | "text" | "email" | "password" | "tel" | "url">;
5441
+ readonly type: import("@angular/core").InputSignal<"number" | "email" | "text" | "tel" | "password" | "url">;
5377
5442
  readonly maxlength: import("@angular/core").InputSignal<number | undefined>;
5378
5443
  readonly required: import("@angular/core").InputSignal<boolean>;
5379
5444
  readonly autocomplete: import("@angular/core").InputSignal<string>;
@@ -5382,7 +5447,7 @@ export declare class TextInputComponent implements ControlValueAccessor, Validat
5382
5447
  * `search`, `text`, `none`). Empty (default) = the browser's default for the field, except `type="tel"`, which keeps `tel`.
5383
5448
  * It only picks the keyboard; it does not restrict what can be typed or pasted.
5384
5449
  */
5385
- readonly inputmode: import("@angular/core").InputSignal<"" | "none" | "text" | "email" | "search" | "tel" | "url" | "decimal" | "numeric">;
5450
+ readonly inputmode: import("@angular/core").InputSignal<"" | "none" | "email" | "search" | "text" | "numeric" | "tel" | "url" | "decimal">;
5386
5451
  readonly readonly: import("@angular/core").InputSignal<boolean>;
5387
5452
  readonly hint: import("@angular/core").InputSignal<string>;
5388
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. */
@@ -5454,7 +5519,7 @@ export declare class TextInputComponent implements ControlValueAccessor, Validat
5454
5519
  protected readonly _stepAttr: import("@angular/core").Signal<string | null>;
5455
5520
  protected readonly _revealable: import("@angular/core").Signal<boolean>;
5456
5521
  protected readonly _shown: import("@angular/core").WritableSignal<boolean>;
5457
- protected readonly _inputType: import("@angular/core").Signal<"number" | "text" | "email" | "password" | "tel" | "url">;
5522
+ protected readonly _inputType: import("@angular/core").Signal<"number" | "email" | "text" | "tel" | "password" | "url">;
5458
5523
  protected readonly _eyePath: string;
5459
5524
  protected readonly _eyeOffPath: string;
5460
5525
  protected readonly _showRequirements: import("@angular/core").Signal<boolean>;
@@ -5773,7 +5838,7 @@ export declare class TextareaInputComponent implements ControlValueAccessor, Val
5773
5838
  readonly monospace: import("@angular/core").InputSignal<boolean>;
5774
5839
  /** Reveal the built-in error messages now (e.g. after a failed Save click), without waiting for blur. */
5775
5840
  readonly showErrors: import("@angular/core").InputSignal<boolean>;
5776
- protected readonly _disabledInput: import("@angular/core").InputSignal<boolean>;
5841
+ readonly _disabledInput: import("@angular/core").InputSignal<boolean>;
5777
5842
  private readonly _cvaDisabled;
5778
5843
  protected readonly disabled: import("@angular/core").Signal<boolean>;
5779
5844
  protected readonly _value: import("@angular/core").WritableSignal<string>;
@@ -6026,6 +6091,14 @@ export declare class FileInputComponent implements ControlValueAccessor, Validat
6026
6091
  * Default `false`: nothing is toasted (the field message and `(fileRejected)` are unchanged). Needs a `ui-toast` outlet like any toast.
6027
6092
  */
6028
6093
  readonly toastOnReject: import("@angular/core").InputSignal<boolean>;
6094
+ /**
6095
+ * When several files are refused in one pick or drop, show EVERY one inside the field as a list (each line
6096
+ * `"name" was not added. <reason>`) instead of only the first refusal message. No toast is raised. The same list is available to the
6097
+ * host through `rejections` and `(filesRejected)`. Default `false`: the field shows the first refusal message only (unchanged).
6098
+ */
6099
+ readonly listRejections: import("@angular/core").InputSignal<boolean>;
6100
+ /** Id(s) of host elements that describe the picker (space-separated), added after the field's own error text, like `ui-text-input`'s `ariaDescribedBy`. Empty: nothing is added. */
6101
+ readonly ariaDescribedBy: import("@angular/core").InputSignal<string>;
6029
6102
  /** Show a Remove button next to the chosen file. */
6030
6103
  readonly clearable: import("@angular/core").InputSignal<boolean>;
6031
6104
  readonly removeLabel: import("@angular/core").InputSignal<string>;
@@ -6059,11 +6132,13 @@ export declare class FileInputComponent implements ControlValueAccessor, Validat
6059
6132
  readonly filesSelected: import("@angular/core").OutputEmitterRef<File[]>;
6060
6133
  /** A picked or dropped file was refused (wrong type or too big). */
6061
6134
  readonly fileRejected: import("@angular/core").OutputEmitterRef<FileRejection>;
6135
+ /** Every file refused by ONE pick or drop, in one event (fires only when at least one file was refused; `(fileRejected)` still fires per file). */
6136
+ readonly filesRejected: import("@angular/core").OutputEmitterRef<FileRejection[]>;
6062
6137
  /** The Remove button cleared the selection. */
6063
6138
  readonly fileRemoved: import("@angular/core").OutputEmitterRef<void>;
6064
6139
  /** Emits whenever the field becomes invalid / valid. */
6065
6140
  readonly invalidChange: import("@angular/core").OutputEmitterRef<boolean>;
6066
- protected readonly _disabledInput: import("@angular/core").InputSignal<boolean>;
6141
+ readonly _disabledInput: import("@angular/core").InputSignal<boolean>;
6067
6142
  private readonly _cvaDisabled;
6068
6143
  protected readonly disabled: import("@angular/core").Signal<boolean>;
6069
6144
  protected readonly _files: import("@angular/core").WritableSignal<File[]>;
@@ -6073,6 +6148,15 @@ export declare class FileInputComponent implements ControlValueAccessor, Validat
6073
6148
  /** Message of the last refused file ('' when the last pick was fine); shown in every mode. */
6074
6149
  private readonly _toast;
6075
6150
  private readonly _rejection;
6151
+ /** `aria-describedby` of the native input and the drop zone: the shown error text, then the host's ids. Absent when neither exists. */
6152
+ protected readonly _describedBy: import("@angular/core").Signal<string | null>;
6153
+ private readonly _rejected;
6154
+ /** The files refused by the last pick or drop (empty when the last pick was fine, after Remove / clear, and when files are set from the form). */
6155
+ readonly rejections: import("@angular/core").Signal<FileRejection[]>;
6156
+ /** One line per refused file: `"name" was not added. <reason>`. */
6157
+ readonly rejectionLines: import("@angular/core").Signal<string[]>;
6158
+ /** The list replaces the single message only while it is the refusal that is shown (a host `[error]` on a visible field wins). */
6159
+ protected readonly _showRejectList: import("@angular/core").Signal<boolean>;
6076
6160
  private readonly _reveal;
6077
6161
  private readonly _issue;
6078
6162
  /** True while a required field is empty, the last pick was refused, or the host passed an `[error]`. */
@@ -6109,6 +6193,8 @@ export declare class FileInputComponent implements ControlValueAccessor, Validat
6109
6193
  protected onDragOver(event: DragEvent): void;
6110
6194
  protected onDragLeave(event: DragEvent): void;
6111
6195
  protected onDrop(event: DragEvent): void;
6196
+ /** Keeps the first-message string (the `invalid` state) and the full list in step. */
6197
+ private setRejections;
6112
6198
  private rejectionFor;
6113
6199
  /** Applies picked / dropped files: refused ones raise the message and `fileRejected`, accepted ones become the value. */
6114
6200
  private accept$;
@@ -6174,6 +6260,16 @@ export declare class FileInputComponent implements ControlValueAccessor, Validat
6174
6260
  "required": false;
6175
6261
  "isSignal": true;
6176
6262
  };
6263
+ "listRejections": {
6264
+ "alias": "listRejections";
6265
+ "required": false;
6266
+ "isSignal": true;
6267
+ };
6268
+ "ariaDescribedBy": {
6269
+ "alias": "ariaDescribedBy";
6270
+ "required": false;
6271
+ "isSignal": true;
6272
+ };
6177
6273
  "clearable": {
6178
6274
  "alias": "clearable";
6179
6275
  "required": false;
@@ -6257,10 +6353,125 @@ export declare class FileInputComponent implements ControlValueAccessor, Validat
6257
6353
  }, {
6258
6354
  "filesSelected": "filesSelected";
6259
6355
  "fileRejected": "fileRejected";
6356
+ "filesRejected": "filesRejected";
6260
6357
  "fileRemoved": "fileRemoved";
6261
6358
  "invalidChange": "invalidChange";
6262
6359
  }, never, never, true, never>;
6263
6360
  }
6361
+ /**
6362
+ * A read-only text field with a Copy button (a feed address, an API URL, an invite link).
6363
+ *
6364
+ * <ui-copy-field label="Feed address" [value]="feedUrl()" (copied)="toast.success('Address copied')" />
6365
+ *
6366
+ * The button copies `value` with the Clipboard API; where that is missing or refused (older Safari / Firefox settings, an insecure page) it
6367
+ * selects the text and uses `document.execCommand('copy')`. If that fails too, the text stays selected and a status line asks the user to
6368
+ * press Ctrl/Cmd + C, and `(copyFailed)` is emitted. A polite live region announces the result. The button's accessible name contains its
6369
+ * visible text (WCAG 2.5.3). The field shows the full value (it scrolls inside the field); it never changes `value`.
6370
+ */
6371
+ export declare class CopyFieldComponent implements OnDestroy {
6372
+ /** The text shown and copied. */
6373
+ readonly value: import("@angular/core").InputSignal<string>;
6374
+ readonly label: import("@angular/core").InputSignal<string>;
6375
+ /** Visible button text (default "Copy"). */
6376
+ readonly copyLabel: import("@angular/core").InputSignal<string>;
6377
+ /** Visible button text for 2 seconds after a successful copy (default "Copied"). */
6378
+ readonly copiedLabel: import("@angular/core").InputSignal<string>;
6379
+ /** Accessible name of the button; default `<copyLabel> <label>`. Keep the visible text inside it. */
6380
+ readonly buttonAriaLabel: import("@angular/core").InputSignal<string>;
6381
+ /** Announced after a successful copy (default "Copied to clipboard"). */
6382
+ readonly copiedMessage: import("@angular/core").InputSignal<string>;
6383
+ /** Shown and announced when copying was refused (default asks for Ctrl/Cmd + C). */
6384
+ readonly failedMessage: import("@angular/core").InputSignal<string>;
6385
+ readonly hint: import("@angular/core").InputSignal<string>;
6386
+ readonly disabled: import("@angular/core").InputSignal<boolean>;
6387
+ /** Id(s) of host elements that also describe the field (space-separated). */
6388
+ readonly ariaDescribedBy: import("@angular/core").InputSignal<string>;
6389
+ readonly inputTestId: import("@angular/core").InputSignal<string>;
6390
+ readonly buttonTestId: import("@angular/core").InputSignal<string>;
6391
+ /** The text was copied. */
6392
+ readonly copied: import("@angular/core").OutputEmitterRef<string>;
6393
+ /** Neither the Clipboard API nor the fallback could copy. */
6394
+ readonly copyFailed: import("@angular/core").OutputEmitterRef<void>;
6395
+ protected readonly _id: string;
6396
+ protected readonly _state: import("@angular/core").WritableSignal<"idle" | "copied" | "failed">;
6397
+ protected readonly _announcement: import("@angular/core").Signal<string>;
6398
+ protected readonly _buttonName: import("@angular/core").Signal<string>;
6399
+ protected readonly _describedBy: import("@angular/core").Signal<string | null>;
6400
+ private readonly fieldEl;
6401
+ private _timer;
6402
+ ngOnDestroy(): void;
6403
+ /** Selects the whole text (also done on focus, so a manual copy is one keystroke away). */
6404
+ selectAll(): void;
6405
+ /** Copies `value`; the button calls this. Resolves to true when the text reached the clipboard. */
6406
+ copy(): Promise<boolean>;
6407
+ private legacyCopy;
6408
+ static ɵfac: i0.ɵɵFactoryDeclaration<CopyFieldComponent, never>;
6409
+ static ɵcmp: i0.ɵɵComponentDeclaration<CopyFieldComponent, "ui-copy-field", never, {
6410
+ "value": {
6411
+ "alias": "value";
6412
+ "required": false;
6413
+ "isSignal": true;
6414
+ };
6415
+ "label": {
6416
+ "alias": "label";
6417
+ "required": false;
6418
+ "isSignal": true;
6419
+ };
6420
+ "copyLabel": {
6421
+ "alias": "copyLabel";
6422
+ "required": false;
6423
+ "isSignal": true;
6424
+ };
6425
+ "copiedLabel": {
6426
+ "alias": "copiedLabel";
6427
+ "required": false;
6428
+ "isSignal": true;
6429
+ };
6430
+ "buttonAriaLabel": {
6431
+ "alias": "buttonAriaLabel";
6432
+ "required": false;
6433
+ "isSignal": true;
6434
+ };
6435
+ "copiedMessage": {
6436
+ "alias": "copiedMessage";
6437
+ "required": false;
6438
+ "isSignal": true;
6439
+ };
6440
+ "failedMessage": {
6441
+ "alias": "failedMessage";
6442
+ "required": false;
6443
+ "isSignal": true;
6444
+ };
6445
+ "hint": {
6446
+ "alias": "hint";
6447
+ "required": false;
6448
+ "isSignal": true;
6449
+ };
6450
+ "disabled": {
6451
+ "alias": "disabled";
6452
+ "required": false;
6453
+ "isSignal": true;
6454
+ };
6455
+ "ariaDescribedBy": {
6456
+ "alias": "ariaDescribedBy";
6457
+ "required": false;
6458
+ "isSignal": true;
6459
+ };
6460
+ "inputTestId": {
6461
+ "alias": "inputTestId";
6462
+ "required": false;
6463
+ "isSignal": true;
6464
+ };
6465
+ "buttonTestId": {
6466
+ "alias": "buttonTestId";
6467
+ "required": false;
6468
+ "isSignal": true;
6469
+ };
6470
+ }, {
6471
+ "copied": "copied";
6472
+ "copyFailed": "copyFailed";
6473
+ }, never, never, true, never>;
6474
+ }
6264
6475
  export declare class DateInputComponent implements ControlValueAccessor, Validator, UiFieldValidity {
6265
6476
  readonly label: import("@angular/core").InputSignal<string>;
6266
6477
  readonly required: import("@angular/core").InputSignal<boolean>;
@@ -6369,7 +6580,7 @@ export declare class DatetimeInputComponent implements ControlValueAccessor, Val
6369
6580
  readonly error: import("@angular/core").InputSignal<string>;
6370
6581
  /** Reveal the built-in error messages now (e.g. after a failed Save click), without waiting for blur. */
6371
6582
  readonly showErrors: import("@angular/core").InputSignal<boolean>;
6372
- protected readonly _disabledInput: import("@angular/core").InputSignal<boolean>;
6583
+ readonly _disabledInput: import("@angular/core").InputSignal<boolean>;
6373
6584
  private readonly _cvaDisabled;
6374
6585
  protected readonly disabled: import("@angular/core").Signal<boolean>;
6375
6586
  protected readonly _value: import("@angular/core").WritableSignal<string>;
@@ -6645,7 +6856,8 @@ export declare class ComboboxComponent<T = unknown> implements ControlValueAcces
6645
6856
  readonly invalidChange: import("@angular/core").OutputEmitterRef<boolean>;
6646
6857
  readonly focused: import("@angular/core").OutputEmitterRef<void>;
6647
6858
  readonly blurred: import("@angular/core").OutputEmitterRef<void>;
6648
- protected readonly _disabledInput: import("@angular/core").InputSignal<boolean>;
6859
+ /** Disables the field (`[disabled]="x()"`). Public so templates compile; ngModel / FormControl `disable()` still works (effective disabled = this OR the forms API). */
6860
+ readonly _disabledInput: import("@angular/core").InputSignal<boolean>;
6649
6861
  private readonly _cvaDisabled;
6650
6862
  protected readonly disabled: import("@angular/core").Signal<boolean>;
6651
6863
  private readonly _field;
@@ -7280,7 +7492,7 @@ export declare class FormSectionComponent {
7280
7492
  }, {}, never, ["*"], true, never>;
7281
7493
  }
7282
7494
  export declare class FormRowComponent {
7283
- readonly cols: import("@angular/core").InputSignal<2 | 1 | 3 | 4>;
7495
+ readonly cols: import("@angular/core").InputSignal<1 | 2 | 3 | 4>;
7284
7496
  static ɵfac: i0.ɵɵFactoryDeclaration<FormRowComponent, never>;
7285
7497
  static ɵcmp: i0.ɵɵComponentDeclaration<FormRowComponent, "ui-form-row", never, {
7286
7498
  "cols": {
@@ -8495,9 +8707,9 @@ export declare class ChipGroupComponent {
8495
8707
  readonly spaceAbove: import("@angular/core").InputSignal<"none" | "sm" | "md">;
8496
8708
  /** Space below the chip group. */
8497
8709
  readonly spaceBelow: import("@angular/core").InputSignal<"none" | "sm" | "md">;
8498
- protected readonly _gap: import("@angular/core").Signal<"8px" | "12px" | "6px">;
8499
- protected readonly _spaceAbove: import("@angular/core").Signal<"0" | "12px" | "6px">;
8500
- protected readonly _spaceBelow: import("@angular/core").Signal<"0" | "12px" | "6px">;
8710
+ protected readonly _gap: import("@angular/core").Signal<"6px" | "12px" | "8px">;
8711
+ protected readonly _spaceAbove: import("@angular/core").Signal<"0" | "6px" | "12px">;
8712
+ protected readonly _spaceBelow: import("@angular/core").Signal<"0" | "6px" | "12px">;
8501
8713
  static ɵfac: i0.ɵɵFactoryDeclaration<ChipGroupComponent, never>;
8502
8714
  static ɵcmp: i0.ɵɵComponentDeclaration<ChipGroupComponent, "ui-chip-group", never, {
8503
8715
  "gap": {
@@ -8875,13 +9087,13 @@ export declare class AlertComponent {
8875
9087
  }
8876
9088
  /**
8877
9089
  * Every key `<ui-icon>` draws by itself (the data-table action keys such as `view` / `edit` / `call` are accepted too, see `builtInActionIcon`).
8878
- * Each resolves with `iconPath(key)`. Includes `search`, `cup` (food / drink) and `wrench` (rental / tools), library source 2026-11-04, not yet published.
9090
+ * Each resolves with `iconPath(key)`. Includes `search`, `cup` (food / drink) and `wrench` (rental / tools), library source 2026-11-04, and `cash` (banknote) and `dollar` (payment methods / amounts), library source 2026-11-05, not yet published.
8879
9091
  */
8880
9092
  export declare const ICON_NAMES: readonly string[];
8881
9093
  /** The SVG path (24×24 stroke icon) for an icon key, or undefined when the key is unknown. */
8882
9094
  export declare function iconPath(name: string): string | undefined;
8883
9095
  /** Keys with an icon of their own (the data-table action keys are accepted too — see `builtInActionIcon`). */
8884
- 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';
9096
+ 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' | 'cash' | 'dollar' | 'history' | 'move-up' | 'move-down';
8885
9097
  /**
8886
9098
  * A clickable icon. The host passes a key (`name="delete"`) and the library draws that icon; clicking it emits
8887
9099
  * `iconClick`, and the host does the actual work (delete the row, open a panel, …).
@@ -8908,7 +9120,7 @@ export declare class IconComponent {
8908
9120
  readonly ariaLabel: import("@angular/core").InputSignal<string>;
8909
9121
  /** Icon size in px. */
8910
9122
  readonly size: import("@angular/core").InputSignal<number>;
8911
- readonly variant: import("@angular/core").InputSignal<"danger" | "default">;
9123
+ readonly variant: import("@angular/core").InputSignal<"default" | "danger">;
8912
9124
  readonly disabled: import("@angular/core").InputSignal<boolean>;
8913
9125
  /** 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. */
8914
9126
  readonly loading: import("@angular/core").InputSignal<boolean>;
@@ -9020,7 +9232,7 @@ export declare class TimelineComponent {
9020
9232
  /** Any CSS length (e.g. `600px`). When set, the list scrolls inside a keyboard-focusable region of at most this height. Empty = no wrapper. */
9021
9233
  readonly maxHeight: import("@angular/core").InputSignal<string>;
9022
9234
  /** `below` (default): the time is under the title / description. `end`: the time sits right-aligned on the title row. */
9023
- readonly timePosition: import("@angular/core").InputSignal<"end" | "below">;
9235
+ readonly timePosition: import("@angular/core").InputSignal<"below" | "end">;
9024
9236
  /**
9025
9237
  * Group the items under a heading per calendar day of `dateTime` ("Today", "Yesterday", "Oct 3", "Oct 3, 2025"). Default false = no headings,
9026
9238
  * DOM unchanged. The given order is kept: consecutive items of one day share a heading, the same day appearing again later starts a new group.
@@ -10142,7 +10354,7 @@ export declare class RichTextEditorComponent implements ControlValueAccessor {
10142
10354
  readonly maxHeight: import("@angular/core").InputSignal<number>;
10143
10355
  /** Toolbar controls to remove. Everything is shown by default. */
10144
10356
  readonly hide: import("@angular/core").InputSignal<RichTextOption[]>;
10145
- protected readonly _disabledInput: import("@angular/core").InputSignal<boolean>;
10357
+ readonly _disabledInput: import("@angular/core").InputSignal<boolean>;
10146
10358
  private readonly _cvaDisabled;
10147
10359
  protected readonly disabled: import("@angular/core").Signal<boolean>;
10148
10360
  /** Disabled or read-only: the editor is not editable and every toolbar control is disabled. */
@@ -10403,6 +10615,240 @@ export declare class RadioComponent {
10403
10615
  "selected": "selected";
10404
10616
  }, never, ["*"], true, never>;
10405
10617
  }
10618
+ export interface SwatchOption {
10619
+ value: string;
10620
+ /** Accessible name and tooltip of the swatch (e.g. "Ocean blue"). */
10621
+ label: string;
10622
+ /** Any CSS colour (`#2563eb`, `rgb(...)`, `var(--x)`). */
10623
+ color: string;
10624
+ disabled?: boolean;
10625
+ /** `data-testid` of this option's native radio input; none when omitted. */
10626
+ testId?: string;
10627
+ }
10628
+ /**
10629
+ * (library source 2026-11-05, not yet published) Colour swatch picker: a `<fieldset role="radiogroup">` of native radio inputs
10630
+ * (arrow keys move + select natively, Home / End jump to the first / last enabled swatch), ControlValueAccessor with a string value
10631
+ * (`''` = nothing selected). The selected swatch shows a check mark and a ring (never colour alone); every swatch is named by its `label`
10632
+ * (accessible name + `title` tooltip). Built-in validation like `ui-radio-group`: `required` -> "<label> is required."; a value that is not one
10633
+ * of the `options` -> "Select a valid option." (not checked while `options` is empty); a disabled picker is never invalid.
10634
+ * `disabled` combines with the forms API (`setDisabledState`). 44px touch targets on touch devices and phones; the swatches wrap.
10635
+ */
10636
+ export declare class SwatchPickerComponent implements ControlValueAccessor, Validator, UiFieldValidity {
10637
+ private readonly _el;
10638
+ readonly label: import("@angular/core").InputSignal<string>;
10639
+ readonly options: import("@angular/core").InputSignal<SwatchOption[]>;
10640
+ readonly required: import("@angular/core").InputSignal<boolean>;
10641
+ readonly hint: import("@angular/core").InputSignal<string>;
10642
+ readonly error: import("@angular/core").InputSignal<string>;
10643
+ /** Reveal the built-in error messages now (e.g. after a failed Save click), without waiting for blur. */
10644
+ readonly showErrors: import("@angular/core").InputSignal<boolean>;
10645
+ /** Fixed number of swatches per row (0 = wrap freely, the default). On a phone the row wraps by width instead. */
10646
+ readonly columns: import("@angular/core").InputSignal<number>;
10647
+ /** Native `name` shared by the radios; a unique one is generated when omitted. */
10648
+ readonly name: import("@angular/core").InputSignal<string>;
10649
+ readonly _disabledInput: import("@angular/core").InputSignal<boolean>;
10650
+ private readonly _cvaDisabled;
10651
+ protected readonly disabled: import("@angular/core").Signal<boolean>;
10652
+ private readonly _generatedName;
10653
+ protected get _name(): string;
10654
+ protected readonly _descId: string;
10655
+ protected readonly _value: import("@angular/core").WritableSignal<string>;
10656
+ private readonly _reveal;
10657
+ private readonly _issue;
10658
+ readonly invalid: import("@angular/core").Signal<boolean>;
10659
+ readonly errorMessage: import("@angular/core").Signal<string>;
10660
+ readonly invalidChange: import("@angular/core").OutputEmitterRef<boolean>;
10661
+ /** Emits the chosen value on a user pick. */
10662
+ readonly valueChange: import("@angular/core").OutputEmitterRef<string>;
10663
+ protected readonly _activeError: import("@angular/core").Signal<string>;
10664
+ private _onValidatorChange;
10665
+ constructor();
10666
+ ngOnChanges(): void;
10667
+ validate(control: AbstractControl): ValidationErrors | null;
10668
+ registerOnValidatorChange(fn: () => void): void;
10669
+ private _onChange;
10670
+ private _onTouched;
10671
+ writeValue(val: string): void;
10672
+ registerOnChange(fn: (v: string) => void): void;
10673
+ registerOnTouched(fn: () => void): void;
10674
+ setDisabledState(d: boolean): void;
10675
+ protected onSelect(value: string): void;
10676
+ /** Home / End select the first / last enabled swatch (arrow keys are native radio behaviour). */
10677
+ protected onKeydown(e: KeyboardEvent): void;
10678
+ /** Touched once focus leaves the whole group. */
10679
+ protected onFocusOut(event: FocusEvent): void;
10680
+ private _check;
10681
+ static ɵfac: i0.ɵɵFactoryDeclaration<SwatchPickerComponent, never>;
10682
+ static ɵcmp: i0.ɵɵComponentDeclaration<SwatchPickerComponent, "ui-swatch-picker", never, {
10683
+ "label": {
10684
+ "alias": "label";
10685
+ "required": false;
10686
+ "isSignal": true;
10687
+ };
10688
+ "options": {
10689
+ "alias": "options";
10690
+ "required": false;
10691
+ "isSignal": true;
10692
+ };
10693
+ "required": {
10694
+ "alias": "required";
10695
+ "required": false;
10696
+ "isSignal": true;
10697
+ };
10698
+ "hint": {
10699
+ "alias": "hint";
10700
+ "required": false;
10701
+ "isSignal": true;
10702
+ };
10703
+ "error": {
10704
+ "alias": "error";
10705
+ "required": false;
10706
+ "isSignal": true;
10707
+ };
10708
+ "showErrors": {
10709
+ "alias": "showErrors";
10710
+ "required": false;
10711
+ "isSignal": true;
10712
+ };
10713
+ "columns": {
10714
+ "alias": "columns";
10715
+ "required": false;
10716
+ "isSignal": true;
10717
+ };
10718
+ "name": {
10719
+ "alias": "name";
10720
+ "required": false;
10721
+ "isSignal": true;
10722
+ };
10723
+ "_disabledInput": {
10724
+ "alias": "disabled";
10725
+ "required": false;
10726
+ "isSignal": true;
10727
+ };
10728
+ }, {
10729
+ "invalidChange": "invalidChange";
10730
+ "valueChange": "valueChange";
10731
+ }, never, never, true, never>;
10732
+ }
10733
+ export interface IconPickerOption {
10734
+ value: string;
10735
+ /** Accessible name and tooltip of the icon (e.g. "Wrench"). */
10736
+ label: string;
10737
+ /** Key of a library icon (`<ui-icon>` / action key such as `wrench`, `history`). Defaults to `value` when neither `iconKey` nor `path` is given. */
10738
+ iconKey?: string;
10739
+ /** Raw SVG path (`d` value, 24x24 stroke icon); wins over `iconKey`. */
10740
+ path?: string;
10741
+ disabled?: boolean;
10742
+ /** `data-testid` of this option's native radio input; none when omitted. */
10743
+ testId?: string;
10744
+ }
10745
+ /**
10746
+ * (library source 2026-11-05, not yet published) Icon picker: a `<fieldset role="radiogroup">` of native radio inputs
10747
+ * (arrow keys move + select natively, Home / End jump to the first / last enabled icon), ControlValueAccessor with a string value
10748
+ * (`''` = nothing selected). The selected icon is inverted and shows a check mark (never colour alone); every icon is named by its `label`
10749
+ * (accessible name + `title` tooltip). Built-in validation like `ui-radio-group`: `required` -> "<label> is required."; a value that is not one
10750
+ * of the `options` -> "Select a valid option." (not checked while `options` is empty); a disabled picker is never invalid.
10751
+ * `disabled` combines with the forms API (`setDisabledState`). 44px touch targets on touch devices and phones; the icons wrap.
10752
+ */
10753
+ export declare class IconPickerComponent implements ControlValueAccessor, Validator, UiFieldValidity {
10754
+ private readonly _el;
10755
+ readonly label: import("@angular/core").InputSignal<string>;
10756
+ readonly options: import("@angular/core").InputSignal<IconPickerOption[]>;
10757
+ readonly required: import("@angular/core").InputSignal<boolean>;
10758
+ readonly hint: import("@angular/core").InputSignal<string>;
10759
+ readonly error: import("@angular/core").InputSignal<string>;
10760
+ /** Reveal the built-in error messages now (e.g. after a failed Save click), without waiting for blur. */
10761
+ readonly showErrors: import("@angular/core").InputSignal<boolean>;
10762
+ /** SVG path drawn for an option: its `path`, else the library icon `iconKey` (default: the option's `value`); '' when unknown. */
10763
+ protected _path(o: IconPickerOption): string;
10764
+ /** Fixed number of icons per row (0 = wrap freely, the default). On a phone the row wraps by width instead. */
10765
+ readonly columns: import("@angular/core").InputSignal<number>;
10766
+ /** Native `name` shared by the radios; a unique one is generated when omitted. */
10767
+ readonly name: import("@angular/core").InputSignal<string>;
10768
+ readonly _disabledInput: import("@angular/core").InputSignal<boolean>;
10769
+ private readonly _cvaDisabled;
10770
+ protected readonly disabled: import("@angular/core").Signal<boolean>;
10771
+ private readonly _generatedName;
10772
+ protected get _name(): string;
10773
+ protected readonly _descId: string;
10774
+ protected readonly _value: import("@angular/core").WritableSignal<string>;
10775
+ private readonly _reveal;
10776
+ private readonly _issue;
10777
+ readonly invalid: import("@angular/core").Signal<boolean>;
10778
+ readonly errorMessage: import("@angular/core").Signal<string>;
10779
+ readonly invalidChange: import("@angular/core").OutputEmitterRef<boolean>;
10780
+ /** Emits the chosen value on a user pick. */
10781
+ readonly valueChange: import("@angular/core").OutputEmitterRef<string>;
10782
+ protected readonly _activeError: import("@angular/core").Signal<string>;
10783
+ private _onValidatorChange;
10784
+ constructor();
10785
+ ngOnChanges(): void;
10786
+ validate(control: AbstractControl): ValidationErrors | null;
10787
+ registerOnValidatorChange(fn: () => void): void;
10788
+ private _onChange;
10789
+ private _onTouched;
10790
+ writeValue(val: string): void;
10791
+ registerOnChange(fn: (v: string) => void): void;
10792
+ registerOnTouched(fn: () => void): void;
10793
+ setDisabledState(d: boolean): void;
10794
+ protected onSelect(value: string): void;
10795
+ /** Home / End select the first / last enabled icon (arrow keys are native radio behaviour). */
10796
+ protected onKeydown(e: KeyboardEvent): void;
10797
+ /** Touched once focus leaves the whole group. */
10798
+ protected onFocusOut(event: FocusEvent): void;
10799
+ private _check;
10800
+ static ɵfac: i0.ɵɵFactoryDeclaration<IconPickerComponent, never>;
10801
+ static ɵcmp: i0.ɵɵComponentDeclaration<IconPickerComponent, "ui-icon-picker", never, {
10802
+ "label": {
10803
+ "alias": "label";
10804
+ "required": false;
10805
+ "isSignal": true;
10806
+ };
10807
+ "options": {
10808
+ "alias": "options";
10809
+ "required": false;
10810
+ "isSignal": true;
10811
+ };
10812
+ "required": {
10813
+ "alias": "required";
10814
+ "required": false;
10815
+ "isSignal": true;
10816
+ };
10817
+ "hint": {
10818
+ "alias": "hint";
10819
+ "required": false;
10820
+ "isSignal": true;
10821
+ };
10822
+ "error": {
10823
+ "alias": "error";
10824
+ "required": false;
10825
+ "isSignal": true;
10826
+ };
10827
+ "showErrors": {
10828
+ "alias": "showErrors";
10829
+ "required": false;
10830
+ "isSignal": true;
10831
+ };
10832
+ "columns": {
10833
+ "alias": "columns";
10834
+ "required": false;
10835
+ "isSignal": true;
10836
+ };
10837
+ "name": {
10838
+ "alias": "name";
10839
+ "required": false;
10840
+ "isSignal": true;
10841
+ };
10842
+ "_disabledInput": {
10843
+ "alias": "disabled";
10844
+ "required": false;
10845
+ "isSignal": true;
10846
+ };
10847
+ }, {
10848
+ "invalidChange": "invalidChange";
10849
+ "valueChange": "valueChange";
10850
+ }, never, never, true, never>;
10851
+ }
10406
10852
  /**
10407
10853
  * Content shown directly under ONE option of a `ui-radio-group`, only while that option is selected (e.g. an address form under
10408
10854
  * "Ship to an alternate address"). Put an `<ng-template>` inside the group and name the option's value:
@@ -10465,7 +10911,7 @@ export declare class RadioMatrixComponent implements ControlValueAccessor, Valid
10465
10911
  readonly showErrors: import("@angular/core").InputSignal<boolean>;
10466
10912
  /** Prefix of the native radio `name`s (one name per row); a unique one is generated when omitted. */
10467
10913
  readonly name: import("@angular/core").InputSignal<string>;
10468
- protected readonly _disabledInput: import("@angular/core").InputSignal<boolean>;
10914
+ readonly _disabledInput: import("@angular/core").InputSignal<boolean>;
10469
10915
  private readonly _cvaDisabled;
10470
10916
  protected readonly disabled: import("@angular/core").Signal<boolean>;
10471
10917
  private readonly _generatedName;
@@ -10767,7 +11213,7 @@ export declare class PdfHotspotComponent {
10767
11213
  /** `ready`: clickable; `blocked`: disabled (a prerequisite is missing); `signed`: shows `image`. */
10768
11214
  readonly state: import("@angular/core").InputSignal<"ready" | "blocked" | "signed">;
10769
11215
  /** `warning` gives the ready state an amber look (e.g. for initials), default is blue. */
10770
- readonly tone: import("@angular/core").InputSignal<"primary" | "warning">;
11216
+ readonly tone: import("@angular/core").InputSignal<"warning" | "primary">;
10771
11217
  /** Text of the ready button (e.g. "Sign Here"). */
10772
11218
  readonly label: import("@angular/core").InputSignal<string>;
10773
11219
  /** Text of the blocked button (e.g. "Add signature above"). */
@@ -10904,7 +11350,7 @@ export declare class DetailCardComponent {
10904
11350
  /** true (default) = the title is displayed in capitals (CSS only); false = shown as written. The text, aria-label and heading name are never changed. */
10905
11351
  readonly uppercaseTitle: import("@angular/core").InputSignal<boolean>;
10906
11352
  /** 1-6 makes the title a real heading for screen readers (role=heading, aria-level); null keeps it plain text. */
10907
- readonly headingLevel: import("@angular/core").InputSignal<2 | 1 | 5 | 3 | 4 | 6 | null>;
11353
+ readonly headingLevel: import("@angular/core").InputSignal<1 | 2 | 3 | 4 | 5 | 6 | null>;
10908
11354
  /** Optional id for the title text; the card is then labelled by it. Without it the title is the card's aria-label. */
10909
11355
  readonly titleId: import("@angular/core").InputSignal<string>;
10910
11356
  /** Accessible name of the card when the header gives none (no header, or no title). A visible title wins; blank = no name. */
@@ -11547,7 +11993,7 @@ export declare class ColorInputComponent implements ControlValueAccessor, Valida
11547
11993
  readonly presets: import("@angular/core").InputSignal<ColorPreset[]>;
11548
11994
  /** Emits whenever the field becomes invalid / valid. */
11549
11995
  readonly invalidChange: import("@angular/core").OutputEmitterRef<boolean>;
11550
- protected readonly _disabledInput: import("@angular/core").InputSignal<boolean>;
11996
+ readonly _disabledInput: import("@angular/core").InputSignal<boolean>;
11551
11997
  private readonly _cvaDisabled;
11552
11998
  protected readonly disabled: import("@angular/core").Signal<boolean>;
11553
11999
  /** Current model value (what the form control holds). */
@@ -13521,7 +13967,7 @@ export declare class SetupWizardComponent {
13521
13967
  protected customHintId(): string;
13522
13968
  protected readonly importBlocked: import("@angular/core").Signal<boolean>;
13523
13969
  /** The step's own two parts (`splitLayout`) show as two tabs, one card at a time; this is the open one (it starts on the app's part on every visit). */
13524
- protected readonly splitTab: import("@angular/core").WritableSignal<"extra" | "main">;
13970
+ protected readonly splitTab: import("@angular/core").WritableSignal<"main" | "extra">;
13525
13971
  protected readonly splitTabs: import("@angular/core").Signal<{
13526
13972
  key: string;
13527
13973
  label: string;
@@ -15688,7 +16134,7 @@ export declare class PaymentSidePanelComponent {
15688
16134
  private readonly terminalAvailable;
15689
16135
  /** value -> label of every live method the rendered plugins contribute (the first plugin wins a duplicate value). */
15690
16136
  private readonly liveMethods;
15691
- protected readonly kind: import("@angular/core").Signal<"none" | "manual" | "live" | "terminal">;
16137
+ protected readonly kind: import("@angular/core").Signal<"none" | "live" | "terminal" | "manual">;
15692
16138
  private kindOf;
15693
16139
  /** The method list as shown: record-only built-ins (a plugin takes over its own values), plugin extras, and only manual ones while a split is being built. */
15694
16140
  readonly methodList: import("@angular/core").Signal<PaymentMethodOption[]>;