@forgeroute/ui 0.4.75 → 0.4.76

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@forgeroute/ui",
3
- "version": "0.4.75",
3
+ "version": "0.4.76",
4
4
  "peerDependencies": {
5
5
  "@angular/common": ">=22.0.0",
6
6
  "@angular/core": ">=22.0.0",
@@ -68,6 +68,23 @@ export interface ToolbarAction {
68
68
  * the on / off state. Leave unset for ordinary buttons (no attribute).
69
69
  */
70
70
  pressed?: boolean;
71
+ /**
72
+ * Optional confirmation before the click is reported (library source 2026-11-05, not yet published). Set it ONLY on an action that needs a
73
+ * confirm dialog (pause / run now / send to all): the table shows its confirm modal first, emits `(tableButtonClick)` only when the user
74
+ * confirms, and emits nothing on Cancel / Escape / backdrop. An action without `confirm` behaves exactly as before. Not used for the
75
+ * table's own Import and Export. Same copy fields as a row action's `modal` (`message` may be a function read at click time, for text that
76
+ * depends on the host's current state); say what happens before -> after and what is NOT affected.
77
+ */
78
+ confirm?: ToolbarConfirm;
79
+ }
80
+ /** Confirm dialog copy of a toolbar action (see `ToolbarAction.confirm`). */
81
+ export interface ToolbarConfirm {
82
+ title: string;
83
+ message: string | (() => string);
84
+ confirmLabel?: string;
85
+ cancelLabel?: string;
86
+ variant?: 'danger' | 'primary' | 'warning';
87
+ details?: string[];
71
88
  }
72
89
  export interface ConfirmConfig {
73
90
  title: string;
@@ -179,6 +196,14 @@ export interface ColumnDef {
179
196
  * Example: `{ key: 'name', label: 'Name', starFn: (doc) => doc.isAuthForm ? 'Authorization Form' : null }`
180
197
  */
181
198
  starFn?: (item: any) => string | null | undefined;
199
+ /**
200
+ * Footer text for this column, from the table's `totalsEndpoint` response (shown only while the table has rows and the totals loaded).
201
+ * Return null / undefined / '' for an empty footer cell. `cellType: 'number'` columns are right-aligned like their body cells.
202
+ * The table's `totalsLabel` goes in the footer cell of the first visible column; when that column has a `footerFn` too, the label is
203
+ * kept as visually hidden text before the value ("Total: $1,200") so it is still announced once.
204
+ * Example: `{ key: 'amount', label: 'Amount', cellType: 'number', footerFn: t => t['amount'] == null ? null : '$' + t['amount'] }`
205
+ */
206
+ footerFn?: (totals: Record<string, string | number | null>) => string | null | undefined;
182
207
  /** Date format string. Default: 'MMM d, y' */
183
208
  dateFormat?: string;
184
209
  /** Returns the display name for the row. Default: item[col.key] */
@@ -1170,7 +1195,7 @@ export declare class SelectComponent implements ControlValueAccessor, Validator,
1170
1195
  readonly error: import("@angular/core").InputSignal<string>;
1171
1196
  /** Reveal the built-in error messages now (e.g. after a failed Save click), without waiting for blur. */
1172
1197
  readonly showErrors: import("@angular/core").InputSignal<boolean>;
1173
- readonly size: import("@angular/core").InputSignal<"default" | "sm">;
1198
+ readonly size: import("@angular/core").InputSignal<"sm" | "default">;
1174
1199
  readonly _disabledInput: import("@angular/core").InputSignal<boolean>;
1175
1200
  private readonly _cvaDisabled;
1176
1201
  protected readonly disabled: import("@angular/core").Signal<boolean>;
@@ -1555,6 +1580,16 @@ export declare class DataTableComponent<T extends Record<string, any>> implement
1555
1580
  protected readonly _showHeader: Signal<boolean>;
1556
1581
  /** Optional endpoint that returns Record<string,number> counts per quick-filter value. */
1557
1582
  readonly countsEndpoint: import("@angular/core").InputSignal<string>;
1583
+ /**
1584
+ * Optional footer totals row. Path relative to `baseUrl` (like `endpoint`). When set, the table GETs it with the same query params as the
1585
+ * rows request except paging and sorting (host `params`, lower-cased `search` + `searchFields`, active tab as `filter`, column filters) and
1586
+ * shows a footer built from each column's `footerFn`. The response is `Record<string, string | number | null>`. Totals follow the FILTERED
1587
+ * set, not the page; they are refetched on search / tab / filter / params / refresh() / resetToFirstPage() / import (not on paging or
1588
+ * sorting) and never cached. Hidden while loading, on error, with zero rows, or when the totals request fails (silently).
1589
+ */
1590
+ readonly totalsEndpoint: import("@angular/core").InputSignal<string>;
1591
+ /** Text of the footer's label cell (first visible column) and the phone summary card's accessible name. */
1592
+ readonly totalsLabel: import("@angular/core").InputSignal<string>;
1558
1593
  /**
1559
1594
  * Optional extra query params owned by the host page (e.g. a period picker or a parent-record id),
1560
1595
  * sent with every row, /counts, /filter-counts and export request. When the value changes the table
@@ -1803,6 +1838,23 @@ export declare class DataTableComponent<T extends Record<string, any>> implement
1803
1838
  /** Current active filter/search/sort params — passed to the export so it exports the filtered view. */
1804
1839
  /** Visible searchable column keys (comma-joined) — the table and Export only search what's on screen. */
1805
1840
  protected readonly _searchFields: Signal<string>;
1841
+ /** Latest footer totals response (null = none / failed / not requested). */
1842
+ protected readonly _totals: import("@angular/core").WritableSignal<Record<string, string | number | null> | null>;
1843
+ private _totalsSub?;
1844
+ /** Set by paging and sorting: they reload rows but never change the totals. */
1845
+ private _totalsSkipNext;
1846
+ protected readonly _footerVisible: Signal<boolean>;
1847
+ /** Footer text per visible column key (only columns whose footerFn returns text). */
1848
+ protected readonly _footerCells: Signal<Record<string, string>>;
1849
+ protected readonly _footerPhoneLines: Signal<{
1850
+ key: string;
1851
+ label: string;
1852
+ value: string;
1853
+ }[]>;
1854
+ /** Totals request params: the export params without sorting (the rows request without paging and sorting). */
1855
+ private _totalsParams;
1856
+ /** `keepShown`: a silent (background) refresh keeps the current footer on screen until the new totals arrive. */
1857
+ private _fetchTotals;
1806
1858
  protected readonly _exportParams: Signal<Record<string, string>>;
1807
1859
  /**
1808
1860
  * Toolbar buttons with auto-injected Export (always) and Import (only when
@@ -1868,6 +1920,13 @@ export declare class DataTableComponent<T extends Record<string, any>> implement
1868
1920
  protected rowActionsLabel(item: T): string;
1869
1921
  protected toggleSelectAll(): void;
1870
1922
  protected toggleRow(item: T): void;
1923
+ /**
1924
+ * The table's current query as the parameters it sends with Export: the host `params`, the lower-cased `search` (+ `searchFields`),
1925
+ * the active quick tab as `filter`, `sort` + `direction`, and every active column filter (multi-values comma-joined). A new copy
1926
+ * on every call; reading it changes nothing. A host uses it to act on exactly what the table shows (print the same rows, call a
1927
+ * report endpoint with the same search / filters) without keeping its own copy of that state. Paging is not included.
1928
+ */
1929
+ currentQuery(): Record<string, string>;
1871
1930
  /** Clears the selection — call from the host component after a bulk action completes. */
1872
1931
  clearSelection(): void;
1873
1932
  resetColumns(): void;
@@ -2023,7 +2082,7 @@ export declare class DataTableComponent<T extends Record<string, any>> implement
2023
2082
  protected onRowClick(item: T): void;
2024
2083
  /** Enter / Space on a focused clickable row or card activates it — ignored when focus is on a control inside it. */
2025
2084
  protected onRowKeydown(e: KeyboardEvent, item: T): void;
2026
- protected onInternalButtonClick(type: string): void;
2085
+ protected onInternalButtonClick(type: string): Promise<void>;
2027
2086
  protected onImported(): void;
2028
2087
  /** Row actions visible for the current permission: everything for 'full'; otherwise only View (`type: 'view'`) and actions marked
2029
2088
  * `allowReadOnly` (never the built-in delete). The Actions column itself is shown only while some row has a visible action. */
@@ -2169,6 +2228,16 @@ export declare class DataTableComponent<T extends Record<string, any>> implement
2169
2228
  "required": false;
2170
2229
  "isSignal": true;
2171
2230
  };
2231
+ "totalsEndpoint": {
2232
+ "alias": "totalsEndpoint";
2233
+ "required": false;
2234
+ "isSignal": true;
2235
+ };
2236
+ "totalsLabel": {
2237
+ "alias": "totalsLabel";
2238
+ "required": false;
2239
+ "isSignal": true;
2240
+ };
2172
2241
  "params": {
2173
2242
  "alias": "params";
2174
2243
  "required": false;
@@ -2283,7 +2352,7 @@ export declare class SidePanelComponent implements OnDestroy {
2283
2352
  readonly cancelLabel: import("@angular/core").InputSignal<string>;
2284
2353
  /** Right-aligned primary action button label. Empty string = hidden. */
2285
2354
  readonly primaryLabel: import("@angular/core").InputSignal<string>;
2286
- readonly primaryVariant: import("@angular/core").InputSignal<"warning" | "danger" | "primary">;
2355
+ readonly primaryVariant: import("@angular/core").InputSignal<"primary" | "danger" | "warning">;
2287
2356
  readonly primaryLoading: import("@angular/core").InputSignal<boolean>;
2288
2357
  readonly primaryDisabled: import("@angular/core").InputSignal<boolean>;
2289
2358
  /** `data-testid` of the Cancel button; none when empty (default). */
@@ -2414,7 +2483,7 @@ export declare class ModalComponent implements OnInit, OnDestroy {
2414
2483
  */
2415
2484
  readonly describedBy: import("@angular/core").InputSignal<string | null>;
2416
2485
  readonly maxWidth: import("@angular/core").InputSignal<string>;
2417
- readonly bodyOverflow: import("@angular/core").InputSignal<"hidden" | "visible" | "auto">;
2486
+ readonly bodyOverflow: import("@angular/core").InputSignal<"hidden" | "auto" | "visible">;
2418
2487
  /** `data-testid` of the dialog element itself (the host `<ui-modal>` is always in the page, the dialog only while open). None when empty. */
2419
2488
  readonly dialogTestId: import("@angular/core").InputSignal<string>;
2420
2489
  /** Hides the header X button (e.g. while a request is running). Escape and a backdrop click still close unless `closable` is false. */
@@ -2545,7 +2614,7 @@ export declare class ModalComponent implements OnInit, OnDestroy {
2545
2614
  "close": "close";
2546
2615
  }, never, ["[modal-header-end]", "*", "[modal-footer-left]", "[modal-footer-center]", "[modal-footer-right]"], true, never>;
2547
2616
  }
2548
- export type ToastType = 'success' | 'error' | 'info';
2617
+ export type ToastType = 'success' | 'error' | 'info' | 'warning';
2549
2618
  /** A button on a toast (e.g. "View Contact", "Call Back"). */
2550
2619
  export interface ToastAction {
2551
2620
  /** Identifies the button in `onAction` and in the `(action)` output; also the test id suffix (`toast-action-<id>`). */
@@ -2565,11 +2634,11 @@ export interface ToastActionEvent {
2565
2634
  key?: string;
2566
2635
  }
2567
2636
  /**
2568
- * Per-message options for `show()` / `success()` / `info()` / `error()` / `notify()`. Every field is optional; a call without any of them is a plain
2637
+ * Per-message options for `show()` / `success()` / `info()` / `warning()` / `error()` / `notify()`. Every field is optional; a call without any of them is a plain
2569
2638
  * toast exactly as before.
2570
2639
  */
2571
2640
  export interface ToastOptions {
2572
- /** Only `notify()` reads this (`show` / `success` / `info` / `error` fix their own type). Default `success`. */
2641
+ /** Only `notify()` reads this (`show` / `success` / `info` / `warning` / `error` fix their own type). Default `success`. */
2573
2642
  type?: ToastType;
2574
2643
  /** How long it stays, in ms. Default: 3000 (4000 for errors). */
2575
2644
  duration?: number;
@@ -2651,6 +2720,12 @@ export declare class ToastService implements OnDestroy {
2651
2720
  success(msg: string, durationOrOptions?: number | ToastOptions): void;
2652
2721
  /** Neutral (blue) toast for a result that is neither a success nor a failure, e.g. "No changes to save.". */
2653
2722
  info(msg: string, durationOrOptions?: number | ToastOptions): void;
2723
+ /**
2724
+ * Amber toast for a result that worked but needs attention, e.g. "Saved, but 2 screenshots could not be attached." Announced politely (not as an
2725
+ * alert: nothing failed). Default 4000ms, a little longer than info because the user has something to read and maybe act on.
2726
+ * (library source 2026-11-04, not yet published)
2727
+ */
2728
+ warning(msg: string, durationOrOptions?: number | ToastOptions): void;
2654
2729
  error(msg: string, durationOrOptions?: number | ToastOptions): void;
2655
2730
  /** A toast whose type comes from `options.type` (default `success`); the same as the named methods otherwise. */
2656
2731
  notify(msg: string, options?: ToastOptions): void;
@@ -2869,6 +2944,86 @@ export declare class ProgressBarComponent {
2869
2944
  };
2870
2945
  }, {}, never, never, true, never>;
2871
2946
  }
2947
+ /** Library source 2026-11-05, not yet published. One segment of a `ui-stacked-bar`. */
2948
+ export interface StackedBarSegment {
2949
+ /** Name shown in the legend and read out for the segment. */
2950
+ label: string;
2951
+ /** Amount of this segment (negative / NaN count as 0). */
2952
+ value: number;
2953
+ /** Built-in colour (same set as `ui-progress-bar`). Default: a fixed rotation by position. */
2954
+ variant?: ProgressBarVariant;
2955
+ /** Any CSS colour; wins over `variant`. */
2956
+ color?: string;
2957
+ }
2958
+ /**
2959
+ * A single horizontal bar split into coloured segments by their share of the total (e.g. an aging snapshot: current / 1-30 / 31-60 / 61-90 / 91+).
2960
+ * Pure CSS (no chart library): each segment's width is its rounded share, a value above 0 is never drawn narrower than 2%, segments of 0 are left
2961
+ * out of the bar (but stay in the legend). A total of 0 draws an empty track.
2962
+ *
2963
+ * Accessible without sight: the coloured strip is decorative (`aria-hidden`); the legend is a real list ("<label>: <value> (<share>%)") that is always
2964
+ * in the page, and `showLegend="false"` only hides it visually. The group is named by `ariaLabel`. Each segment also has a hover `title`.
2965
+ * Colours never carry the meaning alone (the legend repeats label, value and share); forced-colors mode draws the segments with a border.
2966
+ *
2967
+ * Inputs: `segments`, `ariaLabel`, `height` (px, default 14), `showLegend` (default true), `formatValue` (default: en-US grouped number; pass e.g. a
2968
+ * currency formatter). Output: none.
2969
+ */
2970
+ export declare class StackedBarComponent {
2971
+ readonly segments: import("@angular/core").InputSignal<StackedBarSegment[]>;
2972
+ readonly ariaLabel: import("@angular/core").InputSignal<string>;
2973
+ readonly height: import("@angular/core").InputSignal<number>;
2974
+ readonly showLegend: import("@angular/core").InputSignal<boolean>;
2975
+ readonly formatValue: import("@angular/core").InputSignal<(value: number) => string>;
2976
+ /** Segments with their cleaned value, colour and share (legend order = input order). */
2977
+ protected readonly rows: import("@angular/core").Signal<{
2978
+ percent: number;
2979
+ text: string;
2980
+ title: string;
2981
+ key: string;
2982
+ label: string;
2983
+ color: string;
2984
+ variant: ProgressBarVariant;
2985
+ value: number;
2986
+ }[]>;
2987
+ /** Only the segments that have something to draw. */
2988
+ protected readonly drawn: import("@angular/core").Signal<{
2989
+ percent: number;
2990
+ text: string;
2991
+ title: string;
2992
+ key: string;
2993
+ label: string;
2994
+ color: string;
2995
+ variant: ProgressBarVariant;
2996
+ value: number;
2997
+ }[]>;
2998
+ static ɵfac: i0.ɵɵFactoryDeclaration<StackedBarComponent, never>;
2999
+ static ɵcmp: i0.ɵɵComponentDeclaration<StackedBarComponent, "ui-stacked-bar", never, {
3000
+ "segments": {
3001
+ "alias": "segments";
3002
+ "required": false;
3003
+ "isSignal": true;
3004
+ };
3005
+ "ariaLabel": {
3006
+ "alias": "ariaLabel";
3007
+ "required": false;
3008
+ "isSignal": true;
3009
+ };
3010
+ "height": {
3011
+ "alias": "height";
3012
+ "required": false;
3013
+ "isSignal": true;
3014
+ };
3015
+ "showLegend": {
3016
+ "alias": "showLegend";
3017
+ "required": false;
3018
+ "isSignal": true;
3019
+ };
3020
+ "formatValue": {
3021
+ "alias": "formatValue";
3022
+ "required": false;
3023
+ "isSignal": true;
3024
+ };
3025
+ }, {}, never, never, true, never>;
3026
+ }
2872
3027
  export type ProgressRingVariant = 'blue' | 'green' | 'amber' | 'red' | 'slate' | 'sky';
2873
3028
  /**
2874
3029
  * Circular progress ring with the rounded percentage (or a custom `label`) in the middle.
@@ -3242,7 +3397,7 @@ export declare class CheckboxComponent implements ControlValueAccessor, Validato
3242
3397
  * 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.
3243
3398
  * Default null: plain label text, exactly as before. Single mode only.
3244
3399
  */
3245
- readonly headingLevel: import("@angular/core").InputSignal<1 | 2 | 3 | 4 | 5 | 6 | null>;
3400
+ readonly headingLevel: import("@angular/core").InputSignal<1 | 2 | 5 | 3 | 6 | 4 | null>;
3246
3401
  readonly indeterminate: import("@angular/core").InputSignal<boolean>;
3247
3402
  readonly checked: import("@angular/core").ModelSignal<boolean>;
3248
3403
  /**
@@ -3647,7 +3802,7 @@ export declare class StepperComponent {
3647
3802
  * its circle, one continuous line behind the circles that fills as steps complete; a complete step shows a check, the current step an
3648
3803
  * accent ring with a dot, an upcoming step an empty circle (no numbers). Circles are 40px (32px with `size="sm"`).
3649
3804
  */
3650
- readonly labelPosition: import("@angular/core").InputSignal<"below" | "beside">;
3805
+ readonly labelPosition: import("@angular/core").InputSignal<"beside" | "below">;
3651
3806
  /** Viewport width in px below which a horizontal stepper is drawn vertical (labels beside the circles), e.g. `640`. null (default) = never. */
3652
3807
  readonly stackBelow: import("@angular/core").InputSignal<number | null>;
3653
3808
  /** CSS length (e.g. `10.5rem`): horizontal only - the list gets `min-width: calc(<step count> * <value>)`. Empty (default) = no minimum. */
@@ -4281,7 +4436,7 @@ export declare class ButtonComponent {
4281
4436
  * `ghost-start`: a ghost button for list / section toggles - a full-width row with its content aligned to the start, transparent
4282
4437
  * background, hover tint and the normal focus ring. Pair it with `ariaExpanded` / `ariaPressed`; the label may contain a heading element.
4283
4438
  */
4284
- readonly variant: import("@angular/core").InputSignal<"link" | "icon" | "warning" | "danger" | "primary" | "secondary" | "ghost" | "ghost-start" | "tab" | "icon-danger">;
4439
+ readonly variant: import("@angular/core").InputSignal<"link" | "primary" | "secondary" | "danger" | "warning" | "ghost" | "ghost-start" | "tab" | "icon" | "icon-danger">;
4285
4440
  /** 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`). */
4286
4441
  readonly routerLink: import("@angular/core").InputSignal<string | readonly unknown[] | null>;
4287
4442
  /** Query params of the `routerLink` (e.g. `{ section: 'deal-defaults' }`). */
@@ -4910,7 +5065,7 @@ export declare class BulkMessagePanelComponent {
4910
5065
  readonly sending: import("@angular/core").InputSignal<boolean>;
4911
5066
  readonly closed: import("@angular/core").OutputEmitterRef<void>;
4912
5067
  readonly send: import("@angular/core").OutputEmitterRef<BulkMessageSendEvent>;
4913
- readonly channel: import("@angular/core").WritableSignal<"email" | "text">;
5068
+ readonly channel: import("@angular/core").WritableSignal<"text" | "email">;
4914
5069
  private readonly _subject;
4915
5070
  private readonly _body;
4916
5071
  get subject(): string;
@@ -5438,7 +5593,7 @@ export declare class TextInputComponent implements ControlValueAccessor, Validat
5438
5593
  readonly passwordRequirements: import("@angular/core").InputSignal<boolean>;
5439
5594
  /** Rules for `passwordRequirements`; default = the library's five rules (8+ characters, upper, lower, digit, special). */
5440
5595
  readonly passwordRules: import("@angular/core").InputSignal<readonly PasswordRule[] | undefined>;
5441
- readonly type: import("@angular/core").InputSignal<"number" | "email" | "text" | "tel" | "password" | "url">;
5596
+ readonly type: import("@angular/core").InputSignal<"number" | "text" | "email" | "tel" | "password" | "url">;
5442
5597
  readonly maxlength: import("@angular/core").InputSignal<number | undefined>;
5443
5598
  readonly required: import("@angular/core").InputSignal<boolean>;
5444
5599
  readonly autocomplete: import("@angular/core").InputSignal<string>;
@@ -5447,7 +5602,7 @@ export declare class TextInputComponent implements ControlValueAccessor, Validat
5447
5602
  * `search`, `text`, `none`). Empty (default) = the browser's default for the field, except `type="tel"`, which keeps `tel`.
5448
5603
  * It only picks the keyboard; it does not restrict what can be typed or pasted.
5449
5604
  */
5450
- readonly inputmode: import("@angular/core").InputSignal<"" | "none" | "email" | "search" | "text" | "numeric" | "tel" | "url" | "decimal">;
5605
+ readonly inputmode: import("@angular/core").InputSignal<"" | "none" | "text" | "search" | "decimal" | "email" | "tel" | "url" | "numeric">;
5451
5606
  readonly readonly: import("@angular/core").InputSignal<boolean>;
5452
5607
  readonly hint: import("@angular/core").InputSignal<string>;
5453
5608
  /** 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. */
@@ -5519,7 +5674,7 @@ export declare class TextInputComponent implements ControlValueAccessor, Validat
5519
5674
  protected readonly _stepAttr: import("@angular/core").Signal<string | null>;
5520
5675
  protected readonly _revealable: import("@angular/core").Signal<boolean>;
5521
5676
  protected readonly _shown: import("@angular/core").WritableSignal<boolean>;
5522
- protected readonly _inputType: import("@angular/core").Signal<"number" | "email" | "text" | "tel" | "password" | "url">;
5677
+ protected readonly _inputType: import("@angular/core").Signal<"number" | "text" | "email" | "tel" | "password" | "url">;
5523
5678
  protected readonly _eyePath: string;
5524
5679
  protected readonly _eyeOffPath: string;
5525
5680
  protected readonly _showRequirements: import("@angular/core").Signal<boolean>;
@@ -5544,6 +5699,26 @@ export declare class TextInputComponent implements ControlValueAccessor, Validat
5544
5699
  * view exists, or on a disabled field, it does nothing and never throws.
5545
5700
  */
5546
5701
  focus(options?: FocusOptions): void;
5702
+ /**
5703
+ * Library source 2026-11-05, not yet published. Caret access for hosts (e.g. an "insert variable at the cursor" chip row), so a host never
5704
+ * queries the inner element. Reach it with `viewChild(TextInputComponent)`. All three methods are safe at any time: before the view exists, on a
5705
+ * disabled / read-only field, or for a type that has no selection API (email, number) they do nothing / return null and never throw.
5706
+ *
5707
+ * `getSelection()` -> `{ start, end }` of the selected text (equal when only a caret) or `null` when it cannot be read.
5708
+ */
5709
+ getSelection(): {
5710
+ start: number;
5711
+ end: number;
5712
+ } | null;
5713
+ /** Selects `start`..`end` (a caret when `end` is left out); values are clamped to the text. Does nothing where the selection API is unavailable. */
5714
+ setSelection(start: number, end?: number): void;
5715
+ /**
5716
+ * Inserts `text` at the caret, replacing any selected text, and puts the caret right after it. The change goes through the normal typing path
5717
+ * (formatting, `ngModel` / form control, `valueChange`), exactly as if the user had typed it, and `maxlength` caps it like typing does (the
5718
+ * part that does not fit is not inserted). With no caret known (a type without a selection API) the text is appended. Does nothing on a
5719
+ * disabled or read-only field or for an empty `text`.
5720
+ */
5721
+ insertAtCaret(text: string): void;
5547
5722
  private _onChange;
5548
5723
  private _onTouched;
5549
5724
  private _onValidatorChange;
@@ -5873,6 +6048,27 @@ export declare class TextareaInputComponent implements ControlValueAccessor, Val
5873
6048
  * nothing and never throws.
5874
6049
  */
5875
6050
  focus(options?: FocusOptions): void;
6051
+ /**
6052
+ * Library source 2026-11-05, not yet published. Caret access for hosts (e.g. an "insert variable at the cursor" chip row), so a host never
6053
+ * queries the inner element. Reach it with `viewChild(TextareaInputComponent)`. All three methods are safe at any time: before the view exists, on a
6054
+ * disabled / read-only field they do nothing / return null and never throw.
6055
+ *
6056
+ * `getSelection()` -> `{ start, end }` of the selected text (equal when only a caret) or `null` when it cannot be read.
6057
+ */
6058
+ getSelection(): {
6059
+ start: number;
6060
+ end: number;
6061
+ } | null;
6062
+ /** Selects `start`..`end` (a caret when `end` is left out); values are clamped to the text. Does nothing where the selection API is unavailable. */
6063
+ setSelection(start: number, end?: number): void;
6064
+ /**
6065
+ * Inserts `text` at the caret, replacing any selected text, and puts the caret right after it. The change goes through the normal typing path
6066
+ * (`ngModel` / form control), exactly as if the user had typed it, and `maxlength` caps it like typing does (the
6067
+ * part that does not fit is not inserted). With no caret known the text is appended. Does nothing on a
6068
+ * disabled or read-only field or for an empty `text`.
6069
+ */
6070
+ insertAtCaret(text: string): void;
6071
+ private _textarea;
5876
6072
  private _onChange;
5877
6073
  private _onTouched;
5878
6074
  writeValue(val: string | null): void;
@@ -6393,7 +6589,7 @@ export declare class CopyFieldComponent implements OnDestroy {
6393
6589
  /** Neither the Clipboard API nor the fallback could copy. */
6394
6590
  readonly copyFailed: import("@angular/core").OutputEmitterRef<void>;
6395
6591
  protected readonly _id: string;
6396
- protected readonly _state: import("@angular/core").WritableSignal<"idle" | "copied" | "failed">;
6592
+ protected readonly _state: import("@angular/core").WritableSignal<"idle" | "failed" | "copied">;
6397
6593
  protected readonly _announcement: import("@angular/core").Signal<string>;
6398
6594
  protected readonly _buttonName: import("@angular/core").Signal<string>;
6399
6595
  protected readonly _describedBy: import("@angular/core").Signal<string | null>;
@@ -7561,16 +7757,28 @@ export declare class FormColSpanDirective {
7561
7757
  */
7562
7758
  /** One secondary line under the title: plain text, or text with a small icon and a tone (`danger` red, `warning` amber). */
7563
7759
  export type ListItemDetail = string | {
7564
- text: string;
7760
+ text?: string;
7761
+ segments?: ListItemSegment[];
7565
7762
  icon?: string;
7566
7763
  tone?: 'default' | 'warning' | 'danger';
7567
7764
  };
7765
+ /**
7766
+ * One piece of a rich detail line (library source 2026-11-04, not yet published): plain text, or text shown in bold and/or as inline code. Rich text
7767
+ * is structured data, never HTML, so nothing is injected. `{ segments: ['Click ', { text: 'Connect', bold: true }, ' and copy ', { text: 'client_id', code: true }] }`
7768
+ * renders `Click <strong>Connect</strong> and copy <code>client_id</code>`. A detail with `segments` ignores `text` for display (when `text` is empty
7769
+ * the segments' plain text is used, e.g. for the visible-line check).
7770
+ */
7771
+ export type ListItemSegment = string | {
7772
+ text: string;
7773
+ bold?: boolean;
7774
+ code?: boolean;
7775
+ };
7568
7776
  /** Colour of the optional leading icon tile. */
7569
7777
  export type ListItemIconColor = 'slate' | 'amber' | 'red' | 'blue' | 'green' | 'purple' | 'teal' | 'orange';
7570
7778
  export declare class ListItemComponent implements AfterContentChecked {
7571
7779
  private readonly host;
7572
7780
  /** Show a radio button, checkbox, or nothing on the left. */
7573
- readonly leading: import("@angular/core").InputSignal<"none" | "radio" | "checkbox">;
7781
+ readonly leading: import("@angular/core").InputSignal<"none" | "checkbox" | "radio">;
7574
7782
  /** `name` attribute for the radio/checkbox (groups radios together). */
7575
7783
  readonly inputName: import("@angular/core").InputSignal<string>;
7576
7784
  /** `id` attribute for the radio/checkbox (links the label). */
@@ -7652,6 +7860,11 @@ export declare class ListItemComponent implements AfterContentChecked {
7652
7860
  protected onRowKey(e: Event): void;
7653
7861
  protected readonly visibleDetails: () => {
7654
7862
  text: string;
7863
+ segs: {
7864
+ text: string;
7865
+ bold: boolean;
7866
+ code: boolean;
7867
+ }[] | null;
7655
7868
  d: string | null;
7656
7869
  tone: "default" | "warning" | "danger";
7657
7870
  }[];
@@ -9120,7 +9333,7 @@ export declare class IconComponent {
9120
9333
  readonly ariaLabel: import("@angular/core").InputSignal<string>;
9121
9334
  /** Icon size in px. */
9122
9335
  readonly size: import("@angular/core").InputSignal<number>;
9123
- readonly variant: import("@angular/core").InputSignal<"default" | "danger">;
9336
+ readonly variant: import("@angular/core").InputSignal<"danger" | "default">;
9124
9337
  readonly disabled: import("@angular/core").InputSignal<boolean>;
9125
9338
  /** 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. */
9126
9339
  readonly loading: import("@angular/core").InputSignal<boolean>;
@@ -9232,7 +9445,7 @@ export declare class TimelineComponent {
9232
9445
  /** Any CSS length (e.g. `600px`). When set, the list scrolls inside a keyboard-focusable region of at most this height. Empty = no wrapper. */
9233
9446
  readonly maxHeight: import("@angular/core").InputSignal<string>;
9234
9447
  /** `below` (default): the time is under the title / description. `end`: the time sits right-aligned on the title row. */
9235
- readonly timePosition: import("@angular/core").InputSignal<"below" | "end">;
9448
+ readonly timePosition: import("@angular/core").InputSignal<"end" | "below">;
9236
9449
  /**
9237
9450
  * Group the items under a heading per calendar day of `dateTime` ("Today", "Yesterday", "Oct 3", "Oct 3, 2025"). Default false = no headings,
9238
9451
  * 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.
@@ -11213,7 +11426,7 @@ export declare class PdfHotspotComponent {
11213
11426
  /** `ready`: clickable; `blocked`: disabled (a prerequisite is missing); `signed`: shows `image`. */
11214
11427
  readonly state: import("@angular/core").InputSignal<"ready" | "blocked" | "signed">;
11215
11428
  /** `warning` gives the ready state an amber look (e.g. for initials), default is blue. */
11216
- readonly tone: import("@angular/core").InputSignal<"warning" | "primary">;
11429
+ readonly tone: import("@angular/core").InputSignal<"primary" | "warning">;
11217
11430
  /** Text of the ready button (e.g. "Sign Here"). */
11218
11431
  readonly label: import("@angular/core").InputSignal<string>;
11219
11432
  /** Text of the blocked button (e.g. "Add signature above"). */
@@ -11350,7 +11563,7 @@ export declare class DetailCardComponent {
11350
11563
  /** true (default) = the title is displayed in capitals (CSS only); false = shown as written. The text, aria-label and heading name are never changed. */
11351
11564
  readonly uppercaseTitle: import("@angular/core").InputSignal<boolean>;
11352
11565
  /** 1-6 makes the title a real heading for screen readers (role=heading, aria-level); null keeps it plain text. */
11353
- readonly headingLevel: import("@angular/core").InputSignal<1 | 2 | 3 | 4 | 5 | 6 | null>;
11566
+ readonly headingLevel: import("@angular/core").InputSignal<1 | 2 | 5 | 3 | 6 | 4 | null>;
11354
11567
  /** Optional id for the title text; the card is then labelled by it. Without it the title is the card's aria-label. */
11355
11568
  readonly titleId: import("@angular/core").InputSignal<string>;
11356
11569
  /** Accessible name of the card when the header gives none (no header, or no title). A visible title wins; blank = no name. */
@@ -11364,7 +11577,7 @@ export declare class DetailCardComponent {
11364
11577
  /** Background colour of the footer bar (the `[card-footer]` slot) as any CSS colour. Empty = no colour of its own. */
11365
11578
  readonly footerBackground: import("@angular/core").InputSignal<string>;
11366
11579
  /** Alignment of the `[card-footer]` content: `'start'` (default, unchanged) or `'end'` = a right-aligned action row with an 8px gap. */
11367
- readonly footerAlign: import("@angular/core").InputSignal<"end" | "start">;
11580
+ readonly footerAlign: import("@angular/core").InputSignal<"start" | "end">;
11368
11581
  /** Text colour as any CSS colour (`#fff`, `var(--on-dark)` …). Empty = the default colours. Colours the title, subtitle, chevron and body text. */
11369
11582
  readonly textColor: import("@angular/core").InputSignal<string>;
11370
11583
  /** false = no header at all (no title, edit button, toggle or divider): the card is only the body, always open. */
@@ -16134,7 +16347,7 @@ export declare class PaymentSidePanelComponent {
16134
16347
  private readonly terminalAvailable;
16135
16348
  /** value -> label of every live method the rendered plugins contribute (the first plugin wins a duplicate value). */
16136
16349
  private readonly liveMethods;
16137
- protected readonly kind: import("@angular/core").Signal<"none" | "live" | "terminal" | "manual">;
16350
+ protected readonly kind: import("@angular/core").Signal<"none" | "manual" | "live" | "terminal">;
16138
16351
  private kindOf;
16139
16352
  /** 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. */
16140
16353
  readonly methodList: import("@angular/core").Signal<PaymentMethodOption[]>;