@eagami/ui 5.53.0 → 5.55.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.
@@ -1,5 +1,5 @@
1
1
  import * as i0 from "@angular/core";
2
- import { AfterContentChecked, ElementRef, EnvironmentProviders, InjectionToken, OnDestroy, OnInit, Signal, TemplateRef, Type } from "@angular/core";
2
+ import { AfterContentChecked, ElementRef, EnvironmentProviders, InjectionToken, Injector, OnDestroy, OnInit, Signal, TemplateRef, Type } from "@angular/core";
3
3
  import { AbstractControl, ControlValueAccessor } from "@angular/forms";
4
4
  /**
5
5
  * BCP 47 locale tags supported out of the box. Consumers select one of these
@@ -136,6 +136,10 @@ export interface EagamiMessages {
136
136
  dropdown: {
137
137
  placeholder: string;
138
138
  };
139
+ fieldLabel: {
140
+ /** Accessible name of the button that reveals a field label's help. */
141
+ help: (label: string) => string;
142
+ };
139
143
  fileUploader: {
140
144
  prompt: string;
141
145
  promptSingle: string;
@@ -613,13 +617,19 @@ export type EaSize = '2xs' | 'xs' | 'sm' | 'md' | 'lg' | 'xl';
613
617
  export type EaWidth = EaSize | '2xl' | 'full';
614
618
  /**
615
619
  * Single expandable section within an `ea-accordion`. Each item exposes a
616
- * header button with the supplied `label` and reveals its projected content
620
+ * header button with the supplied `label`, or with an element projected as
621
+ * `slot="label"` for richer content, and reveals its other projected content
617
622
  * when expanded. Inherits its size from the parent accordion. Must be
618
623
  * rendered inside an `ea-accordion`.
619
624
  */
620
625
  export declare class AccordionItemComponent implements OnInit, OnDestroy {
621
626
  private readonly accordion;
622
627
  readonly value: import("@angular/core").InputSignal<string>;
628
+ /**
629
+ * Plain-text label shown in the header button. For richer content, project
630
+ * an element with `slot="label"` instead: its text then names the button, so
631
+ * mark purely decorative parts of it `aria-hidden`.
632
+ */
623
633
  readonly label: import("@angular/core").InputSignal<string>;
624
634
  /** Optional icon component rendered before the label in the header button. */
625
635
  readonly icon: import("@angular/core").InputSignal<Type<unknown> | undefined>;
@@ -641,7 +651,7 @@ export declare class AccordionItemComponent implements OnInit, OnDestroy {
641
651
  };
642
652
  "label": {
643
653
  "alias": "label";
644
- "required": true;
654
+ "required": false;
645
655
  "isSignal": true;
646
656
  };
647
657
  "icon": {
@@ -659,7 +669,7 @@ export declare class AccordionItemComponent implements OnInit, OnDestroy {
659
669
  "required": false;
660
670
  "isSignal": true;
661
671
  };
662
- }, {}, never, ["*"], true, never>;
672
+ }, {}, never, ["[slot=label]", "*"], true, never>;
663
673
  }
664
674
  /** Heading level exposed by each item's header for assistive technology. */
665
675
  export type AccordionHeadingLevel = 1 | 2 | 3 | 4 | 5 | 6;
@@ -668,7 +678,9 @@ export type AccordionSize = EaSize;
668
678
  /**
669
679
  * Container for expandable content sections. By default only one item can be
670
680
  * open at a time; set `multi` to allow several to stay expanded together.
671
- * Provides a built-in chevron animation and supports per-item disabling.
681
+ * Which items are open is the `expandedValues` model, so items can start
682
+ * expanded or be controlled from outside. Provides a built-in chevron
683
+ * animation and supports per-item disabling.
672
684
  */
673
685
  export declare class AccordionComponent {
674
686
  readonly multi: import("@angular/core").InputSignal<boolean>;
@@ -678,6 +690,12 @@ export declare class AccordionComponent {
678
690
  readonly headingLevel: import("@angular/core").InputSignal<AccordionHeadingLevel>;
679
691
  /** Tints an open item's header and sets its label, icon, and chevron in the brand color. */
680
692
  readonly highlightExpanded: import("@angular/core").InputSignal<boolean>;
693
+ /**
694
+ * Values of the expanded items. Set it to open items from the start, or bind
695
+ * `[(expandedValues)]` to control expansion from outside. Without `multi`,
696
+ * only the first of them in document order stays open.
697
+ */
698
+ readonly expandedValues: import("@angular/core").ModelSignal<readonly string[]>;
681
699
  readonly expandedItems: import("@angular/core").WritableSignal<Set<string>>;
682
700
  readonly registeredItems: import("@angular/core").WritableSignal<AccordionItemComponent[]>;
683
701
  constructor();
@@ -707,16 +725,25 @@ export declare class AccordionComponent {
707
725
  "required": false;
708
726
  "isSignal": true;
709
727
  };
710
- }, {}, never, ["*"], true, never>;
728
+ "expandedValues": {
729
+ "alias": "expandedValues";
730
+ "required": false;
731
+ "isSignal": true;
732
+ };
733
+ }, {
734
+ "expandedValues": "expandedValuesChange";
735
+ }, never, ["*"], true, never>;
711
736
  }
712
737
  /** Semantic colour scheme of an alert. Drives icon and palette. */
713
738
  export type AlertVariant = 'default' | 'success' | 'warning' | 'error' | 'info';
714
739
  /** Scales the alert's text, icon, and gap together. */
715
740
  export type AlertSize = EaSize;
741
+ /** How assistive technology announces an alert. */
742
+ export type AlertLive = 'auto' | 'assertive' | 'polite' | 'off';
716
743
  /**
717
744
  * Inline banner for surfacing semantic messages such as success confirmations,
718
745
  * warnings, or errors. Optionally dismissible, with a two-way `visible`
719
- * binding and an automatically chosen ARIA role based on severity.
746
+ * binding and an ARIA role chosen by severity unless `live` sets one.
720
747
  */
721
748
  export declare class AlertComponent {
722
749
  protected readonly i18n: EagamiI18nService;
@@ -726,12 +753,20 @@ export declare class AlertComponent {
726
753
  readonly visible: import("@angular/core").ModelSignal<boolean>;
727
754
  /** Overrides the variant's default status icon with any icon component. */
728
755
  readonly icon: import("@angular/core").InputSignal<Type<unknown> | undefined>;
756
+ /**
757
+ * How assistive technology announces the alert. `auto` interrupts for
758
+ * `error` and `warning` (`role="alert"`) and waits its turn for the rest
759
+ * (`role="status"`); `assertive` and `polite` pick one of those whatever the
760
+ * variant, and `off` announces nothing, for static text that is part of the
761
+ * page rather than news about it.
762
+ */
763
+ readonly live: import("@angular/core").InputSignal<AlertLive>;
729
764
  /** Fires when the user dismisses the alert via its close button. */
730
765
  readonly dismissed: import("@angular/core").OutputEmitterRef<void>;
731
766
  readonly alertClasses: import("@angular/core").Signal<{
732
767
  [x: string]: boolean;
733
768
  }>;
734
- readonly role: import("@angular/core").Signal<"alert" | "status">;
769
+ readonly role: import("@angular/core").Signal<"alert" | "status" | null>;
735
770
  /** Hides the alert and emits `dismissed`. */
736
771
  dismiss(): void;
737
772
  static ɵfac: i0.ɵɵFactoryDeclaration<AlertComponent, never>;
@@ -761,6 +796,11 @@ export declare class AlertComponent {
761
796
  "required": false;
762
797
  "isSignal": true;
763
798
  };
799
+ "live": {
800
+ "alias": "live";
801
+ "required": false;
802
+ "isSignal": true;
803
+ };
764
804
  }, {
765
805
  "visible": "visibleChange";
766
806
  "dismissed": "dismissed";
@@ -834,6 +874,8 @@ export declare class AutocompleteComponent implements ControlValueAccessor {
834
874
  readonly label: import("@angular/core").InputSignal<string | undefined>;
835
875
  /** Optional icon component rendered before the label text. */
836
876
  readonly labelIcon: import("@angular/core").InputSignal<Type<unknown> | undefined>;
877
+ /** Help revealed by an info button beside the label, as plain text or a template. */
878
+ readonly labelHelp: import("@angular/core").InputSignal<string | TemplateRef<unknown> | undefined>;
837
879
  /** Accessible name for the input and suggestion list when no visible label is provided. */
838
880
  readonly ariaLabel: import("@angular/core").InputSignal<string | undefined>;
839
881
  readonly placeholder: import("@angular/core").InputSignal<string>;
@@ -848,6 +890,8 @@ export declare class AutocompleteComponent implements ControlValueAccessor {
848
890
  /** Per-validator-key message overrides for a bound form control (e.g. `{ required: '...' }`). */
849
891
  readonly errorMessages: import("@angular/core").InputSignal<Partial<Record<string, string>> | undefined>;
850
892
  readonly minLength: import("@angular/core").InputSignal<number>;
893
+ /** Maximum number of characters the input accepts (native `maxlength`). */
894
+ readonly maxLength: import("@angular/core").InputSignal<number | undefined>;
851
895
  readonly maxResults: import("@angular/core").InputSignal<number>;
852
896
  readonly emptyMessage: import("@angular/core").InputSignal<string | undefined>;
853
897
  readonly id: import("@angular/core").InputSignal<string>;
@@ -922,6 +966,11 @@ export declare class AutocompleteComponent implements ControlValueAccessor {
922
966
  "required": false;
923
967
  "isSignal": true;
924
968
  };
969
+ "labelHelp": {
970
+ "alias": "labelHelp";
971
+ "required": false;
972
+ "isSignal": true;
973
+ };
925
974
  "ariaLabel": {
926
975
  "alias": "ariaLabel";
927
976
  "required": false;
@@ -977,6 +1026,11 @@ export declare class AutocompleteComponent implements ControlValueAccessor {
977
1026
  "required": false;
978
1027
  "isSignal": true;
979
1028
  };
1029
+ "maxLength": {
1030
+ "alias": "maxLength";
1031
+ "required": false;
1032
+ "isSignal": true;
1033
+ };
980
1034
  "maxResults": {
981
1035
  "alias": "maxResults";
982
1036
  "required": false;
@@ -1681,19 +1735,29 @@ export declare class BreadcrumbsComponent {
1681
1735
  "clicked": "clicked";
1682
1736
  }, never, never, true, never>;
1683
1737
  }
1684
- /** Visual style of a button; drives colour and emphasis. */
1685
- export type ButtonVariant = 'primary' | 'secondary' | 'ghost' | 'danger';
1738
+ /**
1739
+ * Visual style of a button; drives colour and emphasis. `link` drops the box
1740
+ * for an inline text link in the link colour, underlined on hover and focus.
1741
+ */
1742
+ export type ButtonVariant = 'primary' | 'secondary' | 'ghost' | 'danger' | 'link';
1686
1743
  /** Visual size of a button. */
1687
1744
  export type ButtonSize = EaSize;
1688
1745
  /** HTML `type` attribute applied to the underlying `<button>` element. */
1689
1746
  export type ButtonType = 'button' | 'submit' | 'reset';
1690
1747
  /**
1691
- * Standard action button supporting primary, secondary, ghost, and danger
1692
- * variants. Includes a loading state that swaps the label for a spinner while
1693
- * preserving the rendered width. Chrome is tunable per instance via
1748
+ * Placement of a button's content along its inline axis when the button is
1749
+ * wider than its content. `start` and `end` follow the text direction.
1750
+ */
1751
+ export type ButtonAlign = 'start' | 'center' | 'end';
1752
+ /**
1753
+ * Standard action button supporting primary, secondary, ghost, danger, and
1754
+ * link variants. Includes a loading state that swaps the label for a spinner
1755
+ * while preserving the rendered width. Chrome is tunable per instance via
1694
1756
  * `--ea-button-padding`, `--ea-button-min-height` and `--ea-button-radius`,
1695
1757
  * which is how an icon-only button comes down to little more than its glyph
1696
- * and how a call-to-action becomes a pill.
1758
+ * and how a call-to-action becomes a pill. For navigation, put
1759
+ * `ButtonLinkComponent` on an anchor instead (`<a eaButtonLink href="...">`):
1760
+ * it takes the same styling inputs and keeps real link behaviour.
1697
1761
  */
1698
1762
  export declare class ButtonComponent {
1699
1763
  readonly variant: import("@angular/core").InputSignal<ButtonVariant>;
@@ -1702,22 +1766,28 @@ export declare class ButtonComponent {
1702
1766
  readonly disabled: import("@angular/core").InputSignal<boolean>;
1703
1767
  readonly loading: import("@angular/core").InputSignal<boolean>;
1704
1768
  readonly fullWidth: import("@angular/core").InputSignal<boolean>;
1769
+ /**
1770
+ * Places the content along the inline axis of a button wider than it, as a
1771
+ * full-width one is; `start` lets a stack of buttons read as list rows.
1772
+ */
1773
+ readonly align: import("@angular/core").InputSignal<ButtonAlign>;
1705
1774
  readonly uppercase: import("@angular/core").InputSignal<boolean>;
1706
1775
  /** Optional icon component rendered to the left of the label. */
1707
1776
  readonly icon: import("@angular/core").InputSignal<Type<unknown> | undefined>;
1708
1777
  readonly ariaLabel: import("@angular/core").InputSignal<string | undefined>;
1709
1778
  readonly ariaCurrent: import("@angular/core").InputSignal<string | undefined>;
1779
+ /** Space-separated ids of the elements whose text names the button. */
1780
+ readonly ariaLabelledby: import("@angular/core").InputSignal<string | undefined>;
1781
+ /** Space-separated ids of the elements that describe the button, e.g. a hint. */
1782
+ readonly ariaDescribedby: import("@angular/core").InputSignal<string | undefined>;
1783
+ private readonly buttonEl;
1710
1784
  /** Fires when the button is activated; suppressed while disabled or loading. */
1711
1785
  readonly clicked: import("@angular/core").OutputEmitterRef<MouseEvent>;
1712
1786
  readonly isDisabled: import("@angular/core").Signal<boolean>;
1713
- readonly hostClasses: import("@angular/core").Signal<{
1714
- [x: string]: boolean;
1715
- 'ea-button--full-width': boolean;
1716
- 'ea-button--uppercase': boolean;
1717
- 'ea-button--loading': boolean;
1718
- 'ea-button--disabled': boolean;
1719
- }>;
1787
+ readonly hostClasses: import("@angular/core").Signal<Record<string, boolean>>;
1720
1788
  handleClick(event: MouseEvent): void;
1789
+ /** Moves keyboard focus to the underlying native button. */
1790
+ focus(): void;
1721
1791
  static ɵfac: i0.ɵɵFactoryDeclaration<ButtonComponent, never>;
1722
1792
  static ɵcmp: i0.ɵɵComponentDeclaration<ButtonComponent, "ea-button", never, {
1723
1793
  "variant": {
@@ -1750,6 +1820,11 @@ export declare class ButtonComponent {
1750
1820
  "required": false;
1751
1821
  "isSignal": true;
1752
1822
  };
1823
+ "align": {
1824
+ "alias": "align";
1825
+ "required": false;
1826
+ "isSignal": true;
1827
+ };
1753
1828
  "uppercase": {
1754
1829
  "alias": "uppercase";
1755
1830
  "required": false;
@@ -1770,10 +1845,88 @@ export declare class ButtonComponent {
1770
1845
  "required": false;
1771
1846
  "isSignal": true;
1772
1847
  };
1848
+ "ariaLabelledby": {
1849
+ "alias": "aria-labelledby";
1850
+ "required": false;
1851
+ "isSignal": true;
1852
+ };
1853
+ "ariaDescribedby": {
1854
+ "alias": "aria-describedby";
1855
+ "required": false;
1856
+ "isSignal": true;
1857
+ };
1773
1858
  }, {
1774
1859
  "clicked": "clicked";
1775
1860
  }, never, ["[slot=prefix]", "*", "[slot=suffix]"], true, never>;
1776
1861
  }
1862
+ /**
1863
+ * Button styling for an anchor, for navigation that should look like a button
1864
+ * while staying a real link: middle-click and open in a new tab work, and
1865
+ * assistive technology announces it as a link. Put it on an `<a>` with an
1866
+ * `href`, or with Angular's `routerLink`, which binds the `href` itself
1867
+ * (`<a eaButtonLink routerLink="/pricing">`). Takes the same styling inputs as
1868
+ * `ea-button` and is painted by the same stylesheet.
1869
+ *
1870
+ * `disabled` sets `aria-disabled`, takes the link out of the tab order, and
1871
+ * blocks activation before `routerLink` or any `(click)` handler sees it, so
1872
+ * nothing navigates. There is no loading state: a link hands off to the
1873
+ * browser or router, so there is no in-flight action for a spinner to cover.
1874
+ */
1875
+ export declare class ButtonLinkComponent {
1876
+ protected readonly authoredTabindex: string | null;
1877
+ readonly variant: import("@angular/core").InputSignal<ButtonVariant>;
1878
+ readonly size: import("@angular/core").InputSignal<import("@eagami/ui").EaSize>;
1879
+ readonly disabled: import("@angular/core").InputSignal<boolean>;
1880
+ readonly fullWidth: import("@angular/core").InputSignal<boolean>;
1881
+ /**
1882
+ * Places the content along the inline axis of a link wider than it, as a
1883
+ * full-width one is; `start` lets a stack of links read as list rows.
1884
+ */
1885
+ readonly align: import("@angular/core").InputSignal<ButtonAlign>;
1886
+ readonly uppercase: import("@angular/core").InputSignal<boolean>;
1887
+ /** Optional icon component rendered before the label. */
1888
+ readonly icon: import("@angular/core").InputSignal<Type<unknown> | undefined>;
1889
+ protected readonly boxClasses: import("@angular/core").Signal<Record<string, boolean>>;
1890
+ constructor();
1891
+ static ɵfac: i0.ɵɵFactoryDeclaration<ButtonLinkComponent, never>;
1892
+ static ɵcmp: i0.ɵɵComponentDeclaration<ButtonLinkComponent, "a[eaButtonLink]", never, {
1893
+ "variant": {
1894
+ "alias": "variant";
1895
+ "required": false;
1896
+ "isSignal": true;
1897
+ };
1898
+ "size": {
1899
+ "alias": "size";
1900
+ "required": false;
1901
+ "isSignal": true;
1902
+ };
1903
+ "disabled": {
1904
+ "alias": "disabled";
1905
+ "required": false;
1906
+ "isSignal": true;
1907
+ };
1908
+ "fullWidth": {
1909
+ "alias": "fullWidth";
1910
+ "required": false;
1911
+ "isSignal": true;
1912
+ };
1913
+ "align": {
1914
+ "alias": "align";
1915
+ "required": false;
1916
+ "isSignal": true;
1917
+ };
1918
+ "uppercase": {
1919
+ "alias": "uppercase";
1920
+ "required": false;
1921
+ "isSignal": true;
1922
+ };
1923
+ "icon": {
1924
+ "alias": "icon";
1925
+ "required": false;
1926
+ "isSignal": true;
1927
+ };
1928
+ }, {}, never, ["[slot=prefix]", "*", "[slot=suffix]"], true, never>;
1929
+ }
1777
1930
  /** Visual style of a card surface. */
1778
1931
  export type CardVariant = 'elevated' | 'outlined' | 'filled';
1779
1932
  /** Padding preset applied to the card's content area. */
@@ -2216,6 +2369,8 @@ export declare class ColorPickerComponent implements ControlValueAccessor {
2216
2369
  readonly label: import("@angular/core").InputSignal<string | undefined>;
2217
2370
  /** Optional icon component rendered before the label text. */
2218
2371
  readonly labelIcon: import("@angular/core").InputSignal<Type<unknown> | undefined>;
2372
+ /** Help revealed by an info button beside the label, as plain text or a template. */
2373
+ readonly labelHelp: import("@angular/core").InputSignal<string | TemplateRef<unknown> | undefined>;
2219
2374
  readonly placeholder: import("@angular/core").InputSignal<string | undefined>;
2220
2375
  readonly size: import("@angular/core").InputSignal<EaSize>;
2221
2376
  readonly disabled: import("@angular/core").InputSignal<boolean>;
@@ -2389,6 +2544,11 @@ export declare class ColorPickerComponent implements ControlValueAccessor {
2389
2544
  "required": false;
2390
2545
  "isSignal": true;
2391
2546
  };
2547
+ "labelHelp": {
2548
+ "alias": "labelHelp";
2549
+ "required": false;
2550
+ "isSignal": true;
2551
+ };
2392
2552
  "placeholder": {
2393
2553
  "alias": "placeholder";
2394
2554
  "required": false;
@@ -2469,340 +2629,866 @@ export declare class ColorPickerComponent implements ControlValueAccessor {
2469
2629
  "changed": "changed";
2470
2630
  }, never, never, true, never>;
2471
2631
  }
2472
- /** Vertical density preset for table rows and header cells. */
2473
- export type DataTableDensity = 'compact' | 'comfortable' | 'spacious';
2474
- /** Visual size of the table's text, paddings, and icons. */
2475
- export type DataTableSize = EaSize;
2476
- /** Sort direction; `null` means no sort is applied. */
2477
- export type DataTableSortDirection = 'asc' | 'desc' | null;
2478
- /** Column definition for the data table, including optional cell/header templates. */
2479
- export interface DataTableColumn<T = Record<string, unknown>> {
2480
- key: string;
2481
- label: string;
2482
- sortable?: boolean;
2483
- align?: 'left' | 'center' | 'right';
2484
- width?: string;
2485
- format?: (value: unknown) => string;
2486
- cellTemplate?: TemplateRef<{
2487
- $implicit: T;
2488
- value: unknown;
2489
- }>;
2490
- headerTemplate?: TemplateRef<{
2491
- $implicit: DataTableColumn<T>;
2492
- }>;
2632
+ /**
2633
+ * Placement of the popover relative to its anchor. Each outside placement names
2634
+ * the side of the anchor the popover attaches to, optionally followed by a corner
2635
+ * suffix (`-start` or `-end`) that decides the alignment along the perpendicular
2636
+ * axis. The plain side names (`top`, `bottom`, `left`, `right`) centre the
2637
+ * popover on that axis. The `inside-` placements sit over the anchor instead,
2638
+ * see {@link PopoverInsidePlacement}.
2639
+ */
2640
+ export type PopoverPlacement = 'top' | 'top-start' | 'top-end' | 'bottom' | 'bottom-start' | 'bottom-end' | 'left' | 'right' | PopoverInsidePlacement;
2641
+ /**
2642
+ * Placements that sit over the anchor rather than beside it: pinned inside one of
2643
+ * its corners (`inside-top-start`), centred along one of its edges (`inside-top`,
2644
+ * `inside-start`), or centred on it (`inside-center`). `start` and `end` follow the
2645
+ * reading direction, so `inside-top-start` is the top-left corner in LTR and the
2646
+ * top-right corner in RTL. The offset insets the popover from the edges it is
2647
+ * pinned to, and it never flips.
2648
+ */
2649
+ export type PopoverInsidePlacement = 'inside-top-start' | 'inside-top' | 'inside-top-end' | 'inside-start' | 'inside-center' | 'inside-end' | 'inside-bottom-start' | 'inside-bottom' | 'inside-bottom-end';
2650
+ /** A point in viewport coordinates, such as a pointer event's `clientX` and `clientY`. */
2651
+ export interface PopoverAnchorPoint {
2652
+ readonly x: number;
2653
+ readonly y: number;
2493
2654
  }
2494
- /** Current sort state: which column is sorted and in which direction. */
2495
- export interface DataTableSortState {
2496
- column: string;
2497
- direction: DataTableSortDirection;
2655
+ export interface PopoverPositionResult {
2656
+ /** Top coordinate in viewport (px); pairs with `position: fixed`. */
2657
+ readonly top: number;
2658
+ /** Left coordinate in viewport (px). */
2659
+ readonly left: number;
2660
+ /** Width hint when the popover should match the anchor's width. */
2661
+ readonly width?: number;
2662
+ /** The anchor's measured width, for a caller capping the popover against it. */
2663
+ readonly anchorWidth: number;
2664
+ /** Effective placement after any flip logic ran. */
2665
+ readonly placement: PopoverPlacement;
2666
+ }
2667
+ export interface PopoverPositionOptions {
2668
+ readonly placement: PopoverPlacement;
2669
+ /** Gap in px between the anchor and the popover. Default 4. */
2670
+ readonly offset?: number;
2671
+ /** Flip to the opposite side when the requested side overflows the viewport. Default true. */
2672
+ readonly flip?: boolean;
2673
+ /** Clamp inside the viewport when the popover still overflows after any flip. Default true. */
2674
+ readonly clamp?: boolean;
2675
+ /** Margin from the viewport edge in px when clamping. Default 8. */
2676
+ readonly margin?: number;
2677
+ /** Set the popover's width to match the anchor's. Useful for dropdown-style menus. */
2678
+ readonly matchAnchorWidth?: boolean;
2679
+ /** Right-to-left context. Swaps `-start`/`-end` alignment so they track the reading direction. */
2680
+ readonly rtl?: boolean;
2681
+ /**
2682
+ * Viewport point to position against instead of the anchor's box, as a zero-size
2683
+ * anchor. The anchor still supplies the width for `matchAnchorWidth`.
2684
+ */
2685
+ readonly point?: PopoverAnchorPoint | null;
2686
+ }
2687
+ interface Rect {
2688
+ readonly width: number;
2689
+ readonly height: number;
2690
+ }
2691
+ interface AnchorRect extends Rect {
2692
+ readonly top: number;
2693
+ readonly bottom: number;
2694
+ readonly left: number;
2695
+ readonly right: number;
2696
+ }
2697
+ interface Viewport {
2698
+ readonly width: number;
2699
+ readonly height: number;
2498
2700
  }
2499
2701
  /**
2500
- * Table for tabular data with sortable columns, sticky headers, and density
2501
- * presets. Supports striping, borders, hoverable rows, and custom cell or
2502
- * header templates via `ng-template`. Sort state is exposed as a two-way
2503
- * `model()` binding.
2702
+ * Computes the viewport-space top/left for a popover anchored to `anchorRect`,
2703
+ * applying optional flip-on-overflow and edge-clamp logic. Pure function, no
2704
+ * DOM access. Both `<ea-popover>` and `[eaTooltip]` consume this.
2705
+ *
2706
+ * @param anchorRect The anchor element's `getBoundingClientRect()`.
2707
+ * @param popoverRect Width and height of the popover (post-render measurement).
2708
+ * @param viewport Viewport dimensions (`window.innerWidth/Height`).
2709
+ * @param options Placement and behavior flags.
2504
2710
  */
2505
- export declare class DataTableComponent<T = Record<string, unknown>> {
2711
+ export declare function computePopoverPosition(anchorRect: AnchorRect, popoverRect: Rect, viewport: Viewport, options: PopoverPositionOptions): PopoverPositionResult;
2712
+ /** Placement of the menu list relative to its trigger. */
2713
+ export type MenuPlacement = 'bottom-start' | 'bottom-end' | 'top-start' | 'top-end';
2714
+ /** Visual size of the menu, shared by all of its items. */
2715
+ export type MenuSize = EaSize;
2716
+ /**
2717
+ * Popup action menu attached to any focusable element via the
2718
+ * `[eaMenuTrigger]` directive. Supports keyboard navigation
2719
+ * (arrow keys, Home/End), closes on outside click or Escape, and restores
2720
+ * focus to the trigger on close. Positioning, dismissal, and SSR-safe scroll
2721
+ * handling are provided by `<ea-popover>`.
2722
+ */
2723
+ export declare class MenuComponent {
2724
+ private readonly injector;
2506
2725
  private readonly i18n;
2507
- private readonly host;
2508
- private readonly activeCell;
2509
- private static readonly PAGE_JUMP;
2510
- readonly columns: import("@angular/core").InputSignal<DataTableColumn<T>[]>;
2511
- readonly data: import("@angular/core").InputSignal<T[]>;
2512
- /**
2513
- * Rows holding each column's widest content. They are laid out but never shown,
2514
- * so column widths come from them rather than from whichever rows are in `data`,
2515
- * and stay put across pages and while data loads. Moot with `stickyHeader`, whose
2516
- * columns share the width equally unless given a `width`.
2517
- */
2518
- readonly sizingRows: import("@angular/core").InputSignal<T[]>;
2519
- /** Accessible name for the table, announced when it takes focus as a grid. */
2520
- readonly ariaLabel: import("@angular/core").InputSignal<string | undefined>;
2521
- /** Visible caption rendered above the table; also names it for assistive technology. */
2522
- readonly caption: import("@angular/core").InputSignal<string | undefined>;
2523
- readonly trackBy: import("@angular/core").InputSignal<keyof T | undefined>;
2524
- readonly density: import("@angular/core").InputSignal<DataTableDensity>;
2525
- /** Visual size of the table; density paddings and icons scale with it. */
2726
+ private readonly listEl;
2727
+ readonly placement: import("@angular/core").InputSignal<MenuPlacement>;
2728
+ /** Visual size of the menu; every item inherits it. */
2526
2729
  readonly size: import("@angular/core").InputSignal<EaSize>;
2527
- readonly stickyHeader: import("@angular/core").InputSignal<boolean>;
2528
- readonly striped: import("@angular/core").InputSignal<boolean>;
2529
- readonly hoverable: import("@angular/core").InputSignal<boolean>;
2530
- readonly bordered: import("@angular/core").InputSignal<boolean>;
2531
- /** Keeps every cell on one line, so a narrow viewport scrolls the table sideways instead of wrapping its text. */
2532
- readonly nowrap: import("@angular/core").InputSignal<boolean>;
2533
- readonly noDataText: import("@angular/core").InputSignal<string | undefined>;
2534
- /** Enables grid keyboard navigation: `role="grid"`, roving tabindex, and arrow-key cell movement. */
2535
- readonly navigable: import("@angular/core").InputSignal<boolean>;
2536
- /** Marks body rows as clickable: shows a pointer cursor and emits `rowActivate` on click or Enter/Space. Independent of `hoverable` and `navigable`. */
2537
- readonly clickable: import("@angular/core").InputSignal<boolean>;
2730
+ /** Max height of the scrollable list as a CSS length; tall menus scroll past it. */
2731
+ readonly maxHeight: import("@angular/core").InputSignal<string>;
2732
+ readonly disabled: import("@angular/core").InputSignal<boolean>;
2733
+ readonly ariaLabel: import("@angular/core").InputSignal<string | undefined>;
2734
+ readonly id: import("@angular/core").InputSignal<string>;
2735
+ /** Accessible label for the menu, falling back to the active locale. */
2736
+ readonly resolvedAriaLabel: import("@angular/core").Signal<string>;
2737
+ readonly open: import("@angular/core").ModelSignal<boolean>;
2738
+ /** Fires when the menu opens. */
2739
+ readonly opened: import("@angular/core").OutputEmitterRef<void>;
2740
+ /** Fires when the menu closes. */
2741
+ readonly closed: import("@angular/core").OutputEmitterRef<void>;
2742
+ /** Trigger element currently anchoring the menu. Signal-typed so `<ea-popover>` reacts when it changes. */
2743
+ protected readonly triggerEl: import("@angular/core").WritableSignal<HTMLElement | undefined>;
2744
+ protected readonly asContextMenu: import("@angular/core").WritableSignal<boolean>;
2745
+ protected readonly anchorPoint: import("@angular/core").WritableSignal<PopoverAnchorPoint | null>;
2746
+ readonly activeItemId: import("@angular/core").WritableSignal<string | null>;
2747
+ constructor();
2748
+ /** Toggles the menu open state, anchoring it to the given trigger element. */
2749
+ toggleAt(triggerEl: HTMLElement): void;
2750
+ /** Opens the menu anchored to the given trigger element and focuses the first item. */
2751
+ openAt(triggerEl: HTMLElement): void;
2538
2752
  /**
2539
- * Gives a row its link target, or `null` for none. Every cell of the row then holds
2540
- * a real link, so the browser shows the target on hover and a modified click opens
2541
- * it elsewhere, while a plain click still emits `rowActivate` for the app to route.
2542
- * A row given `null` is inert: no link, hover highlight, focus or activation.
2753
+ * Opens the menu as the context menu of `anchorEl`: at `point` when given (a
2754
+ * pointer position, in viewport coordinates), else at its placement against the
2755
+ * anchor. Focuses the first item, closes on any click or context-menu request
2756
+ * outside the menu, and hands focus back to wherever it was on close.
2543
2757
  */
2544
- readonly rowHref: import("@angular/core").InputSignal<((row: T) => string | null) | undefined>;
2545
- readonly sort: import("@angular/core").ModelSignal<DataTableSortState>;
2546
- /** Fires whenever the sort column or direction changes via header click. */
2547
- readonly sorted: import("@angular/core").OutputEmitterRef<DataTableSortState>;
2548
- /** Fires with the row's data when a body row is activated by click or Enter/Space while `clickable` is set. */
2549
- readonly rowActivate: import("@angular/core").OutputEmitterRef<T>;
2550
- readonly noDataTemplate: import("@angular/core").Signal<TemplateRef<unknown> | undefined>;
2551
- /** Empty-state text, falling back to the active locale's translation. */
2552
- readonly resolvedNoDataText: import("@angular/core").Signal<string>;
2553
- readonly hostClasses: import("@angular/core").Signal<{
2554
- [x: string]: boolean;
2555
- 'ea-data-table--sticky': boolean;
2556
- 'ea-data-table--striped': boolean;
2557
- 'ea-data-table--hoverable': boolean;
2558
- 'ea-data-table--bordered': boolean;
2559
- 'ea-data-table--nowrap': boolean;
2560
- 'ea-data-table--navigable': boolean;
2561
- 'ea-data-table--clickable': boolean;
2562
- 'ea-data-table--linked': boolean;
2563
- }>;
2564
- constructor();
2565
- readonly sortedData: import("@angular/core").Signal<T[]>;
2566
- getCellValue(row: T, key: string): unknown;
2567
- onHeaderClick(col: DataTableColumn<T>): void;
2568
- trackByFn(_index: number, item: T): unknown;
2569
- headerTabindex(colIndex: number): number | null;
2570
- onHeaderKeydown(event: Event, col: DataTableColumn<T>): void;
2571
- bodyCellTabindex(row: number, colIndex: number): number | null;
2572
- isInert(row: T): boolean;
2573
- rowTabindex(row: T): number | null;
2574
- onRowActivate(row: T, event?: Event): void;
2575
- onCellFocus(row: number, col: number): void;
2576
- onGridKeydown(event: KeyboardEvent): void;
2577
- private focusCell;
2578
- static ɵfac: i0.ɵɵFactoryDeclaration<DataTableComponent<any>, never>;
2579
- static ɵcmp: i0.ɵɵComponentDeclaration<DataTableComponent<any>, "ea-data-table", never, {
2580
- "columns": {
2581
- "alias": "columns";
2582
- "required": true;
2758
+ openAsContextMenu(anchorEl: HTMLElement, point?: PopoverAnchorPoint | null): void;
2759
+ private show;
2760
+ /**
2761
+ * Closes the menu if it is open. Pass `restoreFocus: true` to return focus
2762
+ * to the trigger element (used when closing via Escape or item activation;
2763
+ * not used on outside click, where the user has chosen a new focus target).
2764
+ */
2765
+ close(restoreFocus?: boolean): void;
2766
+ /** Called by `<ea-popover>` when the user clicks outside the menu. */
2767
+ onPopoverCloseRequested(): void;
2768
+ private getEnabledItems;
2769
+ /**
2770
+ * `preventScroll: true` is critical here. The menu list is `position: fixed`
2771
+ * but its DOM ancestor is whatever element hosts the menu (often a sticky
2772
+ * header). When `.focus()` is called without `preventScroll`, Chromium uses
2773
+ * the focused element's DOM-tree position (inside the sticky ancestor) rather
2774
+ * than its rendered fixed position to decide whether to scroll, which on a
2775
+ * scrolled page nudges the document up by a few pixels per open, until the
2776
+ * trigger reaches the top edge. The same guard applies to keyboard navigation
2777
+ * and restoring focus on close.
2778
+ */
2779
+ private focusFirstItem;
2780
+ private focusItem;
2781
+ onKeydown(event: KeyboardEvent): void;
2782
+ onEscape(event: Event): void;
2783
+ static ɵfac: i0.ɵɵFactoryDeclaration<MenuComponent, never>;
2784
+ static ɵcmp: i0.ɵɵComponentDeclaration<MenuComponent, "ea-menu", never, {
2785
+ "placement": {
2786
+ "alias": "placement";
2787
+ "required": false;
2583
2788
  "isSignal": true;
2584
2789
  };
2585
- "data": {
2586
- "alias": "data";
2587
- "required": true;
2790
+ "size": {
2791
+ "alias": "size";
2792
+ "required": false;
2588
2793
  "isSignal": true;
2589
2794
  };
2590
- "sizingRows": {
2591
- "alias": "sizingRows";
2795
+ "maxHeight": {
2796
+ "alias": "maxHeight";
2592
2797
  "required": false;
2593
2798
  "isSignal": true;
2594
2799
  };
2595
- "ariaLabel": {
2596
- "alias": "aria-label";
2800
+ "disabled": {
2801
+ "alias": "disabled";
2597
2802
  "required": false;
2598
2803
  "isSignal": true;
2599
2804
  };
2600
- "caption": {
2601
- "alias": "caption";
2805
+ "ariaLabel": {
2806
+ "alias": "aria-label";
2602
2807
  "required": false;
2603
2808
  "isSignal": true;
2604
2809
  };
2605
- "trackBy": {
2606
- "alias": "trackBy";
2810
+ "id": {
2811
+ "alias": "id";
2607
2812
  "required": false;
2608
2813
  "isSignal": true;
2609
2814
  };
2610
- "density": {
2611
- "alias": "density";
2815
+ "open": {
2816
+ "alias": "open";
2612
2817
  "required": false;
2613
2818
  "isSignal": true;
2614
2819
  };
2615
- "size": {
2616
- "alias": "size";
2617
- "required": false;
2820
+ }, {
2821
+ "open": "openChange";
2822
+ "opened": "opened";
2823
+ "closed": "closed";
2824
+ }, never, ["*"], true, never>;
2825
+ }
2826
+ /** What a trigger such as `[eaContextMenuTrigger]` asked for when requesting the popover open. */
2827
+ export interface PopoverOpenRequest {
2828
+ /** Viewport point to open at, for the parent to bind to `[anchorPoint]`; `null` places it against the anchor. */
2829
+ readonly point: PopoverAnchorPoint | null;
2830
+ }
2831
+ /** ARIA role to apply to the popover surface. */
2832
+ export type PopoverRole = 'menu' | 'listbox' | 'dialog' | 'tooltip' | 'grid';
2833
+ /**
2834
+ * How the popover should respond to scroll / resize events while open.
2835
+ *
2836
+ * - `reposition` (default): re-measure the anchor and update the popover's
2837
+ * coordinates so it stays attached. Suitable for menus and tooltips.
2838
+ * - `close`: request close. Suitable for dropdown lists and the colour-picker
2839
+ * popover, where re-tracking a tall popover during a scroll feels intrusive.
2840
+ * - `ignore`: do nothing. The popover stays at its initial coordinates and
2841
+ * may visually detach from a scrolling anchor; useful when the anchor is
2842
+ * guaranteed not to move (e.g. inside a non-scrolling region).
2843
+ */
2844
+ export type PopoverScrollBehavior = 'reposition' | 'close' | 'ignore';
2845
+ /** Width cap for a popover surface: px, or the anchor's own width. */
2846
+ export type PopoverMaxWidth = number | 'anchor';
2847
+ /**
2848
+ * Floating-element primitive. Renders projected content as `position: fixed`
2849
+ * anchored to an external element, with flip-on-overflow, viewport clamping,
2850
+ * outside-click and Escape dismissal, and SSR-safe scroll / resize handling.
2851
+ *
2852
+ * The primitive is intentionally low-level: a parent component drives the
2853
+ * `[open]` state and listens for `(closeRequested)` to mirror it back. Internal
2854
+ * library components (`<ea-menu>`, `<ea-dropdown>`, `<ea-color-picker>`,
2855
+ * `<ea-date-picker>`, `[eaTooltip]`) compose on top of it; downstream apps can
2856
+ * use it directly to build their own popover-based UI. Set `contextMenu` and
2857
+ * pair it with `[eaContextMenuTrigger]` to open it as a context menu.
2858
+ *
2859
+ * @example
2860
+ * ```html
2861
+ * <button #trigger (click)="open.set(!open())">Open</button>
2862
+ * <ea-popover [anchor]="trigger" [open]="open()" (closeRequested)="open.set(false)">
2863
+ * <div>Popover content</div>
2864
+ * </ea-popover>
2865
+ * ```
2866
+ */
2867
+ export declare class PopoverComponent {
2868
+ private readonly destroyRef;
2869
+ private readonly press;
2870
+ private readonly surfaceEl;
2871
+ /** Anchor element the popover positions itself against. */
2872
+ readonly anchor: import("@angular/core").InputSignal<HTMLElement | ElementRef<HTMLElement> | undefined>;
2873
+ /** Whether the popover is currently open. */
2874
+ readonly open: import("@angular/core").InputSignal<boolean>;
2875
+ /** Where the popover attaches relative to the anchor. */
2876
+ readonly placement: import("@angular/core").InputSignal<PopoverPlacement>;
2877
+ /**
2878
+ * Viewport point to position against instead of the anchor's box, such as where
2879
+ * a context menu was requested. The placement applies around the point, which
2880
+ * keeps its offset from the anchor as the page scrolls.
2881
+ */
2882
+ readonly anchorPoint: import("@angular/core").InputSignal<PopoverAnchorPoint | null>;
2883
+ /** ARIA role applied to the popover surface. */
2884
+ readonly role: import("@angular/core").InputSignal<PopoverRole>;
2885
+ /** Accessible label. Falls back to nothing; consumers should provide one when no visible heading is in the popover. */
2886
+ readonly ariaLabel: import("@angular/core").InputSignal<string | undefined>;
2887
+ /** Id of the element that labels the popover surface, forwarded as `aria-labelledby`. */
2888
+ readonly ariaLabelledby: import("@angular/core").InputSignal<string | undefined>;
2889
+ /** Keep Tab and Shift+Tab cycling within the surface while open (dialog pattern). */
2890
+ readonly trapFocus: import("@angular/core").InputSignal<boolean>;
2891
+ /** DOM id for the surface so trigger elements can reference it via aria-controls. */
2892
+ readonly surfaceId: import("@angular/core").InputSignal<string>;
2893
+ /**
2894
+ * Gap in px between the anchor and the popover. Defaults to 2 so an open panel
2895
+ * clears the anchor's active focus ring instead of sitting flush over it.
2896
+ */
2897
+ readonly offset: import("@angular/core").InputSignal<number>;
2898
+ /** Flip to the opposite side when the requested side overflows the viewport. */
2899
+ readonly flip: import("@angular/core").InputSignal<boolean>;
2900
+ /** Clamp the popover inside the viewport when it would otherwise overflow. */
2901
+ readonly clamp: import("@angular/core").InputSignal<boolean>;
2902
+ /** Set the popover's `min-width` to match the anchor's width (dropdown pattern). */
2903
+ readonly matchAnchorWidth: import("@angular/core").InputSignal<boolean>;
2904
+ /**
2905
+ * Widest the surface may grow: a px value, or `anchor` to cap it at the
2906
+ * anchor's own width so long content truncates instead of widening the panel.
2907
+ */
2908
+ readonly maxWidth: import("@angular/core").InputSignal<PopoverMaxWidth | undefined>;
2909
+ /** Close on click outside the popover and the anchor. */
2910
+ readonly closeOnOutsideClick: import("@angular/core").InputSignal<boolean>;
2911
+ /** Close on Escape. */
2912
+ readonly closeOnEscape: import("@angular/core").InputSignal<boolean>;
2913
+ /** What to do on scroll / resize while open. */
2914
+ readonly scrollBehavior: import("@angular/core").InputSignal<PopoverScrollBehavior>;
2915
+ /**
2916
+ * Behaves as a context menu: moves focus to the first focusable element once
2917
+ * shown and hands it back on close, and treats clicks on the anchor and
2918
+ * context-menu requests anywhere outside the surface as outside clicks.
2919
+ */
2920
+ readonly contextMenu: import("@angular/core").InputSignal<boolean>;
2921
+ /** Requested close. The parent should mirror this into `[open]`. */
2922
+ readonly closeRequested: import("@angular/core").OutputEmitterRef<void>;
2923
+ /**
2924
+ * Requested open, from a trigger such as `[eaContextMenuTrigger]`. The parent
2925
+ * should mirror this into `[open]`, and the point into `[anchorPoint]`.
2926
+ */
2927
+ readonly openRequested: import("@angular/core").OutputEmitterRef<PopoverOpenRequest>;
2928
+ private readonly position;
2929
+ private latched;
2930
+ private pointOffset;
2931
+ private focusReturn;
2932
+ /** True placement after flip, for class-based styling (e.g. arrow direction). */
2933
+ readonly effectivePlacement: import("@angular/core").Signal<PopoverPlacement>;
2934
+ /** Latches true once the post-rAF reposition has run, so the surface is
2935
+ * only revealed after its dimensions are guaranteed stable. Reset on close. */
2936
+ private readonly stable;
2937
+ /** True once the first `reposition()` has resolved a placement on a
2938
+ * laid-out surface. Drives the `--positioned` class. */
2939
+ readonly isPositioned: import("@angular/core").Signal<boolean>;
2940
+ /** Class list for the surface. Computed in TS so the placement key (with
2941
+ * its interpolated suffix) and the positioned modifier compose cleanly. */
2942
+ readonly surfaceClass: import("@angular/core").Signal<string>;
2943
+ /** Inline style applied to the surface element. */
2944
+ readonly surfaceStyle: import("@angular/core").Signal<Record<string, string>>;
2945
+ constructor();
2946
+ requestOpen(point: PopoverAnchorPoint | null): void;
2947
+ private resolveAnchor;
2948
+ private reposition;
2949
+ onDocumentClick(event: MouseEvent): void;
2950
+ onSurfaceKeydown(event: KeyboardEvent): void;
2951
+ private focusableElements;
2952
+ private focusFirstElement;
2953
+ private trackFocusReturn;
2954
+ onEscape(event: Event): void;
2955
+ static ɵfac: i0.ɵɵFactoryDeclaration<PopoverComponent, never>;
2956
+ static ɵcmp: i0.ɵɵComponentDeclaration<PopoverComponent, "ea-popover", never, {
2957
+ "anchor": {
2958
+ "alias": "anchor";
2959
+ "required": true;
2618
2960
  "isSignal": true;
2619
2961
  };
2620
- "stickyHeader": {
2621
- "alias": "stickyHeader";
2962
+ "open": {
2963
+ "alias": "open";
2622
2964
  "required": false;
2623
2965
  "isSignal": true;
2624
2966
  };
2625
- "striped": {
2626
- "alias": "striped";
2967
+ "placement": {
2968
+ "alias": "placement";
2627
2969
  "required": false;
2628
2970
  "isSignal": true;
2629
2971
  };
2630
- "hoverable": {
2631
- "alias": "hoverable";
2972
+ "anchorPoint": {
2973
+ "alias": "anchorPoint";
2632
2974
  "required": false;
2633
2975
  "isSignal": true;
2634
2976
  };
2635
- "bordered": {
2636
- "alias": "bordered";
2977
+ "role": {
2978
+ "alias": "role";
2637
2979
  "required": false;
2638
2980
  "isSignal": true;
2639
2981
  };
2640
- "nowrap": {
2641
- "alias": "nowrap";
2982
+ "ariaLabel": {
2983
+ "alias": "aria-label";
2642
2984
  "required": false;
2643
2985
  "isSignal": true;
2644
2986
  };
2645
- "noDataText": {
2646
- "alias": "noDataText";
2987
+ "ariaLabelledby": {
2988
+ "alias": "aria-labelledby";
2647
2989
  "required": false;
2648
2990
  "isSignal": true;
2649
2991
  };
2650
- "navigable": {
2651
- "alias": "navigable";
2992
+ "trapFocus": {
2993
+ "alias": "trapFocus";
2652
2994
  "required": false;
2653
2995
  "isSignal": true;
2654
2996
  };
2655
- "clickable": {
2656
- "alias": "clickable";
2997
+ "surfaceId": {
2998
+ "alias": "surfaceId";
2657
2999
  "required": false;
2658
3000
  "isSignal": true;
2659
3001
  };
2660
- "rowHref": {
2661
- "alias": "rowHref";
3002
+ "offset": {
3003
+ "alias": "offset";
2662
3004
  "required": false;
2663
3005
  "isSignal": true;
2664
3006
  };
2665
- "sort": {
2666
- "alias": "sort";
3007
+ "flip": {
3008
+ "alias": "flip";
2667
3009
  "required": false;
2668
3010
  "isSignal": true;
2669
3011
  };
2670
- }, {
2671
- "sort": "sortChange";
2672
- "sorted": "sorted";
2673
- "rowActivate": "rowActivate";
2674
- }, ["noDataTemplate"], ["ea-paginator"], true, never>;
2675
- }
2676
- /** Visual size of each digit cell. */
2677
- export type CodeInputSize = EaSize;
2678
- /**
2679
- * Verification code entry made up of one input per digit. Auto-advances on
2680
- * input, supports paste of the full code at once, and integrates with Angular
2681
- * forms via `ControlValueAccessor`.
2682
- */
2683
- export declare class CodeInputComponent implements ControlValueAccessor {
2684
- readonly digitEls: import("@angular/core").Signal<readonly ElementRef<HTMLInputElement>[]>;
2685
- protected readonly i18n: EagamiI18nService;
2686
- readonly label: import("@angular/core").InputSignal<string | undefined>;
2687
- /** Optional icon component rendered before the label text. */
2688
- readonly labelIcon: import("@angular/core").InputSignal<Type<unknown> | undefined>;
2689
- /** Placeholder text spread one character per cell (cell i shows character i). */
2690
- readonly placeholder: import("@angular/core").InputSignal<string>;
2691
- readonly length: import("@angular/core").InputSignal<number>;
2692
- readonly size: import("@angular/core").InputSignal<EaSize>;
2693
- readonly hint: import("@angular/core").InputSignal<string | undefined>;
2694
- readonly errorMsg: import("@angular/core").InputSignal<string | undefined>;
2695
- /** Per-validator-key message overrides for a bound form control (e.g. `{ required: '...' }`). */
2696
- readonly errorMessages: import("@angular/core").InputSignal<Partial<Record<string, string>> | undefined>;
2697
- readonly disabled: import("@angular/core").InputSignal<boolean>;
2698
- readonly readonly: import("@angular/core").InputSignal<boolean>;
2699
- readonly required: import("@angular/core").InputSignal<boolean>;
2700
- /** Allow any non-whitespace character; when false (default) only digits are accepted. */
2701
- readonly allowAllChars: import("@angular/core").InputSignal<boolean>;
2702
- readonly id: import("@angular/core").InputSignal<string>;
2703
- readonly value: import("@angular/core").ModelSignal<string>;
2704
- readonly focusedIndex: import("@angular/core").WritableSignal<number>;
2705
- private readonly _formDisabled;
2706
- /** Fires with the full code once every digit has been entered. */
2707
- readonly completed: import("@angular/core").OutputEmitterRef<string>;
2708
- private onChange;
2709
- private onTouched;
2710
- readonly isDisabled: import("@angular/core").Signal<boolean>;
2711
- private readonly errorState;
2712
- readonly errorText: import("@angular/core").Signal<string | null>;
2713
- readonly hasError: import("@angular/core").Signal<boolean>;
2714
- readonly showError: import("@angular/core").Signal<boolean>;
2715
- readonly showHint: import("@angular/core").Signal<boolean>;
2716
- readonly digits: import("@angular/core").Signal<string[]>;
2717
- readonly placeholders: import("@angular/core").Signal<string[]>;
2718
- readonly indices: import("@angular/core").Signal<number[]>;
2719
- writeValue(val: string): void;
2720
- registerOnChange(fn: (value: string) => void): void;
2721
- registerOnTouched(fn: () => void): void;
2722
- setDisabledState(isDisabled: boolean): void;
2723
- handleInput(event: Event, index: number): void;
2724
- handleKeydown(event: KeyboardEvent, index: number): void;
2725
- handlePaste(event: ClipboardEvent): void;
2726
- handleFocus(index: number): void;
2727
- handleBlur(): void;
2728
- /** Moves keyboard focus to the next empty digit (or the last one when full). */
2729
- focus(): void;
2730
- private sanitize;
2731
- private focusDigit;
2732
- static ɵfac: i0.ɵɵFactoryDeclaration<CodeInputComponent, never>;
2733
- static ɵcmp: i0.ɵɵComponentDeclaration<CodeInputComponent, "ea-code-input", never, {
2734
- "label": {
2735
- "alias": "label";
3012
+ "clamp": {
3013
+ "alias": "clamp";
2736
3014
  "required": false;
2737
3015
  "isSignal": true;
2738
3016
  };
2739
- "labelIcon": {
2740
- "alias": "labelIcon";
3017
+ "matchAnchorWidth": {
3018
+ "alias": "matchAnchorWidth";
2741
3019
  "required": false;
2742
3020
  "isSignal": true;
2743
3021
  };
2744
- "placeholder": {
2745
- "alias": "placeholder";
3022
+ "maxWidth": {
3023
+ "alias": "maxWidth";
2746
3024
  "required": false;
2747
3025
  "isSignal": true;
2748
3026
  };
2749
- "length": {
2750
- "alias": "length";
3027
+ "closeOnOutsideClick": {
3028
+ "alias": "closeOnOutsideClick";
2751
3029
  "required": false;
2752
3030
  "isSignal": true;
2753
3031
  };
2754
- "size": {
2755
- "alias": "size";
3032
+ "closeOnEscape": {
3033
+ "alias": "closeOnEscape";
2756
3034
  "required": false;
2757
3035
  "isSignal": true;
2758
3036
  };
2759
- "hint": {
2760
- "alias": "hint";
3037
+ "scrollBehavior": {
3038
+ "alias": "scrollBehavior";
2761
3039
  "required": false;
2762
3040
  "isSignal": true;
2763
3041
  };
2764
- "errorMsg": {
2765
- "alias": "errorMsg";
3042
+ "contextMenu": {
3043
+ "alias": "contextMenu";
2766
3044
  "required": false;
2767
3045
  "isSignal": true;
2768
3046
  };
2769
- "errorMessages": {
2770
- "alias": "errorMessages";
3047
+ }, {
3048
+ "closeRequested": "closeRequested";
3049
+ "openRequested": "openRequested";
3050
+ }, never, ["*"], true, never>;
3051
+ }
3052
+ /**
3053
+ * Where `[eaContextMenuTrigger]` opens its target: at the pointer (below the
3054
+ * focused element for a keyboard request), or at the target's own placement
3055
+ * against the host.
3056
+ */
3057
+ export type ContextMenuPosition = 'pointer' | 'anchor';
3058
+ /** An overlay `[eaContextMenuTrigger]` can open as a context menu. */
3059
+ export type ContextMenuTarget = MenuComponent | PopoverComponent;
3060
+ /**
3061
+ * Opens an `<ea-menu>` or `<ea-popover>` as the context menu of its host: on a
3062
+ * right-click or long press, or from the keyboard with Shift+F10 or the
3063
+ * context-menu key while focus is on the host or inside it. The browser's own
3064
+ * menu is suppressed only when the target opens, so a `null` target, a disabled
3065
+ * menu, or a request something inside the host has already handled leaves it be.
3066
+ *
3067
+ * A menu opens straight away. A popover's parent drives its `[open]` state, so it
3068
+ * emits `openRequested` with the point to bind to `[anchorPoint]` instead; give it
3069
+ * `[contextMenu]="true"` so it takes focus and dismisses like a context menu.
3070
+ *
3071
+ * @example
3072
+ * ```html
3073
+ * <article [eaContextMenuTrigger]="actions">Right-click me</article>
3074
+ * <ea-menu #actions>
3075
+ * <ea-menu-item>Rename</ea-menu-item>
3076
+ * </ea-menu>
3077
+ * ```
3078
+ */
3079
+ export declare class ContextMenuTriggerDirective {
3080
+ private readonly el;
3081
+ /** The menu or popover to open; `null` or `undefined` leaves the browser's own menu. */
3082
+ readonly target: import("@angular/core").InputSignal<ContextMenuTarget | null | undefined>;
3083
+ /**
3084
+ * Opens at the pointer, or below the focused element for a keyboard request;
3085
+ * `anchor` opens at the target's placement against the host instead.
3086
+ */
3087
+ readonly contextMenuPosition: import("@angular/core").InputSignal<ContextMenuPosition>;
3088
+ onContextMenu(event: MouseEvent): void;
3089
+ onKeydown(event: KeyboardEvent): void;
3090
+ private request;
3091
+ static ɵfac: i0.ɵɵFactoryDeclaration<ContextMenuTriggerDirective, never>;
3092
+ static ɵdir: i0.ɵɵDirectiveDeclaration<ContextMenuTriggerDirective, "[eaContextMenuTrigger]", never, {
3093
+ "target": {
3094
+ "alias": "eaContextMenuTrigger";
2771
3095
  "required": false;
2772
3096
  "isSignal": true;
2773
3097
  };
2774
- "disabled": {
2775
- "alias": "disabled";
3098
+ "contextMenuPosition": {
3099
+ "alias": "contextMenuPosition";
2776
3100
  "required": false;
2777
3101
  "isSignal": true;
2778
3102
  };
2779
- "readonly": {
2780
- "alias": "readonly";
2781
- "required": false;
3103
+ }, {}, never, never, true, never>;
3104
+ }
3105
+ /** Vertical density preset for table rows and header cells. */
3106
+ export type DataTableDensity = 'compact' | 'comfortable' | 'spacious';
3107
+ /** Visual size of the table's text, paddings, and icons. */
3108
+ export type DataTableSize = EaSize;
3109
+ /** Sort direction; `null` means no sort is applied. */
3110
+ export type DataTableSortDirection = 'asc' | 'desc' | null;
3111
+ /** Column definition for the data table, including optional cell/header templates. */
3112
+ export interface DataTableColumn<T = Record<string, unknown>> {
3113
+ key: string;
3114
+ label: string;
3115
+ sortable?: boolean;
3116
+ align?: 'left' | 'center' | 'right';
3117
+ width?: string;
3118
+ format?: (value: unknown) => string;
3119
+ cellTemplate?: TemplateRef<{
3120
+ $implicit: T;
3121
+ value: unknown;
3122
+ }>;
3123
+ headerTemplate?: TemplateRef<{
3124
+ $implicit: DataTableColumn<T>;
3125
+ }>;
3126
+ /** Shown in this column's cells while the table is `loading`, in place of a skeleton bar. */
3127
+ placeholderTemplate?: TemplateRef<{
3128
+ $implicit: DataTableColumn<T>;
3129
+ index: number;
3130
+ }>;
3131
+ }
3132
+ /** A body row's context-menu request, as `rowContextMenu` emits it. */
3133
+ export interface DataTableRowContextMenuEvent<T = Record<string, unknown>> {
3134
+ /** The row's data. */
3135
+ readonly row: T;
3136
+ /** The row's `<tr>`, for anchoring a menu or popover to the row. */
3137
+ readonly rowElement: HTMLElement;
3138
+ /** Where to open a menu: the pointer, or below the focused row or cell for a keyboard request. */
3139
+ readonly point: PopoverAnchorPoint;
3140
+ /** The originating event; call `preventDefault()` on it to suppress the browser's own menu. */
3141
+ readonly event: MouseEvent | KeyboardEvent;
3142
+ }
3143
+ /** Current sort state: which column is sorted and in which direction. */
3144
+ export interface DataTableSortState {
3145
+ column: string;
3146
+ direction: DataTableSortDirection;
3147
+ }
3148
+ /**
3149
+ * Table for tabular data with sortable columns, sticky headers, and density
3150
+ * presets. Supports striping, borders, hoverable rows, and custom cell or
3151
+ * header templates via `ng-template`. Sort state is exposed as a two-way
3152
+ * `model()` binding.
3153
+ */
3154
+ export declare class DataTableComponent<T = Record<string, unknown>> {
3155
+ private readonly i18n;
3156
+ private readonly host;
3157
+ private readonly activeCell;
3158
+ private static readonly PAGE_JUMP;
3159
+ private keyboardRequestPending;
3160
+ readonly columns: import("@angular/core").InputSignal<DataTableColumn<T>[]>;
3161
+ readonly data: import("@angular/core").InputSignal<T[]>;
3162
+ /**
3163
+ * Rows holding each column's widest content. They are laid out but never shown,
3164
+ * so column widths come from them rather than from whichever rows are in `data`,
3165
+ * and stay put across pages and while data loads. Moot with `stickyHeader`, whose
3166
+ * columns share the width equally unless given a `width`.
3167
+ */
3168
+ readonly sizingRows: import("@angular/core").InputSignal<T[]>;
3169
+ /** Accessible name for the table, announced when it takes focus as a grid. */
3170
+ readonly ariaLabel: import("@angular/core").InputSignal<string | undefined>;
3171
+ /** Visible caption rendered above the table; also names it for assistive technology. */
3172
+ readonly caption: import("@angular/core").InputSignal<string | undefined>;
3173
+ readonly trackBy: import("@angular/core").InputSignal<keyof T | undefined>;
3174
+ readonly density: import("@angular/core").InputSignal<DataTableDensity>;
3175
+ /** Visual size of the table; density paddings and icons scale with it. */
3176
+ readonly size: import("@angular/core").InputSignal<EaSize>;
3177
+ readonly stickyHeader: import("@angular/core").InputSignal<boolean>;
3178
+ readonly striped: import("@angular/core").InputSignal<boolean>;
3179
+ readonly hoverable: import("@angular/core").InputSignal<boolean>;
3180
+ readonly bordered: import("@angular/core").InputSignal<boolean>;
3181
+ /** Keeps every cell on one line, so a narrow viewport scrolls the table sideways instead of wrapping its text. */
3182
+ readonly nowrap: import("@angular/core").InputSignal<boolean>;
3183
+ readonly noDataText: import("@angular/core").InputSignal<string | undefined>;
3184
+ /** Enables grid keyboard navigation: `role="grid"`, roving tabindex, and arrow-key cell movement. */
3185
+ readonly navigable: import("@angular/core").InputSignal<boolean>;
3186
+ /** Marks body rows as clickable: shows a pointer cursor and emits `rowActivate` on click or Enter/Space. Independent of `hoverable` and `navigable`. */
3187
+ readonly clickable: import("@angular/core").InputSignal<boolean>;
3188
+ /**
3189
+ * Gives a row its link target, or `null` for none. Every cell of the row then holds
3190
+ * a real link, so the browser shows the target on hover and a modified click opens
3191
+ * it elsewhere, while a plain click still emits `rowActivate` for the app to route.
3192
+ * A row given `null` is inert: no link, hover highlight, focus or activation.
3193
+ */
3194
+ readonly rowHref: import("@angular/core").InputSignal<((row: T) => string | null) | undefined>;
3195
+ /**
3196
+ * Shows placeholder rows in place of the data while it loads, and marks the table
3197
+ * busy for assistive technology. A placeholder row stands as tall as a row of text,
3198
+ * and `sizingRows` keep the columns at their loaded widths.
3199
+ */
3200
+ readonly loading: import("@angular/core").InputSignal<boolean>;
3201
+ /** How many placeholder rows to show while `loading`. */
3202
+ readonly loadingRowCount: import("@angular/core").InputSignal<number>;
3203
+ readonly sort: import("@angular/core").ModelSignal<DataTableSortState>;
3204
+ /** Fires whenever the sort column or direction changes via header click. */
3205
+ readonly sorted: import("@angular/core").OutputEmitterRef<DataTableSortState>;
3206
+ /** Fires with the row's data when a body row is activated by click or Enter/Space while `clickable` is set. */
3207
+ readonly rowActivate: import("@angular/core").OutputEmitterRef<T>;
3208
+ /**
3209
+ * Fires when a body row's context menu is requested: by right-click or long press,
3210
+ * or by Shift+F10 or the context-menu key with focus in the row. Call
3211
+ * `event.preventDefault()` when opening a menu of your own.
3212
+ */
3213
+ readonly rowContextMenu: import("@angular/core").OutputEmitterRef<DataTableRowContextMenuEvent<T>>;
3214
+ readonly noDataTemplate: import("@angular/core").Signal<TemplateRef<unknown> | undefined>;
3215
+ /** Empty-state text, falling back to the active locale's translation. */
3216
+ readonly resolvedNoDataText: import("@angular/core").Signal<string>;
3217
+ readonly placeholderRows: import("@angular/core").Signal<number[]>;
3218
+ private readonly bodyRowCount;
3219
+ readonly hostClasses: import("@angular/core").Signal<{
3220
+ [x: string]: boolean;
3221
+ 'ea-data-table--sticky': boolean;
3222
+ 'ea-data-table--striped': boolean;
3223
+ 'ea-data-table--hoverable': boolean;
3224
+ 'ea-data-table--bordered': boolean;
3225
+ 'ea-data-table--nowrap': boolean;
3226
+ 'ea-data-table--navigable': boolean;
3227
+ 'ea-data-table--clickable': boolean;
3228
+ 'ea-data-table--linked': boolean;
3229
+ }>;
3230
+ constructor();
3231
+ readonly sortedData: import("@angular/core").Signal<T[]>;
3232
+ getCellValue(row: T, key: string): unknown;
3233
+ onHeaderClick(col: DataTableColumn<T>): void;
3234
+ trackByFn(_index: number, item: T): unknown;
3235
+ headerTabindex(colIndex: number): number | null;
3236
+ onHeaderKeydown(event: Event, col: DataTableColumn<T>): void;
3237
+ bodyCellTabindex(row: number, colIndex: number): number | null;
3238
+ isInert(row: T): boolean;
3239
+ rowTabindex(row: T): number | null;
3240
+ onRowActivate(row: T, event?: Event): void;
3241
+ onRowContextMenu(row: T, rowElement: HTMLElement, event: MouseEvent | KeyboardEvent): void;
3242
+ clearKeyboardRequest(): void;
3243
+ onCellFocus(row: number, col: number): void;
3244
+ onGridKeydown(event: KeyboardEvent): void;
3245
+ private focusCell;
3246
+ static ɵfac: i0.ɵɵFactoryDeclaration<DataTableComponent<any>, never>;
3247
+ static ɵcmp: i0.ɵɵComponentDeclaration<DataTableComponent<any>, "ea-data-table", never, {
3248
+ "columns": {
3249
+ "alias": "columns";
3250
+ "required": true;
2782
3251
  "isSignal": true;
2783
3252
  };
2784
- "required": {
2785
- "alias": "required";
2786
- "required": false;
3253
+ "data": {
3254
+ "alias": "data";
3255
+ "required": true;
2787
3256
  "isSignal": true;
2788
3257
  };
2789
- "allowAllChars": {
2790
- "alias": "allowAllChars";
3258
+ "sizingRows": {
3259
+ "alias": "sizingRows";
2791
3260
  "required": false;
2792
3261
  "isSignal": true;
2793
3262
  };
2794
- "id": {
2795
- "alias": "id";
3263
+ "ariaLabel": {
3264
+ "alias": "aria-label";
2796
3265
  "required": false;
2797
3266
  "isSignal": true;
2798
3267
  };
2799
- "value": {
2800
- "alias": "value";
3268
+ "caption": {
3269
+ "alias": "caption";
2801
3270
  "required": false;
2802
3271
  "isSignal": true;
2803
3272
  };
2804
- }, {
2805
- "value": "valueChange";
3273
+ "trackBy": {
3274
+ "alias": "trackBy";
3275
+ "required": false;
3276
+ "isSignal": true;
3277
+ };
3278
+ "density": {
3279
+ "alias": "density";
3280
+ "required": false;
3281
+ "isSignal": true;
3282
+ };
3283
+ "size": {
3284
+ "alias": "size";
3285
+ "required": false;
3286
+ "isSignal": true;
3287
+ };
3288
+ "stickyHeader": {
3289
+ "alias": "stickyHeader";
3290
+ "required": false;
3291
+ "isSignal": true;
3292
+ };
3293
+ "striped": {
3294
+ "alias": "striped";
3295
+ "required": false;
3296
+ "isSignal": true;
3297
+ };
3298
+ "hoverable": {
3299
+ "alias": "hoverable";
3300
+ "required": false;
3301
+ "isSignal": true;
3302
+ };
3303
+ "bordered": {
3304
+ "alias": "bordered";
3305
+ "required": false;
3306
+ "isSignal": true;
3307
+ };
3308
+ "nowrap": {
3309
+ "alias": "nowrap";
3310
+ "required": false;
3311
+ "isSignal": true;
3312
+ };
3313
+ "noDataText": {
3314
+ "alias": "noDataText";
3315
+ "required": false;
3316
+ "isSignal": true;
3317
+ };
3318
+ "navigable": {
3319
+ "alias": "navigable";
3320
+ "required": false;
3321
+ "isSignal": true;
3322
+ };
3323
+ "clickable": {
3324
+ "alias": "clickable";
3325
+ "required": false;
3326
+ "isSignal": true;
3327
+ };
3328
+ "rowHref": {
3329
+ "alias": "rowHref";
3330
+ "required": false;
3331
+ "isSignal": true;
3332
+ };
3333
+ "loading": {
3334
+ "alias": "loading";
3335
+ "required": false;
3336
+ "isSignal": true;
3337
+ };
3338
+ "loadingRowCount": {
3339
+ "alias": "loadingRowCount";
3340
+ "required": false;
3341
+ "isSignal": true;
3342
+ };
3343
+ "sort": {
3344
+ "alias": "sort";
3345
+ "required": false;
3346
+ "isSignal": true;
3347
+ };
3348
+ }, {
3349
+ "sort": "sortChange";
3350
+ "sorted": "sorted";
3351
+ "rowActivate": "rowActivate";
3352
+ "rowContextMenu": "rowContextMenu";
3353
+ }, ["noDataTemplate"], ["ea-paginator"], true, never>;
3354
+ }
3355
+ /** Visual size of each digit cell. */
3356
+ export type CodeInputSize = EaSize;
3357
+ /**
3358
+ * Verification code entry made up of one input per digit. Auto-advances on
3359
+ * input, supports paste of the full code at once, and integrates with Angular
3360
+ * forms via `ControlValueAccessor`.
3361
+ */
3362
+ export declare class CodeInputComponent implements ControlValueAccessor {
3363
+ readonly digitEls: import("@angular/core").Signal<readonly ElementRef<HTMLInputElement>[]>;
3364
+ protected readonly i18n: EagamiI18nService;
3365
+ readonly label: import("@angular/core").InputSignal<string | undefined>;
3366
+ /** Optional icon component rendered before the label text. */
3367
+ readonly labelIcon: import("@angular/core").InputSignal<Type<unknown> | undefined>;
3368
+ /** Help revealed by an info button beside the label, as plain text or a template. */
3369
+ readonly labelHelp: import("@angular/core").InputSignal<string | TemplateRef<unknown> | undefined>;
3370
+ /** Placeholder text spread one character per cell (cell i shows character i). */
3371
+ readonly placeholder: import("@angular/core").InputSignal<string>;
3372
+ readonly length: import("@angular/core").InputSignal<number>;
3373
+ readonly size: import("@angular/core").InputSignal<EaSize>;
3374
+ readonly hint: import("@angular/core").InputSignal<string | undefined>;
3375
+ readonly errorMsg: import("@angular/core").InputSignal<string | undefined>;
3376
+ /** Per-validator-key message overrides for a bound form control (e.g. `{ required: '...' }`). */
3377
+ readonly errorMessages: import("@angular/core").InputSignal<Partial<Record<string, string>> | undefined>;
3378
+ readonly disabled: import("@angular/core").InputSignal<boolean>;
3379
+ readonly readonly: import("@angular/core").InputSignal<boolean>;
3380
+ readonly required: import("@angular/core").InputSignal<boolean>;
3381
+ /** Allow any non-whitespace character; when false (default) only digits are accepted. */
3382
+ readonly allowAllChars: import("@angular/core").InputSignal<boolean>;
3383
+ readonly id: import("@angular/core").InputSignal<string>;
3384
+ readonly value: import("@angular/core").ModelSignal<string>;
3385
+ readonly focusedIndex: import("@angular/core").WritableSignal<number>;
3386
+ private readonly _formDisabled;
3387
+ /** Fires with the full code once every digit has been entered. */
3388
+ readonly completed: import("@angular/core").OutputEmitterRef<string>;
3389
+ private onChange;
3390
+ private onTouched;
3391
+ readonly isDisabled: import("@angular/core").Signal<boolean>;
3392
+ private readonly errorState;
3393
+ readonly errorText: import("@angular/core").Signal<string | null>;
3394
+ readonly hasError: import("@angular/core").Signal<boolean>;
3395
+ readonly showError: import("@angular/core").Signal<boolean>;
3396
+ readonly showHint: import("@angular/core").Signal<boolean>;
3397
+ readonly digits: import("@angular/core").Signal<string[]>;
3398
+ readonly placeholders: import("@angular/core").Signal<string[]>;
3399
+ readonly indices: import("@angular/core").Signal<number[]>;
3400
+ writeValue(val: string): void;
3401
+ registerOnChange(fn: (value: string) => void): void;
3402
+ registerOnTouched(fn: () => void): void;
3403
+ setDisabledState(isDisabled: boolean): void;
3404
+ handleInput(event: Event, index: number): void;
3405
+ handleKeydown(event: KeyboardEvent, index: number): void;
3406
+ handlePaste(event: ClipboardEvent): void;
3407
+ handleFocus(index: number): void;
3408
+ handleBlur(): void;
3409
+ /** Moves keyboard focus to the next empty digit (or the last one when full). */
3410
+ focus(): void;
3411
+ private sanitize;
3412
+ private focusDigit;
3413
+ static ɵfac: i0.ɵɵFactoryDeclaration<CodeInputComponent, never>;
3414
+ static ɵcmp: i0.ɵɵComponentDeclaration<CodeInputComponent, "ea-code-input", never, {
3415
+ "label": {
3416
+ "alias": "label";
3417
+ "required": false;
3418
+ "isSignal": true;
3419
+ };
3420
+ "labelIcon": {
3421
+ "alias": "labelIcon";
3422
+ "required": false;
3423
+ "isSignal": true;
3424
+ };
3425
+ "labelHelp": {
3426
+ "alias": "labelHelp";
3427
+ "required": false;
3428
+ "isSignal": true;
3429
+ };
3430
+ "placeholder": {
3431
+ "alias": "placeholder";
3432
+ "required": false;
3433
+ "isSignal": true;
3434
+ };
3435
+ "length": {
3436
+ "alias": "length";
3437
+ "required": false;
3438
+ "isSignal": true;
3439
+ };
3440
+ "size": {
3441
+ "alias": "size";
3442
+ "required": false;
3443
+ "isSignal": true;
3444
+ };
3445
+ "hint": {
3446
+ "alias": "hint";
3447
+ "required": false;
3448
+ "isSignal": true;
3449
+ };
3450
+ "errorMsg": {
3451
+ "alias": "errorMsg";
3452
+ "required": false;
3453
+ "isSignal": true;
3454
+ };
3455
+ "errorMessages": {
3456
+ "alias": "errorMessages";
3457
+ "required": false;
3458
+ "isSignal": true;
3459
+ };
3460
+ "disabled": {
3461
+ "alias": "disabled";
3462
+ "required": false;
3463
+ "isSignal": true;
3464
+ };
3465
+ "readonly": {
3466
+ "alias": "readonly";
3467
+ "required": false;
3468
+ "isSignal": true;
3469
+ };
3470
+ "required": {
3471
+ "alias": "required";
3472
+ "required": false;
3473
+ "isSignal": true;
3474
+ };
3475
+ "allowAllChars": {
3476
+ "alias": "allowAllChars";
3477
+ "required": false;
3478
+ "isSignal": true;
3479
+ };
3480
+ "id": {
3481
+ "alias": "id";
3482
+ "required": false;
3483
+ "isSignal": true;
3484
+ };
3485
+ "value": {
3486
+ "alias": "value";
3487
+ "required": false;
3488
+ "isSignal": true;
3489
+ };
3490
+ }, {
3491
+ "value": "valueChange";
2806
3492
  "completed": "completed";
2807
3493
  }, never, never, true, never>;
2808
3494
  }
@@ -2840,6 +3526,8 @@ export declare class DatePickerComponent implements ControlValueAccessor {
2840
3526
  readonly label: import("@angular/core").InputSignal<string | undefined>;
2841
3527
  /** Optional icon component rendered before the label text. */
2842
3528
  readonly labelIcon: import("@angular/core").InputSignal<Type<unknown> | undefined>;
3529
+ /** Help revealed by an info button beside the label, as plain text or a template. */
3530
+ readonly labelHelp: import("@angular/core").InputSignal<string | TemplateRef<unknown> | undefined>;
2843
3531
  /** Placeholder shown in the field when no date is selected. */
2844
3532
  readonly placeholder: import("@angular/core").InputSignal<string | undefined>;
2845
3533
  readonly size: import("@angular/core").InputSignal<EaSize>;
@@ -2962,6 +3650,11 @@ export declare class DatePickerComponent implements ControlValueAccessor {
2962
3650
  "required": false;
2963
3651
  "isSignal": true;
2964
3652
  };
3653
+ "labelHelp": {
3654
+ "alias": "labelHelp";
3655
+ "required": false;
3656
+ "isSignal": true;
3657
+ };
2965
3658
  "placeholder": {
2966
3659
  "alias": "placeholder";
2967
3660
  "required": false;
@@ -3060,6 +3753,10 @@ export type DialogWidth = EaWidth;
3060
3753
  * `--ea-dialog-body-padding`, and `--ea-dialog-status-padding`; an
3061
3754
  * edge-to-edge media surface zeroes the inset, radius, and paddings.
3062
3755
  *
3756
+ * The first dialog rendered by a component opened through `DialogService`
3757
+ * answers to its `DialogRef`: it opens as soon as it renders, and a dismissal
3758
+ * closes the ref with `undefined`.
3759
+ *
3063
3760
  * Specs running under jsdom need `installNativeDialogShim()` from
3064
3761
  * `@eagami/ui/testing` before opening one.
3065
3762
  */
@@ -3072,6 +3769,7 @@ export declare class DialogComponent implements AfterContentChecked {
3072
3769
  private readonly press;
3073
3770
  private readonly scrollLock;
3074
3771
  private holdsScroll;
3772
+ private boundRef;
3075
3773
  readonly width: import("@angular/core").InputSignal<EaWidth>;
3076
3774
  /**
3077
3775
  * Modal by default: shown via `showModal()`, with the backdrop overlay and
@@ -3115,6 +3813,7 @@ export declare class DialogComponent implements AfterContentChecked {
3115
3813
  protected readonly hasHeader: import("@angular/core").WritableSignal<boolean>;
3116
3814
  ngAfterContentChecked(): void;
3117
3815
  constructor();
3816
+ private closeSurface;
3118
3817
  private holdScroll;
3119
3818
  private dropScroll;
3120
3819
  handleClose(): void;
@@ -3183,6 +3882,64 @@ export declare class DialogComponent implements AfterContentChecked {
3183
3882
  "closeRequested": "closeRequested";
3184
3883
  }, never, ["[slot=header]", "*", "[slot=status]", "[slot=footer]"], true, never>;
3185
3884
  }
3885
+ /**
3886
+ * Handle on one dialog opened through `DialogService`. The component it opened
3887
+ * injects it to close with an answer, which settles `result` for whoever
3888
+ * opened it; a dismissal (Escape, the backdrop, the close button) closes it
3889
+ * with `undefined`. Construct one directly to stand in for the service in a
3890
+ * spec.
3891
+ */
3892
+ export declare class DialogRef<R = unknown> {
3893
+ private readonly isClosed;
3894
+ private settler;
3895
+ /** Whether the dialog has closed. */
3896
+ readonly closed: Signal<boolean>;
3897
+ /**
3898
+ * Settles when the dialog closes: with the value passed to `close`, or with
3899
+ * `undefined` when it was dismissed.
3900
+ */
3901
+ readonly result: Promise<R | undefined>;
3902
+ /** Closes the dialog and settles `result` with `value`. Only the first call has any effect. */
3903
+ close(value?: R): void;
3904
+ }
3905
+ /** Options for {@link DialogService.open}. */
3906
+ export interface DialogOptions {
3907
+ /** Values for the component's inputs, keyed by input name and set before it first renders. */
3908
+ inputs?: Readonly<Record<string, unknown>>;
3909
+ /**
3910
+ * Injector the component resolves its dependencies through, such as the
3911
+ * opener's own so providers scoped to it reach the dialog. Defaults to the
3912
+ * application's root injector.
3913
+ */
3914
+ injector?: Injector;
3915
+ }
3916
+ /**
3917
+ * Opens dialogs from code. `open` renders a component at the end of `<body>`
3918
+ * and returns its {@link DialogRef}. The component lays out its own
3919
+ * `<ea-dialog>`, which shows itself straight away and closes the ref with
3920
+ * `undefined` on any dismissal, and injects the ref to close it with an
3921
+ * answer. Closing the ref takes the component down and hands focus back to
3922
+ * wherever it was when the dialog opened. A dialog opened while another is up
3923
+ * stacks on top of it.
3924
+ *
3925
+ * On the server nothing is rendered and the ref closes at once.
3926
+ */
3927
+ export declare class DialogService {
3928
+ private readonly appRef;
3929
+ private readonly document;
3930
+ private readonly injector;
3931
+ private readonly isBrowser;
3932
+ private readonly openDialogs;
3933
+ /** Dialogs currently open, oldest first. */
3934
+ readonly dialogs: Signal<readonly DialogRef<unknown>[]>;
3935
+ constructor();
3936
+ /** Opens `component` as a dialog and returns its ref, whose `result` settles when it closes. */
3937
+ open<R = unknown>(component: Type<unknown>, options?: DialogOptions): DialogRef<R>;
3938
+ /** Closes every open dialog, newest first, settling each `result` with `undefined`. */
3939
+ closeAll(): void;
3940
+ static ɵfac: i0.ɵɵFactoryDeclaration<DialogService, never>;
3941
+ static ɵprov: i0.ɵɵInjectableDeclaration<any>;
3942
+ }
3186
3943
  /** Orientation of the divider rule. */
3187
3944
  export type DividerOrientation = 'horizontal' | 'vertical';
3188
3945
  /**
@@ -3398,6 +4155,8 @@ export declare class DropdownComponent implements ControlValueAccessor {
3398
4155
  readonly label: import("@angular/core").InputSignal<string | undefined>;
3399
4156
  /** Optional icon component rendered before the label text. */
3400
4157
  readonly labelIcon: import("@angular/core").InputSignal<Type<unknown> | undefined>;
4158
+ /** Help revealed by an info button beside the label, as plain text or a template. */
4159
+ readonly labelHelp: import("@angular/core").InputSignal<string | TemplateRef<unknown> | undefined>;
3401
4160
  readonly placeholder: import("@angular/core").InputSignal<string | undefined>;
3402
4161
  /** Selectable options, either flat or split into groups. */
3403
4162
  readonly options: import("@angular/core").InputSignal<SelectOptions>;
@@ -3482,6 +4241,11 @@ export declare class DropdownComponent implements ControlValueAccessor {
3482
4241
  "required": false;
3483
4242
  "isSignal": true;
3484
4243
  };
4244
+ "labelHelp": {
4245
+ "alias": "labelHelp";
4246
+ "required": false;
4247
+ "isSignal": true;
4248
+ };
3485
4249
  "placeholder": {
3486
4250
  "alias": "placeholder";
3487
4251
  "required": false;
@@ -3646,12 +4410,33 @@ export declare class EmptyStateComponent {
3646
4410
  }, {}, never, ["[slot=media]", "[slot=actions]"], true, never>;
3647
4411
  }
3648
4412
  export declare class FieldLabelComponent {
4413
+ private readonly i18n;
4414
+ private readonly press;
4415
+ private readonly renderer;
3649
4416
  readonly text: import("@angular/core").InputSignal<string>;
3650
4417
  /** Optional icon component rendered before the label text. */
3651
4418
  readonly icon: import("@angular/core").InputSignal<Type<unknown> | undefined>;
4419
+ /**
4420
+ * Help revealed by an info button beside the label, as plain text or a
4421
+ * template. Click, tap, Enter or Space toggles it, and it is announced when
4422
+ * shown; Escape, a click outside, or moving focus away closes it.
4423
+ */
4424
+ readonly help: import("@angular/core").InputSignal<string | TemplateRef<unknown> | undefined>;
3652
4425
  readonly forId: import("@angular/core").InputSignal<string | undefined>;
3653
4426
  readonly required: import("@angular/core").InputSignal<boolean>;
3654
4427
  readonly labelId: import("@angular/core").InputSignal<string | undefined>;
4428
+ protected readonly helpOpen: import("@angular/core").WritableSignal<boolean>;
4429
+ protected readonly helpId: string;
4430
+ protected readonly helpTemplate: import("@angular/core").Signal<TemplateRef<unknown> | null>;
4431
+ protected readonly helpTriggerLabel: import("@angular/core").Signal<string>;
4432
+ private readonly helpEl;
4433
+ private readonly helpTrigger;
4434
+ private readonly helpBubble;
4435
+ constructor();
4436
+ protected toggleHelp(): void;
4437
+ protected onHelpFocusout(event: FocusEvent): void;
4438
+ /** Raises and places an open bubble and wires its dismissal; returns the teardown. */
4439
+ private attachHelpBubble;
3655
4440
  static ɵfac: i0.ɵɵFactoryDeclaration<FieldLabelComponent, never>;
3656
4441
  static ɵcmp: i0.ɵɵComponentDeclaration<FieldLabelComponent, "ea-field-label", never, {
3657
4442
  "text": {
@@ -3664,6 +4449,11 @@ export declare class FieldLabelComponent {
3664
4449
  "required": false;
3665
4450
  "isSignal": true;
3666
4451
  };
4452
+ "help": {
4453
+ "alias": "help";
4454
+ "required": false;
4455
+ "isSignal": true;
4456
+ };
3667
4457
  "forId": {
3668
4458
  "alias": "forId";
3669
4459
  "required": false;
@@ -3725,6 +4515,8 @@ export declare class FormFieldComponent {
3725
4515
  readonly label: import("@angular/core").InputSignal<string | undefined>;
3726
4516
  /** Optional icon component rendered before the label text. */
3727
4517
  readonly labelIcon: import("@angular/core").InputSignal<Type<unknown> | undefined>;
4518
+ /** Help revealed by an info button beside the label, as plain text or a template. */
4519
+ readonly labelHelp: import("@angular/core").InputSignal<string | TemplateRef<unknown> | undefined>;
3728
4520
  /** Helper text shown below the control; hidden while an error is showing. */
3729
4521
  readonly hint: import("@angular/core").InputSignal<string | undefined>;
3730
4522
  /** Error message shown below the control; replaces the hint and flags the field invalid. */
@@ -3760,6 +4552,11 @@ export declare class FormFieldComponent {
3760
4552
  "required": false;
3761
4553
  "isSignal": true;
3762
4554
  };
4555
+ "labelHelp": {
4556
+ "alias": "labelHelp";
4557
+ "required": false;
4558
+ "isSignal": true;
4559
+ };
3763
4560
  "hint": {
3764
4561
  "alias": "hint";
3765
4562
  "required": false;
@@ -3842,6 +4639,8 @@ declare function controlErrorStateFrom(control: Signal<AbstractControl | null>,
3842
4639
  declare function injectControlErrorState(config: ControlErrorStateConfig): ControlErrorState;
3843
4640
  /** Visual size of the file uploader. */
3844
4641
  export type FileUploaderSize = EaSize;
4642
+ /** Presentation of the uploader: a drag-and-drop zone, or a compact picker button. */
4643
+ export type FileUploaderVariant = 'dropzone' | 'button';
3845
4644
  /** Reason a file was rejected during selection. */
3846
4645
  export type FileUploaderRejectionReason = 'type' | 'size' | 'count';
3847
4646
  /** Detail object emitted on the `rejected` output when one or more files fail validation. */
@@ -3859,25 +4658,56 @@ export interface FileUploaderRejection {
3859
4658
  * slot via the `icon` attribute: project any element to override it, and the
3860
4659
  * dropzone's size-aware wrapper handles sizing automatically.
3861
4660
  *
4661
+ * Where a dropzone is too large, `variant="button"` swaps it for a compact
4662
+ * `ea-button` that opens the file picker, keeping the same validation, file
4663
+ * list and outputs.
4664
+ *
3862
4665
  * @example
3863
4666
  * ```html
3864
4667
  * <ea-file-uploader label="Attach files">
3865
4668
  * <ea-icon-paperclip icon />
3866
4669
  * </ea-file-uploader>
4670
+ *
4671
+ * <ea-file-uploader
4672
+ * variant="button"
4673
+ * accept=".csv"
4674
+ * buttonLabel="Import CSV"
4675
+ * [buttonIcon]="uploadIcon"
4676
+ * [multiple]="false" />
3867
4677
  * ```
3868
4678
  */
3869
4679
  export declare class FileUploaderComponent implements ControlValueAccessor {
3870
4680
  private readonly fileInputEl;
3871
4681
  private readonly dropzoneEl;
4682
+ private readonly pickerButton;
3872
4683
  protected readonly i18n: EagamiI18nService;
3873
4684
  readonly label: import("@angular/core").InputSignal<string | undefined>;
3874
4685
  /** Optional icon component rendered before the label text. */
3875
4686
  readonly labelIcon: import("@angular/core").InputSignal<Type<unknown> | undefined>;
4687
+ /** Help revealed by an info button beside the label, as plain text or a template. */
4688
+ readonly labelHelp: import("@angular/core").InputSignal<string | TemplateRef<unknown> | undefined>;
3876
4689
  readonly hint: import("@angular/core").InputSignal<string | undefined>;
3877
4690
  readonly errorMsg: import("@angular/core").InputSignal<string | undefined>;
3878
4691
  /** Per-validator-key message overrides for a bound form control (e.g. `{ required: '...' }`). */
3879
4692
  readonly errorMessages: import("@angular/core").InputSignal<Partial<Record<string, string>> | undefined>;
3880
4693
  readonly size: import("@angular/core").InputSignal<EaSize>;
4694
+ /**
4695
+ * `dropzone` renders the drag-and-drop area; `button` renders a compact
4696
+ * secondary `ea-button` that opens the file picker instead, without drop support.
4697
+ */
4698
+ readonly variant: import("@angular/core").InputSignal<FileUploaderVariant>;
4699
+ /**
4700
+ * Visible text of the `button` variant, falling back to the localized "Browse
4701
+ * files". An empty string together with a `buttonIcon` leaves an icon-only button.
4702
+ */
4703
+ readonly buttonLabel: import("@angular/core").InputSignal<string | undefined>;
4704
+ /** Optional icon component rendered before the `button` variant's text. */
4705
+ readonly buttonIcon: import("@angular/core").InputSignal<Type<unknown> | undefined>;
4706
+ /**
4707
+ * Accessible name when nothing visible names the control: no `label`, and in
4708
+ * the `button` variant no button text either.
4709
+ */
4710
+ readonly ariaLabel: import("@angular/core").InputSignal<string | undefined>;
3881
4711
  readonly disabled: import("@angular/core").InputSignal<boolean>;
3882
4712
  readonly required: import("@angular/core").InputSignal<boolean>;
3883
4713
  /**
@@ -3895,7 +4725,12 @@ export declare class FileUploaderComponent implements ControlValueAccessor {
3895
4725
  /** Toggle the file list under the dropzone. */
3896
4726
  readonly showFileList: import("@angular/core").InputSignal<boolean>;
3897
4727
  /**
3898
- * Optional per-file progress (0-100). Keyed by `File` object identity, so
4728
+ * Toggle the line listing the accepted types, size and file count limits, for a
4729
+ * compact placement (an icon button in a toolbar) where it would crowd the control.
4730
+ */
4731
+ readonly showConstraints: import("@angular/core").InputSignal<boolean>;
4732
+ /**
4733
+ * Optional per-file progress (0-100). Keyed by `File` object identity, so
3899
4734
  * consumers must keep the same `File` references between change-detection
3900
4735
  * runs. When unset, no progress bar is rendered.
3901
4736
  */
@@ -3926,6 +4761,7 @@ export declare class FileUploaderComponent implements ControlValueAccessor {
3926
4761
  protected readonly showHint: import("@angular/core").Signal<boolean>;
3927
4762
  protected readonly hostClasses: import("@angular/core").Signal<{
3928
4763
  [x: string]: boolean;
4764
+ 'ea-file-uploader-field--button': boolean;
3929
4765
  'ea-file-uploader-field--error': boolean;
3930
4766
  'ea-file-uploader-field--disabled': boolean;
3931
4767
  'ea-file-uploader-field--drag-over': boolean;
@@ -3938,6 +4774,12 @@ export declare class FileUploaderComponent implements ControlValueAccessor {
3938
4774
  /** Joined human-readable description of accept / maxSize / maxFiles limits. */
3939
4775
  protected readonly constraintsText: import("@angular/core").Signal<string>;
3940
4776
  protected readonly promptText: import("@angular/core").Signal<string>;
4777
+ protected readonly dropzoneLabel: import("@angular/core").Signal<string>;
4778
+ protected readonly labelId: import("@angular/core").Signal<string>;
4779
+ protected readonly buttonTextId: import("@angular/core").Signal<string>;
4780
+ protected readonly buttonText: import("@angular/core").Signal<string>;
4781
+ protected readonly buttonLabelledBy: import("@angular/core").Signal<string | undefined>;
4782
+ protected readonly buttonAriaLabel: import("@angular/core").Signal<string | undefined>;
3941
4783
  writeValue(value: readonly File[] | null | undefined): void;
3942
4784
  registerOnChange(fn: (value: readonly File[]) => void): void;
3943
4785
  registerOnTouched(fn: () => void): void;
@@ -3946,6 +4788,7 @@ export declare class FileUploaderComponent implements ControlValueAccessor {
3946
4788
  protected onDropzoneKeydown(event: KeyboardEvent): void;
3947
4789
  protected onDropzoneFocus(): void;
3948
4790
  protected onDropzoneBlur(): void;
4791
+ protected onPickerButtonFocusOut(): void;
3949
4792
  protected onFileSelected(event: Event): void;
3950
4793
  protected onDragEnter(event: DragEvent): void;
3951
4794
  protected onDragOver(event: DragEvent): void;
@@ -3971,6 +4814,11 @@ export declare class FileUploaderComponent implements ControlValueAccessor {
3971
4814
  "required": false;
3972
4815
  "isSignal": true;
3973
4816
  };
4817
+ "labelHelp": {
4818
+ "alias": "labelHelp";
4819
+ "required": false;
4820
+ "isSignal": true;
4821
+ };
3974
4822
  "hint": {
3975
4823
  "alias": "hint";
3976
4824
  "required": false;
@@ -3991,6 +4839,26 @@ export declare class FileUploaderComponent implements ControlValueAccessor {
3991
4839
  "required": false;
3992
4840
  "isSignal": true;
3993
4841
  };
4842
+ "variant": {
4843
+ "alias": "variant";
4844
+ "required": false;
4845
+ "isSignal": true;
4846
+ };
4847
+ "buttonLabel": {
4848
+ "alias": "buttonLabel";
4849
+ "required": false;
4850
+ "isSignal": true;
4851
+ };
4852
+ "buttonIcon": {
4853
+ "alias": "buttonIcon";
4854
+ "required": false;
4855
+ "isSignal": true;
4856
+ };
4857
+ "ariaLabel": {
4858
+ "alias": "aria-label";
4859
+ "required": false;
4860
+ "isSignal": true;
4861
+ };
3994
4862
  "disabled": {
3995
4863
  "alias": "disabled";
3996
4864
  "required": false;
@@ -4026,6 +4894,11 @@ export declare class FileUploaderComponent implements ControlValueAccessor {
4026
4894
  "required": false;
4027
4895
  "isSignal": true;
4028
4896
  };
4897
+ "showConstraints": {
4898
+ "alias": "showConstraints";
4899
+ "required": false;
4900
+ "isSignal": true;
4901
+ };
4029
4902
  "progress": {
4030
4903
  "alias": "progress";
4031
4904
  "required": false;
@@ -4066,6 +4939,8 @@ export declare class InputComponent implements ControlValueAccessor {
4066
4939
  readonly label: import("@angular/core").InputSignal<string | undefined>;
4067
4940
  /** Optional icon component rendered before the label text. */
4068
4941
  readonly labelIcon: import("@angular/core").InputSignal<Type<unknown> | undefined>;
4942
+ /** Help revealed by an info button beside the label, as plain text or a template. */
4943
+ readonly labelHelp: import("@angular/core").InputSignal<string | TemplateRef<unknown> | undefined>;
4069
4944
  /** Accessible name for the control when no visible `label` is set. */
4070
4945
  readonly ariaLabel: import("@angular/core").InputSignal<string | undefined>;
4071
4946
  /** ARIA role applied to the native input, e.g. `combobox` for a typeahead host. */
@@ -4185,6 +5060,11 @@ export declare class InputComponent implements ControlValueAccessor {
4185
5060
  "required": false;
4186
5061
  "isSignal": true;
4187
5062
  };
5063
+ "labelHelp": {
5064
+ "alias": "labelHelp";
5065
+ "required": false;
5066
+ "isSignal": true;
5067
+ };
4188
5068
  "ariaLabel": {
4189
5069
  "alias": "aria-label";
4190
5070
  "required": false;
@@ -4398,9 +5278,9 @@ interface XDomain {
4398
5278
  * Plots one or more series of values as lines, with optional points and area
4399
5279
  * fills. Points are spaced evenly by default, or placed along a numeric scale
4400
5280
  * by `xValues`, with the x-axis labelled per point or by `xTicks`. A
4401
- * `visibleXSpan` window makes a long run of data pannable. Hovering or
4402
- * arrowing through the chart reveals each point's values in a tooltip, and a
4403
- * visually hidden table carries the full data for screen readers.
5281
+ * `visibleXSpan` window makes a long run of data pannable. Hovering, tapping,
5282
+ * or arrowing through the chart reveals each point's values in a tooltip, and
5283
+ * a visually hidden table carries the full data for screen readers.
4404
5284
  */
4405
5285
  export declare class LineChartComponent {
4406
5286
  protected readonly i18n: EagamiI18nService;
@@ -4469,6 +5349,7 @@ export declare class LineChartComponent {
4469
5349
  readonly visibleRangeChange: import("@angular/core").OutputEmitterRef<LineChartVisibleRange>;
4470
5350
  private readonly viewport;
4471
5351
  private readonly format;
5352
+ private readonly plotEl;
4472
5353
  protected readonly active: import("@angular/core").WritableSignal<ActivePoint | null>;
4473
5354
  protected readonly clipId: string;
4474
5355
  protected readonly breakMaskId: string;
@@ -4478,6 +5359,7 @@ export declare class LineChartComponent {
4478
5359
  protected readonly panning: import("@angular/core").WritableSignal<boolean>;
4479
5360
  private drag;
4480
5361
  private suppressClick;
5362
+ private releaseTap;
4481
5363
  protected readonly label: import("@angular/core").Signal<string>;
4482
5364
  protected readonly count: import("@angular/core").Signal<number>;
4483
5365
  protected readonly hasData: import("@angular/core").Signal<boolean>;
@@ -4528,568 +5410,222 @@ export declare class LineChartComponent {
4528
5410
  value: string;
4529
5411
  active: boolean;
4530
5412
  }[];
4531
- key: string;
4532
- } | null>;
4533
- protected readonly tooltips: import("@angular/core").Signal<{
4534
- x: number;
4535
- y: number;
4536
- title: string;
4537
- rows: {
4538
- name: string;
4539
- color: string;
4540
- value: string;
4541
- active: boolean;
4542
- }[];
4543
- key: string;
4544
- }[]>;
4545
- protected readonly announcement: import("@angular/core").Signal<string>;
4546
- protected readonly showsLegend: import("@angular/core").Signal<boolean>;
4547
- protected seriesColor(index: number): string;
4548
- protected isDimmed(index: number): boolean;
4549
- protected isActivePoint(seriesIndex: number, index: number): boolean;
4550
- protected tableValue(value: number | null | undefined): string;
4551
- protected onPointerDown(event: PointerEvent): void;
4552
- protected onPointerMove(event: PointerEvent): void;
4553
- protected onPointerUp(event: PointerEvent): void;
4554
- protected onPointerLeave(): void;
4555
- protected onWheel(event: WheelEvent): void;
4556
- protected onClick(): void;
4557
- protected onFocus(): void;
4558
- protected onBlur(): void;
4559
- protected onKeydown(event: KeyboardEvent): void;
4560
- private isValue;
4561
- private yScale;
4562
- private atPosition;
4563
- private xLabelCandidates;
4564
- private labelsFit;
4565
- private xLabels;
4566
- private widestXLabel;
4567
- protected onGestureStart(event: Event): void;
4568
- protected onGestureChange(event: Event): void;
4569
- protected onGestureEnd(): void;
4570
- private zoomTo;
4571
- private minSpan;
4572
- private unitsPerPx;
4573
- private panTo;
4574
- private endDrag;
4575
- private reveal;
4576
- private indexAt;
4577
- private valueAt;
4578
- private firstPoint;
4579
- private nearestValid;
4580
- private eventFor;
4581
- private setActive;
4582
- static ɵfac: i0.ɵɵFactoryDeclaration<LineChartComponent, never>;
4583
- static ɵcmp: i0.ɵɵComponentDeclaration<LineChartComponent, "ea-line-chart", never, {
4584
- "labels": {
4585
- "alias": "labels";
4586
- "required": false;
4587
- "isSignal": true;
4588
- };
4589
- "series": {
4590
- "alias": "series";
4591
- "required": false;
4592
- "isSignal": true;
4593
- };
4594
- "xValues": {
4595
- "alias": "xValues";
4596
- "required": false;
4597
- "isSignal": true;
4598
- };
4599
- "xTicks": {
4600
- "alias": "xTicks";
4601
- "required": false;
4602
- "isSignal": true;
4603
- };
4604
- "visibleXSpan": {
4605
- "alias": "visibleXSpan";
4606
- "required": false;
4607
- "isSignal": true;
4608
- };
4609
- "curve": {
4610
- "alias": "curve";
4611
- "required": false;
4612
- "isSignal": true;
4613
- };
4614
- "showArea": {
4615
- "alias": "showArea";
4616
- "required": false;
4617
- "isSignal": true;
4618
- };
4619
- "showPoints": {
4620
- "alias": "showPoints";
4621
- "required": false;
4622
- "isSignal": true;
4623
- };
4624
- "showGrid": {
4625
- "alias": "showGrid";
4626
- "required": false;
4627
- "isSignal": true;
4628
- };
4629
- "showLegend": {
4630
- "alias": "showLegend";
4631
- "required": false;
4632
- "isSignal": true;
4633
- };
4634
- "yMin": {
4635
- "alias": "yMin";
4636
- "required": false;
4637
- "isSignal": true;
4638
- };
4639
- "yMax": {
4640
- "alias": "yMax";
4641
- "required": false;
4642
- "isSignal": true;
4643
- };
4644
- "xLabelOrientation": {
4645
- "alias": "xLabelOrientation";
4646
- "required": false;
4647
- "isSignal": true;
4648
- };
4649
- "showAxisBreak": {
4650
- "alias": "showAxisBreak";
4651
- "required": false;
4652
- "isSignal": true;
4653
- };
4654
- "height": {
4655
- "alias": "height";
4656
- "required": false;
4657
- "isSignal": true;
4658
- };
4659
- "size": {
4660
- "alias": "size";
4661
- "required": false;
4662
- "isSignal": true;
4663
- };
4664
- "animation": {
4665
- "alias": "animation";
4666
- "required": false;
4667
- "isSignal": true;
4668
- };
4669
- "animationDuration": {
4670
- "alias": "animationDuration";
4671
- "required": false;
4672
- "isSignal": true;
4673
- };
4674
- "formatValue": {
4675
- "alias": "formatValue";
4676
- "required": false;
4677
- "isSignal": true;
4678
- };
4679
- "ariaLabel": {
4680
- "alias": "aria-label";
4681
- "required": false;
4682
- "isSignal": true;
4683
- };
4684
- }, {
4685
- "pointClick": "pointClick";
4686
- "activePointChange": "activePointChange";
4687
- "visibleRangeChange": "visibleRangeChange";
4688
- }, never, never, true, never>;
4689
- }
4690
- /** Placement of the menu list relative to its trigger. */
4691
- export type MenuPlacement = 'bottom-start' | 'bottom-end' | 'top-start' | 'top-end';
4692
- /** Visual size of the menu, shared by all of its items. */
4693
- export type MenuSize = EaSize;
4694
- /**
4695
- * Popup action menu attached to any focusable element via the
4696
- * `[eaMenuTrigger]` directive. Supports keyboard navigation
4697
- * (arrow keys, Home/End), closes on outside click or Escape, and restores
4698
- * focus to the trigger on close. Positioning, dismissal, and SSR-safe scroll
4699
- * handling are provided by `<ea-popover>`.
4700
- */
4701
- export declare class MenuComponent {
4702
- private readonly injector;
4703
- private readonly i18n;
4704
- private readonly listEl;
4705
- readonly placement: import("@angular/core").InputSignal<MenuPlacement>;
4706
- /** Visual size of the menu; every item inherits it. */
4707
- readonly size: import("@angular/core").InputSignal<EaSize>;
4708
- /** Max height of the scrollable list as a CSS length; tall menus scroll past it. */
4709
- readonly maxHeight: import("@angular/core").InputSignal<string>;
4710
- readonly disabled: import("@angular/core").InputSignal<boolean>;
4711
- readonly ariaLabel: import("@angular/core").InputSignal<string | undefined>;
4712
- readonly id: import("@angular/core").InputSignal<string>;
4713
- /** Accessible label for the menu, falling back to the active locale. */
4714
- readonly resolvedAriaLabel: import("@angular/core").Signal<string>;
4715
- readonly open: import("@angular/core").ModelSignal<boolean>;
4716
- /** Fires when the menu opens. */
4717
- readonly opened: import("@angular/core").OutputEmitterRef<void>;
4718
- /** Fires when the menu closes. */
4719
- readonly closed: import("@angular/core").OutputEmitterRef<void>;
4720
- /** Trigger element currently anchoring the menu. Signal-typed so `<ea-popover>` reacts when it changes. */
4721
- protected readonly triggerEl: import("@angular/core").WritableSignal<HTMLElement | undefined>;
4722
- readonly activeItemId: import("@angular/core").WritableSignal<string | null>;
4723
- constructor();
4724
- /** Toggles the menu open state, anchoring it to the given trigger element. */
4725
- toggleAt(triggerEl: HTMLElement): void;
4726
- /** Opens the menu anchored to the given trigger element and focuses the first item. */
4727
- openAt(triggerEl: HTMLElement): void;
4728
- /**
4729
- * Closes the menu if it is open. Pass `restoreFocus: true` to return focus
4730
- * to the trigger element (used when closing via Escape or item activation;
4731
- * not used on outside click, where the user has chosen a new focus target).
4732
- */
4733
- close(restoreFocus?: boolean): void;
4734
- /** Called by `<ea-popover>` when the user clicks outside the menu. */
4735
- onPopoverCloseRequested(): void;
4736
- private getEnabledItems;
4737
- /**
4738
- * `preventScroll: true` is critical here. The menu list is `position: fixed`
4739
- * but its DOM ancestor is whatever element hosts the menu (often a sticky
4740
- * header). When `.focus()` is called without `preventScroll`, Chromium uses
4741
- * the focused element's DOM-tree position (inside the sticky ancestor) rather
4742
- * than its rendered fixed position to decide whether to scroll, which on a
4743
- * scrolled page nudges the document up by a few pixels per open, until the
4744
- * trigger reaches the top edge. The same guard applies to keyboard navigation
4745
- * and restoring focus on close.
4746
- */
4747
- private focusFirstItem;
4748
- private focusItem;
4749
- onKeydown(event: KeyboardEvent): void;
4750
- onEscape(event: Event): void;
4751
- static ɵfac: i0.ɵɵFactoryDeclaration<MenuComponent, never>;
4752
- static ɵcmp: i0.ɵɵComponentDeclaration<MenuComponent, "ea-menu", never, {
4753
- "placement": {
4754
- "alias": "placement";
4755
- "required": false;
4756
- "isSignal": true;
4757
- };
4758
- "size": {
4759
- "alias": "size";
4760
- "required": false;
4761
- "isSignal": true;
4762
- };
4763
- "maxHeight": {
4764
- "alias": "maxHeight";
4765
- "required": false;
4766
- "isSignal": true;
4767
- };
4768
- "disabled": {
4769
- "alias": "disabled";
4770
- "required": false;
4771
- "isSignal": true;
4772
- };
4773
- "ariaLabel": {
4774
- "alias": "aria-label";
4775
- "required": false;
4776
- "isSignal": true;
4777
- };
4778
- "id": {
4779
- "alias": "id";
4780
- "required": false;
4781
- "isSignal": true;
4782
- };
4783
- "open": {
4784
- "alias": "open";
4785
- "required": false;
4786
- "isSignal": true;
4787
- };
4788
- }, {
4789
- "open": "openChange";
4790
- "opened": "opened";
4791
- "closed": "closed";
4792
- }, never, ["*"], true, never>;
4793
- }
4794
- /** Visual style of a menu item; `danger` for destructive actions. */
4795
- export type MenuItemVariant = 'default' | 'danger';
4796
- /**
4797
- * Selectable row inside an `ea-menu`. Supports leading icons via the `icon`
4798
- * content slot, a disabled state, and a `danger` variant for destructive
4799
- * actions. Inherits its size from the parent menu, and activating an item
4800
- * closes that menu.
4801
- */
4802
- export declare class MenuItemComponent {
4803
- private readonly menu;
4804
- protected readonly itemId: string;
4805
- protected readonly tabIndex: import("@angular/core").Signal<0 | -1>;
4806
- readonly disabled: import("@angular/core").InputSignal<boolean>;
4807
- readonly variant: import("@angular/core").InputSignal<MenuItemVariant>;
4808
- /** Fires when the item is activated; the parent menu closes immediately afterwards. */
4809
- readonly clicked: import("@angular/core").OutputEmitterRef<MouseEvent>;
4810
- handleClick(event: MouseEvent): void;
4811
- static ɵfac: i0.ɵɵFactoryDeclaration<MenuItemComponent, never>;
4812
- static ɵcmp: i0.ɵɵComponentDeclaration<MenuItemComponent, "ea-menu-item", never, {
4813
- "disabled": {
4814
- "alias": "disabled";
4815
- "required": false;
4816
- "isSignal": true;
4817
- };
4818
- "variant": {
4819
- "alias": "variant";
4820
- "required": false;
4821
- "isSignal": true;
4822
- };
4823
- }, {
4824
- "clicked": "clicked";
4825
- }, never, ["[slot=icon]", "*"], true, never>;
4826
- }
4827
- /**
4828
- * Wires a focusable host element (typically a button) to an `ea-menu`,
4829
- * handling click and keyboard activation (ArrowDown/Enter/Space to open,
4830
- * Escape to close) and applying the appropriate ARIA attributes.
4831
- */
4832
- export declare class MenuTriggerDirective {
4833
- private readonly el;
4834
- private readonly renderer;
4835
- readonly menu: import("@angular/core").InputSignal<MenuComponent>;
4836
- constructor();
4837
- handleClick(): void;
4838
- handleKeydown(event: KeyboardEvent): void;
4839
- static ɵfac: i0.ɵɵFactoryDeclaration<MenuTriggerDirective, never>;
4840
- static ɵdir: i0.ɵɵDirectiveDeclaration<MenuTriggerDirective, "[eaMenuTrigger]", never, {
4841
- "menu": {
4842
- "alias": "eaMenuTrigger";
4843
- "required": true;
4844
- "isSignal": true;
4845
- };
4846
- }, {}, never, never, true, never>;
4847
- }
4848
- /**
4849
- * Placement of the popover relative to its anchor. Each placement names the
4850
- * side of the anchor the popover attaches to, optionally followed by a corner
4851
- * suffix (`-start` or `-end`) that decides the alignment along the perpendicular
4852
- * axis. The plain side names (`top`, `bottom`, `left`, `right`) centre the
4853
- * popover on that axis.
4854
- */
4855
- export type PopoverPlacement = 'top' | 'top-start' | 'top-end' | 'bottom' | 'bottom-start' | 'bottom-end' | 'left' | 'right';
4856
- export interface PopoverPositionResult {
4857
- /** Top coordinate in viewport (px); pairs with `position: fixed`. */
4858
- readonly top: number;
4859
- /** Left coordinate in viewport (px). */
4860
- readonly left: number;
4861
- /** Width hint when the popover should match the anchor's width. */
4862
- readonly width?: number;
4863
- /** The anchor's measured width, for a caller capping the popover against it. */
4864
- readonly anchorWidth: number;
4865
- /** Effective placement after any flip logic ran. */
4866
- readonly placement: PopoverPlacement;
4867
- }
4868
- export interface PopoverPositionOptions {
4869
- readonly placement: PopoverPlacement;
4870
- /** Gap in px between the anchor and the popover. Default 4. */
4871
- readonly offset?: number;
4872
- /** Flip to the opposite side when the requested side overflows the viewport. Default true. */
4873
- readonly flip?: boolean;
4874
- /** Clamp inside the viewport when the popover still overflows after any flip. Default true. */
4875
- readonly clamp?: boolean;
4876
- /** Margin from the viewport edge in px when clamping. Default 8. */
4877
- readonly margin?: number;
4878
- /** Set the popover's width to match the anchor's. Useful for dropdown-style menus. */
4879
- readonly matchAnchorWidth?: boolean;
4880
- /** Right-to-left context. Swaps `-start`/`-end` alignment so they track the reading direction. */
4881
- readonly rtl?: boolean;
4882
- }
4883
- interface Rect {
4884
- readonly width: number;
4885
- readonly height: number;
4886
- }
4887
- interface AnchorRect extends Rect {
4888
- readonly top: number;
4889
- readonly bottom: number;
4890
- readonly left: number;
4891
- readonly right: number;
4892
- }
4893
- interface Viewport {
4894
- readonly width: number;
4895
- readonly height: number;
4896
- }
4897
- /**
4898
- * Computes the viewport-space top/left for a popover anchored to `anchorRect`,
4899
- * applying optional flip-on-overflow and edge-clamp logic. Pure function, no
4900
- * DOM access. Both `<ea-popover>` and `[eaTooltip]` consume this.
4901
- *
4902
- * @param anchorRect The anchor element's `getBoundingClientRect()`.
4903
- * @param popoverRect Width and height of the popover (post-render measurement).
4904
- * @param viewport Viewport dimensions (`window.innerWidth/Height`).
4905
- * @param options Placement and behavior flags.
4906
- */
4907
- export declare function computePopoverPosition(anchorRect: AnchorRect, popoverRect: Rect, viewport: Viewport, options: PopoverPositionOptions): PopoverPositionResult;
4908
- /** ARIA role to apply to the popover surface. */
4909
- export type PopoverRole = 'menu' | 'listbox' | 'dialog' | 'tooltip' | 'grid';
4910
- /**
4911
- * How the popover should respond to scroll / resize events while open.
4912
- *
4913
- * - `reposition` (default): re-measure the anchor and update the popover's
4914
- * coordinates so it stays attached. Suitable for menus and tooltips.
4915
- * - `close`: request close. Suitable for dropdown lists and the colour-picker
4916
- * popover, where re-tracking a tall popover during a scroll feels intrusive.
4917
- * - `ignore`: do nothing. The popover stays at its initial coordinates and
4918
- * may visually detach from a scrolling anchor; useful when the anchor is
4919
- * guaranteed not to move (e.g. inside a non-scrolling region).
4920
- */
4921
- export type PopoverScrollBehavior = 'reposition' | 'close' | 'ignore';
4922
- /** Width cap for a popover surface: px, or the anchor's own width. */
4923
- export type PopoverMaxWidth = number | 'anchor';
4924
- /**
4925
- * Floating-element primitive. Renders projected content as `position: fixed`
4926
- * anchored to an external element, with flip-on-overflow, viewport clamping,
4927
- * outside-click and Escape dismissal, and SSR-safe scroll / resize handling.
4928
- *
4929
- * The primitive is intentionally low-level: a parent component drives the
4930
- * `[open]` state and listens for `(closeRequested)` to mirror it back. Internal
4931
- * library components (`<ea-menu>`, `<ea-dropdown>`, `<ea-color-picker>`,
4932
- * `<ea-date-picker>`, `[eaTooltip]`) compose on top of it; downstream apps can
4933
- * use it directly to build their own popover-based UI.
4934
- *
4935
- * @example
4936
- * ```html
4937
- * <button #trigger (click)="open.set(!open())">Open</button>
4938
- * <ea-popover [anchor]="trigger" [open]="open()" (closeRequested)="open.set(false)">
4939
- * <div>Popover content</div>
4940
- * </ea-popover>
4941
- * ```
4942
- */
4943
- export declare class PopoverComponent {
4944
- private readonly destroyRef;
4945
- private readonly press;
4946
- private readonly surfaceEl;
4947
- /** Anchor element the popover positions itself against. */
4948
- readonly anchor: import("@angular/core").InputSignal<HTMLElement | ElementRef<HTMLElement> | undefined>;
4949
- /** Whether the popover is currently open. */
4950
- readonly open: import("@angular/core").InputSignal<boolean>;
4951
- /** Where the popover attaches relative to the anchor. */
4952
- readonly placement: import("@angular/core").InputSignal<PopoverPlacement>;
4953
- /** ARIA role applied to the popover surface. */
4954
- readonly role: import("@angular/core").InputSignal<PopoverRole>;
4955
- /** Accessible label. Falls back to nothing; consumers should provide one when no visible heading is in the popover. */
4956
- readonly ariaLabel: import("@angular/core").InputSignal<string | undefined>;
4957
- /** Id of the element that labels the popover surface, forwarded as `aria-labelledby`. */
4958
- readonly ariaLabelledby: import("@angular/core").InputSignal<string | undefined>;
4959
- /** Keep Tab and Shift+Tab cycling within the surface while open (dialog pattern). */
4960
- readonly trapFocus: import("@angular/core").InputSignal<boolean>;
4961
- /** DOM id for the surface so trigger elements can reference it via aria-controls. */
4962
- readonly surfaceId: import("@angular/core").InputSignal<string>;
4963
- /**
4964
- * Gap in px between the anchor and the popover. Defaults to 2 so an open panel
4965
- * clears the anchor's active focus ring instead of sitting flush over it.
4966
- */
4967
- readonly offset: import("@angular/core").InputSignal<number>;
4968
- /** Flip to the opposite side when the requested side overflows the viewport. */
4969
- readonly flip: import("@angular/core").InputSignal<boolean>;
4970
- /** Clamp the popover inside the viewport when it would otherwise overflow. */
4971
- readonly clamp: import("@angular/core").InputSignal<boolean>;
4972
- /** Set the popover's `min-width` to match the anchor's width (dropdown pattern). */
4973
- readonly matchAnchorWidth: import("@angular/core").InputSignal<boolean>;
4974
- /**
4975
- * Widest the surface may grow: a px value, or `anchor` to cap it at the
4976
- * anchor's own width so long content truncates instead of widening the panel.
4977
- */
4978
- readonly maxWidth: import("@angular/core").InputSignal<PopoverMaxWidth | undefined>;
4979
- /** Close on click outside the popover and the anchor. */
4980
- readonly closeOnOutsideClick: import("@angular/core").InputSignal<boolean>;
4981
- /** Close on Escape. */
4982
- readonly closeOnEscape: import("@angular/core").InputSignal<boolean>;
4983
- /** What to do on scroll / resize while open. */
4984
- readonly scrollBehavior: import("@angular/core").InputSignal<PopoverScrollBehavior>;
4985
- /** Requested close. The parent should mirror this into `[open]`. */
4986
- readonly closeRequested: import("@angular/core").OutputEmitterRef<void>;
4987
- private readonly position;
4988
- private latched;
4989
- /** True placement after flip, for class-based styling (e.g. arrow direction). */
4990
- readonly effectivePlacement: import("@angular/core").Signal<PopoverPlacement>;
4991
- /** Latches true once the post-rAF reposition has run, so the surface is
4992
- * only revealed after its dimensions are guaranteed stable. Reset on close. */
4993
- private readonly stable;
4994
- /** True once the first `reposition()` has resolved a placement on a
4995
- * laid-out surface. Drives the `--positioned` class. */
4996
- readonly isPositioned: import("@angular/core").Signal<boolean>;
4997
- /** Class list for the surface. Computed in TS so the placement key (with
4998
- * its interpolated suffix) and the positioned modifier compose cleanly. */
4999
- readonly surfaceClass: import("@angular/core").Signal<string>;
5000
- /** Inline style applied to the surface element. */
5001
- readonly surfaceStyle: import("@angular/core").Signal<Record<string, string>>;
5413
+ key: string;
5414
+ } | null>;
5415
+ protected readonly tooltips: import("@angular/core").Signal<{
5416
+ x: number;
5417
+ y: number;
5418
+ title: string;
5419
+ rows: {
5420
+ name: string;
5421
+ color: string;
5422
+ value: string;
5423
+ active: boolean;
5424
+ }[];
5425
+ key: string;
5426
+ }[]>;
5427
+ protected readonly announcement: import("@angular/core").Signal<string>;
5428
+ protected readonly showsLegend: import("@angular/core").Signal<boolean>;
5002
5429
  constructor();
5003
- private resolveAnchor;
5004
- private reposition;
5005
- onDocumentClick(event: MouseEvent): void;
5006
- onSurfaceKeydown(event: KeyboardEvent): void;
5007
- onEscape(event: Event): void;
5008
- static ɵfac: i0.ɵɵFactoryDeclaration<PopoverComponent, never>;
5009
- static ɵcmp: i0.ɵɵComponentDeclaration<PopoverComponent, "ea-popover", never, {
5010
- "anchor": {
5011
- "alias": "anchor";
5012
- "required": true;
5430
+ protected seriesColor(index: number): string;
5431
+ protected isDimmed(index: number): boolean;
5432
+ protected isActivePoint(seriesIndex: number, index: number): boolean;
5433
+ protected tableValue(value: number | null | undefined): string;
5434
+ protected onPointerDown(event: PointerEvent): void;
5435
+ protected onPointerMove(event: PointerEvent): void;
5436
+ protected onPointerUp(event: PointerEvent): void;
5437
+ protected onPointerCancel(event: PointerEvent): void;
5438
+ protected onPointerLeave(): void;
5439
+ protected onWheel(event: WheelEvent): void;
5440
+ protected onClick(): void;
5441
+ protected onFocus(): void;
5442
+ protected onBlur(): void;
5443
+ protected onKeydown(event: KeyboardEvent): void;
5444
+ private isValue;
5445
+ private yScale;
5446
+ private atPosition;
5447
+ private xLabelCandidates;
5448
+ private labelsFit;
5449
+ private xLabels;
5450
+ private widestXLabel;
5451
+ protected onGestureStart(event: Event): void;
5452
+ protected onGestureChange(event: Event): void;
5453
+ protected onGestureEnd(): void;
5454
+ private zoomTo;
5455
+ private minSpan;
5456
+ private unitsPerPx;
5457
+ private panTo;
5458
+ private endDrag;
5459
+ private holdTap;
5460
+ private endTapHold;
5461
+ private reveal;
5462
+ private indexAt;
5463
+ private valueAt;
5464
+ private firstPoint;
5465
+ private nearestValid;
5466
+ private eventFor;
5467
+ private setActive;
5468
+ static ɵfac: i0.ɵɵFactoryDeclaration<LineChartComponent, never>;
5469
+ static ɵcmp: i0.ɵɵComponentDeclaration<LineChartComponent, "ea-line-chart", never, {
5470
+ "labels": {
5471
+ "alias": "labels";
5472
+ "required": false;
5013
5473
  "isSignal": true;
5014
5474
  };
5015
- "open": {
5016
- "alias": "open";
5475
+ "series": {
5476
+ "alias": "series";
5017
5477
  "required": false;
5018
5478
  "isSignal": true;
5019
5479
  };
5020
- "placement": {
5021
- "alias": "placement";
5480
+ "xValues": {
5481
+ "alias": "xValues";
5022
5482
  "required": false;
5023
5483
  "isSignal": true;
5024
5484
  };
5025
- "role": {
5026
- "alias": "role";
5485
+ "xTicks": {
5486
+ "alias": "xTicks";
5027
5487
  "required": false;
5028
5488
  "isSignal": true;
5029
5489
  };
5030
- "ariaLabel": {
5031
- "alias": "aria-label";
5490
+ "visibleXSpan": {
5491
+ "alias": "visibleXSpan";
5032
5492
  "required": false;
5033
5493
  "isSignal": true;
5034
5494
  };
5035
- "ariaLabelledby": {
5036
- "alias": "aria-labelledby";
5495
+ "curve": {
5496
+ "alias": "curve";
5037
5497
  "required": false;
5038
5498
  "isSignal": true;
5039
5499
  };
5040
- "trapFocus": {
5041
- "alias": "trapFocus";
5500
+ "showArea": {
5501
+ "alias": "showArea";
5042
5502
  "required": false;
5043
5503
  "isSignal": true;
5044
5504
  };
5045
- "surfaceId": {
5046
- "alias": "surfaceId";
5505
+ "showPoints": {
5506
+ "alias": "showPoints";
5047
5507
  "required": false;
5048
5508
  "isSignal": true;
5049
5509
  };
5050
- "offset": {
5051
- "alias": "offset";
5510
+ "showGrid": {
5511
+ "alias": "showGrid";
5052
5512
  "required": false;
5053
5513
  "isSignal": true;
5054
5514
  };
5055
- "flip": {
5056
- "alias": "flip";
5515
+ "showLegend": {
5516
+ "alias": "showLegend";
5057
5517
  "required": false;
5058
5518
  "isSignal": true;
5059
5519
  };
5060
- "clamp": {
5061
- "alias": "clamp";
5520
+ "yMin": {
5521
+ "alias": "yMin";
5062
5522
  "required": false;
5063
5523
  "isSignal": true;
5064
5524
  };
5065
- "matchAnchorWidth": {
5066
- "alias": "matchAnchorWidth";
5525
+ "yMax": {
5526
+ "alias": "yMax";
5067
5527
  "required": false;
5068
5528
  "isSignal": true;
5069
5529
  };
5070
- "maxWidth": {
5071
- "alias": "maxWidth";
5530
+ "xLabelOrientation": {
5531
+ "alias": "xLabelOrientation";
5072
5532
  "required": false;
5073
5533
  "isSignal": true;
5074
5534
  };
5075
- "closeOnOutsideClick": {
5076
- "alias": "closeOnOutsideClick";
5535
+ "showAxisBreak": {
5536
+ "alias": "showAxisBreak";
5077
5537
  "required": false;
5078
5538
  "isSignal": true;
5079
5539
  };
5080
- "closeOnEscape": {
5081
- "alias": "closeOnEscape";
5540
+ "height": {
5541
+ "alias": "height";
5082
5542
  "required": false;
5083
5543
  "isSignal": true;
5084
5544
  };
5085
- "scrollBehavior": {
5086
- "alias": "scrollBehavior";
5545
+ "size": {
5546
+ "alias": "size";
5547
+ "required": false;
5548
+ "isSignal": true;
5549
+ };
5550
+ "animation": {
5551
+ "alias": "animation";
5552
+ "required": false;
5553
+ "isSignal": true;
5554
+ };
5555
+ "animationDuration": {
5556
+ "alias": "animationDuration";
5557
+ "required": false;
5558
+ "isSignal": true;
5559
+ };
5560
+ "formatValue": {
5561
+ "alias": "formatValue";
5562
+ "required": false;
5563
+ "isSignal": true;
5564
+ };
5565
+ "ariaLabel": {
5566
+ "alias": "aria-label";
5087
5567
  "required": false;
5088
5568
  "isSignal": true;
5089
5569
  };
5090
5570
  }, {
5091
- "closeRequested": "closeRequested";
5092
- }, never, ["*"], true, never>;
5571
+ "pointClick": "pointClick";
5572
+ "activePointChange": "activePointChange";
5573
+ "visibleRangeChange": "visibleRangeChange";
5574
+ }, never, never, true, never>;
5575
+ }
5576
+ /** Visual style of a menu item; `danger` for destructive actions. */
5577
+ export type MenuItemVariant = 'default' | 'danger';
5578
+ /**
5579
+ * Selectable row inside an `ea-menu`. Supports leading icons via the `icon`
5580
+ * content slot, a disabled state, and a `danger` variant for destructive
5581
+ * actions. Inherits its size from the parent menu, and activating an item
5582
+ * closes that menu.
5583
+ */
5584
+ export declare class MenuItemComponent {
5585
+ private readonly menu;
5586
+ protected readonly itemId: string;
5587
+ protected readonly tabIndex: import("@angular/core").Signal<0 | -1>;
5588
+ readonly disabled: import("@angular/core").InputSignal<boolean>;
5589
+ readonly variant: import("@angular/core").InputSignal<MenuItemVariant>;
5590
+ /** Fires when the item is activated; the parent menu closes immediately afterwards. */
5591
+ readonly clicked: import("@angular/core").OutputEmitterRef<MouseEvent>;
5592
+ handleClick(event: MouseEvent): void;
5593
+ static ɵfac: i0.ɵɵFactoryDeclaration<MenuItemComponent, never>;
5594
+ static ɵcmp: i0.ɵɵComponentDeclaration<MenuItemComponent, "ea-menu-item", never, {
5595
+ "disabled": {
5596
+ "alias": "disabled";
5597
+ "required": false;
5598
+ "isSignal": true;
5599
+ };
5600
+ "variant": {
5601
+ "alias": "variant";
5602
+ "required": false;
5603
+ "isSignal": true;
5604
+ };
5605
+ }, {
5606
+ "clicked": "clicked";
5607
+ }, never, ["[slot=icon]", "*"], true, never>;
5608
+ }
5609
+ /**
5610
+ * Wires a focusable host element (typically a button) to an `ea-menu`,
5611
+ * handling click and keyboard activation (ArrowDown/Enter/Space to open,
5612
+ * Escape to close) and applying the appropriate ARIA attributes.
5613
+ */
5614
+ export declare class MenuTriggerDirective {
5615
+ private readonly el;
5616
+ private readonly renderer;
5617
+ readonly menu: import("@angular/core").InputSignal<MenuComponent>;
5618
+ constructor();
5619
+ handleClick(): void;
5620
+ handleKeydown(event: KeyboardEvent): void;
5621
+ static ɵfac: i0.ɵɵFactoryDeclaration<MenuTriggerDirective, never>;
5622
+ static ɵdir: i0.ɵɵDirectiveDeclaration<MenuTriggerDirective, "[eaMenuTrigger]", never, {
5623
+ "menu": {
5624
+ "alias": "eaMenuTrigger";
5625
+ "required": true;
5626
+ "isSignal": true;
5627
+ };
5628
+ }, {}, never, never, true, never>;
5093
5629
  }
5094
5630
  /** Visual size of the multi-select trigger. */
5095
5631
  export type MultiSelectSize = EaSize;
@@ -5114,6 +5650,8 @@ export declare class MultiSelectComponent implements ControlValueAccessor {
5114
5650
  readonly label: import("@angular/core").InputSignal<string | undefined>;
5115
5651
  /** Optional icon component rendered before the label text. */
5116
5652
  readonly labelIcon: import("@angular/core").InputSignal<Type<unknown> | undefined>;
5653
+ /** Help revealed by an info button beside the label, as plain text or a template. */
5654
+ readonly labelHelp: import("@angular/core").InputSignal<string | TemplateRef<unknown> | undefined>;
5117
5655
  /** Accessible name for the combobox when no visible `label` is set. */
5118
5656
  readonly ariaLabel: import("@angular/core").InputSignal<string | undefined>;
5119
5657
  readonly placeholder: import("@angular/core").InputSignal<string | undefined>;
@@ -5302,6 +5840,11 @@ export declare class MultiSelectComponent implements ControlValueAccessor {
5302
5840
  "required": false;
5303
5841
  "isSignal": true;
5304
5842
  };
5843
+ "labelHelp": {
5844
+ "alias": "labelHelp";
5845
+ "required": false;
5846
+ "isSignal": true;
5847
+ };
5305
5848
  "ariaLabel": {
5306
5849
  "alias": "aria-label";
5307
5850
  "required": false;
@@ -5423,6 +5966,8 @@ export declare class NumberInputComponent implements ControlValueAccessor {
5423
5966
  readonly label: import("@angular/core").InputSignal<string | undefined>;
5424
5967
  /** Optional icon component rendered before the label text. */
5425
5968
  readonly labelIcon: import("@angular/core").InputSignal<Type<unknown> | undefined>;
5969
+ /** Help revealed by an info button beside the label, as plain text or a template. */
5970
+ readonly labelHelp: import("@angular/core").InputSignal<string | TemplateRef<unknown> | undefined>;
5426
5971
  /** Placeholder shown while the field is empty. */
5427
5972
  readonly placeholder: import("@angular/core").InputSignal<string>;
5428
5973
  /** Visual size of the field. */
@@ -5511,6 +6056,11 @@ export declare class NumberInputComponent implements ControlValueAccessor {
5511
6056
  "required": false;
5512
6057
  "isSignal": true;
5513
6058
  };
6059
+ "labelHelp": {
6060
+ "alias": "labelHelp";
6061
+ "required": false;
6062
+ "isSignal": true;
6063
+ };
5514
6064
  "placeholder": {
5515
6065
  "alias": "placeholder";
5516
6066
  "required": false;
@@ -5998,6 +6548,8 @@ export declare class RadioGroupComponent implements ControlValueAccessor {
5998
6548
  readonly label: import("@angular/core").InputSignal<string | undefined>;
5999
6549
  /** Optional icon component rendered before the label text. */
6000
6550
  readonly labelIcon: import("@angular/core").InputSignal<Type<unknown> | undefined>;
6551
+ /** Help revealed by an info button beside the label, as plain text or a template. */
6552
+ readonly labelHelp: import("@angular/core").InputSignal<string | TemplateRef<unknown> | undefined>;
6001
6553
  readonly hint: import("@angular/core").InputSignal<string | undefined>;
6002
6554
  readonly errorMsg: import("@angular/core").InputSignal<string | undefined>;
6003
6555
  /** Per-validator-key message overrides for a bound form control (e.g. `{ required: '...' }`). */
@@ -6063,6 +6615,11 @@ export declare class RadioGroupComponent implements ControlValueAccessor {
6063
6615
  "required": false;
6064
6616
  "isSignal": true;
6065
6617
  };
6618
+ "labelHelp": {
6619
+ "alias": "labelHelp";
6620
+ "required": false;
6621
+ "isSignal": true;
6622
+ };
6066
6623
  "hint": {
6067
6624
  "alias": "hint";
6068
6625
  "required": false;
@@ -6162,6 +6719,8 @@ export declare class RangeSliderComponent implements ControlValueAccessor {
6162
6719
  readonly label: import("@angular/core").InputSignal<string | undefined>;
6163
6720
  /** Optional icon component rendered before the label text. */
6164
6721
  readonly labelIcon: import("@angular/core").InputSignal<Type<unknown> | undefined>;
6722
+ /** Help revealed by an info button beside the label, as plain text or a template. */
6723
+ readonly labelHelp: import("@angular/core").InputSignal<string | TemplateRef<unknown> | undefined>;
6165
6724
  readonly hint: import("@angular/core").InputSignal<string | undefined>;
6166
6725
  readonly errorMsg: import("@angular/core").InputSignal<string | undefined>;
6167
6726
  /** Per-validator-key message overrides for a bound form control (e.g. `{ required: '...' }`). */
@@ -6237,6 +6796,11 @@ export declare class RangeSliderComponent implements ControlValueAccessor {
6237
6796
  "required": false;
6238
6797
  "isSignal": true;
6239
6798
  };
6799
+ "labelHelp": {
6800
+ "alias": "labelHelp";
6801
+ "required": false;
6802
+ "isSignal": true;
6803
+ };
6240
6804
  "hint": {
6241
6805
  "alias": "hint";
6242
6806
  "required": false;
@@ -6353,6 +6917,8 @@ export declare class RatingComponent implements ControlValueAccessor {
6353
6917
  readonly label: import("@angular/core").InputSignal<string | undefined>;
6354
6918
  /** Optional icon component rendered before the label text. */
6355
6919
  readonly labelIcon: import("@angular/core").InputSignal<Type<unknown> | undefined>;
6920
+ /** Help revealed by an info button beside the label, as plain text or a template. */
6921
+ readonly labelHelp: import("@angular/core").InputSignal<string | TemplateRef<unknown> | undefined>;
6356
6922
  readonly hint: import("@angular/core").InputSignal<string | undefined>;
6357
6923
  readonly errorMsg: import("@angular/core").InputSignal<string | undefined>;
6358
6924
  /** Per-validator-key message overrides for a bound form control (e.g. `{ required: '...' }`). */
@@ -6433,6 +6999,11 @@ export declare class RatingComponent implements ControlValueAccessor {
6433
6999
  "required": false;
6434
7000
  "isSignal": true;
6435
7001
  };
7002
+ "labelHelp": {
7003
+ "alias": "labelHelp";
7004
+ "required": false;
7005
+ "isSignal": true;
7006
+ };
6436
7007
  "hint": {
6437
7008
  "alias": "hint";
6438
7009
  "required": false;
@@ -6527,6 +7098,8 @@ export declare class SegmentedComponent implements ControlValueAccessor {
6527
7098
  readonly label: import("@angular/core").InputSignal<string | undefined>;
6528
7099
  /** Optional icon component rendered before the label text. */
6529
7100
  readonly labelIcon: import("@angular/core").InputSignal<Type<unknown> | undefined>;
7101
+ /** Help revealed by an info button beside the label, as plain text or a template. */
7102
+ readonly labelHelp: import("@angular/core").InputSignal<string | TemplateRef<unknown> | undefined>;
6530
7103
  readonly hint: import("@angular/core").InputSignal<string | undefined>;
6531
7104
  readonly errorMsg: import("@angular/core").InputSignal<string | undefined>;
6532
7105
  /** Per-validator-key message overrides for a bound form control (e.g. `{ required: '...' }`). */
@@ -6584,6 +7157,11 @@ export declare class SegmentedComponent implements ControlValueAccessor {
6584
7157
  "required": false;
6585
7158
  "isSignal": true;
6586
7159
  };
7160
+ "labelHelp": {
7161
+ "alias": "labelHelp";
7162
+ "required": false;
7163
+ "isSignal": true;
7164
+ };
6587
7165
  "hint": {
6588
7166
  "alias": "hint";
6589
7167
  "required": false;
@@ -6688,6 +7266,8 @@ export declare class SliderComponent implements ControlValueAccessor {
6688
7266
  readonly label: import("@angular/core").InputSignal<string | undefined>;
6689
7267
  /** Optional icon component rendered before the label text. */
6690
7268
  readonly labelIcon: import("@angular/core").InputSignal<Type<unknown> | undefined>;
7269
+ /** Help revealed by an info button beside the label, as plain text or a template. */
7270
+ readonly labelHelp: import("@angular/core").InputSignal<string | TemplateRef<unknown> | undefined>;
6691
7271
  readonly hint: import("@angular/core").InputSignal<string | undefined>;
6692
7272
  readonly errorMsg: import("@angular/core").InputSignal<string | undefined>;
6693
7273
  /** Per-validator-key message overrides for a bound form control (e.g. `{ required: '...' }`). */
@@ -6765,6 +7345,11 @@ export declare class SliderComponent implements ControlValueAccessor {
6765
7345
  "required": false;
6766
7346
  "isSignal": true;
6767
7347
  };
7348
+ "labelHelp": {
7349
+ "alias": "labelHelp";
7350
+ "required": false;
7351
+ "isSignal": true;
7352
+ };
6768
7353
  "hint": {
6769
7354
  "alias": "hint";
6770
7355
  "required": false;
@@ -7018,6 +7603,8 @@ export declare class StepperComponent {
7018
7603
  }
7019
7604
  /** Visual size of the switch. */
7020
7605
  export type SwitchSize = EaSize;
7606
+ /** Status tone applied to the switch track in both states. */
7607
+ export type SwitchVariant = 'default' | 'success' | 'warning' | 'error' | 'info';
7021
7608
  /**
7022
7609
  * On/off toggle styled as a sliding switch. Backed by a visually hidden
7023
7610
  * native checkbox and integrates with Angular forms via
@@ -7030,6 +7617,15 @@ export declare class SwitchComponent implements ControlValueAccessor {
7030
7617
  /** Per-validator-key message overrides for a bound form control (e.g. `{ required: '...' }`). */
7031
7618
  readonly errorMessages: import("@angular/core").InputSignal<Partial<Record<string, string>> | undefined>;
7032
7619
  readonly size: import("@angular/core").InputSignal<EaSize>;
7620
+ /**
7621
+ * Status tone for the track: a tinted wash with a toned border while off and
7622
+ * the solid tone while on. `default` keeps the neutral off track and brand on track.
7623
+ */
7624
+ readonly variant: import("@angular/core").InputSignal<SwitchVariant>;
7625
+ /** Optional icon component drawn in the thumb while the switch is on. */
7626
+ readonly onIcon: import("@angular/core").InputSignal<Type<unknown> | undefined>;
7627
+ /** Optional icon component drawn in the thumb while the switch is off. */
7628
+ readonly offIcon: import("@angular/core").InputSignal<Type<unknown> | undefined>;
7033
7629
  readonly disabled: import("@angular/core").InputSignal<boolean>;
7034
7630
  readonly required: import("@angular/core").InputSignal<boolean>;
7035
7631
  readonly ariaLabel: import("@angular/core").InputSignal<string | undefined>;
@@ -7052,6 +7648,7 @@ export declare class SwitchComponent implements ControlValueAccessor {
7052
7648
  'ea-switch--disabled': boolean;
7053
7649
  'ea-switch--error': boolean;
7054
7650
  }>;
7651
+ protected readonly thumbIcon: import("@angular/core").Signal<Type<unknown> | undefined>;
7055
7652
  writeValue(val: boolean): void;
7056
7653
  registerOnChange(fn: (value: boolean) => void): void;
7057
7654
  registerOnTouched(fn: () => void): void;
@@ -7084,6 +7681,21 @@ export declare class SwitchComponent implements ControlValueAccessor {
7084
7681
  "required": false;
7085
7682
  "isSignal": true;
7086
7683
  };
7684
+ "variant": {
7685
+ "alias": "variant";
7686
+ "required": false;
7687
+ "isSignal": true;
7688
+ };
7689
+ "onIcon": {
7690
+ "alias": "onIcon";
7691
+ "required": false;
7692
+ "isSignal": true;
7693
+ };
7694
+ "offIcon": {
7695
+ "alias": "offIcon";
7696
+ "required": false;
7697
+ "isSignal": true;
7698
+ };
7087
7699
  "disabled": {
7088
7700
  "alias": "disabled";
7089
7701
  "required": false;
@@ -7375,11 +7987,19 @@ export declare class TagComponent {
7375
7987
  */
7376
7988
  readonly maxWidth: import("@angular/core").InputSignal<string | number | undefined>;
7377
7989
  /**
7378
- * Fill colour as a hex value, for a tag carrying a colour of its own (a
7379
- * user-chosen label). Paints the chip and its border, and picks whichever ink
7380
- * reads better on it. Takes precedence over `variant`.
7990
+ * Fill colour, for a tag carrying a colour of its own (a user-chosen label).
7991
+ * Paints the chip and its border, and takes precedence over `variant`. On
7992
+ * its own it must be a hex value, from which the tag picks whichever ink
7993
+ * reads better; alongside `ink` it takes any CSS colour, such as a
7994
+ * theme-aware `var(--my-token)`.
7381
7995
  */
7382
7996
  readonly color: import("@angular/core").InputSignal<string | undefined>;
7997
+ /**
7998
+ * Text colour, as any CSS colour, overriding the ink the tag would pick for
7999
+ * `color`. Supplying it lets `color` be a value the tag cannot measure, so
8000
+ * the contrast between the two rests with the caller.
8001
+ */
8002
+ readonly ink: import("@angular/core").InputSignal<string | undefined>;
7383
8003
  /**
7384
8004
  * Where a label clipped by `maxWidth` reveals its full text. Set `none` for
7385
8005
  * a tag rendered inside a tooltip, which would otherwise stack a second
@@ -7409,7 +8029,7 @@ export declare class TagComponent {
7409
8029
  }>;
7410
8030
  /** `maxWidth` as a CSS length; a bare number is px, as the input documents. */
7411
8031
  protected readonly resolvedMaxWidth: import("@angular/core").Signal<string | null>;
7412
- /** Ink that reads on `color`, or `null` when it is not a hex the library can measure. */
8032
+ /** The caller's `ink`, else one that reads on a hex `color`, else `null`. */
7413
8033
  protected readonly resolvedInk: import("@angular/core").Signal<string | null>;
7414
8034
  protected readonly resolvedColor: import("@angular/core").Signal<string | null>;
7415
8035
  constructor();
@@ -7457,6 +8077,11 @@ export declare class TagComponent {
7457
8077
  "required": false;
7458
8078
  "isSignal": true;
7459
8079
  };
8080
+ "ink": {
8081
+ "alias": "ink";
8082
+ "required": false;
8083
+ "isSignal": true;
8084
+ };
7460
8085
  "tooltip": {
7461
8086
  "alias": "tooltip";
7462
8087
  "required": false;
@@ -7480,9 +8105,15 @@ export declare class TagComponent {
7480
8105
  export type TextareaSize = EaSize;
7481
8106
  /** Axis along which the user is allowed to resize the textarea. */
7482
8107
  export type TextareaResize = 'none' | 'vertical' | 'horizontal' | 'both';
8108
+ /** Selected character range in the textarea; `start` equals `end` for a bare caret. */
8109
+ export interface TextareaSelection {
8110
+ readonly start: number;
8111
+ readonly end: number;
8112
+ }
7483
8113
  /**
7484
8114
  * Multiline text field that mirrors the `ea-input` API. Supports configurable
7485
- * `resize` direction and `maxlength`, and integrates with Angular
8115
+ * `resize` direction and `maxlength`, exposes the caret through
8116
+ * `getSelection()` and `insertText()`, and integrates with Angular
7486
8117
  * forms via `ControlValueAccessor`.
7487
8118
  */
7488
8119
  export declare class TextareaComponent implements ControlValueAccessor {
@@ -7490,6 +8121,8 @@ export declare class TextareaComponent implements ControlValueAccessor {
7490
8121
  readonly label: import("@angular/core").InputSignal<string | undefined>;
7491
8122
  /** Optional icon component rendered before the label text. */
7492
8123
  readonly labelIcon: import("@angular/core").InputSignal<Type<unknown> | undefined>;
8124
+ /** Help revealed by an info button beside the label, as plain text or a template. */
8125
+ readonly labelHelp: import("@angular/core").InputSignal<string | TemplateRef<unknown> | undefined>;
7493
8126
  /** Accessible name for the control when no visible `label` is set. */
7494
8127
  readonly ariaLabel: import("@angular/core").InputSignal<string | undefined>;
7495
8128
  readonly placeholder: import("@angular/core").InputSignal<string>;
@@ -7542,6 +8175,19 @@ export declare class TextareaComponent implements ControlValueAccessor {
7542
8175
  handleBlur(event: FocusEvent): void;
7543
8176
  /** Moves keyboard focus to the underlying native textarea element. */
7544
8177
  focus(): void;
8178
+ /**
8179
+ * Returns the selected range as character offsets into the value. The browser
8180
+ * keeps it after the field loses focus, so it still reflects where the caret
8181
+ * was left once the user has moved on to a button or a dialog.
8182
+ */
8183
+ getSelection(): TextareaSelection;
8184
+ /**
8185
+ * Replaces the current selection with `text` and places the caret after it,
8186
+ * notifying the value model, a bound form control and native `input`
8187
+ * listeners exactly as typing does. Does nothing while disabled or read-only,
8188
+ * and leaves focus where it is.
8189
+ */
8190
+ insertText(text: string): void;
7545
8191
  static ɵfac: i0.ɵɵFactoryDeclaration<TextareaComponent, never>;
7546
8192
  static ɵcmp: i0.ɵɵComponentDeclaration<TextareaComponent, "ea-textarea", never, {
7547
8193
  "label": {
@@ -7554,6 +8200,11 @@ export declare class TextareaComponent implements ControlValueAccessor {
7554
8200
  "required": false;
7555
8201
  "isSignal": true;
7556
8202
  };
8203
+ "labelHelp": {
8204
+ "alias": "labelHelp";
8205
+ "required": false;
8206
+ "isSignal": true;
8207
+ };
7557
8208
  "ariaLabel": {
7558
8209
  "alias": "aria-label";
7559
8210
  "required": false;
@@ -7681,6 +8332,8 @@ export declare class TimePickerComponent implements ControlValueAccessor {
7681
8332
  readonly label: import("@angular/core").InputSignal<string | undefined>;
7682
8333
  /** Optional icon component rendered before the label text. */
7683
8334
  readonly labelIcon: import("@angular/core").InputSignal<Type<unknown> | undefined>;
8335
+ /** Help revealed by an info button beside the label, as plain text or a template. */
8336
+ readonly labelHelp: import("@angular/core").InputSignal<string | TemplateRef<unknown> | undefined>;
7684
8337
  readonly placeholder: import("@angular/core").InputSignal<string | undefined>;
7685
8338
  readonly size: import("@angular/core").InputSignal<EaSize>;
7686
8339
  readonly disabled: import("@angular/core").InputSignal<boolean>;
@@ -7851,6 +8504,11 @@ export declare class TimePickerComponent implements ControlValueAccessor {
7851
8504
  "required": false;
7852
8505
  "isSignal": true;
7853
8506
  };
8507
+ "labelHelp": {
8508
+ "alias": "labelHelp";
8509
+ "required": false;
8510
+ "isSignal": true;
8511
+ };
7854
8512
  "placeholder": {
7855
8513
  "alias": "placeholder";
7856
8514
  "required": false;