@eagami/ui 5.54.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
@@ -2629,6 +2629,479 @@ export declare class ColorPickerComponent implements ControlValueAccessor {
2629
2629
  "changed": "changed";
2630
2630
  }, never, never, true, never>;
2631
2631
  }
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;
2654
+ }
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;
2700
+ }
2701
+ /**
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.
2710
+ */
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;
2725
+ private readonly i18n;
2726
+ private readonly listEl;
2727
+ readonly placement: import("@angular/core").InputSignal<MenuPlacement>;
2728
+ /** Visual size of the menu; every item inherits it. */
2729
+ readonly size: import("@angular/core").InputSignal<EaSize>;
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;
2752
+ /**
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.
2757
+ */
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;
2788
+ "isSignal": true;
2789
+ };
2790
+ "size": {
2791
+ "alias": "size";
2792
+ "required": false;
2793
+ "isSignal": true;
2794
+ };
2795
+ "maxHeight": {
2796
+ "alias": "maxHeight";
2797
+ "required": false;
2798
+ "isSignal": true;
2799
+ };
2800
+ "disabled": {
2801
+ "alias": "disabled";
2802
+ "required": false;
2803
+ "isSignal": true;
2804
+ };
2805
+ "ariaLabel": {
2806
+ "alias": "aria-label";
2807
+ "required": false;
2808
+ "isSignal": true;
2809
+ };
2810
+ "id": {
2811
+ "alias": "id";
2812
+ "required": false;
2813
+ "isSignal": true;
2814
+ };
2815
+ "open": {
2816
+ "alias": "open";
2817
+ "required": false;
2818
+ "isSignal": true;
2819
+ };
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;
2960
+ "isSignal": true;
2961
+ };
2962
+ "open": {
2963
+ "alias": "open";
2964
+ "required": false;
2965
+ "isSignal": true;
2966
+ };
2967
+ "placement": {
2968
+ "alias": "placement";
2969
+ "required": false;
2970
+ "isSignal": true;
2971
+ };
2972
+ "anchorPoint": {
2973
+ "alias": "anchorPoint";
2974
+ "required": false;
2975
+ "isSignal": true;
2976
+ };
2977
+ "role": {
2978
+ "alias": "role";
2979
+ "required": false;
2980
+ "isSignal": true;
2981
+ };
2982
+ "ariaLabel": {
2983
+ "alias": "aria-label";
2984
+ "required": false;
2985
+ "isSignal": true;
2986
+ };
2987
+ "ariaLabelledby": {
2988
+ "alias": "aria-labelledby";
2989
+ "required": false;
2990
+ "isSignal": true;
2991
+ };
2992
+ "trapFocus": {
2993
+ "alias": "trapFocus";
2994
+ "required": false;
2995
+ "isSignal": true;
2996
+ };
2997
+ "surfaceId": {
2998
+ "alias": "surfaceId";
2999
+ "required": false;
3000
+ "isSignal": true;
3001
+ };
3002
+ "offset": {
3003
+ "alias": "offset";
3004
+ "required": false;
3005
+ "isSignal": true;
3006
+ };
3007
+ "flip": {
3008
+ "alias": "flip";
3009
+ "required": false;
3010
+ "isSignal": true;
3011
+ };
3012
+ "clamp": {
3013
+ "alias": "clamp";
3014
+ "required": false;
3015
+ "isSignal": true;
3016
+ };
3017
+ "matchAnchorWidth": {
3018
+ "alias": "matchAnchorWidth";
3019
+ "required": false;
3020
+ "isSignal": true;
3021
+ };
3022
+ "maxWidth": {
3023
+ "alias": "maxWidth";
3024
+ "required": false;
3025
+ "isSignal": true;
3026
+ };
3027
+ "closeOnOutsideClick": {
3028
+ "alias": "closeOnOutsideClick";
3029
+ "required": false;
3030
+ "isSignal": true;
3031
+ };
3032
+ "closeOnEscape": {
3033
+ "alias": "closeOnEscape";
3034
+ "required": false;
3035
+ "isSignal": true;
3036
+ };
3037
+ "scrollBehavior": {
3038
+ "alias": "scrollBehavior";
3039
+ "required": false;
3040
+ "isSignal": true;
3041
+ };
3042
+ "contextMenu": {
3043
+ "alias": "contextMenu";
3044
+ "required": false;
3045
+ "isSignal": true;
3046
+ };
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";
3095
+ "required": false;
3096
+ "isSignal": true;
3097
+ };
3098
+ "contextMenuPosition": {
3099
+ "alias": "contextMenuPosition";
3100
+ "required": false;
3101
+ "isSignal": true;
3102
+ };
3103
+ }, {}, never, never, true, never>;
3104
+ }
2632
3105
  /** Vertical density preset for table rows and header cells. */
2633
3106
  export type DataTableDensity = 'compact' | 'comfortable' | 'spacious';
2634
3107
  /** Visual size of the table's text, paddings, and icons. */
@@ -2650,6 +3123,22 @@ export interface DataTableColumn<T = Record<string, unknown>> {
2650
3123
  headerTemplate?: TemplateRef<{
2651
3124
  $implicit: DataTableColumn<T>;
2652
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;
2653
3142
  }
2654
3143
  /** Current sort state: which column is sorted and in which direction. */
2655
3144
  export interface DataTableSortState {
@@ -2667,6 +3156,7 @@ export declare class DataTableComponent<T = Record<string, unknown>> {
2667
3156
  private readonly host;
2668
3157
  private readonly activeCell;
2669
3158
  private static readonly PAGE_JUMP;
3159
+ private keyboardRequestPending;
2670
3160
  readonly columns: import("@angular/core").InputSignal<DataTableColumn<T>[]>;
2671
3161
  readonly data: import("@angular/core").InputSignal<T[]>;
2672
3162
  /**
@@ -2702,14 +3192,30 @@ export declare class DataTableComponent<T = Record<string, unknown>> {
2702
3192
  * A row given `null` is inert: no link, hover highlight, focus or activation.
2703
3193
  */
2704
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>;
2705
3203
  readonly sort: import("@angular/core").ModelSignal<DataTableSortState>;
2706
3204
  /** Fires whenever the sort column or direction changes via header click. */
2707
3205
  readonly sorted: import("@angular/core").OutputEmitterRef<DataTableSortState>;
2708
3206
  /** Fires with the row's data when a body row is activated by click or Enter/Space while `clickable` is set. */
2709
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>>;
2710
3214
  readonly noDataTemplate: import("@angular/core").Signal<TemplateRef<unknown> | undefined>;
2711
3215
  /** Empty-state text, falling back to the active locale's translation. */
2712
3216
  readonly resolvedNoDataText: import("@angular/core").Signal<string>;
3217
+ readonly placeholderRows: import("@angular/core").Signal<number[]>;
3218
+ private readonly bodyRowCount;
2713
3219
  readonly hostClasses: import("@angular/core").Signal<{
2714
3220
  [x: string]: boolean;
2715
3221
  'ea-data-table--sticky': boolean;
@@ -2732,6 +3238,8 @@ export declare class DataTableComponent<T = Record<string, unknown>> {
2732
3238
  isInert(row: T): boolean;
2733
3239
  rowTabindex(row: T): number | null;
2734
3240
  onRowActivate(row: T, event?: Event): void;
3241
+ onRowContextMenu(row: T, rowElement: HTMLElement, event: MouseEvent | KeyboardEvent): void;
3242
+ clearKeyboardRequest(): void;
2735
3243
  onCellFocus(row: number, col: number): void;
2736
3244
  onGridKeydown(event: KeyboardEvent): void;
2737
3245
  private focusCell;
@@ -2822,6 +3330,16 @@ export declare class DataTableComponent<T = Record<string, unknown>> {
2822
3330
  "required": false;
2823
3331
  "isSignal": true;
2824
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
+ };
2825
3343
  "sort": {
2826
3344
  "alias": "sort";
2827
3345
  "required": false;
@@ -2831,6 +3349,7 @@ export declare class DataTableComponent<T = Record<string, unknown>> {
2831
3349
  "sort": "sortChange";
2832
3350
  "sorted": "sorted";
2833
3351
  "rowActivate": "rowActivate";
3352
+ "rowContextMenu": "rowContextMenu";
2834
3353
  }, ["noDataTemplate"], ["ea-paginator"], true, never>;
2835
3354
  }
2836
3355
  /** Visual size of each digit cell. */
@@ -3234,6 +3753,10 @@ export type DialogWidth = EaWidth;
3234
3753
  * `--ea-dialog-body-padding`, and `--ea-dialog-status-padding`; an
3235
3754
  * edge-to-edge media surface zeroes the inset, radius, and paddings.
3236
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
+ *
3237
3760
  * Specs running under jsdom need `installNativeDialogShim()` from
3238
3761
  * `@eagami/ui/testing` before opening one.
3239
3762
  */
@@ -3246,6 +3769,7 @@ export declare class DialogComponent implements AfterContentChecked {
3246
3769
  private readonly press;
3247
3770
  private readonly scrollLock;
3248
3771
  private holdsScroll;
3772
+ private boundRef;
3249
3773
  readonly width: import("@angular/core").InputSignal<EaWidth>;
3250
3774
  /**
3251
3775
  * Modal by default: shown via `showModal()`, with the backdrop overlay and
@@ -3289,6 +3813,7 @@ export declare class DialogComponent implements AfterContentChecked {
3289
3813
  protected readonly hasHeader: import("@angular/core").WritableSignal<boolean>;
3290
3814
  ngAfterContentChecked(): void;
3291
3815
  constructor();
3816
+ private closeSurface;
3292
3817
  private holdScroll;
3293
3818
  private dropScroll;
3294
3819
  handleClose(): void;
@@ -3357,6 +3882,64 @@ export declare class DialogComponent implements AfterContentChecked {
3357
3882
  "closeRequested": "closeRequested";
3358
3883
  }, never, ["[slot=header]", "*", "[slot=status]", "[slot=footer]"], true, never>;
3359
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
+ }
3360
3943
  /** Orientation of the divider rule. */
3361
3944
  export type DividerOrientation = 'horizontal' | 'vertical';
3362
3945
  /**
@@ -4973,126 +5556,22 @@ export declare class LineChartComponent {
4973
5556
  "alias": "animationDuration";
4974
5557
  "required": false;
4975
5558
  "isSignal": true;
4976
- };
4977
- "formatValue": {
4978
- "alias": "formatValue";
4979
- "required": false;
4980
- "isSignal": true;
4981
- };
4982
- "ariaLabel": {
4983
- "alias": "aria-label";
4984
- "required": false;
4985
- "isSignal": true;
4986
- };
4987
- }, {
4988
- "pointClick": "pointClick";
4989
- "activePointChange": "activePointChange";
4990
- "visibleRangeChange": "visibleRangeChange";
4991
- }, never, never, true, never>;
4992
- }
4993
- /** Placement of the menu list relative to its trigger. */
4994
- export type MenuPlacement = 'bottom-start' | 'bottom-end' | 'top-start' | 'top-end';
4995
- /** Visual size of the menu, shared by all of its items. */
4996
- export type MenuSize = EaSize;
4997
- /**
4998
- * Popup action menu attached to any focusable element via the
4999
- * `[eaMenuTrigger]` directive. Supports keyboard navigation
5000
- * (arrow keys, Home/End), closes on outside click or Escape, and restores
5001
- * focus to the trigger on close. Positioning, dismissal, and SSR-safe scroll
5002
- * handling are provided by `<ea-popover>`.
5003
- */
5004
- export declare class MenuComponent {
5005
- private readonly injector;
5006
- private readonly i18n;
5007
- private readonly listEl;
5008
- readonly placement: import("@angular/core").InputSignal<MenuPlacement>;
5009
- /** Visual size of the menu; every item inherits it. */
5010
- readonly size: import("@angular/core").InputSignal<EaSize>;
5011
- /** Max height of the scrollable list as a CSS length; tall menus scroll past it. */
5012
- readonly maxHeight: import("@angular/core").InputSignal<string>;
5013
- readonly disabled: import("@angular/core").InputSignal<boolean>;
5014
- readonly ariaLabel: import("@angular/core").InputSignal<string | undefined>;
5015
- readonly id: import("@angular/core").InputSignal<string>;
5016
- /** Accessible label for the menu, falling back to the active locale. */
5017
- readonly resolvedAriaLabel: import("@angular/core").Signal<string>;
5018
- readonly open: import("@angular/core").ModelSignal<boolean>;
5019
- /** Fires when the menu opens. */
5020
- readonly opened: import("@angular/core").OutputEmitterRef<void>;
5021
- /** Fires when the menu closes. */
5022
- readonly closed: import("@angular/core").OutputEmitterRef<void>;
5023
- /** Trigger element currently anchoring the menu. Signal-typed so `<ea-popover>` reacts when it changes. */
5024
- protected readonly triggerEl: import("@angular/core").WritableSignal<HTMLElement | undefined>;
5025
- readonly activeItemId: import("@angular/core").WritableSignal<string | null>;
5026
- constructor();
5027
- /** Toggles the menu open state, anchoring it to the given trigger element. */
5028
- toggleAt(triggerEl: HTMLElement): void;
5029
- /** Opens the menu anchored to the given trigger element and focuses the first item. */
5030
- openAt(triggerEl: HTMLElement): void;
5031
- /**
5032
- * Closes the menu if it is open. Pass `restoreFocus: true` to return focus
5033
- * to the trigger element (used when closing via Escape or item activation;
5034
- * not used on outside click, where the user has chosen a new focus target).
5035
- */
5036
- close(restoreFocus?: boolean): void;
5037
- /** Called by `<ea-popover>` when the user clicks outside the menu. */
5038
- onPopoverCloseRequested(): void;
5039
- private getEnabledItems;
5040
- /**
5041
- * `preventScroll: true` is critical here. The menu list is `position: fixed`
5042
- * but its DOM ancestor is whatever element hosts the menu (often a sticky
5043
- * header). When `.focus()` is called without `preventScroll`, Chromium uses
5044
- * the focused element's DOM-tree position (inside the sticky ancestor) rather
5045
- * than its rendered fixed position to decide whether to scroll, which on a
5046
- * scrolled page nudges the document up by a few pixels per open, until the
5047
- * trigger reaches the top edge. The same guard applies to keyboard navigation
5048
- * and restoring focus on close.
5049
- */
5050
- private focusFirstItem;
5051
- private focusItem;
5052
- onKeydown(event: KeyboardEvent): void;
5053
- onEscape(event: Event): void;
5054
- static ɵfac: i0.ɵɵFactoryDeclaration<MenuComponent, never>;
5055
- static ɵcmp: i0.ɵɵComponentDeclaration<MenuComponent, "ea-menu", never, {
5056
- "placement": {
5057
- "alias": "placement";
5058
- "required": false;
5059
- "isSignal": true;
5060
- };
5061
- "size": {
5062
- "alias": "size";
5063
- "required": false;
5064
- "isSignal": true;
5065
- };
5066
- "maxHeight": {
5067
- "alias": "maxHeight";
5068
- "required": false;
5069
- "isSignal": true;
5070
- };
5071
- "disabled": {
5072
- "alias": "disabled";
5073
- "required": false;
5074
- "isSignal": true;
5075
- };
5076
- "ariaLabel": {
5077
- "alias": "aria-label";
5078
- "required": false;
5079
- "isSignal": true;
5080
- };
5081
- "id": {
5082
- "alias": "id";
5559
+ };
5560
+ "formatValue": {
5561
+ "alias": "formatValue";
5083
5562
  "required": false;
5084
5563
  "isSignal": true;
5085
5564
  };
5086
- "open": {
5087
- "alias": "open";
5565
+ "ariaLabel": {
5566
+ "alias": "aria-label";
5088
5567
  "required": false;
5089
5568
  "isSignal": true;
5090
5569
  };
5091
5570
  }, {
5092
- "open": "openChange";
5093
- "opened": "opened";
5094
- "closed": "closed";
5095
- }, never, ["*"], true, never>;
5571
+ "pointClick": "pointClick";
5572
+ "activePointChange": "activePointChange";
5573
+ "visibleRangeChange": "visibleRangeChange";
5574
+ }, never, never, true, never>;
5096
5575
  }
5097
5576
  /** Visual style of a menu item; `danger` for destructive actions. */
5098
5577
  export type MenuItemVariant = 'default' | 'danger';
@@ -5148,252 +5627,6 @@ export declare class MenuTriggerDirective {
5148
5627
  };
5149
5628
  }, {}, never, never, true, never>;
5150
5629
  }
5151
- /**
5152
- * Placement of the popover relative to its anchor. Each placement names the
5153
- * side of the anchor the popover attaches to, optionally followed by a corner
5154
- * suffix (`-start` or `-end`) that decides the alignment along the perpendicular
5155
- * axis. The plain side names (`top`, `bottom`, `left`, `right`) centre the
5156
- * popover on that axis.
5157
- */
5158
- export type PopoverPlacement = 'top' | 'top-start' | 'top-end' | 'bottom' | 'bottom-start' | 'bottom-end' | 'left' | 'right';
5159
- export interface PopoverPositionResult {
5160
- /** Top coordinate in viewport (px); pairs with `position: fixed`. */
5161
- readonly top: number;
5162
- /** Left coordinate in viewport (px). */
5163
- readonly left: number;
5164
- /** Width hint when the popover should match the anchor's width. */
5165
- readonly width?: number;
5166
- /** The anchor's measured width, for a caller capping the popover against it. */
5167
- readonly anchorWidth: number;
5168
- /** Effective placement after any flip logic ran. */
5169
- readonly placement: PopoverPlacement;
5170
- }
5171
- export interface PopoverPositionOptions {
5172
- readonly placement: PopoverPlacement;
5173
- /** Gap in px between the anchor and the popover. Default 4. */
5174
- readonly offset?: number;
5175
- /** Flip to the opposite side when the requested side overflows the viewport. Default true. */
5176
- readonly flip?: boolean;
5177
- /** Clamp inside the viewport when the popover still overflows after any flip. Default true. */
5178
- readonly clamp?: boolean;
5179
- /** Margin from the viewport edge in px when clamping. Default 8. */
5180
- readonly margin?: number;
5181
- /** Set the popover's width to match the anchor's. Useful for dropdown-style menus. */
5182
- readonly matchAnchorWidth?: boolean;
5183
- /** Right-to-left context. Swaps `-start`/`-end` alignment so they track the reading direction. */
5184
- readonly rtl?: boolean;
5185
- }
5186
- interface Rect {
5187
- readonly width: number;
5188
- readonly height: number;
5189
- }
5190
- interface AnchorRect extends Rect {
5191
- readonly top: number;
5192
- readonly bottom: number;
5193
- readonly left: number;
5194
- readonly right: number;
5195
- }
5196
- interface Viewport {
5197
- readonly width: number;
5198
- readonly height: number;
5199
- }
5200
- /**
5201
- * Computes the viewport-space top/left for a popover anchored to `anchorRect`,
5202
- * applying optional flip-on-overflow and edge-clamp logic. Pure function, no
5203
- * DOM access. Both `<ea-popover>` and `[eaTooltip]` consume this.
5204
- *
5205
- * @param anchorRect The anchor element's `getBoundingClientRect()`.
5206
- * @param popoverRect Width and height of the popover (post-render measurement).
5207
- * @param viewport Viewport dimensions (`window.innerWidth/Height`).
5208
- * @param options Placement and behavior flags.
5209
- */
5210
- export declare function computePopoverPosition(anchorRect: AnchorRect, popoverRect: Rect, viewport: Viewport, options: PopoverPositionOptions): PopoverPositionResult;
5211
- /** ARIA role to apply to the popover surface. */
5212
- export type PopoverRole = 'menu' | 'listbox' | 'dialog' | 'tooltip' | 'grid';
5213
- /**
5214
- * How the popover should respond to scroll / resize events while open.
5215
- *
5216
- * - `reposition` (default): re-measure the anchor and update the popover's
5217
- * coordinates so it stays attached. Suitable for menus and tooltips.
5218
- * - `close`: request close. Suitable for dropdown lists and the colour-picker
5219
- * popover, where re-tracking a tall popover during a scroll feels intrusive.
5220
- * - `ignore`: do nothing. The popover stays at its initial coordinates and
5221
- * may visually detach from a scrolling anchor; useful when the anchor is
5222
- * guaranteed not to move (e.g. inside a non-scrolling region).
5223
- */
5224
- export type PopoverScrollBehavior = 'reposition' | 'close' | 'ignore';
5225
- /** Width cap for a popover surface: px, or the anchor's own width. */
5226
- export type PopoverMaxWidth = number | 'anchor';
5227
- /**
5228
- * Floating-element primitive. Renders projected content as `position: fixed`
5229
- * anchored to an external element, with flip-on-overflow, viewport clamping,
5230
- * outside-click and Escape dismissal, and SSR-safe scroll / resize handling.
5231
- *
5232
- * The primitive is intentionally low-level: a parent component drives the
5233
- * `[open]` state and listens for `(closeRequested)` to mirror it back. Internal
5234
- * library components (`<ea-menu>`, `<ea-dropdown>`, `<ea-color-picker>`,
5235
- * `<ea-date-picker>`, `[eaTooltip]`) compose on top of it; downstream apps can
5236
- * use it directly to build their own popover-based UI.
5237
- *
5238
- * @example
5239
- * ```html
5240
- * <button #trigger (click)="open.set(!open())">Open</button>
5241
- * <ea-popover [anchor]="trigger" [open]="open()" (closeRequested)="open.set(false)">
5242
- * <div>Popover content</div>
5243
- * </ea-popover>
5244
- * ```
5245
- */
5246
- export declare class PopoverComponent {
5247
- private readonly destroyRef;
5248
- private readonly press;
5249
- private readonly surfaceEl;
5250
- /** Anchor element the popover positions itself against. */
5251
- readonly anchor: import("@angular/core").InputSignal<HTMLElement | ElementRef<HTMLElement> | undefined>;
5252
- /** Whether the popover is currently open. */
5253
- readonly open: import("@angular/core").InputSignal<boolean>;
5254
- /** Where the popover attaches relative to the anchor. */
5255
- readonly placement: import("@angular/core").InputSignal<PopoverPlacement>;
5256
- /** ARIA role applied to the popover surface. */
5257
- readonly role: import("@angular/core").InputSignal<PopoverRole>;
5258
- /** Accessible label. Falls back to nothing; consumers should provide one when no visible heading is in the popover. */
5259
- readonly ariaLabel: import("@angular/core").InputSignal<string | undefined>;
5260
- /** Id of the element that labels the popover surface, forwarded as `aria-labelledby`. */
5261
- readonly ariaLabelledby: import("@angular/core").InputSignal<string | undefined>;
5262
- /** Keep Tab and Shift+Tab cycling within the surface while open (dialog pattern). */
5263
- readonly trapFocus: import("@angular/core").InputSignal<boolean>;
5264
- /** DOM id for the surface so trigger elements can reference it via aria-controls. */
5265
- readonly surfaceId: import("@angular/core").InputSignal<string>;
5266
- /**
5267
- * Gap in px between the anchor and the popover. Defaults to 2 so an open panel
5268
- * clears the anchor's active focus ring instead of sitting flush over it.
5269
- */
5270
- readonly offset: import("@angular/core").InputSignal<number>;
5271
- /** Flip to the opposite side when the requested side overflows the viewport. */
5272
- readonly flip: import("@angular/core").InputSignal<boolean>;
5273
- /** Clamp the popover inside the viewport when it would otherwise overflow. */
5274
- readonly clamp: import("@angular/core").InputSignal<boolean>;
5275
- /** Set the popover's `min-width` to match the anchor's width (dropdown pattern). */
5276
- readonly matchAnchorWidth: import("@angular/core").InputSignal<boolean>;
5277
- /**
5278
- * Widest the surface may grow: a px value, or `anchor` to cap it at the
5279
- * anchor's own width so long content truncates instead of widening the panel.
5280
- */
5281
- readonly maxWidth: import("@angular/core").InputSignal<PopoverMaxWidth | undefined>;
5282
- /** Close on click outside the popover and the anchor. */
5283
- readonly closeOnOutsideClick: import("@angular/core").InputSignal<boolean>;
5284
- /** Close on Escape. */
5285
- readonly closeOnEscape: import("@angular/core").InputSignal<boolean>;
5286
- /** What to do on scroll / resize while open. */
5287
- readonly scrollBehavior: import("@angular/core").InputSignal<PopoverScrollBehavior>;
5288
- /** Requested close. The parent should mirror this into `[open]`. */
5289
- readonly closeRequested: import("@angular/core").OutputEmitterRef<void>;
5290
- private readonly position;
5291
- private latched;
5292
- /** True placement after flip, for class-based styling (e.g. arrow direction). */
5293
- readonly effectivePlacement: import("@angular/core").Signal<PopoverPlacement>;
5294
- /** Latches true once the post-rAF reposition has run, so the surface is
5295
- * only revealed after its dimensions are guaranteed stable. Reset on close. */
5296
- private readonly stable;
5297
- /** True once the first `reposition()` has resolved a placement on a
5298
- * laid-out surface. Drives the `--positioned` class. */
5299
- readonly isPositioned: import("@angular/core").Signal<boolean>;
5300
- /** Class list for the surface. Computed in TS so the placement key (with
5301
- * its interpolated suffix) and the positioned modifier compose cleanly. */
5302
- readonly surfaceClass: import("@angular/core").Signal<string>;
5303
- /** Inline style applied to the surface element. */
5304
- readonly surfaceStyle: import("@angular/core").Signal<Record<string, string>>;
5305
- constructor();
5306
- private resolveAnchor;
5307
- private reposition;
5308
- onDocumentClick(event: MouseEvent): void;
5309
- onSurfaceKeydown(event: KeyboardEvent): void;
5310
- onEscape(event: Event): void;
5311
- static ɵfac: i0.ɵɵFactoryDeclaration<PopoverComponent, never>;
5312
- static ɵcmp: i0.ɵɵComponentDeclaration<PopoverComponent, "ea-popover", never, {
5313
- "anchor": {
5314
- "alias": "anchor";
5315
- "required": true;
5316
- "isSignal": true;
5317
- };
5318
- "open": {
5319
- "alias": "open";
5320
- "required": false;
5321
- "isSignal": true;
5322
- };
5323
- "placement": {
5324
- "alias": "placement";
5325
- "required": false;
5326
- "isSignal": true;
5327
- };
5328
- "role": {
5329
- "alias": "role";
5330
- "required": false;
5331
- "isSignal": true;
5332
- };
5333
- "ariaLabel": {
5334
- "alias": "aria-label";
5335
- "required": false;
5336
- "isSignal": true;
5337
- };
5338
- "ariaLabelledby": {
5339
- "alias": "aria-labelledby";
5340
- "required": false;
5341
- "isSignal": true;
5342
- };
5343
- "trapFocus": {
5344
- "alias": "trapFocus";
5345
- "required": false;
5346
- "isSignal": true;
5347
- };
5348
- "surfaceId": {
5349
- "alias": "surfaceId";
5350
- "required": false;
5351
- "isSignal": true;
5352
- };
5353
- "offset": {
5354
- "alias": "offset";
5355
- "required": false;
5356
- "isSignal": true;
5357
- };
5358
- "flip": {
5359
- "alias": "flip";
5360
- "required": false;
5361
- "isSignal": true;
5362
- };
5363
- "clamp": {
5364
- "alias": "clamp";
5365
- "required": false;
5366
- "isSignal": true;
5367
- };
5368
- "matchAnchorWidth": {
5369
- "alias": "matchAnchorWidth";
5370
- "required": false;
5371
- "isSignal": true;
5372
- };
5373
- "maxWidth": {
5374
- "alias": "maxWidth";
5375
- "required": false;
5376
- "isSignal": true;
5377
- };
5378
- "closeOnOutsideClick": {
5379
- "alias": "closeOnOutsideClick";
5380
- "required": false;
5381
- "isSignal": true;
5382
- };
5383
- "closeOnEscape": {
5384
- "alias": "closeOnEscape";
5385
- "required": false;
5386
- "isSignal": true;
5387
- };
5388
- "scrollBehavior": {
5389
- "alias": "scrollBehavior";
5390
- "required": false;
5391
- "isSignal": true;
5392
- };
5393
- }, {
5394
- "closeRequested": "closeRequested";
5395
- }, never, ["*"], true, never>;
5396
- }
5397
5630
  /** Visual size of the multi-select trigger. */
5398
5631
  export type MultiSelectSize = EaSize;
5399
5632
  /**