@forgeroute/ui 0.4.15 → 0.4.17

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.15",
3
+ "version": "0.4.17",
4
4
  "peerDependencies": {
5
5
  "@angular/common": ">=22.0.0",
6
6
  "@angular/core": ">=22.0.0",
@@ -398,6 +398,18 @@ export interface BulkActionEvent {
398
398
  value?: string;
399
399
  skippedCount: number;
400
400
  }
401
+ /** Emitted by (rowReorder) after the user moves a row (`reorderable`). */
402
+ export interface TableRowReorderEvent<T = any> {
403
+ /** The row that was moved. */
404
+ item: T;
405
+ /** Its index on the page before and after the move (0-based). */
406
+ from: number;
407
+ to: number;
408
+ /** The rows on the page in their new order. */
409
+ items: T[];
410
+ /** How many rows come before this page (0 on the first page), so `offset + to` is the row's position in the whole list. */
411
+ offset: number;
412
+ }
401
413
  export interface PageResponse<T> {
402
414
  content: T[];
403
415
  totalElements: number;
@@ -1213,6 +1225,12 @@ export declare class DataTableComponent<T extends Record<string, any>> implement
1213
1225
  readonly page: import("@angular/core").InputSignal<string>;
1214
1226
  /** Show column config + saved views toolbar. Defaults true. Set false to hide both. */
1215
1227
  readonly showToolbar: import("@angular/core").InputSignal<boolean>;
1228
+ /**
1229
+ * Show the More Actions menu in the toolbar (Import, Columns, Save/Saved Views and page-defined menu items). Defaults true.
1230
+ * Set false for a page that has nothing to offer there; Export, page-defined primary/secondary buttons and the search box
1231
+ * are unaffected. The table still hides the menu by itself when it is empty and unfiltered.
1232
+ */
1233
+ readonly showMoreActions: import("@angular/core").InputSignal<boolean>;
1216
1234
  /**
1217
1235
  * Show the search box above the table. Defaults true. Set false for small fixed tables where searching is meaningless
1218
1236
  * (a handful of summary rows). Quick-filter tabs and the toolbar are unaffected; when the search box, the tabs and the
@@ -1307,6 +1325,16 @@ export declare class DataTableComponent<T extends Record<string, any>> implement
1307
1325
  readonly bulkAction: import("@angular/core").OutputEmitterRef<BulkActionEvent>;
1308
1326
  /** Emitted after a built-in single-row delete completes successfully. */
1309
1327
  readonly rowDeleted: import("@angular/core").OutputEmitterRef<T>;
1328
+ /**
1329
+ * Optional drag-and-drop ordering of the rows. Off by default; when `true` (and the user has full access) every row gets a grip
1330
+ * (drag it, or focus it and use the arrow keys / Home / End; phone cards get Move up / Move down buttons). Reordering is only
1331
+ * offered while the list is in its stored order: with a sort, search, quick tab or column filter active the grips are disabled
1332
+ * (their tooltip says why), because the visible order is then not the stored one. The move is applied to the page on screen at
1333
+ * once and announced as `(rowReorder)`; the host saves it (a failed save should call `refresh()` to bring back the stored order).
1334
+ */
1335
+ readonly reorderable: import("@angular/core").InputSignal<boolean>;
1336
+ /** Emitted after the user moves a row: `items` is the page in its new order, `from` / `to` are page indexes, `offset` is the number of rows on earlier pages. */
1337
+ readonly rowReorder: import("@angular/core").OutputEmitterRef<TableRowReorderEvent<T>>;
1310
1338
  private readonly config;
1311
1339
  private readonly http;
1312
1340
  private readonly destroyRef;
@@ -1400,6 +1428,34 @@ export declare class DataTableComponent<T extends Record<string, any>> implement
1400
1428
  protected readonly _toolbarButtons: Signal<ToolbarAction[]>;
1401
1429
  /** True while the table is empty and unfiltered but the host kept a More Actions item (`keepWhenEmpty`) — the menu stays. */
1402
1430
  protected readonly _keepMoreActions: Signal<boolean>;
1431
+ /** The reorder column is part of the table (the grips may still be disabled, see `_reorderActive`). */
1432
+ protected readonly _reorderOn: Signal<boolean>;
1433
+ /** Moves are allowed: the list is in its stored order (no sort / search / tab / filter), loaded, and has more than one row. */
1434
+ protected readonly _reorderActive: Signal<boolean>;
1435
+ /** Why the grips are off: an active sort / search / tab / filter is the reason to name even when it left one row ("nothing to reorder" would hide it). */
1436
+ protected readonly _reorderHint: Signal<"Clear the sort, search and filters to change the order" | "There is nothing to reorder" | "Reordering is not available right now">;
1437
+ /** One id per table, so each grip can point to the instructions (aria-describedby) even with several tables on a page. */
1438
+ protected readonly _reorderHelpId: string;
1439
+ protected readonly _dragFrom: import("@angular/core").WritableSignal<number | null>;
1440
+ /** Key of the row being dragged: the index can go stale if the page reloads mid-drag, the key cannot. */
1441
+ private _dragKey;
1442
+ protected readonly _dragOver: import("@angular/core").WritableSignal<number | null>;
1443
+ /** Polite screen-reader message after a move. */
1444
+ protected readonly _reorderAnnouncement: import("@angular/core").WritableSignal<string>;
1445
+ private readonly _host;
1446
+ protected reorderLabel(item: T): string;
1447
+ protected onGripDragStart(e: DragEvent, index: number): void;
1448
+ protected onGripDragEnd(): void;
1449
+ protected onRowDragOver(e: DragEvent, index: number): void;
1450
+ protected onRowDrop(e: DragEvent, index: number): void;
1451
+ protected onGripKeydown(e: KeyboardEvent, index: number): void;
1452
+ /**
1453
+ * A Move up / Move down button (touch screens and phone cards). The pressed button can end up disabled (the row reached an end), and a
1454
+ * focused control that gets disabled drops focus to the page, so focus goes to the row's other Move button then.
1455
+ */
1456
+ protected moveByButton(index: number, direction: -1 | 1): void;
1457
+ /** Moves the row at `from` to `to` (both page indexes) in the table and tells the host. false = nothing changed. */
1458
+ protected moveRow(from: number, to: number): boolean;
1403
1459
  protected readonly _hasActiveFilters: Signal<boolean>;
1404
1460
  /** Host `params` with empty values dropped; equal by content so a new object with the same values doesn't reload. */
1405
1461
  protected readonly _extraParams: Signal<Record<string, string>>;
@@ -1455,7 +1511,7 @@ export declare class DataTableComponent<T extends Record<string, any>> implement
1455
1511
  */
1456
1512
  private readonly _rowNameSuffix;
1457
1513
  /** A row's accessible name: its name, plus the position among rows of the same name when that name repeats on the page. */
1458
- private rowAccessibleName;
1514
+ protected rowAccessibleName(item: T): string;
1459
1515
  /** "Select Acme Electric" — a row's selection checkbox name ("Select Acme Electric (2 of 3)" when the name repeats on the page). */
1460
1516
  protected selectRowLabel(item: T): string;
1461
1517
  /**
@@ -1699,6 +1755,11 @@ export declare class DataTableComponent<T extends Record<string, any>> implement
1699
1755
  "required": false;
1700
1756
  "isSignal": true;
1701
1757
  };
1758
+ "showMoreActions": {
1759
+ "alias": "showMoreActions";
1760
+ "required": false;
1761
+ "isSignal": true;
1762
+ };
1702
1763
  "showSearch": {
1703
1764
  "alias": "showSearch";
1704
1765
  "required": false;
@@ -1769,6 +1830,11 @@ export declare class DataTableComponent<T extends Record<string, any>> implement
1769
1830
  "required": false;
1770
1831
  "isSignal": true;
1771
1832
  };
1833
+ "reorderable": {
1834
+ "alias": "reorderable";
1835
+ "required": false;
1836
+ "isSignal": true;
1837
+ };
1772
1838
  }, {
1773
1839
  "rowClick": "rowClick";
1774
1840
  "linkClick": "linkClick";
@@ -1782,6 +1848,7 @@ export declare class DataTableComponent<T extends Record<string, any>> implement
1782
1848
  "tabChange": "tabChange";
1783
1849
  "bulkAction": "bulkAction";
1784
1850
  "rowDeleted": "rowDeleted";
1851
+ "rowReorder": "rowReorder";
1785
1852
  }, never, never, true, never>;
1786
1853
  }
1787
1854
  /**
@@ -1822,6 +1889,11 @@ export declare class SidePanelComponent implements OnDestroy {
1822
1889
  readonly cancelTestId: import("@angular/core").InputSignal<string>;
1823
1890
  /** `data-testid` of the primary footer button; none when empty (default). */
1824
1891
  readonly primaryTestId: import("@angular/core").InputSignal<string>;
1892
+ /**
1893
+ * Element that gets focus back when the panel closes. Takes precedence over the element that was focused (or last
1894
+ * clicked / activated) when it opened; used only if it is still in the page and visible. Default null = the opener.
1895
+ */
1896
+ readonly returnFocusTo: import("@angular/core").InputSignal<HTMLElement | null>;
1825
1897
  readonly closed: import("@angular/core").OutputEmitterRef<void>;
1826
1898
  readonly primaryClick: import("@angular/core").OutputEmitterRef<void>;
1827
1899
  protected readonly titleId: string;
@@ -1831,8 +1903,12 @@ export declare class SidePanelComponent implements OnDestroy {
1831
1903
  private _prevFocus;
1832
1904
  private _scrollLocked;
1833
1905
  private _stopViewport;
1906
+ private _stopIframeKeys;
1907
+ private readonly _interaction;
1834
1908
  constructor();
1835
1909
  onKeydown(event: KeyboardEvent): void;
1910
+ /** A focus-guard sentinel received focus (Tab left the panel's tab order, e.g. out of an iframe): send it back inside. */
1911
+ protected onGuardFocus(which: 'start' | 'end', event?: FocusEvent): void;
1836
1912
  /** Initial focus — see `focusInitial` (autofocus target → first usable field → dialog container). */
1837
1913
  private _focusFirst;
1838
1914
  private _focusable;
@@ -1899,6 +1975,11 @@ export declare class SidePanelComponent implements OnDestroy {
1899
1975
  "required": false;
1900
1976
  "isSignal": true;
1901
1977
  };
1978
+ "returnFocusTo": {
1979
+ "alias": "returnFocusTo";
1980
+ "required": false;
1981
+ "isSignal": true;
1982
+ };
1902
1983
  }, {
1903
1984
  "closed": "closed";
1904
1985
  "primaryClick": "primaryClick";
@@ -1909,7 +1990,7 @@ export declare class ModalComponent implements OnInit, OnDestroy {
1909
1990
  readonly title: import("@angular/core").InputSignal<string>;
1910
1991
  readonly description: import("@angular/core").InputSignal<string>;
1911
1992
  readonly maxWidth: import("@angular/core").InputSignal<string>;
1912
- readonly bodyOverflow: import("@angular/core").InputSignal<"hidden" | "auto" | "visible">;
1993
+ readonly bodyOverflow: import("@angular/core").InputSignal<"auto" | "visible" | "hidden">;
1913
1994
  /** `data-testid` of the dialog element itself (the host `<ui-modal>` is always in the page, the dialog only while open). None when empty. */
1914
1995
  readonly dialogTestId: import("@angular/core").InputSignal<string>;
1915
1996
  /** Hides the header X button (e.g. while a request is running). Escape and a backdrop click still close unless `closable` is false. */
@@ -1920,6 +2001,11 @@ export declare class ModalComponent implements OnInit, OnDestroy {
1920
2001
  */
1921
2002
  readonly closable: import("@angular/core").InputSignal<boolean>;
1922
2003
  readonly close: import("@angular/core").OutputEmitterRef<void>;
2004
+ /**
2005
+ * Element that gets focus back when the dialog closes. Takes precedence over the element that was focused (or last
2006
+ * clicked / activated) when it opened; used only if it is still in the page and visible. Default null = the opener.
2007
+ */
2008
+ readonly returnFocusTo: import("@angular/core").InputSignal<HTMLElement | null>;
1923
2009
  protected readonly titleId: string;
1924
2010
  private readonly el;
1925
2011
  private readonly ren;
@@ -1928,8 +2014,12 @@ export declare class ModalComponent implements OnInit, OnDestroy {
1928
2014
  private _prevFocus;
1929
2015
  private _scrollLocked;
1930
2016
  private _stopViewport;
2017
+ private _stopIframeKeys;
2018
+ private readonly _interaction;
1931
2019
  constructor();
1932
2020
  onKeydown(event: KeyboardEvent): void;
2021
+ /** A focus-guard sentinel received focus (Tab left the dialog's tab order, e.g. out of an iframe): send it back inside. */
2022
+ protected onGuardFocus(which: 'start' | 'end', event?: FocusEvent): void;
1933
2023
  /** Initial focus — see `focusInitial` (autofocus target → first usable field → dialog container). */
1934
2024
  private _focusFirst;
1935
2025
  private _focusable;
@@ -1977,6 +2067,11 @@ export declare class ModalComponent implements OnInit, OnDestroy {
1977
2067
  "required": false;
1978
2068
  "isSignal": true;
1979
2069
  };
2070
+ "returnFocusTo": {
2071
+ "alias": "returnFocusTo";
2072
+ "required": false;
2073
+ "isSignal": true;
2074
+ };
1980
2075
  }, {
1981
2076
  "close": "close";
1982
2077
  }, never, ["*", "[modal-footer-left]", "[modal-footer-center]", "[modal-footer-right]"], true, never>;
@@ -2279,7 +2374,7 @@ export declare class AudioPlayerComponent {
2279
2374
  /** Accessible name of the player. */
2280
2375
  readonly ariaLabel: import("@angular/core").InputSignal<string>;
2281
2376
  /** How much to load before play: 'metadata' (default), 'auto' or 'none'. */
2282
- readonly preload: import("@angular/core").InputSignal<"none" | "metadata" | "auto">;
2377
+ readonly preload: import("@angular/core").InputSignal<"auto" | "none" | "metadata">;
2283
2378
  /** Fires when the browser can't load or decode the source. */
2284
2379
  readonly playbackError: import("@angular/core").OutputEmitterRef<void>;
2285
2380
  protected readonly failed: import("@angular/core").WritableSignal<boolean>;
@@ -2529,7 +2624,7 @@ export declare class CheckboxComponent implements ControlValueAccessor, Validato
2529
2624
  * 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.
2530
2625
  * Default null: plain label text, exactly as before. Single mode only.
2531
2626
  */
2532
- readonly headingLevel: import("@angular/core").InputSignal<3 | 1 | 2 | 5 | 6 | 4 | null>;
2627
+ readonly headingLevel: import("@angular/core").InputSignal<5 | 3 | 1 | 2 | 4 | 6 | null>;
2533
2628
  readonly indeterminate: import("@angular/core").InputSignal<boolean>;
2534
2629
  readonly checked: import("@angular/core").ModelSignal<boolean>;
2535
2630
  /**
@@ -2742,7 +2837,7 @@ export declare class CheckboxTrailingDirective {
2742
2837
  *
2743
2838
  * Built on a native `<input type="checkbox" role="switch">`, so Space toggles it, it is focusable, and a screen reader
2744
2839
  * announces it as a switch (on / off). The label and hint name and describe it. `disabled` (input or form control) dims it
2745
- * and blocks changes. On touch devices and phones the switch has a >= 44px hit area.
2840
+ * and blocks changes. `ariaDescribedBy` adds the id of a description rendered elsewhere. On touch devices and phones the switch has a >= 44px hit area.
2746
2841
  */
2747
2842
  export declare class ToggleComponent implements ControlValueAccessor {
2748
2843
  /** Bold line on the left. */
@@ -2751,6 +2846,8 @@ export declare class ToggleComponent implements ControlValueAccessor {
2751
2846
  readonly hint: import("@angular/core").InputSignal<string>;
2752
2847
  /** Accessible name when there is no visible `label`. */
2753
2848
  readonly ariaLabel: import("@angular/core").InputSignal<string>;
2849
+ /** Id of another element that describes the switch (e.g. a description rendered elsewhere); announced after the hint. Absent when empty. */
2850
+ readonly ariaDescribedBy: import("@angular/core").InputSignal<string>;
2754
2851
  /** Whether the switch is on. Two-way: `[(checked)]`. */
2755
2852
  readonly checked: import("@angular/core").ModelSignal<boolean>;
2756
2853
  /** Public so a host template can bind `[disabled]` (a protected input fails strict template type-checking, TS2445). */
@@ -2761,6 +2858,8 @@ export declare class ToggleComponent implements ControlValueAccessor {
2761
2858
  protected readonly _inputId: string;
2762
2859
  protected readonly _labelId: string;
2763
2860
  protected readonly _hintId: string;
2861
+ /** The hint's id (when there is a hint) followed by the host's `ariaDescribedBy`; null when neither exists. */
2862
+ protected readonly _describedBy: import("@angular/core").Signal<string | null>;
2764
2863
  private _onChange;
2765
2864
  private _onTouched;
2766
2865
  writeValue(val: boolean): void;
@@ -2786,6 +2885,11 @@ export declare class ToggleComponent implements ControlValueAccessor {
2786
2885
  "required": false;
2787
2886
  "isSignal": true;
2788
2887
  };
2888
+ "ariaDescribedBy": {
2889
+ "alias": "ariaDescribedBy";
2890
+ "required": false;
2891
+ "isSignal": true;
2892
+ };
2789
2893
  "checked": {
2790
2894
  "alias": "checked";
2791
2895
  "required": false;
@@ -3524,7 +3628,7 @@ export declare class ButtonComponent {
3524
3628
  * `ghost-start`: a ghost button for list / section toggles - a full-width row with its content aligned to the start, transparent
3525
3629
  * background, hover tint and the normal focus ring. Pair it with `ariaExpanded` / `ariaPressed`; the label may contain a heading element.
3526
3630
  */
3527
- readonly variant: import("@angular/core").InputSignal<"link" | "primary" | "secondary" | "danger" | "warning" | "ghost" | "ghost-start" | "tab" | "icon" | "icon-danger">;
3631
+ readonly variant: import("@angular/core").InputSignal<"primary" | "danger" | "warning" | "link" | "secondary" | "ghost" | "ghost-start" | "tab" | "icon" | "icon-danger">;
3528
3632
  /** 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`). */
3529
3633
  readonly routerLink: import("@angular/core").InputSignal<string | readonly unknown[] | null>;
3530
3634
  /** Query params of the `routerLink` (e.g. `{ section: 'deal-defaults' }`). */
@@ -3570,7 +3674,7 @@ export declare class ButtonComponent {
3570
3674
  readonly color: import("@angular/core").InputSignal<string | undefined>;
3571
3675
  readonly active: import("@angular/core").InputSignal<boolean>;
3572
3676
  readonly size: import("@angular/core").InputSignal<"sm" | "md" | "lg" | "xs">;
3573
- readonly type: import("@angular/core").InputSignal<"button" | "reset" | "submit">;
3677
+ readonly type: import("@angular/core").InputSignal<"button" | "submit" | "reset">;
3574
3678
  readonly disabled: import("@angular/core").InputSignal<boolean>;
3575
3679
  readonly loading: import("@angular/core").InputSignal<boolean>;
3576
3680
  readonly fullWidth: import("@angular/core").InputSignal<boolean>;
@@ -3965,7 +4069,7 @@ export declare class BulkMessagePanelComponent {
3965
4069
  readonly sending: import("@angular/core").InputSignal<boolean>;
3966
4070
  readonly closed: import("@angular/core").OutputEmitterRef<void>;
3967
4071
  readonly send: import("@angular/core").OutputEmitterRef<BulkMessageSendEvent>;
3968
- readonly channel: import("@angular/core").WritableSignal<"text" | "email">;
4072
+ readonly channel: import("@angular/core").WritableSignal<"email" | "text">;
3969
4073
  private readonly _subject;
3970
4074
  private readonly _body;
3971
4075
  get subject(): string;
@@ -4103,6 +4207,54 @@ export declare class ErrorStateComponent {
4103
4207
  "retry": "retry";
4104
4208
  }, never, never, true, never>;
4105
4209
  }
4210
+ /** One password rule: `test` decides whether the typed password satisfies it. */
4211
+ export interface PasswordRule {
4212
+ id: string;
4213
+ label: string;
4214
+ test: (password: string) => boolean;
4215
+ }
4216
+ /** The default rules (same as the backends): 8+ characters, an uppercase letter, a lowercase letter, a digit and a special character. */
4217
+ export declare const DEFAULT_PASSWORD_RULES: readonly PasswordRule[];
4218
+ /** True when the password satisfies every rule (default: {@link DEFAULT_PASSWORD_RULES}). Use it to gate Save. */
4219
+ export declare function passwordMeetsRules(password: string, rules?: readonly PasswordRule[]): boolean;
4220
+ /**
4221
+ * The password requirements checklist. Pass the typed password; each rule shows as a row that turns green with a check mark once it is
4222
+ * satisfied, and stays grey with an empty circle until then. There is no "(met)" text: the state is also in `data-met` and in
4223
+ * visually hidden text for screen readers, so it is not colour alone.
4224
+ *
4225
+ * Also available as `<ui-text-input type="password" [passwordRequirements]="true">`, which shows this list under the field.
4226
+ */
4227
+ export declare class PasswordRequirementsComponent {
4228
+ /** The password to check. */
4229
+ readonly value: import("@angular/core").InputSignal<string>;
4230
+ /** Rules to show; default {@link DEFAULT_PASSWORD_RULES}. */
4231
+ readonly rules: import("@angular/core").InputSignal<readonly PasswordRule[]>;
4232
+ readonly title: import("@angular/core").InputSignal<string>;
4233
+ protected readonly _check: string;
4234
+ protected readonly _results: import("@angular/core").Signal<{
4235
+ id: string;
4236
+ label: string;
4237
+ met: boolean;
4238
+ }[]>;
4239
+ static ɵfac: i0.ɵɵFactoryDeclaration<PasswordRequirementsComponent, never>;
4240
+ static ɵcmp: i0.ɵɵComponentDeclaration<PasswordRequirementsComponent, "ui-password-requirements", never, {
4241
+ "value": {
4242
+ "alias": "value";
4243
+ "required": false;
4244
+ "isSignal": true;
4245
+ };
4246
+ "rules": {
4247
+ "alias": "rules";
4248
+ "required": false;
4249
+ "isSignal": true;
4250
+ };
4251
+ "title": {
4252
+ "alias": "title";
4253
+ "required": false;
4254
+ "isSignal": true;
4255
+ };
4256
+ }, {}, never, never, true, never>;
4257
+ }
4106
4258
  export declare class TextInputComponent implements ControlValueAccessor, Validator, UiFieldValidity {
4107
4259
  readonly label: import("@angular/core").InputSignal<string>;
4108
4260
  /** Accessible name for a field with no visible label (e.g. an inline cell or title input). */
@@ -4114,7 +4266,19 @@ export declare class TextInputComponent implements ControlValueAccessor, Validat
4114
4266
  * Meant for a short mark of 1-3 characters.
4115
4267
  */
4116
4268
  readonly prefix: import("@angular/core").InputSignal<string>;
4117
- readonly type: import("@angular/core").InputSignal<"number" | "text" | "email" | "tel" | "password" | "url">;
4269
+ /**
4270
+ * `type="password"` only: puts an eye button inside the field, at its right end, that shows / hides the typed text (the eye with a slash
4271
+ * means "hidden again"). Per field, starts hidden; the button is a toggle (`aria-pressed`) named "Show password". Ignored for other types.
4272
+ */
4273
+ readonly revealable: import("@angular/core").InputSignal<boolean>;
4274
+ /**
4275
+ * `type="password"` only: shows the password requirements checklist under the field (`ui-password-requirements`) once the user has typed
4276
+ * (it hides again when the host clears the field, e.g. after a successful change). Each rule turns green with a check when satisfied. Off by default; ignored for other types.
4277
+ */
4278
+ readonly passwordRequirements: import("@angular/core").InputSignal<boolean>;
4279
+ /** Rules for `passwordRequirements`; default = the library's five rules (8+ characters, upper, lower, digit, special). */
4280
+ readonly passwordRules: import("@angular/core").InputSignal<readonly PasswordRule[] | undefined>;
4281
+ readonly type: import("@angular/core").InputSignal<"number" | "email" | "text" | "tel" | "password" | "url">;
4118
4282
  readonly maxlength: import("@angular/core").InputSignal<number | undefined>;
4119
4283
  readonly required: import("@angular/core").InputSignal<boolean>;
4120
4284
  readonly autocomplete: import("@angular/core").InputSignal<string>;
@@ -4123,7 +4287,7 @@ export declare class TextInputComponent implements ControlValueAccessor, Validat
4123
4287
  * `search`, `text`, `none`). Empty (default) = the browser's default for the field, except `type="tel"`, which keeps `tel`.
4124
4288
  * It only picks the keyboard; it does not restrict what can be typed or pasted.
4125
4289
  */
4126
- readonly inputmode: import("@angular/core").InputSignal<"" | "none" | "text" | "search" | "email" | "tel" | "url" | "decimal" | "numeric">;
4290
+ readonly inputmode: import("@angular/core").InputSignal<"" | "email" | "text" | "none" | "search" | "tel" | "url" | "decimal" | "numeric">;
4127
4291
  readonly readonly: import("@angular/core").InputSignal<boolean>;
4128
4292
  readonly hint: import("@angular/core").InputSignal<string>;
4129
4293
  readonly error: import("@angular/core").InputSignal<string>;
@@ -4185,6 +4349,17 @@ export declare class TextInputComponent implements ControlValueAccessor, Validat
4185
4349
  private readonly _numeric;
4186
4350
  /** The native `step` attribute: only for `type="number"` and only for a finite number above 0; otherwise none (the browser's step of 1). */
4187
4351
  protected readonly _stepAttr: import("@angular/core").Signal<string | null>;
4352
+ protected readonly _revealable: import("@angular/core").Signal<boolean>;
4353
+ protected readonly _shown: import("@angular/core").WritableSignal<boolean>;
4354
+ protected readonly _inputType: import("@angular/core").Signal<"number" | "email" | "text" | "tel" | "password" | "url">;
4355
+ protected readonly _eyePath: string;
4356
+ protected readonly _eyeOffPath: string;
4357
+ protected readonly _showRequirements: import("@angular/core").Signal<boolean>;
4358
+ /** `aria-describedby`: the error / hint text and, while the requirements checklist is shown, the checklist (so a screen reader reads the rules with the field). */
4359
+ protected readonly _describedBy: import("@angular/core").Signal<string | null>;
4360
+ /** True once the user typed in the field; a host-written empty value (a form reset) puts it back to false. */
4361
+ private readonly _typed;
4362
+ protected readonly _defaultRules: readonly PasswordRule[];
4188
4363
  private _warned;
4189
4364
  private readonly _formatting;
4190
4365
  private readonly _issue;
@@ -4239,6 +4414,21 @@ export declare class TextInputComponent implements ControlValueAccessor, Validat
4239
4414
  "required": false;
4240
4415
  "isSignal": true;
4241
4416
  };
4417
+ "revealable": {
4418
+ "alias": "revealable";
4419
+ "required": false;
4420
+ "isSignal": true;
4421
+ };
4422
+ "passwordRequirements": {
4423
+ "alias": "passwordRequirements";
4424
+ "required": false;
4425
+ "isSignal": true;
4426
+ };
4427
+ "passwordRules": {
4428
+ "alias": "passwordRules";
4429
+ "required": false;
4430
+ "isSignal": true;
4431
+ };
4242
4432
  "type": {
4243
4433
  "alias": "type";
4244
4434
  "required": false;
@@ -6734,7 +6924,7 @@ export declare class AlertComponent {
6734
6924
  /** The SVG path (24×24 stroke icon) for an icon key, or undefined when the key is unknown. */
6735
6925
  export declare function iconPath(name: string): string | undefined;
6736
6926
  /** Keys with an icon of their own (the data-table action keys are accepted too — see `builtInActionIcon`). */
6737
- 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' | 'edit' | 'delete' | 'download' | 'duplicate' | 'archive' | 'restore' | 'share' | 'email' | 'message' | 'call';
6927
+ 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';
6738
6928
  /**
6739
6929
  * A clickable icon. The host passes a key (`name="delete"`) and the library draws that icon; clicking it emits
6740
6930
  * `iconClick`, and the host does the actual work (delete the row, open a panel, …).
@@ -7470,7 +7660,9 @@ export interface DateRange {
7470
7660
  }
7471
7661
  /**
7472
7662
  * Date range picker: preset pills (Today … Year to Date, optional All Time, Custom Range) plus
7473
- * From / To date inputs with an Apply button for the custom range. Emits `rangeChange` with the
7663
+ * From / To date inputs with an Apply button for the custom range. With the presets shown, the custom range opens in a
7664
+ * popover card under the pills (right-aligned, closes on Apply / Escape / outside click; picking Custom Range again
7665
+ * reopens it); with `showPresets` false the From / To row is rendered inline. Emits `rangeChange` with the
7474
7666
  * resolved ISO dates whenever a preset is picked or a custom range is applied.
7475
7667
  *
7476
7668
  * <ui-date-range-picker [activePreset]="preset()" [includeAllTime]="true" (rangeChange)="onRange($event)" />
@@ -7486,9 +7678,19 @@ export declare class DateRangePickerComponent {
7486
7678
  readonly rangeChange: import("@angular/core").OutputEmitterRef<DateRange>;
7487
7679
  /** Follows `activePreset` from the host, and the user's own picks in between. */
7488
7680
  protected readonly selectedPreset: import("@angular/core").WritableSignal<DatePreset>;
7681
+ /** The popover was closed (Apply / Escape / outside click); any preset change reopens it. */
7682
+ private readonly popoverDismissed;
7683
+ protected readonly popoverVisible: import("@angular/core").Signal<boolean>;
7684
+ protected readonly popTop: import("@angular/core").WritableSignal<number>;
7685
+ protected readonly popRight: import("@angular/core").WritableSignal<number>;
7686
+ private readonly host;
7489
7687
  protected readonly customStart: import("@angular/core").WritableSignal<string>;
7490
7688
  protected readonly customEnd: import("@angular/core").WritableSignal<string>;
7491
7689
  protected readonly presetTabs: import("@angular/core").Signal<PillTab[]>;
7690
+ constructor();
7691
+ private place;
7692
+ protected onDocumentClick(e: Event): void;
7693
+ protected onEscape(e: Event): void;
7492
7694
  selectPreset(key: DatePreset): void;
7493
7695
  applyCustom(): void;
7494
7696
  static ɵfac: i0.ɵɵFactoryDeclaration<DateRangePickerComponent, never>;
@@ -8281,7 +8483,7 @@ export declare class DetailCardComponent {
8281
8483
  /** true (default) = the title is displayed in capitals (CSS only); false = shown as written. The text, aria-label and heading name are never changed. */
8282
8484
  readonly uppercaseTitle: import("@angular/core").InputSignal<boolean>;
8283
8485
  /** 1-6 makes the title a real heading for screen readers (role=heading, aria-level); null keeps it plain text. */
8284
- readonly headingLevel: import("@angular/core").InputSignal<3 | 1 | 2 | 5 | 6 | 4 | null>;
8486
+ readonly headingLevel: import("@angular/core").InputSignal<5 | 3 | 1 | 2 | 4 | 6 | null>;
8285
8487
  /** Optional id for the title text; the card is then labelled by it. Without it the title is the card's aria-label. */
8286
8488
  readonly titleId: import("@angular/core").InputSignal<string>;
8287
8489
  /** Accessible name of the card when the header gives none (no header, or no title). A visible title wins; blank = no name. */