@eagami/ui 5.12.1 → 5.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eagami/ui",
3
- "version": "5.12.1",
3
+ "version": "5.13.0",
4
4
  "description": "Lightweight, accessible, themeable Angular UI component library and icon set built on CSS custom properties",
5
5
  "author": "Michal Wiraszka <michal@eagami.com>",
6
6
  "license": "MIT",
@@ -1,5 +1,5 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { InjectionToken, EnvironmentProviders, Signal, Type, OnDestroy, ElementRef, TemplateRef, OnInit } from '@angular/core';
2
+ import { InjectionToken, EnvironmentProviders, Signal, Type, OnDestroy, ElementRef, TemplateRef, AfterContentChecked, OnInit } from '@angular/core';
3
3
  import * as _eagami_ui from '@eagami/ui';
4
4
  import { ControlValueAccessor } from '@angular/forms';
5
5
 
@@ -168,6 +168,7 @@ interface EagamiMessages {
168
168
  range: (start: string, end: string, total: string) => string;
169
169
  previousPage: string;
170
170
  nextPage: string;
171
+ page: (page: string) => string;
171
172
  };
172
173
  progressBar: {
173
174
  label: string;
@@ -220,6 +221,7 @@ interface EagamiMessages {
220
221
  moveSelectedToSource: string;
221
222
  moveAllToSource: string;
222
223
  empty: string;
224
+ moved: (count: string, listLabel: string) => string;
223
225
  };
224
226
  validation: {
225
227
  required: string;
@@ -1195,6 +1197,11 @@ declare class CommandPaletteComponent {
1195
1197
  protected onQueryInput(event: Event): void;
1196
1198
  protected clearQuery(): void;
1197
1199
  protected onSearchKeydown(event: KeyboardEvent): void;
1200
+ /** Wrapping arrow-key move that skips disabled items. */
1201
+ private moveActive;
1202
+ /** Home/End move to the first enabled item from the given end. */
1203
+ private edgeActive;
1204
+ private setActiveByKeyboard;
1198
1205
  protected onItemClick(item: CommandPaletteItem): void;
1199
1206
  protected onItemMouseEnter(flatIndex: number): void;
1200
1207
  protected onListMouseLeave(): void;
@@ -1424,6 +1431,10 @@ declare class DataTableComponent<T = Record<string, unknown>> {
1424
1431
  private static readonly PAGE_JUMP;
1425
1432
  readonly columns: _angular_core.InputSignal<DataTableColumn<T>[]>;
1426
1433
  readonly data: _angular_core.InputSignal<T[]>;
1434
+ /** Accessible name for the table, announced when it takes focus as a grid. */
1435
+ readonly ariaLabel: _angular_core.InputSignal<string | undefined>;
1436
+ /** Visible caption rendered above the table; also names it for assistive technology. */
1437
+ readonly caption: _angular_core.InputSignal<string | undefined>;
1427
1438
  readonly trackBy: _angular_core.InputSignal<keyof T | undefined>;
1428
1439
  readonly density: _angular_core.InputSignal<DataTableDensity>;
1429
1440
  /** Visual size of the table; density paddings and icons scale with it. */
@@ -1468,7 +1479,7 @@ declare class DataTableComponent<T = Record<string, unknown>> {
1468
1479
  onGridKeydown(event: KeyboardEvent): void;
1469
1480
  private focusCell;
1470
1481
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DataTableComponent<any>, never>;
1471
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DataTableComponent<any>, "ea-data-table", never, { "columns": { "alias": "columns"; "required": true; "isSignal": true; }; "data": { "alias": "data"; "required": true; "isSignal": true; }; "trackBy": { "alias": "trackBy"; "required": false; "isSignal": true; }; "density": { "alias": "density"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "stickyHeader": { "alias": "stickyHeader"; "required": false; "isSignal": true; }; "striped": { "alias": "striped"; "required": false; "isSignal": true; }; "hoverable": { "alias": "hoverable"; "required": false; "isSignal": true; }; "bordered": { "alias": "bordered"; "required": false; "isSignal": true; }; "noDataText": { "alias": "noDataText"; "required": false; "isSignal": true; }; "navigable": { "alias": "navigable"; "required": false; "isSignal": true; }; "clickable": { "alias": "clickable"; "required": false; "isSignal": true; }; "sort": { "alias": "sort"; "required": false; "isSignal": true; }; }, { "sort": "sortChange"; "sorted": "sorted"; "rowActivate": "rowActivate"; }, ["noDataTemplate"], ["ea-paginator"], true, never>;
1482
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DataTableComponent<any>, "ea-data-table", never, { "columns": { "alias": "columns"; "required": true; "isSignal": true; }; "data": { "alias": "data"; "required": true; "isSignal": true; }; "ariaLabel": { "alias": "aria-label"; "required": false; "isSignal": true; }; "caption": { "alias": "caption"; "required": false; "isSignal": true; }; "trackBy": { "alias": "trackBy"; "required": false; "isSignal": true; }; "density": { "alias": "density"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "stickyHeader": { "alias": "stickyHeader"; "required": false; "isSignal": true; }; "striped": { "alias": "striped"; "required": false; "isSignal": true; }; "hoverable": { "alias": "hoverable"; "required": false; "isSignal": true; }; "bordered": { "alias": "bordered"; "required": false; "isSignal": true; }; "noDataText": { "alias": "noDataText"; "required": false; "isSignal": true; }; "navigable": { "alias": "navigable"; "required": false; "isSignal": true; }; "clickable": { "alias": "clickable"; "required": false; "isSignal": true; }; "sort": { "alias": "sort"; "required": false; "isSignal": true; }; }, { "sort": "sortChange"; "sorted": "sorted"; "rowActivate": "rowActivate"; }, ["noDataTemplate"], ["ea-paginator"], true, never>;
1472
1483
  }
1473
1484
 
1474
1485
  /** Visual size of each digit cell. */
@@ -1663,8 +1674,9 @@ type DialogWidth = EaWidth;
1663
1674
  * and exposes `header`, default, and `footer` content slots. The `open` state
1664
1675
  * is a two-way `model()` binding.
1665
1676
  */
1666
- declare class DialogComponent {
1677
+ declare class DialogComponent implements AfterContentChecked {
1667
1678
  private readonly dialogEl;
1679
+ private readonly headerEl;
1668
1680
  private previouslyFocused;
1669
1681
  protected readonly i18n: EagamiI18nService;
1670
1682
  private readonly isBrowser;
@@ -1682,6 +1694,9 @@ declare class DialogComponent {
1682
1694
  readonly panelClasses: _angular_core.Signal<{
1683
1695
  [x: string]: boolean;
1684
1696
  }>;
1697
+ /** Whether the header slot received content, so labelledby never points at an empty node. */
1698
+ protected readonly hasHeader: _angular_core.WritableSignal<boolean>;
1699
+ ngAfterContentChecked(): void;
1685
1700
  constructor();
1686
1701
  handleClose(): void;
1687
1702
  handleBackdropClick(event: MouseEvent): void;
@@ -1739,9 +1754,10 @@ type DrawerAnimation = 'none' | 'linear' | 'eased';
1739
1754
  * slots. The `open` state is a two-way `model()` binding. In `push` mode it
1740
1755
  * opens non-modally and reflows the page content aside instead of overlaying it.
1741
1756
  */
1742
- declare class DrawerComponent {
1757
+ declare class DrawerComponent implements AfterContentChecked {
1743
1758
  private readonly drawerEl;
1744
1759
  private readonly panelEl;
1760
+ private readonly headerEl;
1745
1761
  private previouslyFocused;
1746
1762
  private pushedTarget;
1747
1763
  private pushCleanupTimer;
@@ -1785,6 +1801,9 @@ declare class DrawerComponent {
1785
1801
  readonly panelClasses: _angular_core.Signal<{
1786
1802
  [x: string]: boolean;
1787
1803
  }>;
1804
+ /** Whether the header slot received content, so labelledby never points at an empty node. */
1805
+ protected readonly hasHeader: _angular_core.WritableSignal<boolean>;
1806
+ ngAfterContentChecked(): void;
1788
1807
  constructor();
1789
1808
  private showDialog;
1790
1809
  private enter;
@@ -1879,6 +1898,8 @@ declare class DropdownComponent implements ControlValueAccessor {
1879
1898
  handleKeydown(event: KeyboardEvent): void;
1880
1899
  private selectFocusedOrOpen;
1881
1900
  private focusEdge;
1901
+ /** Keeps the keyboard-focused option visible inside the scrolling listbox. */
1902
+ private setFocusedIndex;
1882
1903
  private handleTypeahead;
1883
1904
  private moveFocus;
1884
1905
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DropdownComponent, never>;
@@ -2135,6 +2156,8 @@ declare class InputComponent implements ControlValueAccessor {
2135
2156
  protected readonly i18n: EagamiI18nService;
2136
2157
  /** Text label rendered above the field. */
2137
2158
  readonly label: _angular_core.InputSignal<string | undefined>;
2159
+ /** Accessible name for the control when no visible `label` is set. */
2160
+ readonly ariaLabel: _angular_core.InputSignal<string | undefined>;
2138
2161
  /** Native input type; `password` adds a built-in show/hide toggle. */
2139
2162
  readonly type: _angular_core.InputSignal<InputType>;
2140
2163
  /** Placeholder shown while the field is empty. */
@@ -2227,7 +2250,7 @@ declare class InputComponent implements ControlValueAccessor {
2227
2250
  /** Moves keyboard focus to the underlying native input element. */
2228
2251
  focus(): void;
2229
2252
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<InputComponent, never>;
2230
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<InputComponent, "ea-input", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "errorMsg": { "alias": "errorMsg"; "required": false; "isSignal": true; }; "errorMessages": { "alias": "errorMessages"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "autocomplete": { "alias": "autocomplete"; "required": false; "isSignal": true; }; "list": { "alias": "list"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; "maxLength": { "alias": "maxLength"; "required": false; "isSignal": true; }; "minLength": { "alias": "minLength"; "required": false; "isSignal": true; }; "autofocus": { "alias": "autofocus"; "required": false; "isSignal": true; }; "showPasswordToggle": { "alias": "showPasswordToggle"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "focused": "focused"; "blurred": "blurred"; }, never, ["[slot=prefix]", "[slot=suffix]"], true, never>;
2253
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<InputComponent, "ea-input", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "aria-label"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "errorMsg": { "alias": "errorMsg"; "required": false; "isSignal": true; }; "errorMessages": { "alias": "errorMessages"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "autocomplete": { "alias": "autocomplete"; "required": false; "isSignal": true; }; "list": { "alias": "list"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; "maxLength": { "alias": "maxLength"; "required": false; "isSignal": true; }; "minLength": { "alias": "minLength"; "required": false; "isSignal": true; }; "autofocus": { "alias": "autofocus"; "required": false; "isSignal": true; }; "showPasswordToggle": { "alias": "showPasswordToggle"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "focused": "focused"; "blurred": "blurred"; }, never, ["[slot=prefix]", "[slot=suffix]"], true, never>;
2231
2254
  }
2232
2255
 
2233
2256
  /** Placement of the menu list relative to its trigger. */
@@ -2323,7 +2346,9 @@ declare class MenuItemComponent {
2323
2346
  */
2324
2347
  declare class MenuTriggerDirective {
2325
2348
  private readonly el;
2349
+ private readonly renderer;
2326
2350
  readonly menu: _angular_core.InputSignal<MenuComponent>;
2351
+ constructor();
2327
2352
  handleClick(): void;
2328
2353
  handleKeydown(event: KeyboardEvent): void;
2329
2354
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<MenuTriggerDirective, never>;
@@ -2391,6 +2416,12 @@ declare class MultiSelectComponent implements ControlValueAccessor {
2391
2416
  readonly selectedOptions: _angular_core.Signal<readonly SelectOption[]>;
2392
2417
  readonly hasValue: _angular_core.Signal<boolean>;
2393
2418
  readonly listboxId: _angular_core.Signal<string>;
2419
+ /** Whether the Select-all row renders as the first option in the listbox. */
2420
+ protected readonly selectAllVisible: _angular_core.Signal<boolean>;
2421
+ /** Row-index offset the Select-all row adds ahead of the filtered options. */
2422
+ protected readonly selectAllOffset: _angular_core.Signal<1 | 0>;
2423
+ private readonly rowCount;
2424
+ protected readonly selectAllAriaChecked: _angular_core.Signal<"true" | "mixed" | "false">;
2394
2425
  /** Id of the keyboard-focused option, for `aria-activedescendant`. */
2395
2426
  readonly activeOptionId: _angular_core.Signal<string | null>;
2396
2427
  /** Chips visible inside the trigger, capped by `maxVisibleChips`. */
@@ -2424,7 +2455,16 @@ declare class MultiSelectComponent implements ControlValueAccessor {
2424
2455
  onPopoverCloseRequested(): void;
2425
2456
  /** Toggle one option's membership in the selection. */
2426
2457
  toggleOption(opt: SelectOption): void;
2458
+ /**
2459
+ * Clicks on the bordered box (trigger, padding, chevron) all toggle; the
2460
+ * clear button and chip remove buttons stop propagation before reaching
2461
+ * here. The combobox element only takes focus natively when clicked
2462
+ * directly, so focus is restored explicitly for the activedescendant model.
2463
+ */
2464
+ protected onTriggerAreaClick(): void;
2427
2465
  protected onOptionClick(opt: SelectOption, index: number): void;
2466
+ protected onSelectAllClick(): void;
2467
+ private restoreTypingFocus;
2428
2468
  /**
2429
2469
  * Remove a single chip from the trigger. `<ea-tag>` already stops the
2430
2470
  * click from bubbling to the trigger's `(click)`, so no event handling
@@ -2448,6 +2488,9 @@ declare class MultiSelectComponent implements ControlValueAccessor {
2448
2488
  */
2449
2489
  handlePopoverKeydown(event: KeyboardEvent): void;
2450
2490
  private focusSearchWhenReady;
2491
+ private moveFocusedRow;
2492
+ /** Enter/Space on the focused row: row 0 is Select-all when visible. */
2493
+ private activateRow;
2451
2494
  /** Reorder a value-set against the input `options` array. */
2452
2495
  private orderedValues;
2453
2496
  private resetEditState;
@@ -2515,6 +2558,7 @@ declare class NumberInputComponent implements ControlValueAccessor {
2515
2558
  private readonly errorState;
2516
2559
  readonly errorText: _angular_core.Signal<string | null>;
2517
2560
  readonly hasError: _angular_core.Signal<boolean>;
2561
+ readonly showError: _angular_core.Signal<boolean>;
2518
2562
  readonly showHint: _angular_core.Signal<boolean>;
2519
2563
  readonly canIncrement: _angular_core.Signal<boolean>;
2520
2564
  readonly canDecrement: _angular_core.Signal<boolean>;
@@ -3386,6 +3430,12 @@ declare class TagComponent {
3386
3430
  readonly removable: _angular_core.InputSignal<boolean>;
3387
3431
  readonly disabled: _angular_core.InputSignal<boolean>;
3388
3432
  readonly removeLabel: _angular_core.InputSignal<string | undefined>;
3433
+ /**
3434
+ * Whether the remove button is a tab stop. Set `false` inside a composite
3435
+ * widget (a combobox trigger, a grid cell) whose own keyboard model owns
3436
+ * navigation, since roles like `combobox` forbid focusable descendants.
3437
+ */
3438
+ readonly removeTabbable: _angular_core.InputSignal<boolean>;
3389
3439
  /** Fires when the user activates the remove button on a `removable` tag. */
3390
3440
  readonly removed: _angular_core.OutputEmitterRef<void>;
3391
3441
  /** Accessible label for the remove button, falling back to the active locale. */
@@ -3396,7 +3446,7 @@ declare class TagComponent {
3396
3446
  }>;
3397
3447
  onRemove(event: MouseEvent): void;
3398
3448
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TagComponent, never>;
3399
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<TagComponent, "ea-tag", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "removable": { "alias": "removable"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "removeLabel": { "alias": "removeLabel"; "required": false; "isSignal": true; }; }, { "removed": "removed"; }, never, ["*"], true, never>;
3449
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TagComponent, "ea-tag", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "removable": { "alias": "removable"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "removeLabel": { "alias": "removeLabel"; "required": false; "isSignal": true; }; "removeTabbable": { "alias": "removeTabbable"; "required": false; "isSignal": true; }; }, { "removed": "removed"; }, never, ["*"], true, never>;
3400
3450
  }
3401
3451
 
3402
3452
  /** Visual size of the textarea. */
@@ -3411,6 +3461,8 @@ type TextareaResize = 'none' | 'vertical' | 'horizontal' | 'both';
3411
3461
  declare class TextareaComponent implements ControlValueAccessor {
3412
3462
  readonly textareaEl: _angular_core.Signal<ElementRef<HTMLTextAreaElement> | undefined>;
3413
3463
  readonly label: _angular_core.InputSignal<string | undefined>;
3464
+ /** Accessible name for the control when no visible `label` is set. */
3465
+ readonly ariaLabel: _angular_core.InputSignal<string | undefined>;
3414
3466
  readonly placeholder: _angular_core.InputSignal<string>;
3415
3467
  readonly size: _angular_core.InputSignal<EaSize>;
3416
3468
  readonly hint: _angular_core.InputSignal<string | undefined>;
@@ -3462,7 +3514,7 @@ declare class TextareaComponent implements ControlValueAccessor {
3462
3514
  /** Moves keyboard focus to the underlying native textarea element. */
3463
3515
  focus(): void;
3464
3516
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TextareaComponent, never>;
3465
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<TextareaComponent, "ea-textarea", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "errorMsg": { "alias": "errorMsg"; "required": false; "isSignal": true; }; "errorMessages": { "alias": "errorMessages"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "resize": { "alias": "resize"; "required": false; "isSignal": true; }; "maxlength": { "alias": "maxlength"; "required": false; "isSignal": true; }; "maxHeight": { "alias": "maxHeight"; "required": false; "isSignal": true; }; "minHeight": { "alias": "minHeight"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "focused": "focused"; "blurred": "blurred"; }, never, never, true, never>;
3517
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TextareaComponent, "ea-textarea", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "aria-label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "errorMsg": { "alias": "errorMsg"; "required": false; "isSignal": true; }; "errorMessages": { "alias": "errorMessages"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "resize": { "alias": "resize"; "required": false; "isSignal": true; }; "maxlength": { "alias": "maxlength"; "required": false; "isSignal": true; }; "maxHeight": { "alias": "maxHeight"; "required": false; "isSignal": true; }; "minHeight": { "alias": "minHeight"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "focused": "focused"; "blurred": "blurred"; }, never, never, true, never>;
3466
3518
  }
3467
3519
 
3468
3520
  /** Visual size of the time picker trigger. */
@@ -3590,6 +3642,13 @@ declare class TimePickerComponent implements ControlValueAccessor {
3590
3642
  handleTriggerKeydown(event: KeyboardEvent): void;
3591
3643
  /** Stepper button or keyboard arrow nudges one column up or down. */
3592
3644
  step(unit: Unit, direction: 1 | -1): void;
3645
+ /**
3646
+ * Keyboard activation of a stepper button dispatches only a click, never the
3647
+ * pointer events that drive the hold repeat. `detail` is 0 for those
3648
+ * synthetic clicks, so pointer presses (already handled by startHold) are
3649
+ * ignored here.
3650
+ */
3651
+ onStepClick(unit: Unit, direction: 1 | -1, event: MouseEvent): void;
3593
3652
  /**
3594
3653
  * Begin a long-press repeat on a chevron button. Fires once immediately,
3595
3654
  * then after a `HOLD_INITIAL_DELAY` pause repeats at `HOLD_INTERVAL_MS`,
@@ -3706,9 +3765,20 @@ interface ToastOptions {
3706
3765
  */
3707
3766
  declare class ToastService {
3708
3767
  private nextId;
3768
+ private readonly timers;
3769
+ private paused;
3709
3770
  readonly toasts: _angular_core.WritableSignal<Toast[]>;
3710
3771
  /** Shows a toast and returns its id; pass `duration: 0` to disable auto-dismiss. */
3711
3772
  show(message: string, options?: ToastOptions): number;
3773
+ /**
3774
+ * Suspends every auto-dismiss countdown, keeping the time each toast has
3775
+ * left. The `<ea-toast />` outlet calls this while the pointer or keyboard
3776
+ * focus is on the stack so users get time to read or reach the dismiss
3777
+ * button.
3778
+ */
3779
+ pause(): void;
3780
+ /** Resumes auto-dismiss countdowns suspended by {@link pause}. */
3781
+ resume(): void;
3712
3782
  /** Shows a `success` toast and returns its id. */
3713
3783
  success(message: string, duration?: number): number;
3714
3784
  /** Shows an `error` toast and returns its id. */
@@ -3737,6 +3807,9 @@ type ToastSize = EaSize;
3737
3807
  declare class ToastComponent {
3738
3808
  protected readonly toastService: ToastService;
3739
3809
  protected readonly i18n: EagamiI18nService;
3810
+ private readonly containerEl;
3811
+ private hovered;
3812
+ private focused;
3740
3813
  /** Viewport corner or edge the toast stack is pinned to. */
3741
3814
  readonly position: _angular_core.InputSignal<ToastPosition>;
3742
3815
  /** Visual size applied to every toast in the stack. */
@@ -3744,6 +3817,13 @@ declare class ToastComponent {
3744
3817
  /** Show a dismiss button on each toast. */
3745
3818
  readonly clearable: _angular_core.InputSignal<boolean>;
3746
3819
  protected readonly containerClass: _angular_core.Signal<string>;
3820
+ /** Errors and warnings interrupt like `ea-alert`; the rest wait politely. */
3821
+ protected toastRole(variant: string): 'alert' | 'status';
3822
+ protected onMouseEnter(): void;
3823
+ protected onMouseLeave(): void;
3824
+ protected onFocusIn(): void;
3825
+ protected onFocusOut(event: FocusEvent): void;
3826
+ private syncPause;
3747
3827
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ToastComponent, never>;
3748
3828
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<ToastComponent, "ea-toast", never, { "position": { "alias": "position"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
3749
3829
  }
@@ -3854,6 +3934,7 @@ declare class TransferListComponent {
3854
3934
  protected readonly canMoveAllLeft: _angular_core.Signal<boolean>;
3855
3935
  protected readonly resolvedSourceLabel: _angular_core.Signal<string>;
3856
3936
  protected readonly resolvedTargetLabel: _angular_core.Signal<string>;
3937
+ protected readonly announcement: _angular_core.WritableSignal<string>;
3857
3938
  protected readonly hostClasses: _angular_core.Signal<string[]>;
3858
3939
  protected isHighlighted(pane: 'source' | 'target', id: string): boolean;
3859
3940
  protected itemTabindex(pane: 'source' | 'target', index: number, item: TransferListItem): number;
@@ -3869,6 +3950,7 @@ declare class TransferListComponent {
3869
3950
  protected moveAllRight(): void;
3870
3951
  protected moveSelectedLeft(): void;
3871
3952
  protected moveAllLeft(): void;
3953
+ private announceMove;
3872
3954
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TransferListComponent, never>;
3873
3955
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<TransferListComponent, "ea-transfer-list", never, { "items": { "alias": "items"; "required": true; "isSignal": true; }; "selectedIds": { "alias": "selectedIds"; "required": false; "isSignal": true; }; "sourceLabel": { "alias": "sourceLabel"; "required": false; "isSignal": true; }; "targetLabel": { "alias": "targetLabel"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "selectedIds": "selectedIdsChange"; }, never, never, true, never>;
3874
3956
  }
@@ -3993,6 +4075,8 @@ interface VirtualListItemContext<T = unknown> {
3993
4075
  * `aria-posinset` using the projected `index` if needed.
3994
4076
  */
3995
4077
  declare class VirtualListComponent {
4078
+ private readonly hostRole;
4079
+ protected readonly viewportTabindex: number | null;
3996
4080
  readonly items: _angular_core.InputSignal<readonly unknown[]>;
3997
4081
  /** Pixel height of each item. Must be > 0. */
3998
4082
  readonly itemHeight: _angular_core.InputSignal<number>;