@agorapulse/ui-components 18.0.48 → 18.1.1

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.
@@ -34,7 +34,7 @@ export declare class AvatarComponent {
34
34
  private ngStyle;
35
35
  profilePicture: import("@angular/core").InputSignal<string | undefined>;
36
36
  alt: import("@angular/core").InputSignal<string>;
37
- network: import("@angular/core").InputSignalWithTransform<"bluesky" | "facebook" | "instagram" | "linkedin" | "twitter" | "youtube" | "meta" | "google" | "pinterest" | "threads" | "tiktok" | "webBlog" | "webNews" | "X" | "reddit" | undefined, string | undefined>;
37
+ network: import("@angular/core").InputSignalWithTransform<"bluesky" | "facebook" | "instagram" | "linkedin" | "twitter" | "youtube" | "meta" | "google" | "pinterest" | "threads" | "tiktok" | "webBlog" | "webNews" | "X" | "xPlus" | "reddit" | undefined, string | undefined>;
38
38
  size: import("@angular/core").InputSignal<AvatarSize | "16" | "32" | "24" | "56" | "48" | "40" | "36">;
39
39
  username: import("@angular/core").InputSignal<string | undefined>;
40
40
  showInitials: import("@angular/core").InputSignal<string | boolean | undefined>;
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './public_api';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdvcmFwdWxzZS11aS1jb21wb25lbnRzLXBvcG92ZXItbWVudS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYnMvdWktY29tcG9uZW50cy9wb3BvdmVyLW1lbnUvc3JjL2Fnb3JhcHVsc2UtdWktY29tcG9uZW50cy1wb3BvdmVyLW1lbnUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWNfYXBpJztcbiJdfQ==
@@ -0,0 +1,58 @@
1
+ import { Directive, ElementRef, HostListener, inject, input, output } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class PopoverMenuTriggerDirective {
4
+ elementRef = inject((ElementRef));
5
+ apPopoverMenuTrigger = input.required();
6
+ popoverMenuItems = input([]);
7
+ disabled = input(false);
8
+ menuItemClick = output();
9
+ opened = output();
10
+ closed = output();
11
+ onClick(event) {
12
+ event.preventDefault();
13
+ event.stopPropagation();
14
+ if (this.disabled()) {
15
+ return;
16
+ }
17
+ const popoverMenu = this.apPopoverMenuTrigger();
18
+ if (popoverMenu) {
19
+ popoverMenu.toggle(this.elementRef.nativeElement);
20
+ }
21
+ }
22
+ onKeyDown(event) {
23
+ if (this.disabled()) {
24
+ return;
25
+ }
26
+ const popoverMenu = this.apPopoverMenuTrigger();
27
+ if (popoverMenu) {
28
+ switch (event.key) {
29
+ case 'Enter':
30
+ case ' ':
31
+ case 'ArrowDown':
32
+ event.preventDefault();
33
+ popoverMenu.open(this.elementRef.nativeElement);
34
+ break;
35
+ case 'Escape':
36
+ event.preventDefault();
37
+ popoverMenu.close();
38
+ break;
39
+ }
40
+ }
41
+ }
42
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: PopoverMenuTriggerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
43
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.9", type: PopoverMenuTriggerDirective, isStandalone: true, selector: "[apPopoverMenuTrigger]", inputs: { apPopoverMenuTrigger: { classPropertyName: "apPopoverMenuTrigger", publicName: "apPopoverMenuTrigger", isSignal: true, isRequired: true, transformFunction: null }, popoverMenuItems: { classPropertyName: "popoverMenuItems", publicName: "popoverMenuItems", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { menuItemClick: "menuItemClick", opened: "opened", closed: "closed" }, host: { listeners: { "click": "onClick($event)", "keydown": "onKeyDown($event)" } }, ngImport: i0 });
44
+ }
45
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: PopoverMenuTriggerDirective, decorators: [{
46
+ type: Directive,
47
+ args: [{
48
+ selector: '[apPopoverMenuTrigger]',
49
+ standalone: true,
50
+ }]
51
+ }], propDecorators: { onClick: [{
52
+ type: HostListener,
53
+ args: ['click', ['$event']]
54
+ }], onKeyDown: [{
55
+ type: HostListener,
56
+ args: ['keydown', ['$event']]
57
+ }] } });
58
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wb3Zlci1tZW51LXRyaWdnZXIuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGlicy91aS1jb21wb25lbnRzL3BvcG92ZXItbWVudS9zcmMvcG9wb3Zlci1tZW51LXRyaWdnZXIuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFPM0YsTUFBTSxPQUFPLDJCQUEyQjtJQUNuQixVQUFVLEdBQUcsTUFBTSxDQUFDLENBQUEsVUFBdUIsQ0FBQSxDQUFDLENBQUM7SUFFOUQsb0JBQW9CLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBd0IsQ0FBQztJQUM5RCxnQkFBZ0IsR0FBRyxLQUFLLENBQW9CLEVBQUUsQ0FBQyxDQUFDO0lBQ2hELFFBQVEsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFeEIsYUFBYSxHQUFHLE1BQU0sRUFBbUIsQ0FBQztJQUMxQyxNQUFNLEdBQUcsTUFBTSxFQUFRLENBQUM7SUFDeEIsTUFBTSxHQUFHLE1BQU0sRUFBUSxDQUFDO0lBR3hCLE9BQU8sQ0FBQyxLQUFpQjtRQUNyQixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdkIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRXhCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUM7WUFDbEIsT0FBTztRQUNYLENBQUM7UUFFRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUNoRCxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ2QsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3RELENBQUM7SUFDTCxDQUFDO0lBR0QsU0FBUyxDQUFDLEtBQW9CO1FBQzFCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUM7WUFDbEIsT0FBTztRQUNYLENBQUM7UUFFRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUNoRCxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ2QsUUFBUSxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ2hCLEtBQUssT0FBTyxDQUFDO2dCQUNiLEtBQUssR0FBRyxDQUFDO2dCQUNULEtBQUssV0FBVztvQkFDWixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7b0JBQ3ZCLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQztvQkFDaEQsTUFBTTtnQkFFVixLQUFLLFFBQVE7b0JBQ1QsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO29CQUN2QixXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7b0JBQ3BCLE1BQU07WUFDZCxDQUFDO1FBQ0wsQ0FBQztJQUNMLENBQUM7dUdBaERRLDJCQUEyQjsyRkFBM0IsMkJBQTJCOzsyRkFBM0IsMkJBQTJCO2tCQUp2QyxTQUFTO21CQUFDO29CQUNQLFFBQVEsRUFBRSx3QkFBd0I7b0JBQ2xDLFVBQVUsRUFBRSxJQUFJO2lCQUNuQjs4QkFhRyxPQUFPO3NCQUROLFlBQVk7dUJBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQWdCakMsU0FBUztzQkFEUixZQUFZO3VCQUFDLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSG9zdExpc3RlbmVyLCBpbmplY3QsIGlucHV0LCBvdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFBvcG92ZXJNZW51Q29tcG9uZW50LCBQb3BvdmVyTWVudUl0ZW0gfSBmcm9tICcuL3BvcG92ZXItbWVudS5jb21wb25lbnQnO1xuXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1thcFBvcG92ZXJNZW51VHJpZ2dlcl0nLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG59KVxuZXhwb3J0IGNsYXNzIFBvcG92ZXJNZW51VHJpZ2dlckRpcmVjdGl2ZSB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBlbGVtZW50UmVmID0gaW5qZWN0KEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+KTtcblxuICAgIGFwUG9wb3Zlck1lbnVUcmlnZ2VyID0gaW5wdXQucmVxdWlyZWQ8UG9wb3Zlck1lbnVDb21wb25lbnQ+KCk7XG4gICAgcG9wb3Zlck1lbnVJdGVtcyA9IGlucHV0PFBvcG92ZXJNZW51SXRlbVtdPihbXSk7XG4gICAgZGlzYWJsZWQgPSBpbnB1dChmYWxzZSk7XG5cbiAgICBtZW51SXRlbUNsaWNrID0gb3V0cHV0PFBvcG92ZXJNZW51SXRlbT4oKTtcbiAgICBvcGVuZWQgPSBvdXRwdXQ8dm9pZD4oKTtcbiAgICBjbG9zZWQgPSBvdXRwdXQ8dm9pZD4oKTtcblxuICAgIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJywgWyckZXZlbnQnXSlcbiAgICBvbkNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBvcG92ZXJNZW51ID0gdGhpcy5hcFBvcG92ZXJNZW51VHJpZ2dlcigpO1xuICAgICAgICBpZiAocG9wb3Zlck1lbnUpIHtcbiAgICAgICAgICAgIHBvcG92ZXJNZW51LnRvZ2dsZSh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdrZXlkb3duJywgWyckZXZlbnQnXSlcbiAgICBvbktleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcG9wb3Zlck1lbnUgPSB0aGlzLmFwUG9wb3Zlck1lbnVUcmlnZ2VyKCk7XG4gICAgICAgIGlmIChwb3BvdmVyTWVudSkge1xuICAgICAgICAgICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdFbnRlcic6XG4gICAgICAgICAgICAgICAgY2FzZSAnICc6XG4gICAgICAgICAgICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgcG9wb3Zlck1lbnUub3Blbih0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAnRXNjYXBlJzpcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgcG9wb3Zlck1lbnUuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=
@@ -0,0 +1,207 @@
1
+ import { BadgeComponent } from '@agorapulse/ui-components/badge';
2
+ import { TooltipDirective } from '@agorapulse/ui-components/tooltip';
3
+ import { apFeatureLock, apInfo, SymbolComponent, withSymbols } from '@agorapulse/ui-symbol';
4
+ import { Overlay, OverlayPositionBuilder } from '@angular/cdk/overlay';
5
+ import { TemplatePortal } from '@angular/cdk/portal';
6
+ import { CommonModule } from '@angular/common';
7
+ import { ChangeDetectionStrategy, Component, computed, contentChild, effect, ElementRef, inject, input, output, signal, viewChild, ViewContainerRef, } from '@angular/core';
8
+ import { take } from 'rxjs/operators';
9
+ import * as i0 from "@angular/core";
10
+ export class PopoverMenuComponent {
11
+ elementRef = inject(ElementRef);
12
+ overlay = inject(Overlay);
13
+ positionBuilder = inject(OverlayPositionBuilder);
14
+ viewContainerRef = inject(ViewContainerRef);
15
+ menuTemplate = viewChild('menuTemplate');
16
+ trigger = contentChild('trigger');
17
+ items = input([]);
18
+ disabled = input(false);
19
+ largeMenuEnabled = input(false);
20
+ showBackdrop = input(true);
21
+ customWidth = input(null);
22
+ menuItemClick = output();
23
+ opened = output();
24
+ closed = output();
25
+ overlayRef = null;
26
+ portal = null;
27
+ isOpen = signal(false);
28
+ focusedIndex = signal(-1);
29
+ menuItems = computed(() => this.items().filter(item => !item.divider));
30
+ constructor() {
31
+ effect(() => {
32
+ if (this.isOpen()) {
33
+ this.setupKeyboardNavigation();
34
+ }
35
+ });
36
+ }
37
+ open(triggerElement) {
38
+ const menuTemplate = this.menuTemplate();
39
+ if (this.disabled() || this.isOpen() || !menuTemplate) {
40
+ return;
41
+ }
42
+ const target = triggerElement || this.elementRef.nativeElement;
43
+ if (this.overlayRef) {
44
+ this.overlayRef.dispose();
45
+ }
46
+ const positionStrategy = this.createPositionStrategy(target);
47
+ this.overlayRef = this.overlay.create({
48
+ positionStrategy,
49
+ hasBackdrop: this.showBackdrop(),
50
+ backdropClass: '',
51
+ panelClass: '',
52
+ scrollStrategy: this.overlay.scrollStrategies.reposition(),
53
+ });
54
+ this.portal = new TemplatePortal(menuTemplate, this.viewContainerRef);
55
+ this.overlayRef.attach(this.portal);
56
+ this.isOpen.set(true);
57
+ this.focusedIndex.set(-1);
58
+ this.opened.emit();
59
+ this.overlayRef
60
+ .backdropClick()
61
+ .pipe(take(1))
62
+ .subscribe(() => {
63
+ this.close();
64
+ });
65
+ this.overlayRef
66
+ .keydownEvents()
67
+ .pipe(take(1))
68
+ .subscribe((event) => {
69
+ if (event.key === 'Escape') {
70
+ this.close();
71
+ }
72
+ });
73
+ }
74
+ close() {
75
+ if (!this.isOpen()) {
76
+ return;
77
+ }
78
+ if (this.overlayRef) {
79
+ this.overlayRef.dispose();
80
+ this.overlayRef = null;
81
+ }
82
+ this.portal = null;
83
+ this.isOpen.set(false);
84
+ this.focusedIndex.set(-1);
85
+ this.closed.emit();
86
+ }
87
+ toggle(triggerElement) {
88
+ if (this.isOpen()) {
89
+ this.close();
90
+ }
91
+ else {
92
+ this.open(triggerElement);
93
+ }
94
+ }
95
+ onMenuItemClick(item) {
96
+ if (item.disabled) {
97
+ return;
98
+ }
99
+ this.menuItemClick.emit(item);
100
+ this.close();
101
+ }
102
+ onKeyDown(event) {
103
+ const items = this.menuItems();
104
+ const currentIndex = this.focusedIndex();
105
+ let nextIndex;
106
+ let prevIndex;
107
+ switch (event.key) {
108
+ case 'ArrowDown':
109
+ event.preventDefault();
110
+ nextIndex = currentIndex < items.length - 1 ? currentIndex + 1 : 0;
111
+ this.focusedIndex.set(nextIndex);
112
+ break;
113
+ case 'ArrowUp':
114
+ event.preventDefault();
115
+ prevIndex = currentIndex > 0 ? currentIndex - 1 : items.length - 1;
116
+ this.focusedIndex.set(prevIndex);
117
+ break;
118
+ case 'Enter':
119
+ case ' ':
120
+ event.preventDefault();
121
+ if (currentIndex >= 0 && currentIndex < items.length) {
122
+ this.onMenuItemClick(items[currentIndex]);
123
+ }
124
+ break;
125
+ case 'Escape':
126
+ event.preventDefault();
127
+ this.close();
128
+ break;
129
+ case 'Tab':
130
+ event.preventDefault();
131
+ if (event.shiftKey) {
132
+ // Shift+Tab - move to previous item
133
+ prevIndex = currentIndex > 0 ? currentIndex - 1 : items.length - 1;
134
+ this.focusedIndex.set(prevIndex);
135
+ }
136
+ else {
137
+ // Tab - move to next item
138
+ nextIndex = currentIndex < items.length - 1 ? currentIndex + 1 : 0;
139
+ this.focusedIndex.set(nextIndex);
140
+ }
141
+ break;
142
+ }
143
+ }
144
+ createPositionStrategy(target) {
145
+ const positions = [
146
+ // Bottom-right (default)
147
+ {
148
+ originX: 'end',
149
+ originY: 'bottom',
150
+ overlayX: 'start',
151
+ overlayY: 'top',
152
+ offsetX: 0,
153
+ offsetY: 4,
154
+ },
155
+ // Bottom-left (if not enough space on right)
156
+ {
157
+ originX: 'start',
158
+ originY: 'bottom',
159
+ overlayX: 'end',
160
+ overlayY: 'top',
161
+ offsetX: 0,
162
+ offsetY: 4,
163
+ },
164
+ // Top-right (if not enough space below)
165
+ {
166
+ originX: 'end',
167
+ originY: 'top',
168
+ overlayX: 'start',
169
+ overlayY: 'bottom',
170
+ offsetX: 0,
171
+ offsetY: -4,
172
+ },
173
+ // Top-left (if not enough space below and on right)
174
+ {
175
+ originX: 'start',
176
+ originY: 'top',
177
+ overlayX: 'end',
178
+ overlayY: 'bottom',
179
+ offsetX: 0,
180
+ offsetY: -4,
181
+ },
182
+ ];
183
+ return this.positionBuilder
184
+ .flexibleConnectedTo(target)
185
+ .withPositions(positions)
186
+ .withFlexibleDimensions(true)
187
+ .withPush(true)
188
+ .withGrowAfterOpen(true)
189
+ .withViewportMargin(8);
190
+ }
191
+ setupKeyboardNavigation() {
192
+ if (!this.overlayRef) {
193
+ return;
194
+ }
195
+ const keydownEvents = this.overlayRef.keydownEvents();
196
+ keydownEvents.subscribe((event) => {
197
+ this.onKeyDown(event);
198
+ });
199
+ }
200
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: PopoverMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
201
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.9", type: PopoverMenuComponent, isStandalone: true, selector: "ap-popover-menu", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, largeMenuEnabled: { classPropertyName: "largeMenuEnabled", publicName: "largeMenuEnabled", isSignal: true, isRequired: false, transformFunction: null }, showBackdrop: { classPropertyName: "showBackdrop", publicName: "showBackdrop", isSignal: true, isRequired: false, transformFunction: null }, customWidth: { classPropertyName: "customWidth", publicName: "customWidth", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { menuItemClick: "menuItemClick", opened: "opened", closed: "closed" }, providers: [withSymbols(apInfo, apFeatureLock)], queries: [{ propertyName: "trigger", first: true, predicate: ["trigger"], descendants: true, isSignal: true }], viewQueries: [{ propertyName: "menuTemplate", first: true, predicate: ["menuTemplate"], descendants: true, isSignal: true }], ngImport: i0, template: "<ng-template #menuTemplate>\n <!-- Menu -->\n <div\n class=\"ap-popover-menu__content\"\n role=\"menu\"\n tabindex=\"-1\"\n [attr.aria-label]=\"'Menu'\"\n [class.ap-popover-menu__content--default]=\"!largeMenuEnabled() && !customWidth()\"\n [class.ap-popover-menu__content--large]=\"largeMenuEnabled()\"\n [style.width]=\"customWidth() ? customWidth() + 'px' : undefined\"\n (keydown)=\"onKeyDown($event)\">\n <!-- Menu items -->\n @for (item of items(); track item.label) {\n <!-- Divider -->\n @if (item.divider) {\n <div\n class=\"ap-popover-menu__divider\"\n role=\"separator\"></div>\n } @else {\n <!-- Menu item -->\n <button\n type=\"button\"\n role=\"menuitem\"\n class=\"ap-popover-menu__item\"\n [class.ap-popover-menu__item--has-description]=\"item.description\"\n [class.ap-popover-menu__item--disabled]=\"item.disabled\"\n [class.ap-popover-menu__item--focused]=\"focusedIndex() === $index\"\n [class.ap-popover-menu__item--red-mode]=\"item.redModeEnabled\"\n [class.ap-popover-menu__item--feature-lock]=\"item.featureLockEnabled\"\n [attr.aria-disabled]=\"item.disabled\"\n [disabled]=\"item.disabled\"\n [apTooltip]=\"item.itemTooltipText\"\n (click)=\"onMenuItemClick(item)\">\n <!-- Left icon -->\n @if (item.symbolId) {\n <ap-symbol\n class=\"ap-popover-menu__item-left-icon\"\n size=\"sm\"\n [color]=\"item.symbolColor ? item.symbolColor : item.redModeEnabled ? 'red' : 'grey'\"\n [symbolId]=\"item.symbolId\" />\n }\n <!-- Label -->\n <div class=\"ap-popover-menu__item-text-container\">\n <div class=\"ap-popover-menu__item-label-container\">\n <div class=\"ap-popover-menu__item-label\">{{ item.label }}</div>\n <!-- Badge -->\n @if (item.badgeLabel) {\n <ap-badge\n class=\"ap-popover-menu__item-badge\"\n color=\"blue\">\n {{ item.badgeLabel }}\n </ap-badge>\n }\n </div>\n <!-- Description -->\n <div class=\"ap-popover-menu__item-description\">{{ item.description }}</div>\n </div>\n <!-- Tooltip icon -->\n @if (item.iconTooltipText) {\n <ap-symbol\n class=\"ap-popover-menu__item-right-icon\"\n size=\"sm\"\n color=\"grey-blue\"\n symbolId=\"info\"\n [apTooltip]=\"item.iconTooltipText\" />\n }\n <!-- Feature lock icon -->\n @if (item.featureLockEnabled) {\n <ap-symbol\n class=\"ap-popover-menu__item-right-icon\"\n size=\"sm\"\n color=\"purple\"\n symbolId=\"feature-lock\" />\n }\n </button>\n }\n }\n </div>\n</ng-template>\n", styles: [".ap-popover-menu__content{background-color:var(--comp-popover-menu-background-color);border:1px solid var(--comp-popover-menu-border-color);border-radius:var(--comp-popover-menu-border-radius);box-shadow:var(--comp-popover-menu-box-shadow);padding:var(--comp-popover-menu-padding);outline:none;overflow:hidden;z-index:1000}.ap-popover-menu__content.ap-popover-menu__content--default{width:250px}.ap-popover-menu__content.ap-popover-menu__content--large{width:340px}.ap-popover-menu__content:focus{outline:2px solid var(--comp-popover-menu-item-background-color-focused);outline-offset:2px}.ap-popover-menu__item{display:flex;align-items:center;width:100%;height:40px;padding:var(--comp-popover-menu-item-padding);border:none;background:transparent;color:var(--comp-popover-menu-item-text-color);cursor:pointer;font-family:Averta;font-size:var(--comp-popover-menu-item-text-size);line-height:var(--comp-popover-menu-item-text-line-height);text-align:left;transition:background-color .2s ease,color .2s ease}.ap-popover-menu__item:hover{background-color:var(--comp-popover-menu-item-background-color-hover)}.ap-popover-menu__item:focus{outline:none;background-color:var(--comp-popover-menu-item-background-color-focused)}.ap-popover-menu__item.ap-popover-menu__item--has-description{height:auto;min-height:50px}.ap-popover-menu__item.ap-popover-menu__item--focused{background-color:var(--comp-popover-menu-item-background-color-focused)}.ap-popover-menu__item.ap-popover-menu__item--disabled{cursor:not-allowed;opacity:.4}.ap-popover-menu__item.ap-popover-menu__item--red-mode{color:var(--comp-popover-menu-item-text-color-red-mode)}.ap-popover-menu__item.ap-popover-menu__item--red-mode:hover{background-color:var(--comp-popover-menu-item-background-color-red-mode-hover)}.ap-popover-menu__item.ap-popover-menu__item--red-mode:focus{background-color:var(--comp-popover-menu-item-background-color-red-mode-focused)}.ap-popover-menu__item.ap-popover-menu__item--red-mode.ap-popover-menu__item--focused{background-color:var(--comp-popover-menu-item-background-color-red-mode-focused)}.ap-popover-menu__item.ap-popover-menu__item--feature-lock:hover{background-color:var(--comp-popover-menu-item-background-color-feature-lock-hover)}.ap-popover-menu__item.ap-popover-menu__item--feature-lock:focus{background-color:var(--comp-popover-menu-item-background-color-feature-lock-focused)}.ap-popover-menu__item.ap-popover-menu__item--feature-lock.ap-popover-menu__item--focused{background-color:var(--comp-popover-menu-item-background-color-feature-lock-focused)}.ap-popover-menu__item.ap-popover-menu__item--disabled:hover{background-color:transparent}.ap-popover-menu__item .ap-popover-menu__item-left-icon{margin-right:var(--comp-popover-menu-item-icon-spacing)}.ap-popover-menu__item .ap-popover-menu__item-right-icon{margin-left:var(--comp-popover-menu-item-icon-spacing)}.ap-popover-menu__item .ap-popover-menu__item-text-container{display:flex;flex-direction:column;flex:1;min-width:0}.ap-popover-menu__item .ap-popover-menu__item-text-container .ap-popover-menu__item-label-container{display:flex;align-items:center;gap:var(--comp-popover-menu-item-label-spacing);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ap-popover-menu__item .ap-popover-menu__item-text-container .ap-popover-menu__item-label-container .ap-popover-menu__item-label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ap-popover-menu__item .ap-popover-menu__item-text-container .ap-popover-menu__item-description{color:var(--ref-color-grey-80);font-size:var(--ref-font-size-xs);line-height:var(--ref-font-line-height-xs)}.ap-popover-menu__divider{height:1px;background-color:var(--comp-popover-menu-divider-color);margin:var(--comp-popover-menu-divider-margin)}\n"], dependencies: [{ kind: "component", type: BadgeComponent, selector: "ap-badge", inputs: ["color"] }, { kind: "ngmodule", type: CommonModule }, { kind: "component", type: SymbolComponent, selector: "ap-symbol", inputs: ["symbolId", "color", "size"], outputs: ["sizeChange"] }, { kind: "directive", type: TooltipDirective, selector: "[apTooltip]", inputs: ["apTooltip", "apTooltipPosition", "apTooltipShowDelay", "apTooltipHideDelay", "apTooltipDuration", "apTooltipDisabled", "apTooltipTruncatedTextOnly", "apTooltipTemplateContext", "apTooltipVirtualScrollElement"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
202
+ }
203
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: PopoverMenuComponent, decorators: [{
204
+ type: Component,
205
+ args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'ap-popover-menu', standalone: true, imports: [BadgeComponent, CommonModule, SymbolComponent, TooltipDirective], providers: [withSymbols(apInfo, apFeatureLock)], template: "<ng-template #menuTemplate>\n <!-- Menu -->\n <div\n class=\"ap-popover-menu__content\"\n role=\"menu\"\n tabindex=\"-1\"\n [attr.aria-label]=\"'Menu'\"\n [class.ap-popover-menu__content--default]=\"!largeMenuEnabled() && !customWidth()\"\n [class.ap-popover-menu__content--large]=\"largeMenuEnabled()\"\n [style.width]=\"customWidth() ? customWidth() + 'px' : undefined\"\n (keydown)=\"onKeyDown($event)\">\n <!-- Menu items -->\n @for (item of items(); track item.label) {\n <!-- Divider -->\n @if (item.divider) {\n <div\n class=\"ap-popover-menu__divider\"\n role=\"separator\"></div>\n } @else {\n <!-- Menu item -->\n <button\n type=\"button\"\n role=\"menuitem\"\n class=\"ap-popover-menu__item\"\n [class.ap-popover-menu__item--has-description]=\"item.description\"\n [class.ap-popover-menu__item--disabled]=\"item.disabled\"\n [class.ap-popover-menu__item--focused]=\"focusedIndex() === $index\"\n [class.ap-popover-menu__item--red-mode]=\"item.redModeEnabled\"\n [class.ap-popover-menu__item--feature-lock]=\"item.featureLockEnabled\"\n [attr.aria-disabled]=\"item.disabled\"\n [disabled]=\"item.disabled\"\n [apTooltip]=\"item.itemTooltipText\"\n (click)=\"onMenuItemClick(item)\">\n <!-- Left icon -->\n @if (item.symbolId) {\n <ap-symbol\n class=\"ap-popover-menu__item-left-icon\"\n size=\"sm\"\n [color]=\"item.symbolColor ? item.symbolColor : item.redModeEnabled ? 'red' : 'grey'\"\n [symbolId]=\"item.symbolId\" />\n }\n <!-- Label -->\n <div class=\"ap-popover-menu__item-text-container\">\n <div class=\"ap-popover-menu__item-label-container\">\n <div class=\"ap-popover-menu__item-label\">{{ item.label }}</div>\n <!-- Badge -->\n @if (item.badgeLabel) {\n <ap-badge\n class=\"ap-popover-menu__item-badge\"\n color=\"blue\">\n {{ item.badgeLabel }}\n </ap-badge>\n }\n </div>\n <!-- Description -->\n <div class=\"ap-popover-menu__item-description\">{{ item.description }}</div>\n </div>\n <!-- Tooltip icon -->\n @if (item.iconTooltipText) {\n <ap-symbol\n class=\"ap-popover-menu__item-right-icon\"\n size=\"sm\"\n color=\"grey-blue\"\n symbolId=\"info\"\n [apTooltip]=\"item.iconTooltipText\" />\n }\n <!-- Feature lock icon -->\n @if (item.featureLockEnabled) {\n <ap-symbol\n class=\"ap-popover-menu__item-right-icon\"\n size=\"sm\"\n color=\"purple\"\n symbolId=\"feature-lock\" />\n }\n </button>\n }\n }\n </div>\n</ng-template>\n", styles: [".ap-popover-menu__content{background-color:var(--comp-popover-menu-background-color);border:1px solid var(--comp-popover-menu-border-color);border-radius:var(--comp-popover-menu-border-radius);box-shadow:var(--comp-popover-menu-box-shadow);padding:var(--comp-popover-menu-padding);outline:none;overflow:hidden;z-index:1000}.ap-popover-menu__content.ap-popover-menu__content--default{width:250px}.ap-popover-menu__content.ap-popover-menu__content--large{width:340px}.ap-popover-menu__content:focus{outline:2px solid var(--comp-popover-menu-item-background-color-focused);outline-offset:2px}.ap-popover-menu__item{display:flex;align-items:center;width:100%;height:40px;padding:var(--comp-popover-menu-item-padding);border:none;background:transparent;color:var(--comp-popover-menu-item-text-color);cursor:pointer;font-family:Averta;font-size:var(--comp-popover-menu-item-text-size);line-height:var(--comp-popover-menu-item-text-line-height);text-align:left;transition:background-color .2s ease,color .2s ease}.ap-popover-menu__item:hover{background-color:var(--comp-popover-menu-item-background-color-hover)}.ap-popover-menu__item:focus{outline:none;background-color:var(--comp-popover-menu-item-background-color-focused)}.ap-popover-menu__item.ap-popover-menu__item--has-description{height:auto;min-height:50px}.ap-popover-menu__item.ap-popover-menu__item--focused{background-color:var(--comp-popover-menu-item-background-color-focused)}.ap-popover-menu__item.ap-popover-menu__item--disabled{cursor:not-allowed;opacity:.4}.ap-popover-menu__item.ap-popover-menu__item--red-mode{color:var(--comp-popover-menu-item-text-color-red-mode)}.ap-popover-menu__item.ap-popover-menu__item--red-mode:hover{background-color:var(--comp-popover-menu-item-background-color-red-mode-hover)}.ap-popover-menu__item.ap-popover-menu__item--red-mode:focus{background-color:var(--comp-popover-menu-item-background-color-red-mode-focused)}.ap-popover-menu__item.ap-popover-menu__item--red-mode.ap-popover-menu__item--focused{background-color:var(--comp-popover-menu-item-background-color-red-mode-focused)}.ap-popover-menu__item.ap-popover-menu__item--feature-lock:hover{background-color:var(--comp-popover-menu-item-background-color-feature-lock-hover)}.ap-popover-menu__item.ap-popover-menu__item--feature-lock:focus{background-color:var(--comp-popover-menu-item-background-color-feature-lock-focused)}.ap-popover-menu__item.ap-popover-menu__item--feature-lock.ap-popover-menu__item--focused{background-color:var(--comp-popover-menu-item-background-color-feature-lock-focused)}.ap-popover-menu__item.ap-popover-menu__item--disabled:hover{background-color:transparent}.ap-popover-menu__item .ap-popover-menu__item-left-icon{margin-right:var(--comp-popover-menu-item-icon-spacing)}.ap-popover-menu__item .ap-popover-menu__item-right-icon{margin-left:var(--comp-popover-menu-item-icon-spacing)}.ap-popover-menu__item .ap-popover-menu__item-text-container{display:flex;flex-direction:column;flex:1;min-width:0}.ap-popover-menu__item .ap-popover-menu__item-text-container .ap-popover-menu__item-label-container{display:flex;align-items:center;gap:var(--comp-popover-menu-item-label-spacing);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ap-popover-menu__item .ap-popover-menu__item-text-container .ap-popover-menu__item-label-container .ap-popover-menu__item-label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ap-popover-menu__item .ap-popover-menu__item-text-container .ap-popover-menu__item-description{color:var(--ref-color-grey-80);font-size:var(--ref-font-size-xs);line-height:var(--ref-font-line-height-xs)}.ap-popover-menu__divider{height:1px;background-color:var(--comp-popover-menu-divider-color);margin:var(--comp-popover-menu-divider-margin)}\n"] }]
206
+ }], ctorParameters: () => [] });
207
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wb3Zlci1tZW51LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYnMvdWktY29tcG9uZW50cy9wb3BvdmVyLW1lbnUvc3JjL3BvcG92ZXItbWVudS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9saWJzL3VpLWNvbXBvbmVudHMvcG9wb3Zlci1tZW51L3NyYy9wb3BvdmVyLW1lbnUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3JFLE9BQU8sRUFBb0IsYUFBYSxFQUFFLE1BQU0sRUFBZSxlQUFlLEVBQUUsV0FBVyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDM0gsT0FBTyxFQUF3RCxPQUFPLEVBQUUsc0JBQXNCLEVBQWMsTUFBTSxzQkFBc0IsQ0FBQztBQUN6SSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFDSCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFFBQVEsRUFDUixZQUFZLEVBQ1osTUFBTSxFQUNOLFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sRUFDTixNQUFNLEVBRU4sU0FBUyxFQUNULGdCQUFnQixHQUNuQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7O0FBeUJ0QyxNQUFNLE9BQU8sb0JBQW9CO0lBQ1osVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNoQyxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzFCLGVBQWUsR0FBRyxNQUFNLENBQUMsc0JBQXNCLENBQUMs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QUM7dUdBN05RLG9CQUFvQjsyRkFBcEIsb0JBQW9CLG8wQkFGbEIsQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxDQUFDLHdRQzVDbkQsdXZIQStFQSwwdUhEcENjLGNBQWMsdUVBQUUsWUFBWSwrQkFBRSxlQUFlLHNIQUFFLGdCQUFnQjs7MkZBR2hFLG9CQUFvQjtrQkFUaEMsU0FBUztzQ0FDVyx1QkFBdUIsQ0FBQyxNQUFNLFlBQ3JDLGlCQUFpQixjQUdmLElBQUksV0FDUCxDQUFDLGNBQWMsRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixDQUFDLGFBQy9ELENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJhZGdlQ29tcG9uZW50IH0gZnJvbSAnQGFnb3JhcHVsc2UvdWktY29tcG9uZW50cy9iYWRnZSc7XG5pbXBvcnQgeyBUb29sdGlwRGlyZWN0aXZlIH0gZnJvbSAnQGFnb3JhcHVsc2UvdWktY29tcG9uZW50cy90b29sdGlwJztcbmltcG9ydCB7IGFnb3JhcHVsc2VTeW1ib2wsIGFwRmVhdHVyZUxvY2ssIGFwSW5mbywgU3ltYm9sQ29sb3IsIFN5bWJvbENvbXBvbmVudCwgd2l0aFN5bWJvbHMgfSBmcm9tICdAYWdvcmFwdWxzZS91aS1zeW1ib2wnO1xuaW1wb3J0IHsgQ29ubmVjdGVkUG9zaXRpb24sIEZsZXhpYmxlQ29ubmVjdGVkUG9zaXRpb25TdHJhdGVneSwgT3ZlcmxheSwgT3ZlcmxheVBvc2l0aW9uQnVpbGRlciwgT3ZlcmxheVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IFRlbXBsYXRlUG9ydGFsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDb21wb25lbnQsXG4gICAgY29tcHV0ZWQsXG4gICAgY29udGVudENoaWxkLFxuICAgIGVmZmVjdCxcbiAgICBFbGVtZW50UmVmLFxuICAgIGluamVjdCxcbiAgICBpbnB1dCxcbiAgICBvdXRwdXQsXG4gICAgc2lnbmFsLFxuICAgIFRlbXBsYXRlUmVmLFxuICAgIHZpZXdDaGlsZCxcbiAgICBWaWV3Q29udGFpbmVyUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUG9wb3Zlck1lbnVJdGVtIHtcbiAgICBsYWJlbD86IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICBiYWRnZUxhYmVsPzogc3RyaW5nO1xuICAgIHN5bWJvbElkPzogYWdvcmFwdWxzZVN5bWJvbDtcbiAgICBzeW1ib2xDb2xvcj86IFN5bWJvbENvbG9yO1xuICAgIGZlYXR1cmVMb2NrRW5hYmxlZD86IGJvb2xlYW47XG4gICAgcmVkTW9kZUVuYWJsZWQ/OiBib29sZWFuO1xuICAgIGl0ZW1Ub29sdGlwVGV4dD86IHN0cmluZztcbiAgICBpY29uVG9vbHRpcFRleHQ/OiBzdHJpbmc7XG4gICAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICAgIGRpdmlkZXI/OiBib29sZWFuO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBzZWxlY3RvcjogJ2FwLXBvcG92ZXItbWVudScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3BvcG92ZXItbWVudS5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vcG9wb3Zlci1tZW51LmNvbXBvbmVudC5zY3NzJ10sXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbQmFkZ2VDb21wb25lbnQsIENvbW1vbk1vZHVsZSwgU3ltYm9sQ29tcG9uZW50LCBUb29sdGlwRGlyZWN0aXZlXSxcbiAgICBwcm92aWRlcnM6IFt3aXRoU3ltYm9scyhhcEluZm8sIGFwRmVhdHVyZUxvY2spXSxcbn0pXG5leHBvcnQgY2xhc3MgUG9wb3Zlck1lbnVDb21wb25lbnQge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZWxlbWVudFJlZiA9IGluamVjdChFbGVtZW50UmVmKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IG92ZXJsYXkgPSBpbmplY3QoT3ZlcmxheSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBwb3NpdGlvbkJ1aWxkZXIgPSBpbmplY3QoT3ZlcmxheVBvc2l0aW9uQnVpbGRlcik7XG4gICAgcHJpdmF0ZSByZWFkb25seSB2aWV3Q29udGFpbmVyUmVmID0gaW5qZWN0KFZpZXdDb250YWluZXJSZWYpO1xuXG4gICAgbWVudVRlbXBsYXRlID0gdmlld0NoaWxkPFRlbXBsYXRlUmVmPHVua25vd24+PignbWVudVRlbXBsYXRlJyk7XG4gICAgdHJpZ2dlciA9IGNvbnRlbnRDaGlsZDxUZW1wbGF0ZVJlZjx1bmtub3duPj4oJ3RyaWdnZXInKTtcblxuICAgIGl0ZW1zID0gaW5wdXQ8UG9wb3Zlck1lbnVJdGVtW10+KFtdKTtcbiAgICBkaXNhYmxlZCA9IGlucHV0KGZhbHNlKTtcbiAgICBsYXJnZU1lbnVFbmFibGVkID0gaW5wdXQoZmFsc2UpO1xuICAgIHNob3dCYWNrZHJvcCA9IGlucHV0KHRydWUpO1xuICAgIGN1c3RvbVdpZHRoID0gaW5wdXQ8bnVtYmVyIHwgbnVsbD4obnVsbCk7XG5cbiAgICBtZW51SXRlbUNsaWNrID0gb3V0cHV0PFBvcG92ZXJNZW51SXRlbT4oKTtcbiAgICBvcGVuZWQgPSBvdXRwdXQ8dm9pZD4oKTtcbiAgICBjbG9zZWQgPSBvdXRwdXQ8dm9pZD4oKTtcblxuICAgIHByaXZhdGUgb3ZlcmxheVJlZjogT3ZlcmxheVJlZiB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgcG9ydGFsOiBUZW1wbGF0ZVBvcnRhbDx1bmtub3duPiB8IG51bGwgPSBudWxsO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzT3BlbiA9IHNpZ25hbChmYWxzZSk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGZvY3VzZWRJbmRleCA9IHNpZ25hbCgtMSk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG1lbnVJdGVtcyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuaXRlbXMoKS5maWx0ZXIoaXRlbSA9PiAhaXRlbS5kaXZpZGVyKSk7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgZWZmZWN0KCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzT3BlbigpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXR1cEtleWJvYXJkTmF2aWdhdGlvbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvcGVuKHRyaWdnZXJFbGVtZW50PzogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbWVudVRlbXBsYXRlID0gdGhpcy5tZW51VGVtcGxhdGUoKTtcblxuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCgpIHx8IHRoaXMuaXNPcGVuKCkgfHwgIW1lbnVUZW1wbGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gdHJpZ2dlckVsZW1lbnQgfHwgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICAgICAgaWYgKHRoaXMub3ZlcmxheVJlZikge1xuICAgICAgICAgICAgdGhpcy5vdmVybGF5UmVmLmRpc3Bvc2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBvc2l0aW9uU3RyYXRlZ3kgPSB0aGlzLmNyZWF0ZVBvc2l0aW9uU3RyYXRlZ3kodGFyZ2V0KTtcblxuICAgICAgICB0aGlzLm92ZXJsYXlSZWYgPSB0aGlzLm92ZXJsYXkuY3JlYXRlKHtcbiAgICAgICAgICAgIHBvc2l0aW9uU3RyYXRlZ3ksXG4gICAgICAgICAgICBoYXNCYWNrZHJvcDogdGhpcy5zaG93QmFja2Ryb3AoKSxcbiAgICAgICAgICAgIGJhY2tkcm9wQ2xhc3M6ICcnLFxuICAgICAgICAgICAgcGFuZWxDbGFzczogJycsXG4gICAgICAgICAgICBzY3JvbGxTdHJhdGVneTogdGhpcy5vdmVybGF5LnNjcm9sbFN0cmF0ZWdpZXMucmVwb3NpdGlvbigpLFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnBvcnRhbCA9IG5ldyBUZW1wbGF0ZVBvcnRhbChtZW51VGVtcGxhdGUsIHRoaXMudmlld0NvbnRhaW5lclJlZik7XG4gICAgICAgIHRoaXMub3ZlcmxheVJlZi5hdHRhY2godGhpcy5wb3J0YWwpO1xuXG4gICAgICAgIHRoaXMuaXNPcGVuLnNldCh0cnVlKTtcbiAgICAgICAgdGhpcy5mb2N1c2VkSW5kZXguc2V0KC0xKTtcbiAgICAgICAgdGhpcy5vcGVuZWQuZW1pdCgpO1xuXG4gICAgICAgIHRoaXMub3ZlcmxheVJlZlxuICAgICAgICAgICAgLmJhY2tkcm9wQ2xpY2soKVxuICAgICAgICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMub3ZlcmxheVJlZlxuICAgICAgICAgICAgLmtleWRvd25FdmVudHMoKVxuICAgICAgICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNsb3NlKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuaXNPcGVuKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm92ZXJsYXlSZWYpIHtcbiAgICAgICAgICAgIHRoaXMub3ZlcmxheVJlZi5kaXNwb3NlKCk7XG4gICAgICAgICAgICB0aGlzLm92ZXJsYXlSZWYgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wb3J0YWwgPSBudWxsO1xuICAgICAgICB0aGlzLmlzT3Blbi5zZXQoZmFsc2UpO1xuICAgICAgICB0aGlzLmZvY3VzZWRJbmRleC5zZXQoLTEpO1xuICAgICAgICB0aGlzLmNsb3NlZC5lbWl0KCk7XG4gICAgfVxuXG4gICAgdG9nZ2xlKHRyaWdnZXJFbGVtZW50PzogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNPcGVuKCkpIHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMub3Blbih0cmlnZ2VyRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbk1lbnVJdGVtQ2xpY2soaXRlbTogUG9wb3Zlck1lbnVJdGVtKTogdm9pZCB7XG4gICAgICAgIGlmIChpdGVtLmRpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm1lbnVJdGVtQ2xpY2suZW1pdChpdGVtKTtcblxuICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgfVxuXG4gICAgb25LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5tZW51SXRlbXMoKTtcbiAgICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gdGhpcy5mb2N1c2VkSW5kZXgoKTtcbiAgICAgICAgbGV0IG5leHRJbmRleDogbnVtYmVyO1xuICAgICAgICBsZXQgcHJldkluZGV4OiBudW1iZXI7XG5cbiAgICAgICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93RG93bic6XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBuZXh0SW5kZXggPSBjdXJyZW50SW5kZXggPCBpdGVtcy5sZW5ndGggLSAxID8gY3VycmVudEluZGV4ICsgMSA6IDA7XG4gICAgICAgICAgICAgICAgdGhpcy5mb2N1c2VkSW5kZXguc2V0KG5leHRJbmRleCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgcHJldkluZGV4ID0gY3VycmVudEluZGV4ID4gMCA/IGN1cnJlbnRJbmRleCAtIDEgOiBpdGVtcy5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgIHRoaXMuZm9jdXNlZEluZGV4LnNldChwcmV2SW5kZXgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlICdFbnRlcic6XG4gICAgICAgICAgICBjYXNlICcgJzpcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggPj0gMCAmJiBjdXJyZW50SW5kZXggPCBpdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbk1lbnVJdGVtQ2xpY2soaXRlbXNbY3VycmVudEluZGV4XSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlICdFc2NhcGUnOlxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlICdUYWInOlxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNoaWZ0K1RhYiAtIG1vdmUgdG8gcHJldmlvdXMgaXRlbVxuICAgICAgICAgICAgICAgICAgICBwcmV2SW5kZXggPSBjdXJyZW50SW5kZXggPiAwID8gY3VycmVudEluZGV4IC0gMSA6IGl0ZW1zLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9jdXNlZEluZGV4LnNldChwcmV2SW5kZXgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRhYiAtIG1vdmUgdG8gbmV4dCBpdGVtXG4gICAgICAgICAgICAgICAgICAgIG5leHRJbmRleCA9IGN1cnJlbnRJbmRleCA8IGl0ZW1zLmxlbmd0aCAtIDEgPyBjdXJyZW50SW5kZXggKyAxIDogMDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb2N1c2VkSW5kZXguc2V0KG5leHRJbmRleCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVQb3NpdGlvblN0cmF0ZWd5KHRhcmdldDogSFRNTEVsZW1lbnQpOiBGbGV4aWJsZUNvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3kge1xuICAgICAgICBjb25zdCBwb3NpdGlvbnM6IENvbm5lY3RlZFBvc2l0aW9uW10gPSBbXG4gICAgICAgICAgICAvLyBCb3R0b20tcmlnaHQgKGRlZmF1bHQpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgb3JpZ2luWDogJ2VuZCcsXG4gICAgICAgICAgICAgICAgb3JpZ2luWTogJ2JvdHRvbScsXG4gICAgICAgICAgICAgICAgb3ZlcmxheVg6ICdzdGFydCcsXG4gICAgICAgICAgICAgICAgb3ZlcmxheVk6ICd0b3AnLFxuICAgICAgICAgICAgICAgIG9mZnNldFg6IDAsXG4gICAgICAgICAgICAgICAgb2Zmc2V0WTogNCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvLyBCb3R0b20tbGVmdCAoaWYgbm90IGVub3VnaCBzcGFjZSBvbiByaWdodClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBvcmlnaW5YOiAnc3RhcnQnLFxuICAgICAgICAgICAgICAgIG9yaWdpblk6ICdib3R0b20nLFxuICAgICAgICAgICAgICAgIG92ZXJsYXlYOiAnZW5kJyxcbiAgICAgICAgICAgICAgICBvdmVybGF5WTogJ3RvcCcsXG4gICAgICAgICAgICAgICAgb2Zmc2V0WDogMCxcbiAgICAgICAgICAgICAgICBvZmZzZXRZOiA0LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8vIFRvcC1yaWdodCAoaWYgbm90IGVub3VnaCBzcGFjZSBiZWxvdylcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBvcmlnaW5YOiAnZW5kJyxcbiAgICAgICAgICAgICAgICBvcmlnaW5ZOiAndG9wJyxcbiAgICAgICAgICAgICAgICBvdmVybGF5WDogJ3N0YXJ0JyxcbiAgICAgICAgICAgICAgICBvdmVybGF5WTogJ2JvdHRvbScsXG4gICAgICAgICAgICAgICAgb2Zmc2V0WDogMCxcbiAgICAgICAgICAgICAgICBvZmZzZXRZOiAtNCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvLyBUb3AtbGVmdCAoaWYgbm90IGVub3VnaCBzcGFjZSBiZWxvdyBhbmQgb24gcmlnaHQpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgb3JpZ2luWDogJ3N0YXJ0JyxcbiAgICAgICAgICAgICAgICBvcmlnaW5ZOiAndG9wJyxcbiAgICAgICAgICAgICAgICBvdmVybGF5WDogJ2VuZCcsXG4gICAgICAgICAgICAgICAgb3ZlcmxheVk6ICdib3R0b20nLFxuICAgICAgICAgICAgICAgIG9mZnNldFg6IDAsXG4gICAgICAgICAgICAgICAgb2Zmc2V0WTogLTQsXG4gICAgICAgICAgICB9LFxuICAgICAgICBdO1xuXG4gICAgICAgIHJldHVybiB0aGlzLnBvc2l0aW9uQnVpbGRlclxuICAgICAgICAgICAgLmZsZXhpYmxlQ29ubmVjdGVkVG8odGFyZ2V0KVxuICAgICAgICAgICAgLndpdGhQb3NpdGlvbnMocG9zaXRpb25zKVxuICAgICAgICAgICAgLndpdGhGbGV4aWJsZURpbWVuc2lvbnModHJ1ZSlcbiAgICAgICAgICAgIC53aXRoUHVzaCh0cnVlKVxuICAgICAgICAgICAgLndpdGhHcm93QWZ0ZXJPcGVuKHRydWUpXG4gICAgICAgICAgICAud2l0aFZpZXdwb3J0TWFyZ2luKDgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0dXBLZXlib2FyZE5hdmlnYXRpb24oKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5vdmVybGF5UmVmKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBrZXlkb3duRXZlbnRzID0gdGhpcy5vdmVybGF5UmVmLmtleWRvd25FdmVudHMoKTtcblxuICAgICAgICBrZXlkb3duRXZlbnRzLnN1YnNjcmliZSgoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25LZXlEb3duKGV2ZW50KTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwiPG5nLXRlbXBsYXRlICNtZW51VGVtcGxhdGU+XG4gICAgPCEtLSBNZW51IC0tPlxuICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJhcC1wb3BvdmVyLW1lbnVfX2NvbnRlbnRcIlxuICAgICAgICByb2xlPVwibWVudVwiXG4gICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidNZW51J1wiXG4gICAgICAgIFtjbGFzcy5hcC1wb3BvdmVyLW1lbnVfX2NvbnRlbnQtLWRlZmF1bHRdPVwiIWxhcmdlTWVudUVuYWJsZWQoKSAmJiAhY3VzdG9tV2lkdGgoKVwiXG4gICAgICAgIFtjbGFzcy5hcC1wb3BvdmVyLW1lbnVfX2NvbnRlbnQtLWxhcmdlXT1cImxhcmdlTWVudUVuYWJsZWQoKVwiXG4gICAgICAgIFtzdHlsZS53aWR0aF09XCJjdXN0b21XaWR0aCgpID8gY3VzdG9tV2lkdGgoKSArICdweCcgOiB1bmRlZmluZWRcIlxuICAgICAgICAoa2V5ZG93bik9XCJvbktleURvd24oJGV2ZW50KVwiPlxuICAgICAgICA8IS0tIE1lbnUgaXRlbXMgLS0+XG4gICAgICAgIEBmb3IgKGl0ZW0gb2YgaXRlbXMoKTsgdHJhY2sgaXRlbS5sYWJlbCkge1xuICAgICAgICAgICAgPCEtLSBEaXZpZGVyIC0tPlxuICAgICAgICAgICAgQGlmIChpdGVtLmRpdmlkZXIpIHtcbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYXAtcG9wb3Zlci1tZW51X19kaXZpZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgcm9sZT1cInNlcGFyYXRvclwiPjwvZGl2PlxuICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgPCEtLSBNZW51IGl0ZW0gLS0+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgcm9sZT1cIm1lbnVpdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhcC1wb3BvdmVyLW1lbnVfX2l0ZW1cIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYXAtcG9wb3Zlci1tZW51X19pdGVtLS1oYXMtZGVzY3JpcHRpb25dPVwiaXRlbS5kZXNjcmlwdGlvblwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hcC1wb3BvdmVyLW1lbnVfX2l0ZW0tLWRpc2FibGVkXT1cIml0ZW0uZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYXAtcG9wb3Zlci1tZW51X19pdGVtLS1mb2N1c2VkXT1cImZvY3VzZWRJbmRleCgpID09PSAkaW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYXAtcG9wb3Zlci1tZW51X19pdGVtLS1yZWQtbW9kZV09XCJpdGVtLnJlZE1vZGVFbmFibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFwLXBvcG92ZXItbWVudV9faXRlbS0tZmVhdHVyZS1sb2NrXT1cIml0ZW0uZmVhdHVyZUxvY2tFbmFibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJpdGVtLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIml0ZW0uZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICBbYXBUb29sdGlwXT1cIml0ZW0uaXRlbVRvb2x0aXBUZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uTWVudUl0ZW1DbGljayhpdGVtKVwiPlxuICAgICAgICAgICAgICAgICAgICA8IS0tIExlZnQgaWNvbiAtLT5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChpdGVtLnN5bWJvbElkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8YXAtc3ltYm9sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhcC1wb3BvdmVyLW1lbnVfX2l0ZW0tbGVmdC1pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPVwic21cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb2xvcl09XCJpdGVtLnN5bWJvbENvbG9yID8gaXRlbS5zeW1ib2xDb2xvciA6IGl0ZW0ucmVkTW9kZUVuYWJsZWQgPyAncmVkJyA6ICdncmV5J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N5bWJvbElkXT1cIml0ZW0uc3ltYm9sSWRcIiAvPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gTGFiZWwgLS0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcC1wb3BvdmVyLW1lbnVfX2l0ZW0tdGV4dC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcC1wb3BvdmVyLW1lbnVfX2l0ZW0tbGFiZWwtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFwLXBvcG92ZXItbWVudV9faXRlbS1sYWJlbFwiPnt7IGl0ZW0ubGFiZWwgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEJhZGdlIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoaXRlbS5iYWRnZUxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcC1iYWRnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhcC1wb3BvdmVyLW1lbnVfX2l0ZW0tYmFkZ2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I9XCJibHVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtLmJhZGdlTGFiZWwgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcC1iYWRnZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRGVzY3JpcHRpb24gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXAtcG9wb3Zlci1tZW51X19pdGVtLWRlc2NyaXB0aW9uXCI+e3sgaXRlbS5kZXNjcmlwdGlvbiB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBUb29sdGlwIGljb24gLS0+XG4gICAgICAgICAgICAgICAgICAgIEBpZiAoaXRlbS5pY29uVG9vbHRpcFRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxhcC1zeW1ib2xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFwLXBvcG92ZXItbWVudV9faXRlbS1yaWdodC1pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPVwic21cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yPVwiZ3JleS1ibHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2xJZD1cImluZm9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthcFRvb2x0aXBdPVwiaXRlbS5pY29uVG9vbHRpcFRleHRcIiAvPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gRmVhdHVyZSBsb2NrIGljb24gLS0+XG4gICAgICAgICAgICAgICAgICAgIEBpZiAoaXRlbS5mZWF0dXJlTG9ja0VuYWJsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxhcC1zeW1ib2xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFwLXBvcG92ZXItbWVudV9faXRlbS1yaWdodC1pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPVwic21cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yPVwicHVycGxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2xJZD1cImZlYXR1cmUtbG9ja1wiIC8+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
@@ -0,0 +1,3 @@
1
+ export { PopoverMenuTriggerDirective } from './popover-menu-trigger.directive';
2
+ export { PopoverMenuComponent } from './popover-menu.component';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX2FwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYnMvdWktY29tcG9uZW50cy9wb3BvdmVyLW1lbnUvc3JjL3B1YmxpY19hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDL0UsT0FBTyxFQUFFLG9CQUFvQixFQUFtQixNQUFNLDBCQUEwQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgUG9wb3Zlck1lbnVUcmlnZ2VyRGlyZWN0aXZlIH0gZnJvbSAnLi9wb3BvdmVyLW1lbnUtdHJpZ2dlci5kaXJlY3RpdmUnO1xuZXhwb3J0IHsgUG9wb3Zlck1lbnVDb21wb25lbnQsIFBvcG92ZXJNZW51SXRlbSB9IGZyb20gJy4vcG9wb3Zlci1tZW51LmNvbXBvbmVudCc7XG4iXX0=
@@ -0,0 +1,270 @@
1
+ import * as i0 from '@angular/core';
2
+ import { inject, ElementRef, input, output, HostListener, Directive, ViewContainerRef, viewChild, contentChild, signal, computed, effect, ChangeDetectionStrategy, Component } from '@angular/core';
3
+ import { BadgeComponent } from '@agorapulse/ui-components/badge';
4
+ import { TooltipDirective } from '@agorapulse/ui-components/tooltip';
5
+ import { SymbolComponent, withSymbols, apInfo, apFeatureLock } from '@agorapulse/ui-symbol';
6
+ import { Overlay, OverlayPositionBuilder } from '@angular/cdk/overlay';
7
+ import { TemplatePortal } from '@angular/cdk/portal';
8
+ import { CommonModule } from '@angular/common';
9
+ import { take } from 'rxjs/operators';
10
+
11
+ class PopoverMenuTriggerDirective {
12
+ elementRef = inject((ElementRef));
13
+ apPopoverMenuTrigger = input.required();
14
+ popoverMenuItems = input([]);
15
+ disabled = input(false);
16
+ menuItemClick = output();
17
+ opened = output();
18
+ closed = output();
19
+ onClick(event) {
20
+ event.preventDefault();
21
+ event.stopPropagation();
22
+ if (this.disabled()) {
23
+ return;
24
+ }
25
+ const popoverMenu = this.apPopoverMenuTrigger();
26
+ if (popoverMenu) {
27
+ popoverMenu.toggle(this.elementRef.nativeElement);
28
+ }
29
+ }
30
+ onKeyDown(event) {
31
+ if (this.disabled()) {
32
+ return;
33
+ }
34
+ const popoverMenu = this.apPopoverMenuTrigger();
35
+ if (popoverMenu) {
36
+ switch (event.key) {
37
+ case 'Enter':
38
+ case ' ':
39
+ case 'ArrowDown':
40
+ event.preventDefault();
41
+ popoverMenu.open(this.elementRef.nativeElement);
42
+ break;
43
+ case 'Escape':
44
+ event.preventDefault();
45
+ popoverMenu.close();
46
+ break;
47
+ }
48
+ }
49
+ }
50
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: PopoverMenuTriggerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
51
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.9", type: PopoverMenuTriggerDirective, isStandalone: true, selector: "[apPopoverMenuTrigger]", inputs: { apPopoverMenuTrigger: { classPropertyName: "apPopoverMenuTrigger", publicName: "apPopoverMenuTrigger", isSignal: true, isRequired: true, transformFunction: null }, popoverMenuItems: { classPropertyName: "popoverMenuItems", publicName: "popoverMenuItems", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { menuItemClick: "menuItemClick", opened: "opened", closed: "closed" }, host: { listeners: { "click": "onClick($event)", "keydown": "onKeyDown($event)" } }, ngImport: i0 });
52
+ }
53
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: PopoverMenuTriggerDirective, decorators: [{
54
+ type: Directive,
55
+ args: [{
56
+ selector: '[apPopoverMenuTrigger]',
57
+ standalone: true,
58
+ }]
59
+ }], propDecorators: { onClick: [{
60
+ type: HostListener,
61
+ args: ['click', ['$event']]
62
+ }], onKeyDown: [{
63
+ type: HostListener,
64
+ args: ['keydown', ['$event']]
65
+ }] } });
66
+
67
+ class PopoverMenuComponent {
68
+ elementRef = inject(ElementRef);
69
+ overlay = inject(Overlay);
70
+ positionBuilder = inject(OverlayPositionBuilder);
71
+ viewContainerRef = inject(ViewContainerRef);
72
+ menuTemplate = viewChild('menuTemplate');
73
+ trigger = contentChild('trigger');
74
+ items = input([]);
75
+ disabled = input(false);
76
+ largeMenuEnabled = input(false);
77
+ showBackdrop = input(true);
78
+ customWidth = input(null);
79
+ menuItemClick = output();
80
+ opened = output();
81
+ closed = output();
82
+ overlayRef = null;
83
+ portal = null;
84
+ isOpen = signal(false);
85
+ focusedIndex = signal(-1);
86
+ menuItems = computed(() => this.items().filter(item => !item.divider));
87
+ constructor() {
88
+ effect(() => {
89
+ if (this.isOpen()) {
90
+ this.setupKeyboardNavigation();
91
+ }
92
+ });
93
+ }
94
+ open(triggerElement) {
95
+ const menuTemplate = this.menuTemplate();
96
+ if (this.disabled() || this.isOpen() || !menuTemplate) {
97
+ return;
98
+ }
99
+ const target = triggerElement || this.elementRef.nativeElement;
100
+ if (this.overlayRef) {
101
+ this.overlayRef.dispose();
102
+ }
103
+ const positionStrategy = this.createPositionStrategy(target);
104
+ this.overlayRef = this.overlay.create({
105
+ positionStrategy,
106
+ hasBackdrop: this.showBackdrop(),
107
+ backdropClass: '',
108
+ panelClass: '',
109
+ scrollStrategy: this.overlay.scrollStrategies.reposition(),
110
+ });
111
+ this.portal = new TemplatePortal(menuTemplate, this.viewContainerRef);
112
+ this.overlayRef.attach(this.portal);
113
+ this.isOpen.set(true);
114
+ this.focusedIndex.set(-1);
115
+ this.opened.emit();
116
+ this.overlayRef
117
+ .backdropClick()
118
+ .pipe(take(1))
119
+ .subscribe(() => {
120
+ this.close();
121
+ });
122
+ this.overlayRef
123
+ .keydownEvents()
124
+ .pipe(take(1))
125
+ .subscribe((event) => {
126
+ if (event.key === 'Escape') {
127
+ this.close();
128
+ }
129
+ });
130
+ }
131
+ close() {
132
+ if (!this.isOpen()) {
133
+ return;
134
+ }
135
+ if (this.overlayRef) {
136
+ this.overlayRef.dispose();
137
+ this.overlayRef = null;
138
+ }
139
+ this.portal = null;
140
+ this.isOpen.set(false);
141
+ this.focusedIndex.set(-1);
142
+ this.closed.emit();
143
+ }
144
+ toggle(triggerElement) {
145
+ if (this.isOpen()) {
146
+ this.close();
147
+ }
148
+ else {
149
+ this.open(triggerElement);
150
+ }
151
+ }
152
+ onMenuItemClick(item) {
153
+ if (item.disabled) {
154
+ return;
155
+ }
156
+ this.menuItemClick.emit(item);
157
+ this.close();
158
+ }
159
+ onKeyDown(event) {
160
+ const items = this.menuItems();
161
+ const currentIndex = this.focusedIndex();
162
+ let nextIndex;
163
+ let prevIndex;
164
+ switch (event.key) {
165
+ case 'ArrowDown':
166
+ event.preventDefault();
167
+ nextIndex = currentIndex < items.length - 1 ? currentIndex + 1 : 0;
168
+ this.focusedIndex.set(nextIndex);
169
+ break;
170
+ case 'ArrowUp':
171
+ event.preventDefault();
172
+ prevIndex = currentIndex > 0 ? currentIndex - 1 : items.length - 1;
173
+ this.focusedIndex.set(prevIndex);
174
+ break;
175
+ case 'Enter':
176
+ case ' ':
177
+ event.preventDefault();
178
+ if (currentIndex >= 0 && currentIndex < items.length) {
179
+ this.onMenuItemClick(items[currentIndex]);
180
+ }
181
+ break;
182
+ case 'Escape':
183
+ event.preventDefault();
184
+ this.close();
185
+ break;
186
+ case 'Tab':
187
+ event.preventDefault();
188
+ if (event.shiftKey) {
189
+ // Shift+Tab - move to previous item
190
+ prevIndex = currentIndex > 0 ? currentIndex - 1 : items.length - 1;
191
+ this.focusedIndex.set(prevIndex);
192
+ }
193
+ else {
194
+ // Tab - move to next item
195
+ nextIndex = currentIndex < items.length - 1 ? currentIndex + 1 : 0;
196
+ this.focusedIndex.set(nextIndex);
197
+ }
198
+ break;
199
+ }
200
+ }
201
+ createPositionStrategy(target) {
202
+ const positions = [
203
+ // Bottom-right (default)
204
+ {
205
+ originX: 'end',
206
+ originY: 'bottom',
207
+ overlayX: 'start',
208
+ overlayY: 'top',
209
+ offsetX: 0,
210
+ offsetY: 4,
211
+ },
212
+ // Bottom-left (if not enough space on right)
213
+ {
214
+ originX: 'start',
215
+ originY: 'bottom',
216
+ overlayX: 'end',
217
+ overlayY: 'top',
218
+ offsetX: 0,
219
+ offsetY: 4,
220
+ },
221
+ // Top-right (if not enough space below)
222
+ {
223
+ originX: 'end',
224
+ originY: 'top',
225
+ overlayX: 'start',
226
+ overlayY: 'bottom',
227
+ offsetX: 0,
228
+ offsetY: -4,
229
+ },
230
+ // Top-left (if not enough space below and on right)
231
+ {
232
+ originX: 'start',
233
+ originY: 'top',
234
+ overlayX: 'end',
235
+ overlayY: 'bottom',
236
+ offsetX: 0,
237
+ offsetY: -4,
238
+ },
239
+ ];
240
+ return this.positionBuilder
241
+ .flexibleConnectedTo(target)
242
+ .withPositions(positions)
243
+ .withFlexibleDimensions(true)
244
+ .withPush(true)
245
+ .withGrowAfterOpen(true)
246
+ .withViewportMargin(8);
247
+ }
248
+ setupKeyboardNavigation() {
249
+ if (!this.overlayRef) {
250
+ return;
251
+ }
252
+ const keydownEvents = this.overlayRef.keydownEvents();
253
+ keydownEvents.subscribe((event) => {
254
+ this.onKeyDown(event);
255
+ });
256
+ }
257
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: PopoverMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
258
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.9", type: PopoverMenuComponent, isStandalone: true, selector: "ap-popover-menu", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, largeMenuEnabled: { classPropertyName: "largeMenuEnabled", publicName: "largeMenuEnabled", isSignal: true, isRequired: false, transformFunction: null }, showBackdrop: { classPropertyName: "showBackdrop", publicName: "showBackdrop", isSignal: true, isRequired: false, transformFunction: null }, customWidth: { classPropertyName: "customWidth", publicName: "customWidth", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { menuItemClick: "menuItemClick", opened: "opened", closed: "closed" }, providers: [withSymbols(apInfo, apFeatureLock)], queries: [{ propertyName: "trigger", first: true, predicate: ["trigger"], descendants: true, isSignal: true }], viewQueries: [{ propertyName: "menuTemplate", first: true, predicate: ["menuTemplate"], descendants: true, isSignal: true }], ngImport: i0, template: "<ng-template #menuTemplate>\n <!-- Menu -->\n <div\n class=\"ap-popover-menu__content\"\n role=\"menu\"\n tabindex=\"-1\"\n [attr.aria-label]=\"'Menu'\"\n [class.ap-popover-menu__content--default]=\"!largeMenuEnabled() && !customWidth()\"\n [class.ap-popover-menu__content--large]=\"largeMenuEnabled()\"\n [style.width]=\"customWidth() ? customWidth() + 'px' : undefined\"\n (keydown)=\"onKeyDown($event)\">\n <!-- Menu items -->\n @for (item of items(); track item.label) {\n <!-- Divider -->\n @if (item.divider) {\n <div\n class=\"ap-popover-menu__divider\"\n role=\"separator\"></div>\n } @else {\n <!-- Menu item -->\n <button\n type=\"button\"\n role=\"menuitem\"\n class=\"ap-popover-menu__item\"\n [class.ap-popover-menu__item--has-description]=\"item.description\"\n [class.ap-popover-menu__item--disabled]=\"item.disabled\"\n [class.ap-popover-menu__item--focused]=\"focusedIndex() === $index\"\n [class.ap-popover-menu__item--red-mode]=\"item.redModeEnabled\"\n [class.ap-popover-menu__item--feature-lock]=\"item.featureLockEnabled\"\n [attr.aria-disabled]=\"item.disabled\"\n [disabled]=\"item.disabled\"\n [apTooltip]=\"item.itemTooltipText\"\n (click)=\"onMenuItemClick(item)\">\n <!-- Left icon -->\n @if (item.symbolId) {\n <ap-symbol\n class=\"ap-popover-menu__item-left-icon\"\n size=\"sm\"\n [color]=\"item.symbolColor ? item.symbolColor : item.redModeEnabled ? 'red' : 'grey'\"\n [symbolId]=\"item.symbolId\" />\n }\n <!-- Label -->\n <div class=\"ap-popover-menu__item-text-container\">\n <div class=\"ap-popover-menu__item-label-container\">\n <div class=\"ap-popover-menu__item-label\">{{ item.label }}</div>\n <!-- Badge -->\n @if (item.badgeLabel) {\n <ap-badge\n class=\"ap-popover-menu__item-badge\"\n color=\"blue\">\n {{ item.badgeLabel }}\n </ap-badge>\n }\n </div>\n <!-- Description -->\n <div class=\"ap-popover-menu__item-description\">{{ item.description }}</div>\n </div>\n <!-- Tooltip icon -->\n @if (item.iconTooltipText) {\n <ap-symbol\n class=\"ap-popover-menu__item-right-icon\"\n size=\"sm\"\n color=\"grey-blue\"\n symbolId=\"info\"\n [apTooltip]=\"item.iconTooltipText\" />\n }\n <!-- Feature lock icon -->\n @if (item.featureLockEnabled) {\n <ap-symbol\n class=\"ap-popover-menu__item-right-icon\"\n size=\"sm\"\n color=\"purple\"\n symbolId=\"feature-lock\" />\n }\n </button>\n }\n }\n </div>\n</ng-template>\n", styles: [".ap-popover-menu__content{background-color:var(--comp-popover-menu-background-color);border:1px solid var(--comp-popover-menu-border-color);border-radius:var(--comp-popover-menu-border-radius);box-shadow:var(--comp-popover-menu-box-shadow);padding:var(--comp-popover-menu-padding);outline:none;overflow:hidden;z-index:1000}.ap-popover-menu__content.ap-popover-menu__content--default{width:250px}.ap-popover-menu__content.ap-popover-menu__content--large{width:340px}.ap-popover-menu__content:focus{outline:2px solid var(--comp-popover-menu-item-background-color-focused);outline-offset:2px}.ap-popover-menu__item{display:flex;align-items:center;width:100%;height:40px;padding:var(--comp-popover-menu-item-padding);border:none;background:transparent;color:var(--comp-popover-menu-item-text-color);cursor:pointer;font-family:Averta;font-size:var(--comp-popover-menu-item-text-size);line-height:var(--comp-popover-menu-item-text-line-height);text-align:left;transition:background-color .2s ease,color .2s ease}.ap-popover-menu__item:hover{background-color:var(--comp-popover-menu-item-background-color-hover)}.ap-popover-menu__item:focus{outline:none;background-color:var(--comp-popover-menu-item-background-color-focused)}.ap-popover-menu__item.ap-popover-menu__item--has-description{height:auto;min-height:50px}.ap-popover-menu__item.ap-popover-menu__item--focused{background-color:var(--comp-popover-menu-item-background-color-focused)}.ap-popover-menu__item.ap-popover-menu__item--disabled{cursor:not-allowed;opacity:.4}.ap-popover-menu__item.ap-popover-menu__item--red-mode{color:var(--comp-popover-menu-item-text-color-red-mode)}.ap-popover-menu__item.ap-popover-menu__item--red-mode:hover{background-color:var(--comp-popover-menu-item-background-color-red-mode-hover)}.ap-popover-menu__item.ap-popover-menu__item--red-mode:focus{background-color:var(--comp-popover-menu-item-background-color-red-mode-focused)}.ap-popover-menu__item.ap-popover-menu__item--red-mode.ap-popover-menu__item--focused{background-color:var(--comp-popover-menu-item-background-color-red-mode-focused)}.ap-popover-menu__item.ap-popover-menu__item--feature-lock:hover{background-color:var(--comp-popover-menu-item-background-color-feature-lock-hover)}.ap-popover-menu__item.ap-popover-menu__item--feature-lock:focus{background-color:var(--comp-popover-menu-item-background-color-feature-lock-focused)}.ap-popover-menu__item.ap-popover-menu__item--feature-lock.ap-popover-menu__item--focused{background-color:var(--comp-popover-menu-item-background-color-feature-lock-focused)}.ap-popover-menu__item.ap-popover-menu__item--disabled:hover{background-color:transparent}.ap-popover-menu__item .ap-popover-menu__item-left-icon{margin-right:var(--comp-popover-menu-item-icon-spacing)}.ap-popover-menu__item .ap-popover-menu__item-right-icon{margin-left:var(--comp-popover-menu-item-icon-spacing)}.ap-popover-menu__item .ap-popover-menu__item-text-container{display:flex;flex-direction:column;flex:1;min-width:0}.ap-popover-menu__item .ap-popover-menu__item-text-container .ap-popover-menu__item-label-container{display:flex;align-items:center;gap:var(--comp-popover-menu-item-label-spacing);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ap-popover-menu__item .ap-popover-menu__item-text-container .ap-popover-menu__item-label-container .ap-popover-menu__item-label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ap-popover-menu__item .ap-popover-menu__item-text-container .ap-popover-menu__item-description{color:var(--ref-color-grey-80);font-size:var(--ref-font-size-xs);line-height:var(--ref-font-line-height-xs)}.ap-popover-menu__divider{height:1px;background-color:var(--comp-popover-menu-divider-color);margin:var(--comp-popover-menu-divider-margin)}\n"], dependencies: [{ kind: "component", type: BadgeComponent, selector: "ap-badge", inputs: ["color"] }, { kind: "ngmodule", type: CommonModule }, { kind: "component", type: SymbolComponent, selector: "ap-symbol", inputs: ["symbolId", "color", "size"], outputs: ["sizeChange"] }, { kind: "directive", type: TooltipDirective, selector: "[apTooltip]", inputs: ["apTooltip", "apTooltipPosition", "apTooltipShowDelay", "apTooltipHideDelay", "apTooltipDuration", "apTooltipDisabled", "apTooltipTruncatedTextOnly", "apTooltipTemplateContext", "apTooltipVirtualScrollElement"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
259
+ }
260
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: PopoverMenuComponent, decorators: [{
261
+ type: Component,
262
+ args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'ap-popover-menu', standalone: true, imports: [BadgeComponent, CommonModule, SymbolComponent, TooltipDirective], providers: [withSymbols(apInfo, apFeatureLock)], template: "<ng-template #menuTemplate>\n <!-- Menu -->\n <div\n class=\"ap-popover-menu__content\"\n role=\"menu\"\n tabindex=\"-1\"\n [attr.aria-label]=\"'Menu'\"\n [class.ap-popover-menu__content--default]=\"!largeMenuEnabled() && !customWidth()\"\n [class.ap-popover-menu__content--large]=\"largeMenuEnabled()\"\n [style.width]=\"customWidth() ? customWidth() + 'px' : undefined\"\n (keydown)=\"onKeyDown($event)\">\n <!-- Menu items -->\n @for (item of items(); track item.label) {\n <!-- Divider -->\n @if (item.divider) {\n <div\n class=\"ap-popover-menu__divider\"\n role=\"separator\"></div>\n } @else {\n <!-- Menu item -->\n <button\n type=\"button\"\n role=\"menuitem\"\n class=\"ap-popover-menu__item\"\n [class.ap-popover-menu__item--has-description]=\"item.description\"\n [class.ap-popover-menu__item--disabled]=\"item.disabled\"\n [class.ap-popover-menu__item--focused]=\"focusedIndex() === $index\"\n [class.ap-popover-menu__item--red-mode]=\"item.redModeEnabled\"\n [class.ap-popover-menu__item--feature-lock]=\"item.featureLockEnabled\"\n [attr.aria-disabled]=\"item.disabled\"\n [disabled]=\"item.disabled\"\n [apTooltip]=\"item.itemTooltipText\"\n (click)=\"onMenuItemClick(item)\">\n <!-- Left icon -->\n @if (item.symbolId) {\n <ap-symbol\n class=\"ap-popover-menu__item-left-icon\"\n size=\"sm\"\n [color]=\"item.symbolColor ? item.symbolColor : item.redModeEnabled ? 'red' : 'grey'\"\n [symbolId]=\"item.symbolId\" />\n }\n <!-- Label -->\n <div class=\"ap-popover-menu__item-text-container\">\n <div class=\"ap-popover-menu__item-label-container\">\n <div class=\"ap-popover-menu__item-label\">{{ item.label }}</div>\n <!-- Badge -->\n @if (item.badgeLabel) {\n <ap-badge\n class=\"ap-popover-menu__item-badge\"\n color=\"blue\">\n {{ item.badgeLabel }}\n </ap-badge>\n }\n </div>\n <!-- Description -->\n <div class=\"ap-popover-menu__item-description\">{{ item.description }}</div>\n </div>\n <!-- Tooltip icon -->\n @if (item.iconTooltipText) {\n <ap-symbol\n class=\"ap-popover-menu__item-right-icon\"\n size=\"sm\"\n color=\"grey-blue\"\n symbolId=\"info\"\n [apTooltip]=\"item.iconTooltipText\" />\n }\n <!-- Feature lock icon -->\n @if (item.featureLockEnabled) {\n <ap-symbol\n class=\"ap-popover-menu__item-right-icon\"\n size=\"sm\"\n color=\"purple\"\n symbolId=\"feature-lock\" />\n }\n </button>\n }\n }\n </div>\n</ng-template>\n", styles: [".ap-popover-menu__content{background-color:var(--comp-popover-menu-background-color);border:1px solid var(--comp-popover-menu-border-color);border-radius:var(--comp-popover-menu-border-radius);box-shadow:var(--comp-popover-menu-box-shadow);padding:var(--comp-popover-menu-padding);outline:none;overflow:hidden;z-index:1000}.ap-popover-menu__content.ap-popover-menu__content--default{width:250px}.ap-popover-menu__content.ap-popover-menu__content--large{width:340px}.ap-popover-menu__content:focus{outline:2px solid var(--comp-popover-menu-item-background-color-focused);outline-offset:2px}.ap-popover-menu__item{display:flex;align-items:center;width:100%;height:40px;padding:var(--comp-popover-menu-item-padding);border:none;background:transparent;color:var(--comp-popover-menu-item-text-color);cursor:pointer;font-family:Averta;font-size:var(--comp-popover-menu-item-text-size);line-height:var(--comp-popover-menu-item-text-line-height);text-align:left;transition:background-color .2s ease,color .2s ease}.ap-popover-menu__item:hover{background-color:var(--comp-popover-menu-item-background-color-hover)}.ap-popover-menu__item:focus{outline:none;background-color:var(--comp-popover-menu-item-background-color-focused)}.ap-popover-menu__item.ap-popover-menu__item--has-description{height:auto;min-height:50px}.ap-popover-menu__item.ap-popover-menu__item--focused{background-color:var(--comp-popover-menu-item-background-color-focused)}.ap-popover-menu__item.ap-popover-menu__item--disabled{cursor:not-allowed;opacity:.4}.ap-popover-menu__item.ap-popover-menu__item--red-mode{color:var(--comp-popover-menu-item-text-color-red-mode)}.ap-popover-menu__item.ap-popover-menu__item--red-mode:hover{background-color:var(--comp-popover-menu-item-background-color-red-mode-hover)}.ap-popover-menu__item.ap-popover-menu__item--red-mode:focus{background-color:var(--comp-popover-menu-item-background-color-red-mode-focused)}.ap-popover-menu__item.ap-popover-menu__item--red-mode.ap-popover-menu__item--focused{background-color:var(--comp-popover-menu-item-background-color-red-mode-focused)}.ap-popover-menu__item.ap-popover-menu__item--feature-lock:hover{background-color:var(--comp-popover-menu-item-background-color-feature-lock-hover)}.ap-popover-menu__item.ap-popover-menu__item--feature-lock:focus{background-color:var(--comp-popover-menu-item-background-color-feature-lock-focused)}.ap-popover-menu__item.ap-popover-menu__item--feature-lock.ap-popover-menu__item--focused{background-color:var(--comp-popover-menu-item-background-color-feature-lock-focused)}.ap-popover-menu__item.ap-popover-menu__item--disabled:hover{background-color:transparent}.ap-popover-menu__item .ap-popover-menu__item-left-icon{margin-right:var(--comp-popover-menu-item-icon-spacing)}.ap-popover-menu__item .ap-popover-menu__item-right-icon{margin-left:var(--comp-popover-menu-item-icon-spacing)}.ap-popover-menu__item .ap-popover-menu__item-text-container{display:flex;flex-direction:column;flex:1;min-width:0}.ap-popover-menu__item .ap-popover-menu__item-text-container .ap-popover-menu__item-label-container{display:flex;align-items:center;gap:var(--comp-popover-menu-item-label-spacing);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ap-popover-menu__item .ap-popover-menu__item-text-container .ap-popover-menu__item-label-container .ap-popover-menu__item-label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ap-popover-menu__item .ap-popover-menu__item-text-container .ap-popover-menu__item-description{color:var(--ref-color-grey-80);font-size:var(--ref-font-size-xs);line-height:var(--ref-font-line-height-xs)}.ap-popover-menu__divider{height:1px;background-color:var(--comp-popover-menu-divider-color);margin:var(--comp-popover-menu-divider-margin)}\n"] }]
263
+ }], ctorParameters: () => [] });
264
+
265
+ /**
266
+ * Generated bundle index. Do not edit.
267
+ */
268
+
269
+ export { PopoverMenuComponent, PopoverMenuTriggerDirective };
270
+ //# sourceMappingURL=agorapulse-ui-components-popover-menu.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agorapulse-ui-components-popover-menu.mjs","sources":["../../../libs/ui-components/popover-menu/src/popover-menu-trigger.directive.ts","../../../libs/ui-components/popover-menu/src/popover-menu.component.ts","../../../libs/ui-components/popover-menu/src/popover-menu.component.html","../../../libs/ui-components/popover-menu/src/agorapulse-ui-components-popover-menu.ts"],"sourcesContent":["import { Directive, ElementRef, HostListener, inject, input, output } from '@angular/core';\nimport { PopoverMenuComponent, PopoverMenuItem } from './popover-menu.component';\n\n@Directive({\n selector: '[apPopoverMenuTrigger]',\n standalone: true,\n})\nexport class PopoverMenuTriggerDirective {\n private readonly elementRef = inject(ElementRef<HTMLElement>);\n\n apPopoverMenuTrigger = input.required<PopoverMenuComponent>();\n popoverMenuItems = input<PopoverMenuItem[]>([]);\n disabled = input(false);\n\n menuItemClick = output<PopoverMenuItem>();\n opened = output<void>();\n closed = output<void>();\n\n @HostListener('click', ['$event'])\n onClick(event: MouseEvent): void {\n event.preventDefault();\n event.stopPropagation();\n\n if (this.disabled()) {\n return;\n }\n\n const popoverMenu = this.apPopoverMenuTrigger();\n if (popoverMenu) {\n popoverMenu.toggle(this.elementRef.nativeElement);\n }\n }\n\n @HostListener('keydown', ['$event'])\n onKeyDown(event: KeyboardEvent): void {\n if (this.disabled()) {\n return;\n }\n\n const popoverMenu = this.apPopoverMenuTrigger();\n if (popoverMenu) {\n switch (event.key) {\n case 'Enter':\n case ' ':\n case 'ArrowDown':\n event.preventDefault();\n popoverMenu.open(this.elementRef.nativeElement);\n break;\n\n case 'Escape':\n event.preventDefault();\n popoverMenu.close();\n break;\n }\n }\n }\n}\n","import { BadgeComponent } from '@agorapulse/ui-components/badge';\nimport { TooltipDirective } from '@agorapulse/ui-components/tooltip';\nimport { agorapulseSymbol, apFeatureLock, apInfo, SymbolColor, SymbolComponent, withSymbols } from '@agorapulse/ui-symbol';\nimport { ConnectedPosition, FlexibleConnectedPositionStrategy, Overlay, OverlayPositionBuilder, OverlayRef } from '@angular/cdk/overlay';\nimport { TemplatePortal } from '@angular/cdk/portal';\nimport { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n effect,\n ElementRef,\n inject,\n input,\n output,\n signal,\n TemplateRef,\n viewChild,\n ViewContainerRef,\n} from '@angular/core';\nimport { take } from 'rxjs/operators';\n\nexport interface PopoverMenuItem {\n label?: string;\n description?: string;\n badgeLabel?: string;\n symbolId?: agorapulseSymbol;\n symbolColor?: SymbolColor;\n featureLockEnabled?: boolean;\n redModeEnabled?: boolean;\n itemTooltipText?: string;\n iconTooltipText?: string;\n disabled?: boolean;\n divider?: boolean;\n}\n\n@Component({\n changeDetection: ChangeDetectionStrategy.OnPush,\n selector: 'ap-popover-menu',\n templateUrl: './popover-menu.component.html',\n styleUrls: ['./popover-menu.component.scss'],\n standalone: true,\n imports: [BadgeComponent, CommonModule, SymbolComponent, TooltipDirective],\n providers: [withSymbols(apInfo, apFeatureLock)],\n})\nexport class PopoverMenuComponent {\n private readonly elementRef = inject(ElementRef);\n private readonly overlay = inject(Overlay);\n private readonly positionBuilder = inject(OverlayPositionBuilder);\n private readonly viewContainerRef = inject(ViewContainerRef);\n\n menuTemplate = viewChild<TemplateRef<unknown>>('menuTemplate');\n trigger = contentChild<TemplateRef<unknown>>('trigger');\n\n items = input<PopoverMenuItem[]>([]);\n disabled = input(false);\n largeMenuEnabled = input(false);\n showBackdrop = input(true);\n customWidth = input<number | null>(null);\n\n menuItemClick = output<PopoverMenuItem>();\n opened = output<void>();\n closed = output<void>();\n\n private overlayRef: OverlayRef | null = null;\n private portal: TemplatePortal<unknown> | null = null;\n\n protected readonly isOpen = signal(false);\n protected readonly focusedIndex = signal(-1);\n protected readonly menuItems = computed(() => this.items().filter(item => !item.divider));\n\n constructor() {\n effect(() => {\n if (this.isOpen()) {\n this.setupKeyboardNavigation();\n }\n });\n }\n\n open(triggerElement?: HTMLElement): void {\n const menuTemplate = this.menuTemplate();\n\n if (this.disabled() || this.isOpen() || !menuTemplate) {\n return;\n }\n\n const target = triggerElement || this.elementRef.nativeElement;\n\n if (this.overlayRef) {\n this.overlayRef.dispose();\n }\n\n const positionStrategy = this.createPositionStrategy(target);\n\n this.overlayRef = this.overlay.create({\n positionStrategy,\n hasBackdrop: this.showBackdrop(),\n backdropClass: '',\n panelClass: '',\n scrollStrategy: this.overlay.scrollStrategies.reposition(),\n });\n\n this.portal = new TemplatePortal(menuTemplate, this.viewContainerRef);\n this.overlayRef.attach(this.portal);\n\n this.isOpen.set(true);\n this.focusedIndex.set(-1);\n this.opened.emit();\n\n this.overlayRef\n .backdropClick()\n .pipe(take(1))\n .subscribe(() => {\n this.close();\n });\n\n this.overlayRef\n .keydownEvents()\n .pipe(take(1))\n .subscribe((event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n this.close();\n }\n });\n }\n\n close(): void {\n if (!this.isOpen()) {\n return;\n }\n\n if (this.overlayRef) {\n this.overlayRef.dispose();\n this.overlayRef = null;\n }\n\n this.portal = null;\n this.isOpen.set(false);\n this.focusedIndex.set(-1);\n this.closed.emit();\n }\n\n toggle(triggerElement?: HTMLElement): void {\n if (this.isOpen()) {\n this.close();\n } else {\n this.open(triggerElement);\n }\n }\n\n onMenuItemClick(item: PopoverMenuItem): void {\n if (item.disabled) {\n return;\n }\n\n this.menuItemClick.emit(item);\n\n this.close();\n }\n\n onKeyDown(event: KeyboardEvent): void {\n const items = this.menuItems();\n const currentIndex = this.focusedIndex();\n let nextIndex: number;\n let prevIndex: number;\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n nextIndex = currentIndex < items.length - 1 ? currentIndex + 1 : 0;\n this.focusedIndex.set(nextIndex);\n break;\n\n case 'ArrowUp':\n event.preventDefault();\n prevIndex = currentIndex > 0 ? currentIndex - 1 : items.length - 1;\n this.focusedIndex.set(prevIndex);\n break;\n\n case 'Enter':\n case ' ':\n event.preventDefault();\n if (currentIndex >= 0 && currentIndex < items.length) {\n this.onMenuItemClick(items[currentIndex]);\n }\n break;\n\n case 'Escape':\n event.preventDefault();\n this.close();\n break;\n\n case 'Tab':\n event.preventDefault();\n if (event.shiftKey) {\n // Shift+Tab - move to previous item\n prevIndex = currentIndex > 0 ? currentIndex - 1 : items.length - 1;\n this.focusedIndex.set(prevIndex);\n } else {\n // Tab - move to next item\n nextIndex = currentIndex < items.length - 1 ? currentIndex + 1 : 0;\n this.focusedIndex.set(nextIndex);\n }\n break;\n }\n }\n\n private createPositionStrategy(target: HTMLElement): FlexibleConnectedPositionStrategy {\n const positions: ConnectedPosition[] = [\n // Bottom-right (default)\n {\n originX: 'end',\n originY: 'bottom',\n overlayX: 'start',\n overlayY: 'top',\n offsetX: 0,\n offsetY: 4,\n },\n // Bottom-left (if not enough space on right)\n {\n originX: 'start',\n originY: 'bottom',\n overlayX: 'end',\n overlayY: 'top',\n offsetX: 0,\n offsetY: 4,\n },\n // Top-right (if not enough space below)\n {\n originX: 'end',\n originY: 'top',\n overlayX: 'start',\n overlayY: 'bottom',\n offsetX: 0,\n offsetY: -4,\n },\n // Top-left (if not enough space below and on right)\n {\n originX: 'start',\n originY: 'top',\n overlayX: 'end',\n overlayY: 'bottom',\n offsetX: 0,\n offsetY: -4,\n },\n ];\n\n return this.positionBuilder\n .flexibleConnectedTo(target)\n .withPositions(positions)\n .withFlexibleDimensions(true)\n .withPush(true)\n .withGrowAfterOpen(true)\n .withViewportMargin(8);\n }\n\n private setupKeyboardNavigation(): void {\n if (!this.overlayRef) {\n return;\n }\n\n const keydownEvents = this.overlayRef.keydownEvents();\n\n keydownEvents.subscribe((event: KeyboardEvent) => {\n this.onKeyDown(event);\n });\n }\n}\n","<ng-template #menuTemplate>\n <!-- Menu -->\n <div\n class=\"ap-popover-menu__content\"\n role=\"menu\"\n tabindex=\"-1\"\n [attr.aria-label]=\"'Menu'\"\n [class.ap-popover-menu__content--default]=\"!largeMenuEnabled() && !customWidth()\"\n [class.ap-popover-menu__content--large]=\"largeMenuEnabled()\"\n [style.width]=\"customWidth() ? customWidth() + 'px' : undefined\"\n (keydown)=\"onKeyDown($event)\">\n <!-- Menu items -->\n @for (item of items(); track item.label) {\n <!-- Divider -->\n @if (item.divider) {\n <div\n class=\"ap-popover-menu__divider\"\n role=\"separator\"></div>\n } @else {\n <!-- Menu item -->\n <button\n type=\"button\"\n role=\"menuitem\"\n class=\"ap-popover-menu__item\"\n [class.ap-popover-menu__item--has-description]=\"item.description\"\n [class.ap-popover-menu__item--disabled]=\"item.disabled\"\n [class.ap-popover-menu__item--focused]=\"focusedIndex() === $index\"\n [class.ap-popover-menu__item--red-mode]=\"item.redModeEnabled\"\n [class.ap-popover-menu__item--feature-lock]=\"item.featureLockEnabled\"\n [attr.aria-disabled]=\"item.disabled\"\n [disabled]=\"item.disabled\"\n [apTooltip]=\"item.itemTooltipText\"\n (click)=\"onMenuItemClick(item)\">\n <!-- Left icon -->\n @if (item.symbolId) {\n <ap-symbol\n class=\"ap-popover-menu__item-left-icon\"\n size=\"sm\"\n [color]=\"item.symbolColor ? item.symbolColor : item.redModeEnabled ? 'red' : 'grey'\"\n [symbolId]=\"item.symbolId\" />\n }\n <!-- Label -->\n <div class=\"ap-popover-menu__item-text-container\">\n <div class=\"ap-popover-menu__item-label-container\">\n <div class=\"ap-popover-menu__item-label\">{{ item.label }}</div>\n <!-- Badge -->\n @if (item.badgeLabel) {\n <ap-badge\n class=\"ap-popover-menu__item-badge\"\n color=\"blue\">\n {{ item.badgeLabel }}\n </ap-badge>\n }\n </div>\n <!-- Description -->\n <div class=\"ap-popover-menu__item-description\">{{ item.description }}</div>\n </div>\n <!-- Tooltip icon -->\n @if (item.iconTooltipText) {\n <ap-symbol\n class=\"ap-popover-menu__item-right-icon\"\n size=\"sm\"\n color=\"grey-blue\"\n symbolId=\"info\"\n [apTooltip]=\"item.iconTooltipText\" />\n }\n <!-- Feature lock icon -->\n @if (item.featureLockEnabled) {\n <ap-symbol\n class=\"ap-popover-menu__item-right-icon\"\n size=\"sm\"\n color=\"purple\"\n symbolId=\"feature-lock\" />\n }\n </button>\n }\n }\n </div>\n</ng-template>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
@@ -20,7 +20,7 @@ export declare class NavSelectorLeafComponent {
20
20
  tooltipContent: import("@angular/core").Signal<string>;
21
21
  tooltipDisabled: import("@angular/core").Signal<boolean>;
22
22
  foldedWithDelay: import("@angular/core").WritableSignal<boolean>;
23
- network: import("@angular/core").Signal<"bluesky" | "facebook" | "instagram" | "linkedin" | "twitter" | "youtube" | "meta" | "google" | "pinterest" | "threads" | "tiktok" | "webBlog" | "webNews" | "X" | "reddit" | null | undefined>;
23
+ network: import("@angular/core").Signal<"bluesky" | "facebook" | "instagram" | "linkedin" | "twitter" | "youtube" | "meta" | "google" | "pinterest" | "threads" | "tiktok" | "webBlog" | "webNews" | "X" | "xPlus" | "reddit" | null | undefined>;
24
24
  constructor(el: ElementRef, navSelectorLeafPresenter: NavSelectorLeafPresenter);
25
25
  animationState: import("@angular/core").Signal<"collapsed" | "expanded">;
26
26
  maxHeight: import("@angular/core").WritableSignal<string>;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@agorapulse/ui-components",
3
3
  "description": "Agorapulse UI Components Library",
4
- "version": "18.0.48",
4
+ "version": "18.1.1",
5
5
  "author": "Benoit Hediard",
6
6
  "repository": {
7
7
  "type": "git",
@@ -67,18 +67,18 @@
67
67
  "esm": "./esm2022/button/agorapulse-ui-components-button.mjs",
68
68
  "default": "./fesm2022/agorapulse-ui-components-button.mjs"
69
69
  },
70
- "./checkbox": {
71
- "types": "./checkbox/index.d.ts",
72
- "esm2022": "./esm2022/checkbox/agorapulse-ui-components-checkbox.mjs",
73
- "esm": "./esm2022/checkbox/agorapulse-ui-components-checkbox.mjs",
74
- "default": "./fesm2022/agorapulse-ui-components-checkbox.mjs"
75
- },
76
70
  "./close-button": {
77
71
  "types": "./close-button/index.d.ts",
78
72
  "esm2022": "./esm2022/close-button/agorapulse-ui-components-close-button.mjs",
79
73
  "esm": "./esm2022/close-button/agorapulse-ui-components-close-button.mjs",
80
74
  "default": "./fesm2022/agorapulse-ui-components-close-button.mjs"
81
75
  },
76
+ "./checkbox": {
77
+ "types": "./checkbox/index.d.ts",
78
+ "esm2022": "./esm2022/checkbox/agorapulse-ui-components-checkbox.mjs",
79
+ "esm": "./esm2022/checkbox/agorapulse-ui-components-checkbox.mjs",
80
+ "default": "./fesm2022/agorapulse-ui-components-checkbox.mjs"
81
+ },
82
82
  "./confirm-modal": {
83
83
  "types": "./confirm-modal/index.d.ts",
84
84
  "esm2022": "./esm2022/confirm-modal/agorapulse-ui-components-confirm-modal.mjs",
@@ -217,6 +217,12 @@
217
217
  "esm": "./esm2022/popmenu/agorapulse-ui-components-popmenu.mjs",
218
218
  "default": "./fesm2022/agorapulse-ui-components-popmenu.mjs"
219
219
  },
220
+ "./popover-menu": {
221
+ "types": "./popover-menu/index.d.ts",
222
+ "esm2022": "./esm2022/popover-menu/agorapulse-ui-components-popover-menu.mjs",
223
+ "esm": "./esm2022/popover-menu/agorapulse-ui-components-popover-menu.mjs",
224
+ "default": "./fesm2022/agorapulse-ui-components-popover-menu.mjs"
225
+ },
220
226
  "./radio": {
221
227
  "types": "./radio/index.d.ts",
222
228
  "esm2022": "./esm2022/radio/agorapulse-ui-components-radio.mjs",
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ /// <amd-module name="@agorapulse/ui-components/popover-menu" />
5
+ export * from './public_api';
@@ -0,0 +1,15 @@
1
+ import { PopoverMenuComponent, PopoverMenuItem } from './popover-menu.component';
2
+ import * as i0 from "@angular/core";
3
+ export declare class PopoverMenuTriggerDirective {
4
+ private readonly elementRef;
5
+ apPopoverMenuTrigger: import("@angular/core").InputSignal<PopoverMenuComponent>;
6
+ popoverMenuItems: import("@angular/core").InputSignal<PopoverMenuItem[]>;
7
+ disabled: import("@angular/core").InputSignal<boolean>;
8
+ menuItemClick: import("@angular/core").OutputEmitterRef<PopoverMenuItem>;
9
+ opened: import("@angular/core").OutputEmitterRef<void>;
10
+ closed: import("@angular/core").OutputEmitterRef<void>;
11
+ onClick(event: MouseEvent): void;
12
+ onKeyDown(event: KeyboardEvent): void;
13
+ static ɵfac: i0.ɵɵFactoryDeclaration<PopoverMenuTriggerDirective, never>;
14
+ static ɵdir: i0.ɵɵDirectiveDeclaration<PopoverMenuTriggerDirective, "[apPopoverMenuTrigger]", never, { "apPopoverMenuTrigger": { "alias": "apPopoverMenuTrigger"; "required": true; "isSignal": true; }; "popoverMenuItems": { "alias": "popoverMenuItems"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "menuItemClick": "menuItemClick"; "opened": "opened"; "closed": "closed"; }, never, never, true, never>;
15
+ }
@@ -0,0 +1,47 @@
1
+ import { agorapulseSymbol, SymbolColor } from '@agorapulse/ui-symbol';
2
+ import { TemplateRef } from '@angular/core';
3
+ import * as i0 from "@angular/core";
4
+ export interface PopoverMenuItem {
5
+ label?: string;
6
+ description?: string;
7
+ badgeLabel?: string;
8
+ symbolId?: agorapulseSymbol;
9
+ symbolColor?: SymbolColor;
10
+ featureLockEnabled?: boolean;
11
+ redModeEnabled?: boolean;
12
+ itemTooltipText?: string;
13
+ iconTooltipText?: string;
14
+ disabled?: boolean;
15
+ divider?: boolean;
16
+ }
17
+ export declare class PopoverMenuComponent {
18
+ private readonly elementRef;
19
+ private readonly overlay;
20
+ private readonly positionBuilder;
21
+ private readonly viewContainerRef;
22
+ menuTemplate: import("@angular/core").Signal<TemplateRef<unknown> | undefined>;
23
+ trigger: import("@angular/core").Signal<TemplateRef<unknown> | undefined>;
24
+ items: import("@angular/core").InputSignal<PopoverMenuItem[]>;
25
+ disabled: import("@angular/core").InputSignal<boolean>;
26
+ largeMenuEnabled: import("@angular/core").InputSignal<boolean>;
27
+ showBackdrop: import("@angular/core").InputSignal<boolean>;
28
+ customWidth: import("@angular/core").InputSignal<number | null>;
29
+ menuItemClick: import("@angular/core").OutputEmitterRef<PopoverMenuItem>;
30
+ opened: import("@angular/core").OutputEmitterRef<void>;
31
+ closed: import("@angular/core").OutputEmitterRef<void>;
32
+ private overlayRef;
33
+ private portal;
34
+ protected readonly isOpen: import("@angular/core").WritableSignal<boolean>;
35
+ protected readonly focusedIndex: import("@angular/core").WritableSignal<number>;
36
+ protected readonly menuItems: import("@angular/core").Signal<PopoverMenuItem[]>;
37
+ constructor();
38
+ open(triggerElement?: HTMLElement): void;
39
+ close(): void;
40
+ toggle(triggerElement?: HTMLElement): void;
41
+ onMenuItemClick(item: PopoverMenuItem): void;
42
+ onKeyDown(event: KeyboardEvent): void;
43
+ private createPositionStrategy;
44
+ private setupKeyboardNavigation;
45
+ static ɵfac: i0.ɵɵFactoryDeclaration<PopoverMenuComponent, never>;
46
+ static ɵcmp: i0.ɵɵComponentDeclaration<PopoverMenuComponent, "ap-popover-menu", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "largeMenuEnabled": { "alias": "largeMenuEnabled"; "required": false; "isSignal": true; }; "showBackdrop": { "alias": "showBackdrop"; "required": false; "isSignal": true; }; "customWidth": { "alias": "customWidth"; "required": false; "isSignal": true; }; }, { "menuItemClick": "menuItemClick"; "opened": "opened"; "closed": "closed"; }, ["trigger"], never, true, never>;
47
+ }
@@ -0,0 +1,2 @@
1
+ export { PopoverMenuTriggerDirective } from './popover-menu-trigger.directive';
2
+ export { PopoverMenuComponent, PopoverMenuItem } from './popover-menu.component';